Coverage for aipyapp/gui/statusbar.py: 0%
58 statements
« prev ^ index » next coverage.py v7.10.3, created at 2025-08-11 12:02 +0200
« prev ^ index » next coverage.py v7.10.3, created at 2025-08-11 12:02 +0200
1import os
2import sys
3import subprocess
4import wx
6from .. import T
8class CStatusBar(wx.StatusBar):
9 def __init__(self, parent):
10 super().__init__(parent, style=wx.STB_DEFAULT_STYLE)
11 self.parent = parent
12 self.SetFieldsCount(3)
13 self.SetStatusWidths([-1, 30, 80])
15 self.tm = parent.tm
16 self.current_llm = self.tm.client_manager.names['default']
17 self.enabled_llm = list(self.tm.client_manager.names['enabled'])
18 self.menu_items = self.enabled_llm
19 self.radio_group = []
21 self.folder_button = wx.StaticBitmap(self, -1, wx.ArtProvider.GetBitmap(wx.ART_FOLDER_OPEN, wx.ART_MENU))
22 self.folder_button.Bind(wx.EVT_LEFT_DOWN, self.on_open_work_dir)
23 self.Bind(wx.EVT_SIZE, self.on_size)
25 self.SetStatusText(f"{self.current_llm} ▾", 2)
26 self.Bind(wx.EVT_LEFT_DOWN, self.on_click)
28 def on_size(self, event):
29 rect = self.GetFieldRect(1)
30 self.folder_button.SetPosition((rect.x + 5, rect.y + 2))
31 event.Skip()
33 def on_click(self, event):
34 rect = self.GetFieldRect(2)
35 if rect.Contains(event.GetPosition()):
36 self.show_menu()
38 def show_menu(self):
39 self.current_menu = wx.Menu()
40 self.radio_group = []
41 for label in self.menu_items:
42 item = wx.MenuItem(self.current_menu, wx.ID_ANY, label, kind=wx.ITEM_RADIO)
43 self.current_menu.Append(item)
44 self.radio_group.append(item)
45 self.Bind(wx.EVT_MENU, self.on_menu_select, item)
46 if label == self.current_llm:
47 item.Check()
48 rect = self.GetFieldRect(2)
49 pos = self.ClientToScreen(rect.GetBottomLeft())
50 self.PopupMenu(self.current_menu, self.ScreenToClient(pos))
52 def on_menu_select(self, event):
53 item = self.current_menu.FindItemById(event.GetId())
54 label = item.GetItemLabel()
55 if self.tm.use(label):
56 self.current_llm = label
57 self.SetStatusText(f"{label} ▾", 2)
58 else:
59 wx.MessageBox(T("LLM {} is not available").format(label), T("Warning"), wx.OK|wx.ICON_WARNING)
61 def on_open_work_dir(self, event):
62 """打开工作目录"""
63 work_dir = self.tm.workdir
64 if os.path.exists(work_dir):
65 if sys.platform == 'win32':
66 os.startfile(work_dir)
67 elif sys.platform == 'darwin':
68 subprocess.call(['open', work_dir])
69 else:
70 subprocess.call(['xdg-open', work_dir])
71 else:
72 wx.MessageBox(T("Work directory does not exist"), T("Error"), wx.OK | wx.ICON_ERROR)