Commit 81552f9d11c371f19e909a65ed4ead6fa3bde228
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 | """ | ... | ... |