Commit 7040d74d51838af8cfd399b1a2ab2436179f8c67
1 parent
cf8e1cc5
Exists in
master
and in
6 other branches
ENH: Sync between treeview and preview and only show one selection in preview
Showing
2 changed files
with
101 additions
and
34 deletions
Show diff stats
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() | ... | ... |