/[thuban]/trunk/thuban/Thuban/UI/classifier.py
ViewVC logotype

Diff of /trunk/thuban/Thuban/UI/classifier.py

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1526 by bh, Fri Jul 18 18:20:40 2003 UTC revision 1527 by jonathan, Wed Jul 30 15:43:28 2003 UTC
# Line 316  class ClassTable(wxPyGridTableBase): Line 316  class ClassTable(wxPyGridTableBase):
316          self.GetView().FitInside()          self.GetView().FitInside()
317    
318      def GetClassification(self):      def GetClassification(self):
319            """Return the current classification."""
320          return self.clazz          return self.clazz
321    
322      def SetClassification(self, clazz, group = None):      def SetClassification(self, clazz, group = None):
323            """Fill in the table with the given classification.
324            Select the given group if group is not None.
325            """
326    
327          self.GetView().BeginBatch()          self.GetView().BeginBatch()
328    
# Line 339  class ClassTable(wxPyGridTableBase): Line 343  class ClassTable(wxPyGridTableBase):
343    
344          self.__Modified()          self.__Modified()
345    
   
346          self.GetView().EndBatch()          self.GetView().EndBatch()
347          self.GetView().FitInside()          self.GetView().FitInside()
348    
349      def __NotifyRowChanges(self, curRows, newRows):      def __NotifyRowChanges(self, curRows, newRows):
350            """Make sure table updates correctly if the number of
351            rows changes.
352            """
353          #          #
354          # silly message processing for updates to the number of          # silly message processing for updates to the number of
355          # rows and columns          # rows and columns
# Line 362  class ClassTable(wxPyGridTableBase): Line 368  class ClassTable(wxPyGridTableBase):
368              self.GetView().ProcessTableMessage(msg)              self.GetView().ProcessTableMessage(msg)
369              self.GetView().FitInside()              self.GetView().FitInside()
370    
   
371      def __SetRow(self, row, group):      def __SetRow(self, row, group):
372          """Set a row's data to that of the group.          """Set a row's data to that of the group.
373    
# Line 594  class ClassTable(wxPyGridTableBase): Line 599  class ClassTable(wxPyGridTableBase):
599              return self.clazz.GetGroup(row - 1)              return self.clazz.GetGroup(row - 1)
600    
601      def SetClassGroup(self, row, group):      def SetClassGroup(self, row, group):
602            """Set the given row to properties of group."""
603          self.__SetRow(row, group)          self.__SetRow(row, group)
604          self.GetView().Refresh()          self.GetView().Refresh()
605    
# Line 679  class Classifier(NonModalNonParentDialog Line 685  class Classifier(NonModalNonParentDialog
685                     FIELDTYPE_DOUBLE: _("Decimal")}                     FIELDTYPE_DOUBLE: _("Decimal")}
686    
687      def __init__(self, parent, name, map, layer, group = None):      def __init__(self, parent, name, map, layer, group = None):
688            """Create a Properties/Classification dialog for a layer.
689            The layer is part of map. If group is not None, select that
690            group in the classification table.
691            """
692    
693          NonModalNonParentDialog.__init__(self, parent, name, "")          NonModalNonParentDialog.__init__(self, parent, name, "")
694    
695          self.__SetTitle(layer.Title())          self.__SetTitle(layer.Title())
# Line 862  class Classifier(NonModalNonParentDialog Line 873  class Classifier(NonModalNonParentDialog
873          self.haveApplied = False          self.haveApplied = False
874    
875      def unsubscribe_messages(self):      def unsubscribe_messages(self):
876            """Unsubscribe from all messages."""
877          self.parent.Unsubscribe(MAP_REPLACED, self.map_replaced)          self.parent.Unsubscribe(MAP_REPLACED, self.map_replaced)
878          self.map.Unsubscribe(MAP_LAYERS_REMOVED, self.map_layers_removed)          self.map.Unsubscribe(MAP_LAYERS_REMOVED, self.map_layers_removed)
879          self.layer.Unsubscribe(LAYER_SHAPESTORE_REPLACED,          self.layer.Unsubscribe(LAYER_SHAPESTORE_REPLACED,
880                                 self.layer_shapestore_replaced)                                 self.layer_shapestore_replaced)
881    
882      def map_layers_removed(self, map):      def map_layers_removed(self, map):
883            """Subscribed to MAP_LAYERS_REMOVED. If this layer was removed,
884            Close self.
885            """
886          if self.layer not in self.map.Layers():          if self.layer not in self.map.Layers():
887              self.Close()              self.Close()
888    
# Line 883  class Classifier(NonModalNonParentDialog Line 898  class Classifier(NonModalNonParentDialog
898          self.Close()          self.Close()
899    
900      def EditSymbol(self, row):      def EditSymbol(self, row):
901            """Open up a dialog where the user can select the properties
902            for a group.
903            """
904          table = self.classGrid.GetTable()          table = self.classGrid.GetTable()
905          prop = table.GetValueAsCustom(row, COL_SYMBOL, None)          prop = table.GetValueAsCustom(row, COL_SYMBOL, None)
906    
# Line 898  class Classifier(NonModalNonParentDialog Line 916  class Classifier(NonModalNonParentDialog
916          propDlg.Destroy()          propDlg.Destroy()
917                    
918      def _SetClassification(self, clazz):      def _SetClassification(self, clazz):
919            """Called from the ClassGen dialog when a new classification has
920            been created and should be set in the table.
921            """
922            # FIXME: This could be implemented using a message
923                    
924          self.fields.SetClientData(self.__cur_field, clazz)          self.fields.SetClientData(self.__cur_field, clazz)
925          self.classGrid.GetTable().SetClassification(clazz)          self.classGrid.GetTable().SetClassification(clazz)
926    
927      def __BuildClassification(self, fieldIndex, copyClass=False, force=False):      def __BuildClassification(self, fieldIndex, copyClass=False, force=False):
928            """Pack the classification setting into a Classification object.
929            Returns (Classification, fieldName) where fieldName is the selected
930            field in the table that the classification should be used with.
931            """
932    
933  #       numRows = self.classGrid.GetNumberRows()  #       numRows = self.classGrid.GetNumberRows()
934  #       assert numRows > 0  # there should always be a default row  #       assert numRows > 0  # there should always be a default row
# Line 923  class Classifier(NonModalNonParentDialog Line 949  class Classifier(NonModalNonParentDialog
949          return clazz, fieldName          return clazz, fieldName
950    
951      def __SetGridTable(self, fieldIndex, group = None):      def __SetGridTable(self, fieldIndex, group = None):
952            """Set the table with the classification associated with the
953            selected field at fieldIndex. Select the specified group
954            if group is not None.
955            """
956    
957          clazz = self.fields.GetClientData(fieldIndex)          clazz = self.fields.GetClientData(fieldIndex)
958    
# Line 940  class Classifier(NonModalNonParentDialog Line 970  class Classifier(NonModalNonParentDialog
970                                     self.layer.ShapeType(), group)                                     self.layer.ShapeType(), group)
971    
972      def __SetFieldTypeText(self, fieldIndex):      def __SetFieldTypeText(self, fieldIndex):
973            """Set the field type string using the data type of the field
974            at fieldIndex.
975            """
976          fieldName = self.fields.GetString(fieldIndex)          fieldName = self.fields.GetString(fieldIndex)
977          fieldType = self.layer.GetFieldType(fieldName)          fieldType = self.layer.GetFieldType(fieldName)
978    
# Line 967  class Classifier(NonModalNonParentDialog Line 1000  class Classifier(NonModalNonParentDialog
1000          self.__SetFieldTypeText(newIndex)          self.__SetFieldTypeText(newIndex)
1001    
1002      def __SetTitle(self, title):      def __SetTitle(self, title):
1003            """Set the title of the dialog."""
1004          if title != "":          if title != "":
1005              title = ": " + title              title = ": " + title
1006    
1007          self.SetTitle(_("Layer Properties") + title)          self.SetTitle(_("Layer Properties") + title)
1008    
1009      def _OnEditSymbol(self, event):      def _OnEditSymbol(self, event):
1010            """Open up a dialog for the user to select group properties."""
1011          sel = self.classGrid.GetCurrentSelection()          sel = self.classGrid.GetCurrentSelection()
1012    
1013          if len(sel) == 1:          if len(sel) == 1:
# Line 1034  class Classifier(NonModalNonParentDialog Line 1069  class Classifier(NonModalNonParentDialog
1069          self.classGrid.DeleteSelectedRows()          self.classGrid.DeleteSelectedRows()
1070    
1071      def _OnGenClass(self, event):      def _OnGenClass(self, event):
1072            """Open up a dialog for the user to generate classifications."""
1073    
1074          self.genDlg = ClassGenDialog(self, self.layer,          self.genDlg = ClassGenDialog(self, self.layer,
1075                            self.fields.GetString(self.__cur_field))                            self.fields.GetString(self.__cur_field))
# Line 1045  class Classifier(NonModalNonParentDialog Line 1081  class Classifier(NonModalNonParentDialog
1081          self.genDlg.Show()          self.genDlg.Show()
1082    
1083      def _OnGenDialogClose(self, event):      def _OnGenDialogClose(self, event):
1084            """Reenable buttons after the generate classification
1085            dialog is closed.
1086            """
1087          self.genDlg.Destroy()          self.genDlg.Destroy()
1088          self.genDlg = None          self.genDlg = None
1089          self.__EnableButtons(EB_GEN_CLASS)          self.__EnableButtons(EB_GEN_CLASS)
1090    
1091      def _OnMoveUp(self, event):      def _OnMoveUp(self, event):
1092            """When the user clicks MoveUp, try to move a group up one row."""
1093          sel = self.classGrid.GetCurrentSelection()          sel = self.classGrid.GetCurrentSelection()
1094    
1095          if len(sel) == 1:          if len(sel) == 1:
# Line 1065  class Classifier(NonModalNonParentDialog Line 1105  class Classifier(NonModalNonParentDialog
1105                  self.classGrid.MakeCellVisible(i - 1, 0)                  self.classGrid.MakeCellVisible(i - 1, 0)
1106    
1107      def _OnMoveDown(self, event):      def _OnMoveDown(self, event):
1108            """When the user clicks MoveDown, try to move a group down one row."""
1109          sel = self.classGrid.GetCurrentSelection()          sel = self.classGrid.GetCurrentSelection()
1110    
1111          if len(sel) == 1:          if len(sel) == 1:
# Line 1080  class Classifier(NonModalNonParentDialog Line 1121  class Classifier(NonModalNonParentDialog
1121                  self.classGrid.MakeCellVisible(i + 1, 0)                  self.classGrid.MakeCellVisible(i + 1, 0)
1122    
1123      def _OnTitleChanged(self, event):      def _OnTitleChanged(self, event):
1124            """Update the dialog title when the user changed the layer name."""
1125          obj = event.GetEventObject()          obj = event.GetEventObject()
1126    
1127          self.layer.SetTitle(obj.GetValue())          self.layer.SetTitle(obj.GetValue())
# Line 1088  class Classifier(NonModalNonParentDialog Line 1130  class Classifier(NonModalNonParentDialog
1130          self.__EnableButtons(EB_LAYER_TITLE)          self.__EnableButtons(EB_LAYER_TITLE)
1131    
1132      def __EnableButtons(self, case):      def __EnableButtons(self, case):
1133            """Helper method that enables/disables the appropriate buttons
1134            based on the case provided. Cases are constants beginning with EB_.
1135            """
1136    
1137          list = {wxID_OK                 : True,          list = {wxID_OK                 : True,
1138                  wxID_CANCEL             : True,                  wxID_CANCEL             : True,
# Line 1132  ID_SELPROP_STROKECLRTRANS = 4006 Line 1177  ID_SELPROP_STROKECLRTRANS = 4006
1177  ID_SELPROP_FILLCLRTRANS = 4007  ID_SELPROP_FILLCLRTRANS = 4007
1178    
1179  class SelectPropertiesDialog(wxDialog):  class SelectPropertiesDialog(wxDialog):
1180        """Dialog that allows the user to select group properties."""
1181    
1182      def __init__(self, parent, prop, shapeType):      def __init__(self, parent, prop, shapeType):
1183            """Open the dialog with the initial prop properties and shapeType."""
1184    
1185          wxDialog.__init__(self, parent, -1, _("Select Properties"),          wxDialog.__init__(self, parent, -1, _("Select Properties"),
1186                            style = wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)                            style = wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
1187    
# Line 1274  class SelectPropertiesDialog(wxDialog): Line 1322  class SelectPropertiesDialog(wxDialog):
1322    
1323    
1324  class ClassDataPreviewWindow(wxWindow):  class ClassDataPreviewWindow(wxWindow):
1325        """A custom window that draws group properties using the correct shape."""
1326    
1327      def __init__(self, rect, prop, shapeType,      def __init__(self, rect, prop, shapeType,
1328                         parent = None, id = -1, size = wxDefaultSize):                         parent = None, id = -1, size = wxDefaultSize):
1329            """Draws the appropriate shape as specified with shapeType using
1330            prop properities.
1331            """
1332          if parent is not None:          if parent is not None:
1333              wxWindow.__init__(self, parent, id, (0, 0), size)              wxWindow.__init__(self, parent, id, (0, 0), size)
1334              EVT_PAINT(self, self._OnPaint)              EVT_PAINT(self, self._OnPaint)
# Line 1305  class ClassDataPreviewWindow(wxWindow): Line 1357  class ClassDataPreviewWindow(wxWindow):
1357          self.previewer.Draw(dc, rect, self.prop, self.shapeType)          self.previewer.Draw(dc, rect, self.prop, self.shapeType)
1358    
1359  class ClassDataPreviewer:  class ClassDataPreviewer:
1360        """Class that actually draws a group property preview."""
1361    
1362      def Draw(self, dc, rect, prop, shapeType):      def Draw(self, dc, rect, prop, shapeType):
1363    
# Line 1353  class ClassDataPreviewer: Line 1406  class ClassDataPreviewer:
1406              dc.DrawRectangle(x, y, w, h)              dc.DrawRectangle(x, y, w, h)
1407    
1408  class ClassRenderer(wxPyGridCellRenderer):  class ClassRenderer(wxPyGridCellRenderer):
1409        """A wrapper class that can be used to draw group properties in a
1410        grid table.
1411        """
1412    
1413      def __init__(self, shapeType):      def __init__(self, shapeType):
1414          wxPyGridCellRenderer.__init__(self)          wxPyGridCellRenderer.__init__(self)
# Line 1383  class ClassRenderer(wxPyGridCellRenderer Line 1439  class ClassRenderer(wxPyGridCellRenderer
1439    
1440    
1441  class ClassGroupPropertiesCtrl(wxWindow, wxControl):  class ClassGroupPropertiesCtrl(wxWindow, wxControl):
1442        """A custom window and control that draw a preview of group properties
1443        and can open a dialog to modify the properties if the user double-clicks
1444        it.
1445        """
1446    
1447      def __init__(self, parent, id, props, shapeType,      def __init__(self, parent, id, props, shapeType,
1448                   size = wxDefaultSize, style = 0):                   size = wxDefaultSize, style = 0):
# Line 1429  class ClassGroupPropertiesCtrl(wxWindow, Line 1489  class ClassGroupPropertiesCtrl(wxWindow,
1489          self.Refresh()          self.Refresh()
1490    
1491      def AllowEdit(self, allow):      def AllowEdit(self, allow):
1492            """Allow/Disallow double-clicking on the control."""
1493          self.allowEdit = allow          self.allowEdit = allow
1494    
1495      def DoEdit(self):      def DoEdit(self):
1496            """Open the properties selector dialog."""
1497    
1498          if not self.allowEdit: return          if not self.allowEdit: return
1499    
1500          propDlg = SelectPropertiesDialog(self.parent,          propDlg = SelectPropertiesDialog(self.parent,

Legend:
Removed from v.1526  
changed lines
  Added in v.1527

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26