Commit f6b001ebc009a7180961e2fcd80182d1c61e4ea9

Authored by Renan
Committed by Thiago Franco de Moraes
1 parent 71982a56

Markers manipulation improvement (#81)

* working

* Blink the selected marker in listctrl

* Delete all selected items in the list ctrl

* Trigger improvements

* Fixed panel size
invesalius/data/trigger.py
@@ -32,6 +32,8 @@ class Trigger(threading.Thread): @@ -32,6 +32,8 @@ class Trigger(threading.Thread):
32 def __init__(self, nav_id): 32 def __init__(self, nav_id):
33 threading.Thread.__init__(self) 33 threading.Thread.__init__(self)
34 self.trigger_init = None 34 self.trigger_init = None
  35 + self.stylusplh = False
  36 + self.__bind_events()
35 try: 37 try:
36 import serial 38 import serial
37 39
@@ -46,6 +48,12 @@ class Trigger(threading.Thread): @@ -46,6 +48,12 @@ class Trigger(threading.Thread):
46 except serial.serialutil.SerialException: 48 except serial.serialutil.SerialException:
47 print 'Connection with port COM1 failed.' 49 print 'Connection with port COM1 failed.'
48 50
  51 + def __bind_events(self):
  52 + Publisher.subscribe(self.OnStylusPLH, 'PLH Stylus Button On')
  53 +
  54 + def OnStylusPLH(self, pubsuv_evt):
  55 + self.stylusplh = True
  56 +
49 def stop(self): 57 def stop(self):
50 self._pause_ = True 58 self._pause_ = True
51 59
@@ -59,6 +67,13 @@ class Trigger(threading.Thread): @@ -59,6 +67,13 @@ class Trigger(threading.Thread):
59 # lines = True 67 # lines = True
60 if lines: 68 if lines:
61 wx.CallAfter(Publisher.sendMessage, 'Create marker') 69 wx.CallAfter(Publisher.sendMessage, 'Create marker')
  70 + sleep(0.5)
  71 +
  72 + if self.stylusplh:
  73 + wx.CallAfter(Publisher.sendMessage, 'Create marker')
  74 + sleep(0.5)
  75 + self.stylusplh = False
  76 +
62 sleep(0.175) 77 sleep(0.175)
63 if self._pause_: 78 if self._pause_:
64 if self.trigger_init: 79 if self.trigger_init:
invesalius/data/viewer_volume.py
@@ -123,6 +123,9 @@ class Viewer(wx.Panel): @@ -123,6 +123,9 @@ class Viewer(wx.Panel):
123 self.sen1 = False 123 self.sen1 = False
124 self.sen2 = False 124 self.sen2 = False
125 125
  126 + self.timer = False
  127 + self.index = False
  128 +
126 def __bind_events(self): 129 def __bind_events(self):
127 Publisher.subscribe(self.LoadActor, 130 Publisher.subscribe(self.LoadActor,
128 'Load surface actor into viewer') 131 'Load surface actor into viewer')
@@ -203,6 +206,8 @@ class Viewer(wx.Panel): @@ -203,6 +206,8 @@ class Viewer(wx.Panel):
203 Publisher.subscribe(self.ShowAllMarkers, 'Show all markers') 206 Publisher.subscribe(self.ShowAllMarkers, 'Show all markers')
204 Publisher.subscribe(self.RemoveAllMarkers, 'Remove all markers') 207 Publisher.subscribe(self.RemoveAllMarkers, 'Remove all markers')
205 Publisher.subscribe(self.RemoveMarker, 'Remove marker') 208 Publisher.subscribe(self.RemoveMarker, 'Remove marker')
  209 + Publisher.subscribe(self.BlinkMarker, 'Blink Marker')
  210 + Publisher.subscribe(self.StopBlinkMarker, 'Stop Blink Marker')
206 211
207 def SetStereoMode(self, pubsub_evt): 212 def SetStereoMode(self, pubsub_evt):
208 mode = pubsub_evt.data 213 mode = pubsub_evt.data
@@ -478,11 +483,35 @@ class Viewer(wx.Panel): @@ -478,11 +483,35 @@ class Viewer(wx.Panel):
478 483
479 def RemoveMarker(self, pubsub_evt): 484 def RemoveMarker(self, pubsub_evt):
480 index = pubsub_evt.data 485 index = pubsub_evt.data
481 - self.ren.RemoveActor(self.staticballs[index])  
482 - del self.staticballs[index]  
483 - self.ball_id = self.ball_id - 1 486 + for i in reversed(index):
  487 + self.ren.RemoveActor(self.staticballs[i])
  488 + del self.staticballs[i]
  489 + self.ball_id = self.ball_id - 1
484 self.UpdateRender() 490 self.UpdateRender()
485 491
  492 + def BlinkMarker(self, pubsub_evt):
  493 + if self.timer:
  494 + self.timer.Stop()
  495 + self.staticballs[self.index].SetVisibility(1)
  496 + self.index = pubsub_evt.data
  497 + self.timer = wx.Timer(self)
  498 + self.Bind(wx.EVT_TIMER, self.blink, self.timer)
  499 + self.timer.Start(500)
  500 + self.timer_count = 0
  501 +
  502 + def blink(self, evt):
  503 + self.staticballs[self.index].SetVisibility(int(self.timer_count % 2))
  504 + self.Refresh()
  505 + self.timer_count += 1
  506 +
  507 + def StopBlinkMarker(self, pubsub_evt):
  508 + if self.timer:
  509 + self.timer.Stop()
  510 + if pubsub_evt.data == None:
  511 + self.staticballs[self.index].SetVisibility(1)
  512 + self.Refresh()
  513 + self.index = False
  514 +
486 def CreateBallReference(self): 515 def CreateBallReference(self):
487 """ 516 """
488 Red sphere on volume visualization to reference center of 517 Red sphere on volume visualization to reference center of
@@ -1028,7 +1057,6 @@ class Viewer(wx.Panel): @@ -1028,7 +1057,6 @@ class Viewer(wx.Panel):
1028 self.RemoveBallReference() 1057 self.RemoveBallReference()
1029 self.interactor.Render() 1058 self.interactor.Render()
1030 1059
1031 -  
1032 class SlicePlane: 1060 class SlicePlane:
1033 def __init__(self): 1061 def __init__(self):
1034 project = prj.Project() 1062 project = prj.Project()
invesalius/gui/task_navigator.py
@@ -114,10 +114,13 @@ class InnerFoldPanel(wx.Panel): @@ -114,10 +114,13 @@ class InnerFoldPanel(wx.Panel):
114 # is not working properly in this panel. It might be on some child or 114 # is not working properly in this panel. It might be on some child or
115 # parent panel. Perhaps we need to insert the item into the sizer also... 115 # parent panel. Perhaps we need to insert the item into the sizer also...
116 # Study this. 116 # Study this.
117 -  
118 - fold_panel = fpb.FoldPanelBar(self, -1, wx.DefaultPosition,  
119 - (10, 293), 0, fpb.FPB_SINGLE_FOLD)  
120 - 117 + displaySize = wx.DisplaySize()
  118 + if displaySize[1] > 768:
  119 + fold_panel = fpb.FoldPanelBar(self, -1, wx.DefaultPosition,
  120 + (10, 350), 0, fpb.FPB_SINGLE_FOLD)
  121 + else:
  122 + fold_panel = fpb.FoldPanelBar(self, -1, wx.DefaultPosition,
  123 + (10, 293), 0, fpb.FPB_SINGLE_FOLD)
121 # Fold panel style 124 # Fold panel style
122 style = fpb.CaptionBarStyle() 125 style = fpb.CaptionBarStyle()
123 style.SetCaptionStyle(fpb.CAPTIONBAR_GRADIENT_V) 126 style.SetCaptionStyle(fpb.CAPTIONBAR_GRADIENT_V)
@@ -243,7 +246,7 @@ class NeuronavigationPanel(wx.Panel): @@ -243,7 +246,7 @@ class NeuronavigationPanel(wx.Panel):
243 for k in btns_img: 246 for k in btns_img:
244 n = btns_img[k].keys()[0] 247 n = btns_img[k].keys()[0]
245 lab = btns_img[k].values()[0] 248 lab = btns_img[k].values()[0]
246 - self.btns_coord[n] = wx.ToggleButton(self, k, label=lab, size=wx.Size(30, 23)) 249 + self.btns_coord[n] = wx.ToggleButton(self, k, label=lab, size=wx.Size(45, 23))
247 self.btns_coord[n].SetToolTip(tips_img[n]) 250 self.btns_coord[n].SetToolTip(tips_img[n])
248 self.btns_coord[n].Bind(wx.EVT_TOGGLEBUTTON, self.OnImageFiducials) 251 self.btns_coord[n].Bind(wx.EVT_TOGGLEBUTTON, self.OnImageFiducials)
249 252
@@ -254,7 +257,7 @@ class NeuronavigationPanel(wx.Panel): @@ -254,7 +257,7 @@ class NeuronavigationPanel(wx.Panel):
254 for k in btns_trk: 257 for k in btns_trk:
255 n = btns_trk[k].keys()[0] 258 n = btns_trk[k].keys()[0]
256 lab = btns_trk[k].values()[0] 259 lab = btns_trk[k].values()[0]
257 - self.btns_coord[n] = wx.Button(self, k, label=lab, size=wx.Size(30, 23)) 260 + self.btns_coord[n] = wx.Button(self, k, label=lab, size=wx.Size(45, 23))
258 self.btns_coord[n].SetToolTip(tips_trk[n-3]) 261 self.btns_coord[n].SetToolTip(tips_trk[n-3])
259 # Excepetion for event of button that set image coordinates 262 # Excepetion for event of button that set image coordinates
260 if n == 6: 263 if n == 6:
@@ -325,7 +328,6 @@ class NeuronavigationPanel(wx.Panel): @@ -325,7 +328,6 @@ class NeuronavigationPanel(wx.Panel):
325 Publisher.subscribe(self.UpdateTriggerState, 'Update trigger state') 328 Publisher.subscribe(self.UpdateTriggerState, 'Update trigger state')
326 Publisher.subscribe(self.UpdateImageCoordinates, 'Set ball reference position') 329 Publisher.subscribe(self.UpdateImageCoordinates, 'Set ball reference position')
327 Publisher.subscribe(self.OnDisconnectTracker, 'Disconnect tracker') 330 Publisher.subscribe(self.OnDisconnectTracker, 'Disconnect tracker')
328 - Publisher.subscribe(self.OnStylusButton, 'PLH Stylus Button On')  
329 331
330 def LoadImageFiducials(self, pubsub_evt): 332 def LoadImageFiducials(self, pubsub_evt):
331 marker_id = pubsub_evt.data[0] 333 marker_id = pubsub_evt.data[0]
@@ -359,10 +361,6 @@ class NeuronavigationPanel(wx.Panel): @@ -359,10 +361,6 @@ class NeuronavigationPanel(wx.Panel):
359 if self.tracker_id: 361 if self.tracker_id:
360 dt.TrackerConnection(self.tracker_id, 'disconnect') 362 dt.TrackerConnection(self.tracker_id, 'disconnect')
361 363
362 - def OnStylusButton(self, pubsub_evt):  
363 - if self.trigger_state:  
364 - Publisher.sendMessage('Create marker')  
365 -  
366 def OnChoiceTracker(self, evt, ctrl): 364 def OnChoiceTracker(self, evt, ctrl):
367 Publisher.sendMessage('Update status text in GUI', _("Configuring tracker ...")) 365 Publisher.sendMessage('Update status text in GUI', _("Configuring tracker ..."))
368 if evt: 366 if evt:
@@ -592,7 +590,7 @@ class MarkersPanel(wx.Panel): @@ -592,7 +590,7 @@ class MarkersPanel(wx.Panel):
592 btn_delete_single = wx.Button(self, -1, label=_('Remove'), size=wx.Size(65, 23)) 590 btn_delete_single = wx.Button(self, -1, label=_('Remove'), size=wx.Size(65, 23))
593 btn_delete_single.Bind(wx.EVT_BUTTON, self.OnDeleteSingleMarker) 591 btn_delete_single.Bind(wx.EVT_BUTTON, self.OnDeleteSingleMarker)
594 592
595 - btn_delete_all = wx.Button(self, -1, label=_('Delete all markers'), size=wx.Size(135, 23)) 593 + btn_delete_all = wx.Button(self, -1, label=_('Delete all'), size=wx.Size(135, 23))
596 btn_delete_all.Bind(wx.EVT_BUTTON, self.OnDeleteAllMarkers) 594 btn_delete_all.Bind(wx.EVT_BUTTON, self.OnDeleteAllMarkers)
597 595
598 sizer_delete = wx.FlexGridSizer(rows=1, cols=2, hgap=5, vgap=5) 596 sizer_delete = wx.FlexGridSizer(rows=1, cols=2, hgap=5, vgap=5)
@@ -612,6 +610,8 @@ class MarkersPanel(wx.Panel): @@ -612,6 +610,8 @@ class MarkersPanel(wx.Panel):
612 self.lc.SetColumnWidth(3, 50) 610 self.lc.SetColumnWidth(3, 50)
613 self.lc.SetColumnWidth(4, 50) 611 self.lc.SetColumnWidth(4, 50)
614 self.lc.Bind(wx.EVT_LIST_ITEM_RIGHT_CLICK, self.OnListEditMarkerId) 612 self.lc.Bind(wx.EVT_LIST_ITEM_RIGHT_CLICK, self.OnListEditMarkerId)
  613 + self.lc.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnItemBlink)
  614 + self.lc.Bind(wx.EVT_LIST_ITEM_DESELECTED, self.OnStopItemBlink)
615 615
616 # Add all lines into main sizer 616 # Add all lines into main sizer
617 group_sizer = wx.BoxSizer(wx.VERTICAL) 617 group_sizer = wx.BoxSizer(wx.VERTICAL)
@@ -639,6 +639,12 @@ class MarkersPanel(wx.Panel): @@ -639,6 +639,12 @@ class MarkersPanel(wx.Panel):
639 self.PopupMenu(menu_id) 639 self.PopupMenu(menu_id)
640 menu_id.Destroy() 640 menu_id.Destroy()
641 641
  642 + def OnItemBlink(self, evt):
  643 + Publisher.sendMessage('Blink Marker', self.lc.GetFocusedItem())
  644 +
  645 + def OnStopItemBlink(self, evt):
  646 + Publisher.sendMessage('Stop Blink Marker')
  647 +
642 def OnMenuEditMarkerId(self, evt): 648 def OnMenuEditMarkerId(self, evt):
643 id_label = dlg.EnterMarkerID(self.lc.GetItemText(self.lc.GetFocusedItem(), 4)) 649 id_label = dlg.EnterMarkerID(self.lc.GetItemText(self.lc.GetFocusedItem(), 4))
644 list_index = self.lc.GetFocusedItem() 650 list_index = self.lc.GetFocusedItem()
@@ -653,6 +659,7 @@ class MarkersPanel(wx.Panel): @@ -653,6 +659,7 @@ class MarkersPanel(wx.Panel):
653 self.marker_ind = 0 659 self.marker_ind = 0
654 Publisher.sendMessage('Remove all markers', self.lc.GetItemCount()) 660 Publisher.sendMessage('Remove all markers', self.lc.GetItemCount())
655 self.lc.DeleteAllItems() 661 self.lc.DeleteAllItems()
  662 + Publisher.sendMessage('Stop Blink Marker', 'DeleteAll')
656 663
657 def OnDeleteSingleMarker(self, evt): 664 def OnDeleteSingleMarker(self, evt):
658 # OnDeleteSingleMarker is used for both pubsub and button click events 665 # OnDeleteSingleMarker is used for both pubsub and button click events
@@ -667,22 +674,23 @@ class MarkersPanel(wx.Panel): @@ -667,22 +674,23 @@ class MarkersPanel(wx.Panel):
667 for i in const.BTNS_IMG_MKS: 674 for i in const.BTNS_IMG_MKS:
668 if marker_id in const.BTNS_IMG_MKS[i].values()[0]: 675 if marker_id in const.BTNS_IMG_MKS[i].values()[0]:
669 self.lc.Focus(item.GetId()) 676 self.lc.Focus(item.GetId())
670 - self.DeleteMarker() 677 + index = [self.lc.GetFocusedItem()]
671 else: 678 else:
672 if self.lc.GetFocusedItem() is not -1: 679 if self.lc.GetFocusedItem() is not -1:
673 - self.DeleteMarker() 680 + index = self.GetSelectedItems()
674 elif not self.lc.GetItemCount(): 681 elif not self.lc.GetItemCount():
675 pass 682 pass
676 else: 683 else:
677 dlg.NoMarkerSelected() 684 dlg.NoMarkerSelected()
678 -  
679 - def DeleteMarker(self):  
680 - index = self.lc.GetFocusedItem()  
681 - del self.list_coord[index]  
682 - self.lc.DeleteItem(index)  
683 - for n in range(0, self.lc.GetItemCount()):  
684 - self.lc.SetStringItem(n, 0, str(n+1))  
685 - self.marker_ind -= 1 685 + self.DeleteMarker(index)
  686 +
  687 + def DeleteMarker(self, index):
  688 + for i in reversed(index):
  689 + del self.list_coord[i]
  690 + self.lc.DeleteItem(i)
  691 + for n in range(0, self.lc.GetItemCount()):
  692 + self.lc.SetStringItem(n, 0, str(n+1))
  693 + self.marker_ind -= 1
686 Publisher.sendMessage('Remove marker', index) 694 Publisher.sendMessage('Remove marker', index)
687 695
688 def OnCreateMarker(self, evt): 696 def OnCreateMarker(self, evt):
@@ -777,3 +785,15 @@ class MarkersPanel(wx.Panel): @@ -777,3 +785,15 @@ class MarkersPanel(wx.Panel):
777 self.lc.SetStringItem(num_items, 3, str(round(coord[2], 2))) 785 self.lc.SetStringItem(num_items, 3, str(round(coord[2], 2)))
778 self.lc.SetStringItem(num_items, 4, str(marker_id)) 786 self.lc.SetStringItem(num_items, 4, str(marker_id))
779 self.lc.EnsureVisible(num_items) 787 self.lc.EnsureVisible(num_items)
  788 +
  789 + def GetSelectedItems(self):
  790 + """
  791 + Returns a list of the selected items in the list control.
  792 + """
  793 + selection = []
  794 + index = self.lc.GetFirstSelected()
  795 + selection.append(index)
  796 + while len(selection) != self.lc.GetSelectedItemCount():
  797 + index = self.lc.GetNextSelected(index)
  798 + selection.append(index)
  799 + return selection
780 \ No newline at end of file 800 \ No newline at end of file