@@ -36,7 +36,18 @@ def __init__(self, parent=None):
3636 self .setMenuBar (self .menu_bar )
3737
3838 self .central_widget = widgets .CentralTabWidget (self )
39+ self .central_widget .setTabsClosable (True )
3940 self .setCentralWidget (self .central_widget )
41+
42+ # Initialize all base pages upfront (name -> widget instance)
43+ self .base_pages = {}
44+ for page_name , page_class in app .pages .base_pages .items ():
45+ page_instance = page_class ()
46+ page_instance .setObjectName (page_name )
47+ self .base_pages [page_name ] = page_instance
48+
49+ # Connect tab close signal
50+ self .central_widget .tabCloseRequested .connect (self ._on_tab_close_requested )
4051
4152 self .connect_signals ()
4253
@@ -82,21 +93,117 @@ def sync_pages(self):
8293 """
8394 Synchronizes the central widget pages with the shown_pages setting.
8495
85- This method clears existing pages and adds only those pages that are
86- configured to be shown at startup .
96+ This method shows only those pages that are configured to be shown at startup.
97+ Pages are pre-initialized and just added/removed from tabs .
8798 """
88- # Clear existing pages
99+ # Get shown pages from settings
100+ shown_pages = app .settings ["startup" ].get ("shown_pages" , [])
101+
102+ # Remove all pages from tabs first
89103 while self .central_widget .count () > 0 :
90104 self .central_widget .removeTab (0 )
91105
92- # Add pages based on shown_pages setting
93- shown_pages = app .settings ["startup" ].get ("shown_pages" , [])
94-
106+ # Add only the pages that should be shown
95107 for page_name in shown_pages :
96- if page_name in app .pages .base_pages :
97- page_class = app .pages .base_pages [page_name ]
98- page_instance = page_class ()
99- self .central_widget .addTab (page_instance , page_name )
108+ if page_name in self .base_pages :
109+ page_instance = self .base_pages [page_name ]
110+ # Base pages should show minimize button instead of close
111+ self .central_widget .addTab (page_instance , page_name , show_minimize = True )
112+
113+ def show_page (self , page_name : str ):
114+ """
115+ Show a page by adding it to the tabs.
116+
117+ Args:
118+ page_name: The name of the page to show
119+ """
120+ if page_name not in self .base_pages :
121+ return
122+
123+ page_widget = self .base_pages [page_name ]
124+
125+ # Check if page is already in tabs
126+ index = self .central_widget .indexOf (page_widget )
127+ if index >= 0 :
128+ # Already shown, just switch to it
129+ self .central_widget .setCurrentIndex (index )
130+ else :
131+ # Add to tabs with minimize button
132+ self .central_widget .addTab (page_widget , page_name , show_minimize = True )
133+ self .central_widget .setCurrentWidget (page_widget )
134+
135+ def hide_page (self , page_name : str ):
136+ """
137+ Hide a page by removing it from the tabs (but not destroying it).
138+
139+ Args:
140+ page_name: The name of the page to hide
141+ """
142+ if page_name not in self .base_pages :
143+ return
144+
145+ page_widget = self .base_pages [page_name ]
146+ index = self .central_widget .indexOf (page_widget )
147+ if index >= 0 :
148+ self .central_widget .removeTab (index )
149+
150+ def toggle_page (self , page_name : str ):
151+ """
152+ Toggle a page shown/hidden.
153+
154+ Args:
155+ page_name: The name of the page to toggle
156+ """
157+ if page_name not in self .base_pages :
158+ return
159+
160+ page_widget = self .base_pages [page_name ]
161+ index = self .central_widget .indexOf (page_widget )
162+
163+ if index >= 0 :
164+ # Page is shown, hide it
165+ self .hide_page (page_name )
166+ else :
167+ # Page is hidden, show it
168+ self .show_page (page_name )
169+
170+ def is_page_visible (self , page_name : str ) -> bool :
171+ """
172+ Check if a page is currently visible in the tabs.
173+
174+ Args:
175+ page_name: The name of the page to check
176+
177+ Returns:
178+ bool: True if the page is visible, False otherwise
179+ """
180+ if page_name not in self .base_pages :
181+ return False
182+
183+ page_widget = self .base_pages [page_name ]
184+ return self .central_widget .indexOf (page_widget ) >= 0
185+
186+ def _on_tab_close_requested (self , index : int ):
187+ """
188+ Handle when user clicks the close button on a tab.
189+ For base pages, we just hide them instead of destroying them.
190+
191+ Args:
192+ index: The index of the tab to close
193+ """
194+ widget = self .central_widget .widget (index )
195+ if widget is None :
196+ return
197+
198+ # Check if this is a base page
199+ page_name = widget .objectName ()
200+ if page_name in self .base_pages :
201+ # Just remove from tabs, don't destroy
202+ self .central_widget .removeTab (index )
203+ else :
204+ # For non-base pages, remove and destroy
205+ self .central_widget .removeTab (index )
206+ widget .deleteLater ()
100207
101208 def apply_settings (self , load = False ):
102209
0 commit comments