00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 import math
00021 from ost import gui
00022 from ost import gfx
00023 try:
00024 from ost import img
00025 _img_present=True
00026 except ImportError:
00027 _img_present=False
00028 pass
00029 from PyQt4 import QtCore, QtGui
00030
00031 from preset_widget import PresetWidget
00032
00033 class AdditionalSettingsWidget(QtGui.QStackedWidget):
00034 def __init__(self, parent=None):
00035 QtGui.QStackedWidget.__init__(self, parent)
00036 self.map_widget_ = MapLevelWidget(self)
00037 self.preset_widget_ = PresetWidget(self)
00038 self.addWidget(self.preset_widget_);
00039 self.addWidget(self.map_widget_);
00040 self.setContentsMargins(0,0,0,0)
00041 self.setMinimumSize(self.preset_widget_.minimumSize())
00042
00043 def Update(self):
00044 self.setEnabled(True)
00045 scene_selection = gui.SceneSelection.Instance()
00046 all_img = True
00047 all_entity = True
00048 for i in range(0,scene_selection.GetActiveNodeCount()):
00049 node = scene_selection.GetActiveNode(i)
00050 if not (isinstance(node, gfx.Entity) or isinstance(node, gfx.Surface)):
00051 all_entity = False
00052 if (not _img_present) or (not isinstance(node, gfx.MapIso)):
00053 all_img = False
00054 if all_img:
00055 self.map_widget_.Update()
00056 self.setMinimumSize(self.map_widget_.minimumSize())
00057 self.resize(self.map_widget_.minimumSize())
00058 self.setMinimumSize(self.map_widget_.minimumSize())
00059 self.setCurrentWidget(self.map_widget_)
00060 elif all_entity:
00061 self.preset_widget_.Update()
00062 self.setMinimumSize(self.preset_widget_.minimumSize())
00063 self.resize(self.preset_widget_.minimumSize())
00064 self.setMinimumSize(self.preset_widget_.minimumSize())
00065 self.setCurrentWidget(self.preset_widget_)
00066 else:
00067 self.setEnabled(False)
00068
00069
00070 class MapLevelWidget(QtGui.QWidget):
00071 def __init__(self, parent=None):
00072 QtGui.QWidget.__init__(self, parent)
00073
00074
00075 map_level_label = QtGui.QLabel("Map Contour Level")
00076 font = map_level_label.font()
00077 font.setBold(True)
00078
00079 self.level_preview_ = LevelPreview()
00080
00081 self.level_spinbox_ = QtGui.QDoubleSpinBox()
00082 self.level_spinbox_.setDecimals(3)
00083 self.level_spinbox_.setSingleStep(0.05)
00084
00085 grid = QtGui.QGridLayout()
00086 grid.setContentsMargins(0,5,0,0)
00087 grid.addWidget(self.level_preview_, 0, 0, 1, 4)
00088 grid.addWidget(map_level_label, 1, 0, 1, 3)
00089 grid.addWidget(self.level_spinbox_,1,3,1,1)
00090 grid.setRowStretch(3, 1)
00091 self.setLayout(grid)
00092
00093 QtCore.QObject.connect(self.level_preview_, QtCore.SIGNAL("levelUpdated"), self.UpdateLevel)
00094 QtCore.QObject.connect(self.level_preview_, QtCore.SIGNAL("levelModified"), self.ModifySpinBox)
00095 QtCore.QObject.connect(self.level_spinbox_, QtCore.SIGNAL("valueChanged(double)"), self.UpdateLevel)
00096
00097 self.setMinimumSize(250,200)
00098
00099 def Update(self):
00100 scene_selection = gui.SceneSelection.Instance()
00101 if(scene_selection.GetActiveNodeCount()==1):
00102 node = scene_selection.GetActiveNode(0)
00103 if _img_present and isinstance(node, gfx.MapIso):
00104 self.level_preview_.SetBins(node.GetHistogram())
00105 self.level_preview_.SetMinimum(node.GetMinLevel())
00106 self.level_spinbox_.setMinimum(node.GetMinLevel())
00107 self.level_preview_.SetMaximum(node.GetMaxLevel())
00108 self.level_spinbox_.setMaximum(node.GetMaxLevel())
00109 self.level_preview_.SetLevel(node.GetLevel())
00110 self.setEnabled(True)
00111 else:
00112 self.setEnabled(False)
00113 else:
00114 self.setEnabled(False)
00115
00116 def UpdateLevel(self, level):
00117 scene_selection = gui.SceneSelection.Instance()
00118 if(scene_selection.GetActiveNodeCount()==1):
00119 node = scene_selection.GetActiveNode(0)
00120 node.SetLevel(level)
00121
00122 def ModifySpinBox(self, level):
00123 QtCore.QObject.disconnect(self.level_spinbox_, QtCore.SIGNAL("valueChanged(double)"), self.UpdateLevel)
00124 self.level_spinbox_.setValue(level)
00125 QtCore.QObject.connect(self.level_spinbox_, QtCore.SIGNAL("valueChanged(double)"), self.UpdateLevel)
00126
00127
00128 class LevelPreview(QtGui.QWidget):
00129 def __init__(self, parent=None):
00130 QtGui.QWidget.__init__(self, parent)
00131
00132
00133 self.border_offset_ = 3
00134 self.preview_height_ = 150
00135 QtGui.QWidget.__init__(self, parent)
00136
00137
00138 self.setMinimumSize(0, self.preview_height_ + 4)
00139
00140 self.bins_ = None
00141 self.level_ = 0
00142 self.minimum_ = 0
00143 self.maximum_ = 0
00144
00145 self.paint_mouse_=False
00146
00147 def SetBins(self, bins):
00148 self.bins_ = bins
00149 self.update()
00150
00151 def SetMaximum(self, max):
00152 self.maximum_ = max
00153
00154 def SetMinimum(self, min):
00155 self.minimum_ = min
00156
00157 def SetLevel(self, level):
00158 self.level_ = level
00159
00160 def GetLevel(self):
00161 return self.level_
00162
00163 def paintEvent(self, event):
00164 if self.isEnabled() and self.bins_ is not None:
00165 painter = QtGui.QPainter()
00166 if painter.begin(self):
00167 self.PaintBackground(painter)
00168 self.PaintBins(painter)
00169 self.PaintLevel(painter)
00170 if(self.paint_mouse_):
00171 self.PaintMouse(painter)
00172 painter.end()
00173
00174 def PaintBackground(self,painter):
00175 size = self.size()
00176 painter.setBrush(QtCore.Qt.white)
00177 painter.setPen(QtCore.Qt.white)
00178 painter.drawRect(self.border_offset_,
00179 self.border_offset_,
00180 size.width() - 2 * self.border_offset_,
00181 self.preview_height_)
00182
00183 def PaintBins(self,painter):
00184 size = self.size()
00185 bin_cnt = len(self.bins_)
00186 bin_width = (size.width()-2* self.border_offset_) / float(bin_cnt)
00187 max=0
00188 for b in self.bins_:
00189 if(b>max):
00190 max = b
00191 max = math.log(max)
00192 if(max > 0):
00193 painter.setBrush(QtCore.Qt.black)
00194 painter.setPen(QtCore.Qt.black)
00195 for i in range(0,bin_cnt):
00196 bin_height = self.bins_[i]
00197 if(bin_height>0):
00198 bin_height = math.floor((math.log(bin_height)/max)*(self.preview_height_-2*(self.border_offset_)))
00199 painter.drawRect(self.border_offset_ + (i*bin_width),
00200 self.preview_height_ - bin_height,
00201 bin_width,
00202 bin_height)
00203
00204 def PaintLevel(self,painter):
00205 size = self.size()
00206 width = size.width()-(2* self.border_offset_)
00207 tot_len = self.maximum_-self.minimum_
00208 if(tot_len>0):
00209 cur_len = self.level_-self.minimum_
00210 painter.setBrush(QtCore.Qt.red)
00211 painter.setPen(QtCore.Qt.red)
00212 painter.drawRect((width / tot_len) * cur_len,
00213 self.border_offset_,
00214 1,
00215 self.preview_height_)
00216
00217 def PaintMouse(self,painter):
00218 size = self.size()
00219 width = size.width()-(2* self.border_offset_)
00220 painter.setBrush(QtCore.Qt.gray)
00221 painter.setPen(QtCore.Qt.gray)
00222 pos=self.mapFromGlobal(QtGui.QCursor.pos())
00223 painter.drawRect(pos.x(),
00224 self.border_offset_,
00225 1,
00226 self.preview_height_)
00227
00228 def mouseReleaseEvent(self, event):
00229 self.paint_mouse_=False
00230 size = self.size()
00231 width = size.width()-(2* self.border_offset_)
00232 tot_len = self.maximum_-self.minimum_
00233 self.level_ = self.minimum_ + float(event.x())/width * tot_len
00234 self.update()
00235 self.emit(QtCore.SIGNAL("levelUpdated"),(self.level_))
00236
00237 def mousePressEvent(self,event):
00238 self.paint_mouse_=True
00239
00240 def mouseMoveEvent(self, event):
00241 size = self.size()
00242 width = size.width()-(2* self.border_offset_)
00243 tot_len = self.maximum_-self.minimum_
00244 level = self.minimum_ + float(event.x())/width * tot_len
00245 self.emit(QtCore.SIGNAL("levelModified"),(level))
00246 self.update()