Commit 50e3d457db14ae0eea05fedbcd022b5a60964e7a

Authored by tatiana
1 parent 81a37add

ENH: Structure of project management (moved all to control)

invesalius/control.py
... ... @@ -51,7 +51,14 @@ class Controller():
51 51  
52 52 def __bind_events(self):
53 53 ps.Publisher().subscribe(self.OnImportMedicalImages, 'Import directory')
54   - ps.Publisher().subscribe(self.StartImportPanel, "Load data to import panel")
  54 + #ps.Publisher().subscribe(self.StartImportPanel, "Load data to import panel")
  55 + ps.Publisher().subscribe(self.OnShowDialogImportDirectory,
  56 + 'Show import directory dialog')
  57 + ps.Publisher().subscribe(self.OnShowDialogOpenProject,
  58 + 'Show open project dialog')
  59 +
  60 + ps.Publisher().subscribe(self.OnShowDialogSaveProject, 'Show save dialog')
  61 +
55 62 ps.Publisher().subscribe(self.LoadRaycastingPreset,
56 63 'Load raycasting preset')
57 64 ps.Publisher().subscribe(self.SaveRaycastingPreset,
... ... @@ -61,18 +68,82 @@ class Controller():
61 68 ps.Publisher().subscribe(self.Progress, "Update dicom load")
62 69 ps.Publisher().subscribe(self.OnLoadImportPanel, "End dicom load")
63 70 ps.Publisher().subscribe(self.OnCancelImport, 'Cancel DICOM load')
64   - ps.Publisher().subscribe(self.OnSaveProject, 'Save Project')
65   - ps.Publisher().subscribe(self.OnOpenProject, 'Open Project')
  71 + #ps.Publisher().subscribe(self.OnSaveProject, 'Save Project')
  72 + #ps.Publisher().subscribe(self.OnOpenProject, 'Open Project')
66 73 ps.Publisher().subscribe(self.OnCloseProject, 'Close Project')
67 74  
68 75  
69 76 def OnCancelImport(self, pubsub_evt):
70 77 #self.cancel_import = True
71 78 ps.Publisher().sendMessage('Hide import panel')
  79 +
  80 + def OnShowDialogImportDirectory(self, pubsub_evt):
  81 + self.ShowDialogImportDirectory()
  82 +
  83 + def OnShowDialogOpenProject(self, pubsub_evt):
  84 + self.ShowDialogOpenProject()
  85 +
  86 + def OnShowDialogSaveProject(self, pubsub_evt):
  87 + saveas = pubsub_evt.data
  88 + self.ShowDialogSaveProject(saveas)
  89 +
  90 +###########################
  91 +
  92 + def ShowDialogImportDirectory(self):
  93 + dirpath = dialog.ShowImportDirDialog()
  94 + if dirpath:
  95 + self.StartImportPanel(dirpath)
  96 + ps.Publisher().sendMessage("Load data to import panel", dirpath)
  97 +
  98 + def ShowDialogOpenProject(self):
  99 + filepath = dialog.ShowOpenProjectDialog()
  100 + if filepath:
  101 + self.OpenProject(filepath)
  102 +
  103 + def OpenProject(self, filepath):
  104 + path = os.path.abspath(filepath)
  105 +
  106 + proj = prj.Project()
  107 + proj.OpenPlistProject(path)
  108 + proj.SetAcquisitionModality(proj.modality)
  109 +
  110 + session = ses.Session()
  111 + session.OpenProject(path)
  112 +
  113 + self.LoadProject()
  114 +
  115 + def ShowDialogSaveProject(self, saveas=False):
  116 + session = ses.Session()
  117 + if saveas:
  118 + proj = prj.Project()
  119 + filepath = dialog.ShowSaveAsProjectDialog(proj.name)
  120 + if filepath:
  121 + session.RemoveTemp()
  122 + session.OpenProject(filepath)
  123 + else:
  124 + return
  125 + else:
  126 + dirpath, filename = session.project_path
  127 + filepath = os.path.join(dirpath, filename)
72 128  
73   - def StartImportPanel(self, pubsub_evt):
74   - # path to directory
75   - path = pubsub_evt.data
  129 + self.SaveProject(filepath)
  130 +
  131 + def SaveProject(self, path=None):
  132 + session = ses.Session()
  133 + if path:
  134 + dirpath, filename = os.path.split(path)
  135 + session.SaveProject((dirpath, filename))
  136 + else:
  137 + dirpath, filename = session.project_path
  138 +
  139 + proj = prj.Project()
  140 + prj.Project().SavePlistProject(dirpath, filename)
  141 +
  142 +##################################
  143 +
  144 +
  145 +
  146 + def StartImportPanel(self, path):
76 147  
77 148 # retrieve DICOM files splited into groups
78 149 reader = dcm.ProgressDicomReader()
... ... @@ -265,59 +336,8 @@ class Controller():
265 336 preset_dir = os.path.join(const.USER_RAYCASTING_PRESETS_DIRECTORY, preset_name)
266 337 plistlib.writePlist(preset, preset_dir)
267 338  
268   - def OnSaveProject(self, pubsub_evt):
269   - session = ses.Session()
270   -
271   - path = pubsub_evt.data
272   - if path:
273   - print "----- FILENAME"
274   - dirpath, filename = os.path.split(path)
275   - session.SaveProject((dirpath, filename))
276   - else:
277   - dirpath, filename = session.project_path
278   -
279   - print "$$$$$$$$$$$$$$$$$$$$$$$$$$"
280   - print "filename: ", filename
281   - print "dirpath: ", dirpath
282   -
283   - proj = prj.Project()
284   - prj.Project().SavePlistProject(dirpath, filename)
285   -
286   -
287   -
288   -
289   - #if not(pubsub_evt.data):
290   - # filename = prj.Project().path
291   - #else:
292   - # filename = pubsub_evt.data
293   - #dir_,filename = os.path.split(filename)
294   -
295   - #if not (filename):
296   - # filename = prj.Project().name
297   - #else:
298   - # filename = filename.replace(' ','_')
299   - # prj.Project().name = filename
300   - #prj.Project().path = filename
301   - #print prj.Project().path
302   -
303   - #prj.Project().SavePlistProject(dirpath, filename)
304   -
305   - #session.project_status = const.PROJ_OPEN
306   - #session.project_path = (dirpath, filename)
307   -
308   - def OnOpenProject(self, pubsub_evt):
309   - path = os.path.abspath(pubsub_evt.data)
310   -
311   - proj = prj.Project()
312   - proj.OpenPlistProject(path)
313   - proj.SetAcquisitionModality(proj.modality)
314   - ###proj.path = filename
315   - ###proj.save_as = False
316 339  
317   - session = ses.Session()
318   - session.OpenProject(path)
319 340  
320   - self.LoadProject()
321 341  
322 342 def OnCloseProject(self, pubsub_evt):
323 343 print "OnCloseProject"
... ... @@ -327,7 +347,12 @@ class Controller():
327 347 if (st == const.PROJ_NEW) or (st == const.PROJ_CHANGE):
328 348 answer = dialog.SaveChangesDialog(filename)
329 349 if not answer:
330   - print "Delete all"
331   - elif answer > 1:
332   - print "Save"
  350 + print "Close without changes"
  351 + elif answer == 1:
  352 + print "Save changes and close"
  353 + #else:
  354 + # print "Cancel"
  355 + else:
  356 + print ":) Close without changes"
  357 +
333 358  
... ...
invesalius/gui/dialogs.py
... ... @@ -47,7 +47,7 @@ class NumberDialog(wx.Dialog):
47 47 btn_ok.SetDefault()
48 48  
49 49 btn_cancel = wx.Button(self, wx.ID_CANCEL)
50   - btn_cancel.SetHelpText("Value will not be applied.)")
  50 + btn_cancel.SetHelpText("Value will not be applied.")
51 51  
52 52 btnsizer = wx.StdDialogButtonSizer()
53 53 btnsizer.AddButton(btn_ok)
... ... @@ -192,16 +192,80 @@ def ShowSaveAsProjectDialog(default_filename=None):
192 192 filename = filename + "." + extension
193 193 return filename
194 194  
  195 +
  196 +
  197 +
  198 +
  199 +
  200 +
  201 +
  202 +
  203 +
  204 +
  205 +class MessageDialog(wx.Dialog):
  206 + def __init__(self, message):
  207 + pre = wx.PreDialog()
  208 + pre.Create(None, -1, "InVesalius 3", size=(360, 370), pos=wx.DefaultPosition,
  209 + style=wx.DEFAULT_DIALOG_STYLE|wx.ICON_INFORMATION)
  210 + self.PostCreate(pre)
  211 +
  212 + # Static text which contains message to user
  213 + label = wx.StaticText(self, -1, message)
  214 +
  215 + # Buttons
  216 + btn_yes = wx.Button(self, wx.ID_YES)
  217 + btn_yes.SetHelpText("")
  218 + btn_yes.SetDefault()
  219 +
  220 + btn_no = wx.Button(self, wx.ID_NO)
  221 + btn_no.SetHelpText("")
  222 +
  223 + btn_cancel = wx.Button(self, wx.ID_CANCEL)
  224 + btn_cancel.SetHelpText("")
  225 +
  226 + btnsizer = wx.StdDialogButtonSizer()
  227 + btnsizer.AddButton(btn_yes)
  228 + btnsizer.AddButton(btn_cancel)
  229 + btnsizer.AddButton(btn_no)
  230 + btnsizer.Realize()
  231 +
  232 +
  233 + sizer = wx.BoxSizer(wx.VERTICAL)
  234 + sizer.Add(label, 0, wx.ALIGN_CENTRE|wx.ALL, 5)
  235 + sizer.Add(btnsizer, 0, wx.ALIGN_CENTER_VERTICAL|
  236 + wx.ALIGN_CENTER_HORIZONTAL|wx.ALL, 5)
  237 + self.SetSizer(sizer)
  238 + sizer.Fit(self)
  239 +
  240 + self.Centre()
  241 +
  242 +def SaveChangesDialog__Old(filename):
  243 + message = "Save changes to "+filename+"?"
  244 + dlg = MessageDialog(message)
  245 +
  246 + answer = dlg.ShowModal()
  247 + dlg.Destroy()
  248 + if answer == wx.ID_YES:
  249 + return 1
  250 + elif answer == wx.ID_NO:
  251 + return 0
  252 + else:
  253 + return -1
  254 +
  255 +
195 256 def SaveChangesDialog(filename):
196   - dlg = wx.MessageDialog(None,
197   - "InVesalius 3",
198   - "Save changes to "+filename+"?",
199   - wx.YES | wx.NO | wx.CANCEL | wx.ICON_INFORMATION)
200 257  
201   - if dlg.ShowModal() == wx.ID_YES:
  258 + dlg = wx.MessageDialog(None, "",
  259 + "Save changes to "+filename+"?",
  260 + wx.ICON_QUESTION | wx.YES_NO | wx.CANCEL)
  261 + answer = dlg.ShowModal()
  262 + dlg.Destroy()
  263 +
  264 + if answer == wx.ID_YES:
202 265 return 1
203   - elif dlg.ShowModal() == wx.ID_NO:
  266 + elif answer == wx.ID_NO:
204 267 return 0
205 268 else:
206 269 return -1
207 270  
  271 +
... ...
invesalius/gui/frame.py
... ... @@ -214,10 +214,7 @@ class Frame(wx.Frame):
214 214 evt.Skip()
215 215  
216 216 def OnMenuClick(self, evt):
217   - #ps.Publisher().sendMessage(("Event from GUI",
218   - # evt.GetId()))
219 217 id = evt.GetId()
220   - #proj = prj.Project()
221 218 session = ses.Session()
222 219 if id == const.ID_DICOM_IMPORT:
223 220 self.ImportDicom()
... ... @@ -237,49 +234,16 @@ class Frame(wx.Frame):
237 234 self.Exit()
238 235  
239 236 def ImportDicom(self):
240   - dirpath = dlg.ShowImportDirDialog()
241   - if dirpath:
242   - ps.Publisher().sendMessage("Load data to import panel", dirpath)
  237 + ps.Publisher().sendMessage('Show import directory dialog')
243 238  
244 239 def OpenProject(self):
245   - filepath = dlg.ShowOpenProjectDialog()
246   - if filepath:
247   - ps.Publisher().sendMessage('Open Project', filepath)
  240 + ps.Publisher().sendMessage('Show open project dialog')
248 241  
249 242 def SaveAsProject(self):
250   - self.SaveProject(True)
  243 + ps.Publisher().sendMessage('Show save dialog', True)
251 244  
252   - def SaveProject(self, saveas=False):
253   -
254   - session = ses.Session()
255   - if saveas:
256   - proj = prj.Project()
257   - filepath = dlg.ShowSaveAsProjectDialog(proj.name)
258   - if filepath:
259   - session.RemoveTemp()
260   - session.OpenProject(filepath)
261   - else:
262   - return
263   - else:
264   - dirpath, filename = session.project_path
265   - filepath = os.path.join(dirpath, filename)
266   - ps.Publisher().sendMessage('Save Project',filepath)
267   -
268   -
269   - def SaveAsOld(self):
270   -
271   - filename = (Project().name).replace(' ','_')
272   - filename = dlg.ShowSaveAsProjectDialog(filename)
273   - if filename:
274   - Project().save_as = False
275   - else:
276   - return
277   - self.SaveProject(filename)
278   -
279   - def SaveProjectOld(self, filename=None):
280   - if not filename:
281   - filename = Project().name
282   - ps.Publisher().sendMessage('Save Project',filename)
  245 + def SaveProject(self):
  246 + ps.Publisher().sendMessage('Show save dialog', False)
283 247  
284 248 def CloseProject(self):
285 249 ps.Publisher().sendMessage('Close Project')
... ...
invesalius/gui/task_importer.py
... ... @@ -138,42 +138,51 @@ class InnerTaskPanel(wx.Panel):
138 138 #self.TestLoadProjects()
139 139  
140 140 def OnLinkImport(self, event):
141   - self.LinkImport()
  141 + self.ImportDicom()
142 142 event.Skip()
143 143  
144 144 def OnLinkImportPACS(self, event):
145   - self.LinkImportPACS()
  145 + self.ImportPACS()
146 146 event.Skip()
147 147  
148 148 def OnLinkOpenProject(self, event):
149   - self.LinkOpenProject()
  149 + self.OpenProject()
150 150 event.Skip()
151 151  
152   - def LinkImport(self):
153   - dirpath = dlg.ShowImportDirDialog()
154   - if dirpath:
155   - ps.Publisher().sendMessage("Load data to import panel", dirpath)
156 152  
157   - def LinkImportPACS(self):
  153 + def ImportPACS(self):
158 154 print "TODO: Send Signal - Import DICOM files from PACS"
159 155  
160   - def LinkOpenProject(self, filename=None):
  156 +
  157 +#######
  158 + def ImportDicom(self):
  159 + ps.Publisher().sendMessage('Show import directory dialog')
  160 +
  161 + def OpenProject(self, filename=None):
161 162 if filename:
162   - print "TODO: Send Signal - Open inv3 last project"
  163 + print "TODO: Send Signal - Open "+filename
163 164 else:
164   - filepath = dlg.ShowOpenProjectDialog()
165   - if filepath:
166   - ps.Publisher().sendMessage('Open Project', filepath)
  165 + ps.Publisher().sendMessage('Show open project dialog')
  166 +
  167 + def SaveAsProject(self):
  168 + ps.Publisher().sendMessage('Show save dialog', True)
  169 +
  170 + def SaveProject(self):
  171 + ps.Publisher().sendMessage('Show save dialog', False)
  172 +
  173 + def CloseProject(self):
  174 + ps.Publisher().sendMessage('Close Project')
  175 +#######
167 176  
168 177 def OnButton(self, evt):
169 178 id = evt.GetId()
170 179  
171 180 if id == BTN_IMPORT_LOCAL:
172   - self.LinkImport()
  181 + self.ImportDicom()
173 182 elif id == BTN_IMPORT_PACS:
174   - self.LinkImportPACS()
  183 + self.ImportPACS()
175 184 else: #elif id == BTN_OPEN_PROJECT:
176   - self.LinkOpenProject()
  185 + self.OpenProject()
177 186  
178 187 def TestLoadProjects(self):
179 188 self.LoadProject("test1.inv3")
... ...