diff --git a/modules/gui/pymod/CMakeLists.txt b/modules/gui/pymod/CMakeLists.txt
index f5b953d892e34215fef27c8980610ccab59cb1c7..c3fc64a17961c93349763793d7b1376b5791089e 100644
--- a/modules/gui/pymod/CMakeLists.txt
+++ b/modules/gui/pymod/CMakeLists.txt
@@ -35,6 +35,7 @@ immutable_gradient_info_handler.py
immutable_preset_info_handler.py
init_inspector.py
inspector_widget.py
+map_level_widget.py
preset.py
preset_editor_list_model.py
preset_editor_widget.py
diff --git a/modules/gui/pymod/scene/inspector_widget.py b/modules/gui/pymod/scene/inspector_widget.py
index 4e7e7f76155f5c51219aaae95daa91967b3e6f03..6535203cecaa8c8e718621ec09b088d59c2f700e 100644
--- a/modules/gui/pymod/scene/inspector_widget.py
+++ b/modules/gui/pymod/scene/inspector_widget.py
@@ -29,6 +29,7 @@ from render_options_widget import RenderOptionsWidget
from color_options_widget import ColorOptionsWidget
from ost.gui.scene.scene_observer_impl import SceneObserverImpl
from preset_widget import PresetWidget
+from map_level_widget import MapLevelWidget
class InspectorWidget(ToolBarOptionsWidget):
ICONS_PATH = os.path.join(ost.GetSharedDataPath(), "scene", "icons/")
@@ -39,6 +40,7 @@ class InspectorWidget(ToolBarOptionsWidget):
[InspectorWidget.ICONS_PATH+"render_icon.png",RenderOptionsWidget(self),None],
[InspectorWidget.ICONS_PATH+"color_icon.png",ColorOptionsWidget(self),None],
[InspectorWidget.ICONS_PATH+"preset_icon.png", PresetWidget(self),None],
+ [InspectorWidget.ICONS_PATH+"preset_icon.png", MapLevelWidget(self),"Map Level Options"],
[InspectorWidget.ICONS_PATH+"tool_icon.png",app.tool_options_win.qobject,"Tool Options"]
]
for o in options:
diff --git a/modules/gui/pymod/scene/map_level_widget.py b/modules/gui/pymod/scene/map_level_widget.py
new file mode 100644
index 0000000000000000000000000000000000000000..51584c73a9b187a6b83f7012f6227f607b45ec13
--- /dev/null
+++ b/modules/gui/pymod/scene/map_level_widget.py
@@ -0,0 +1,208 @@
+#------------------------------------------------------------------------------
+# This file is part of the OpenStructure project <www.openstructure.org>
+#
+# Copyright (C) 2008-2010 by the OpenStructure authors
+#
+# This library is free software; you can redistribute it and/or modify it under
+# the terms of the GNU Lesser General Public License as published by the Free
+# Software Foundation; either version 3.0 of the License, or (at your option)
+# any later version.
+# This library is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
+# details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this library; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+#------------------------------------------------------------------------------
+# -*- coding: utf-8 -*-
+import math
+from ost import gui
+from ost import gfx
+try:
+ from ost import img
+ _img_present=True
+except ImportError:
+ _img_present=False
+ pass
+from PyQt4 import QtCore, QtGui
+
+#Map Level Widget
+class MapLevelWidget(QtGui.QWidget):
+ def __init__(self, parent=None):
+ QtGui.QWidget.__init__(self, parent)
+
+ #Create Ui elements
+ map_level_label = QtGui.QLabel("Map Contour Level")
+ font = map_level_label.font()
+ font.setBold(True)
+
+ self.level_preview_ = LevelPreview()
+
+ self.level_spinbox_ = QtGui.QDoubleSpinBox()
+ self.level_spinbox_.setDecimals(3)
+ self.level_spinbox_.setSingleStep(0.05)
+
+ grid = QtGui.QGridLayout()
+ grid.setContentsMargins(0,5,0,0)
+ grid.addWidget(self.level_preview_, 0, 0, 1, 4)
+ grid.addWidget(map_level_label, 1, 0, 1, 3)
+ grid.addWidget(self.level_spinbox_,1,3,1,1)
+ grid.setRowStretch(3, 1)
+ self.setLayout(grid)
+
+ QtCore.QObject.connect(self.level_preview_, QtCore.SIGNAL("levelUpdated"), self.UpdateLevel)
+ QtCore.QObject.connect(self.level_preview_, QtCore.SIGNAL("levelModified"), self.ModifySpinBox)
+ QtCore.QObject.connect(self.level_spinbox_, QtCore.SIGNAL("valueChanged(double)"), self.UpdateLevel)
+
+ self.setMinimumSize(250,300)
+
+ def Update(self):
+ scene_selection = gui.SceneSelection.Instance()
+ if(scene_selection.GetActiveNodeCount()==1):
+ node = scene_selection.GetActiveNode(0)
+ if _img_present and isinstance(node, gfx.MapIso):
+ self.level_preview_.SetBins(node.GetHistogram())
+ self.level_preview_.SetMinimum(node.GetMinLevel())
+ self.level_spinbox_.setMinimum(node.GetMinLevel())
+ self.level_preview_.SetMaximum(node.GetMaxLevel())
+ self.level_spinbox_.setMaximum(node.GetMaxLevel())
+ self.level_preview_.SetLevel(node.GetLevel())
+ self.setEnabled(True)
+ else:
+ self.setEnabled(False)
+ else:
+ self.setEnabled(False)
+
+ def UpdateLevel(self, level):
+ scene_selection = gui.SceneSelection.Instance()
+ if(scene_selection.GetActiveNodeCount()==1):
+ node = scene_selection.GetActiveNode(0)
+ node.SetLevel(level)
+
+ def ModifySpinBox(self, level):
+ QtCore.QObject.disconnect(self.level_spinbox_, QtCore.SIGNAL("valueChanged(double)"), self.UpdateLevel)
+ self.level_spinbox_.setValue(level)
+ QtCore.QObject.connect(self.level_spinbox_, QtCore.SIGNAL("valueChanged(double)"), self.UpdateLevel)
+
+#Level Preview
+class LevelPreview(QtGui.QWidget):
+ def __init__(self, parent=None):
+ QtGui.QWidget.__init__(self, parent)
+
+ #Defaults
+ self.border_offset_ = 3
+ self.preview_height_ = 100
+ QtGui.QWidget.__init__(self, parent)
+
+ #Ui
+ self.setMinimumSize(0, self.preview_height_ + 4)
+
+ self.bins_ = None
+ self.level_ = 0
+ self.minimum_ = 0
+ self.maximum_ = 0
+
+ self.paint_mouse_=False
+
+ def SetBins(self, bins):
+ self.bins_ = bins
+ self.update()
+
+ def SetMaximum(self, max):
+ self.maximum_ = max
+
+ def SetMinimum(self, min):
+ self.minimum_ = min
+
+ def SetLevel(self, level):
+ self.level_ = level
+
+ def GetLevel(self):
+ return self.level_
+
+ def paintEvent(self, event):
+ if self.isEnabled() and self.bins_ is not None:
+ painter = QtGui.QPainter()
+ if painter.begin(self):
+ self.PaintBackground(painter)
+ self.PaintBins(painter)
+ self.PaintLevel(painter)
+ if(self.paint_mouse_):
+ self.PaintMouse(painter)
+ painter.end()
+
+ def PaintBackground(self,painter):
+ size = self.size()
+ painter.setBrush(QtCore.Qt.white)
+ painter.setPen(QtCore.Qt.white)
+ painter.drawRect(self.border_offset_,
+ self.border_offset_,
+ size.width() - 2 * self.border_offset_,
+ self.preview_height_)
+
+ def PaintBins(self,painter):
+ size = self.size()
+ bin_cnt = len(self.bins_)
+ bin_width = (size.width()-2* self.border_offset_) / float(bin_cnt)
+ max=0
+ for b in self.bins_:
+ if(b>max):
+ max = b
+ max = math.log(max)
+ if(max > 0):
+ painter.setBrush(QtCore.Qt.black)
+ painter.setPen(QtCore.Qt.black)
+ for i in range(0,bin_cnt):
+ bin_height = self.bins_[i]
+ if(bin_height>0):
+ bin_height = math.floor((math.log(bin_height)/max)*(self.preview_height_-2*(self.border_offset_)))
+ painter.drawRect(self.border_offset_ + (i*bin_width),
+ self.preview_height_ - bin_height,
+ bin_width,
+ bin_height)
+
+ def PaintLevel(self,painter):
+ size = self.size()
+ width = size.width()-(2* self.border_offset_)
+ tot_len = self.maximum_-self.minimum_
+ if(tot_len>0):
+ cur_len = self.level_-self.minimum_
+ painter.setBrush(QtCore.Qt.red)
+ painter.setPen(QtCore.Qt.red)
+ painter.drawRect((width / tot_len) * cur_len,
+ self.border_offset_,
+ 1,
+ self.preview_height_)
+
+ def PaintMouse(self,painter):
+ size = self.size()
+ width = size.width()-(2* self.border_offset_)
+ painter.setBrush(QtCore.Qt.gray)
+ painter.setPen(QtCore.Qt.gray)
+ pos=self.mapFromGlobal(QtGui.QCursor.pos())
+ painter.drawRect(pos.x(),
+ self.border_offset_,
+ 1,
+ self.preview_height_)
+
+ def mouseReleaseEvent(self, event):
+ self.paint_mouse_=False
+ size = self.size()
+ width = size.width()-(2* self.border_offset_)
+ tot_len = self.maximum_-self.minimum_
+ self.level_ = self.minimum_ + float(event.x())/width * tot_len
+ self.update()
+ self.emit(QtCore.SIGNAL("levelUpdated"),(self.level_))
+
+ def mousePressEvent(self,event):
+ self.paint_mouse_=True
+
+ def mouseMoveEvent(self, event):
+ size = self.size()
+ width = size.width()-(2* self.border_offset_)
+ tot_len = self.maximum_-self.minimum_
+ level = self.minimum_ + float(event.x())/width * tot_len
+ self.emit(QtCore.SIGNAL("levelModified"),(level))
+ self.update()
\ No newline at end of file