Commit 81552f9d11c371f19e909a65ed4ead6fa3bde228

Authored by Thiago Franco de Moraes
1 parent 40466824
Exists in master

Created a class with showing and edit listctrl features and subbclassed at mask, surface, measures

Showing 1 changed file with 79 additions and 160 deletions   Show diff stats
invesalius/gui/data_notebook.py
... ... @@ -351,10 +351,84 @@ class ButtonControlPanel(wx.Panel):
351 351 else:
352 352 dlg.MaskSelectionRequiredForDuplication()
353 353  
354   -class MasksListCtrlPanel(wx.ListCtrl):
  354 +
  355 +class InvListCtrl(wx.ListCtrl):
355 356 def __init__(self, parent, ID=-1, pos=wx.DefaultPosition,
356 357 size=wx.DefaultSize, style=wx.LC_REPORT | wx.LC_EDIT_LABELS):
357 358 wx.ListCtrl.__init__(self, parent, ID, pos, size, style=style)
  359 + self.__bind_events_wx()
  360 +
  361 + def __bind_events_wx(self):
  362 + self.Bind(wx.EVT_LEFT_UP, self.OnClickItem)
  363 + self.Bind(wx.EVT_LEFT_DCLICK, self.OnDblClickItem)
  364 +
  365 + def CreateColourBitmap(self, colour):
  366 + """
  367 + Create a wx Image with a mask colour.
  368 + colour: colour in rgb format(0 - 1)
  369 + """
  370 + image = self.image_gray
  371 + new_image = Image.new("RGB", image.size)
  372 + for x in range(image.size[0]):
  373 + for y in range(image.size[1]):
  374 + pixel_colour = [int(i*image.getpixel((x,y)))
  375 + for i in colour]
  376 + new_image.putpixel((x,y), tuple(pixel_colour))
  377 +
  378 + wx_image = wx.Image(new_image.size[0],
  379 + new_image.size[1])
  380 + try:
  381 + wx_image.SetData(new_image.tostring())
  382 + except Exception:
  383 + wx_image.SetData(new_image.tobytes())
  384 + return wx.Bitmap(wx_image.Scale(16, 16))
  385 +
  386 + def OnClickItem(self, evt):
  387 + self._click_check = False
  388 + item_idx, flag = (self.HitTest(evt.GetPosition()))
  389 + column_clicked = self.get_column_clicked(evt.GetPosition())
  390 + if column_clicked == 0:
  391 + self._click_check = True
  392 + item = self.GetItem(item_idx, 0)
  393 + flag = not bool(item.GetImage())
  394 + self.SetItemImage(item_idx, int(flag))
  395 + self.OnCheckItem(item_idx, flag)
  396 + evt.Skip()
  397 +
  398 + def OnDblClickItem(self, evt):
  399 + self._click_check = False
  400 + item_idx, flag = (self.HitTest(evt.GetPosition()))
  401 + column_clicked = self.get_column_clicked(evt.GetPosition())
  402 + if column_clicked == 1:
  403 + item = self.GetItem(item_idx, 1)
  404 + self.enter_edition(item)
  405 + evt.Skip()
  406 +
  407 + def enter_edition(self, item):
  408 + ctrl = self.EditLabel(item.GetId())
  409 + w, h = ctrl.GetClientSize()
  410 + w = self.GetColumnWidth(1)
  411 + ctrl.SetClientSize(w, h)
  412 + ctrl.SetValue(item.GetText())
  413 + ctrl.SelectAll()
  414 +
  415 +
  416 + def get_column_clicked(self, position):
  417 + epx, epy = position
  418 + wpx, wpy = self.GetPosition()
  419 + width_sum = 0
  420 + for i in range(self.GetColumnCount()):
  421 + width_sum += self.GetColumnWidth(i)
  422 + if (epx - wpx) <= width_sum:
  423 + return i
  424 + return -1
  425 +
  426 +
  427 +
  428 +class MasksListCtrlPanel(InvListCtrl):
  429 + def __init__(self, parent, ID=-1, pos=wx.DefaultPosition,
  430 + size=wx.DefaultSize, style=wx.LC_REPORT | wx.LC_EDIT_LABELS):
  431 + super().__init__(parent, ID, pos, size, style=style)
358 432 self._click_check = False
359 433 self.mask_list_index = {}
360 434 self.current_index = 0
... ... @@ -366,9 +440,6 @@ class MasksListCtrlPanel(wx.ListCtrl):
366 440 def __bind_events_wx(self):
367 441 self.Bind(wx.EVT_LIST_END_LABEL_EDIT, self.OnEditLabel)
368 442 self.Bind(wx.EVT_KEY_UP, self.OnKeyEvent)
369   - # self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnItemActivated)
370   - self.Bind(wx.EVT_LEFT_UP, self.OnClickItem)
371   - self.Bind(wx.EVT_LEFT_DCLICK, self.OnDblClickItem)
372 443  
373 444 def __bind_events(self):
374 445 Publisher.subscribe(self.AddMask, 'Add mask')
... ... @@ -483,16 +554,6 @@ class MasksListCtrlPanel(wx.ListCtrl):
483 554  
484 555 self.image_gray = Image.open(os.path.join(inv_paths.ICON_DIR, "object_colour.jpg"))
485 556  
486   - def get_column_clicked(self, position):
487   - epx, epy = position
488   - wpx, wpy = self.GetPosition()
489   - width_sum = 0
490   - for i in range(self.GetColumnCount()):
491   - width_sum += self.GetColumnWidth(i)
492   - if (epx - wpx) <= width_sum:
493   - return i
494   - return -1
495   -
496 557 def OnEditLabel(self, evt):
497 558 if not evt.IsEditCancelled():
498 559 index = evt.GetIndex()
... ... @@ -510,56 +571,7 @@ class MasksListCtrlPanel(wx.ListCtrl):
510 571 self.current_index = index
511 572 Publisher.sendMessage('Show mask', index=index, value=flag)
512 573  
513   - def OnClickItem(self, evt):
514   - self._click_check = False
515   - item_idx, flag = (self.HitTest(evt.GetPosition()))
516   - column_clicked = self.get_column_clicked(evt.GetPosition())
517   - if column_clicked == 0:
518   - self._click_check = True
519   - item = self.GetItem(item_idx, 0)
520   - flag = not bool(item.GetImage())
521   - self.SetItemImage(item_idx, int(flag))
522   - self.OnCheckItem(item_idx, flag)
523   - evt.Skip()
524   -
525   - def OnDblClickItem(self, evt):
526   - self._click_check = False
527   - item_idx, flag = (self.HitTest(evt.GetPosition()))
528   - column_clicked = self.get_column_clicked(evt.GetPosition())
529   - if column_clicked == 1:
530   - item = self.GetItem(item_idx, 1)
531   - self.enter_edition(item)
532   - evt.Skip()
533   -
534   - def enter_edition(self, item):
535   - print("Enter edition")
536   - ctrl = self.EditLabel(item.GetId())
537   - w, h = ctrl.GetClientSize()
538   - w = self.GetColumnWidth(1)
539   - ctrl.SetClientSize(w, h)
540   - ctrl.SetValue(item.GetText())
541   - ctrl.SelectAll()
542   -
543   - def CreateColourBitmap(self, colour):
544   - """
545   - Create a wx Image with a mask colour.
546   - colour: colour in rgb format(0 - 1)
547   - """
548   - image = self.image_gray
549   - new_image = Image.new("RGB", image.size)
550   - for x in range(image.size[0]):
551   - for y in range(image.size[1]):
552   - pixel_colour = [int(i*image.getpixel((x,y)))
553   - for i in colour]
554   - new_image.putpixel((x,y), tuple(pixel_colour))
555 574  
556   - wx_image = wx.Image(new_image.size[0],
557   - new_image.size[1])
558   - try:
559   - wx_image.SetData(new_image.tostring())
560   - except Exception:
561   - wx_image.SetData(new_image.tobytes())
562   - return wx.Bitmap(wx_image.Scale(16, 16))
563 575  
564 576 def InsertNewItem(self, index=0, label=_("Mask"), threshold="(1000, 4500)",
565 577 colour=None):
... ... @@ -743,10 +755,10 @@ class SurfaceButtonControlPanel(wx.Panel):
743 755 def AffineStatus(self, affine, status):
744 756 self.affinestatus = status
745 757  
746   -class SurfacesListCtrlPanel(wx.ListCtrl):
  758 +class SurfacesListCtrlPanel(InvListCtrl):
747 759 def __init__(self, parent, ID=-1, pos=wx.DefaultPosition,
748 760 size=wx.DefaultSize, style=wx.LC_REPORT | wx.LC_EDIT_LABELS):
749   - wx.ListCtrl.__init__(self, parent, ID, pos, size, style=style)
  761 + super().__init__(parent, ID, pos, size, style=style)
750 762 self._click_check = False
751 763 self.__init_columns()
752 764 self.__init_image_list()
... ... @@ -772,30 +784,6 @@ class SurfacesListCtrlPanel(wx.ListCtrl):
772 784 self.Bind(wx.EVT_LIST_END_LABEL_EDIT, self.OnEditLabel)
773 785 #self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected_)
774 786 self.Bind(wx.EVT_KEY_UP, self.OnKeyEvent)
775   - self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnItemActivated)
776   - self.Bind(wx.EVT_LEFT_UP, self.OnClickItem)
777   -
778   - def OnClickItem(self, evt):
779   - self._click_check = False
780   - item_idx, flag = (self.HitTest(evt.GetPosition()))
781   - if flag == wx.LIST_HITTEST_ONITEMICON:
782   - self._click_check = True
783   - item = self.GetItem(item_idx, 0)
784   - flag = not bool(item.GetImage())
785   - self.SetItemImage(item_idx, int(flag))
786   - self.OnCheckItem(item_idx, flag)
787   - evt.Skip()
788   -
789   - def OnItemActivated(self, evt):
790   - if not self._click_check:
791   - item = self.GetItem(evt.GetItem().GetId(), 1)
792   - ctrl = self.EditLabel(item.GetId())
793   - w, h = ctrl.GetClientSize()
794   - w = self.GetColumnWidth(1)
795   - ctrl.SetClientSize(w, h)
796   - ctrl.SetValue(item.GetText())
797   - ctrl.SelectAll()
798   - evt.Skip()
799 787  
800 788 def OnKeyEvent(self, event):
801 789 keycode = event.GetKeyCode()
... ... @@ -982,28 +970,6 @@ class SurfacesListCtrlPanel(wx.ListCtrl):
982 970 self.SetItem(index, 4, transparency)
983 971 self.SetItemImage(index, 1)
984 972  
985   - def CreateColourBitmap(self, colour):
986   - """
987   - Create a wx Image with a mask colour.
988   - colour: colour in rgb format(0 - 1)
989   - """
990   - image = self.image_gray
991   - new_image = Image.new("RGB", image.size)
992   - for x in range(image.size[0]):
993   - for y in range(image.size[1]):
994   - pixel_colour = [int(i*image.getpixel((x,y)))
995   - for i in colour]
996   - new_image.putpixel((x,y), tuple(pixel_colour))
997   -
998   - wx_image = wx.Image(new_image.size[0],
999   - new_image.size[1])
1000   - try:
1001   - wx_image.SetData(new_image.tostring())
1002   - except Exception:
1003   - wx_image.SetData(new_image.tobytes())
1004   -
1005   - return wx.Bitmap(wx_image.Scale(16, 16))
1006   -
1007 973 def EditSurfaceTransparency(self, surface_index, transparency):
1008 974 """
1009 975 Set actor transparency (oposite to opacity) according to given actor
... ... @@ -1023,11 +989,10 @@ class SurfacesListCtrlPanel(wx.ListCtrl):
1023 989 #-------------------------------------------------
1024 990 #-------------------------------------------------
1025 991  
1026   -class MeasuresListCtrlPanel(wx.ListCtrl):
1027   -
  992 +class MeasuresListCtrlPanel(InvListCtrl):
1028 993 def __init__(self, parent, ID=-1, pos=wx.DefaultPosition,
1029 994 size=wx.DefaultSize, style=wx.LC_REPORT | wx.LC_EDIT_LABELS):
1030   - wx.ListCtrl.__init__(self, parent, ID, pos, size, style=style)
  995 + super().__init__(parent, ID, pos, size, style=style)
1031 996 self._click_check = False
1032 997 self.__init_columns()
1033 998 self.__init_image_list()
... ... @@ -1051,31 +1016,6 @@ class MeasuresListCtrlPanel(wx.ListCtrl):
1051 1016 self.Bind(wx.EVT_LIST_END_LABEL_EDIT, self.OnEditLabel)
1052 1017 self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected_)
1053 1018 self.Bind(wx.EVT_KEY_UP, self.OnKeyEvent)
1054   - self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnItemActivated)
1055   - self.Bind(wx.EVT_LEFT_UP, self.OnClickItem)
1056   -
1057   - def OnClickItem(self, evt):
1058   - self._click_check = False
1059   - item_idx, flag = (self.HitTest(evt.GetPosition()))
1060   - if flag == wx.LIST_HITTEST_ONITEMICON:
1061   - self._click_check = True
1062   - item = self.GetItem(item_idx, 0)
1063   - flag = not bool(item.GetImage())
1064   - self.SetItemImage(item_idx, int(flag))
1065   - self.OnCheckItem(item_idx, flag)
1066   - evt.Skip()
1067   -
1068   - def OnItemActivated(self, evt):
1069   - if not self._click_check:
1070   - item = self.GetItem(evt.GetItem().GetId(), 1)
1071   - ctrl = self.EditLabel(item.GetId())
1072   - w, h = ctrl.GetClientSize()
1073   - w = self.GetColumnWidth(1)
1074   - ctrl.SetClientSize(w, h)
1075   - ctrl.SetValue(item.GetText())
1076   - ctrl.SelectAll()
1077   - evt.Skip()
1078   -
1079 1019  
1080 1020 def OnKeyEvent(self, event):
1081 1021 keycode = event.GetKeyCode()
... ... @@ -1289,27 +1229,6 @@ class MeasuresListCtrlPanel(wx.ListCtrl):
1289 1229 self.SetItemImage(index, 1)
1290 1230 self.Refresh()
1291 1231  
1292   - def CreateColourBitmap(self, colour):
1293   - """
1294   - Create a wx Image with a mask colour.
1295   - colour: colour in rgb format(0 - 1)
1296   - """
1297   - image = self.image_gray
1298   - new_image = Image.new("RGB", image.size)
1299   - for x in range(image.size[0]):
1300   - for y in range(image.size[1]):
1301   - pixel_colour = [int(i*image.getpixel((x,y)))
1302   - for i in colour]
1303   - new_image.putpixel((x,y), tuple(pixel_colour))
1304   -
1305   - wx_image = wx.Image(new_image.size[0],
1306   - new_image.size[1])
1307   - try:
1308   - wx_image.SetData(new_image.tostring())
1309   - except:
1310   - wx_image.SetData(new_image.tobytes())
1311   - return wx.Bitmap(wx_image.Scale(16, 16))
1312   -
1313 1232 def EditItemColour(self, measure_index, colour):
1314 1233 """
1315 1234 """
... ...