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,6 +286,7 @@ class Preview(wx.Panel): | ||
286 | my_evt = SerieEvent(myEVT_PREVIEW_CLICK, self.GetId()) | 286 | my_evt = SerieEvent(myEVT_PREVIEW_CLICK, self.GetId()) |
287 | my_evt.SetSelectedID(self.dicom_info.id) | 287 | my_evt.SetSelectedID(self.dicom_info.id) |
288 | my_evt.SetItemData(self.dicom_info.dicom) | 288 | my_evt.SetItemData(self.dicom_info.dicom) |
289 | + my_evt.SetEventObject(self) | ||
289 | print "patient", self.dicom_info.dicom.patient | 290 | print "patient", self.dicom_info.dicom.patient |
290 | self.GetEventHandler().ProcessEvent(my_evt) | 291 | self.GetEventHandler().ProcessEvent(my_evt) |
291 | 292 | ||
@@ -306,6 +307,7 @@ class Preview(wx.Panel): | @@ -306,6 +307,7 @@ class Preview(wx.Panel): | ||
306 | my_evt = SerieEvent(myEVT_PREVIEW_DBLCLICK, self.GetId()) | 307 | my_evt = SerieEvent(myEVT_PREVIEW_DBLCLICK, self.GetId()) |
307 | my_evt.SetSelectedID(self.dicom_info.id) | 308 | my_evt.SetSelectedID(self.dicom_info.id) |
308 | my_evt.SetItemData(self.dicom_info.dicom) | 309 | my_evt.SetItemData(self.dicom_info.dicom) |
310 | + my_evt.SetEventObject(self) | ||
309 | self.GetEventHandler().ProcessEvent(my_evt) | 311 | self.GetEventHandler().ProcessEvent(my_evt) |
310 | 312 | ||
311 | 313 | ||
@@ -319,6 +321,8 @@ class DicomPreviewSeries(wx.Panel): | @@ -319,6 +321,8 @@ class DicomPreviewSeries(wx.Panel): | ||
319 | #self.SetSizer(self.sizer) | 321 | #self.SetSizer(self.sizer) |
320 | self.displayed_position = 0 | 322 | self.displayed_position = 0 |
321 | self.nhidden_last_display = 0 | 323 | self.nhidden_last_display = 0 |
324 | + self.selected_dicom = None | ||
325 | + self.selected_panel = None | ||
322 | self._init_ui() | 326 | self._init_ui() |
323 | 327 | ||
324 | def _init_ui(self): | 328 | def _init_ui(self): |
@@ -369,6 +373,15 @@ class DicomPreviewSeries(wx.Panel): | @@ -369,6 +373,15 @@ class DicomPreviewSeries(wx.Panel): | ||
369 | my_evt = SerieEvent(myEVT_CLICK_SERIE, self.GetId()) | 373 | my_evt = SerieEvent(myEVT_CLICK_SERIE, self.GetId()) |
370 | my_evt.SetSelectedID(evt.GetSelectID()) | 374 | my_evt.SetSelectedID(evt.GetSelectID()) |
371 | my_evt.SetItemData(evt.GetItemData()) | 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 | self.GetEventHandler().ProcessEvent(my_evt) | 385 | self.GetEventHandler().ProcessEvent(my_evt) |
373 | 386 | ||
374 | def SetPatientGroups(self, patient): | 387 | def SetPatientGroups(self, patient): |
@@ -379,10 +392,11 @@ class DicomPreviewSeries(wx.Panel): | @@ -379,10 +392,11 @@ class DicomPreviewSeries(wx.Panel): | ||
379 | self.group_list = group_list | 392 | self.group_list = group_list |
380 | n = 0 | 393 | n = 0 |
381 | for group in group_list: | 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 | group.title, | 398 | group.title, |
384 | - _("%d Images") %(group.nslices), | ||
385 | - ) | 399 | + _("%d Images") %(group.nslices)) |
386 | self.files.append(info) | 400 | self.files.append(info) |
387 | n+=1 | 401 | n+=1 |
388 | 402 | ||
@@ -417,6 +431,8 @@ class DicomPreviewSeries(wx.Panel): | @@ -417,6 +431,8 @@ class DicomPreviewSeries(wx.Panel): | ||
417 | for f, p in zip(self.files[initial:final], self.previews): | 431 | for f, p in zip(self.files[initial:final], self.previews): |
418 | #print "f", f | 432 | #print "f", f |
419 | p.SetDicomToPreview(f) | 433 | p.SetDicomToPreview(f) |
434 | + if f.selected: | ||
435 | + self.selected_panel = p | ||
420 | #p.interactor.Render() | 436 | #p.interactor.Render() |
421 | 437 | ||
422 | for f, p in zip(self.files[initial:final], self.previews): | 438 | for f, p in zip(self.files[initial:final], self.previews): |
@@ -436,6 +452,8 @@ class DicomPreviewSlice(wx.Panel): | @@ -436,6 +452,8 @@ class DicomPreviewSlice(wx.Panel): | ||
436 | # I have to test. | 452 | # I have to test. |
437 | self.displayed_position = 0 | 453 | self.displayed_position = 0 |
438 | self.nhidden_last_display = 0 | 454 | self.nhidden_last_display = 0 |
455 | + self.selected_dicom = None | ||
456 | + self.selected_panel = None | ||
439 | self._init_ui() | 457 | self._init_ui() |
440 | 458 | ||
441 | def _init_ui(self): | 459 | def _init_ui(self): |
@@ -516,8 +534,8 @@ class DicomPreviewSlice(wx.Panel): | @@ -516,8 +534,8 @@ class DicomPreviewSlice(wx.Panel): | ||
516 | n = 0 | 534 | n = 0 |
517 | for dicom in dicom_files: | 535 | for dicom in dicom_files: |
518 | info = DicomInfo(n, dicom, | 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 | self.files.append(info) | 540 | self.files.append(info) |
523 | n+=1 | 541 | n+=1 |
@@ -555,6 +573,8 @@ class DicomPreviewSlice(wx.Panel): | @@ -555,6 +573,8 @@ class DicomPreviewSlice(wx.Panel): | ||
555 | 573 | ||
556 | for f, p in zip(self.files[initial:final], self.previews): | 574 | for f, p in zip(self.files[initial:final], self.previews): |
557 | p.SetDicomToPreview(f) | 575 | p.SetDicomToPreview(f) |
576 | + if f.selected: | ||
577 | + self.selected_panel = p | ||
558 | #p.interactor.Render() | 578 | #p.interactor.Render() |
559 | 579 | ||
560 | for f, p in zip(self.files[initial:final], self.previews): | 580 | for f, p in zip(self.files[initial:final], self.previews): |
@@ -570,6 +590,15 @@ class DicomPreviewSlice(wx.Panel): | @@ -570,6 +590,15 @@ class DicomPreviewSlice(wx.Panel): | ||
570 | my_evt = SerieEvent(myEVT_CLICK_SLICE, self.GetId()) | 590 | my_evt = SerieEvent(myEVT_CLICK_SLICE, self.GetId()) |
571 | my_evt.SetSelectedID(evt.GetSelectID()) | 591 | my_evt.SetSelectedID(evt.GetSelectID()) |
572 | my_evt.SetItemData(evt.GetItemData()) | 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 | self.GetEventHandler().ProcessEvent(my_evt) | 602 | self.GetEventHandler().ProcessEvent(my_evt) |
574 | 603 | ||
575 | 604 | ||
@@ -737,11 +766,6 @@ class SingleImagePreview(wx.Panel): | @@ -737,11 +766,6 @@ class SingleImagePreview(wx.Panel): | ||
737 | dicom.acquisition.time) | 766 | dicom.acquisition.time) |
738 | self.text_acquisition.SetValue(value) | 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 | # ADJUST CONTRAST | 769 | # ADJUST CONTRAST |
746 | window_level = dicom.image.level | 770 | window_level = dicom.image.level |
747 | window_width = dicom.image.window | 771 | window_width = dicom.image.window |
@@ -755,6 +779,9 @@ class SingleImagePreview(wx.Panel): | @@ -755,6 +779,9 @@ class SingleImagePreview(wx.Panel): | ||
755 | self.renderer.ResetCamera() | 779 | self.renderer.ResetCamera() |
756 | self.interactor.Render() | 780 | self.interactor.Render() |
757 | 781 | ||
782 | + # Setting slider position | ||
783 | + self.slider.SetValue(index) | ||
784 | + | ||
758 | def __del__(self): | 785 | def __del__(self): |
759 | print "---------> morri" | 786 | print "---------> morri" |
760 | 787 |
invesalius/gui/import_panel.py
@@ -30,6 +30,9 @@ EVT_SELECT_SERIE = wx.PyEventBinder(myEVT_SELECT_SERIE, 1) | @@ -30,6 +30,9 @@ EVT_SELECT_SERIE = wx.PyEventBinder(myEVT_SELECT_SERIE, 1) | ||
30 | myEVT_SELECT_SLICE = wx.NewEventType() | 30 | myEVT_SELECT_SLICE = wx.NewEventType() |
31 | EVT_SELECT_SLICE = wx.PyEventBinder(myEVT_SELECT_SLICE, 1) | 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 | class SelectEvent(wx.PyCommandEvent): | 36 | class SelectEvent(wx.PyCommandEvent): |
34 | def __init__(self , evtType, id): | 37 | def __init__(self , evtType, id): |
35 | super(SelectEvent, self).__init__(evtType, id) | 38 | super(SelectEvent, self).__init__(evtType, id) |
@@ -69,6 +72,8 @@ class InnerPanel(wx.Panel): | @@ -69,6 +72,8 @@ class InnerPanel(wx.Panel): | ||
69 | wx.Panel.__init__(self, parent, pos=wx.Point(5, 5))#, | 72 | wx.Panel.__init__(self, parent, pos=wx.Point(5, 5))#, |
70 | #size=wx.Size(680, 656)) | 73 | #size=wx.Size(680, 656)) |
71 | 74 | ||
75 | + self.patients = [] | ||
76 | + | ||
72 | splitter = spl.MultiSplitterWindow(self, style=wx.SP_LIVE_UPDATE) | 77 | splitter = spl.MultiSplitterWindow(self, style=wx.SP_LIVE_UPDATE) |
73 | splitter.SetOrientation(wx.VERTICAL) | 78 | splitter.SetOrientation(wx.VERTICAL) |
74 | self.splitter = splitter | 79 | self.splitter = splitter |
@@ -106,38 +111,56 @@ class InnerPanel(wx.Panel): | @@ -106,38 +111,56 @@ class InnerPanel(wx.Panel): | ||
106 | def _bind_events(self): | 111 | def _bind_events(self): |
107 | self.Bind(EVT_SELECT_SERIE, self.OnSelectSerie) | 112 | self.Bind(EVT_SELECT_SERIE, self.OnSelectSerie) |
108 | self.Bind(EVT_SELECT_SLICE, self.OnSelectSlice) | 113 | self.Bind(EVT_SELECT_SLICE, self.OnSelectSlice) |
114 | + self.Bind(EVT_SELECT_PATIENT, self.OnSelectPatient) | ||
109 | 115 | ||
110 | def ShowDicomPreview(self, pubsub_evt): | 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 | self.text_panel.Populate(dicom_groups) | 119 | self.text_panel.Populate(dicom_groups) |
113 | 120 | ||
114 | def OnSelectSerie(self, evt): | 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 | def OnSelectSlice(self, evt): | 130 | def OnSelectSlice(self, evt): |
118 | print "You've selected the slice", evt.GetSelectID() | 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 | class TextPanel(wx.Panel): | 137 | class TextPanel(wx.Panel): |
122 | def __init__(self, parent): | 138 | def __init__(self, parent): |
123 | wx.Panel.__init__(self, parent, -1) | 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 | self.__init_gui() | 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 | ps.Publisher().subscribe(self.SelectSeries, 'Select series in import panel') | 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 | def __init_gui(self): | 155 | def __init_gui(self): |
133 | tree = gizmos.TreeListCtrl(self, -1, style = | 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 | tree.AddColumn(_("Patient name")) | 166 | tree.AddColumn(_("Patient name")) |
@@ -175,7 +198,6 @@ class TextPanel(wx.Panel): | @@ -175,7 +198,6 @@ class TextPanel(wx.Panel): | ||
175 | 198 | ||
176 | def Populate(self, patient_list): | 199 | def Populate(self, patient_list): |
177 | tree = self.tree | 200 | tree = self.tree |
178 | - self.idserie_treeitem = {} | ||
179 | 201 | ||
180 | first = 0 | 202 | first = 0 |
181 | for patient in patient_list: | 203 | for patient in patient_list: |
@@ -219,7 +241,8 @@ class TextPanel(wx.Panel): | @@ -219,7 +241,8 @@ class TextPanel(wx.Panel): | ||
219 | tree.SetItemText(child, "%s" % date_time, 6) | 241 | tree.SetItemText(child, "%s" % date_time, 6) |
220 | tree.SetItemText(child, "%s" % group.nslices, 7) | 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 | tree.Expand(self.root) | 247 | tree.Expand(self.root) |
225 | 248 | ||
@@ -231,13 +254,25 @@ class TextPanel(wx.Panel): | @@ -231,13 +254,25 @@ class TextPanel(wx.Panel): | ||
231 | 254 | ||
232 | def OnSelChanged(self, evt): | 255 | def OnSelChanged(self, evt): |
233 | item = self.tree.GetSelection() | 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 | def OnActivate(self, evt): | 277 | def OnActivate(self, evt): |
243 | item = evt.GetItem() | 278 | item = evt.GetItem() |
@@ -255,8 +290,10 @@ class TextPanel(wx.Panel): | @@ -255,8 +290,10 @@ class TextPanel(wx.Panel): | ||
255 | self.tree.SetSize(self.GetSize()) | 290 | self.tree.SetSize(self.GetSize()) |
256 | 291 | ||
257 | def SelectSerie(self, serie): | 292 | def SelectSerie(self, serie): |
293 | + self._selected_by_user = False | ||
258 | item = self.idserie_treeitem[serie] | 294 | item = self.idserie_treeitem[serie] |
259 | self.tree.SelectItem(item) | 295 | self.tree.SelectItem(item) |
296 | + self._selected_by_user = True | ||
260 | 297 | ||
261 | 298 | ||
262 | class ImagePanel(wx.Panel): | 299 | class ImagePanel(wx.Panel): |
@@ -303,6 +340,9 @@ class ImagePanel(wx.Panel): | @@ -303,6 +340,9 @@ class ImagePanel(wx.Panel): | ||
303 | self.image_panel.dicom_preview.ShowSlice(evt.GetSelectID()) | 340 | self.image_panel.dicom_preview.ShowSlice(evt.GetSelectID()) |
304 | evt.Skip() | 341 | evt.Skip() |
305 | 342 | ||
343 | + def SetSerie(self, serie): | ||
344 | + self.image_panel.dicom_preview.SetDicomGroup(serie) | ||
345 | + | ||
306 | 346 | ||
307 | class SeriesPanel(wx.Panel): | 347 | class SeriesPanel(wx.Panel): |
308 | def __init__(self, parent): | 348 | def __init__(self, parent): |
@@ -365,9 +405,9 @@ class SeriesPanel(wx.Panel): | @@ -365,9 +405,9 @@ class SeriesPanel(wx.Panel): | ||
365 | my_evt.SetItemData(evt.GetItemData()) | 405 | my_evt.SetItemData(evt.GetItemData()) |
366 | self.GetEventHandler().ProcessEvent(my_evt) | 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 | self.sizer.Layout() | 411 | self.sizer.Layout() |
372 | #self.Show() | 412 | #self.Show() |
373 | self.Update() | 413 | self.Update() |