Commit dc6fb66558962f136f708ffa20cd292240b9b932

Authored by tatiana
1 parent 9716c1f9

ADD: New mask dialog and slice creation, based on threshold and colour

invesalius/constants.py
@@ -28,7 +28,7 @@ from project import Project @@ -28,7 +28,7 @@ from project import Project
28 #--------------- 28 #---------------
29 29
30 # Measurements 30 # Measurements
31 -MEASURE_NAME_PATTERN = _("Measure %d") 31 +MEASURE_NAME_PATTERN = _("M %d")
32 MEASURE_LINEAR = 101 32 MEASURE_LINEAR = 101
33 MEASURE_ANGULAR = 102 33 MEASURE_ANGULAR = 102
34 34
@@ -182,16 +182,16 @@ THRESHOLD_OUTVALUE = 0 @@ -182,16 +182,16 @@ THRESHOLD_OUTVALUE = 0
182 MASK_NAME_PATTERN = _("Mask %d") 182 MASK_NAME_PATTERN = _("Mask %d")
183 MASK_OPACITY = 0.40 183 MASK_OPACITY = 0.40
184 #MASK_OPACITY = 0.35 184 #MASK_OPACITY = 0.35
185 -MASK_COLOUR = [(0.33, 1, 0.33),  
186 - (1, 1, 0.33),  
187 - (0.33, 0.91, 1),  
188 - (1, 0.33, 1),  
189 - (1, 0.68, 0.33),  
190 - (1, 0.33, 0.33),  
191 - (0.33333333333333331, 0.33333333333333331, 1.0), 185 +MASK_COLOUR = [[0.33, 1, 0.33],
  186 + [1, 1, 0.33],
  187 + [0.33, 0.91, 1],
  188 + [1, 0.33, 1],
  189 + [1, 0.68, 0.33],
  190 + [1, 0.33, 0.33],
  191 + [0.33333333333333331, 0.33333333333333331, 1.0],
192 #(1.0, 0.33333333333333331, 0.66666666666666663), 192 #(1.0, 0.33333333333333331, 0.66666666666666663),
193 - (0.74901960784313726, 1.0, 0.0),  
194 - (0.83529411764705885, 0.33333333333333331, 1.0)]#, 193 + [0.74901960784313726, 1.0, 0.0],
  194 + [0.83529411764705885, 0.33333333333333331, 1.0]]#,
195 #(0.792156862745098, 0.66666666666666663, 1.0), 195 #(0.792156862745098, 0.66666666666666663, 1.0),
196 #(1.0, 0.66666666666666663, 0.792156862745098), # too "light" 196 #(1.0, 0.66666666666666663, 0.792156862745098), # too "light"
197 #(0.33333333333333331, 1.0, 0.83529411764705885),#], 197 #(0.33333333333333331, 1.0, 0.83529411764705885),#],
invesalius/data/slice_.py
@@ -49,7 +49,7 @@ class Slice(object): @@ -49,7 +49,7 @@ class Slice(object):
49 ps.Publisher().subscribe(self.CreateSurfaceFromIndex, 49 ps.Publisher().subscribe(self.CreateSurfaceFromIndex,
50 'Create surface from index') 50 'Create surface from index')
51 # Mask control 51 # Mask control
52 - ps.Publisher().subscribe(self.__add_mask, 'Create new mask') 52 + ps.Publisher().subscribe(self.__add_mask_thresh, 'Create new mask')
53 ps.Publisher().subscribe(self.__select_current_mask, 53 ps.Publisher().subscribe(self.__select_current_mask,
54 'Change mask selected') 54 'Change mask selected')
55 # Mask properties 55 # Mask properties
@@ -169,6 +169,14 @@ class Slice(object): @@ -169,6 +169,14 @@ class Slice(object):
169 self.CreateMask(name=mask_name) 169 self.CreateMask(name=mask_name)
170 self.SetMaskColour(self.current_mask.index, self.current_mask.colour) 170 self.SetMaskColour(self.current_mask.index, self.current_mask.colour)
171 171
  172 + def __add_mask_thresh(self, pubsub_evt):
  173 + mask_name = pubsub_evt.data[0]
  174 + thresh = pubsub_evt.data[1]
  175 + colour = pubsub_evt.data[2]
  176 + self.CreateMask(name=mask_name, threshold_range=thresh, colour =colour)
  177 + self.SetMaskColour(self.current_mask.index, self.current_mask.colour)
  178 + self.SelectCurrentMask(self.current_mask.index)
  179 +
172 def __select_current_mask(self, pubsub_evt): 180 def __select_current_mask(self, pubsub_evt):
173 mask_index = pubsub_evt.data 181 mask_index = pubsub_evt.data
174 self.SelectCurrentMask(mask_index) 182 self.SelectCurrentMask(mask_index)
@@ -519,8 +527,6 @@ class Slice(object): @@ -519,8 +527,6 @@ class Slice(object):
519 future_mask.colour = colour 527 future_mask.colour = colour
520 if opacity: 528 if opacity:
521 future_mask.opacity = opacity 529 future_mask.opacity = opacity
522 - if threshold_range:  
523 - future_mask.threshold_range = threshold_range  
524 if edition_threshold_range: 530 if edition_threshold_range:
525 future_mask.edition_threshold_range = edition_threshold_range 531 future_mask.edition_threshold_range = edition_threshold_range
526 if edited_points: 532 if edited_points:
@@ -532,11 +538,15 @@ class Slice(object): @@ -532,11 +538,15 @@ class Slice(object):
532 imagedata = old_mask.imagedata 538 imagedata = old_mask.imagedata
533 future_mask.threshold_range = old_mask.threshold_range 539 future_mask.threshold_range = old_mask.threshold_range
534 540
535 - # if not defined in the method call, this will have been computed on  
536 - # previous if  
537 - future_mask.imagedata = vtk.vtkImageData()  
538 - future_mask.imagedata.DeepCopy(imagedata)  
539 - future_mask.imagedata.Update() 541 + if threshold_range:
  542 + future_mask.threshold_range = threshold_range
  543 + future_mask.imagedata = self.__create_mask_threshold(self.imagedata,
  544 + threshold_range)
  545 + else:
  546 + future_mask.imagedata = vtk.vtkImageData()
  547 + future_mask.imagedata.DeepCopy(imagedata)
  548 + future_mask.imagedata.Update()
  549 +
540 550
541 # when this is not the first instance, user will have defined a name 551 # when this is not the first instance, user will have defined a name
542 if name is not None: 552 if name is not None:
@@ -551,6 +561,9 @@ class Slice(object): @@ -551,6 +561,9 @@ class Slice(object):
551 proj = Project() 561 proj = Project()
552 index = proj.AddMask(future_mask) 562 index = proj.AddMask(future_mask)
553 future_mask.index = index 563 future_mask.index = index
  564 + if threshold_range:
  565 + self.SetMaskThreshold(index, threshold_range)
  566 + future_mask.edited_points = {}
554 567
555 # update gui related to mask 568 # update gui related to mask
556 ps.Publisher().sendMessage('Add mask', 569 ps.Publisher().sendMessage('Add mask',
@@ -630,8 +643,11 @@ class Slice(object): @@ -630,8 +643,11 @@ class Slice(object):
630 return img_colours_mask.GetOutput() 643 return img_colours_mask.GetOutput()
631 644
632 645
633 - def __create_mask_threshold(self, imagedata):  
634 - thresh_min, thresh_max = self.current_mask.threshold_range 646 + def __create_mask_threshold(self, imagedata, threshold_range=None):
  647 + if not threshold_range:
  648 + thresh_min, thresh_max = self.current_mask.threshold_range
  649 + else:
  650 + thresh_min, thresh_max = threshold_range
635 651
636 # flexible threshold 652 # flexible threshold
637 img_thresh_mask = vtk.vtkImageThreshold() 653 img_thresh_mask = vtk.vtkImageThreshold()
invesalius/gui/data_notebook.py
@@ -293,16 +293,20 @@ class ButtonControlPanel(wx.Panel): @@ -293,16 +293,20 @@ class ButtonControlPanel(wx.Panel):
293 293
294 def OnNew(self): 294 def OnNew(self):
295 dialog = dlg.NewMask() 295 dialog = dlg.NewMask()
296 - 296 +
297 try: 297 try:
298 - answer = dialog.ShowModal()  
299 - except(wx._core.PyAssertionError): #TODO: FIX win64  
300 - answer = wx.ID_YES 298 + if dialog.ShowModal() == wx.ID_OK:
  299 + ok = 1
  300 + else:
  301 + ok = 0
  302 + except(wx._core.PyAssertionError): #TODO FIX: win64
  303 + ok = 1
301 304
302 - if wx.ID_YES:  
303 - mask_name = dialog.GetValue() 305 + if ok:
  306 + mask_name, thresh, colour = dialog.GetValue()
304 if mask_name: 307 if mask_name:
305 - ps.Publisher().sendMessage('Create new mask', mask_name) 308 + ps.Publisher().sendMessage('Create new mask',
  309 + (mask_name, thresh, colour))
306 310
307 def OnRemove(self): 311 def OnRemove(self):
308 self.parent.listctrl.RemoveMasks() 312 self.parent.listctrl.RemoveMasks()
invesalius/gui/dialogs.py
@@ -19,6 +19,7 @@ @@ -19,6 +19,7 @@
19 # detalhes. 19 # detalhes.
20 #-------------------------------------------------------------------------- 20 #--------------------------------------------------------------------------
21 import os 21 import os
  22 +import random
22 import sys 23 import sys
23 24
24 import wx 25 import wx
@@ -26,8 +27,8 @@ from wx.lib import masked @@ -26,8 +27,8 @@ from wx.lib import masked
26 from wx.lib.wordwrap import wordwrap 27 from wx.lib.wordwrap import wordwrap
27 import wx.lib.pubsub as ps 28 import wx.lib.pubsub as ps
28 29
29 -  
30 import constants as const 30 import constants as const
  31 +import gui.widgets.gradient as grad
31 import project as proj 32 import project as proj
32 import session as ses 33 import session as ses
33 import utils 34 import utils
@@ -340,6 +341,17 @@ def SurfaceSelectionRequiredForRemoval(): @@ -340,6 +341,17 @@ def SurfaceSelectionRequiredForRemoval():
340 dlg.Destroy() 341 dlg.Destroy()
341 342
342 343
  344 +def MeasureSelectionRequiredForRemoval():
  345 + msg = _("No measures were selected for removal.")
  346 + if sys.platform == 'darwin':
  347 + dlg = wx.MessageDialog(None, "", msg,
  348 + wx.ICON_INFORMATION | wx.OK)
  349 + else:
  350 + dlg = wx.MessageDialog(None, msg, "InVesalius 3",
  351 + wx.ICON_INFORMATION | wx.OK)
  352 + dlg.ShowModal()
  353 + dlg.Destroy()
  354 +
343 def MaskSelectionRequiredForDuplication(): 355 def MaskSelectionRequiredForDuplication():
344 msg = _("No masks were selected for duplication.") 356 msg = _("No masks were selected for duplication.")
345 if sys.platform == 'darwin': 357 if sys.platform == 'darwin':
@@ -364,28 +376,7 @@ def SurfaceSelectionRequiredForDuplication(): @@ -364,28 +376,7 @@ def SurfaceSelectionRequiredForDuplication():
364 dlg.ShowModal() 376 dlg.ShowModal()
365 dlg.Destroy() 377 dlg.Destroy()
366 378
367 -  
368 -  
369 -def NewMask():  
370 - import data.mask as mask  
371 - dlg = wx.TextEntryDialog(None, _('Name of new mask:'),  
372 - _('InVesalius 3 - New mask'))  
373 -  
374 - dlg.CenterOnScreen()  
375 - default_mask_name = const.MASK_NAME_PATTERN %(mask.Mask.general_index+2)  
376 - dlg.SetValue(default_mask_name)  
377 -  
378 - try:  
379 - op = dlg.ShowModal() == wx.ID_OK  
380 - except(wx._core.PyAssertionError):  
381 - print "win64 - wx._core.PyAssertionError"  
382 - op = True  
383 -  
384 - if op:  
385 - return dlg.GetValue()  
386 - return None  
387 -  
388 -class NewMaskDialog(wx.Dialog): 379 +class NewMask(wx.Dialog):
389 def __init__(self, 380 def __init__(self,
390 parent=None, 381 parent=None,
391 ID=-1, 382 ID=-1,
@@ -395,7 +386,7 @@ class NewMaskDialog(wx.Dialog): @@ -395,7 +386,7 @@ class NewMaskDialog(wx.Dialog):
395 style=wx.DEFAULT_DIALOG_STYLE, 386 style=wx.DEFAULT_DIALOG_STYLE,
396 useMetal=False): 387 useMetal=False):
397 import constants as const 388 import constants as const
398 - import data.surface as surface 389 + import data.mask as mask
399 import project as prj 390 import project as prj
400 391
401 # Instead of calling wx.Dialog.__init__ we precreate the dialog 392 # Instead of calling wx.Dialog.__init__ we precreate the dialog
@@ -421,69 +412,60 @@ class NewMaskDialog(wx.Dialog): @@ -421,69 +412,60 @@ class NewMaskDialog(wx.Dialog):
421 412
422 # LINE 1: Surface name 413 # LINE 1: Surface name
423 414
424 - label_surface = wx.StaticText(self, -1, _("New mask name:")) 415 + label_mask = wx.StaticText(self, -1, _("New mask name:"))
425 416
426 - default_name = const.SURFACE_NAME_PATTERN %(surface.Surface.general_index+2) 417 + default_name = const.MASK_NAME_PATTERN %(mask.Mask.general_index+2)
427 text = wx.TextCtrl(self, -1, "", size=(80,-1)) 418 text = wx.TextCtrl(self, -1, "", size=(80,-1))
428 text.SetHelpText(_("Name the mask to be created")) 419 text.SetHelpText(_("Name the mask to be created"))
429 text.SetValue(default_name) 420 text.SetValue(default_name)
430 self.text = text 421 self.text = text
431 422
432 - # LINE 2: Mask of reference 423 + # LINE 2: Threshold of reference
433 424
434 # Informative label 425 # Informative label
435 - label_mask = wx.StaticText(self, -1, _("Threshold preset:")) 426 + label_thresh = wx.StaticText(self, -1, _("Threshold preset:"))
436 427
437 # Retrieve existing masks 428 # Retrieve existing masks
438 project = prj.Project() 429 project = prj.Project()
439 thresh_list = project.threshold_modes.keys() 430 thresh_list = project.threshold_modes.keys()
440 thresh_list.sort() 431 thresh_list.sort()
441 - default_index = proj.threshold_modes.get_key(_("Default")) 432 + default_index = thresh_list.index(_("Bone"))
442 self.thresh_list = thresh_list 433 self.thresh_list = thresh_list
443 434
444 # Mask selection combo 435 # Mask selection combo
445 - combo_mask = wx.ComboBox(self, -1, "", choices= self.thresh_list, 436 + combo_thresh = wx.ComboBox(self, -1, "", choices= self.thresh_list,
446 style=wx.CB_DROPDOWN|wx.CB_READONLY) 437 style=wx.CB_DROPDOWN|wx.CB_READONLY)
447 - combo_mask.SetSelection(len(self.thresh_list)-1)  
448 - if sys.platform != 'win32':  
449 - combo_mask.SetWindowVariant(wx.WINDOW_VARIANT_SMALL)  
450 - self.combo_mask = combo_mask  
451 -  
452 - # LINE 3: Surface quality  
453 - label_quality = wx.StaticText(self, -1, _("Surface quality:"))  
454 -  
455 - choices = const.SURFACE_QUALITY_LIST,  
456 - style = wx.CB_DROPDOWN|wx.CB_READONLY  
457 - combo_quality = wx.ComboBox(self, -1, "",  
458 - choices= choices,  
459 - style=style)  
460 - combo_quality.SetSelection(3) 438 + combo_thresh.SetSelection(default_index)
461 if sys.platform != 'win32': 439 if sys.platform != 'win32':
462 - combo_quality.SetWindowVariant(wx.WINDOW_VARIANT_SMALL)  
463 - self.combo_quality = combo_quality  
464 - 440 + combo_thresh.SetWindowVariant(wx.WINDOW_VARIANT_SMALL)
  441 + self.combo_thresh = combo_thresh
  442 +
  443 + # LINE 3: Gradient
  444 + bound_min, bound_max = project.threshold_range
  445 + thresh_min, thresh_max = project.threshold_modes[_("Bone")]
  446 + original_colour = random.choice(const.MASK_COLOUR)
  447 + self.colour = original_colour
  448 + colour = [255*i for i in original_colour]
  449 + colour.append(100)
  450 + gradient = grad.GradientSlider(self, -1, int(bound_min),
  451 + int(bound_max),
  452 + int(thresh_min), int(thresh_max),
  453 + colour)
  454 + self.gradient = gradient
465 455
466 # OVERVIEW 456 # OVERVIEW
467 # Sizer that joins content above 457 # Sizer that joins content above
468 flag_link = wx.EXPAND|wx.GROW|wx.ALL 458 flag_link = wx.EXPAND|wx.GROW|wx.ALL
469 flag_button = wx.ALL | wx.EXPAND| wx.GROW 459 flag_button = wx.ALL | wx.EXPAND| wx.GROW
470 460
471 - fixed_sizer = wx.FlexGridSizer(rows=2, cols=2, hgap=10, vgap=0) 461 + fixed_sizer = wx.FlexGridSizer(rows=2, cols=2, hgap=10, vgap=10)
472 fixed_sizer.AddGrowableCol(0, 1) 462 fixed_sizer.AddGrowableCol(0, 1)
473 - fixed_sizer.AddMany([ (label_surface, 1, flag_link, 5), 463 + fixed_sizer.AddMany([ (label_mask, 1, flag_link, 5),
474 (text, 1, flag_button, 2), 464 (text, 1, flag_button, 2),
475 - (label_mask, 1, flag_link, 5),  
476 - (combo_mask, 0, flag_button, 1),  
477 - (label_quality, 1, flag_link, 5),  
478 - (combo_quality, 0, flag_button, 1)])  
479 -  
480 -  
481 - # LINES 4 and 5: Checkboxes  
482 - check_box_holes = wx.CheckBox(self, -1, _("Fill holes"))  
483 - check_box_holes.SetValue(True)  
484 - self.check_box_holes = check_box_holes  
485 - check_box_largest = wx.CheckBox(self, -1, _("Keep largest region"))  
486 - self.check_box_largest = check_box_largest 465 + (label_thresh, 1, flag_link, 5),
  466 + (combo_thresh, 0, flag_button, 1)])#,
  467 + #(label_quality, 1, flag_link, 5),
  468 + #(combo_quality, 0, flag_button, 1)])
487 469
488 # LINE 6: Buttons 470 # LINE 6: Buttons
489 471
@@ -499,28 +481,47 @@ class NewMaskDialog(wx.Dialog): @@ -499,28 +481,47 @@ class NewMaskDialog(wx.Dialog):
499 # OVERVIEW 481 # OVERVIEW
500 # Merge all sizers and checkboxes 482 # Merge all sizers and checkboxes
501 sizer = wx.BoxSizer(wx.VERTICAL) 483 sizer = wx.BoxSizer(wx.VERTICAL)
502 - sizer.Add(fixed_sizer, 0, wx.TOP|wx.RIGHT|wx.LEFT|wx.GROW|wx.EXPAND, 20)  
503 - sizer.Add(check_box_holes, 0, wx.RIGHT|wx.LEFT, 30)  
504 - sizer.Add(check_box_largest, 0, wx.RIGHT|wx.LEFT, 30)  
505 - sizer.Add(btnsizer, 0, wx.ALIGN_RIGHT|wx.ALL, 10) 484 + sizer.Add(fixed_sizer, 0, wx.ALL|wx.GROW|wx.EXPAND, 15)
  485 + sizer.Add(gradient, 1, wx.BOTTOM|wx.RIGHT|wx.LEFT|wx.EXPAND|wx.GROW, 20)
  486 + sizer.Add(btnsizer, 0, wx.ALIGN_RIGHT|wx.BOTTOM, 10)
506 487
507 self.SetSizer(sizer) 488 self.SetSizer(sizer)
508 sizer.Fit(self) 489 sizer.Fit(self)
509 490
510 - def GetValue(self):  
511 - mask_index = self.combo_mask.GetSelection()  
512 - surface_name = self.text.GetValue()  
513 - quality = const.SURFACE_QUALITY_LIST[self.combo_quality.GetSelection()]  
514 - fill_holes = self.check_box_holes.GetValue()  
515 - keep_largest = self.check_box_largest.GetValue()  
516 - return (mask_index, surface_name, quality, fill_holes, keep_largest)  
517 -  
518 -  
519 - 491 + self.Bind(grad.EVT_THRESHOLD_CHANGE, self.OnSlideChanged, self.gradient)
  492 + self.combo_thresh.Bind(wx.EVT_COMBOBOX, self.OnComboThresh)
520 493
521 494
  495 + def OnComboThresh(self, evt):
  496 + import project as prj
  497 + proj = prj.Project()
  498 + (thresh_min, thresh_max) = proj.threshold_modes[evt.GetString()]
  499 + self.gradient.SetMinValue(thresh_min, True)
  500 + self.gradient.SetMaxValue(thresh_max, True)
522 501
  502 + def OnSlideChanged(self, evt):
  503 + import project as prj
  504 + thresh_min = self.gradient.GetMinValue()
  505 + thresh_max = self.gradient.GetMaxValue()
  506 + thresh = (thresh_min, thresh_max)
  507 + proj = prj.Project()
  508 + if thresh in proj.threshold_modes.values():
  509 + preset_name = proj.threshold_modes.get_key(thresh)[0]
  510 + index = self.thresh_list.index(preset_name)
  511 + self.combo_thresh.SetSelection(index)
  512 + else:
  513 + index = self.thresh_list.index(_("Custom"))
  514 + self.combo_thresh.SetSelection(index)
523 515
  516 + def GetValue(self):
  517 + #mask_index = self.combo_mask.GetSelection()
  518 + mask_name = self.text.GetValue()
  519 + thresh_value = [self.gradient.GetMinValue(), self.gradient.GetMaxValue()]
  520 + #quality = const.SURFACE_QUALITY_LIST[self.combo_quality.GetSelection()]
  521 + #fill_holes = self.check_box_holes.GetValue()
  522 + #keep_largest = self.check_box_largest.GetValue()
  523 + #return (mask_index, surface_name, quality, fill_holes, keep_largest)
  524 + return mask_name, thresh_value, self.colour
524 525
525 526
526 def InexistentPath(path): 527 def InexistentPath(path):
@@ -595,24 +596,26 @@ def ShowAboutDialog(parent): @@ -595,24 +596,26 @@ def ShowAboutDialog(parent):
595 info.WebSite = ("http://svn.softwarepublico.gov.br/trac/invesalius") 596 info.WebSite = ("http://svn.softwarepublico.gov.br/trac/invesalius")
596 info.License = _("GNU GPL (General Public License) version 2") 597 info.License = _("GNU GPL (General Public License) version 2")
597 598
598 - #info.Translators = ""  
599 - #info.Artists =  
600 info.Developers = ["Tatiana Al-Chueyr", 599 info.Developers = ["Tatiana Al-Chueyr",
601 - "Paulo Henrique Junqueira Amorim",  
602 - "Thiago Franco de Moraes"]  
603 - #info.DocWriters = 600 + "Paulo Henrique Junqueira Amorim",
  601 + "Thiago Franco de Moraes"]
  602 +
604 info.Translators = ["Alex P. Natsios (EL)", 603 info.Translators = ["Alex P. Natsios (EL)",
605 "Andreas Loupasakis (EL)", 604 "Andreas Loupasakis (EL)",
606 "Cheng-Chia Tseng (ZH)", 605 "Cheng-Chia Tseng (ZH)",
607 "Dimitris Glezos (EL)", 606 "Dimitris Glezos (EL)",
  607 + "Eugene Liscio (EN)",
608 u"Frédéric Lopez (FR)", 608 u"Frédéric Lopez (FR)",
609 "J. Javier de Lima Moreno (ES)" 609 "J. Javier de Lima Moreno (ES)"
610 "Nikos Korkakakis (EL)", 610 "Nikos Korkakakis (EL)",
611 "Sebastian Hilbert (DE)"] 611 "Sebastian Hilbert (DE)"]
612 612
  613 + info.DocWriters = ["Eugene Liscio (EN)",
  614 + "Fabio Francisco da Silva (PT)"]
  615 +
613 info.Artists = ["Otavio Henrique Junqueira Amorim"] 616 info.Artists = ["Otavio Henrique Junqueira Amorim"]
614 617
615 - # Then we call wx.AboutBox giving its info object 618 + # Then we call wx.AboutBox providing its info object
616 wx.AboutBox(info) 619 wx.AboutBox(info)
617 620
618 621
invesalius/gui/task_slice.py
@@ -152,12 +152,21 @@ class InnerTaskPanel(wx.Panel): @@ -152,12 +152,21 @@ class InnerTaskPanel(wx.Panel):
152 dlg.InexistentMask() 152 dlg.InexistentMask()
153 153
154 def OnLinkNewMask(self, evt=None): 154 def OnLinkNewMask(self, evt=None):
155 - mask_name = dlg.NewMask()  
156 - if mask_name:  
157 - ps.Publisher().sendMessage('Create new mask', mask_name) 155 + dialog = dlg.NewMask()
158 156
159 - if evt:  
160 - evt.Skip() 157 + try:
  158 + if dialog.ShowModal() == wx.ID_OK:
  159 + ok = 1
  160 + else:
  161 + ok = 0
  162 + except(wx._core.PyAssertionError): #TODO FIX: win64
  163 + ok = 1
  164 +
  165 + if ok:
  166 + mask_name, thresh, colour = dialog.GetValue()
  167 + if mask_name:
  168 + ps.Publisher().sendMessage('Create new mask',
  169 + (mask_name, thresh, colour))
161 170
162 def GetMaskSelected(self): 171 def GetMaskSelected(self):
163 return self.fold_panel.GetMaskSelected() 172 return self.fold_panel.GetMaskSelected()