Commit 7040d74d51838af8cfd399b1a2ab2436179f8c67

Authored by tfmoraes
1 parent cf8e1cc5

ENH: Sync between treeview and preview and only show one selection in preview

invesalius/gui/dicom_preview_panel.py
... ... @@ -286,6 +286,7 @@ class Preview(wx.Panel):
286 286 my_evt = SerieEvent(myEVT_PREVIEW_CLICK, self.GetId())
287 287 my_evt.SetSelectedID(self.dicom_info.id)
288 288 my_evt.SetItemData(self.dicom_info.dicom)
  289 + my_evt.SetEventObject(self)
289 290 print "patient", self.dicom_info.dicom.patient
290 291 self.GetEventHandler().ProcessEvent(my_evt)
291 292  
... ... @@ -306,6 +307,7 @@ class Preview(wx.Panel):
306 307 my_evt = SerieEvent(myEVT_PREVIEW_DBLCLICK, self.GetId())
307 308 my_evt.SetSelectedID(self.dicom_info.id)
308 309 my_evt.SetItemData(self.dicom_info.dicom)
  310 + my_evt.SetEventObject(self)
309 311 self.GetEventHandler().ProcessEvent(my_evt)
310 312  
311 313  
... ... @@ -319,6 +321,8 @@ class DicomPreviewSeries(wx.Panel):
319 321 #self.SetSizer(self.sizer)
320 322 self.displayed_position = 0
321 323 self.nhidden_last_display = 0
  324 + self.selected_dicom = None
  325 + self.selected_panel = None
322 326 self._init_ui()
323 327  
324 328 def _init_ui(self):
... ... @@ -369,6 +373,15 @@ class DicomPreviewSeries(wx.Panel):
369 373 my_evt = SerieEvent(myEVT_CLICK_SERIE, self.GetId())
370 374 my_evt.SetSelectedID(evt.GetSelectID())
371 375 my_evt.SetItemData(evt.GetItemData())
  376 +
  377 + if self.selected_dicom:
  378 + self.selected_dicom.selected = self.selected_dicom is \
  379 + evt.GetEventObject().dicom_info
  380 + self.selected_panel.select_on = self.selected_panel is evt.GetEventObject()
  381 + print "Unselecting a panel", self.selected_panel.select_on
  382 + self.selected_panel.Select()
  383 + self.selected_panel = evt.GetEventObject()
  384 + self.selected_dicom = self.selected_panel.dicom_info
372 385 self.GetEventHandler().ProcessEvent(my_evt)
373 386  
374 387 def SetPatientGroups(self, patient):
... ... @@ -379,10 +392,11 @@ class DicomPreviewSeries(wx.Panel):
379 392 self.group_list = group_list
380 393 n = 0
381 394 for group in group_list:
382   - info = DicomInfo(n, group.dicom,
  395 + info = DicomInfo((group.dicom.patient.id,
  396 + group.dicom.acquisition.serie_number),
  397 + group.dicom,
383 398 group.title,
384   - _("%d Images") %(group.nslices),
385   - )
  399 + _("%d Images") %(group.nslices))
386 400 self.files.append(info)
387 401 n+=1
388 402  
... ... @@ -417,6 +431,8 @@ class DicomPreviewSeries(wx.Panel):
417 431 for f, p in zip(self.files[initial:final], self.previews):
418 432 #print "f", f
419 433 p.SetDicomToPreview(f)
  434 + if f.selected:
  435 + self.selected_panel = p
420 436 #p.interactor.Render()
421 437  
422 438 for f, p in zip(self.files[initial:final], self.previews):
... ... @@ -436,6 +452,8 @@ class DicomPreviewSlice(wx.Panel):
436 452 # I have to test.
437 453 self.displayed_position = 0
438 454 self.nhidden_last_display = 0
  455 + self.selected_dicom = None
  456 + self.selected_panel = None
439 457 self._init_ui()
440 458  
441 459 def _init_ui(self):
... ... @@ -516,8 +534,8 @@ class DicomPreviewSlice(wx.Panel):
516 534 n = 0
517 535 for dicom in dicom_files:
518 536 info = DicomInfo(n, dicom,
519   - _("Image %d") % (dicom.image.number),
520   - "%.2f" % (dicom.image.position[2]),
  537 + _("Image %d") % (dicom.image.number),
  538 + "%.2f" % (dicom.image.position[2]),
521 539 )
522 540 self.files.append(info)
523 541 n+=1
... ... @@ -555,6 +573,8 @@ class DicomPreviewSlice(wx.Panel):
555 573  
556 574 for f, p in zip(self.files[initial:final], self.previews):
557 575 p.SetDicomToPreview(f)
  576 + if f.selected:
  577 + self.selected_panel = p
558 578 #p.interactor.Render()
559 579  
560 580 for f, p in zip(self.files[initial:final], self.previews):
... ... @@ -570,6 +590,15 @@ class DicomPreviewSlice(wx.Panel):
570 590 my_evt = SerieEvent(myEVT_CLICK_SLICE, self.GetId())
571 591 my_evt.SetSelectedID(evt.GetSelectID())
572 592 my_evt.SetItemData(evt.GetItemData())
  593 +
  594 + if self.selected_dicom:
  595 + self.selected_dicom.selected = self.selected_dicom is \
  596 + evt.GetEventObject().dicom_info
  597 + self.selected_panel.select_on = self.selected_panel is evt.GetEventObject()
  598 + print "Unselecting a panel", self.selected_panel.select_on
  599 + self.selected_panel.Select()
  600 + self.selected_panel = evt.GetEventObject()
  601 + self.selected_dicom = self.selected_panel.dicom_info
573 602 self.GetEventHandler().ProcessEvent(my_evt)
574 603  
575 604  
... ... @@ -737,11 +766,6 @@ class SingleImagePreview(wx.Panel):
737 766 dicom.acquisition.time)
738 767 self.text_acquisition.SetValue(value)
739 768  
740   - # READ FILE
741   - #filename = dicom.image.file
742   - #reader = vtkgdcm.vtkGDCMImageReader()
743   - #reader.SetFileName(filename)
744   -
745 769 # ADJUST CONTRAST
746 770 window_level = dicom.image.level
747 771 window_width = dicom.image.window
... ... @@ -755,6 +779,9 @@ class SingleImagePreview(wx.Panel):
755 779 self.renderer.ResetCamera()
756 780 self.interactor.Render()
757 781  
  782 + # Setting slider position
  783 + self.slider.SetValue(index)
  784 +
758 785 def __del__(self):
759 786 print "---------> morri"
760 787  
... ...
invesalius/gui/import_panel.py
... ... @@ -30,6 +30,9 @@ EVT_SELECT_SERIE = wx.PyEventBinder(myEVT_SELECT_SERIE, 1)
30 30 myEVT_SELECT_SLICE = wx.NewEventType()
31 31 EVT_SELECT_SLICE = wx.PyEventBinder(myEVT_SELECT_SLICE, 1)
32 32  
  33 +myEVT_SELECT_PATIENT = wx.NewEventType()
  34 +EVT_SELECT_PATIENT = wx.PyEventBinder(myEVT_SELECT_PATIENT, 1)
  35 +
33 36 class SelectEvent(wx.PyCommandEvent):
34 37 def __init__(self , evtType, id):
35 38 super(SelectEvent, self).__init__(evtType, id)
... ... @@ -69,6 +72,8 @@ class InnerPanel(wx.Panel):
69 72 wx.Panel.__init__(self, parent, pos=wx.Point(5, 5))#,
70 73 #size=wx.Size(680, 656))
71 74  
  75 + self.patients = []
  76 +
72 77 splitter = spl.MultiSplitterWindow(self, style=wx.SP_LIVE_UPDATE)
73 78 splitter.SetOrientation(wx.VERTICAL)
74 79 self.splitter = splitter
... ... @@ -106,38 +111,56 @@ class InnerPanel(wx.Panel):
106 111 def _bind_events(self):
107 112 self.Bind(EVT_SELECT_SERIE, self.OnSelectSerie)
108 113 self.Bind(EVT_SELECT_SLICE, self.OnSelectSlice)
  114 + self.Bind(EVT_SELECT_PATIENT, self.OnSelectPatient)
109 115  
110 116 def ShowDicomPreview(self, pubsub_evt):
111   - dicom_groups = pubsub_evt.data
  117 + dicom_groups = pubsub_evt.data
  118 + self.patients.extend(dicom_groups)
112 119 self.text_panel.Populate(dicom_groups)
113 120  
114 121 def OnSelectSerie(self, evt):
115   - print "You've selected the serie", evt.GetSelectID()
  122 + patient_id, serie_number = evt.GetSelectID()
  123 + self.text_panel.SelectSerie(evt.GetSelectID())
  124 + for patient in self.patients:
  125 + if patient_id == patient.GetDicomSample().patient.id:
  126 + for group in patient.GetGroups():
  127 + if serie_number == group.GetDicomSample().acquisition.serie_number:
  128 + self.image_panel.SetSerie(group)
116 129  
117 130 def OnSelectSlice(self, evt):
118 131 print "You've selected the slice", evt.GetSelectID()
  132 +
  133 + def OnSelectPatient(self, evt):
  134 + print "You've selected the patient", evt.GetSelectID()
119 135  
120 136  
121 137 class TextPanel(wx.Panel):
122 138 def __init__(self, parent):
123 139 wx.Panel.__init__(self, parent, -1)
124   - self.Bind(wx.EVT_SIZE, self.OnSize)
  140 +
  141 + self._selected_by_user = True
  142 + self.idserie_treeitem = {}
  143 + self.treeitem_idpatient = {}
125 144  
126 145 self.__init_gui()
127   - self.__bind_evt()
  146 + self.__bind_events_wx()
  147 + self.__bind_pubsub_evt()
128 148  
129   - def __bind_evt(self):
  149 + def __bind_pubsub_evt(self):
130 150 ps.Publisher().subscribe(self.SelectSeries, 'Select series in import panel')
131 151  
  152 + def __bind_events_wx(self):
  153 + self.Bind(wx.EVT_SIZE, self.OnSize)
  154 +
132 155 def __init_gui(self):
133 156 tree = gizmos.TreeListCtrl(self, -1, style =
134   - wx.TR_DEFAULT_STYLE
135   - | wx.TR_HIDE_ROOT
136   - | wx.TR_ROW_LINES
137   - | wx.TR_COLUMN_LINES
138   - | wx.TR_FULL_ROW_HIGHLIGHT
139   - | wx.TR_SINGLE
140   - )
  157 + wx.TR_DEFAULT_STYLE
  158 + | wx.TR_HIDE_ROOT
  159 + | wx.TR_ROW_LINES
  160 + | wx.TR_COLUMN_LINES
  161 + | wx.TR_FULL_ROW_HIGHLIGHT
  162 + | wx.TR_SINGLE
  163 + )
141 164  
142 165  
143 166 tree.AddColumn(_("Patient name"))
... ... @@ -175,7 +198,6 @@ class TextPanel(wx.Panel):
175 198  
176 199 def Populate(self, patient_list):
177 200 tree = self.tree
178   - self.idserie_treeitem = {}
179 201  
180 202 first = 0
181 203 for patient in patient_list:
... ... @@ -219,7 +241,8 @@ class TextPanel(wx.Panel):
219 241 tree.SetItemText(child, "%s" % date_time, 6)
220 242 tree.SetItemText(child, "%s" % group.nslices, 7)
221 243  
222   - self.idserie_treeitem[n] = child
  244 + self.idserie_treeitem[(dicom.patient.id,
  245 + dicom.acquisition.serie_number)] = child
223 246  
224 247 tree.Expand(self.root)
225 248  
... ... @@ -231,13 +254,25 @@ class TextPanel(wx.Panel):
231 254  
232 255 def OnSelChanged(self, evt):
233 256 item = self.tree.GetSelection()
234   - group = self.tree.GetItemPyData(item)
235   - if isinstance(group, dcm.DicomGroup):
236   - ps.Publisher().sendMessage('Load group into import panel',
237   - group)
238   - elif isinstance(group, dcm.PatientGroup):
239   - ps.Publisher().sendMessage('Load patient into import panel',
240   - group)
  257 + if self._selected_by_user:
  258 + print "Yes, I'm here"
  259 + group = self.tree.GetItemPyData(item)
  260 + if isinstance(group, dcm.DicomGroup):
  261 + ps.Publisher().sendMessage('Load group into import panel',
  262 + group)
  263 +
  264 + elif isinstance(group, dcm.PatientGroup):
  265 + id = group.GetDicomSample().patient.id
  266 + my_evt = SelectEvent(myEVT_SELECT_PATIENT, self.GetId())
  267 + my_evt.SetSelectedID(id)
  268 + self.GetEventHandler().ProcessEvent(my_evt)
  269 +
  270 + ps.Publisher().sendMessage('Load patient into import panel',
  271 + group)
  272 + else:
  273 + parent_id = self.tree.GetItemParent(item)
  274 + self.tree.Expand(parent_id)
  275 + evt.Skip()
241 276  
242 277 def OnActivate(self, evt):
243 278 item = evt.GetItem()
... ... @@ -255,8 +290,10 @@ class TextPanel(wx.Panel):
255 290 self.tree.SetSize(self.GetSize())
256 291  
257 292 def SelectSerie(self, serie):
  293 + self._selected_by_user = False
258 294 item = self.idserie_treeitem[serie]
259 295 self.tree.SelectItem(item)
  296 + self._selected_by_user = True
260 297  
261 298  
262 299 class ImagePanel(wx.Panel):
... ... @@ -303,6 +340,9 @@ class ImagePanel(wx.Panel):
303 340 self.image_panel.dicom_preview.ShowSlice(evt.GetSelectID())
304 341 evt.Skip()
305 342  
  343 + def SetSerie(self, serie):
  344 + self.image_panel.dicom_preview.SetDicomGroup(serie)
  345 +
306 346  
307 347 class SeriesPanel(wx.Panel):
308 348 def __init__(self, parent):
... ... @@ -365,9 +405,9 @@ class SeriesPanel(wx.Panel):
365 405 my_evt.SetItemData(evt.GetItemData())
366 406 self.GetEventHandler().ProcessEvent(my_evt)
367 407  
368   - self.dicom_preview.SetDicomSerie(serie)
369   - self.dicom_preview.Show(1)
370   - self.serie_preview.Show(0)
  408 + #self.dicom_preview.SetDicomGroup(serie)
  409 + #self.dicom_preview.Show(1)
  410 + #self.serie_preview.Show(0)
371 411 self.sizer.Layout()
372 412 #self.Show()
373 413 self.Update()
... ...