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 32 def __init__(self, nav_id):
33 33 threading.Thread.__init__(self)
34 34 self.trigger_init = None
  35 + self.stylusplh = False
  36 + self.__bind_events()
35 37 try:
36 38 import serial
37 39  
... ... @@ -46,6 +48,12 @@ class Trigger(threading.Thread):
46 48 except serial.serialutil.SerialException:
47 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 57 def stop(self):
50 58 self._pause_ = True
51 59  
... ... @@ -59,6 +67,13 @@ class Trigger(threading.Thread):
59 67 # lines = True
60 68 if lines:
61 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 77 sleep(0.175)
63 78 if self._pause_:
64 79 if self.trigger_init:
... ...
invesalius/data/viewer_volume.py
... ... @@ -123,6 +123,9 @@ class Viewer(wx.Panel):
123 123 self.sen1 = False
124 124 self.sen2 = False
125 125  
  126 + self.timer = False
  127 + self.index = False
  128 +
126 129 def __bind_events(self):
127 130 Publisher.subscribe(self.LoadActor,
128 131 'Load surface actor into viewer')
... ... @@ -203,6 +206,8 @@ class Viewer(wx.Panel):
203 206 Publisher.subscribe(self.ShowAllMarkers, 'Show all markers')
204 207 Publisher.subscribe(self.RemoveAllMarkers, 'Remove all markers')
205 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 212 def SetStereoMode(self, pubsub_evt):
208 213 mode = pubsub_evt.data
... ... @@ -478,11 +483,35 @@ class Viewer(wx.Panel):
478 483  
479 484 def RemoveMarker(self, pubsub_evt):
480 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 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 515 def CreateBallReference(self):
487 516 """
488 517 Red sphere on volume visualization to reference center of
... ... @@ -1028,7 +1057,6 @@ class Viewer(wx.Panel):
1028 1057 self.RemoveBallReference()
1029 1058 self.interactor.Render()
1030 1059  
1031   -
1032 1060 class SlicePlane:
1033 1061 def __init__(self):
1034 1062 project = prj.Project()
... ...
invesalius/gui/task_navigator.py
... ... @@ -114,10 +114,13 @@ class InnerFoldPanel(wx.Panel):
114 114 # is not working properly in this panel. It might be on some child or
115 115 # parent panel. Perhaps we need to insert the item into the sizer also...
116 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 124 # Fold panel style
122 125 style = fpb.CaptionBarStyle()
123 126 style.SetCaptionStyle(fpb.CAPTIONBAR_GRADIENT_V)
... ... @@ -243,7 +246,7 @@ class NeuronavigationPanel(wx.Panel):
243 246 for k in btns_img:
244 247 n = btns_img[k].keys()[0]
245 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 250 self.btns_coord[n].SetToolTip(tips_img[n])
248 251 self.btns_coord[n].Bind(wx.EVT_TOGGLEBUTTON, self.OnImageFiducials)
249 252  
... ... @@ -254,7 +257,7 @@ class NeuronavigationPanel(wx.Panel):
254 257 for k in btns_trk:
255 258 n = btns_trk[k].keys()[0]
256 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 261 self.btns_coord[n].SetToolTip(tips_trk[n-3])
259 262 # Excepetion for event of button that set image coordinates
260 263 if n == 6:
... ... @@ -325,7 +328,6 @@ class NeuronavigationPanel(wx.Panel):
325 328 Publisher.subscribe(self.UpdateTriggerState, 'Update trigger state')
326 329 Publisher.subscribe(self.UpdateImageCoordinates, 'Set ball reference position')
327 330 Publisher.subscribe(self.OnDisconnectTracker, 'Disconnect tracker')
328   - Publisher.subscribe(self.OnStylusButton, 'PLH Stylus Button On')
329 331  
330 332 def LoadImageFiducials(self, pubsub_evt):
331 333 marker_id = pubsub_evt.data[0]
... ... @@ -359,10 +361,6 @@ class NeuronavigationPanel(wx.Panel):
359 361 if self.tracker_id:
360 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 364 def OnChoiceTracker(self, evt, ctrl):
367 365 Publisher.sendMessage('Update status text in GUI', _("Configuring tracker ..."))
368 366 if evt:
... ... @@ -592,7 +590,7 @@ class MarkersPanel(wx.Panel):
592 590 btn_delete_single = wx.Button(self, -1, label=_('Remove'), size=wx.Size(65, 23))
593 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 594 btn_delete_all.Bind(wx.EVT_BUTTON, self.OnDeleteAllMarkers)
597 595  
598 596 sizer_delete = wx.FlexGridSizer(rows=1, cols=2, hgap=5, vgap=5)
... ... @@ -612,6 +610,8 @@ class MarkersPanel(wx.Panel):
612 610 self.lc.SetColumnWidth(3, 50)
613 611 self.lc.SetColumnWidth(4, 50)
614 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 616 # Add all lines into main sizer
617 617 group_sizer = wx.BoxSizer(wx.VERTICAL)
... ... @@ -639,6 +639,12 @@ class MarkersPanel(wx.Panel):
639 639 self.PopupMenu(menu_id)
640 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 648 def OnMenuEditMarkerId(self, evt):
643 649 id_label = dlg.EnterMarkerID(self.lc.GetItemText(self.lc.GetFocusedItem(), 4))
644 650 list_index = self.lc.GetFocusedItem()
... ... @@ -653,6 +659,7 @@ class MarkersPanel(wx.Panel):
653 659 self.marker_ind = 0
654 660 Publisher.sendMessage('Remove all markers', self.lc.GetItemCount())
655 661 self.lc.DeleteAllItems()
  662 + Publisher.sendMessage('Stop Blink Marker', 'DeleteAll')
656 663  
657 664 def OnDeleteSingleMarker(self, evt):
658 665 # OnDeleteSingleMarker is used for both pubsub and button click events
... ... @@ -667,22 +674,23 @@ class MarkersPanel(wx.Panel):
667 674 for i in const.BTNS_IMG_MKS:
668 675 if marker_id in const.BTNS_IMG_MKS[i].values()[0]:
669 676 self.lc.Focus(item.GetId())
670   - self.DeleteMarker()
  677 + index = [self.lc.GetFocusedItem()]
671 678 else:
672 679 if self.lc.GetFocusedItem() is not -1:
673   - self.DeleteMarker()
  680 + index = self.GetSelectedItems()
674 681 elif not self.lc.GetItemCount():
675 682 pass
676 683 else:
677 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 694 Publisher.sendMessage('Remove marker', index)
687 695  
688 696 def OnCreateMarker(self, evt):
... ... @@ -777,3 +785,15 @@ class MarkersPanel(wx.Panel):
777 785 self.lc.SetStringItem(num_items, 3, str(round(coord[2], 2)))
778 786 self.lc.SetStringItem(num_items, 4, str(marker_id))
779 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 800 \ No newline at end of file
... ...