|
6 | 6 |
|
7 | 7 | import wx |
8 | 8 | import wx.lib.inspection |
9 | | -from PIL import ImageFile, Image |
| 9 | +from PIL import ImageFile,Image |
10 | 10 |
|
11 | 11 | from .src.main import MulimgViewer |
12 | 12 | from .src.path_select import PathSelectFrame |
13 | 13 |
|
14 | 14 | ImageFile.LOAD_TRUNCATED_IMAGES = True |
15 | 15 | Image.MAX_IMAGE_PIXELS = None |
16 | 16 |
|
17 | | - |
18 | | -class GuiManager: |
19 | | - def __init__(self, UpdateUI, get_type, file_name=None): |
| 17 | +class GuiManager(): |
| 18 | + def __init__(self, UpdateUI, get_type): |
20 | 19 | self.UpdateUI = UpdateUI |
21 | 20 | self.get_type = get_type |
22 | | - self.file_name = file_name |
23 | 21 | self.frameDict = {} |
24 | 22 |
|
25 | | - def GetFrame(self, type_): |
26 | | - f = self.frameDict.get(type_) |
27 | | - if f is None: |
28 | | - f = self.CreateFrame(type_) |
29 | | - self.frameDict[type_] = f |
30 | | - return f |
| 23 | + def GetFrame(self, type): |
| 24 | + frame = self.frameDict.get(type) |
| 25 | + |
| 26 | + if frame is None: |
| 27 | + frame = self.CreateFrame(type) |
| 28 | + self.frameDict[type] = frame |
| 29 | + |
| 30 | + return frame |
| 31 | + |
| 32 | + def CreateFrame(self, type): |
| 33 | + global file_name |
| 34 | + if file_name: |
| 35 | + input_path = Path(file_name).parent |
| 36 | + else: |
| 37 | + input_path = None |
31 | 38 |
|
32 | | - def CreateFrame(self, type_): |
33 | | - input_path = Path(self.file_name).parent if self.file_name else None |
34 | | - if type_ == 0: |
| 39 | + if type == 0: |
35 | 40 | return MulimgViewer(None, self.UpdateUI, self.get_type, default_path=input_path) |
36 | | - elif type_ == 1: |
| 41 | + elif type == 1: |
37 | 42 | return PathSelectFrame(None, self.UpdateUI, self.get_type) |
38 | | - else: |
39 | | - raise ValueError(f"Unknown frame type: {type_}") |
40 | 43 |
|
41 | 44 |
|
42 | 45 | class MainAPP(wx.App): |
43 | | - def __init__(self, *args, file_name=None, **kwargs): |
44 | | - self.file_name = file_name |
45 | | - self.manager = None |
46 | | - self.frame = [None, None] |
47 | | - self.type = 0 |
48 | | - self.thread = 4 |
49 | | - self.video_manager = None |
50 | | - self.shared_config = None |
51 | | - self._last_manual_paths = [] |
52 | | - super().__init__(*args, **kwargs) |
53 | 46 |
|
54 | 47 | def OnInit(self): |
55 | | - self.manager = GuiManager(self.UpdateUI, self.get_type, file_name=self.file_name) |
56 | | - self.frame[0] = self.manager.GetFrame(0) # 主窗口 |
57 | | - self.frame[1] = self.manager.GetFrame(1) # 选择窗口 |
| 48 | + self.manager = GuiManager(self.UpdateUI, self.get_type) |
| 49 | + self.frame = [] |
| 50 | + self.frame.append(self.manager.GetFrame(0)) |
| 51 | + self.frame.append(self.manager.GetFrame(1)) |
58 | 52 | self.frame[0].Show() |
59 | 53 | self.SetTopWindow(self.frame[0]) |
60 | 54 | self.type = 0 # init show MulimgViewer |
61 | 55 | return True |
62 | 56 |
|
63 | | - @staticmethod |
64 | | - def _normalize_paths(paths): |
65 | | - if paths is None: |
66 | | - return [] |
67 | | - if isinstance(paths, str): |
68 | | - return [paths] if paths else [] |
69 | | - try: |
70 | | - iterable = list(paths) |
71 | | - except TypeError: |
72 | | - return [] |
73 | | - normalized = [] |
74 | | - for item in iterable: |
75 | | - if isinstance(item, str): |
76 | | - if item: |
77 | | - normalized.append(item) |
78 | | - else: |
79 | | - normalized.append(str(item)) |
80 | | - return normalized |
81 | | - |
82 | | - def UpdateUI(self, ui_type, input_path=None, parallel_to_sequential=None, video_manager=None, shared_config=None): |
83 | | - """ |
84 | | - ui_type: 1=PathSelectFrame, 0=MulimgViewer, -1=全部关闭 |
85 | | - input_path: list[str] 或 None |
86 | | - parallel_to_sequential: 保持原参数 |
87 | | - """ |
88 | | - if video_manager is not None: |
89 | | - self.video_manager = video_manager |
90 | | - self.shared_config = shared_config |
91 | | - self.frame[1].set_video_manager(self.video_manager, self.shared_config) |
92 | | - self.type = ui_type |
93 | | - self.thread = 4 |
94 | | - |
95 | | - normalized_input = self._normalize_paths(input_path) |
96 | | - ptos_flag = parallel_to_sequential |
97 | | - if ptos_flag is None: |
98 | | - frame0 = self.frame[0] if self.frame and self.frame[0] else None |
99 | | - if frame0 is not None: |
100 | | - shared_cfg = getattr(frame0, "shared_config", None) |
101 | | - if shared_cfg is not None and hasattr(shared_cfg, "parallel_to_sequential"): |
102 | | - ptos_flag = bool(getattr(shared_cfg, "parallel_to_sequential", False)) |
103 | | - elif hasattr(frame0, "parallel_to_sequential"): |
104 | | - try: |
105 | | - ptos_flag = bool(frame0.parallel_to_sequential.GetValue()) |
106 | | - except Exception: |
107 | | - ptos_flag = False |
108 | | - if ptos_flag is None: |
109 | | - ptos_flag = False |
110 | | - if normalized_input: |
111 | | - self._last_manual_paths = normalized_input |
112 | | - if not self.frame[0].shared_config.video_mode: |
113 | | - self.frame[0].ImgManager.init(normalized_input, 1, ptos_flag) |
| 57 | + def UpdateUI(self, type, input_path=None, parallel_to_sequential=False): |
| 58 | + # type=1: PathSelectFrame |
| 59 | + # type=0: MulimgViewer |
| 60 | + # type=-1: Close |
| 61 | + self.type = type |
| 62 | + |
| 63 | + if input_path != None: |
| 64 | + if len(input_path) != 0: |
| 65 | + # refresh one_dir_mul_dir_manual path |
| 66 | + self.frame[0].ImgManager.init( |
| 67 | + input_path, 1, parallel_to_sequential) |
| 68 | + self.frame[1].refresh_txt(input_path) |
| 69 | + |
114 | 70 | self.frame[0].show_img_init() |
115 | 71 | self.frame[0].ImgManager.set_action_count(0) |
116 | 72 | self.frame[0].show_img() |
117 | 73 |
|
118 | | - if ui_type == -1: |
119 | | - try: |
120 | | - self.frame[0].close(None) |
121 | | - except Exception: |
122 | | - pass |
123 | | - try: |
124 | | - self.frame[1].close(None) |
125 | | - except Exception: |
126 | | - pass |
127 | | - return True |
128 | | - |
129 | | - if ui_type == 0: |
130 | | - if self.frame[1]: |
131 | | - self.frame[1].Show(False) |
132 | | - self.frame[0].Show(True) |
133 | | - self.SetTopWindow(self.frame[0]) |
134 | | - return True |
135 | | - |
136 | | - if ui_type == 1: |
137 | | - try: |
138 | | - if self.frame[1]: |
139 | | - self.frame[1].Destroy() |
140 | | - except Exception: |
141 | | - pass |
142 | | - self.frame[1] = self.manager.CreateFrame(1) |
143 | | - |
144 | | - paths_to_show = None |
145 | | - if normalized_input: |
146 | | - paths_to_show = normalized_input |
147 | | - self._last_manual_paths = normalized_input |
148 | | - else: |
149 | | - img_mgr = getattr(self.frame[0], "ImgManager", None) |
150 | | - if img_mgr and getattr(img_mgr, "input_path", None): |
151 | | - paths_to_show = self._normalize_paths(img_mgr.input_path) |
152 | | - self._last_manual_paths = paths_to_show |
153 | | - elif self._last_manual_paths: |
154 | | - paths_to_show = self._normalize_paths(self._last_manual_paths) |
155 | | - |
156 | | - if paths_to_show: |
157 | | - try: |
158 | | - self.frame[1].refresh_txt(paths_to_show) |
159 | | - except AttributeError: |
160 | | - self.frame[1].m_richText1.Value = "\n".join(paths_to_show) + "\n" |
161 | | - # 关键:重建后立刻把 vm 注入新实例 |
162 | | - if getattr(self, "video_manager", None) is not None: |
163 | | - self.frame[1].set_video_manager(self.video_manager,self.shared_config) |
164 | | - |
165 | | - self.frame[1].Show(True) |
166 | | - self.frame[1].Raise() |
167 | | - self.SetTopWindow(self.frame[1]) |
168 | | - return True |
| 74 | + if type == -1: |
| 75 | + # close window |
| 76 | + self.frame[0].close(None) |
| 77 | + self.frame[1].close(None) |
| 78 | + elif type == 0: |
| 79 | + # hidden PathSelectFrame, show MulimgViewer |
| 80 | + self.frame[1].Show(False) |
| 81 | + self.frame[type].Show(True) |
| 82 | + elif type == 1: |
| 83 | + # show PathSelectFrame |
| 84 | + self.frame[type].Show(True) |
169 | 85 |
|
170 | 86 | return True |
171 | 87 |
|
172 | 88 | def get_type(self): |
173 | 89 | return self.type |
174 | 90 |
|
| 91 | + |
175 | 92 | def main(): |
176 | | - file_name = sys.argv[1] if len(sys.argv) > 1 else None |
177 | | - app = MainAPP(file_name=file_name) |
178 | | - # 调试可打开: |
| 93 | + global file_name |
| 94 | + if len(sys.argv)>1: |
| 95 | + file_name = sys.argv[1] |
| 96 | + else: |
| 97 | + file_name = None |
| 98 | + app = MainAPP() |
| 99 | + # debug |
179 | 100 | # wx.lib.inspection.InspectionTool().Show() |
180 | 101 | app.MainLoop() |
181 | 102 |
|
|
0 commit comments