Commit 6e9eeb391c88e0815023573632646f4dc705e4b6
Committed by
GitHub
1 parent
feaf214b
Exists in
master
Session as dict (#156)
* session as dict almost working * writing to json * Better last projection handling * was not closing when didn't have config * Not reading status from config file * removed unused fucntion * reading from cfg specifing the types * reading from cfg specifing the types * Removed unused parts * Added a get method to session * Using default in session * last folder to inv3 and other files in session * last folder to export and import stl export screenshots and open bmp folder in session
Showing
8 changed files
with
239 additions
and
176 deletions
Show diff stats
app.py
| ... | ... | @@ -147,9 +147,8 @@ class Inv3SplashScreen(SplashScreen): |
| 147 | 147 | create_session = True |
| 148 | 148 | |
| 149 | 149 | install_lang = 0 |
| 150 | - # Check if there is a language set (if session file exists | |
| 151 | - if session.ReadLanguage(): | |
| 152 | - lang = session.GetLanguage() | |
| 150 | + lang = session.GetLanguage() | |
| 151 | + if lang: | |
| 153 | 152 | if (lang != "False"): |
| 154 | 153 | _ = i18n.InstallLanguage(lang) |
| 155 | 154 | install_lang = 1 |
| ... | ... | @@ -179,7 +178,9 @@ class Inv3SplashScreen(SplashScreen): |
| 179 | 178 | invdir = os.path.join(homedir, ".invesalius") |
| 180 | 179 | shutil.rmtree(invdir) |
| 181 | 180 | sys.exit() |
| 182 | - | |
| 181 | + | |
| 182 | + dialog.Destroy() | |
| 183 | + | |
| 183 | 184 | # Session file should be created... So we set the recent |
| 184 | 185 | # choosen language |
| 185 | 186 | if (create_session): |
| ... | ... | @@ -187,7 +188,7 @@ class Inv3SplashScreen(SplashScreen): |
| 187 | 188 | session.SetLanguage(lang) |
| 188 | 189 | session.WriteSessionFile() |
| 189 | 190 | |
| 190 | - session.SaveConfigFileBackup() | |
| 191 | + # session.SaveConfigFileBackup() | |
| 191 | 192 | |
| 192 | 193 | |
| 193 | 194 | # Only after language was defined, splash screen will be | ... | ... |
invesalius/control.py
invesalius/data/surface.py
| ... | ... | @@ -159,6 +159,28 @@ class SurfaceManager(): |
| 159 | 159 | self.last_surface_index = 0 |
| 160 | 160 | self.__bind_events() |
| 161 | 161 | |
| 162 | + self._default_parameters = { | |
| 163 | + 'algorithm': 'Default', | |
| 164 | + 'quality': const.DEFAULT_SURFACE_QUALITY, | |
| 165 | + 'fill_holes': False, | |
| 166 | + 'keep_largest': False, | |
| 167 | + 'fill_border_holes': True, | |
| 168 | + } | |
| 169 | + | |
| 170 | + self._load_user_parameters() | |
| 171 | + | |
| 172 | + def _load_user_parameters(self): | |
| 173 | + session = ses.Session() | |
| 174 | + | |
| 175 | + if 'surface' in session: | |
| 176 | + self._default_parameters.update(session['surface']) | |
| 177 | + else: | |
| 178 | + session['surface'] = self._default_parameters | |
| 179 | + session.WriteSessionFile() | |
| 180 | + | |
| 181 | + print('Session', session) | |
| 182 | + | |
| 183 | + | |
| 162 | 184 | def __bind_events(self): |
| 163 | 185 | Publisher.subscribe(self.AddNewActor, 'Create surface') |
| 164 | 186 | Publisher.subscribe(self.SetActorTransparency, | ... | ... |
invesalius/gui/dialogs.py
| ... | ... | @@ -268,8 +268,10 @@ WILDCARD_MESH_FILES = "STL File format (*.stl)|*.stl|" \ |
| 268 | 268 | def ShowOpenProjectDialog(): |
| 269 | 269 | # Default system path |
| 270 | 270 | current_dir = os.path.abspath(".") |
| 271 | + session = ses.Session() | |
| 272 | + last_directory = session.get('paths', 'last_directory_inv3', '') | |
| 271 | 273 | dlg = wx.FileDialog(None, message=_("Open InVesalius 3 project..."), |
| 272 | - defaultDir="", | |
| 274 | + defaultDir=last_directory, | |
| 273 | 275 | defaultFile="", wildcard=WILDCARD_OPEN, |
| 274 | 276 | style=wx.FD_OPEN|wx.FD_CHANGE_DIR) |
| 275 | 277 | |
| ... | ... | @@ -286,6 +288,10 @@ def ShowOpenProjectDialog(): |
| 286 | 288 | except(wx._core.PyAssertionError): # FIX: win64 |
| 287 | 289 | filepath = dlg.GetPath() |
| 288 | 290 | |
| 291 | + if filepath: | |
| 292 | + session['paths']['last_directory_inv3'] = os.path.split(filepath)[0] | |
| 293 | + session.WriteSessionFile() | |
| 294 | + | |
| 289 | 295 | # Destroy the dialog. Don't do this until you are done with it! |
| 290 | 296 | # BAD things can happen otherwise! |
| 291 | 297 | dlg.Destroy() |
| ... | ... | @@ -337,17 +343,19 @@ def ShowImportDirDialog(self): |
| 337 | 343 | def ShowImportBitmapDirDialog(self): |
| 338 | 344 | current_dir = os.path.abspath(".") |
| 339 | 345 | |
| 340 | - if sys.platform == 'win32' or sys.platform.startswith('linux'): | |
| 341 | - session = ses.Session() | |
| 346 | + # if sys.platform == 'win32' or sys.platform.startswith('linux'): | |
| 347 | + # session = ses.Session() | |
| 342 | 348 | |
| 343 | - if (session.GetLastDicomFolder()): | |
| 344 | - folder = session.GetLastDicomFolder() | |
| 345 | - else: | |
| 346 | - folder = '' | |
| 347 | - else: | |
| 348 | - folder = '' | |
| 349 | + # if (session.GetLastDicomFolder()): | |
| 350 | + # folder = session.GetLastDicomFolder() | |
| 351 | + # else: | |
| 352 | + # folder = '' | |
| 353 | + # else: | |
| 354 | + # folder = '' | |
| 355 | + session = ses.Session() | |
| 356 | + last_directory = session.get('paths', 'last_directory_bitmap', '') | |
| 349 | 357 | |
| 350 | - dlg = wx.DirDialog(self, _("Choose a folder with TIFF, BMP, JPG or PNG:"), folder, | |
| 358 | + dlg = wx.DirDialog(self, _("Choose a folder with TIFF, BMP, JPG or PNG:"), last_directory, | |
| 351 | 359 | style=wx.DD_DEFAULT_STYLE |
| 352 | 360 | | wx.DD_DIR_MUST_EXIST |
| 353 | 361 | | wx.DD_CHANGE_DIR) |
| ... | ... | @@ -363,9 +371,13 @@ def ShowImportBitmapDirDialog(self): |
| 363 | 371 | if (dlg.GetPath()): |
| 364 | 372 | path = dlg.GetPath() |
| 365 | 373 | |
| 366 | - if (sys.platform != 'darwin'): | |
| 367 | - if (path): | |
| 368 | - session.SetLastDicomFolder(path) | |
| 374 | + # if (sys.platform != 'darwin'): | |
| 375 | + # if (path): | |
| 376 | + # session.SetLastDicomFolder(path) | |
| 377 | + | |
| 378 | + if path: | |
| 379 | + session['paths']['last_directory_bitmap'] = path | |
| 380 | + session.WriteSessionFile() | |
| 369 | 381 | |
| 370 | 382 | # Only destroy a dialog after you're done with it. |
| 371 | 383 | dlg.Destroy() |
| ... | ... | @@ -375,9 +387,10 @@ def ShowImportBitmapDirDialog(self): |
| 375 | 387 | |
| 376 | 388 | def ShowImportOtherFilesDialog(id_type): |
| 377 | 389 | # Default system path |
| 378 | - current_dir = os.path.abspath(".") | |
| 390 | + session = ses.Session() | |
| 391 | + last_directory = session.get('paths', 'last_directory_%d' % id_type, '') | |
| 379 | 392 | dlg = wx.FileDialog(None, message=_("Import Analyze 7.5 file"), |
| 380 | - defaultDir="", | |
| 393 | + defaultDir=last_directory, | |
| 381 | 394 | defaultFile="", wildcard=WILDCARD_ANALYZE, |
| 382 | 395 | style=wx.FD_OPEN | wx.FD_CHANGE_DIR) |
| 383 | 396 | |
| ... | ... | @@ -407,17 +420,22 @@ def ShowImportOtherFilesDialog(id_type): |
| 407 | 420 | if (dlg.GetPath()): |
| 408 | 421 | filename = dlg.GetPath() |
| 409 | 422 | |
| 423 | + if filename: | |
| 424 | + session['paths']['last_directory_%d' % id_type] = os.path.split(dlg.GetPath())[0] | |
| 425 | + session.WriteSessionFile() | |
| 410 | 426 | # Destroy the dialog. Don't do this until you are done with it! |
| 411 | 427 | # BAD things can happen otherwise! |
| 412 | 428 | dlg.Destroy() |
| 413 | - os.chdir(current_dir) | |
| 414 | 429 | return filename |
| 415 | 430 | |
| 416 | 431 | |
| 417 | 432 | def ShowImportMeshFilesDialog(): |
| 418 | 433 | # Default system path |
| 419 | 434 | current_dir = os.path.abspath(".") |
| 435 | + session = ses.Session() | |
| 436 | + last_directory = session.get('paths', 'last_directory_surface_import', '') | |
| 420 | 437 | dlg = wx.FileDialog(None, message=_("Import surface file"), |
| 438 | + defaultDir=last_directory, | |
| 421 | 439 | wildcard=WILDCARD_MESH_FILES, |
| 422 | 440 | style=wx.FD_OPEN | wx.FD_CHANGE_DIR) |
| 423 | 441 | |
| ... | ... | @@ -435,6 +453,10 @@ def ShowImportMeshFilesDialog(): |
| 435 | 453 | if (dlg.GetPath()): |
| 436 | 454 | filename = dlg.GetPath() |
| 437 | 455 | |
| 456 | + if filename: | |
| 457 | + session['paths']['last_directory_surface_import'] = os.path.split(filename)[0] | |
| 458 | + session.WriteSessionFile() | |
| 459 | + | |
| 438 | 460 | # Destroy the dialog. Don't do this until you are done with it! |
| 439 | 461 | # BAD things can happen otherwise! |
| 440 | 462 | dlg.Destroy() |
| ... | ... | @@ -444,9 +466,11 @@ def ShowImportMeshFilesDialog(): |
| 444 | 466 | |
| 445 | 467 | def ShowSaveAsProjectDialog(default_filename=None): |
| 446 | 468 | current_dir = os.path.abspath(".") |
| 469 | + session = ses.Session() | |
| 470 | + last_directory = session.get('paths', 'last_directory_inv3', '') | |
| 447 | 471 | dlg = wx.FileDialog(None, |
| 448 | 472 | _("Save project as..."), # title |
| 449 | - "", # last used directory | |
| 473 | + last_directory, # last used directory | |
| 450 | 474 | default_filename, |
| 451 | 475 | WILDCARD_INV_SAVE, |
| 452 | 476 | wx.FD_SAVE|wx.FD_OVERWRITE_PROMPT) |
| ... | ... | @@ -469,6 +493,10 @@ def ShowSaveAsProjectDialog(default_filename=None): |
| 469 | 493 | if filename.split(".")[-1] != extension: |
| 470 | 494 | filename = filename + "." + extension |
| 471 | 495 | |
| 496 | + if filename: | |
| 497 | + session['paths']['last_directory_inv3'] = os.path.split(filename)[0] | |
| 498 | + session.WriteSessionFile() | |
| 499 | + | |
| 472 | 500 | wildcard = dlg.GetFilterIndex() |
| 473 | 501 | os.chdir(current_dir) |
| 474 | 502 | return filename, wildcard == INV_COMPRESSED |
| ... | ... | @@ -1457,13 +1485,16 @@ def ExportPicture(type_=""): |
| 1457 | 1485 | utils.debug("ExportPicture") |
| 1458 | 1486 | project = proj.Project() |
| 1459 | 1487 | |
| 1488 | + session = ses.Session() | |
| 1489 | + last_directory = session.get('paths', 'last_directory_screenshot', '') | |
| 1490 | + | |
| 1460 | 1491 | project_name = "%s_%s" % (project.name, type_) |
| 1461 | 1492 | if not sys.platform in ('win32', 'linux2', 'linux'): |
| 1462 | 1493 | project_name += ".jpg" |
| 1463 | 1494 | |
| 1464 | 1495 | dlg = wx.FileDialog(None, |
| 1465 | 1496 | "Save %s picture as..." %type_, |
| 1466 | - "", # last used directory | |
| 1497 | + last_directory, # last used directory | |
| 1467 | 1498 | project_name, # filename |
| 1468 | 1499 | WILDCARD_SAVE_PICTURE, |
| 1469 | 1500 | wx.FD_SAVE|wx.FD_OVERWRITE_PROMPT) |
| ... | ... | @@ -1474,6 +1505,8 @@ def ExportPicture(type_=""): |
| 1474 | 1505 | filetype = INDEX_TO_TYPE[filetype_index] |
| 1475 | 1506 | extension = INDEX_TO_EXTENSION[filetype_index] |
| 1476 | 1507 | filename = dlg.GetPath() |
| 1508 | + session['paths']['last_directory_screenshot'] = os.path.split(filename)[0] | |
| 1509 | + session.WriteSessionFile() | |
| 1477 | 1510 | if sys.platform != 'win32': |
| 1478 | 1511 | if filename.split(".")[-1] != extension: |
| 1479 | 1512 | filename = filename + "."+ extension | ... | ... |
invesalius/gui/preferences.py
| ... | ... | @@ -222,7 +222,7 @@ class Language(wx.Panel): |
| 222 | 222 | class SurfaceCreation(wx.Panel): |
| 223 | 223 | def __init__(self, parent): |
| 224 | 224 | wx.Panel.__init__(self, parent) |
| 225 | - self.rb_fill_border = wx.RadioBox(self, -1, "Fill border holes", choices=[_('Yes'), _('No')], style=wx.RA_SPECIFY_COLS | wx.NO_BORDER) | |
| 225 | + self.rb_fill_border = wx.RadioBox(self, -1, _("Fill border holes"), choices=[_('Yes'), _('No')], style=wx.RA_SPECIFY_COLS | wx.NO_BORDER) | |
| 226 | 226 | |
| 227 | 227 | sizer = wx.BoxSizer(wx.VERTICAL) |
| 228 | 228 | sizer.Add(self.rb_fill_border) | ... | ... |
invesalius/gui/task_exporter.py
| ... | ... | @@ -33,6 +33,7 @@ from wx.lib.pubsub import pub as Publisher |
| 33 | 33 | import invesalius.constants as const |
| 34 | 34 | import invesalius.gui.dialogs as dlg |
| 35 | 35 | import invesalius.project as proj |
| 36 | +import invesalius.session as ses | |
| 36 | 37 | |
| 37 | 38 | BTN_MASK = wx.NewId() |
| 38 | 39 | BTN_PICTURE = wx.NewId() |
| ... | ... | @@ -318,10 +319,12 @@ class InnerTaskPanel(wx.Panel): |
| 318 | 319 | else: |
| 319 | 320 | project_name = project.name+".stl" |
| 320 | 321 | |
| 322 | + session = ses.Session() | |
| 323 | + last_directory = session.get('paths', 'last_directory_3d_surface', '') | |
| 321 | 324 | |
| 322 | 325 | dlg = wx.FileDialog(None, |
| 323 | 326 | _("Save 3D surface as..."), # title |
| 324 | - "", # last used directory | |
| 327 | + last_directory, # last used directory | |
| 325 | 328 | project_name, # filename |
| 326 | 329 | WILDCARD_SAVE_3D, |
| 327 | 330 | wx.FD_SAVE|wx.FD_OVERWRITE_PROMPT) |
| ... | ... | @@ -335,6 +338,11 @@ class InnerTaskPanel(wx.Panel): |
| 335 | 338 | if sys.platform != 'win32': |
| 336 | 339 | if filename.split(".")[-1] != extension: |
| 337 | 340 | filename = filename + "."+ extension |
| 341 | + | |
| 342 | + if filename: | |
| 343 | + session['paths']['last_directory_3d_surface'] = os.path.split(filename)[0] | |
| 344 | + session.WriteSessionFile() | |
| 345 | + | |
| 338 | 346 | Publisher.sendMessage('Export surface to file', |
| 339 | 347 | filename=filename, filetype=filetype) |
| 340 | 348 | if not os.path.exists(filename): | ... | ... |
invesalius/session.py
| ... | ... | @@ -30,6 +30,8 @@ import sys |
| 30 | 30 | from threading import Thread |
| 31 | 31 | import time |
| 32 | 32 | import codecs |
| 33 | +import collections | |
| 34 | +import json | |
| 33 | 35 | |
| 34 | 36 | #import wx.lib.pubsub as ps |
| 35 | 37 | from wx.lib.pubsub import pub as Publisher |
| ... | ... | @@ -52,7 +54,8 @@ else: |
| 52 | 54 | USER_INV_DIR = os.path.join(USER_DIR, u'.invesalius') |
| 53 | 55 | USER_PRESET_DIR = os.path.join(USER_INV_DIR, u'presets') |
| 54 | 56 | USER_LOG_DIR = os.path.join(USER_INV_DIR, u'logs') |
| 55 | -USER_INV_CFG_PATH = os.path.join(USER_INV_DIR, 'config.cfg') | |
| 57 | +USER_INV_CFG_PATH = os.path.join(USER_INV_DIR, 'config.json') | |
| 58 | +OLD_USER_INV_CFG_PATH = os.path.join(USER_INV_DIR, 'config.cfg') | |
| 56 | 59 | |
| 57 | 60 | SESSION_ENCODING = 'utf8' |
| 58 | 61 | |
| ... | ... | @@ -62,42 +65,98 @@ SESSION_ENCODING = 'utf8' |
| 62 | 65 | class Session(with_metaclass(Singleton, object)): |
| 63 | 66 | |
| 64 | 67 | def __init__(self): |
| 68 | + self.project_path = () | |
| 65 | 69 | self.temp_item = False |
| 66 | - # Initializing as project status closed. | |
| 67 | - # TODO: A better way to initialize project_status as closed (3) | |
| 68 | - self.project_status = 3 | |
| 69 | 70 | |
| 70 | - def CreateItens(self): | |
| 71 | - import invesalius.constants as const | |
| 72 | - self.project_path = () | |
| 73 | - self.debug = False | |
| 74 | - self.project_status = const.PROJ_CLOSE | |
| 75 | - # const.PROJ_NEW*, const.PROJ_OPEN, const.PROJ_CHANGE*, | |
| 76 | - # const.PROJ_CLOSE | |
| 71 | + self._values = collections.defaultdict(dict, { | |
| 72 | + 'session': { | |
| 73 | + 'status': 3, | |
| 74 | + 'language': '', | |
| 75 | + }, | |
| 76 | + 'project': { | |
| 77 | + }, | |
| 78 | + | |
| 79 | + 'paths': { | |
| 80 | + } | |
| 81 | + }) | |
| 82 | + | |
| 83 | + self._map_attrs = { | |
| 84 | + 'mode': ('session', 'mode'), | |
| 85 | + 'project_status': ('session', 'status'), | |
| 86 | + 'debug': ('session', 'debug'), | |
| 87 | + 'language': ('session', 'language'), | |
| 88 | + 'random_id': ('session', 'random_id'), | |
| 89 | + 'surface_interpolation': ('session', 'surface_interpolation'), | |
| 90 | + 'rendering': ('session', 'rendering'), | |
| 91 | + 'slice_interpolation': ('session', 'slice_interpolation'), | |
| 92 | + 'recent_projects': ('project', 'recent_projects'), | |
| 93 | + 'homedir': ('paths', 'homedir'), | |
| 94 | + 'tempdir': ('paths', 'homedir'), | |
| 95 | + 'last_dicom_folder': ('paths', 'last_dicom_folder'), | |
| 96 | + } | |
| 77 | 97 | |
| 78 | - self.mode = const.MODE_RP | |
| 79 | - # const.MODE_RP, const.MODE_NAVIGATOR, const.MODE_RADIOLOGY, | |
| 80 | - # const.MODE_ODONTOLOGY | |
| 81 | 98 | |
| 82 | - # InVesalius default projects' directory | |
| 83 | - homedir = self.homedir = USER_DIR | |
| 84 | - tempdir = os.path.join(homedir, u".invesalius", u"temp") | |
| 99 | + def CreateItens(self): | |
| 100 | + import invesalius.constants as const | |
| 101 | + homedir = USER_DIR | |
| 102 | + tempdir = os.path.join(USER_DIR, u".invesalius", u"temp") | |
| 85 | 103 | if not os.path.isdir(tempdir): |
| 86 | 104 | os.makedirs(tempdir) |
| 87 | - self.tempdir = tempdir | |
| 88 | - | |
| 89 | - # GUI language | |
| 90 | - self.language = "" # "pt_BR", "es" | |
| 91 | 105 | |
| 92 | - self.random_id = randint(0,pow(10,16)) | |
| 93 | - | |
| 94 | - # Recent projects list | |
| 95 | - self.recent_projects = [(const.SAMPLE_DIR, u"Cranium.inv3")] | |
| 96 | - self.last_dicom_folder = '' | |
| 97 | - self.surface_interpolation = 1 | |
| 98 | - self.slice_interpolation = 0 | |
| 99 | - self.rendering = 0 | |
| 100 | - self.WriteSessionFile() | |
| 106 | + self._values = collections.defaultdict(dict, { | |
| 107 | + 'session': { | |
| 108 | + 'mode': const.MODE_RP, | |
| 109 | + 'status': const.PROJ_CLOSE, | |
| 110 | + 'debug': False, | |
| 111 | + 'language': "", | |
| 112 | + 'random_id': randint(0, pow(10,16)), | |
| 113 | + 'surface_interpolation': 1, | |
| 114 | + 'rendering': 0, | |
| 115 | + 'slice_interpolation': 0, | |
| 116 | + }, | |
| 117 | + | |
| 118 | + 'project': { | |
| 119 | + 'recent_projects': [(const.SAMPLE_DIR, u"Cranium.inv3"), ], | |
| 120 | + }, | |
| 121 | + | |
| 122 | + 'paths': { | |
| 123 | + 'homedir': USER_DIR, | |
| 124 | + 'tempdir': os.path.join(homedir, u".invesalius", u"temp"), | |
| 125 | + 'last_dicom_folder': '', | |
| 126 | + }, | |
| 127 | + }) | |
| 128 | + | |
| 129 | + def __contains__(self, key): | |
| 130 | + return key in self._values | |
| 131 | + | |
| 132 | + def __getitem__(self, key): | |
| 133 | + return self._values[key] | |
| 134 | + | |
| 135 | + def __setitem__(self, key, value): | |
| 136 | + self._values[key] = value | |
| 137 | + | |
| 138 | + def __getattr__(self, name): | |
| 139 | + map_attrs = object.__getattribute__(self, '_map_attrs') | |
| 140 | + if name not in map_attrs: | |
| 141 | + raise AttributeError(name) | |
| 142 | + session, key = map_attrs[name] | |
| 143 | + return object.__getattribute__(self, '_values')[session][key] | |
| 144 | + | |
| 145 | + def __setattr__(self, name, value): | |
| 146 | + if name in ("temp_item", "_map_attrs", "_values", "project_path"): | |
| 147 | + return object.__setattr__(self, name, value) | |
| 148 | + else: | |
| 149 | + session, key = self._map_attrs[name] | |
| 150 | + self._values[session][key] = value | |
| 151 | + | |
| 152 | + def __str__(self): | |
| 153 | + return self._values.__str__() | |
| 154 | + | |
| 155 | + def get(self, session, key, default_value): | |
| 156 | + try: | |
| 157 | + return self._values[session][key] | |
| 158 | + except KeyError: | |
| 159 | + return default_value | |
| 101 | 160 | |
| 102 | 161 | def IsOpen(self): |
| 103 | 162 | import invesalius.constants as const |
| ... | ... | @@ -178,40 +237,17 @@ class Session(with_metaclass(Singleton, object)): |
| 178 | 237 | self.temp_item = False |
| 179 | 238 | |
| 180 | 239 | def WriteSessionFile(self): |
| 181 | - config = ConfigParser.RawConfigParser() | |
| 182 | - | |
| 183 | - config.add_section('session') | |
| 184 | - config.set('session', 'mode', self.mode) | |
| 185 | - config.set('session', 'status', self.project_status) | |
| 186 | - config.set('session','debug', self.debug) | |
| 187 | - config.set('session', 'language', self.language) | |
| 188 | - config.set('session', 'random_id', self.random_id) | |
| 189 | - config.set('session', 'surface_interpolation', self.surface_interpolation) | |
| 190 | - config.set('session', 'rendering', self.rendering) | |
| 191 | - config.set('session', 'slice_interpolation', self.slice_interpolation) | |
| 192 | - | |
| 193 | - config.add_section('project') | |
| 194 | - config.set('project', 'recent_projects', self.recent_projects) | |
| 195 | - | |
| 196 | - config.add_section('paths') | |
| 197 | - config.set('paths','homedir',self.homedir) | |
| 198 | - config.set('paths','tempdir',self.tempdir) | |
| 199 | - config.set('paths','last_dicom_folder',self.last_dicom_folder) | |
| 200 | - | |
| 201 | - path = os.path.join(self.homedir , | |
| 202 | - '.invesalius', 'config.cfg') | |
| 240 | + self._write_to_json(self._values, USER_INV_CFG_PATH) | |
| 203 | 241 | |
| 204 | - configfile = codecs.open(path, 'wb', SESSION_ENCODING) | |
| 205 | - try: | |
| 206 | - config.write(configfile) | |
| 207 | - except UnicodeDecodeError: | |
| 208 | - pass | |
| 209 | - configfile.close() | |
| 242 | + def _write_to_json(self, cfg_dict, cfg_filename): | |
| 243 | + with open(cfg_filename, 'w') as cfg_file: | |
| 244 | + json.dump(cfg_dict, cfg_file, sort_keys=True, indent=4) | |
| 210 | 245 | |
| 211 | 246 | def __add_to_list(self, item): |
| 212 | 247 | import invesalius.constants as const |
| 213 | 248 | # Last projects list |
| 214 | 249 | l = self.recent_projects |
| 250 | + item = list(item) | |
| 215 | 251 | |
| 216 | 252 | # If item exists, remove it from list |
| 217 | 253 | if l.count(item): |
| ... | ... | @@ -219,11 +255,7 @@ class Session(with_metaclass(Singleton, object)): |
| 219 | 255 | |
| 220 | 256 | # Add new item |
| 221 | 257 | l.insert(0, item) |
| 222 | - | |
| 223 | - # Remove oldest projects from list | |
| 224 | - if len(l)>const.PROJ_MAX: | |
| 225 | - for i in range(len(l)-const.PROJ_MAX): | |
| 226 | - l.pop() | |
| 258 | + self.recent_projects = l[:const.PROJ_MAX] | |
| 227 | 259 | |
| 228 | 260 | def GetLanguage(self): |
| 229 | 261 | return self.language |
| ... | ... | @@ -244,86 +276,59 @@ class Session(with_metaclass(Singleton, object)): |
| 244 | 276 | self.last_dicom_folder = folder |
| 245 | 277 | self.WriteSessionFile() |
| 246 | 278 | |
| 247 | - def ReadLanguage(self): | |
| 248 | - config = ConfigParser.ConfigParser() | |
| 249 | - path = os.path.join(USER_INV_DIR, 'config.cfg') | |
| 250 | - try: | |
| 251 | - f = codecs.open(path, 'rb', SESSION_ENCODING) | |
| 252 | - config.readfp(f) | |
| 253 | - f.close() | |
| 254 | - self.language = config.get('session','language') | |
| 255 | - return self.language | |
| 256 | - except IOError: | |
| 257 | - return False | |
| 258 | - except (ConfigParser.NoSectionError, | |
| 259 | - ConfigParser.NoOptionError, | |
| 260 | - ConfigParser.MissingSectionHeaderError): | |
| 261 | - return False | |
| 262 | - | |
| 263 | - def ReadRandomId(self): | |
| 264 | - config = ConfigParser.ConfigParser() | |
| 265 | - path = os.path.join(USER_INV_DIR, 'config.cfg') | |
| 266 | - try: | |
| 267 | - f = codecs.open(path, 'rb', SESSION_ENCODING) | |
| 268 | - config.readfp(f) | |
| 269 | - f.close() | |
| 270 | - self.random_id = config.get('session','random_id') | |
| 271 | - return self.random_id | |
| 272 | - except IOError: | |
| 273 | - return False | |
| 274 | - except (ConfigParser.NoSectionError, | |
| 275 | - ConfigParser.NoOptionError, | |
| 276 | - ConfigParser.MissingSectionHeaderError): | |
| 277 | - return False | |
| 278 | - | |
| 279 | - def ReadSession(self): | |
| 280 | - config = ConfigParser.ConfigParser() | |
| 281 | - path = USER_INV_CFG_PATH | |
| 282 | - try: | |
| 283 | - f = codecs.open(path, 'rb', SESSION_ENCODING) | |
| 284 | - config.readfp(f) | |
| 285 | - f.close() | |
| 286 | - self.mode = config.get('session', 'mode') | |
| 287 | - # Do not reading project status from the config file, since there | |
| 288 | - # isn't a recover sessession tool in InVesalius | |
| 289 | - #self.project_status = int(config.get('session', 'status')) | |
| 290 | - self.debug = config.get('session','debug') | |
| 291 | - self.language = config.get('session','language') | |
| 292 | - self.recent_projects = eval(config.get('project','recent_projects')) | |
| 293 | - self.homedir = config.get('paths','homedir') | |
| 294 | - self.tempdir = config.get('paths','tempdir') | |
| 295 | - self.last_dicom_folder = config.get('paths','last_dicom_folder') | |
| 296 | - | |
| 297 | - #if not(sys.platform == 'win32'): | |
| 298 | - # self.last_dicom_folder = self.last_dicom_folder.decode('utf-8') | |
| 299 | - | |
| 300 | - self.surface_interpolation = config.get('session', 'surface_interpolation') | |
| 301 | - self.slice_interpolation = config.get('session', 'slice_interpolation') | |
| 302 | - | |
| 303 | - self.rendering = config.get('session', 'rendering') | |
| 304 | - self.random_id = config.get('session','random_id') | |
| 305 | - return True | |
| 279 | + def _update_cfg_from_dict(self, config, cfg_dict): | |
| 280 | + for session in cfg_dict: | |
| 281 | + if cfg_dict[session] and isinstance(cfg_dict[session], dict): | |
| 282 | + config.add_section(session) | |
| 283 | + for key in cfg_dict[session]: | |
| 284 | + config.set(session, key, cfg_dict[session][key]) | |
| 306 | 285 | |
| 307 | - except IOError: | |
| 308 | - return False | |
| 286 | + def _read_cfg_from_json(self, json_filename): | |
| 287 | + with open(json_filename, 'r') as cfg_file: | |
| 288 | + cfg_dict = json.load(cfg_file) | |
| 289 | + self._values.update(cfg_dict) | |
| 309 | 290 | |
| 310 | - except(ConfigParser.NoSectionError, ConfigParser.MissingSectionHeaderError, | |
| 311 | - ConfigParser.ParsingError): | |
| 291 | + # Do not reading project status from the config file, since there | |
| 292 | + # isn't a recover session tool in InVesalius yet. | |
| 293 | + self.project_status = 3 | |
| 312 | 294 | |
| 313 | - if (self.RecoveryConfigFile()): | |
| 314 | - self.ReadSession() | |
| 315 | - return True | |
| 316 | - else: | |
| 317 | - return False | |
| 295 | + def _read_cfg_from_ini(self, cfg_filename): | |
| 296 | + f = codecs.open(cfg_filename, 'rb', SESSION_ENCODING) | |
| 297 | + config = ConfigParser.ConfigParser() | |
| 298 | + config.readfp(f) | |
| 299 | + f.close() | |
| 300 | + | |
| 301 | + self.mode = config.getint('session', 'mode') | |
| 302 | + # Do not reading project status from the config file, since there | |
| 303 | + # isn't a recover sessession tool in InVesalius | |
| 304 | + #self.project_status = int(config.get('session', 'status')) | |
| 305 | + self.debug = config.getboolean('session','debug') | |
| 306 | + self.language = config.get('session','language') | |
| 307 | + recent_projects = eval(config.get('project','recent_projects')) | |
| 308 | + self.recent_projects = [list(rp) for rp in recent_projects] | |
| 309 | + self.homedir = config.get('paths','homedir') | |
| 310 | + self.tempdir = config.get('paths','tempdir') | |
| 311 | + self.last_dicom_folder = config.get('paths','last_dicom_folder') | |
| 312 | + | |
| 313 | + # if not(sys.platform == 'win32'): | |
| 314 | + # self.last_dicom_folder = self.last_dicom_folder.decode('utf-8') | |
| 315 | + | |
| 316 | + self.surface_interpolation = config.getint('session', 'surface_interpolation') | |
| 317 | + self.slice_interpolation = config.getint('session', 'slice_interpolation') | |
| 318 | + | |
| 319 | + self.rendering = config.getint('session', 'rendering') | |
| 320 | + self.random_id = config.getint('session','random_id') | |
| 318 | 321 | |
| 319 | - except(ConfigParser.NoOptionError): | |
| 320 | - #Added to fix new version compatibility | |
| 321 | - self.surface_interpolation = 0 | |
| 322 | - self.slice_interpolation = 0 | |
| 323 | - self.rendering = 0 | |
| 324 | - self.random_id = randint(0,pow(10,16)) | |
| 322 | + def ReadSession(self): | |
| 323 | + try: | |
| 324 | + self._read_cfg_from_json(USER_INV_CFG_PATH) | |
| 325 | + except Exception as e1: | |
| 326 | + debug(e1) | |
| 325 | 327 | try: |
| 326 | - self.WriteSessionFile() | |
| 327 | - except AttributeError: | |
| 328 | + self._read_cfg_from_ini(OLD_USER_INV_CFG_PATH) | |
| 329 | + except Exception as e2: | |
| 330 | + debug(e2) | |
| 328 | 331 | return False |
| 329 | - return True | |
| 332 | + | |
| 333 | + self.WriteSessionFile() | |
| 334 | + return True | ... | ... |
invesalius/utils.py
| ... | ... | @@ -394,21 +394,14 @@ def UpdateCheck(): |
| 394 | 394 | #msgdlg.Destroy() |
| 395 | 395 | |
| 396 | 396 | print("Checking updates...") |
| 397 | - | |
| 397 | + | |
| 398 | 398 | # Check if there is a language set |
| 399 | 399 | #import invesalius.i18n as i18n import invesalius.session as ses |
| 400 | 400 | session = ses.Session() |
| 401 | 401 | install_lang = 0 |
| 402 | - if session.ReadLanguage(): | |
| 403 | - lang = session.GetLanguage() | |
| 404 | - #if (lang != "False"): | |
| 405 | - #_ = i18n.InstallLanguage(lang) | |
| 406 | - #install_lang = 1 | |
| 407 | - #if (install_lang==0): | |
| 408 | - #return | |
| 409 | - if session.ReadRandomId(): | |
| 410 | - random_id = session.GetRandomId() | |
| 411 | - | |
| 402 | + lang = session.GetLanguage() | |
| 403 | + random_id = session.GetRandomId() | |
| 404 | + if lang: | |
| 412 | 405 | # Fetch update data from server |
| 413 | 406 | import invesalius.constants as const |
| 414 | 407 | url = "https://www.cti.gov.br/dt3d/invesalius/update/checkupdate.php" | ... | ... |