Skip to content

Commit e978fa5

Browse files
author
Shengjie Xu
committed
[GUI] fix circular import due to setting -> execution dependency; cleanup mainWindowHandle
1 parent 0c92c5b commit e978fa5

File tree

5 files changed

+27
-23
lines changed

5 files changed

+27
-23
lines changed

src/preppipe_gui_pyside6/execution.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import time
99
from PySide6.QtCore import *
1010
from preppipe.language import *
11-
from .toolwidgets.setting import SettingWidget
11+
from .settingsdict import *
1212

1313
@dataclasses.dataclass
1414
class SpecifiedOutputInfo:
@@ -49,7 +49,7 @@ def add_output_unspecified(self, field_name : Translatable | str, default_name:
4949

5050
@staticmethod
5151
def init_common():
52-
lang = SettingWidget.get_current_language()
52+
lang = SettingsDict.get_current_language()
5353
return ExecutionInfo(envs={
5454
'PREPPIPE_LANGUAGE': lang,
5555
})

src/preppipe_gui_pyside6/navigatorwidget.py

+1-5
Original file line numberDiff line numberDiff line change
@@ -131,13 +131,9 @@ def parent(self, index: QModelIndex) -> QModelIndex:
131131
class NavigatorWidget(QWidget, ToolWidgetInterface):
132132
ui : Ui_NavigatorWidget
133133
model : ToolModel
134-
mainWindowHandle : MainWindowInterface
135134

136135
def __init__(self, parent : QWidget):
137136
super(NavigatorWidget, self).__init__(parent)
138-
if not isinstance(parent, MainWindowInterface):
139-
raise ValueError("Parent must be an instance of MainWindowInterface.")
140-
self.mainWindowHandle = parent
141137
self.ui = Ui_NavigatorWidget()
142138
self.ui.setupUi(self)
143139
ToolNode.build_tree()
@@ -153,7 +149,7 @@ def on_treeView_clicked(self, index: QModelIndex):
153149
info = index.internalPointer().info
154150
if info is None:
155151
return
156-
self.mainWindowHandle.requestOpen(info)
152+
MainWindowInterface.getHandle(self).requestOpen(info)
157153

158154
_tr_toolname_navigator = TR_gui_mainwindow.tr("toolname_navigator",
159155
en="Navigator",

src/preppipe_gui_pyside6/settingsdict.py

+20-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import threading
99
import collections
1010
import collections.abc
11+
from preppipe.language import *
1112

1213
def get_executable_base_dir() -> str:
1314
if getattr(sys, 'frozen', False):
@@ -22,9 +23,11 @@ class SettingsDict(collections.abc.MutableMapping):
2223
shelf : shelve.Shelf
2324

2425
@staticmethod
25-
def instance():
26+
def instance() -> 'SettingsDict':
2627
if SettingsDict._settings_instance is None:
2728
SettingsDict._settings_instance = SettingsDict(os.path.join(SettingsDict._executable_base_dir, "preppipe_gui.settings.db"))
29+
if SettingsDict._settings_instance is None:
30+
raise RuntimeError("SettingsDict instance failed to initialize")
2831
return SettingsDict._settings_instance
2932

3033
@staticmethod
@@ -114,3 +117,19 @@ def __enter__(self):
114117

115118
def __exit__(self, exc_type, exc_val, exc_tb):
116119
self.close()
120+
121+
# 为了避免循环依赖,我们在这里把其他获取当前设置值的函数放在这里
122+
_langs_dict = {
123+
"en": "English",
124+
"zh_cn": "中文(简体)",
125+
"zh_hk": "中文(繁體)",
126+
}
127+
@staticmethod
128+
def get_current_language() -> str:
129+
if inst := SettingsDict.instance():
130+
if lang := inst.get("language"):
131+
return lang
132+
for candidate in Translatable.PREFERRED_LANG:
133+
if candidate in SettingsDict._langs_dict:
134+
return candidate
135+
return "en"

src/preppipe_gui_pyside6/toolwidgets/__init__.py

Whitespace-only changes.

src/preppipe_gui_pyside6/toolwidgets/setting.py

+4-15
Original file line numberDiff line numberDiff line change
@@ -33,17 +33,15 @@ class SettingWidget(QWidget, ToolWidgetInterface):
3333
}
3434

3535
def __init__(self, parent : QWidget):
36-
if not isinstance(parent, MainWindowInterface):
37-
raise TypeError("SettingWidget must be created with a MainWindowInterface instance as parent")
3836
super(SettingWidget, self).__init__(parent)
3937
self.ui = Ui_SettingWidget()
4038
self.ui.setupUi(self)
4139
self.bind_text(lambda s : self.ui.tabWidget.setTabText(0, s), self._tr_tab_general)
4240
self.bind_text(self.ui.languageLabel.setText, self._tr_general_language)
4341
self.ui.languageComboBox.clear()
44-
for lang_code, lang_name in self._langs_dict.items():
42+
for lang_code, lang_name in SettingsDict._langs_dict.items():
4543
self.ui.languageComboBox.addItem(lang_name, lang_code)
46-
self.ui.languageComboBox.setCurrentIndex(self.ui.languageComboBox.findData(self.get_current_language()))
44+
self.ui.languageComboBox.setCurrentIndex(self.ui.languageComboBox.findData(SettingsDict.get_current_language()))
4745
self.ui.languageComboBox.currentIndexChanged.connect(self.on_languageComboBox_currentIndexChanged)
4846

4947
def on_languageComboBox_currentIndexChanged(self, index):
@@ -63,24 +61,15 @@ def initialize():
6361
if lang := SettingsDict.instance().get("language"):
6462
SettingWidget.setLanguage(lang)
6563

66-
@staticmethod
67-
def get_current_language() -> str:
68-
if lang := SettingsDict.instance().get("language"):
69-
return lang
70-
for candidate in Translatable.PREFERRED_LANG:
71-
if candidate in SettingWidget._langs_dict:
72-
return candidate
73-
return "en"
74-
7564
def get_initial_value(self, key : str):
7665
match key:
7766
case "language":
78-
return self.get_current_language()
67+
return SettingsDict.get_current_language()
7968
case _:
8069
raise RuntimeError("Unexpected key")
8170

8271
def language_updated(self, lang):
83-
if lang == self.get_current_language():
72+
if lang == SettingsDict.get_current_language():
8473
return
8574
SettingWidget.setLanguage(lang)
8675
SettingsDict.instance()["language"] = lang

0 commit comments

Comments
 (0)