diff --git a/app/ui/backup.py b/app/ui/backup.py index 4bdb732a..1de44990 100644 --- a/app/ui/backup.py +++ b/app/ui/backup.py @@ -39,7 +39,7 @@ from app.commons import run_idle, get_size_from_bytes from app.settings import SettingsType, SEP, IS_DARWIN from app.ui.dialogs import show_dialog, DialogType, get_builder from app.ui.main_helper import append_text_to_tview -from .uicommons import Gtk, Gdk, UI_RESOURCES_PATH, KeyboardKey, MOD_MASK, IS_GNOME_SESSION +from .uicommons import Gtk, Gdk, UI_RESOURCES_PATH, KeyboardKey, MOD_MASK, IS_GNOME_SESSION, HeaderBar class RestoreType(Enum): @@ -78,7 +78,7 @@ class BackupDialog: self._file_count_label = builder.get_object("file_count_label") if IS_GNOME_SESSION or IS_DARWIN: - header_bar = Gtk.HeaderBar(visible=True, show_close_button=True) + header_bar = HeaderBar() self._dialog_window.set_titlebar(header_bar) button_box = builder.get_object("main_button_box") @@ -93,8 +93,6 @@ class BackupDialog: h_bar.remove(ch_button) h_bar.set_visible(False) header_bar.pack_end(ch_button) - if IS_DARWIN: - header_bar.set_decoration_layout("close,minimize,maximize") # Setting the last size of the dialog window if it was saved window_size = self._settings.get("backup_tool_window_size") diff --git a/app/ui/epg/epg.py b/app/ui/epg/epg.py index 50b0a601..34387c16 100644 --- a/app/ui/epg/epg.py +++ b/app/ui/epg/epg.py @@ -49,7 +49,7 @@ from app.ui.dialogs import get_message, show_dialog, DialogType, get_builder from app.ui.tasks import BGTaskWidget from app.ui.timers import TimerTool from ..main_helper import on_popup_menu, update_entry_data, scroll_to, update_toggle_model, update_filter_sat_positions -from ..uicommons import Gtk, Gdk, UI_RESOURCES_PATH, Column, EPG_ICON, KeyboardKey, IS_GNOME_SESSION, Page +from ..uicommons import Gtk, Gdk, UI_RESOURCES_PATH, Column, EPG_ICON, KeyboardKey, IS_GNOME_SESSION, Page, HeaderBar class RefsSource(Enum): @@ -476,8 +476,7 @@ class EpgDialog: self._epg_dat_source_box = builder.get_object("epg_dat_source_box") if IS_GNOME_SESSION or IS_DARWIN: - header_bar = Gtk.HeaderBar(visible=True, show_close_button=True, title="EPG", - subtitle=get_message("List configuration")) + header_bar = HeaderBar(title="EPG", subtitle=get_message("List configuration")) self._dialog.set_titlebar(header_bar) builder.get_object("left_action_box").reparent(header_bar) right_box = builder.get_object("right_action_box") diff --git a/app/ui/imports.py b/app/ui/imports.py index 15bed15d..6e5a9fd5 100644 --- a/app/ui/imports.py +++ b/app/ui/imports.py @@ -37,7 +37,7 @@ from app.eparser.neutrino.bouquets import parse_webtv, parse_bouquets as get_neu from app.settings import SettingsType, IS_DARWIN, SEP from app.ui.dialogs import show_dialog, DialogType, get_chooser_dialog, get_message, get_builder from app.ui.main_helper import on_popup_menu, get_iptv_data -from .uicommons import Gtk, Gdk, UI_RESOURCES_PATH, KeyboardKey, Column, IS_GNOME_SESSION, Page +from .uicommons import Gtk, Gdk, UI_RESOURCES_PATH, KeyboardKey, Column, IS_GNOME_SESSION, Page, HeaderBar def import_bouquet(app, model, path, appender, file_path=None): @@ -162,7 +162,7 @@ class ImportDialog: if IS_GNOME_SESSION or IS_DARWIN: actions_box = builder.get_object("actions_box") builder.get_object("toolbar_box").set_visible(False) - header_bar = Gtk.HeaderBar(visible=True, show_close_button=True) + header_bar = HeaderBar() stack_switcher = builder.get_object("stack_switcher") actions_box.remove(stack_switcher) header_bar.set_custom_title(stack_switcher) @@ -172,8 +172,7 @@ class ImportDialog: extra_box = builder.get_object("extra_header_box") actions_box.remove(extra_box) header_bar.pack_end(extra_box) - if IS_DARWIN: - header_bar.set_decoration_layout("close,minimize,maximize") + self._dialog_window.set_titlebar(header_bar) window_size = self._settings.get("import_dialog_window_size") diff --git a/app/ui/main.py b/app/ui/main.py index fbe4f50d..dec9515e 100644 --- a/app/ui/main.py +++ b/app/ui/main.py @@ -69,7 +69,7 @@ from .search import SearchProvider from .service_details_dialog import ServiceDetailsDialog, Action from .settings_dialog import SettingsDialog from .uicommons import (Gtk, Gdk, UI_RESOURCES_PATH, LOCKED_ICON, HIDE_ICON, IPTV_ICON, MOVE_KEYS, KeyboardKey, Column, - FavClickMode, MOD_MASK, APP_FONT, Page, IS_GNOME_SESSION) + FavClickMode, MOD_MASK, APP_FONT, Page, IS_GNOME_SESSION, HeaderBar) from .xml.dialogs import ServicesUpdateDialog from .xml.edit import SatellitesTool @@ -507,11 +507,10 @@ class Application(Gtk.Application): profile_box = builder.get_object("profile_combo_box") toolbar_box = builder.get_object("toolbar_main_box") if IS_GNOME_SESSION or IS_DARWIN: - header_bar = Gtk.HeaderBar(visible=True, show_close_button=True) - if IS_DARWIN: - header_bar.set_decoration_layout("close,minimize,maximize") - else: + header_bar = HeaderBar() + if not IS_DARWIN: header_bar.pack_start(builder.get_object("file_header_button")) + header_bar.pack_start(profile_box) header_bar.pack_start(toolbar_box) header_bar.set_custom_title(builder.get_object("stack_switcher")) diff --git a/app/ui/settings_dialog.py b/app/ui/settings_dialog.py index 39f339f4..e5be5746 100644 --- a/app/ui/settings_dialog.py +++ b/app/ui/settings_dialog.py @@ -35,7 +35,7 @@ from app.connections import test_telnet, test_ftp, TestException, test_http, Htt from app.settings import SettingsType, Settings, PlayStreamsMode, IS_LINUX, SEP, IS_WIN, IS_DARWIN from app.ui.dialogs import show_dialog, DialogType, get_message, get_chooser_dialog, get_builder from .main_helper import update_entry_data, scroll_to, get_picon_pixbuf -from .uicommons import Gtk, Gdk, UI_RESOURCES_PATH, FavClickMode, DEFAULT_ICON, APP_FONT, IS_GNOME_SESSION +from .uicommons import Gtk, Gdk, UI_RESOURCES_PATH, FavClickMode, DEFAULT_ICON, APP_FONT, IS_GNOME_SESSION, HeaderBar class SettingsDialog: @@ -212,10 +212,8 @@ class SettingsDialog: switcher.set_margin_top(0) switcher.set_margin_bottom(0) builder.get_object("main_box").remove(switcher) - header_bar = Gtk.HeaderBar(visible=True, show_close_button=True) + header_bar = HeaderBar() header_bar.set_custom_title(switcher) - if IS_DARWIN: - header_bar.set_decoration_layout("close,minimize,maximize") self._dialog.set_titlebar(header_bar) diff --git a/app/ui/uicommons.py b/app/ui/uicommons.py index 7a228045..a1ccca31 100644 --- a/app/ui/uicommons.py +++ b/app/ui/uicommons.py @@ -162,6 +162,17 @@ def show_notification(message, timeout=10000, urgency=1): notify.show() +class HeaderBar(Gtk.HeaderBar): + """ Custom header bar widget. """ + def __init__(self, **kwargs): + super().__init__(**kwargs) + self.set_visible(True) + self.set_show_close_button(True) + + if IS_DARWIN: + self.set_decoration_layout("close,minimize,maximize") + + class Page(Enum): """ Main stack widget page. """ INFO = "info" diff --git a/app/ui/xml/dialogs.py b/app/ui/xml/dialogs.py index e6be55e3..70e93be2 100644 --- a/app/ui/xml/dialogs.py +++ b/app/ui/xml/dialogs.py @@ -2,7 +2,7 @@ # # The MIT License (MIT) # -# Copyright (c) 2018-2022 Dmitriy Yefremov +# Copyright (c) 2018-2023 Dmitriy Yefremov # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -44,7 +44,7 @@ from app.tools.satellites import SatellitesParser, SatelliteSource, ServicesPars from ..dialogs import show_dialog, DialogType, get_message, get_builder from ..main_helper import append_text_to_tview, get_base_model, on_popup_menu from ..search import SearchProvider -from ..uicommons import Gtk, Gdk, UI_RESOURCES_PATH, IS_GNOME_SESSION +from ..uicommons import Gtk, Gdk, UI_RESOURCES_PATH, IS_GNOME_SESSION, HeaderBar _DIALOGS_UI_PATH = f"{UI_RESOURCES_PATH}xml{os.sep}dialogs.glade" @@ -458,10 +458,7 @@ class UpdateDialog: builder.get_object("sat_update_find_button").connect("toggled", search_provider.on_search_toggled) if IS_GNOME_SESSION or IS_DARWIN: - header_bar = Gtk.HeaderBar(visible=True, show_close_button=True) - if IS_DARWIN: - header_bar.set_decoration_layout("close,minimize,maximize") - + header_bar = HeaderBar() builder.get_object("sat_update_header").set_visible(False) header_box = builder.get_object("satellites_update_header_box") header_box.remove(self._source_box)