/[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 630 by jonathan, Wed Apr 9 10:10:06 2003 UTC revision 638 by jonathan, Thu Apr 10 14:35:20 2003 UTC
# Line 37  ID_CLASS_TABLE = 40011 Line 37  ID_CLASS_TABLE = 40011
37    
38    
39  # table columns  # table columns
40  COL_SYMBOL = 0  COL_VISIBLE = 0
41  COL_VALUE  = 1  COL_SYMBOL  = 1
42  COL_LABEL  = 2  COL_VALUE   = 2
43    COL_LABEL   = 3
44    NUM_COLS    = 4
45    
46  # indices into the client data lists in Classifier.fields  # indices into the client data lists in Classifier.fields
47  FIELD_CLASS = 0  FIELD_CLASS = 0
# Line 63  class ClassGrid(wxGrid): Line 65  class ClassGrid(wxGrid):
65                   use for display.                   use for display.
66          """          """
67    
         #wxGrid.__init__(self, parent, ID_CLASS_TABLE, size = (340, 160))  
68          wxGrid.__init__(self, parent, ID_CLASS_TABLE)          wxGrid.__init__(self, parent, ID_CLASS_TABLE)
         #self.SetTable(ClassTable(fieldData, layer.ShapeType(), self), True)  
69    
70          self.classifier = classifier          self.classifier = classifier
71    
# Line 77  class ClassGrid(wxGrid): Line 77  class ClassGrid(wxGrid):
77          EVT_GRID_COL_SIZE(self, self._OnCellResize)          EVT_GRID_COL_SIZE(self, self._OnCellResize)
78          EVT_GRID_ROW_SIZE(self, self._OnCellResize)          EVT_GRID_ROW_SIZE(self, self._OnCellResize)
79    
80        #def GetCellAttr(self, row, col):
81            #print "GetCellAttr ", row, col
82            #wxGrid.GetCellAttr(self, row, col)
83    
84      def CreateTable(self, clazz, shapeType, group = None):      def CreateTable(self, clazz, shapeType, group = None):
85    
86          assert isinstance(clazz, Classification)          assert isinstance(clazz, Classification)
# Line 106  class ClassGrid(wxGrid): Line 110  class ClassGrid(wxGrid):
110      def GetSelectedRows(self):      def GetSelectedRows(self):
111          return self.GetCurrentSelection()          return self.GetCurrentSelection()
112    
113      def SetCellRenderer(self, row, col):      #def SetCellRenderer(self, row, col, renderer):
114          raise ValueError(_("Must not allow setting of renderer in ClassGrid!"))          #raise ValueError(_("Must not allow setting of renderer in ClassGrid!"))
115    
116      #      #
117      # [Set|Get]Table is taken from http://wiki.wxpython.org      # [Set|Get]Table is taken from http://wiki.wxpython.org
# Line 202  class ClassGrid(wxGrid): Line 206  class ClassGrid(wxGrid):
206  #                                  sel = False))  #                                  sel = False))
207    
208      def _OnCellDClick(self, event):      def _OnCellDClick(self, event):
209          """Handle a double on a cell."""          """Handle a double click on a cell."""
210    
211          r = event.GetRow()          r = event.GetRow()
212          c = event.GetCol()          c = event.GetCol()
         if c == COL_SYMBOL:  
             self.classifier.EditGroupProperties(r)  
213    
214            if c == COL_SYMBOL:
215                self.classifier.EditSymbol(r)
216            else:
217                event.Skip()
218    
219      #      #
220      # _OnSelectedRange() and _OnSelectedCell() were borrowed      # _OnSelectedRange() and _OnSelectedCell() were borrowed
# Line 241  class ClassGrid(wxGrid): Line 247  class ClassGrid(wxGrid):
247  class ClassTable(wxPyGridTableBase):  class ClassTable(wxPyGridTableBase):
248      """Represents the underlying data structure for the grid."""      """Represents the underlying data structure for the grid."""
249    
250      NUM_COLS = 3      __col_labels = [_("Visible"), _("Symbol"), _("Value"), _("Label")]
   
     __col_labels = [_("Symbol"), _("Value"), _("Label")]  
251    
252    
253      def __init__(self, view = None):      def __init__(self, view = None):
# Line 257  class ClassTable(wxPyGridTableBase): Line 261  class ClassTable(wxPyGridTableBase):
261    
262          wxPyGridTableBase.__init__(self)          wxPyGridTableBase.__init__(self)
263    
264          self.SetView(view)          assert len(ClassTable.__col_labels) == NUM_COLS
265    
266          self.clazz = None          self.clazz = None
267            self.__colAttr = {}
268    
269          #self.Reset(clazz, shapeType)          self.SetView(view)
270    
271      def Reset(self, clazz, shapeType, group = None):      def Reset(self, clazz, shapeType, group = None):
272          """Reset the table with the given data.          """Reset the table with the given data.
# Line 286  class ClassTable(wxPyGridTableBase): Line 292  class ClassTable(wxPyGridTableBase):
292          self.SetClassification(clazz, group)          self.SetClassification(clazz, group)
293          self.__Modified(-1)          self.__Modified(-1)
294    
295            self.__colAttr = {}
296    
297            attr = wxGridCellAttr()
298            attr.SetEditor(wxGridCellBoolEditor())
299            attr.SetRenderer(wxGridCellBoolRenderer())
300            attr.SetAlignment(wxALIGN_CENTER, wxALIGN_CENTER)
301            self.__colAttr[COL_VISIBLE] = attr
302    
303            attr = wxGridCellAttr()
304            attr.SetRenderer(ClassRenderer(self.shapeType))
305            attr.SetReadOnly()
306            self.__colAttr[COL_SYMBOL] = attr
307    
308          self.GetView().EndBatch()          self.GetView().EndBatch()
309          self.GetView().FitInside()          self.GetView().FitInside()
310    
# Line 298  class ClassTable(wxPyGridTableBase): Line 317  class ClassTable(wxPyGridTableBase):
317    
318          old_len = self.GetNumberRows()          old_len = self.GetNumberRows()
319    
         #  
         # copy the data out of the classification and into our  
         # array  
         #  
320          row = -1          row = -1
 #       for g in clazz:  
 #           ng = copy.deepcopy(g)  
 #           self.__SetRow(None, ng)  
 #           if g is group:  
 #               row = self.GetNumberRows() - 1  
 #               #print "selecting row..."  
   
   
         #self.clazz = copy.deepcopy(clazz)  
321          self.clazz = clazz          self.clazz = clazz
322    
323          self.__NotifyRowChanges(old_len, self.GetNumberRows())          self.__NotifyRowChanges(old_len, self.GetNumberRows())
324    
325            #
326            # XXX: this is dead code at the moment
327            #
328          if row > -1:          if row > -1:
329              self.GetView().ClearSelection()              self.GetView().ClearSelection()
330              self.GetView().SelectRow(row)              self.GetView().SelectRow(row)
# Line 323  class ClassTable(wxPyGridTableBase): Line 332  class ClassTable(wxPyGridTableBase):
332    
333          self.__Modified()          self.__Modified()
334    
335    
336          self.GetView().EndBatch()          self.GetView().EndBatch()
337          self.GetView().FitInside()          self.GetView().FitInside()
338    
# Line 398  class ClassTable(wxPyGridTableBase): Line 408  class ClassTable(wxPyGridTableBase):
408    
409      def GetNumberCols(self):      def GetNumberCols(self):
410          """Return the number of columns."""          """Return the number of columns."""
411          return self.NUM_COLS          return NUM_COLS
412    
413      def IsEmptyCell(self, row, col):      def IsEmptyCell(self, row, col):
414          """Determine if a cell is empty. This is always false."""          """Determine if a cell is empty. This is always false."""
# Line 416  class ClassTable(wxPyGridTableBase): Line 426  class ClassTable(wxPyGridTableBase):
426          """          """
427    
428          self.SetValueAsCustom(row, col, None, value)          self.SetValueAsCustom(row, col, None, value)
         self.__Modified()  
429                
430      def GetValueAsCustom(self, row, col, typeName):      def GetValueAsCustom(self, row, col, typeName):
431          """Return the object that is used to represent the given          """Return the object that is used to represent the given
# Line 431  class ClassTable(wxPyGridTableBase): Line 440  class ClassTable(wxPyGridTableBase):
440              group = self.clazz.GetGroup(row - 1)              group = self.clazz.GetGroup(row - 1)
441    
442    
443            if col == COL_VISIBLE:
444                return group.IsVisible()
445    
446          if col == COL_SYMBOL:          if col == COL_SYMBOL:
447              return group.GetProperties()              return group.GetProperties()
448    
# Line 513  class ClassTable(wxPyGridTableBase): Line 525  class ClassTable(wxPyGridTableBase):
525    
526          mod = True # assume the data will change          mod = True # assume the data will change
527    
528          if col == COL_SYMBOL:          if col == COL_VISIBLE:
529                group.SetVisible(value)
530            elif col == COL_SYMBOL:
531              group.SetProperties(value)              group.SetProperties(value)
532          elif col == COL_LABEL:          elif col == COL_LABEL:
533              group.SetLabel(value)              group.SetLabel(value)
# Line 569  class ClassTable(wxPyGridTableBase): Line 583  class ClassTable(wxPyGridTableBase):
583      def GetAttr(self, row, col, someExtraParameter):      def GetAttr(self, row, col, someExtraParameter):
584          """Returns the cell attributes"""          """Returns the cell attributes"""
585    
586          attr = wxGridCellAttr()          return self.__colAttr.get(col, wxGridCellAttr()).Clone()
         #attr = wxPyGridTableBase.GetAttr(self, row, col, someExtraParameter)  
   
         if col == COL_SYMBOL:  
             # we need to create a new renderer each time, because  
             # SetRenderer takes control of the parameter  
             attr.SetRenderer(ClassRenderer(self.shapeType))  
             attr.SetReadOnly()  
   
         return attr  
587    
588      def GetClassGroup(self, row):      def GetClassGroup(self, row):
589          """Return the ClassGroup object representing row 'row'."""          """Return the ClassGroup object representing row 'row'."""
# Line 645  class ClassTable(wxPyGridTableBase): Line 650  class ClassTable(wxPyGridTableBase):
650    
651    
652  ID_CLASSIFY_OK = 4001  ID_CLASSIFY_OK = 4001
653  ID_CLASSIFY_CANCEL = 4002  ID_CLASSIFY_REVERT = 4002
654  ID_CLASSIFY_ADD = 4003  ID_CLASSIFY_ADD = 4003
655  ID_CLASSIFY_GENCLASS = 4004  ID_CLASSIFY_GENCLASS = 4004
656  ID_CLASSIFY_REMOVE = 4005  ID_CLASSIFY_REMOVE = 4005
657  ID_CLASSIFY_MOVEUP = 4006  ID_CLASSIFY_MOVEUP = 4006
658  ID_CLASSIFY_MOVEDOWN = 4007  ID_CLASSIFY_MOVEDOWN = 4007
659  ID_CLASSIFY_APPLY = 4008  ID_CLASSIFY_TRY = 4008
660  ID_CLASSIFY_EDITPROPS = 4009  ID_CLASSIFY_EDITSYM = 4009
661  ID_CLASSIFY_CLOSE = 4010  ID_CLASSIFY_CLOSE = 4010
662    
663  BTN_ADD = 0  BTN_ADD = 0
# Line 748  class Classifier(NonModalDialog): Line 753  class Classifier(NonModalDialog):
753    
754          controlButtonBox = wxBoxSizer(wxVERTICAL)          controlButtonBox = wxBoxSizer(wxVERTICAL)
755    
756          button = wxButton(panel, ID_CLASSIFY_ADD, _("Add"))          button = wxButton(panel, ID_CLASSIFY_GENCLASS, _("Generate Class"))
757          controlButtonBox.Add(button, 0, wxGROW | wxALL, 4)          controlButtonBox.Add(button, 0, wxGROW | wxALL, 4)
758          self.controlButtons.append(button)          self.controlButtons.append(button)
759    
760          button = wxButton(panel, ID_CLASSIFY_EDITPROPS, _("Edit Properties"))          button = wxButton(panel, ID_CLASSIFY_ADD, _("Add"))
761          controlButtonBox.Add(button, 0, wxGROW | wxALL, 4)          controlButtonBox.Add(button, 0, wxGROW | wxALL, 4)
762          self.controlButtons.append(button)          self.controlButtons.append(button)
763    
764          button = wxButton(panel, ID_CLASSIFY_GENCLASS, _("Generate Class"))          button = wxButton(panel, ID_CLASSIFY_MOVEUP, _("Move Up"))
765          controlButtonBox.Add(button, 0, wxGROW | wxALL, 4)          controlButtonBox.Add(button, 0, wxGROW | wxALL, 4)
766          self.controlButtons.append(button)          self.controlButtons.append(button)
767    
768          button = wxButton(panel, ID_CLASSIFY_MOVEUP, _("Move Up"))          button = wxButton(panel, ID_CLASSIFY_MOVEDOWN, _("Move Down"))
769          controlButtonBox.Add(button, 0, wxGROW | wxALL, 4)          controlButtonBox.Add(button, 0, wxGROW | wxALL, 4)
770          self.controlButtons.append(button)          self.controlButtons.append(button)
771    
772          button = wxButton(panel, ID_CLASSIFY_MOVEDOWN, _("Move Down"))          button = wxButton(panel, ID_CLASSIFY_EDITSYM, _("Edit Symbol"))
773          controlButtonBox.Add(button, 0, wxGROW | wxALL, 4)          controlButtonBox.Add(button, 0, wxGROW | wxALL, 4)
774          self.controlButtons.append(button)          self.controlButtons.append(button)
775    
# Line 781  class Classifier(NonModalDialog): Line 786  class Classifier(NonModalDialog):
786          #          #
787    
788          self.classGrid = ClassGrid(panel, self)          self.classGrid = ClassGrid(panel, self)
789          #self.__SetGridTable(self.__cur_field, group)  #       self.classGrid = wxGrid(panel, -1)
790          #self.fields.SetSelection(self.__cur_field)  #       self.classGrid.SetDefaultRenderer(wxGridCellBoolRenderer())
791    #       self.classGrid.SetDefaultEditor(wxGridCellBoolEditor())
792            #self.classGrid.CreateGrid(5, 5)
793            #self.classGrid.SetCellEditor(0, 0, wxGridCellBoolEditor())
794            #self.classGrid.SetCellRenderer(0, 0, wxGridCellBoolRenderer())
795            #print self.classGrid.GetCellEditor(0, 0)
796            #print self.classGrid.GetCellRenderer(0, 0)
797            #self.classGrid = ClassGrid(panel, self)
798    
799            # need these
800            self.__SetGridTable(self.__cur_field, group)
801            self.fields.SetSelection(self.__cur_field)
802            #self.classGrid.SetCellEditor(0, 0, wxGridCellBoolEditor())
803            #self.classGrid.SetCellRenderer(0, 0, wxGridCellBoolRenderer())
804    
805          # calling __SelectField after creating the classGrid fills in the          # calling __SelectField after creating the classGrid fills in the
806          # grid with the correct information          # grid with the correct information
807          self.fields.SetSelection(self.__cur_field)          #self.fields.SetSelection(self.__cur_field)
808          self.__SelectField(self.__cur_field, group = group)          #self.__SelectField(self.__cur_field, group = group)
809    
810          #self.classGrid.SelectGroup(group)          #self.classGrid.SelectGroup(group)
811    
# Line 799  class Classifier(NonModalDialog): Line 817  class Classifier(NonModalDialog):
817          panelBox.Add(controlBox, 1, wxGROW, 10)          panelBox.Add(controlBox, 1, wxGROW, 10)
818    
819          EVT_BUTTON(self, ID_CLASSIFY_ADD, self._OnAdd)          EVT_BUTTON(self, ID_CLASSIFY_ADD, self._OnAdd)
820          EVT_BUTTON(self, ID_CLASSIFY_EDITPROPS, self._OnEditGroupProperties)          EVT_BUTTON(self, ID_CLASSIFY_EDITSYM, self._OnEditSymbol)
821          EVT_BUTTON(self, ID_CLASSIFY_REMOVE, self._OnRemove)          EVT_BUTTON(self, ID_CLASSIFY_REMOVE, self._OnRemove)
822          EVT_BUTTON(self, ID_CLASSIFY_GENCLASS, self._OnGenClass)          EVT_BUTTON(self, ID_CLASSIFY_GENCLASS, self._OnGenClass)
823          EVT_BUTTON(self, ID_CLASSIFY_MOVEUP, self._OnMoveUp)          EVT_BUTTON(self, ID_CLASSIFY_MOVEUP, self._OnMoveUp)
# Line 808  class Classifier(NonModalDialog): Line 826  class Classifier(NonModalDialog):
826          ###########          ###########
827    
828          buttonBox = wxBoxSizer(wxHORIZONTAL)          buttonBox = wxBoxSizer(wxHORIZONTAL)
829          buttonBox.Add(wxButton(panel, ID_CLASSIFY_OK, _("OK")),          buttonBox.Add(wxButton(panel, ID_CLASSIFY_TRY, _("Try")),
830                        0, wxALL, 4)                        0, wxALL, 4)
831          buttonBox.Add(60, 20, 0, wxALL, 4)          buttonBox.Add(60, 20, 0, wxALL, 4)
832          buttonBox.Add(wxButton(panel, ID_CLASSIFY_APPLY, _("Apply")),          buttonBox.Add(wxButton(panel, ID_CLASSIFY_REVERT, _("Revert")),
833                        0, wxALL, 4)                        0, wxALL, 4)
834          buttonBox.Add(60, 20, 0, wxALL, 4)          buttonBox.Add(60, 20, 0, wxALL, 4)
835          buttonBox.Add(wxButton(panel, ID_CLASSIFY_CLOSE, _("Close")),          buttonBox.Add(wxButton(panel, ID_CLASSIFY_OK, _("OK")),
836                        0, wxALL, 4)                        0, wxALL, 4)
837          buttonBox.Add(60, 20, 0, wxALL, 4)          buttonBox.Add(60, 20, 0, wxALL, 4)
838          buttonBox.Add(wxButton(panel, ID_CLASSIFY_CANCEL, _("Cancel")),          buttonBox.Add(wxButton(panel, ID_CLASSIFY_CLOSE, _("Close")),
839                        0, wxALL, 4)                        0, wxALL, 4)
840          panelBox.Add(buttonBox, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_BOTTOM, 0)          panelBox.Add(buttonBox, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_BOTTOM, 0)
841    
842          EVT_BUTTON(self, ID_CLASSIFY_OK, self._OnOK)          EVT_BUTTON(self, ID_CLASSIFY_OK, self._OnOK)
843          EVT_BUTTON(self, ID_CLASSIFY_APPLY, self._OnApply)          EVT_BUTTON(self, ID_CLASSIFY_TRY, self._OnTry)
844          EVT_BUTTON(self, ID_CLASSIFY_CLOSE, self._OnCloseBtn)          EVT_BUTTON(self, ID_CLASSIFY_CLOSE, self._OnCloseBtn)
845          EVT_BUTTON(self, ID_CLASSIFY_CANCEL, self._OnCancel)          EVT_BUTTON(self, ID_CLASSIFY_REVERT, self._OnRevert)
846    
847          ###########          ###########
848    
# Line 843  class Classifier(NonModalDialog): Line 861  class Classifier(NonModalDialog):
861    
862          self.haveApplied = False          self.haveApplied = False
863    
864      def EditGroupProperties(self, row):      def EditSymbol(self, row):
865          table = self.classGrid.GetTable()          table = self.classGrid.GetTable()
866          prop = table.GetValueAsCustom(row, COL_SYMBOL, None)          prop = table.GetValueAsCustom(row, COL_SYMBOL, None)
867    
# Line 941  class Classifier(NonModalDialog): Line 959  class Classifier(NonModalDialog):
959          self.__SetFieldTypeText(newIndex)          self.__SetFieldTypeText(newIndex)
960    
961    
962      def _OnEditGroupProperties(self, event):      def _OnEditSymbol(self, event):
963          sel = self.classGrid.GetCurrentSelection()          sel = self.classGrid.GetCurrentSelection()
964    
965          if len(sel) == 1:          if len(sel) == 1:
966              self.EditGroupProperties(sel[0])              self.EditSymbol(sel[0])
967    
968      def _OnFieldSelect(self, event):      def _OnFieldSelect(self, event):
969          index = self.fields.GetSelection()          index = self.fields.GetSelection()
970          self.__SelectField(index, self.__cur_field)          self.__SelectField(index, self.__cur_field)
971          self.__cur_field = index          self.__cur_field = index
972    
973      def _OnApply(self, event):      def _OnTry(self, event):
974          """Put the data from the table into a new Classification and hand          """Put the data from the table into a new Classification and hand
975             it to the layer.             it to the layer.
976          """          """
# Line 971  class Classifier(NonModalDialog): Line 989  class Classifier(NonModalDialog):
989          self.haveApplied = True          self.haveApplied = True
990    
991      def _OnOK(self, event):      def _OnOK(self, event):
992          self._OnApply(event)          self._OnTry(event)
993          self.Close()          self.Close()
994    
995      def _OnCloseBtn(self, event):      def _OnCloseBtn(self, event):
# Line 982  class Classifier(NonModalDialog): Line 1000  class Classifier(NonModalDialog):
1000    
1001          self.Close()          self.Close()
1002    
1003      def _OnCancel(self, event):      def _OnRevert(self, event):
1004          """The layer's current classification stays the same."""          """The layer's current classification stays the same."""
1005          if self.haveApplied:          if self.haveApplied:
1006              self.layer.SetClassification(self.originalClass)              self.layer.SetClassification(self.originalClass)
1007    
1008          self.Close()          #self.Close()
1009    
1010      def _OnAdd(self, event):      def _OnAdd(self, event):
1011          self.classGrid.AppendRows()          self.classGrid.AppendRows()

Legend:
Removed from v.630  
changed lines
  Added in v.638

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26