@@ -271,8 +271,7 @@ def __init__(self):
271271 imgui .WINDOW_NO_SCROLL_WITH_MOUSE
272272 )
273273 self .tabbar_flags : int = (
274- imgui .TAB_BAR_FITTING_POLICY_SCROLL |
275- imgui .TAB_BAR_REORDERABLE
274+ imgui .TAB_BAR_FITTING_POLICY_SCROLL
276275 )
277276 self .game_list_table_flags : int = (
278277 imgui .TABLE_SCROLL_Y |
@@ -310,7 +309,6 @@ def __init__(self):
310309 self .watermark_text = f"F95Checker { globals .version_name } { '' if not globals .release else ' by WillyJL' } "
311310
312311 # Variables
313- self .hidden = False
314312 self .focused = True
315313 self .minimized = False
316314 self .filtering = False
@@ -326,6 +324,7 @@ def __init__(self):
326324 self .recalculate_ids = True
327325 self .current_tab : Tab = None
328326 self .selected_games_count = 0
327+ self .dragging_tab : Tab = None
329328 self .game_hitbox_click = False
330329 self .hovered_game : Game = None
331330 self .filters : list [Filter ] = []
@@ -801,26 +800,28 @@ def drop_callback(self, window: glfw._GLFWwindow, items: list[str]):
801800 elif path .suffix and path .suffix .lower () == ".url" :
802801 async_thread .run (api .import_url_shortcut (path ))
803802
803+ @property
804+ def hidden (self ):
805+ return not glfw .get_window_attrib (self .window , glfw .VISIBLE )
806+
804807 def hide (self , * _ , ** __ ):
805808 if threading .current_thread () is not threading .main_thread ():
806809 self .call_soon .append (self .hide )
807810 self .screen_pos = glfw .get_window_pos (self .window )
808811 glfw .hide_window (self .window )
809- self .hidden = True
810812 self .tray .update_status ()
811813
812814 def show (self , * _ , ** __ ):
813815 if threading .current_thread () is not threading .main_thread ():
814816 self .call_soon .append (self .show )
815817 self .bg_mode_timer = None
816818 self .bg_mode_notifs_timer = None
817- if not self .hidden :
818- glfw .hide_window (self .window )
819+ # if not self.hidden:
820+ # glfw.hide_window(self.window)
819821 glfw .show_window (self .window )
820822 if utils .validate_geometry (* self .screen_pos , * self .prev_size ):
821823 glfw .set_window_pos (self .window , * self .screen_pos )
822824 glfw .focus_window (self .window )
823- self .hidden = False
824825 self .tray .update_status ()
825826
826827 def scaled (self , size : int | float ):
@@ -876,7 +877,7 @@ def main_loop(self):
876877 cursor = imgui .get_mouse_cursor ()
877878 any_hovered = imgui .is_any_item_hovered ()
878879 win_hovered = glfw .get_window_attrib (self .window , glfw .HOVERED )
879- if not self .hidden and not self .minimized and ( self . focused or globals . settings . render_when_unfocused ):
880+ if first_frame or ( not self .hidden and not self .minimized ): # Visible
880881
881882 # Scroll modifiers (must be before new_frame())
882883 imgui .io .mouse_wheel *= globals .settings .scroll_amount
@@ -901,6 +902,7 @@ def main_loop(self):
901902 or (imagehelper .redraw and globals .settings .play_gifs and (self .focused or globals .settings .play_gifs_unfocused ))
902903 or imgui .io .mouse_wheel or self .input_chars or any (imgui .io .mouse_down ) or any (imgui .io .keys_down )
903904 or (prev_mouse_pos != mouse_pos and (prev_win_hovered or win_hovered ))
905+ or (self .focused or globals .settings .render_when_unfocused )
904906 or imagehelper .apply_queue or imagehelper .unload_queue
905907 or prev_scaling != globals .settings .interface_scaling
906908 or prev_minimized != self .minimized
@@ -914,8 +916,9 @@ def main_loop(self):
914916 )
915917 if draw :
916918 draw_next = max (draw_next , imgui .io .delta_time + 1.0 ) # Draw for at least next half second
917- if draw_next > 0.0 :
918- draw_next -= imgui .io .delta_time
919+ if draw_next > 0.0 : # Visible and drawing
920+ if not first_frame :
921+ draw_next -= imgui .io .delta_time
919922 draw_start = time .perf_counter ()
920923
921924 # Reactive mouse cursors
@@ -1023,11 +1026,14 @@ def main_loop(self):
10231026 # Wait idle time
10241027 glfw .swap_buffers (self .window )
10251028 if first_frame :
1026- glfw .show_window (self .window )
1029+ if not globals .settings .start_in_background :
1030+ glfw .show_window (self .window )
10271031 first_frame = False
1028- else :
1032+ else : # Visible but not drawing
10291033 time .sleep (1 / 15 )
1030- else :
1034+ else : # Not visible
1035+ # Unload images if necessary
1036+ imagehelper .post_draw (0 )
10311037 # Tray bg mode and not paused
10321038 if self .hidden and not self .bg_mode_paused and not utils .is_refreshing ():
10331039 if not self .bg_mode_timer :
@@ -2908,16 +2914,23 @@ def draw_tabbar(self):
29082914 self .current_tab = display_tab
29092915 self .tick_list_columns ()
29102916 save_new_tab = False
2917+ elif self .dragging_tab :
2918+ # Keep current tab while resetting tabbar due to dragging
2919+ save_new_tab = False
2920+ select_tab = True
29112921 else :
29122922 save_new_tab = True
29132923 new_tab = None
29142924 if Tab .instances and not (globals .settings .filter_all_tabs and self .filtering ):
2915- if imgui .begin_tab_bar ("###tabbar" , flags = self .tabbar_flags ):
2925+ if imgui .begin_tab_bar (
2926+ f"###tabbar_{ ',' .join (str (tab .id ) for tab in Tab .instances )} " ,
2927+ flags = self .tabbar_flags
2928+ ):
29162929 hide = globals .settings .hide_empty_tabs
29172930 count = len (self .show_games_ids .get (None , ()))
29182931 if (count or not hide ) and imgui .begin_tab_item (
29192932 f"{ Tab .first_tab_label ()} ({ count } )###tab_-1" ,
2920- flags = imgui .TAB_ITEM_NO_REORDER
2933+ flags = imgui .TAB_ITEM_NONE
29212934 )[0 ]:
29222935 new_tab = None
29232936 imgui .end_tab_item ()
@@ -2939,14 +2952,18 @@ def draw_tabbar(self):
29392952 imgui .end_tab_item ()
29402953 if tab .color :
29412954 imgui .pop_style_color (4 )
2942- if imgui .is_item_active ():
2955+ if self .dragging_tab is tab and imgui .is_mouse_released ():
2956+ self .dragging_tab = None
2957+ elif imgui .is_item_active () or self .dragging_tab is tab :
29432958 mouse_pos = imgui .get_mouse_pos ()
2944- if tab_i > 0 and mouse_pos .x < imgui .get_item_rect_min ().x :
2959+ if tab_i > 0 and imgui . get_item_rect_min (). x > 0 and mouse_pos .x < imgui .get_item_rect_min ().x :
29452960 if imgui .get_mouse_drag_delta ().x < 0 :
2961+ self .dragging_tab = tab
29462962 swap = (tab_i , tab_i - 1 )
29472963 imgui .reset_mouse_drag_delta ()
2948- elif tab_i < len (Tab .instances ) - 1 and mouse_pos .x > imgui .get_item_rect_max ().x :
2964+ elif tab_i < len (Tab .instances ) - 1 and imgui . get_item_rect_max (). x > 0 and mouse_pos .x > imgui .get_item_rect_max ().x :
29492965 if imgui .get_mouse_drag_delta ().x > 0 :
2966+ self .dragging_tab = tab
29502967 swap = (tab_i , tab_i + 1 )
29512968 imgui .reset_mouse_drag_delta ()
29522969 context_id = f"###tab_{ tab .id } _context"
0 commit comments