Commit eac24f4f8f25444c3f8036b7b53e54ebee8c29b2
Committed by
GitHub
1 parent
9eb75dca
Exists in
master
Remove WX deprecated code, improve gradient (#182)
* using calllater instead of futurecall * Using Append instead of AppendMenu in slice_menu * Using Append instead of AppendItem in slice_menu * Using Append instead of AppendItem in rest of source code * Using Append instead of AppendMenu in rest of source code * Using Bitmap instead of BitmapFromImage * GetVirtualSizeTuple -> GetVirtualSize * SetToolTipString -> SetToolTip * ImageFromStream -> Image * using self.bind to undo and redo tool * wx.EmptyBitmapRGBA to wx.Bitmap * EmptyImage -> Image * InsertStringItem -> InsertItem * SetStringItem -> SetItem * wx.StockCursor to wx.Cursor * GetSizeTuple -> GetSize * Less time in dicom loading from cmdline * Created an alternative class to SpinCtrl * Using InvSpinCtrl in task_slice * implementing float spinctrl * Added InvFloatSpinCtrl * Using InvSpinCtrl in task_surface * Using InvSpinCtrl in regiongrowing dialog * Using InvSpinCtrl in watershed config dialgo * Using InvSpinCtrl in contextawaresmoothing config dialog * Using InvSpinCtrl in fillholes auto config dialog * Using InvSpinCtrl in the resizeimage dialog * Using InvSpinCtrl in the bitmap spacing dialog * removed all wx.predialog * Using InvSpinCtrl gradient ctrl * align to the right by default * Added Spinbutton at inv_spinctrl * formatation * Using other way to calc invspinctrl size * better size of spin button * better size of spin button * improvements * better gradient code format * Improvements in gradient ctrl * Using gradientctrl instead of gradientslider in new mask * better invspinctrl size to mac * moved invspinctrl to widgets * better size to mac
Showing
22 changed files
with
726 additions
and
483 deletions
Show diff stats
app.py
| ... | ... | @@ -247,9 +247,9 @@ class Inv3SplashScreen(SplashScreen): |
| 247 | 247 | self.main = Frame(None) |
| 248 | 248 | self.control = Controller(self.main) |
| 249 | 249 | |
| 250 | - self.fc = wx.FutureCall(1, self.ShowMain) | |
| 250 | + self.fc = wx.CallLater(200, self.ShowMain) | |
| 251 | 251 | options, args = parse_comand_line() |
| 252 | - wx.FutureCall(1, use_cmd_optargs, options, args) | |
| 252 | + wx.CallLater(1, use_cmd_optargs, options, args) | |
| 253 | 253 | |
| 254 | 254 | # Check for updates |
| 255 | 255 | from threading import Thread | ... | ... |
invesalius/data/styles.py
| ... | ... | @@ -467,9 +467,9 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle): |
| 467 | 467 | else: |
| 468 | 468 | mx, my = self.viewer.interactor.GetEventPosition() |
| 469 | 469 | if self._verify_clicked_display(mx, my): |
| 470 | - self.viewer.interactor.SetCursor(wx.StockCursor(wx.CURSOR_HAND)) | |
| 470 | + self.viewer.interactor.SetCursor(wx.Cursor(wx.CURSOR_HAND)) | |
| 471 | 471 | else: |
| 472 | - self.viewer.interactor.SetCursor(wx.StockCursor(wx.CURSOR_DEFAULT)) | |
| 472 | + self.viewer.interactor.SetCursor(wx.Cursor(wx.CURSOR_DEFAULT)) | |
| 473 | 473 | |
| 474 | 474 | def OnLeaveMeasureInteractor(self, obj, evt): |
| 475 | 475 | if self.creating or self.selected: |
| ... | ... | @@ -922,7 +922,7 @@ class EditorInteractorStyle(DefaultInteractorStyle): |
| 922 | 922 | w_x, w_y, w_z = self.viewer.get_coordinate_cursor(x, y, self.picker) |
| 923 | 923 | self.viewer.slice_data.cursor.SetPosition((w_x, w_y, w_z)) |
| 924 | 924 | |
| 925 | - self.viewer.interactor.SetCursor(wx.StockCursor(wx.CURSOR_BLANK)) | |
| 925 | + self.viewer.interactor.SetCursor(wx.Cursor(wx.CURSOR_BLANK)) | |
| 926 | 926 | self.viewer.interactor.Render() |
| 927 | 927 | |
| 928 | 928 | def CleanUp(self): |
| ... | ... | @@ -931,7 +931,7 @@ class EditorInteractorStyle(DefaultInteractorStyle): |
| 931 | 931 | Publisher.unsubscribe(self.set_boperation, 'Set edition operation') |
| 932 | 932 | |
| 933 | 933 | self.viewer.slice_data.cursor.Show(0) |
| 934 | - self.viewer.interactor.SetCursor(wx.StockCursor(wx.CURSOR_DEFAULT)) | |
| 934 | + self.viewer.interactor.SetCursor(wx.Cursor(wx.CURSOR_DEFAULT)) | |
| 935 | 935 | self.viewer.interactor.Render() |
| 936 | 936 | |
| 937 | 937 | def set_bsize(self, size): |
| ... | ... | @@ -967,12 +967,12 @@ class EditorInteractorStyle(DefaultInteractorStyle): |
| 967 | 967 | if (self.viewer.slice_.buffer_slices[self.orientation].mask is None): |
| 968 | 968 | return |
| 969 | 969 | self.viewer.slice_data.cursor.Show() |
| 970 | - self.viewer.interactor.SetCursor(wx.StockCursor(wx.CURSOR_BLANK)) | |
| 970 | + self.viewer.interactor.SetCursor(wx.Cursor(wx.CURSOR_BLANK)) | |
| 971 | 971 | self.viewer.interactor.Render() |
| 972 | 972 | |
| 973 | 973 | def OnLeaveInteractor(self, obj, evt): |
| 974 | 974 | self.viewer.slice_data.cursor.Show(0) |
| 975 | - self.viewer.interactor.SetCursor(wx.StockCursor(wx.CURSOR_DEFAULT)) | |
| 975 | + self.viewer.interactor.SetCursor(wx.Cursor(wx.CURSOR_DEFAULT)) | |
| 976 | 976 | self.viewer.interactor.Render() |
| 977 | 977 | |
| 978 | 978 | def OnBrushClick(self, obj, evt): |
| ... | ... | @@ -1230,7 +1230,7 @@ class WaterShedInteractorStyle(DefaultInteractorStyle): |
| 1230 | 1230 | w_x, w_y, w_z = self.viewer.get_coordinate_cursor(x, y, self.picker) |
| 1231 | 1231 | self.viewer.slice_data.cursor.SetPosition((w_x, w_y, w_z)) |
| 1232 | 1232 | |
| 1233 | - self.viewer.interactor.SetCursor(wx.StockCursor(wx.CURSOR_BLANK)) | |
| 1233 | + self.viewer.interactor.SetCursor(wx.Cursor(wx.CURSOR_BLANK)) | |
| 1234 | 1234 | self.viewer.interactor.Render() |
| 1235 | 1235 | |
| 1236 | 1236 | def CleanUp(self): |
| ... | ... | @@ -1243,7 +1243,7 @@ class WaterShedInteractorStyle(DefaultInteractorStyle): |
| 1243 | 1243 | self.viewer.OnScrollBar() |
| 1244 | 1244 | |
| 1245 | 1245 | self.viewer.slice_data.cursor.Show(0) |
| 1246 | - self.viewer.interactor.SetCursor(wx.StockCursor(wx.CURSOR_DEFAULT)) | |
| 1246 | + self.viewer.interactor.SetCursor(wx.Cursor(wx.CURSOR_DEFAULT)) | |
| 1247 | 1247 | self.viewer.interactor.Render() |
| 1248 | 1248 | |
| 1249 | 1249 | def _create_mask(self): |
| ... | ... | @@ -1290,12 +1290,12 @@ class WaterShedInteractorStyle(DefaultInteractorStyle): |
| 1290 | 1290 | if (self.viewer.slice_.buffer_slices[self.orientation].mask is None): |
| 1291 | 1291 | return |
| 1292 | 1292 | self.viewer.slice_data.cursor.Show() |
| 1293 | - self.viewer.interactor.SetCursor(wx.StockCursor(wx.CURSOR_BLANK)) | |
| 1293 | + self.viewer.interactor.SetCursor(wx.Cursor(wx.CURSOR_BLANK)) | |
| 1294 | 1294 | self.viewer.interactor.Render() |
| 1295 | 1295 | |
| 1296 | 1296 | def OnLeaveInteractor(self, obj, evt): |
| 1297 | 1297 | self.viewer.slice_data.cursor.Show(0) |
| 1298 | - self.viewer.interactor.SetCursor(wx.StockCursor(wx.CURSOR_DEFAULT)) | |
| 1298 | + self.viewer.interactor.SetCursor(wx.Cursor(wx.CURSOR_DEFAULT)) | |
| 1299 | 1299 | self.viewer.interactor.Render() |
| 1300 | 1300 | |
| 1301 | 1301 | def WOnScrollBackward(self, obj, evt): |
| ... | ... | @@ -1757,10 +1757,10 @@ class ReorientImageInteractorStyle(DefaultInteractorStyle): |
| 1757 | 1757 | dist_center = ((mx - cx)**2 + (my - cy)**2)**0.5 |
| 1758 | 1758 | if dist_center <= 15: |
| 1759 | 1759 | self._over_center = True |
| 1760 | - cursor = wx.StockCursor(wx.CURSOR_SIZENESW) | |
| 1760 | + cursor = wx.Cursor(wx.CURSOR_SIZENESW) | |
| 1761 | 1761 | else: |
| 1762 | 1762 | self._over_center = False |
| 1763 | - cursor = wx.StockCursor(wx.CURSOR_DEFAULT) | |
| 1763 | + cursor = wx.Cursor(wx.CURSOR_DEFAULT) | |
| 1764 | 1764 | |
| 1765 | 1765 | self.viewer.interactor.SetCursor(cursor) |
| 1766 | 1766 | ... | ... |
invesalius/data/viewer_slice.py
| ... | ... | @@ -49,6 +49,7 @@ import invesalius.session as ses |
| 49 | 49 | import invesalius.data.converters as converters |
| 50 | 50 | import invesalius.data.measures as measures |
| 51 | 51 | |
| 52 | +from invesalius.gui.widgets.inv_spinctrl import InvSpinCtrl, InvFloatSpinCtrl | |
| 52 | 53 | from invesalius.gui.widgets.canvas_renderer import CanvasRendererCTX |
| 53 | 54 | |
| 54 | 55 | if sys.platform == 'win32': |
| ... | ... | @@ -73,25 +74,22 @@ ORIENTATIONS = { |
| 73 | 74 | class ContourMIPConfig(wx.Panel): |
| 74 | 75 | def __init__(self, prnt, orientation): |
| 75 | 76 | wx.Panel.__init__(self, prnt) |
| 76 | - self.mip_size_spin = wx.SpinCtrl(self, -1, min=1, max=240, | |
| 77 | - initial=const.PROJECTION_MIP_SIZE) | |
| 78 | - self.mip_size_spin.SetValue(const.PROJECTION_MIP_SIZE) | |
| 77 | + self.mip_size_spin = InvSpinCtrl(self, -1, value=const.PROJECTION_MIP_SIZE, min_value=1, max_value=240) | |
| 79 | 78 | self.mip_size_spin.SetToolTip(wx.ToolTip(_("Number of slices used to compound the visualization."))) |
| 80 | - w, h = self.mip_size_spin.GetTextExtent('M') | |
| 81 | - self.mip_size_spin.SetMinSize((5 * w + 10, -1)) | |
| 82 | - self.mip_size_spin.SetMaxSize((5 * w + 10, -1)) | |
| 79 | + self.mip_size_spin.CalcSizeFromTextSize('MMM') | |
| 83 | 80 | |
| 84 | - self.border_spin = FS.FloatSpin(self, -1, min_val=0, max_val=10, | |
| 81 | + self.border_spin = InvFloatSpinCtrl(self, -1, min_value=0, max_value=10, | |
| 85 | 82 | increment=0.1, |
| 86 | 83 | value=const.PROJECTION_BORDER_SIZE, |
| 87 | - digits=1, agwStyle=FS.FS_LEFT) | |
| 84 | + digits=1) | |
| 88 | 85 | self.border_spin.SetToolTip(wx.ToolTip(_("Controls the sharpness of the" |
| 89 | 86 | " contour. The greater the" |
| 90 | 87 | " value, the sharper the" |
| 91 | 88 | " contour."))) |
| 92 | - w, h = self.border_spin.GetTextExtent('M') | |
| 93 | - self.border_spin.SetMinSize((5 * w + 10, -1)) | |
| 94 | - self.border_spin.SetMaxSize((5 * w + 10, -1)) | |
| 89 | + self.border_spin.CalcSizeFromTextSize() | |
| 90 | + # w, h = self.border_spin.GetTextExtent('M') | |
| 91 | + # self.border_spin.SetMinSize((5 * w + 10, -1)) | |
| 92 | + # self.border_spin.SetMaxSize((5 * w + 10, -1)) | |
| 95 | 93 | |
| 96 | 94 | self.inverted = wx.CheckBox(self, -1, _("Inverted order")) |
| 97 | 95 | self.inverted.SetToolTip(wx.ToolTip(_("If checked, the slices are" |
| ... | ... | @@ -105,7 +103,7 @@ class ContourMIPConfig(wx.Panel): |
| 105 | 103 | |
| 106 | 104 | sizer = wx.BoxSizer(wx.HORIZONTAL) |
| 107 | 105 | sizer.Add(txt_mip_size, 0, wx.EXPAND | wx.ALL, 2) |
| 108 | - sizer.Add(self.mip_size_spin, 0, wx.EXPAND) | |
| 106 | + sizer.Add(self.mip_size_spin, 0) | |
| 109 | 107 | try: |
| 110 | 108 | sizer.Add(10, 0) |
| 111 | 109 | except TypeError: |
| ... | ... | @@ -883,19 +881,19 @@ class Viewer(wx.Panel): |
| 883 | 881 | self.Refresh() |
| 884 | 882 | |
| 885 | 883 | def SetDefaultCursor(self): |
| 886 | - self.interactor.SetCursor(wx.StockCursor(wx.CURSOR_DEFAULT)) | |
| 884 | + self.interactor.SetCursor(wx.Cursor(wx.CURSOR_DEFAULT)) | |
| 887 | 885 | |
| 888 | 886 | def SetSizeNSCursor(self): |
| 889 | - self.interactor.SetCursor(wx.StockCursor(wx.CURSOR_SIZENS)) | |
| 887 | + self.interactor.SetCursor(wx.Cursor(wx.CURSOR_SIZENS)) | |
| 890 | 888 | |
| 891 | 889 | def SetSizeWECursor(self): |
| 892 | - self.interactor.SetCursor(wx.StockCursor(wx.CURSOR_SIZEWE)) | |
| 890 | + self.interactor.SetCursor(wx.Cursor(wx.CURSOR_SIZEWE)) | |
| 893 | 891 | |
| 894 | 892 | def SetSizeNWSECursor(self): |
| 895 | 893 | if sys.platform.startswith('linux'): |
| 896 | - self.interactor.SetCursor(wx.StockCursor(wx.CURSOR_SIZENWSE)) | |
| 894 | + self.interactor.SetCursor(wx.Cursor(wx.CURSOR_SIZENWSE)) | |
| 897 | 895 | else: |
| 898 | - self.interactor.SetCursor(wx.StockCursor(wx.CURSOR_SIZING)) | |
| 896 | + self.interactor.SetCursor(wx.Cursor(wx.CURSOR_SIZING)) | |
| 899 | 897 | |
| 900 | 898 | def SetFocus(self): |
| 901 | 899 | Publisher.sendMessage('Set viewer orientation focus', | ... | ... |
invesalius/gui/bitmap_preview_panel.py
invesalius/gui/data_notebook.py
| ... | ... | @@ -168,20 +168,20 @@ class MeasureButtonControlPanel(wx.Panel): |
| 168 | 168 | BMP_NEW, |
| 169 | 169 | style=button_style, |
| 170 | 170 | size = wx.Size(24, 20)) |
| 171 | - button_new.SetToolTipString(_("Create a new measure")) | |
| 171 | + button_new.SetToolTip(_("Create a new measure")) | |
| 172 | 172 | self.button_new = button_new |
| 173 | 173 | |
| 174 | 174 | button_remove = pbtn.PlateButton(self, BTN_REMOVE, "", |
| 175 | 175 | BMP_REMOVE, |
| 176 | 176 | style=button_style, |
| 177 | 177 | size = wx.Size(24, 20)) |
| 178 | - button_remove.SetToolTipString(_("Remove measure")) | |
| 178 | + button_remove.SetToolTip(_("Remove measure")) | |
| 179 | 179 | |
| 180 | 180 | button_duplicate = pbtn.PlateButton(self, BTN_DUPLICATE, "", |
| 181 | 181 | BMP_DUPLICATE, |
| 182 | 182 | style=button_style, |
| 183 | 183 | size = wx.Size(24, 20)) |
| 184 | - button_duplicate.SetToolTipString(_("Duplicate measure")) | |
| 184 | + button_duplicate.SetToolTip(_("Duplicate measure")) | |
| 185 | 185 | button_duplicate.Disable() |
| 186 | 186 | |
| 187 | 187 | # Add all controls to gui |
| ... | ... | @@ -195,10 +195,10 @@ class MeasureButtonControlPanel(wx.Panel): |
| 195 | 195 | menu = wx.Menu() |
| 196 | 196 | item = wx.MenuItem(menu, const.MEASURE_LINEAR, |
| 197 | 197 | _("Measure distance")) |
| 198 | - menu.AppendItem(item) | |
| 198 | + menu.Append(item) | |
| 199 | 199 | item = wx.MenuItem(menu, const.MEASURE_ANGULAR, |
| 200 | 200 | _("Measure angle")) |
| 201 | - menu.AppendItem(item) | |
| 201 | + menu.Append(item) | |
| 202 | 202 | menu.Bind(wx.EVT_MENU, self.OnMenu) |
| 203 | 203 | self.menu = menu |
| 204 | 204 | |
| ... | ... | @@ -286,19 +286,19 @@ class ButtonControlPanel(wx.Panel): |
| 286 | 286 | BMP_NEW, |
| 287 | 287 | style=button_style, |
| 288 | 288 | size = wx.Size(24, 20)) |
| 289 | - button_new.SetToolTipString(_("Create a new mask")) | |
| 289 | + button_new.SetToolTip(_("Create a new mask")) | |
| 290 | 290 | |
| 291 | 291 | button_remove = pbtn.PlateButton(self, BTN_REMOVE, "", |
| 292 | 292 | BMP_REMOVE, |
| 293 | 293 | style=button_style, |
| 294 | 294 | size = wx.Size(24, 20)) |
| 295 | - button_remove.SetToolTipString(_("Remove mask")) | |
| 295 | + button_remove.SetToolTip(_("Remove mask")) | |
| 296 | 296 | |
| 297 | 297 | button_duplicate = pbtn.PlateButton(self, BTN_DUPLICATE, "", |
| 298 | 298 | BMP_DUPLICATE, |
| 299 | 299 | style=button_style, |
| 300 | 300 | size = wx.Size(24, 20)) |
| 301 | - button_duplicate.SetToolTipString(_("Duplicate mask")) | |
| 301 | + button_duplicate.SetToolTip(_("Duplicate mask")) | |
| 302 | 302 | |
| 303 | 303 | # Add all controls to gui |
| 304 | 304 | sizer = wx.BoxSizer(wx.HORIZONTAL) |
| ... | ... | @@ -474,13 +474,13 @@ class MasksListCtrlPanel(wx.ListCtrl, listmix.TextEditMixin, listmix.CheckListCt |
| 474 | 474 | self.imagelist = wx.ImageList(16, 16) |
| 475 | 475 | |
| 476 | 476 | image = wx.Image(os.path.join(const.ICON_DIR, "object_invisible.jpg")) |
| 477 | - bitmap = wx.BitmapFromImage(image.Scale(16, 16)) | |
| 477 | + bitmap = wx.Bitmap(image.Scale(16, 16)) | |
| 478 | 478 | bitmap.SetWidth(16) |
| 479 | 479 | bitmap.SetHeight(16) |
| 480 | 480 | img_null = self.imagelist.Add(bitmap) |
| 481 | 481 | |
| 482 | 482 | image = wx.Image(os.path.join(const.ICON_DIR, "object_visible.jpg")) |
| 483 | - bitmap = wx.BitmapFromImage(image.Scale(16, 16)) | |
| 483 | + bitmap = wx.Bitmap(image.Scale(16, 16)) | |
| 484 | 484 | bitmap.SetWidth(16) |
| 485 | 485 | bitmap.SetHeight(16) |
| 486 | 486 | img_check = self.imagelist.Add(bitmap) |
| ... | ... | @@ -526,20 +526,20 @@ class MasksListCtrlPanel(wx.ListCtrl, listmix.TextEditMixin, listmix.CheckListCt |
| 526 | 526 | for i in colour] |
| 527 | 527 | new_image.putpixel((x,y), tuple(pixel_colour)) |
| 528 | 528 | |
| 529 | - wx_image = wx.EmptyImage(new_image.size[0], | |
| 530 | - new_image.size[1]) | |
| 529 | + wx_image = wx.Image(new_image.size[0], | |
| 530 | + new_image.size[1]) | |
| 531 | 531 | try: |
| 532 | 532 | wx_image.SetData(new_image.tostring()) |
| 533 | 533 | except Exception: |
| 534 | 534 | wx_image.SetData(new_image.tobytes()) |
| 535 | - return wx.BitmapFromImage(wx_image.Scale(16, 16)) | |
| 535 | + return wx.Bitmap(wx_image.Scale(16, 16)) | |
| 536 | 536 | |
| 537 | 537 | def InsertNewItem(self, index=0, label=_("Mask"), threshold="(1000, 4500)", |
| 538 | 538 | colour=None): |
| 539 | - self.InsertStringItem(index, "") | |
| 540 | - self.SetStringItem(index, 1, label, | |
| 539 | + self.InsertItem(index, "") | |
| 540 | + self.SetItem(index, 1, label, | |
| 541 | 541 | imageId=self.mask_list_index[index]) |
| 542 | - self.SetStringItem(index, 2, threshold) | |
| 542 | + self.SetItem(index, 2, threshold) | |
| 543 | 543 | # self.SetItemImage(index, 1) |
| 544 | 544 | # for key in self.mask_list_index.keys(): |
| 545 | 545 | # if key != index: |
| ... | ... | @@ -553,7 +553,7 @@ class MasksListCtrlPanel(wx.ListCtrl, listmix.TextEditMixin, listmix.CheckListCt |
| 553 | 553 | self.InsertNewItem(mask.index, mask.name, str(mask.threshold_range)) |
| 554 | 554 | |
| 555 | 555 | def EditMaskThreshold(self, index, threshold_range): |
| 556 | - self.SetStringItem(index, 2, str(threshold_range)) | |
| 556 | + self.SetItem(index, 2, str(threshold_range)) | |
| 557 | 557 | |
| 558 | 558 | def EditMaskColour(self, index, colour): |
| 559 | 559 | image = self.CreateColourBitmap(colour) |
| ... | ... | @@ -631,25 +631,25 @@ class SurfaceButtonControlPanel(wx.Panel): |
| 631 | 631 | BMP_NEW, |
| 632 | 632 | style=button_style, |
| 633 | 633 | size = wx.Size(24, 20)) |
| 634 | - button_new.SetToolTipString(_("Create a new surface")) | |
| 634 | + button_new.SetToolTip(_("Create a new surface")) | |
| 635 | 635 | |
| 636 | 636 | button_remove = pbtn.PlateButton(self, BTN_REMOVE, "", |
| 637 | 637 | BMP_REMOVE, |
| 638 | 638 | style=button_style, |
| 639 | 639 | size = wx.Size(24, 20)) |
| 640 | - button_remove.SetToolTipString(_("Remove surface")) | |
| 640 | + button_remove.SetToolTip(_("Remove surface")) | |
| 641 | 641 | |
| 642 | 642 | button_duplicate = pbtn.PlateButton(self, BTN_DUPLICATE, "", |
| 643 | 643 | BMP_DUPLICATE, |
| 644 | 644 | style=button_style, |
| 645 | 645 | size = wx.Size(24, 20)) |
| 646 | - button_duplicate.SetToolTipString(_("Duplicate surface")) | |
| 646 | + button_duplicate.SetToolTip(_("Duplicate surface")) | |
| 647 | 647 | |
| 648 | 648 | button_open = pbtn.PlateButton(self, BTN_OPEN, "", |
| 649 | 649 | BMP_OPEN, |
| 650 | 650 | style=button_style, |
| 651 | 651 | size = wx.Size(24, 20)) |
| 652 | - button_open.SetToolTipString(_("Import a surface file into InVesalius")) | |
| 652 | + button_open.SetToolTip(_("Import a surface file into InVesalius")) | |
| 653 | 653 | |
| 654 | 654 | # Add all controls to gui |
| 655 | 655 | sizer = wx.BoxSizer(wx.HORIZONTAL) |
| ... | ... | @@ -840,13 +840,13 @@ class SurfacesListCtrlPanel(wx.ListCtrl, listmix.TextEditMixin, listmix.CheckLis |
| 840 | 840 | self.imagelist = wx.ImageList(16, 16) |
| 841 | 841 | |
| 842 | 842 | image = wx.Image(os.path.join(const.ICON_DIR, "object_invisible.jpg")) |
| 843 | - bitmap = wx.BitmapFromImage(image.Scale(16, 16)) | |
| 843 | + bitmap = wx.Bitmap(image.Scale(16, 16)) | |
| 844 | 844 | bitmap.SetWidth(16) |
| 845 | 845 | bitmap.SetHeight(16) |
| 846 | 846 | img_null = self.imagelist.Add(bitmap) |
| 847 | 847 | |
| 848 | 848 | image = wx.Image(os.path.join(const.ICON_DIR, "object_visible.jpg")) |
| 849 | - bitmap = wx.BitmapFromImage(image.Scale(16, 16)) | |
| 849 | + bitmap = wx.Bitmap(image.Scale(16, 16)) | |
| 850 | 850 | bitmap.SetWidth(16) |
| 851 | 851 | bitmap.SetHeight(16) |
| 852 | 852 | img_check = self.imagelist.Add(bitmap) |
| ... | ... | @@ -923,23 +923,23 @@ class SurfacesListCtrlPanel(wx.ListCtrl, listmix.TextEditMixin, listmix.CheckLis |
| 923 | 923 | |
| 924 | 924 | def InsertNewItem(self, index=0, label="Surface 1", volume="0 mm3", |
| 925 | 925 | area="0 mm2", transparency="0%%", colour=None): |
| 926 | - self.InsertStringItem(index, "") | |
| 927 | - self.SetStringItem(index, 1, label, | |
| 926 | + self.InsertItem(index, "") | |
| 927 | + self.SetItem(index, 1, label, | |
| 928 | 928 | imageId = self.surface_list_index[index]) |
| 929 | - self.SetStringItem(index, 2, volume) | |
| 930 | - self.SetStringItem(index, 3, area) | |
| 931 | - self.SetStringItem(index, 4, transparency) | |
| 929 | + self.SetItem(index, 2, volume) | |
| 930 | + self.SetItem(index, 3, area) | |
| 931 | + self.SetItem(index, 4, transparency) | |
| 932 | 932 | self.SetItemImage(index, 1) |
| 933 | 933 | |
| 934 | 934 | def UpdateItemInfo(self, index=0, label="Surface 1", volume="0 mm3", |
| 935 | 935 | area="0 mm2", transparency="0%%", colour=None): |
| 936 | 936 | print("UpdateItemInfo", index) |
| 937 | 937 | # TODO: Retornar esse codigo |
| 938 | - self.SetStringItem(index, 1, label, | |
| 938 | + self.SetItem(index, 1, label, | |
| 939 | 939 | imageId = self.surface_list_index[index]) |
| 940 | - self.SetStringItem(index, 2, volume) | |
| 941 | - self.SetStringItem(index, 3, area) | |
| 942 | - self.SetStringItem(index, 4, transparency) | |
| 940 | + self.SetItem(index, 2, volume) | |
| 941 | + self.SetItem(index, 3, area) | |
| 942 | + self.SetItem(index, 4, transparency) | |
| 943 | 943 | self.SetItemImage(index, 1) |
| 944 | 944 | |
| 945 | 945 | def CreateColourBitmap(self, colour): |
| ... | ... | @@ -955,21 +955,21 @@ class SurfacesListCtrlPanel(wx.ListCtrl, listmix.TextEditMixin, listmix.CheckLis |
| 955 | 955 | for i in colour] |
| 956 | 956 | new_image.putpixel((x,y), tuple(pixel_colour)) |
| 957 | 957 | |
| 958 | - wx_image = wx.EmptyImage(new_image.size[0], | |
| 959 | - new_image.size[1]) | |
| 958 | + wx_image = wx.Image(new_image.size[0], | |
| 959 | + new_image.size[1]) | |
| 960 | 960 | try: |
| 961 | 961 | wx_image.SetData(new_image.tostring()) |
| 962 | 962 | except Exception: |
| 963 | 963 | wx_image.SetData(new_image.tobytes()) |
| 964 | 964 | |
| 965 | - return wx.BitmapFromImage(wx_image.Scale(16, 16)) | |
| 965 | + return wx.Bitmap(wx_image.Scale(16, 16)) | |
| 966 | 966 | |
| 967 | 967 | def EditSurfaceTransparency(self, surface_index, transparency): |
| 968 | 968 | """ |
| 969 | 969 | Set actor transparency (oposite to opacity) according to given actor |
| 970 | 970 | index and value. |
| 971 | 971 | """ |
| 972 | - self.SetStringItem(surface_index, 4, "%d%%"%(int(transparency*100))) | |
| 972 | + self.SetItem(surface_index, 4, "%d%%"%(int(transparency*100))) | |
| 973 | 973 | |
| 974 | 974 | def EditSurfaceColour(self, surface_index, colour): |
| 975 | 975 | """ |
| ... | ... | @@ -1115,13 +1115,13 @@ class MeasuresListCtrlPanel(wx.ListCtrl, listmix.TextEditMixin, listmix.CheckLis |
| 1115 | 1115 | self.imagelist = wx.ImageList(16, 16) |
| 1116 | 1116 | |
| 1117 | 1117 | image = wx.Image(os.path.join(const.ICON_DIR, "object_invisible.jpg")) |
| 1118 | - bitmap = wx.BitmapFromImage(image.Scale(16, 16)) | |
| 1118 | + bitmap = wx.Bitmap(image.Scale(16, 16)) | |
| 1119 | 1119 | bitmap.SetWidth(16) |
| 1120 | 1120 | bitmap.SetHeight(16) |
| 1121 | 1121 | img_null = self.imagelist.Add(bitmap) |
| 1122 | 1122 | |
| 1123 | 1123 | image = wx.Image(os.path.join(const.ICON_DIR, "object_visible.jpg")) |
| 1124 | - bitmap = wx.BitmapFromImage(image.Scale(16, 16)) | |
| 1124 | + bitmap = wx.Bitmap(image.Scale(16, 16)) | |
| 1125 | 1125 | bitmap.SetWidth(16) |
| 1126 | 1126 | bitmap.SetHeight(16) |
| 1127 | 1127 | img_check = self.imagelist.Add(bitmap) |
| ... | ... | @@ -1217,22 +1217,22 @@ class MeasuresListCtrlPanel(wx.ListCtrl, listmix.TextEditMixin, listmix.CheckLis |
| 1217 | 1217 | |
| 1218 | 1218 | def InsertNewItem(self, index=0, label="Measurement 1", colour=None, |
| 1219 | 1219 | location="SURFACE", type_="LINEAR", value="0 mm"): |
| 1220 | - self.InsertStringItem(index, "") | |
| 1221 | - self.SetStringItem(index, 1, label, | |
| 1220 | + self.InsertItem(index, "") | |
| 1221 | + self.SetItem(index, 1, label, | |
| 1222 | 1222 | imageId = self._list_index[index]) |
| 1223 | - self.SetStringItem(index, 2, location) | |
| 1224 | - self.SetStringItem(index, 3, type_) | |
| 1225 | - self.SetStringItem(index, 4, value) | |
| 1223 | + self.SetItem(index, 2, location) | |
| 1224 | + self.SetItem(index, 3, type_) | |
| 1225 | + self.SetItem(index, 4, value) | |
| 1226 | 1226 | self.SetItemImage(index, 1) |
| 1227 | 1227 | self.Refresh() |
| 1228 | 1228 | |
| 1229 | 1229 | def UpdateItemInfo(self, index=0, label="Measurement 1", colour=None, |
| 1230 | 1230 | location="SURFACE", type_="LINEAR", value="0 mm"): |
| 1231 | - self.SetStringItem(index, 1, label, | |
| 1231 | + self.SetItem(index, 1, label, | |
| 1232 | 1232 | imageId = self._list_index[index]) |
| 1233 | - self.SetStringItem(index, 2, location) | |
| 1234 | - self.SetStringItem(index, 3, type_) | |
| 1235 | - self.SetStringItem(index, 4, value) | |
| 1233 | + self.SetItem(index, 2, location) | |
| 1234 | + self.SetItem(index, 3, type_) | |
| 1235 | + self.SetItem(index, 4, value) | |
| 1236 | 1236 | self.SetItemImage(index, 1) |
| 1237 | 1237 | self.Refresh() |
| 1238 | 1238 | |
| ... | ... | @@ -1249,13 +1249,13 @@ class MeasuresListCtrlPanel(wx.ListCtrl, listmix.TextEditMixin, listmix.CheckLis |
| 1249 | 1249 | for i in colour] |
| 1250 | 1250 | new_image.putpixel((x,y), tuple(pixel_colour)) |
| 1251 | 1251 | |
| 1252 | - wx_image = wx.EmptyImage(new_image.size[0], | |
| 1253 | - new_image.size[1]) | |
| 1252 | + wx_image = wx.Image(new_image.size[0], | |
| 1253 | + new_image.size[1]) | |
| 1254 | 1254 | try: |
| 1255 | 1255 | wx_image.SetData(new_image.tostring()) |
| 1256 | 1256 | except: |
| 1257 | 1257 | wx_image.SetData(new_image.tobytes()) |
| 1258 | - return wx.BitmapFromImage(wx_image.Scale(16, 16)) | |
| 1258 | + return wx.Bitmap(wx_image.Scale(16, 16)) | |
| 1259 | 1259 | |
| 1260 | 1260 | def EditItemColour(self, measure_index, colour): |
| 1261 | 1261 | """ |
| ... | ... | @@ -1310,19 +1310,19 @@ class AnnotationsListCtrlPanel(wx.ListCtrl, listmix.TextEditMixin, listmix.Check |
| 1310 | 1310 | self.imagelist = wx.ImageList(16, 16) |
| 1311 | 1311 | |
| 1312 | 1312 | image = wx.Image(os.path.join(const.ICON_DIR, "object_visible.jpg")) |
| 1313 | - bitmap = wx.BitmapFromImage(image.Scale(16, 16)) | |
| 1313 | + bitmap = wx.Bitmap(image.Scale(16, 16)) | |
| 1314 | 1314 | bitmap.SetWidth(16) |
| 1315 | 1315 | bitmap.SetHeight(16) |
| 1316 | 1316 | img_check = self.imagelist.Add(bitmap) |
| 1317 | 1317 | |
| 1318 | 1318 | image = wx.Image(os.path.join(const.ICON_DIR, "object_invisible.jpg")) |
| 1319 | - bitmap = wx.BitmapFromImage(image.Scale(16, 16)) | |
| 1319 | + bitmap = wx.Bitmap(image.Scale(16, 16)) | |
| 1320 | 1320 | bitmap.SetWidth(16) |
| 1321 | 1321 | bitmap.SetHeight(16) |
| 1322 | 1322 | img_null = self.imagelist.Add(bitmap) |
| 1323 | 1323 | |
| 1324 | 1324 | image = wx.Image(os.path.join(const.ICON_DIR, "object_colour.jpg")) |
| 1325 | - bitmap = wx.BitmapFromImage(image.Scale(16, 16)) | |
| 1325 | + bitmap = wx.Bitmap(image.Scale(16, 16)) | |
| 1326 | 1326 | bitmap.SetWidth(16) |
| 1327 | 1327 | bitmap.SetHeight(16) |
| 1328 | 1328 | self.img_colour = self.imagelist.Add(bitmap) |
| ... | ... | @@ -1342,10 +1342,10 @@ class AnnotationsListCtrlPanel(wx.ListCtrl, listmix.TextEditMixin, listmix.Check |
| 1342 | 1342 | |
| 1343 | 1343 | def InsertNewItem(self, index=0, name="Axial 1", type_="2d", |
| 1344 | 1344 | value="bla", colour=None): |
| 1345 | - self.InsertStringItem(index, "") | |
| 1346 | - self.SetStringItem(index, 1, name, imageId = self.img_colour) | |
| 1347 | - self.SetStringItem(index, 2, type_) | |
| 1348 | - self.SetStringItem(index, 3, value) | |
| 1345 | + self.InsertItem(index, "") | |
| 1346 | + self.SetItem(index, 1, name, imageId = self.img_colour) | |
| 1347 | + self.SetItem(index, 2, type_) | |
| 1348 | + self.SetItem(index, 3, value) | |
| 1349 | 1349 | |
| 1350 | 1350 | def Populate(self): |
| 1351 | 1351 | dict = ((0, "Axial 1", "2D", "blalbalblabllablalbla"), | ... | ... |
invesalius/gui/default_tasks.py
| ... | ... | @@ -58,12 +58,12 @@ zzW\xcff&\xb8,\x89\xa8@Q\xd6\xaaf\xdfRm,\xee\xb1BDxr#\xae\xf5|\xddo\xd6\xe2H\ |
| 58 | 58 | \x00\x00\x00IEND\xaeB`\x82' |
| 59 | 59 | |
| 60 | 60 | def GetCollapsedIconBitmap(): |
| 61 | - return wx.BitmapFromImage(GetCollapsedIconImage()) | |
| 61 | + return wx.Bitmap(GetCollapsedIconImage()) | |
| 62 | 62 | |
| 63 | 63 | def GetCollapsedIconImage(): |
| 64 | 64 | from io import BytesIO |
| 65 | 65 | stream = BytesIO(GetCollapsedIconData()) |
| 66 | - return wx.ImageFromStream(stream) | |
| 66 | + return wx.Image(stream) | |
| 67 | 67 | |
| 68 | 68 | def GetExpandedIconData(): |
| 69 | 69 | return \ |
| ... | ... | @@ -89,12 +89,12 @@ b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\ |
| 89 | 89 | `\x82' |
| 90 | 90 | |
| 91 | 91 | def GetExpandedIconBitmap(): |
| 92 | - return wx.BitmapFromImage(GetExpandedIconImage()) | |
| 92 | + return wx.Bitmap(GetExpandedIconImage()) | |
| 93 | 93 | |
| 94 | 94 | def GetExpandedIconImage(): |
| 95 | 95 | from io import BytesIO |
| 96 | 96 | stream = BytesIO(GetExpandedIconData()) |
| 97 | - return wx.ImageFromStream(stream) | |
| 97 | + return wx.Image(stream) | |
| 98 | 98 | |
| 99 | 99 | |
| 100 | 100 | # Main panel | ... | ... |
invesalius/gui/default_viewers.py
| ... | ... | @@ -506,7 +506,7 @@ class VolumeToolPanel(wx.Panel): |
| 506 | 506 | for name in const.RAYCASTING_TYPES: |
| 507 | 507 | id = wx.NewId() |
| 508 | 508 | item = wx.MenuItem(menu, id, name, kind=wx.ITEM_RADIO) |
| 509 | - menu.AppendItem(item) | |
| 509 | + menu.Append(item) | |
| 510 | 510 | if name == const.RAYCASTING_OFF_LABEL: |
| 511 | 511 | self.off_item = item |
| 512 | 512 | item.Check(1) |
| ... | ... | @@ -522,12 +522,12 @@ class VolumeToolPanel(wx.Panel): |
| 522 | 522 | self.id_cutplane = id |
| 523 | 523 | |
| 524 | 524 | item = wx.MenuItem(submenu, id, name, kind=wx.ITEM_CHECK) |
| 525 | - submenu.AppendItem(item) | |
| 525 | + submenu.Append(item) | |
| 526 | 526 | ID_TO_TOOL[id] = name |
| 527 | 527 | ID_TO_TOOL_ITEM[id] = item |
| 528 | 528 | TOOL_STATE[id] = False |
| 529 | 529 | self.submenu_raycasting_tools = submenu |
| 530 | - menu.AppendMenu(RAYCASTING_TOOLS, _("Tools"), submenu) | |
| 530 | + menu.Append(RAYCASTING_TOOLS, _("Tools"), submenu) | |
| 531 | 531 | menu.Enable(RAYCASTING_TOOLS, 0) |
| 532 | 532 | |
| 533 | 533 | self.menu_raycasting = menu |
| ... | ... | @@ -544,7 +544,7 @@ class VolumeToolPanel(wx.Panel): |
| 544 | 544 | bmp = wx.Bitmap(ID_TO_BMP[id][1], wx.BITMAP_TYPE_PNG) |
| 545 | 545 | item = wx.MenuItem(menu, id, ID_TO_BMP[id][0]) |
| 546 | 546 | item.SetBitmap(bmp) |
| 547 | - menu.AppendItem(item) | |
| 547 | + menu.Append(item) | |
| 548 | 548 | menu.Bind(wx.EVT_MENU, self.OnMenuView) |
| 549 | 549 | self.menu_view = menu |
| 550 | 550 | |
| ... | ... | @@ -558,7 +558,7 @@ class VolumeToolPanel(wx.Panel): |
| 558 | 558 | item = wx.MenuItem(slice_plane_menu, new_id, value, |
| 559 | 559 | kind = wx.ITEM_CHECK) |
| 560 | 560 | ID_TO_ITEMSLICEMENU[new_id] = item |
| 561 | - slice_plane_menu.AppendItem(item) | |
| 561 | + slice_plane_menu.Append(item) | |
| 562 | 562 | |
| 563 | 563 | slice_plane_menu.Bind(wx.EVT_MENU, self.OnMenuPlaneSlice) |
| 564 | 564 | |
| ... | ... | @@ -577,7 +577,7 @@ class VolumeToolPanel(wx.Panel): |
| 577 | 577 | |
| 578 | 578 | ID_TO_ITEM_3DSTEREO[new_id] = item |
| 579 | 579 | ID_TO_STEREO_NAME[new_id] = value |
| 580 | - stereo_menu.AppendItem(item) | |
| 580 | + stereo_menu.Append(item) | |
| 581 | 581 | |
| 582 | 582 | stereo_menu.Bind(wx.EVT_MENU, self.OnMenuStereo) |
| 583 | 583 | ... | ... |
invesalius/gui/dialogs.py
| ... | ... | @@ -48,6 +48,7 @@ from wx.lib.agw import floatspin |
| 48 | 48 | from wx.lib.wordwrap import wordwrap |
| 49 | 49 | from wx.lib.pubsub import pub as Publisher |
| 50 | 50 | |
| 51 | + | |
| 51 | 52 | try: |
| 52 | 53 | from wx.adv import AboutDialogInfo, AboutBox |
| 53 | 54 | except ImportError: |
| ... | ... | @@ -58,6 +59,7 @@ import invesalius.data.coordinates as dco |
| 58 | 59 | import invesalius.gui.widgets.gradient as grad |
| 59 | 60 | import invesalius.session as ses |
| 60 | 61 | import invesalius.utils as utils |
| 62 | +from invesalius.gui.widgets.inv_spinctrl import InvSpinCtrl, InvFloatSpinCtrl | |
| 61 | 63 | from invesalius.gui.widgets import clut_imagedata |
| 62 | 64 | from invesalius.gui.widgets.clut_imagedata import CLUTImageDataWidget, EVT_CLUT_NODE_CHANGED |
| 63 | 65 | import numpy as np |
| ... | ... | @@ -78,16 +80,9 @@ EVT_MASK_SET = wx.PyEventBinder(myEVT_MASK_SET, 1) |
| 78 | 80 | |
| 79 | 81 | class NumberDialog(wx.Dialog): |
| 80 | 82 | def __init__(self, message, value=0): |
| 81 | - try: | |
| 82 | - pre = wx.PreDialog() | |
| 83 | - pre.Create(None, -1, "InVesalius 3", size=wx.DefaultSize, | |
| 84 | - pos=wx.DefaultPosition, | |
| 85 | - style=wx.DEFAULT_DIALOG_STYLE) | |
| 86 | - self.PostCreate(pre) | |
| 87 | - except AttributeError: | |
| 88 | - wx.Dialog.__init__(self, None, -1, "InVesalius 3", size=wx.DefaultSize, | |
| 89 | - pos=wx.DefaultPosition, | |
| 90 | - style=wx.DEFAULT_DIALOG_STYLE) | |
| 83 | + wx.Dialog.__init__(self, None, -1, "InVesalius 3", size=wx.DefaultSize, | |
| 84 | + pos=wx.DefaultPosition, | |
| 85 | + style=wx.DEFAULT_DIALOG_STYLE) | |
| 91 | 86 | |
| 92 | 87 | # Static text which contains message to user |
| 93 | 88 | label = wx.StaticText(self, -1, message) |
| ... | ... | @@ -133,16 +128,9 @@ class NumberDialog(wx.Dialog): |
| 133 | 128 | class ResizeImageDialog(wx.Dialog): |
| 134 | 129 | |
| 135 | 130 | def __init__(self):#, message, value=0): |
| 136 | - try: | |
| 137 | - pre = self.pre = wx.PreDialog() | |
| 138 | - pre.Create(None, -1, "InVesalius 3", size=wx.DefaultSize, | |
| 139 | - pos=wx.DefaultPosition, | |
| 140 | - style=wx.DEFAULT_DIALOG_STYLE) | |
| 141 | - self.PostCreate(pre) | |
| 142 | - except AttributeError: | |
| 143 | - wx.Dialog.__init__(self, None, -1, "InVesalius 3", size=wx.DefaultSize, | |
| 144 | - pos=wx.DefaultPosition, | |
| 145 | - style=wx.DEFAULT_DIALOG_STYLE) | |
| 131 | + wx.Dialog.__init__(self, None, -1, "InVesalius 3", size=wx.DefaultSize, | |
| 132 | + pos=wx.DefaultPosition, | |
| 133 | + style=wx.DEFAULT_DIALOG_STYLE) | |
| 146 | 134 | |
| 147 | 135 | lbl_message = wx.StaticText(self, -1, _("InVesalius is running on a 32-bit operating system or has insufficient memory. \nIf you want to work with 3D surfaces or volume rendering, \nit is recommended to reduce the medical images resolution.")) |
| 148 | 136 | icon = wx.ArtProvider.GetBitmap(wx.ART_WARNING, wx.ART_MESSAGE_BOX, (32,32)) |
| ... | ... | @@ -160,8 +148,7 @@ class ResizeImageDialog(wx.Dialog): |
| 160 | 148 | |
| 161 | 149 | lbl_message_percent = wx.StaticText(self, -1,_("Percentage of original resolution")) |
| 162 | 150 | |
| 163 | - num_ctrl_percent = wx.SpinCtrl(self, -1) | |
| 164 | - num_ctrl_percent.SetRange(20,100) | |
| 151 | + num_ctrl_percent = InvSpinCtrl(self, -1, value=100, min_value=20, max_value=100) | |
| 165 | 152 | self.num_ctrl_porcent = num_ctrl_percent |
| 166 | 153 | |
| 167 | 154 | sizer_percent = wx.BoxSizer(wx.HORIZONTAL) |
| ... | ... | @@ -675,14 +662,8 @@ def ShowLoadRegistrationDialog(): |
| 675 | 662 | |
| 676 | 663 | class MessageDialog(wx.Dialog): |
| 677 | 664 | def __init__(self, message): |
| 678 | - try: | |
| 679 | - pre = wx.PreDialog() | |
| 680 | - pre.Create(None, -1, "InVesalius 3", size=(360, 370), pos=wx.DefaultPosition, | |
| 681 | - style=wx.DEFAULT_DIALOG_STYLE|wx.ICON_INFORMATION) | |
| 682 | - self.PostCreate(pre) | |
| 683 | - except AttributeError: | |
| 684 | - wx.Dialog.__init__(self, None, -1, "InVesalius 3", size=(360, 370), pos=wx.DefaultPosition, | |
| 685 | - style=wx.DEFAULT_DIALOG_STYLE|wx.ICON_INFORMATION) | |
| 665 | + wx.Dialog.__init__(self, None, -1, "InVesalius 3", size=(360, 370), pos=wx.DefaultPosition, | |
| 666 | + style=wx.DEFAULT_DIALOG_STYLE|wx.ICON_INFORMATION) | |
| 686 | 667 | |
| 687 | 668 | # Static text which contains message to user |
| 688 | 669 | label = wx.StaticText(self, -1, message) |
| ... | ... | @@ -721,14 +702,8 @@ class UpdateMessageDialog(wx.Dialog): |
| 721 | 702 | title=_("Invesalius Update") |
| 722 | 703 | self.url = url |
| 723 | 704 | |
| 724 | - try: | |
| 725 | - pre = wx.PreDialog() | |
| 726 | - pre.Create(None, -1, title, size=(360, 370), pos=wx.DefaultPosition, | |
| 727 | - style=wx.DEFAULT_DIALOG_STYLE|wx.ICON_INFORMATION) | |
| 728 | - self.PostCreate(pre) | |
| 729 | - except AttributeError: | |
| 730 | - wx.Dialog.__init__(self, None, -1, title, size=(360, 370), pos=wx.DefaultPosition, | |
| 731 | - style=wx.DEFAULT_DIALOG_STYLE|wx.ICON_INFORMATION) | |
| 705 | + wx.Dialog.__init__(self, None, -1, title, size=(360, 370), pos=wx.DefaultPosition, | |
| 706 | + style=wx.DEFAULT_DIALOG_STYLE|wx.ICON_INFORMATION) | |
| 732 | 707 | |
| 733 | 708 | # Static text which contains message to user |
| 734 | 709 | label = wx.StaticText(self, -1, msg) |
| ... | ... | @@ -1066,22 +1041,8 @@ class NewMask(wx.Dialog): |
| 1066 | 1041 | import invesalius.data.mask as mask |
| 1067 | 1042 | import invesalius.project as prj |
| 1068 | 1043 | |
| 1069 | - try: | |
| 1070 | - # Instead of calling wx.Dialog.__init__ we precreate the dialog | |
| 1071 | - # so we can set an extra style that must be set before | |
| 1072 | - # creation, and then we create the GUI object using the Create | |
| 1073 | - # method. | |
| 1074 | - pre = wx.PreDialog() | |
| 1075 | - pre.SetExtraStyle(wx.DIALOG_EX_CONTEXTHELP) | |
| 1076 | - pre.Create(parent, ID, title, pos, (500,300), style) | |
| 1077 | - # This next step is the most important, it turns this Python | |
| 1078 | - # object into the real wrapper of the dialog (instead of pre) | |
| 1079 | - # as far as the wxPython extension is concerned. | |
| 1080 | - self.PostCreate(pre) | |
| 1081 | - except AttributeError: | |
| 1082 | - wx.Dialog.__init__(self, parent, ID, title, pos, (500,300), style) | |
| 1083 | - self.SetExtraStyle(wx.DIALOG_EX_CONTEXTHELP) | |
| 1084 | - | |
| 1044 | + wx.Dialog.__init__(self, parent, ID, title, pos, style=style) | |
| 1045 | + self.SetExtraStyle(wx.DIALOG_EX_CONTEXTHELP) | |
| 1085 | 1046 | |
| 1086 | 1047 | self.CenterOnScreen() |
| 1087 | 1048 | |
| ... | ... | @@ -1127,10 +1088,10 @@ class NewMask(wx.Dialog): |
| 1127 | 1088 | self.colour = original_colour |
| 1128 | 1089 | colour = [255*i for i in original_colour] |
| 1129 | 1090 | colour.append(100) |
| 1130 | - gradient = grad.GradientSlider(self, -1, int(bound_min), | |
| 1131 | - int(bound_max), | |
| 1132 | - int(thresh_min), int(thresh_max), | |
| 1133 | - colour) | |
| 1091 | + gradient = grad.GradientCtrl(self, -1, int(bound_min), | |
| 1092 | + int(bound_max), | |
| 1093 | + int(thresh_min), int(thresh_max), | |
| 1094 | + colour) | |
| 1134 | 1095 | self.gradient = gradient |
| 1135 | 1096 | |
| 1136 | 1097 | # OVERVIEW |
| ... | ... | @@ -1162,11 +1123,12 @@ class NewMask(wx.Dialog): |
| 1162 | 1123 | # Merge all sizers and checkboxes |
| 1163 | 1124 | sizer = wx.BoxSizer(wx.VERTICAL) |
| 1164 | 1125 | sizer.Add(fixed_sizer, 0, wx.ALL|wx.GROW|wx.EXPAND, 15) |
| 1165 | - sizer.Add(gradient, 1, wx.BOTTOM|wx.RIGHT|wx.LEFT|wx.EXPAND|wx.GROW, 20) | |
| 1126 | + sizer.Add(gradient, 0, wx.BOTTOM|wx.RIGHT|wx.LEFT|wx.EXPAND|wx.GROW, 20) | |
| 1166 | 1127 | sizer.Add(btnsizer, 0, wx.ALIGN_RIGHT|wx.BOTTOM, 10) |
| 1167 | 1128 | |
| 1168 | 1129 | self.SetSizer(sizer) |
| 1169 | 1130 | sizer.Fit(self) |
| 1131 | + self.Layout() | |
| 1170 | 1132 | |
| 1171 | 1133 | self.Bind(grad.EVT_THRESHOLD_CHANGED, self.OnSlideChanged, self.gradient) |
| 1172 | 1134 | self.combo_thresh.Bind(wx.EVT_COMBOBOX, self.OnComboThresh) |
| ... | ... | @@ -1362,22 +1324,8 @@ class NewSurfaceDialog(wx.Dialog): |
| 1362 | 1324 | import invesalius.data.surface as surface |
| 1363 | 1325 | import invesalius.project as prj |
| 1364 | 1326 | |
| 1365 | - try: | |
| 1366 | - # Instead of calling wx.Dialog.__init__ we precreate the dialog | |
| 1367 | - # so we can set an extra style that must be set before | |
| 1368 | - # creation, and then we create the GUI object using the Create | |
| 1369 | - # method. | |
| 1370 | - pre = wx.PreDialog() | |
| 1371 | - pre.SetExtraStyle(wx.DIALOG_EX_CONTEXTHELP) | |
| 1372 | - pre.Create(parent, ID, title, pos, (500,300), style) | |
| 1373 | - | |
| 1374 | - # This next step is the most important, it turns this Python | |
| 1375 | - # object into the real wrapper of the dialog (instead of pre) | |
| 1376 | - # as far as the wxPython extension is concerned. | |
| 1377 | - self.PostCreate(pre) | |
| 1378 | - except AttributeError: | |
| 1379 | - wx.Dialog.__init__(self, parent, ID, title, pos, (500,300), style) | |
| 1380 | - self.SetExtraStyle(wx.DIALOG_EX_CONTEXTHELP) | |
| 1327 | + wx.Dialog.__init__(self, parent, ID, title, pos, (500,300), style) | |
| 1328 | + self.SetExtraStyle(wx.DIALOG_EX_CONTEXTHELP) | |
| 1381 | 1329 | |
| 1382 | 1330 | self.CenterOnScreen() |
| 1383 | 1331 | |
| ... | ... | @@ -1579,28 +1527,10 @@ class SurfaceCreationDialog(wx.Dialog): |
| 1579 | 1527 | style=wx.DEFAULT_DIALOG_STYLE, useMetal=False, |
| 1580 | 1528 | mask_edited=False): |
| 1581 | 1529 | |
| 1582 | - # Instead of calling wx.Dialog.__init__ we precreate the dialog | |
| 1583 | - # so we can set an extra style that must be set before | |
| 1584 | - # creation, and then we create the GUI object using the Create | |
| 1585 | - # method. | |
| 1586 | - try: | |
| 1587 | - pre = wx.PreDialog() | |
| 1588 | - pre.SetExtraStyle(wx.DIALOG_EX_CONTEXTHELP) | |
| 1589 | - pre.Create(parent, ID, title, pos, (500,300), style) | |
| 1590 | - | |
| 1591 | - # This extra style can be set after the UI object has been created. | |
| 1592 | - if 'wxMac' in wx.PlatformInfo and useMetal: | |
| 1593 | - self.SetExtraStyle(wx.DIALOG_EX_METAL) | |
| 1594 | - | |
| 1595 | - # This next step is the most important, it turns this Python | |
| 1596 | - # object into the real wrapper of the dialog (instead of pre) | |
| 1597 | - # as far as the wxPython extension is concerned. | |
| 1598 | - self.PostCreate(pre) | |
| 1599 | - except AttributeError: | |
| 1600 | - wx.Dialog.__init__(self, parent, ID, title, pos, size, style) | |
| 1601 | - self.SetExtraStyle(wx.DIALOG_EX_CONTEXTHELP) | |
| 1602 | - if 'wxMac' in wx.PlatformInfo and useMetal: | |
| 1603 | - self.SetExtraStyle(wx.DIALOG_EX_METAL) | |
| 1530 | + wx.Dialog.__init__(self, parent, ID, title, pos, size, style) | |
| 1531 | + self.SetExtraStyle(wx.DIALOG_EX_CONTEXTHELP) | |
| 1532 | + if 'wxMac' in wx.PlatformInfo and useMetal: | |
| 1533 | + self.SetExtraStyle(wx.DIALOG_EX_METAL) | |
| 1604 | 1534 | |
| 1605 | 1535 | self.CenterOnScreen() |
| 1606 | 1536 | |
| ... | ... | @@ -1772,19 +1702,19 @@ class CAOptions(wx.Panel): |
| 1772 | 1702 | |
| 1773 | 1703 | def _build_widgets(self): |
| 1774 | 1704 | sb = wx.StaticBox(self, -1, _('Options')) |
| 1775 | - self.angle = floatspin.FloatSpin(self, -1, value=0.7, min_val=0.0, | |
| 1776 | - max_val=1.0, increment=0.1, | |
| 1777 | - digits=1) | |
| 1705 | + self.angle = InvFloatSpinCtrl(self, -1, value=0.7, min_value=0.0, | |
| 1706 | + max_value=1.0, increment=0.1, | |
| 1707 | + digits=1) | |
| 1778 | 1708 | |
| 1779 | - self.max_distance = floatspin.FloatSpin(self, -1, value=3.0, min_val=0.0, | |
| 1780 | - max_val=100.0, increment=0.1, | |
| 1709 | + self.max_distance = InvFloatSpinCtrl(self, -1, value=3.0, min_value=0.0, | |
| 1710 | + max_value=100.0, increment=0.1, | |
| 1781 | 1711 | digits=2) |
| 1782 | 1712 | |
| 1783 | - self.min_weight = floatspin.FloatSpin(self, -1, value=0.5, min_val=0.0, | |
| 1784 | - max_val=1.0, increment=0.1, | |
| 1713 | + self.min_weight = InvFloatSpinCtrl(self, -1, value=0.5, min_value=0.0, | |
| 1714 | + max_value=1.0, increment=0.1, | |
| 1785 | 1715 | digits=1) |
| 1786 | 1716 | |
| 1787 | - self.steps = wx.SpinCtrl(self, -1, value='10', min=1, max=100) | |
| 1717 | + self.steps = InvSpinCtrl(self, -1, value=10, min_value=1, max_value=100) | |
| 1788 | 1718 | |
| 1789 | 1719 | layout_sizer = wx.FlexGridSizer(rows=4, cols=2, hgap=5, vgap=5) |
| 1790 | 1720 | layout_sizer.Add(wx.StaticText(self, -1, _(u'Angle:')), 0, wx.EXPAND) |
| ... | ... | @@ -1826,12 +1756,12 @@ class SurfaceMethodPanel(wx.Panel): |
| 1826 | 1756 | choices=[i for i in sorted(self.alg_types) |
| 1827 | 1757 | if not (self.mask_edited and i in self.edited_imp)], |
| 1828 | 1758 | style=wx.CB_READONLY) |
| 1829 | - w, h = self.cb_types.GetSizeTuple() | |
| 1759 | + w, h = self.cb_types.GetSize() | |
| 1830 | 1760 | |
| 1831 | 1761 | icon = wx.ArtProvider.GetBitmap(wx.ART_INFORMATION, wx.ART_MESSAGE_BOX, |
| 1832 | 1762 | (h * 0.8, h * 0.8)) |
| 1833 | 1763 | self.bmp = wx.StaticBitmap(self, -1, icon) |
| 1834 | - self.bmp.SetToolTipString(_("It is not possible to use the Default method because the mask was edited.")) | |
| 1764 | + self.bmp.SetToolTip(_("It is not possible to use the Default method because the mask was edited.")) | |
| 1835 | 1765 | |
| 1836 | 1766 | self.method_sizer = wx.BoxSizer(wx.HORIZONTAL) |
| 1837 | 1767 | self.method_sizer.Add(wx.StaticText(self, -1, _(u'Method:')), 0, |
| ... | ... | @@ -1906,12 +1836,7 @@ class SurfaceMethodPanel(wx.Panel): |
| 1906 | 1836 | |
| 1907 | 1837 | class ClutImagedataDialog(wx.Dialog): |
| 1908 | 1838 | def __init__(self, histogram, init, end, nodes=None): |
| 1909 | - try: | |
| 1910 | - pre = wx.PreDialog() | |
| 1911 | - pre.Create(wx.GetApp().GetTopWindow(), -1, style=wx.DEFAULT_DIALOG_STYLE|wx.FRAME_FLOAT_ON_PARENT|wx.STAY_ON_TOP) | |
| 1912 | - self.PostCreate(pre) | |
| 1913 | - except AttributeError: | |
| 1914 | - wx.Dialog.__init__(self, wx.GetApp().GetTopWindow(), -1, style=wx.DEFAULT_DIALOG_STYLE|wx.FRAME_FLOAT_ON_PARENT|wx.STAY_ON_TOP) | |
| 1839 | + wx.Dialog.__init__(self, wx.GetApp().GetTopWindow(), -1, style=wx.DEFAULT_DIALOG_STYLE|wx.FRAME_FLOAT_ON_PARENT|wx.STAY_ON_TOP) | |
| 1915 | 1840 | |
| 1916 | 1841 | self.histogram = histogram |
| 1917 | 1842 | self.init = init |
| ... | ... | @@ -1981,8 +1906,8 @@ class WatershedOptionsPanel(wx.Panel): |
| 1981 | 1906 | style=wx.NO_BORDER | wx.HORIZONTAL) |
| 1982 | 1907 | self.choice_3dcon.SetSelection(self.con3d_choices.index(self.config.con_3d)) |
| 1983 | 1908 | |
| 1984 | - self.gaussian_size = wx.SpinCtrl(self, -1, "", min=1, max=10) | |
| 1985 | - self.gaussian_size.SetValue(self.config.mg_size) | |
| 1909 | + self.gaussian_size = InvSpinCtrl(self, -1, value=self.config.mg_size, | |
| 1910 | + min_value=1, max_value=10) | |
| 1986 | 1911 | |
| 1987 | 1912 | box_sizer = wx.StaticBoxSizer(wx.StaticBox(self, -1, "Conectivity"), wx.VERTICAL) |
| 1988 | 1913 | box_sizer.Add(self.choice_2dcon, 0, wx.ALIGN_CENTER_VERTICAL,2) |
| ... | ... | @@ -2010,12 +1935,7 @@ class WatershedOptionsPanel(wx.Panel): |
| 2010 | 1935 | |
| 2011 | 1936 | class WatershedOptionsDialog(wx.Dialog): |
| 2012 | 1937 | def __init__(self, config, ID=-1, title=_(u'Watershed'), style=wx.DEFAULT_DIALOG_STYLE|wx.FRAME_FLOAT_ON_PARENT|wx.STAY_ON_TOP): |
| 2013 | - try: | |
| 2014 | - pre = wx.PreDialog() | |
| 2015 | - pre.Create(wx.GetApp().GetTopWindow(), ID, title=title, style=style) | |
| 2016 | - self.PostCreate(pre) | |
| 2017 | - except AttributeError: | |
| 2018 | - wx.Dialog.__init__(self, wx.GetApp().GetTopWindow(), ID, title=title, style=style) | |
| 1938 | + wx.Dialog.__init__(self, wx.GetApp().GetTopWindow(), ID, title=title, style=style) | |
| 2019 | 1939 | |
| 2020 | 1940 | self.config = config |
| 2021 | 1941 | |
| ... | ... | @@ -2054,12 +1974,7 @@ class WatershedOptionsDialog(wx.Dialog): |
| 2054 | 1974 | |
| 2055 | 1975 | class MaskBooleanDialog(wx.Dialog): |
| 2056 | 1976 | def __init__(self, masks, ID=-1, title=_(u"Boolean operations"), style=wx.DEFAULT_DIALOG_STYLE|wx.FRAME_FLOAT_ON_PARENT|wx.STAY_ON_TOP): |
| 2057 | - try: | |
| 2058 | - pre = wx.PreDialog() | |
| 2059 | - pre.Create(wx.GetApp().GetTopWindow(), ID, title=title, style=style) | |
| 2060 | - self.PostCreate(pre) | |
| 2061 | - except AttributeError: | |
| 2062 | - wx.Dialog.__init__(self, wx.GetApp().GetTopWindow(), ID, title=title, style=style) | |
| 1977 | + wx.Dialog.__init__(self, wx.GetApp().GetTopWindow(), ID, title=title, style=style) | |
| 2063 | 1978 | |
| 2064 | 1979 | self._init_gui(masks) |
| 2065 | 1980 | self.CenterOnScreen() |
| ... | ... | @@ -2138,12 +2053,7 @@ class MaskBooleanDialog(wx.Dialog): |
| 2138 | 2053 | |
| 2139 | 2054 | class ReorientImageDialog(wx.Dialog): |
| 2140 | 2055 | def __init__(self, ID=-1, title=_(u'Image reorientation'), style=wx.DEFAULT_DIALOG_STYLE|wx.FRAME_FLOAT_ON_PARENT|wx.STAY_ON_TOP): |
| 2141 | - try: | |
| 2142 | - pre = wx.PreDialog() | |
| 2143 | - pre.Create(wx.GetApp().GetTopWindow(), ID, title=title, style=style) | |
| 2144 | - self.PostCreate(pre) | |
| 2145 | - except AttributeError: | |
| 2146 | - wx.Dialog.__init__(self, wx.GetApp().GetTopWindow(), ID, title=title, style=style) | |
| 2056 | + wx.Dialog.__init__(self, wx.GetApp().GetTopWindow(), ID, title=title, style=style) | |
| 2147 | 2057 | |
| 2148 | 2058 | self._closed = False |
| 2149 | 2059 | |
| ... | ... | @@ -2263,16 +2173,10 @@ class ImportBitmapParameters(wx.Dialog): |
| 2263 | 2173 | else: |
| 2264 | 2174 | size=wx.Size(380,210) |
| 2265 | 2175 | |
| 2266 | - try: | |
| 2267 | - pre = wx.PreDialog() | |
| 2268 | - pre.Create(wx.GetApp().GetTopWindow(), -1, _(u"Create project from bitmap"),size=size, | |
| 2269 | - style=wx.DEFAULT_DIALOG_STYLE|wx.FRAME_FLOAT_ON_PARENT|wx.STAY_ON_TOP) | |
| 2270 | - self.PostCreate(pre) | |
| 2271 | - except AttributeError: | |
| 2272 | - wx.Dialog.__init__(self, wx.GetApp().GetTopWindow(), -1, | |
| 2273 | - _(u"Create project from bitmap"), | |
| 2274 | - size=size, | |
| 2275 | - style=wx.DEFAULT_DIALOG_STYLE|wx.FRAME_FLOAT_ON_PARENT|wx.STAY_ON_TOP) | |
| 2176 | + wx.Dialog.__init__(self, wx.GetApp().GetTopWindow(), -1, | |
| 2177 | + _(u"Create project from bitmap"), | |
| 2178 | + size=size, | |
| 2179 | + style=wx.DEFAULT_DIALOG_STYLE|wx.FRAME_FLOAT_ON_PARENT|wx.STAY_ON_TOP) | |
| 2276 | 2180 | |
| 2277 | 2181 | self.interval = 0 |
| 2278 | 2182 | |
| ... | ... | @@ -2325,16 +2229,16 @@ class ImportBitmapParameters(wx.Dialog): |
| 2325 | 2229 | gbs_spacing = wx.GridBagSizer(2, 6) |
| 2326 | 2230 | |
| 2327 | 2231 | stx_spacing_x = stx_spacing_x = wx.StaticText(p, -1, _(u"X:")) |
| 2328 | - fsp_spacing_x = self.fsp_spacing_x = FS.FloatSpin(p, -1, min_val=0,\ | |
| 2232 | + fsp_spacing_x = self.fsp_spacing_x = InvFloatSpinCtrl(p, -1, min_value=0, max_value=1000000000, | |
| 2329 | 2233 | increment=0.25, value=1.0, digits=8) |
| 2330 | 2234 | |
| 2331 | 2235 | |
| 2332 | 2236 | stx_spacing_y = stx_spacing_y = wx.StaticText(p, -1, _(u"Y:")) |
| 2333 | - fsp_spacing_y = self.fsp_spacing_y = FS.FloatSpin(p, -1, min_val=0,\ | |
| 2237 | + fsp_spacing_y = self.fsp_spacing_y = InvFloatSpinCtrl(p, -1, min_value=0, max_value=1000000000, | |
| 2334 | 2238 | increment=0.25, value=1.0, digits=8) |
| 2335 | 2239 | |
| 2336 | 2240 | stx_spacing_z = stx_spacing_z = wx.StaticText(p, -1, _(u"Z:")) |
| 2337 | - fsp_spacing_z = self.fsp_spacing_z = FS.FloatSpin(p, -1, min_val=0,\ | |
| 2241 | + fsp_spacing_z = self.fsp_spacing_z = InvFloatSpinCtrl(p, -1, min_value=0, max_value=1000000000, | |
| 2338 | 2242 | increment=0.25, value=1.0, digits=8) |
| 2339 | 2243 | |
| 2340 | 2244 | |
| ... | ... | @@ -2594,12 +2498,11 @@ class PanelFFillDynamic(wx.Panel): |
| 2594 | 2498 | self.use_ww_wl = wx.CheckBox(self, -1, _(u"Use WW&WL")) |
| 2595 | 2499 | self.use_ww_wl.SetValue(self.config.use_ww_wl) |
| 2596 | 2500 | |
| 2597 | - self.deviation_min = wx.SpinCtrl(self, -1, value='%d' % self.config.dev_min, min=0, max=10000) | |
| 2598 | - w, h = self.deviation_min.GetTextExtent('M') | |
| 2599 | - self.deviation_min.SetMinSize((w*5, -1)) | |
| 2501 | + self.deviation_min = InvSpinCtrl(self, -1, value=self.config.dev_min, min_value=0, max_value=10000) | |
| 2502 | + self.deviation_min.CalcSizeFromTextSize() | |
| 2600 | 2503 | |
| 2601 | - self.deviation_max = wx.SpinCtrl(self, -1, value='%d' % self.config.dev_max, min=0, max=10000) | |
| 2602 | - self.deviation_max.SetMinSize((w*5, -1)) | |
| 2504 | + self.deviation_max = InvSpinCtrl(self, -1, value=self.config.dev_max, min_value=0, max_value=10000) | |
| 2505 | + self.deviation_max.CalcSizeFromTextSize() | |
| 2603 | 2506 | |
| 2604 | 2507 | sizer = wx.GridBagSizer(5, 5) |
| 2605 | 2508 | |
| ... | ... | @@ -2656,17 +2559,16 @@ class PanelFFillConfidence(wx.Panel): |
| 2656 | 2559 | self.use_ww_wl = wx.CheckBox(self, -1, _(u"Use WW&WL")) |
| 2657 | 2560 | self.use_ww_wl.SetValue(self.config.use_ww_wl) |
| 2658 | 2561 | |
| 2659 | - self.spin_mult = floatspin.FloatSpin(self, -1, | |
| 2660 | - value=self.config.confid_mult, | |
| 2661 | - min_val=1.0, max_val=10.0, | |
| 2662 | - increment=0.1, digits=1, | |
| 2663 | - style=wx.TE_PROCESS_TAB|wx.TE_PROCESS_ENTER, | |
| 2664 | - agwStyle=floatspin.FS_RIGHT) | |
| 2665 | - w, h = self.spin_mult.GetTextExtent('M') | |
| 2666 | - self.spin_mult.SetMinSize((w*7, -1)) | |
| 2562 | + self.spin_mult = InvFloatSpinCtrl(self, -1, | |
| 2563 | + value=self.config.confid_mult, | |
| 2564 | + min_value=1.0, max_value=10.0, | |
| 2565 | + increment=0.1, digits=1) | |
| 2566 | + # style=wx.TE_PROCESS_TAB|wx.TE_PROCESS_ENTER, | |
| 2567 | + # agwStyle=floatspin.FS_RIGHT) | |
| 2568 | + self.spin_mult.CalcSizeFromTextSize() | |
| 2667 | 2569 | |
| 2668 | - self.spin_iters = wx.SpinCtrl(self, -1, value='%d' % self.config.confid_iters, min=0, max=100) | |
| 2669 | - self.spin_iters.SetMinSize((w*7, -1)) | |
| 2570 | + self.spin_iters = InvSpinCtrl(self, -1, value=self.config.confid_iters, min_value=0, max_value=100) | |
| 2571 | + self.spin_iters.CalcSizeFromTextSize() | |
| 2670 | 2572 | |
| 2671 | 2573 | sizer = wx.GridBagSizer(5, 5) |
| 2672 | 2574 | |
| ... | ... | @@ -2713,12 +2615,7 @@ class PanelFFillConfidence(wx.Panel): |
| 2713 | 2615 | |
| 2714 | 2616 | class FFillOptionsDialog(wx.Dialog): |
| 2715 | 2617 | def __init__(self, title, config): |
| 2716 | - try: | |
| 2717 | - pre = wx.PreDialog() | |
| 2718 | - pre.Create(wx.GetApp().GetTopWindow(), -1, title, style=wx.DEFAULT_DIALOG_STYLE|wx.FRAME_FLOAT_ON_PARENT|wx.STAY_ON_TOP) | |
| 2719 | - self.PostCreate(pre) | |
| 2720 | - except AttributeError: | |
| 2721 | - wx.Dialog.__init__(self, wx.GetApp().GetTopWindow(), -1, title, style=wx.DEFAULT_DIALOG_STYLE|wx.FRAME_FLOAT_ON_PARENT|wx.STAY_ON_TOP) | |
| 2618 | + wx.Dialog.__init__(self, wx.GetApp().GetTopWindow(), -1, title, style=wx.DEFAULT_DIALOG_STYLE|wx.FRAME_FLOAT_ON_PARENT|wx.STAY_ON_TOP) | |
| 2722 | 2619 | |
| 2723 | 2620 | self.config = config |
| 2724 | 2621 | |
| ... | ... | @@ -2826,12 +2723,7 @@ class FFillOptionsDialog(wx.Dialog): |
| 2826 | 2723 | |
| 2827 | 2724 | class SelectPartsOptionsDialog(wx.Dialog): |
| 2828 | 2725 | def __init__(self, config): |
| 2829 | - try: | |
| 2830 | - pre = wx.PreDialog() | |
| 2831 | - pre.Create(wx.GetApp().GetTopWindow(), -1, _(u"Select mask parts"), style=wx.DEFAULT_DIALOG_STYLE|wx.FRAME_FLOAT_ON_PARENT|wx.STAY_ON_TOP) | |
| 2832 | - self.PostCreate(pre) | |
| 2833 | - except AttributeError: | |
| 2834 | - wx.Dialog.__init__(self, wx.GetApp().GetTopWindow(), -1, _(u"Select mask parts"), style=wx.DEFAULT_DIALOG_STYLE|wx.FRAME_FLOAT_ON_PARENT|wx.STAY_ON_TOP) | |
| 2726 | + wx.Dialog.__init__(self, wx.GetApp().GetTopWindow(), -1, _(u"Select mask parts"), style=wx.DEFAULT_DIALOG_STYLE|wx.FRAME_FLOAT_ON_PARENT|wx.STAY_ON_TOP) | |
| 2835 | 2727 | |
| 2836 | 2728 | self.config = config |
| 2837 | 2729 | |
| ... | ... | @@ -2911,12 +2803,7 @@ class SelectPartsOptionsDialog(wx.Dialog): |
| 2911 | 2803 | |
| 2912 | 2804 | class FFillSegmentationOptionsDialog(wx.Dialog): |
| 2913 | 2805 | def __init__(self, config, ID=-1, title=_(u"Region growing"), style=wx.DEFAULT_DIALOG_STYLE|wx.FRAME_FLOAT_ON_PARENT|wx.STAY_ON_TOP): |
| 2914 | - try: | |
| 2915 | - pre = wx.PreDialog() | |
| 2916 | - pre.Create(wx.GetApp().GetTopWindow(), ID, title=title, style=style) | |
| 2917 | - self.PostCreate(pre) | |
| 2918 | - except AttributeError: | |
| 2919 | - wx.Dialog.__init__(self, wx.GetApp().GetTopWindow(), ID, title=title, style=style) | |
| 2806 | + wx.Dialog.__init__(self, wx.GetApp().GetTopWindow(), ID, title=title, style=style) | |
| 2920 | 2807 | |
| 2921 | 2808 | self.config = config |
| 2922 | 2809 | |
| ... | ... | @@ -3117,15 +3004,7 @@ class CropOptionsDialog(wx.Dialog): |
| 3117 | 3004 | |
| 3118 | 3005 | def __init__(self, config, ID=-1, title=_(u"Crop mask"), style=wx.DEFAULT_DIALOG_STYLE|wx.FRAME_FLOAT_ON_PARENT|wx.STAY_ON_TOP): |
| 3119 | 3006 | self.config = config |
| 3120 | - try: | |
| 3121 | - pre = wx.PreDialog() | |
| 3122 | - | |
| 3123 | - pre.Create(wx.GetApp().GetTopWindow(), ID, title=title, style=style) | |
| 3124 | - self.PostCreate(pre) | |
| 3125 | - except AttributeError: | |
| 3126 | - wx.Dialog.__init__(self, wx.GetApp().GetTopWindow(), ID, title=title, style=style) | |
| 3127 | - | |
| 3128 | - | |
| 3007 | + wx.Dialog.__init__(self, wx.GetApp().GetTopWindow(), ID, title=title, style=style) | |
| 3129 | 3008 | self._init_gui() |
| 3130 | 3009 | |
| 3131 | 3010 | def UpdateValues(self, limits): |
| ... | ... | @@ -3236,13 +3115,7 @@ class CropOptionsDialog(wx.Dialog): |
| 3236 | 3115 | |
| 3237 | 3116 | class FillHolesAutoDialog(wx.Dialog): |
| 3238 | 3117 | def __init__(self, title): |
| 3239 | - try: | |
| 3240 | - pre = wx.PreDialog() | |
| 3241 | - pre.Create(wx.GetApp().GetTopWindow(), -1, title, style=wx.DEFAULT_DIALOG_STYLE|wx.FRAME_FLOAT_ON_PARENT|wx.STAY_ON_TOP) | |
| 3242 | - self.PostCreate(pre) | |
| 3243 | - except AttributeError: | |
| 3244 | - wx.Dialog.__init__(self, wx.GetApp().GetTopWindow(), -1, title, style=wx.DEFAULT_DIALOG_STYLE|wx.FRAME_FLOAT_ON_PARENT|wx.STAY_ON_TOP) | |
| 3245 | - | |
| 3118 | + wx.Dialog.__init__(self, wx.GetApp().GetTopWindow(), -1, title, style=wx.DEFAULT_DIALOG_STYLE|wx.FRAME_FLOAT_ON_PARENT|wx.STAY_ON_TOP) | |
| 3246 | 3119 | self._init_gui() |
| 3247 | 3120 | |
| 3248 | 3121 | def _init_gui(self): |
| ... | ... | @@ -3251,7 +3124,7 @@ class FillHolesAutoDialog(wx.Dialog): |
| 3251 | 3124 | else: |
| 3252 | 3125 | border_style = wx.SUNKEN_BORDER |
| 3253 | 3126 | |
| 3254 | - self.spin_size = wx.SpinCtrl(self, -1, value='1000', min=1, max=1000000000) | |
| 3127 | + self.spin_size = InvSpinCtrl(self, -1, value=1000, min_value=1, max_value=1000000000) | |
| 3255 | 3128 | self.panel_target = PanelTargeFFill(self, style=border_style|wx.TAB_TRAVERSAL) |
| 3256 | 3129 | self.panel2dcon = Panel2DConnectivity(self, show_orientation=True, style=border_style|wx.TAB_TRAVERSAL) |
| 3257 | 3130 | self.panel3dcon = Panel3DConnectivity(self, style=border_style|wx.TAB_TRAVERSAL) |
| ... | ... | @@ -3340,14 +3213,8 @@ class FillHolesAutoDialog(wx.Dialog): |
| 3340 | 3213 | |
| 3341 | 3214 | class MaskDensityDialog(wx.Dialog): |
| 3342 | 3215 | def __init__(self, title): |
| 3343 | - try: | |
| 3344 | - pre = wx.PreDialog() | |
| 3345 | - pre.Create(wx.GetApp().GetTopWindow(), -1, _(u"Mask density"), style=wx.DEFAULT_DIALOG_STYLE|wx.FRAME_FLOAT_ON_PARENT) | |
| 3346 | - self.PostCreate(pre) | |
| 3347 | - except AttributeError: | |
| 3348 | - wx.Dialog.__init__(self, wx.GetApp().GetTopWindow(), -1, _(u"Mask density"), | |
| 3349 | - style=wx.DEFAULT_DIALOG_STYLE | wx.FRAME_FLOAT_ON_PARENT) | |
| 3350 | - | |
| 3216 | + wx.Dialog.__init__(self, wx.GetApp().GetTopWindow(), -1, _(u"Mask density"), | |
| 3217 | + style=wx.DEFAULT_DIALOG_STYLE | wx.FRAME_FLOAT_ON_PARENT) | |
| 3351 | 3218 | self._init_gui() |
| 3352 | 3219 | self._bind_events() |
| 3353 | 3220 | |
| ... | ... | @@ -3456,14 +3323,8 @@ class ObjectCalibrationDialog(wx.Dialog): |
| 3456 | 3323 | self.obj_fiducials = np.full([5, 3], np.nan) |
| 3457 | 3324 | self.obj_orients = np.full([5, 3], np.nan) |
| 3458 | 3325 | |
| 3459 | - try: | |
| 3460 | - pre = wx.PreDialog() | |
| 3461 | - pre.Create(wx.GetApp().GetTopWindow(), -1, _(u"Object calibration"), size=(450, 440), | |
| 3462 | - style=wx.DEFAULT_DIALOG_STYLE | wx.FRAME_FLOAT_ON_PARENT|wx.STAY_ON_TOP) | |
| 3463 | - self.PostCreate(pre) | |
| 3464 | - except AttributeError: | |
| 3465 | - wx.Dialog.__init__(self, wx.GetApp().GetTopWindow(), -1, _(u"Object calibration"), size=(450, 440), | |
| 3466 | - style=wx.DEFAULT_DIALOG_STYLE | wx.FRAME_FLOAT_ON_PARENT|wx.STAY_ON_TOP) | |
| 3326 | + wx.Dialog.__init__(self, wx.GetApp().GetTopWindow(), -1, _(u"Object calibration"), size=(450, 440), | |
| 3327 | + style=wx.DEFAULT_DIALOG_STYLE | wx.FRAME_FLOAT_ON_PARENT|wx.STAY_ON_TOP) | |
| 3467 | 3328 | |
| 3468 | 3329 | self._init_gui() |
| 3469 | 3330 | self.LoadObject() | ... | ... |
invesalius/gui/dicom_preview_panel.py
invesalius/gui/frame.py
| ... | ... | @@ -820,7 +820,7 @@ class MenuBar(wx.MenuBar): |
| 820 | 820 | app = file_menu.Append |
| 821 | 821 | app(const.ID_DICOM_IMPORT, _("Import DICOM...\tCtrl+I")) |
| 822 | 822 | #app(const.ID_DICOM_NETWORK, _("Retrieve DICOM from PACS")) |
| 823 | - file_menu.AppendMenu(const.ID_IMPORT_OTHERS_FILES, _("Import other files..."), others_file_menu) | |
| 823 | + file_menu.Append(const.ID_IMPORT_OTHERS_FILES, _("Import other files..."), others_file_menu) | |
| 824 | 824 | app(const.ID_PROJECT_OPEN, _("Open project...\tCtrl+O")) |
| 825 | 825 | app(const.ID_PROJECT_SAVE, _("Save project\tCtrl+S")) |
| 826 | 826 | app(const.ID_PROJECT_SAVE_AS, _("Save project as...\tCtrl+Shift+S")) |
| ... | ... | @@ -848,12 +848,12 @@ class MenuBar(wx.MenuBar): |
| 848 | 848 | |
| 849 | 849 | file_edit_item_undo = wx.MenuItem(file_edit, wx.ID_UNDO, _("Undo\tCtrl+Z")) |
| 850 | 850 | file_edit_item_undo.SetBitmap(self.BMP_UNDO) |
| 851 | - file_edit.AppendItem(file_edit_item_undo) | |
| 851 | + file_edit.Append(file_edit_item_undo) | |
| 852 | 852 | file_edit_item_undo.Enable(False) |
| 853 | 853 | |
| 854 | 854 | file_edit_item_redo = wx.MenuItem(file_edit, wx.ID_REDO, _("Redo\tCtrl+Y")) |
| 855 | 855 | file_edit_item_redo.SetBitmap(self.BMP_REDO) |
| 856 | - file_edit.AppendItem(file_edit_item_redo) | |
| 856 | + file_edit.Append(file_edit_item_redo) | |
| 857 | 857 | file_edit_item_redo.Enable(False) |
| 858 | 858 | else: |
| 859 | 859 | file_edit.Append(wx.ID_UNDO, _("Undo\tCtrl+Z")).Enable(False) |
| ... | ... | @@ -925,17 +925,17 @@ class MenuBar(wx.MenuBar): |
| 925 | 925 | swap_axes_menu.Append(const.ID_SWAP_XZ, _("From Right-Left to Top-Bottom")).Enable(False) |
| 926 | 926 | swap_axes_menu.Append(const.ID_SWAP_YZ, _("From Anterior-Posterior to Top-Bottom")).Enable(False) |
| 927 | 927 | |
| 928 | - image_menu.AppendMenu(wx.NewId(), _('Flip'), flip_menu) | |
| 929 | - image_menu.AppendMenu(wx.NewId(), _('Swap axes'), swap_axes_menu) | |
| 928 | + image_menu.Append(wx.NewId(), _('Flip'), flip_menu) | |
| 929 | + image_menu.Append(wx.NewId(), _('Swap axes'), swap_axes_menu) | |
| 930 | 930 | |
| 931 | 931 | mask_density_menu = image_menu.Append(const.ID_MASK_DENSITY_MEASURE, _(u'Mask Density measure')) |
| 932 | 932 | reorient_menu = image_menu.Append(const.ID_REORIENT_IMG, _(u'Reorient image\tCtrl+Shift+R')) |
| 933 | 933 | |
| 934 | 934 | reorient_menu.Enable(False) |
| 935 | - tools_menu.AppendMenu(-1, _(u'Image'), image_menu) | |
| 936 | - tools_menu.AppendMenu(-1, _(u"Mask"), mask_menu) | |
| 937 | - tools_menu.AppendMenu(-1, _(u"Segmentation"), segmentation_menu) | |
| 938 | - tools_menu.AppendMenu(-1, _(u"Surface"), surface_menu) | |
| 935 | + tools_menu.Append(-1, _(u'Image'), image_menu) | |
| 936 | + tools_menu.Append(-1, _(u"Mask"), mask_menu) | |
| 937 | + tools_menu.Append(-1, _(u"Segmentation"), segmentation_menu) | |
| 938 | + tools_menu.Append(-1, _(u"Surface"), surface_menu) | |
| 939 | 939 | |
| 940 | 940 | #View |
| 941 | 941 | self.view_menu = view_menu = wx.Menu() |
| ... | ... | @@ -961,7 +961,7 @@ class MenuBar(wx.MenuBar): |
| 961 | 961 | |
| 962 | 962 | #view_menu = wx.Menu() |
| 963 | 963 | #app = view_menu.Append |
| 964 | - #appm = view_menu.AppendMenu | |
| 964 | + #appm = view_menu.Append | |
| 965 | 965 | #appm(-1, "Toolbars",view_tool_menu) |
| 966 | 966 | #appm(-1, "Layout", view_layout_menu) |
| 967 | 967 | #view_menu.AppendSeparator() |
| ... | ... | @@ -2007,8 +2007,8 @@ class HistoryToolBar(AuiToolBar): |
| 2007 | 2007 | Bind normal events from wx (except pubsub related). |
| 2008 | 2008 | """ |
| 2009 | 2009 | #self.Bind(wx.EVT_TOOL, self.OnToggle) |
| 2010 | - wx.EVT_TOOL( self, wx.ID_UNDO, self.OnUndo ) | |
| 2011 | - wx.EVT_TOOL( self, wx.ID_REDO, self.OnRedo ) | |
| 2010 | + self.Bind(wx.EVT_TOOL, self.OnUndo, id=wx.ID_UNDO) | |
| 2011 | + self.Bind(wx.EVT_TOOL, self.OnRedo, id=wx.ID_REDO) | |
| 2012 | 2012 | |
| 2013 | 2013 | def __init_items(self): |
| 2014 | 2014 | """ | ... | ... |
invesalius/gui/import_network_panel.py
| ... | ... | @@ -675,24 +675,24 @@ class NodesPanel(wx.Panel): |
| 675 | 675 | |
| 676 | 676 | self.hosts[0] = [True, "localhost", "", "invesalius"] |
| 677 | 677 | try: |
| 678 | - index = self.tree_node.InsertStringItem(sys.maxsize, "") | |
| 678 | + index = self.tree_node.InsertItem(sys.maxsize, "") | |
| 679 | 679 | except (OverflowError, AssertionError): |
| 680 | - index = self.tree_node.InsertStringItem(sys.maxint, "") | |
| 681 | - self.tree_node.SetStringItem(index, 1, "localhost") | |
| 682 | - self.tree_node.SetStringItem(index, 2, "") | |
| 683 | - self.tree_node.SetStringItem(index, 3, "invesalius") | |
| 684 | - self.tree_node.SetStringItem(index, 4, "ok") | |
| 680 | + index = self.tree_node.InsertItem(sys.maxint, "") | |
| 681 | + self.tree_node.SetItem(index, 1, "localhost") | |
| 682 | + self.tree_node.SetItem(index, 2, "") | |
| 683 | + self.tree_node.SetItem(index, 3, "invesalius") | |
| 684 | + self.tree_node.SetItem(index, 4, "ok") | |
| 685 | 685 | self.tree_node.CheckItem(index) |
| 686 | 686 | self.tree_node.SetItemBackgroundColour(index, wx.Colour(245,245,245)) |
| 687 | 687 | #print ">>>>>>>>>>>>>>>>>>>>>", sys.maxint |
| 688 | - #index = self.tree_node.InsertStringItem(sys.maxint, "")#adiciona vazio a coluna de check | |
| 689 | - #self.tree_node.SetStringItem(index, 1, "200.144.114.19") | |
| 690 | - #self.tree_node.SetStringItem(index, 2, "80") | |
| 688 | + #index = self.tree_node.InsertItem(sys.maxint, "")#adiciona vazio a coluna de check | |
| 689 | + #self.tree_node.SetItem(index, 1, "200.144.114.19") | |
| 690 | + #self.tree_node.SetItem(index, 2, "80") | |
| 691 | 691 | #self.tree_node.SetItemData(index, 0) |
| 692 | 692 | |
| 693 | - #index2 = self.tree_node.InsertStringItem(sys.maxint, "")#adiciona vazio a coluna de check | |
| 694 | - #self.tree_node.SetStringItem(index2, 1, "200.144.114.19") | |
| 695 | - #self.tree_node.SetStringItem(index2, 2, "80") | |
| 693 | + #index2 = self.tree_node.InsertItem(sys.maxint, "")#adiciona vazio a coluna de check | |
| 694 | + #self.tree_node.SetItem(index2, 1, "200.144.114.19") | |
| 695 | + #self.tree_node.SetItem(index2, 2, "80") | |
| 696 | 696 | #self.tree_node.SetItemData(index2, 0) |
| 697 | 697 | |
| 698 | 698 | self.btn_add = wx.Button(self, -1, _("Add")) |
| ... | ... | @@ -732,12 +732,12 @@ class NodesPanel(wx.Panel): |
| 732 | 732 | |
| 733 | 733 | def OnButtonAdd(self, evt): |
| 734 | 734 | #adiciona vazio a coluna de check |
| 735 | - index = self.tree_node.InsertStringItem(sys.maxsize, "") | |
| 735 | + index = self.tree_node.InsertItem(sys.maxsize, "") | |
| 736 | 736 | |
| 737 | 737 | self.hosts[index] = [True, "localhost", "80", ""] |
| 738 | - self.tree_node.SetStringItem(index, 1, "localhost") | |
| 739 | - self.tree_node.SetStringItem(index, 2, "80") | |
| 740 | - self.tree_node.SetStringItem(index, 3, "") | |
| 738 | + self.tree_node.SetItem(index, 1, "localhost") | |
| 739 | + self.tree_node.SetItem(index, 2, "80") | |
| 740 | + self.tree_node.SetItem(index, 3, "") | |
| 741 | 741 | self.tree_node.CheckItem(index) |
| 742 | 742 | |
| 743 | 743 | def OnLeftDown(self, evt): |
| ... | ... | @@ -770,9 +770,9 @@ class NodesPanel(wx.Panel): |
| 770 | 770 | dn.SetAETitle(self.hosts[0][3]) |
| 771 | 771 | |
| 772 | 772 | if dn.RunCEcho(): |
| 773 | - self.tree_node.SetStringItem(key, 4, _("ok")) | |
| 773 | + self.tree_node.SetItem(key, 4, _("ok")) | |
| 774 | 774 | else: |
| 775 | - self.tree_node.SetStringItem(key, 4, _("error")) | |
| 775 | + self.tree_node.SetItem(key, 4, _("error")) | |
| 776 | 776 | |
| 777 | 777 | def RightButton(self,evt): |
| 778 | 778 | event.Skip() | ... | ... |
invesalius/gui/preferences.py
| ... | ... | @@ -17,15 +17,8 @@ class Preferences(wx.Dialog): |
| 17 | 17 | def __init__( self, parent, id = ID, title = _("Preferences"), size=wx.DefaultSize,\ |
| 18 | 18 | pos=wx.DefaultPosition, style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER): |
| 19 | 19 | |
| 20 | - try: | |
| 21 | - pre = wx.PreDialog() | |
| 22 | - pre.SetExtraStyle(wx.DIALOG_EX_CONTEXTHELP) | |
| 23 | - pre.Create(parent, ID, title, pos, size, style) | |
| 24 | - | |
| 25 | - self.PostCreate(pre) | |
| 26 | - except AttributeError: | |
| 27 | - wx.Dialog.__init__(self, parent, ID, title, pos, size, style) | |
| 28 | - self.SetExtraStyle(wx.DIALOG_EX_CONTEXTHELP) | |
| 20 | + wx.Dialog.__init__(self, parent, ID, title, pos, size, style) | |
| 21 | + self.SetExtraStyle(wx.DIALOG_EX_CONTEXTHELP) | |
| 29 | 22 | |
| 30 | 23 | sizer = wx.BoxSizer(wx.VERTICAL) |
| 31 | 24 | ... | ... |
invesalius/gui/task_exporter.py
| ... | ... | @@ -257,7 +257,7 @@ class InnerTaskPanel(wx.Panel): |
| 257 | 257 | |
| 258 | 258 | for id in self.id_to_name: |
| 259 | 259 | item = wx.MenuItem(menu, id, self.id_to_name[id]) |
| 260 | - menu.AppendItem(item) | |
| 260 | + menu.Append(item) | |
| 261 | 261 | |
| 262 | 262 | self.menu_picture = menu |
| 263 | 263 | menu.Bind(wx.EVT_MENU, self.OnMenuPicture) | ... | ... |
invesalius/gui/task_navigator.py
| ... | ... | @@ -1093,7 +1093,7 @@ class MarkersPanel(wx.Panel): |
| 1093 | 1093 | if id_label == 'TARGET': |
| 1094 | 1094 | id_label = '' |
| 1095 | 1095 | dlg.InvalidTargetID() |
| 1096 | - self.lc.SetStringItem(list_index, 4, id_label) | |
| 1096 | + self.lc.SetItem(list_index, 4, id_label) | |
| 1097 | 1097 | # Add the new ID to exported list |
| 1098 | 1098 | if len(self.list_coord[list_index]) > 8: |
| 1099 | 1099 | self.list_coord[list_index][10] = str(id_label) |
| ... | ... | @@ -1107,7 +1107,7 @@ class MarkersPanel(wx.Panel): |
| 1107 | 1107 | if self.tgt_flag: |
| 1108 | 1108 | self.lc.SetItemBackgroundColour(self.tgt_index, 'white') |
| 1109 | 1109 | Publisher.sendMessage('Set target transparency', status=False, index=self.tgt_index) |
| 1110 | - self.lc.SetStringItem(self.tgt_index, 4, '') | |
| 1110 | + self.lc.SetItem(self.tgt_index, 4, '') | |
| 1111 | 1111 | # Add the new ID to exported list |
| 1112 | 1112 | if len(self.list_coord[self.tgt_index]) > 8: |
| 1113 | 1113 | self.list_coord[self.tgt_index][10] = str('') |
| ... | ... | @@ -1197,7 +1197,7 @@ class MarkersPanel(wx.Panel): |
| 1197 | 1197 | del self.list_coord[i] |
| 1198 | 1198 | self.lc.DeleteItem(i) |
| 1199 | 1199 | for n in range(0, self.lc.GetItemCount()): |
| 1200 | - self.lc.SetStringItem(n, 0, str(n+1)) | |
| 1200 | + self.lc.SetItem(n, 0, str(n+1)) | |
| 1201 | 1201 | self.marker_ind -= 1 |
| 1202 | 1202 | Publisher.sendMessage('Remove marker', index=index) |
| 1203 | 1203 | |
| ... | ... | @@ -1312,11 +1312,11 @@ class MarkersPanel(wx.Panel): |
| 1312 | 1312 | |
| 1313 | 1313 | # Add item to list control in panel |
| 1314 | 1314 | num_items = self.lc.GetItemCount() |
| 1315 | - self.lc.InsertStringItem(num_items, str(num_items + 1)) | |
| 1316 | - self.lc.SetStringItem(num_items, 1, str(round(coord[0], 2))) | |
| 1317 | - self.lc.SetStringItem(num_items, 2, str(round(coord[1], 2))) | |
| 1318 | - self.lc.SetStringItem(num_items, 3, str(round(coord[2], 2))) | |
| 1319 | - self.lc.SetStringItem(num_items, 4, str(marker_id)) | |
| 1315 | + self.lc.InsertItem(num_items, str(num_items + 1)) | |
| 1316 | + self.lc.SetItem(num_items, 1, str(round(coord[0], 2))) | |
| 1317 | + self.lc.SetItem(num_items, 2, str(round(coord[1], 2))) | |
| 1318 | + self.lc.SetItem(num_items, 3, str(round(coord[2], 2))) | |
| 1319 | + self.lc.SetItem(num_items, 4, str(marker_id)) | |
| 1320 | 1320 | self.lc.EnsureVisible(num_items) |
| 1321 | 1321 | |
| 1322 | 1322 | def GetSelectedItems(self): | ... | ... |
invesalius/gui/task_slice.py
| ... | ... | @@ -38,6 +38,7 @@ import invesalius.data.slice_ as slice_ |
| 38 | 38 | import invesalius.constants as const |
| 39 | 39 | import invesalius.gui.dialogs as dlg |
| 40 | 40 | import invesalius.gui.widgets.gradient as grad |
| 41 | +from invesalius.gui.widgets.inv_spinctrl import InvSpinCtrl | |
| 41 | 42 | |
| 42 | 43 | from invesalius.project import Project |
| 43 | 44 | import invesalius.session as ses |
| ... | ... | @@ -693,8 +694,8 @@ class EditionTools(wx.Panel): |
| 693 | 694 | item2 = wx.MenuItem(menu, MENU_BRUSH_SQUARE, _("Square")) |
| 694 | 695 | item2.SetBitmap(SQUARE_BMP) |
| 695 | 696 | |
| 696 | - menu.AppendItem(item) | |
| 697 | - menu.AppendItem(item2) | |
| 697 | + menu.Append(item) | |
| 698 | + menu.Append(item2) | |
| 698 | 699 | |
| 699 | 700 | bmp_brush_format = {const.BRUSH_CIRCLE: CIRCLE_BMP, |
| 700 | 701 | const.BRUSH_SQUARE: SQUARE_BMP} |
| ... | ... | @@ -705,14 +706,9 @@ class EditionTools(wx.Panel): |
| 705 | 706 | btn_brush_format.SetMenu(menu) |
| 706 | 707 | self.btn_brush_format = btn_brush_format |
| 707 | 708 | |
| 709 | + spin_brush_size = InvSpinCtrl(self, -1, value=const.BRUSH_SIZE, min_value=1, max_value=1000, spin_button=False) | |
| 708 | 710 | # To calculate best width to spinctrl |
| 709 | - dc = wx.WindowDC(self) | |
| 710 | - dc.SetFont(self.GetFont()) | |
| 711 | - width, height = dc.GetTextExtent("MMM") | |
| 712 | - | |
| 713 | - spin_brush_size = wx.SpinCtrl(self, -1, "", size=(width + 20, -1)) | |
| 714 | - spin_brush_size.SetRange(1,100) | |
| 715 | - spin_brush_size.SetValue(const.BRUSH_SIZE) | |
| 711 | + spin_brush_size.CalcSizeFromTextSize("MMMM") | |
| 716 | 712 | spin_brush_size.Bind(wx.EVT_SPINCTRL, self.OnBrushSize) |
| 717 | 713 | self.spin = spin_brush_size |
| 718 | 714 | |
| ... | ... | @@ -861,8 +857,8 @@ class WatershedTool(EditionTools): |
| 861 | 857 | item2 = wx.MenuItem(menu, MENU_BRUSH_SQUARE, _("Square")) |
| 862 | 858 | item2.SetBitmap(SQUARE_BMP) |
| 863 | 859 | |
| 864 | - menu.AppendItem(item) | |
| 865 | - menu.AppendItem(item2) | |
| 860 | + menu.Append(item) | |
| 861 | + menu.Append(item2) | |
| 866 | 862 | |
| 867 | 863 | bmp_brush_format = {const.BRUSH_CIRCLE: CIRCLE_BMP, |
| 868 | 864 | const.BRUSH_SQUARE: SQUARE_BMP} |
| ... | ... | @@ -873,14 +869,9 @@ class WatershedTool(EditionTools): |
| 873 | 869 | btn_brush_format.SetMenu(menu) |
| 874 | 870 | self.btn_brush_format = btn_brush_format |
| 875 | 871 | |
| 872 | + spin_brush_size = InvSpinCtrl(self, -1, value=const.BRUSH_SIZE, min_value=1, max_value=1000, spin_button=False) | |
| 876 | 873 | # To calculate best width to spinctrl |
| 877 | - dc = wx.WindowDC(self) | |
| 878 | - dc.SetFont(self.GetFont()) | |
| 879 | - width, height = dc.GetTextExtent("MMM") | |
| 880 | - | |
| 881 | - spin_brush_size = wx.SpinCtrl(self, -1, "", size=(width + 20, -1)) | |
| 882 | - spin_brush_size.SetRange(1,100) | |
| 883 | - spin_brush_size.SetValue(const.BRUSH_SIZE) | |
| 874 | + spin_brush_size.CalcSizeFromTextSize("MMMM") | |
| 884 | 875 | spin_brush_size.Bind(wx.EVT_SPINCTRL, self.OnBrushSize) |
| 885 | 876 | self.spin = spin_brush_size |
| 886 | 877 | ... | ... |
invesalius/gui/task_surface.py
| ... | ... | @@ -38,6 +38,8 @@ import wx.lib.platebtn as pbtn |
| 38 | 38 | import invesalius.project as prj |
| 39 | 39 | import invesalius.utils as utl |
| 40 | 40 | |
| 41 | +from invesalius.gui.widgets.inv_spinctrl import InvSpinCtrl, InvFloatSpinCtrl | |
| 42 | + | |
| 41 | 43 | #INTERPOLATION_MODE_LIST = ["Cubic", "Linear", "NearestNeighbor"] |
| 42 | 44 | MIN_TRANSPARENCY = 0 |
| 43 | 45 | MAX_TRANSPARENCY = 100 |
| ... | ... | @@ -620,9 +622,7 @@ class QualityAdjustment(wx.Panel): |
| 620 | 622 | |
| 621 | 623 | text_decimate = wx.StaticText(self, -1, _("Decimate resolution:")) |
| 622 | 624 | |
| 623 | - spin_decimate = wx.SpinCtrl(self, -1, "", (30, 50)) | |
| 624 | - spin_decimate.SetRange(1,100) | |
| 625 | - spin_decimate.SetValue(30) | |
| 625 | + spin_decimate = InvSpinCtrl(self, -1, value=30, min_value=1, max_value=100, size=(30, 50)) | |
| 626 | 626 | #spin_decimate.Bind(wx.EVT_TEXT, self.OnDecimate) |
| 627 | 627 | |
| 628 | 628 | # LINE 3 |
| ... | ... | @@ -630,9 +630,7 @@ class QualityAdjustment(wx.Panel): |
| 630 | 630 | |
| 631 | 631 | text_smooth = wx.StaticText(self, -1, _("Smooth iterations:")) |
| 632 | 632 | |
| 633 | - spin_smooth = wx.SpinCtrl(self, -1, "", (30, 50)) | |
| 634 | - spin_smooth.SetRange(1,100) | |
| 635 | - spin_smooth.SetValue(0) | |
| 633 | + spin_smooth = InvSpinCtrl(self, -1, value=0, min_value=1, max_values=100, size=(30, 50)) | |
| 636 | 634 | |
| 637 | 635 | # MIXED LINE 2 AND 3 |
| 638 | 636 | flag_link = wx.EXPAND|wx.GROW|wx.RIGHT|wx.LEFT | ... | ... |
invesalius/gui/widgets/canvas_renderer.py
| ... | ... | @@ -140,7 +140,7 @@ class CanvasRendererCTX: |
| 140 | 140 | self.rgb = np.zeros((h, w, 3), dtype=np.uint8) |
| 141 | 141 | self.alpha = np.zeros((h, w, 1), dtype=np.uint8) |
| 142 | 142 | |
| 143 | - self.bitmap = wx.EmptyBitmapRGBA(w, h) | |
| 143 | + self.bitmap = wx.Bitmap.FromRGBA(w, h) | |
| 144 | 144 | try: |
| 145 | 145 | self.image = wx.Image(w, h, self.rgb, self.alpha) |
| 146 | 146 | except TypeError: |
| ... | ... | @@ -155,7 +155,7 @@ class CanvasRendererCTX: |
| 155 | 155 | self.rgb = np.zeros((h, w, 3), dtype=np.uint8) |
| 156 | 156 | self.alpha = np.zeros((h, w, 1), dtype=np.uint8) |
| 157 | 157 | |
| 158 | - self.bitmap = wx.EmptyBitmapRGBA(w, h) | |
| 158 | + self.bitmap = wx.Bitmap.FromRGBA(w, h) | |
| 159 | 159 | try: |
| 160 | 160 | self.image = wx.Image(w, h, self.rgb, self.alpha) |
| 161 | 161 | except TypeError: |
| ... | ... | @@ -379,7 +379,7 @@ class CanvasRendererCTX: |
| 379 | 379 | if size is None: |
| 380 | 380 | size = self.canvas_renderer.GetSize() |
| 381 | 381 | w, h = size |
| 382 | - image = wx.EmptyImage(w, h) | |
| 382 | + image = wx.Image(w, h) | |
| 383 | 383 | image.Clear() |
| 384 | 384 | |
| 385 | 385 | arr = np.zeros((h, w, 4), dtype=np.uint8) | ... | ... |
invesalius/gui/widgets/clut_raycasting.py
| ... | ... | @@ -383,7 +383,7 @@ class CLUTRaycastingWidget(wx.Panel): |
| 383 | 383 | self.to_render = True |
| 384 | 384 | i,j = self.point_dragged |
| 385 | 385 | |
| 386 | - width, height= self.GetVirtualSizeTuple() | |
| 386 | + width, height= self.GetVirtualSize() | |
| 387 | 387 | |
| 388 | 388 | if y >= height - self.padding: |
| 389 | 389 | y = height - self.padding |
| ... | ... | @@ -525,7 +525,7 @@ class CLUTRaycastingWidget(wx.Panel): |
| 525 | 525 | x,y = node.x, node.y |
| 526 | 526 | value = node.graylevel |
| 527 | 527 | alpha = node.opacity |
| 528 | - widget_width, widget_height = self.GetVirtualSizeTuple() | |
| 528 | + widget_width, widget_height = self.GetVirtualSize() | |
| 529 | 529 | |
| 530 | 530 | font = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT) |
| 531 | 531 | font.SetWeight(wx.BOLD) |
| ... | ... | @@ -600,7 +600,7 @@ class CLUTRaycastingWidget(wx.Panel): |
| 600 | 600 | |
| 601 | 601 | def Render(self, dc): |
| 602 | 602 | ctx = wx.GraphicsContext.Create(dc) |
| 603 | - width, height= self.GetVirtualSizeTuple() | |
| 603 | + width, height= self.GetVirtualSize() | |
| 604 | 604 | height -= (self.padding * 2) |
| 605 | 605 | width -= self.padding |
| 606 | 606 | |
| ... | ... | @@ -614,7 +614,7 @@ class CLUTRaycastingWidget(wx.Panel): |
| 614 | 614 | self._draw_selected_point_text(ctx) |
| 615 | 615 | |
| 616 | 616 | def _build_histogram(self): |
| 617 | - width, height = self.GetVirtualSizeTuple() | |
| 617 | + width, height = self.GetVirtualSize() | |
| 618 | 618 | width -= self.padding |
| 619 | 619 | height -= (self.padding * 2) |
| 620 | 620 | x_init = self.Histogram.init |
| ... | ... | @@ -638,7 +638,7 @@ class CLUTRaycastingWidget(wx.Panel): |
| 638 | 638 | width = img.GetWidth() |
| 639 | 639 | height = img.GetHeight() |
| 640 | 640 | self.save_button = Button() |
| 641 | - self.save_button.image = wx.BitmapFromImage(img) | |
| 641 | + self.save_button.image = wx.Bitmap(img) | |
| 642 | 642 | self.save_button.size = (width, height) |
| 643 | 643 | |
| 644 | 644 | def __sort_pixel_points(self): |
| ... | ... | @@ -684,7 +684,7 @@ class CLUTRaycastingWidget(wx.Panel): |
| 684 | 684 | """ |
| 685 | 685 | Given a Hounsfield point returns a pixel point in the canvas. |
| 686 | 686 | """ |
| 687 | - width,height = self.GetVirtualSizeTuple() | |
| 687 | + width,height = self.GetVirtualSize() | |
| 688 | 688 | width -= (TOOLBAR_SIZE) |
| 689 | 689 | proportion = width * 1.0 / (self.end - self.init) |
| 690 | 690 | x = (graylevel - self.init) * proportion + TOOLBAR_SIZE |
| ... | ... | @@ -694,7 +694,7 @@ class CLUTRaycastingWidget(wx.Panel): |
| 694 | 694 | """ |
| 695 | 695 | Given a Opacity point returns a pixel point in the canvas. |
| 696 | 696 | """ |
| 697 | - width,height = self.GetVirtualSizeTuple() | |
| 697 | + width,height = self.GetVirtualSize() | |
| 698 | 698 | height -= (self.padding * 2) |
| 699 | 699 | y = height - (opacity * height) + self.padding |
| 700 | 700 | return y |
| ... | ... | @@ -703,7 +703,7 @@ class CLUTRaycastingWidget(wx.Panel): |
| 703 | 703 | """ |
| 704 | 704 | Translate from pixel point to Hounsfield scale. |
| 705 | 705 | """ |
| 706 | - width, height= self.GetVirtualSizeTuple() | |
| 706 | + width, height= self.GetVirtualSize() | |
| 707 | 707 | width -= (TOOLBAR_SIZE) |
| 708 | 708 | proportion = width * 1.0 / (self.end - self.init) |
| 709 | 709 | graylevel = (x - TOOLBAR_SIZE) / proportion - abs(self.init) |
| ... | ... | @@ -713,7 +713,7 @@ class CLUTRaycastingWidget(wx.Panel): |
| 713 | 713 | """ |
| 714 | 714 | Translate from pixel point to opacity. |
| 715 | 715 | """ |
| 716 | - width, height= self.GetVirtualSizeTuple() | |
| 716 | + width, height= self.GetVirtualSize() | |
| 717 | 717 | height -= (self.padding * 2) |
| 718 | 718 | opacity = (height - y + self.padding) * 1.0 / height |
| 719 | 719 | return opacity | ... | ... |
invesalius/gui/widgets/gradient.py
| 1 | 1 | # -*- coding: UTF-8 -*- |
| 2 | 2 | |
| 3 | -#-------------------------------------------------------------------------- | |
| 3 | +# -------------------------------------------------------------------------- | |
| 4 | 4 | # Software: InVesalius - Software de Reconstrucao 3D de Imagens Medicas |
| 5 | 5 | # Copyright: (C) 2001 Centro de Pesquisas Renato Archer |
| 6 | 6 | # Homepage: http://www.softwarepublico.gov.br |
| 7 | 7 | # Contact: invesalius@cti.gov.br |
| 8 | 8 | # License: GNU - GPL 2 (LICENSE.txt/LICENCA.txt) |
| 9 | -#-------------------------------------------------------------------------- | |
| 9 | +# -------------------------------------------------------------------------- | |
| 10 | 10 | # Este programa e software livre; voce pode redistribui-lo e/ou |
| 11 | 11 | # modifica-lo sob os termos da Licenca Publica Geral GNU, conforme |
| 12 | 12 | # publicada pela Free Software Foundation; de acordo com a versao 2 |
| ... | ... | @@ -17,14 +17,15 @@ |
| 17 | 17 | # COMERCIALIZACAO ou de ADEQUACAO A QUALQUER PROPOSITO EM |
| 18 | 18 | # PARTICULAR. Consulte a Licenca Publica Geral GNU para obter mais |
| 19 | 19 | # detalhes. |
| 20 | -#-------------------------------------------------------------------------- | |
| 20 | +# -------------------------------------------------------------------------- | |
| 21 | 21 | import sys |
| 22 | 22 | |
| 23 | 23 | import numpy |
| 24 | 24 | import wx |
| 25 | - | |
| 26 | 25 | from wx.lib import intctrl |
| 27 | 26 | |
| 27 | +from invesalius.gui.widgets.inv_spinctrl import InvSpinCtrl | |
| 28 | + | |
| 28 | 29 | PUSH_WIDTH = 7 |
| 29 | 30 | |
| 30 | 31 | myEVT_SLIDER_CHANGED = wx.NewEventType() |
| ... | ... | @@ -39,14 +40,16 @@ EVT_THRESHOLD_CHANGED = wx.PyEventBinder(myEVT_THRESHOLD_CHANGED, 1) |
| 39 | 40 | myEVT_THRESHOLD_CHANGING = wx.NewEventType() |
| 40 | 41 | EVT_THRESHOLD_CHANGING = wx.PyEventBinder(myEVT_THRESHOLD_CHANGING, 1) |
| 41 | 42 | |
| 43 | + | |
| 42 | 44 | class SliderEvent(wx.PyCommandEvent): |
| 43 | - def __init__(self , evtType, id, minRange, maxRange, minValue, maxValue): | |
| 44 | - wx.PyCommandEvent.__init__(self, evtType, id,) | |
| 45 | + def __init__(self, evtType, id, minRange, maxRange, minValue, maxValue): | |
| 46 | + wx.PyCommandEvent.__init__(self, evtType, id) | |
| 45 | 47 | self.min_range = minRange |
| 46 | 48 | self.max_range = maxRange |
| 47 | 49 | self.minimun = minValue |
| 48 | 50 | self.maximun = maxValue |
| 49 | 51 | |
| 52 | + | |
| 50 | 53 | class GradientSlider(wx.Panel): |
| 51 | 54 | # This widget is formed by a gradient background (black-white), two push |
| 52 | 55 | # buttons change the min and max values respectively and a slider which you can drag to |
| ... | ... | @@ -57,7 +60,7 @@ class GradientSlider(wx.Panel): |
| 57 | 60 | # minValue: the least value in the range |
| 58 | 61 | # maxValue: the most value in the range |
| 59 | 62 | # colour: colour used in this widget. |
| 60 | - super(GradientSlider, self).__init__(parent, id, size = (100, 25)) | |
| 63 | + super(GradientSlider, self).__init__(parent, id) | |
| 61 | 64 | self._bind_events_wx() |
| 62 | 65 | |
| 63 | 66 | self.min_range = minRange |
| ... | ... | @@ -75,24 +78,50 @@ class GradientSlider(wx.Panel): |
| 75 | 78 | self.Bind(wx.EVT_PAINT, self.OnPaint) |
| 76 | 79 | self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackGround) |
| 77 | 80 | |
| 78 | - if sys.platform == 'win32': | |
| 81 | + if sys.platform == "win32": | |
| 79 | 82 | self.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeaveWindow) |
| 80 | 83 | |
| 81 | 84 | self.Bind(wx.EVT_MOTION, self.OnMotion) |
| 82 | 85 | self.Bind(wx.EVT_SIZE, self.OnSize) |
| 83 | 86 | |
| 84 | 87 | def OnLeaveWindow(self, evt): |
| 88 | + if self.selected == 0: | |
| 89 | + return | |
| 90 | + | |
| 91 | + x = evt.GetX() | |
| 92 | + w, h = self.GetSize() | |
| 93 | + | |
| 94 | + if self.selected == 1: | |
| 95 | + if x - PUSH_WIDTH < 0: | |
| 96 | + x = PUSH_WIDTH | |
| 97 | + elif x >= self.max_position: | |
| 98 | + x = self.max_position | |
| 99 | + value = self._min_position_to_minimun(x) | |
| 100 | + self.minimun = value | |
| 101 | + self.min_position = x | |
| 102 | + | |
| 103 | + # The user is moving the second push (Max) | |
| 104 | + elif self.selected == 2: | |
| 105 | + if x + PUSH_WIDTH > w: | |
| 106 | + x = w - PUSH_WIDTH | |
| 107 | + elif x < self.min_position: | |
| 108 | + x = self.min_position | |
| 109 | + | |
| 110 | + value = self._max_position_to_maximun(x) | |
| 111 | + self.maximun = value | |
| 112 | + self.max_position = x | |
| 113 | + | |
| 85 | 114 | self.selected = 0 |
| 115 | + self._generate_event(myEVT_SLIDER_CHANGED) | |
| 86 | 116 | evt.Skip() |
| 87 | 117 | |
| 88 | - | |
| 89 | 118 | def OnPaint(self, evt): |
| 90 | 119 | # Where the magic happens. Here the controls are drawn. |
| 91 | 120 | dc = wx.BufferedPaintDC(self) |
| 92 | 121 | dc.Clear() |
| 93 | - | |
| 122 | + | |
| 94 | 123 | w, h = self.GetSize() |
| 95 | - width_gradient = w - 2*PUSH_WIDTH | |
| 124 | + width_gradient = w - 2 * PUSH_WIDTH | |
| 96 | 125 | height_gradient = h |
| 97 | 126 | x_init_gradient = PUSH_WIDTH |
| 98 | 127 | y_init_gradient = 0 |
| ... | ... | @@ -117,9 +146,11 @@ class GradientSlider(wx.Panel): |
| 117 | 146 | dc.DrawRectangle(x_init_gradient + width_gradient, 0, PUSH_WIDTH, h) |
| 118 | 147 | |
| 119 | 148 | # Drawing the gradient. |
| 120 | - dc.GradientFillLinear((x_init_gradient, y_init_gradient, | |
| 121 | - width_gradient, height_gradient), | |
| 122 | - (0, 0, 0), (255,255, 255)) | |
| 149 | + dc.GradientFillLinear( | |
| 150 | + (x_init_gradient, y_init_gradient, width_gradient, height_gradient), | |
| 151 | + (0, 0, 0), | |
| 152 | + (255, 255, 255), | |
| 153 | + ) | |
| 123 | 154 | |
| 124 | 155 | try: |
| 125 | 156 | n = wx.RendererNative.Get() |
| ... | ... | @@ -131,9 +162,9 @@ class GradientSlider(wx.Panel): |
| 131 | 162 | n.DrawPushButton(self, dc, (x_init_push2, 0, PUSH_WIDTH, h)) |
| 132 | 163 | |
| 133 | 164 | # Drawing the transparent slider. |
| 134 | - bytes = numpy.array(self.colour * width_transparency * h, 'B') | |
| 165 | + bytes = numpy.array(self.colour * width_transparency * h, "B") | |
| 135 | 166 | try: |
| 136 | - slider = wx.BitmapFromBufferRGBA(width_transparency, h, bytes) | |
| 167 | + slider = wx.Bitmap.FromBufferRGBA(width_transparency, h, bytes) | |
| 137 | 168 | except: |
| 138 | 169 | pass |
| 139 | 170 | else: |
| ... | ... | @@ -151,7 +182,7 @@ class GradientSlider(wx.Panel): |
| 151 | 182 | if not self.selected: |
| 152 | 183 | # The user is over a push button, change the cursor. |
| 153 | 184 | if self._is_over_what(x) in (1, 2): |
| 154 | - self.SetCursor(wx.StockCursor(wx.CURSOR_SIZEWE)) | |
| 185 | + self.SetCursor(wx.Cursor(wx.CURSOR_SIZEWE)) | |
| 155 | 186 | else: |
| 156 | 187 | self.SetCursor(wx.NullCursor) |
| 157 | 188 | |
| ... | ... | @@ -168,7 +199,7 @@ class GradientSlider(wx.Panel): |
| 168 | 199 | self.min_position = x |
| 169 | 200 | self._generate_event(myEVT_SLIDER_CHANGING) |
| 170 | 201 | self.Refresh() |
| 171 | - | |
| 202 | + | |
| 172 | 203 | # The user is moving the second push (Max) |
| 173 | 204 | elif self.selected == 2: |
| 174 | 205 | x -= self._delta |
| ... | ... | @@ -188,13 +219,13 @@ class GradientSlider(wx.Panel): |
| 188 | 219 | x -= self._delta |
| 189 | 220 | slider_size = self.max_position - self.min_position |
| 190 | 221 | diff_values = self.maximun - self.minimun |
| 191 | - | |
| 222 | + | |
| 192 | 223 | if x - PUSH_WIDTH < 0: |
| 193 | 224 | min_x = PUSH_WIDTH |
| 194 | 225 | self.minimun = self._min_position_to_minimun(min_x) |
| 195 | 226 | self.maximun = self.minimun + diff_values |
| 196 | 227 | self.CalculateControlPositions() |
| 197 | - | |
| 228 | + | |
| 198 | 229 | elif x + slider_size + PUSH_WIDTH > w: |
| 199 | 230 | max_x = w - PUSH_WIDTH |
| 200 | 231 | self.maximun = self._max_position_to_maximun(max_x) |
| ... | ... | @@ -211,7 +242,6 @@ class GradientSlider(wx.Panel): |
| 211 | 242 | self.Refresh() |
| 212 | 243 | evt.Skip() |
| 213 | 244 | |
| 214 | - | |
| 215 | 245 | def OnClick(self, evt): |
| 216 | 246 | x = evt.GetX() |
| 217 | 247 | self.selected = self._is_over_what(x) |
| ... | ... | @@ -240,34 +270,34 @@ class GradientSlider(wx.Panel): |
| 240 | 270 | widget. |
| 241 | 271 | """ |
| 242 | 272 | w, h = self.GetSize() |
| 243 | - window_width = w - 2*PUSH_WIDTH | |
| 273 | + window_width = w - 2 * PUSH_WIDTH | |
| 244 | 274 | proportion = window_width / float(self.max_range - self.min_range) |
| 245 | 275 | |
| 246 | - self.min_position = int(round((self.minimun - self.min_range) * \ | |
| 247 | - proportion)) + PUSH_WIDTH | |
| 248 | - self.max_position = int(round((self.maximun - self.min_range) * \ | |
| 249 | - proportion)) + PUSH_WIDTH | |
| 276 | + self.min_position = ( | |
| 277 | + int(round((self.minimun - self.min_range) * proportion)) + PUSH_WIDTH | |
| 278 | + ) | |
| 279 | + self.max_position = ( | |
| 280 | + int(round((self.maximun - self.min_range) * proportion)) + PUSH_WIDTH | |
| 281 | + ) | |
| 250 | 282 | |
| 251 | 283 | def _max_position_to_maximun(self, max_position): |
| 252 | - """ | |
| 284 | + """ | |
| 253 | 285 | Calculates the min and max value based on the control positions. |
| 254 | 286 | """ |
| 255 | 287 | w, h = self.GetSize() |
| 256 | - window_width = w - 2*PUSH_WIDTH | |
| 288 | + window_width = w - 2 * PUSH_WIDTH | |
| 257 | 289 | proportion = window_width / float(self.max_range - self.min_range) |
| 258 | 290 | |
| 259 | - maximun = int(round((max_position - PUSH_WIDTH)/proportion + \ | |
| 260 | - self.min_range)) | |
| 291 | + maximun = int(round((max_position - PUSH_WIDTH) / proportion + self.min_range)) | |
| 261 | 292 | |
| 262 | 293 | return maximun |
| 263 | 294 | |
| 264 | 295 | def _min_position_to_minimun(self, min_position): |
| 265 | 296 | w, h = self.GetSize() |
| 266 | - window_width = w - 2*PUSH_WIDTH | |
| 297 | + window_width = w - 2 * PUSH_WIDTH | |
| 267 | 298 | proportion = window_width / float(self.max_range - self.min_range) |
| 268 | 299 | |
| 269 | - minimun = int(round((min_position - PUSH_WIDTH)/proportion + \ | |
| 270 | - self.min_range)) | |
| 300 | + minimun = int(round((min_position - PUSH_WIDTH) / proportion + self.min_range)) | |
| 271 | 301 | |
| 272 | 302 | return minimun |
| 273 | 303 | |
| ... | ... | @@ -313,18 +343,20 @@ class GradientSlider(wx.Panel): |
| 313 | 343 | return self.minimun |
| 314 | 344 | |
| 315 | 345 | def _generate_event(self, event): |
| 316 | - evt = SliderEvent(event, self.GetId(), self.min_range, | |
| 317 | - self.max_range, self.minimun, self.maximun) | |
| 346 | + evt = SliderEvent( | |
| 347 | + event, | |
| 348 | + self.GetId(), | |
| 349 | + self.min_range, | |
| 350 | + self.max_range, | |
| 351 | + self.minimun, | |
| 352 | + self.maximun, | |
| 353 | + ) | |
| 318 | 354 | self.GetEventHandler().ProcessEvent(evt) |
| 319 | 355 | |
| 320 | 356 | |
| 321 | 357 | class GradientCtrl(wx.Panel): |
| 322 | 358 | def __init__(self, parent, id, minRange, maxRange, minValue, maxValue, colour): |
| 323 | 359 | super(GradientCtrl, self).__init__(parent, id) |
| 324 | - self.sizer = wx.BoxSizer(wx.HORIZONTAL) | |
| 325 | - self.SetSizer(self.sizer) | |
| 326 | - self.sizer.Fit(self) | |
| 327 | - self.SetAutoLayout(1) | |
| 328 | 360 | self.min_range = minRange |
| 329 | 361 | self.max_range = maxRange |
| 330 | 362 | self.minimun = minValue |
| ... | ... | @@ -336,43 +368,56 @@ class GradientCtrl(wx.Panel): |
| 336 | 368 | self.Show() |
| 337 | 369 | |
| 338 | 370 | def _draw_controls(self): |
| 339 | - self.gradient_slider = GradientSlider(self, -1, self.min_range, | |
| 340 | - self.max_range, self.minimun, | |
| 341 | - self.maximun, self.colour) | |
| 342 | - | |
| 343 | - self.spin_min = intctrl.IntCtrl(self, size=(40,20), | |
| 344 | - style=wx.TE_PROCESS_ENTER) | |
| 345 | - self.spin_min.SetValue(self.minimun) | |
| 346 | - if sys.platform != 'win32': | |
| 371 | + self.gradient_slider = GradientSlider( | |
| 372 | + self, | |
| 373 | + -1, | |
| 374 | + self.min_range, | |
| 375 | + self.max_range, | |
| 376 | + self.minimun, | |
| 377 | + self.maximun, | |
| 378 | + self.colour, | |
| 379 | + ) | |
| 380 | + | |
| 381 | + self.spin_min = InvSpinCtrl( | |
| 382 | + self, | |
| 383 | + value=self.minimun, | |
| 384 | + min_value=self.min_range, | |
| 385 | + max_value=self.max_range, | |
| 386 | + spin_button=False, | |
| 387 | + ) | |
| 388 | + if sys.platform != "win32": | |
| 347 | 389 | self.spin_min.SetWindowVariant(wx.WINDOW_VARIANT_SMALL) |
| 348 | 390 | |
| 349 | - self.spin_max = intctrl.IntCtrl(self, size=(40,20), | |
| 350 | - style=wx.TE_PROCESS_ENTER) | |
| 351 | - self.spin_max.SetValue(self.maximun) | |
| 352 | - if sys.platform != 'win32': | |
| 391 | + self.spin_max = InvSpinCtrl( | |
| 392 | + self, | |
| 393 | + value=self.maximun, | |
| 394 | + min_value=self.min_range, | |
| 395 | + max_value=self.max_range, | |
| 396 | + spin_button=False, | |
| 397 | + ) | |
| 398 | + if sys.platform != "win32": | |
| 353 | 399 | self.spin_max.SetWindowVariant(wx.WINDOW_VARIANT_SMALL) |
| 354 | 400 | |
| 401 | + self.spin_min.CalcSizeFromTextSize() | |
| 402 | + self.spin_max.CalcSizeFromTextSize() | |
| 403 | + | |
| 355 | 404 | sizer = wx.BoxSizer(wx.HORIZONTAL) |
| 356 | - sizer.Add(self.spin_min, 0, wx.EXPAND | wx.RIGHT, 2) | |
| 405 | + sizer.Add(self.spin_min, 0, wx.RIGHT, 2) | |
| 357 | 406 | sizer.Add(self.gradient_slider, 1, wx.EXPAND) |
| 358 | - sizer.Add(self.spin_max, 0, wx.EXPAND | wx.LEFT, 2) | |
| 407 | + sizer.Add(self.spin_max, 0, wx.LEFT, 2) | |
| 408 | + | |
| 409 | + self.sizer = wx.BoxSizer(wx.HORIZONTAL) | |
| 359 | 410 | self.sizer.Add(sizer, 1, wx.EXPAND) |
| 411 | + self.SetSizer(self.sizer) | |
| 412 | + self.sizer.Fit(self) | |
| 413 | + # self.SetAutoLayout(1) | |
| 360 | 414 | |
| 361 | 415 | def _bind_events_wx(self): |
| 362 | 416 | self.gradient_slider.Bind(EVT_SLIDER_CHANGING, self.OnSliding) |
| 363 | 417 | self.gradient_slider.Bind(EVT_SLIDER_CHANGED, self.OnSlider) |
| 364 | 418 | |
| 365 | - # self.spin_min.Bind(wx.lib.intctrl.EVT_INT, self.ChangeMinValue) | |
| 366 | - self.spin_min.Bind(wx.EVT_LEAVE_WINDOW, self._FireSpinMinChange) | |
| 367 | - self.spin_min.Bind(wx.EVT_KILL_FOCUS, self._FireSpinMinChange) | |
| 368 | - #self.spin_min.Bind(wx.EVT_KEY_DOWN, self._FireSpinMinChange) | |
| 369 | - self.spin_min.Bind(wx.EVT_MOUSEWHEEL, self.OnMinMouseWheel) | |
| 370 | - | |
| 371 | - # self.spin_max.Bind(wx.lib.intctrl.EVT_INT, self.ChangeMaxValue) | |
| 372 | - self.spin_max.Bind(wx.EVT_LEAVE_WINDOW, self._FireSpinMaxChange) | |
| 373 | - self.spin_max.Bind(wx.EVT_KILL_FOCUS, self._FireSpinMaxChange) | |
| 374 | - #self.spin_max.Bind(wx.EVT_KEY_DOWN, self._FireSpinMaxChange) | |
| 375 | - self.spin_max.Bind(wx.EVT_MOUSEWHEEL, self.OnMaxMouseWheel) | |
| 419 | + self.spin_min.Bind(wx.EVT_SPINCTRL, self.OnMinMouseWheel) | |
| 420 | + self.spin_max.Bind(wx.EVT_SPINCTRL, self.OnMaxMouseWheel) | |
| 376 | 421 | |
| 377 | 422 | def OnSlider(self, evt): |
| 378 | 423 | self.spin_min.SetValue(evt.minimun) |
| ... | ... | @@ -419,23 +464,23 @@ class GradientCtrl(wx.Panel): |
| 419 | 464 | self._GenerateEvent(myEVT_THRESHOLD_CHANGED) |
| 420 | 465 | |
| 421 | 466 | def OnMinMouseWheel(self, e): |
| 422 | - """ | |
| 467 | + """ | |
| 423 | 468 | When the user wheel the mouse over min texbox |
| 424 | 469 | """ |
| 425 | - v = self.GetMinValue() + e.GetWheelRotation()/e.GetWheelDelta() | |
| 470 | + v = self.spin_min.GetValue() | |
| 426 | 471 | self.SetMinValue(v) |
| 427 | 472 | self._GenerateEvent(myEVT_THRESHOLD_CHANGING) |
| 428 | 473 | |
| 429 | 474 | def OnMaxMouseWheel(self, e): |
| 430 | - """ | |
| 475 | + """ | |
| 431 | 476 | When the user wheel the mouse over max texbox |
| 432 | 477 | """ |
| 433 | - v = self.GetMaxValue() + e.GetWheelRotation()/e.GetWheelDelta() | |
| 478 | + v = self.spin_max.GetValue() | |
| 434 | 479 | self.SetMaxValue(v) |
| 435 | 480 | self._GenerateEvent(myEVT_THRESHOLD_CHANGING) |
| 436 | 481 | |
| 437 | 482 | def SetColour(self, colour): |
| 438 | - colour = list(colour[:3]) + [90,] | |
| 483 | + colour = list(colour[:3]) + [90] | |
| 439 | 484 | self.colour = colour |
| 440 | 485 | self.gradient_slider.SetColour(colour) |
| 441 | 486 | self.gradient_slider.Refresh() |
| ... | ... | @@ -443,24 +488,40 @@ class GradientCtrl(wx.Panel): |
| 443 | 488 | def SetMaxRange(self, value): |
| 444 | 489 | self.spin_min.SetMax(value) |
| 445 | 490 | self.spin_max.SetMax(value) |
| 491 | + self.spin_min.CalcSizeFromTextSize() | |
| 492 | + self.spin_max.CalcSizeFromTextSize() | |
| 446 | 493 | self.gradient_slider.SetMaxRange(value) |
| 447 | 494 | self.max_range = value |
| 448 | 495 | if value > self.max_range: |
| 449 | 496 | value = self.max_range |
| 450 | 497 | |
| 498 | + self.spin_min.CalcSizeFromTextSize() | |
| 499 | + self.spin_max.CalcSizeFromTextSize() | |
| 500 | + self.Layout() | |
| 501 | + | |
| 451 | 502 | def SetMinRange(self, value): |
| 452 | 503 | self.spin_min.SetMin(value) |
| 453 | 504 | self.spin_max.SetMin(value) |
| 505 | + self.spin_min.CalcSizeFromTextSize() | |
| 506 | + self.spin_max.CalcSizeFromTextSize() | |
| 454 | 507 | self.gradient_slider.SetMinRange(value) |
| 455 | 508 | self.min_range = value |
| 456 | 509 | if value < self.min_range: |
| 457 | 510 | value = self.min_range |
| 458 | 511 | |
| 512 | + self.spin_min.CalcSizeFromTextSize() | |
| 513 | + self.spin_max.CalcSizeFromTextSize() | |
| 514 | + self.Layout() | |
| 515 | + | |
| 459 | 516 | def SetMaxValue(self, value): |
| 460 | 517 | if value is not None: |
| 461 | 518 | value = int(value) |
| 462 | 519 | if value > self.max_range: |
| 463 | 520 | value = int(self.max_range) |
| 521 | + if value < self.min_range: | |
| 522 | + value = int(self.min_range) | |
| 523 | + if value < self.minimun: | |
| 524 | + value = int(self.minimun) | |
| 464 | 525 | self.spin_max.SetValue(value) |
| 465 | 526 | self.gradient_slider.SetMaximun(value) |
| 466 | 527 | self.maximun = value |
| ... | ... | @@ -470,6 +531,10 @@ class GradientCtrl(wx.Panel): |
| 470 | 531 | value = int(value) |
| 471 | 532 | if value < self.min_range: |
| 472 | 533 | value = int(self.min_range) |
| 534 | + if value > self.max_range: | |
| 535 | + value = int(self.max_range) | |
| 536 | + if value > self.maximun: | |
| 537 | + value = int(self.maximun) | |
| 473 | 538 | self.spin_min.SetValue(value) |
| 474 | 539 | self.gradient_slider.SetMinimun(value) |
| 475 | 540 | self.minimun = value |
| ... | ... | @@ -497,9 +562,15 @@ class GradientCtrl(wx.Panel): |
| 497 | 562 | def _GenerateEvent(self, event): |
| 498 | 563 | if event == myEVT_THRESHOLD_CHANGING: |
| 499 | 564 | self.changed = True |
| 500 | - elif event == myEVT_THRESHOLD_CHANGED : | |
| 565 | + elif event == myEVT_THRESHOLD_CHANGED: | |
| 501 | 566 | self.changed = False |
| 502 | 567 | |
| 503 | - evt = SliderEvent(event, self.GetId(), self.min_range, | |
| 504 | - self.max_range, self.minimun, self.maximun) | |
| 568 | + evt = SliderEvent( | |
| 569 | + event, | |
| 570 | + self.GetId(), | |
| 571 | + self.min_range, | |
| 572 | + self.max_range, | |
| 573 | + self.minimun, | |
| 574 | + self.maximun, | |
| 575 | + ) | |
| 505 | 576 | self.GetEventHandler().ProcessEvent(evt) | ... | ... |
| ... | ... | @@ -0,0 +1,331 @@ |
| 1 | +# -------------------------------------------------------------------------- | |
| 2 | +# Software: InVesalius - Software de Reconstrucao 3D de Imagens Medicas | |
| 3 | +# Copyright: (C) 2001 Centro de Pesquisas Renato Archer | |
| 4 | +# Homepage: http://www.softwarepublico.gov.br | |
| 5 | +# Contact: invesalius@cti.gov.br | |
| 6 | +# License: GNU - GPL 2 (LICENSE.txt/LICENCA.txt) | |
| 7 | +# -------------------------------------------------------------------------- | |
| 8 | +# Este programa e software livre; voce pode redistribui-lo e/ou | |
| 9 | +# modifica-lo sob os termos da Licenca Publica Geral GNU, conforme | |
| 10 | +# publicada pela Free Software Foundation; de acordo com a versao 2 | |
| 11 | +# da Licenca. | |
| 12 | +# | |
| 13 | +# Este programa eh distribuido na expectativa de ser util, mas SEM | |
| 14 | +# QUALQUER GARANTIA; sem mesmo a garantia implicita de | |
| 15 | +# COMERCIALIZACAO ou de ADEQUACAO A QUALQUER PROPOSITO EM | |
| 16 | +# PARTICULAR. Consulte a Licenca Publica Geral GNU para obter mais | |
| 17 | +# detalhes. | |
| 18 | +# -------------------------------------------------------------------------- | |
| 19 | +import decimal | |
| 20 | + | |
| 21 | +import wx | |
| 22 | + | |
| 23 | + | |
| 24 | +class InvSpinCtrl(wx.Panel): | |
| 25 | + def __init__( | |
| 26 | + self, | |
| 27 | + parent, | |
| 28 | + id=wx.ID_ANY, | |
| 29 | + value=0, | |
| 30 | + min_value=1, | |
| 31 | + max_value=100, | |
| 32 | + increment=1, | |
| 33 | + spin_button=True, | |
| 34 | + size=wx.DefaultSize, | |
| 35 | + style=wx.TE_RIGHT, | |
| 36 | + ): | |
| 37 | + super().__init__(parent, id, size=size) | |
| 38 | + | |
| 39 | + self._textctrl = wx.TextCtrl(self, -1, style=style) | |
| 40 | + if spin_button and wx.Platform != "__WXGTK__": | |
| 41 | + self._spinbtn = wx.SpinButton(self, -1) | |
| 42 | + else: | |
| 43 | + self._spinbtn = None | |
| 44 | + | |
| 45 | + self._value = 0 | |
| 46 | + self._last_value = 0 | |
| 47 | + self._min_value = 0 | |
| 48 | + self._max_value = 100 | |
| 49 | + self._increment = 1 | |
| 50 | + | |
| 51 | + self.SetMin(min_value) | |
| 52 | + self.SetMax(max_value) | |
| 53 | + self.SetValue(value) | |
| 54 | + self.SetIncrement(increment) | |
| 55 | + | |
| 56 | + sizer = wx.BoxSizer(wx.HORIZONTAL) | |
| 57 | + sizer.Add(self._textctrl, 1, wx.EXPAND) | |
| 58 | + if self._spinbtn: | |
| 59 | + sizer.Add(self._spinbtn, 0, wx.EXPAND) | |
| 60 | + | |
| 61 | + self.SetSizer(sizer) | |
| 62 | + sizer.Fit(self) | |
| 63 | + | |
| 64 | + self.__bind_events() | |
| 65 | + | |
| 66 | + def __bind_events(self): | |
| 67 | + self.Bind(wx.EVT_MOUSEWHEEL, self.OnMouseWheel) | |
| 68 | + self._textctrl.Bind(wx.EVT_KILL_FOCUS, self.OnKillFocus) | |
| 69 | + if self._spinbtn: | |
| 70 | + self._spinbtn.Bind(wx.EVT_SPIN_UP, self.OnSpinUp) | |
| 71 | + self._spinbtn.Bind(wx.EVT_SPIN_DOWN, self.OnSpinDown) | |
| 72 | + | |
| 73 | + def SetIncrement(self, increment): | |
| 74 | + self._increment = increment | |
| 75 | + | |
| 76 | + def SetMin(self, min_value): | |
| 77 | + self._min_value = min_value | |
| 78 | + self.SetValue(self._value) | |
| 79 | + | |
| 80 | + def SetMax(self, max_value): | |
| 81 | + self._max_value = max_value | |
| 82 | + self.SetValue(self._value) | |
| 83 | + | |
| 84 | + def SetRange(self, min_value, max_value): | |
| 85 | + self.SetMin(min_value) | |
| 86 | + self.SetMax(max_value) | |
| 87 | + | |
| 88 | + def GetValue(self): | |
| 89 | + return self._value | |
| 90 | + | |
| 91 | + def SetValue(self, value): | |
| 92 | + try: | |
| 93 | + value = int(value) | |
| 94 | + except ValueError: | |
| 95 | + value = self._last_value | |
| 96 | + | |
| 97 | + if value < self._min_value: | |
| 98 | + value = self._min_value | |
| 99 | + | |
| 100 | + if value > self._max_value: | |
| 101 | + value = self._max_value | |
| 102 | + | |
| 103 | + self._value = value | |
| 104 | + self._textctrl.SetValue("{}".format(self._value)) | |
| 105 | + self._last_value = self._value | |
| 106 | + | |
| 107 | + def CalcSizeFromTextSize(self, text=None): | |
| 108 | + # To calculate best width to spinctrl | |
| 109 | + if text is None: | |
| 110 | + text = "{}".format( | |
| 111 | + max(len(str(self._max_value)), len(str(self._min_value))) * "M" | |
| 112 | + ) | |
| 113 | + | |
| 114 | + dc = wx.WindowDC(self) | |
| 115 | + dc.SetFont(self.GetFont()) | |
| 116 | + width, height = dc.GetTextExtent(text) | |
| 117 | + | |
| 118 | + if self._spinbtn: | |
| 119 | + spin = wx.SpinCtrl(self, -1) | |
| 120 | + spin_width, spin_height = spin.GetBestSize() | |
| 121 | + spin.Destroy() | |
| 122 | + | |
| 123 | + spinb = wx.SpinButton(self, -1) | |
| 124 | + spinb_width, spinb_height = spinb.GetBestSize() | |
| 125 | + spinb.Destroy() | |
| 126 | + | |
| 127 | + width += spinb_width | |
| 128 | + if wx.Platform == "__WXMAC": | |
| 129 | + height = max(height, spin_height, spinb_height) | |
| 130 | + else: | |
| 131 | + height = spin_height | |
| 132 | + else: | |
| 133 | + height = -1 | |
| 134 | + | |
| 135 | + self.SetMinSize((width, height)) | |
| 136 | + self.Layout() | |
| 137 | + | |
| 138 | + def OnMouseWheel(self, evt): | |
| 139 | + r = evt.GetWheelRotation() | |
| 140 | + if r > 0: | |
| 141 | + self.SetValue(self.GetValue() + self._increment) | |
| 142 | + else: | |
| 143 | + self.SetValue(self.GetValue() - self._increment) | |
| 144 | + self.raise_event() | |
| 145 | + evt.Skip() | |
| 146 | + | |
| 147 | + def OnKillFocus(self, evt): | |
| 148 | + value = self._textctrl.GetValue() | |
| 149 | + self.SetValue(value) | |
| 150 | + self.raise_event() | |
| 151 | + evt.Skip() | |
| 152 | + | |
| 153 | + def OnSpinDown(self, evt): | |
| 154 | + self.SetValue(self.GetValue() - self._increment) | |
| 155 | + self.raise_event() | |
| 156 | + evt.Skip() | |
| 157 | + | |
| 158 | + def OnSpinUp(self, evt): | |
| 159 | + self.SetValue(self.GetValue() + self._increment) | |
| 160 | + self.raise_event() | |
| 161 | + evt.Skip() | |
| 162 | + | |
| 163 | + def raise_event(self): | |
| 164 | + event = wx.PyCommandEvent(wx.EVT_SPINCTRL.typeId, self.GetId()) | |
| 165 | + self.GetEventHandler().ProcessEvent(event) | |
| 166 | + | |
| 167 | + | |
| 168 | +class InvFloatSpinCtrl(wx.Panel): | |
| 169 | + def __init__( | |
| 170 | + self, | |
| 171 | + parent, | |
| 172 | + id=wx.ID_ANY, | |
| 173 | + value=0.0, | |
| 174 | + min_value=1.0, | |
| 175 | + max_value=100.0, | |
| 176 | + increment=0.1, | |
| 177 | + digits=1, | |
| 178 | + spin_button=True, | |
| 179 | + size=wx.DefaultSize, | |
| 180 | + style=wx.TE_RIGHT, | |
| 181 | + ): | |
| 182 | + super().__init__(parent, id, size=size) | |
| 183 | + | |
| 184 | + self._textctrl = wx.TextCtrl(self, -1, style=style) | |
| 185 | + if spin_button and wx.Platform != "__WXGTK__": | |
| 186 | + self._spinbtn = wx.SpinButton(self, -1) | |
| 187 | + else: | |
| 188 | + self._spinbtn = None | |
| 189 | + | |
| 190 | + self._digits = digits | |
| 191 | + self._dec_context = decimal.Context(prec=digits) | |
| 192 | + | |
| 193 | + self._value = decimal.Decimal("0", self._dec_context) | |
| 194 | + self._last_value = self._value | |
| 195 | + self._min_value = decimal.Decimal("0", self._dec_context) | |
| 196 | + self._max_value = decimal.Decimal("100", self._dec_context) | |
| 197 | + self._increment = decimal.Decimal("0.1", self._dec_context) | |
| 198 | + | |
| 199 | + self.SetIncrement(increment) | |
| 200 | + self.SetMin(min_value) | |
| 201 | + self.SetMax(max_value) | |
| 202 | + self.SetValue(value) | |
| 203 | + | |
| 204 | + sizer = wx.BoxSizer(wx.HORIZONTAL) | |
| 205 | + sizer.Add(self._textctrl, 1, wx.EXPAND) | |
| 206 | + if self._spinbtn: | |
| 207 | + sizer.Add(self._spinbtn, 0, wx.EXPAND) | |
| 208 | + | |
| 209 | + self.SetSizer(sizer) | |
| 210 | + sizer.Fit(self) | |
| 211 | + | |
| 212 | + self.__bind_events() | |
| 213 | + | |
| 214 | + def __bind_events(self): | |
| 215 | + self.Bind(wx.EVT_MOUSEWHEEL, self.OnMouseWheel) | |
| 216 | + self._textctrl.Bind(wx.EVT_KILL_FOCUS, self.OnKillFocus) | |
| 217 | + if self._spinbtn: | |
| 218 | + self._spinbtn.Bind(wx.EVT_SPIN_UP, self.OnSpinUp) | |
| 219 | + self._spinbtn.Bind(wx.EVT_SPIN_DOWN, self.OnSpinDown) | |
| 220 | + | |
| 221 | + def _to_decimal(self, value): | |
| 222 | + if not isinstance(value, str): | |
| 223 | + value = "{:.{digits}f}".format(value, digits=self._digits) | |
| 224 | + return decimal.Decimal(value, self._dec_context) | |
| 225 | + | |
| 226 | + def SetDigits(self, digits): | |
| 227 | + self._digits = digits | |
| 228 | + self._dec_context = decimal.Context(prec=digits) | |
| 229 | + | |
| 230 | + self.SetIncrement(self._increment) | |
| 231 | + self.SetMin(self._min_value) | |
| 232 | + self.SetMax(self._max_value) | |
| 233 | + self.SetValue(self._value) | |
| 234 | + | |
| 235 | + def SetIncrement(self, increment): | |
| 236 | + self._increment = self._to_decimal(increment) | |
| 237 | + | |
| 238 | + def SetMin(self, min_value): | |
| 239 | + self._min_value = self._to_decimal(min_value) | |
| 240 | + self.SetValue(self._value) | |
| 241 | + | |
| 242 | + def SetMax(self, max_value): | |
| 243 | + self._max_value = self._to_decimal(max_value) | |
| 244 | + self.SetValue(self._value) | |
| 245 | + | |
| 246 | + def SetRange(self, min_value, max_value): | |
| 247 | + self.SetMin(min_value) | |
| 248 | + self.SetMax(max_value) | |
| 249 | + | |
| 250 | + def GetValue(self): | |
| 251 | + return float(self._value) | |
| 252 | + | |
| 253 | + def SetValue(self, value): | |
| 254 | + try: | |
| 255 | + value = self._to_decimal(value) | |
| 256 | + except decimal.InvalidOperation: | |
| 257 | + value = self._last_value | |
| 258 | + | |
| 259 | + if value < self._min_value: | |
| 260 | + value = self._min_value | |
| 261 | + | |
| 262 | + if value > self._max_value: | |
| 263 | + value = self._max_value | |
| 264 | + | |
| 265 | + self._value = value | |
| 266 | + self._textctrl.SetValue("{}".format(self._value)) | |
| 267 | + self._last_value = self._value | |
| 268 | + | |
| 269 | + def CalcSizeFromTextSize(self, text=None): | |
| 270 | + # To calculate best width to spinctrl | |
| 271 | + if text is None: | |
| 272 | + text = "{}".format( | |
| 273 | + max(len(str(self._max_value)), len(str(self._min_value))) * "M" | |
| 274 | + ) | |
| 275 | + | |
| 276 | + dc = wx.WindowDC(self) | |
| 277 | + dc.SetFont(self.GetFont()) | |
| 278 | + width, height = dc.GetTextExtent(text) | |
| 279 | + | |
| 280 | + spin = wx.SpinCtrl(self, -1) | |
| 281 | + spin_width, spin_height = spin.GetBestSize() | |
| 282 | + spin.Destroy() | |
| 283 | + | |
| 284 | + if self._spinbtn: | |
| 285 | + spin = wx.SpinCtrl(self, -1) | |
| 286 | + spin_width, spin_height = spin.GetBestSize() | |
| 287 | + spin.Destroy() | |
| 288 | + | |
| 289 | + spinb = wx.SpinButton(self, -1) | |
| 290 | + spinb_width, spinb_height = spinb.GetBestSize() | |
| 291 | + spinb.Destroy() | |
| 292 | + | |
| 293 | + width += spinb_width | |
| 294 | + if wx.Platform == "__WXMAC": | |
| 295 | + height = max(height, spin_height, spinb_height) | |
| 296 | + else: | |
| 297 | + height = spin_height | |
| 298 | + else: | |
| 299 | + height = -1 | |
| 300 | + | |
| 301 | + self.SetMinSize((width, height)) | |
| 302 | + self.Layout() | |
| 303 | + | |
| 304 | + def OnMouseWheel(self, evt): | |
| 305 | + r = evt.GetWheelRotation() | |
| 306 | + if r > 0: | |
| 307 | + self.SetValue(self._value + self._increment) | |
| 308 | + else: | |
| 309 | + self.SetValue(self._value - self._increment) | |
| 310 | + self.raise_event() | |
| 311 | + evt.Skip() | |
| 312 | + | |
| 313 | + def OnKillFocus(self, evt): | |
| 314 | + value = self._textctrl.GetValue() | |
| 315 | + self.SetValue(value) | |
| 316 | + self.raise_event() | |
| 317 | + evt.Skip() | |
| 318 | + | |
| 319 | + def OnSpinDown(self, evt): | |
| 320 | + self.SetValue(self._value - self._increment) | |
| 321 | + self.raise_event() | |
| 322 | + evt.Skip() | |
| 323 | + | |
| 324 | + def OnSpinUp(self, evt): | |
| 325 | + self.SetValue(self._value + self._increment) | |
| 326 | + self.raise_event() | |
| 327 | + evt.Skip() | |
| 328 | + | |
| 329 | + def raise_event(self): | |
| 330 | + event = wx.PyCommandEvent(wx.EVT_SPINCTRL.typeId, self.GetId()) | |
| 331 | + self.GetEventHandler().ProcessEvent(event) | ... | ... |
invesalius/gui/widgets/listctrl.py
| ... | ... | @@ -739,7 +739,7 @@ class TextEditMixin: |
| 739 | 739 | # data source |
| 740 | 740 | self.SetVirtualData(self.curRow, self.curCol, text) |
| 741 | 741 | else: |
| 742 | - self.SetStringItem(self.curRow, self.curCol, text) | |
| 742 | + self.SetItem(self.curRow, self.curCol, text) | |
| 743 | 743 | self.RefreshItem(self.curRow) |
| 744 | 744 | |
| 745 | 745 | def _SelectIndex(self, row): | ... | ... |
invesalius/gui/widgets/slice_menu.py
| ... | ... | @@ -57,14 +57,14 @@ class SliceMenu(wx.Menu): |
| 57 | 57 | new_id = self.id_wl_first = wx.NewId() |
| 58 | 58 | wl_item = wx.MenuItem(submenu_wl, new_id,\ |
| 59 | 59 | _('Default'), kind=wx.ITEM_RADIO) |
| 60 | - submenu_wl.AppendItem(wl_item) | |
| 60 | + submenu_wl.Append(wl_item) | |
| 61 | 61 | self.ID_TO_TOOL_ITEM[new_id] = wl_item |
| 62 | 62 | |
| 63 | 63 | #Case the user change window and level |
| 64 | 64 | new_id = self.other_wl_id = wx.NewId() |
| 65 | 65 | wl_item = wx.MenuItem(submenu_wl, new_id,\ |
| 66 | 66 | _('Manual'), kind=wx.ITEM_RADIO) |
| 67 | - submenu_wl.AppendItem(wl_item) | |
| 67 | + submenu_wl.Append(wl_item) | |
| 68 | 68 | self.ID_TO_TOOL_ITEM[new_id] = wl_item |
| 69 | 69 | |
| 70 | 70 | for name in sorted(const.WINDOW_LEVEL): |
| ... | ... | @@ -72,7 +72,7 @@ class SliceMenu(wx.Menu): |
| 72 | 72 | new_id = wx.NewId() |
| 73 | 73 | wl_item = wx.MenuItem(submenu_wl, new_id,\ |
| 74 | 74 | name, kind=wx.ITEM_RADIO) |
| 75 | - submenu_wl.AppendItem(wl_item) | |
| 75 | + submenu_wl.Append(wl_item) | |
| 76 | 76 | self.ID_TO_TOOL_ITEM[new_id] = wl_item |
| 77 | 77 | |
| 78 | 78 | #----------- Sub menu of the save and load options --------- |
| ... | ... | @@ -84,7 +84,7 @@ class SliceMenu(wx.Menu): |
| 84 | 84 | # new_id = wx.NewId() |
| 85 | 85 | # wl_item = wx.MenuItem(submenu_wl, new_id,\ |
| 86 | 86 | # name) |
| 87 | - # submenu_wl.AppendItem(wl_item) | |
| 87 | + # submenu_wl.Append(wl_item) | |
| 88 | 88 | # self.ID_TO_TOOL_ITEM[new_id] = wl_item |
| 89 | 89 | |
| 90 | 90 | |
| ... | ... | @@ -100,7 +100,7 @@ class SliceMenu(wx.Menu): |
| 100 | 100 | new_id = self.id_pseudo_first = wx.NewId() |
| 101 | 101 | color_item = wx.MenuItem(submenu_pseudo_colours, new_id,\ |
| 102 | 102 | _("Default "), kind=mkind) |
| 103 | - submenu_pseudo_colours.AppendItem(color_item) | |
| 103 | + submenu_pseudo_colours.Append(color_item) | |
| 104 | 104 | color_item.Check(1) |
| 105 | 105 | self.ID_TO_TOOL_ITEM[new_id] = color_item |
| 106 | 106 | self.pseudo_color_items[new_id] = color_item |
| ... | ... | @@ -110,7 +110,7 @@ class SliceMenu(wx.Menu): |
| 110 | 110 | new_id = wx.NewId() |
| 111 | 111 | color_item = wx.MenuItem(submenu_wl, new_id,\ |
| 112 | 112 | name, kind=mkind) |
| 113 | - submenu_pseudo_colours.AppendItem(color_item) | |
| 113 | + submenu_pseudo_colours.Append(color_item) | |
| 114 | 114 | self.ID_TO_TOOL_ITEM[new_id] = color_item |
| 115 | 115 | self.pseudo_color_items[new_id] = color_item |
| 116 | 116 | |
| ... | ... | @@ -119,14 +119,14 @@ class SliceMenu(wx.Menu): |
| 119 | 119 | new_id = wx.NewId() |
| 120 | 120 | color_item = wx.MenuItem(submenu_wl, new_id, name, |
| 121 | 121 | kind=mkind) |
| 122 | - submenu_pseudo_colours.AppendItem(color_item) | |
| 122 | + submenu_pseudo_colours.Append(color_item) | |
| 123 | 123 | self.ID_TO_TOOL_ITEM[new_id] = color_item |
| 124 | 124 | self.pseudo_color_items[new_id] = color_item |
| 125 | 125 | |
| 126 | 126 | new_id = wx.NewId() |
| 127 | 127 | color_item = wx.MenuItem(submenu_wl, new_id, _('Custom'), |
| 128 | 128 | kind=mkind) |
| 129 | - submenu_pseudo_colours.AppendItem(color_item) | |
| 129 | + submenu_pseudo_colours.Append(color_item) | |
| 130 | 130 | self.ID_TO_TOOL_ITEM[new_id] = color_item |
| 131 | 131 | self.pseudo_color_items[new_id] = color_item |
| 132 | 132 | |
| ... | ... | @@ -137,7 +137,7 @@ class SliceMenu(wx.Menu): |
| 137 | 137 | new_id = wx.NewId() |
| 138 | 138 | projection_item = wx.MenuItem(submenu_projection, new_id, name, |
| 139 | 139 | kind=wx.ITEM_RADIO) |
| 140 | - submenu_projection.AppendItem(projection_item) | |
| 140 | + submenu_projection.Append(projection_item) | |
| 141 | 141 | self.ID_TO_TOOL_ITEM[new_id] = projection_item |
| 142 | 142 | self.projection_items[PROJECTIONS_ID[name]] = projection_item |
| 143 | 143 | |
| ... | ... | @@ -148,7 +148,7 @@ class SliceMenu(wx.Menu): |
| 148 | 148 | new_id = wx.NewId() |
| 149 | 149 | image_tiling_item = wx.MenuItem(submenu_image_tiling, new_id,\ |
| 150 | 150 | name, kind=wx.ITEM_RADIO) |
| 151 | - submenu_image_tiling.AppendItem(image_tiling_item) | |
| 151 | + submenu_image_tiling.Append(image_tiling_item) | |
| 152 | 152 | self.ID_TO_TOOL_ITEM[new_id] = image_tiling_item |
| 153 | 153 | |
| 154 | 154 | #Save first id item |
| ... | ... | @@ -157,10 +157,10 @@ class SliceMenu(wx.Menu): |
| 157 | 157 | flag_tiling = True |
| 158 | 158 | |
| 159 | 159 | # Add sub itens in the menu |
| 160 | - self.AppendMenu(-1, _("Window width and level"), submenu_wl) | |
| 161 | - self.AppendMenu(-1, _("Pseudo color"), submenu_pseudo_colours) | |
| 162 | - self.AppendMenu(-1, _("Projection type"), submenu_projection) | |
| 163 | - ###self.AppendMenu(-1, _("Image Tiling"), submenu_image_tiling) | |
| 160 | + self.Append(-1, _("Window width and level"), submenu_wl) | |
| 161 | + self.Append(-1, _("Pseudo color"), submenu_pseudo_colours) | |
| 162 | + self.Append(-1, _("Projection type"), submenu_projection) | |
| 163 | + ###self.Append(-1, _("Image Tiling"), submenu_image_tiling) | |
| 164 | 164 | |
| 165 | 165 | # It doesn't work in Linux |
| 166 | 166 | self.Bind(wx.EVT_MENU, self.OnPopup) | ... | ... |