From 64faa297eeb34a51a13fb862531be503e60b6c48 Mon Sep 17 00:00:00 2001 From: corentin desayes Date: Wed, 21 Aug 2019 23:14:20 +0200 Subject: [PATCH 1/4] Dev (#7) * Add first features for read disk * delete some unused files, add message when no ui is found, change the README * delete some unused files, add message when no ui is found, change the README * add type hint * remove dependency_injector * add first page language live * remove services --- config/general.json | 8 +- locales/en/LC_MESSAGES/language_live_page.po | 25 ++ locales/fr/LC_MESSAGES/language_live_page.po | 25 ++ ui/gtk/img/ico/page1.png | Bin 0 -> 7653 bytes ui/gtk/main_window.py | 145 ++++++- ui/gtk/pages/__init__.py | 0 ui/gtk/pages/language_live_page.py | 375 +++++++++++++++++++ 7 files changed, 575 insertions(+), 3 deletions(-) create mode 100644 locales/en/LC_MESSAGES/language_live_page.po create mode 100644 locales/fr/LC_MESSAGES/language_live_page.po create mode 100644 ui/gtk/img/ico/page1.png create mode 100644 ui/gtk/pages/__init__.py create mode 100644 ui/gtk/pages/language_live_page.py diff --git a/config/general.json b/config/general.json index c88ffe8..56f0797 100644 --- a/config/general.json +++ b/config/general.json @@ -3,5 +3,11 @@ "launch_without_root": false, "default_language_code": "fr", "locales_folder": "./locales", - "language_files": ["main_window", "popup", "general"] + "config_page": { + "language_live": { + "id": "language_live", + "icon": "./ui/gtk/img/ico/page1.png" + } + }, + "language_files": ["main_window", "popup", "general", "language_live_page"] } \ No newline at end of file diff --git a/locales/en/LC_MESSAGES/language_live_page.po b/locales/en/LC_MESSAGES/language_live_page.po new file mode 100644 index 0000000..965a134 --- /dev/null +++ b/locales/en/LC_MESSAGES/language_live_page.po @@ -0,0 +1,25 @@ +msgid "" +msgstr "" +"Content-Type: text/plain; charset=UTF-8\n" +"X-Poedit-SourceCharset: UTF-8\n" + +msgid "title" +msgstr "Live CD language configuration" + +msgid "sidebar_title" +msgstr "Live CD language" + +msgid "desc_language" +msgstr "Language:" + +msgid "desc_keyboard" +msgstr "Keyboard:" + +msgid "input_keyboard" +msgstr "Try the keyboard here" + +msgid "french" +msgstr "french" + +msgid "english" +msgstr "english" \ No newline at end of file diff --git a/locales/fr/LC_MESSAGES/language_live_page.po b/locales/fr/LC_MESSAGES/language_live_page.po new file mode 100644 index 0000000..1d8a712 --- /dev/null +++ b/locales/fr/LC_MESSAGES/language_live_page.po @@ -0,0 +1,25 @@ +msgid "" +msgstr "" +"Content-Type: text/plain; charset=UTF-8\n" +"X-Poedit-SourceCharset: UTF-8\n" + +msgid "title" +msgstr "Configuration de langue du CD autonomne" + +msgid "sidebar_title" +msgstr "Langage CD autonomne" + +msgid "desc_language" +msgstr "Langue:" + +msgid "desc_keyboard" +msgstr "Clavier:" + +msgid "input_keyboard" +msgstr "Essayez le clavier ici" + +msgid "french" +msgstr "français" + +msgid "english" +msgstr "anglais" \ No newline at end of file diff --git a/ui/gtk/img/ico/page1.png b/ui/gtk/img/ico/page1.png new file mode 100644 index 0000000000000000000000000000000000000000..8c6280687cbca245efc8f2e1a73ad90b23191135 GIT binary patch literal 7653 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 None: def set_component(self, component_name: str, component: GObject.Object) -> None: self._all_components[component_name] = component - def get_component(self, component_name: str) -> None: + def get_component(self, component_name: str) -> GObject: return self._all_components[component_name] +class TitleLabel(Gtk.Label): + _page_id = None + + def __init__(self, page_id: str, sidebar_title: str) -> None: + Gtk.Label.__init__(self) + self.set_label(sidebar_title) + self._page_id = page_id + self.set_halign(Gtk.Align.START) + self.get_style_context().add_class('dim-label') + self.set_property('margin', 6) + self.set_property('margin-start', 24) + self.set_property('margin-end', 24) + + def get_page_id(self) -> str: + return self._page_id + + class MainWindowGtk: def __init__(self, locale_general: LanguageManagement, config_general: dict, config_main_window: dict) -> None: @@ -63,12 +82,134 @@ def __init__(self, locale_general: LanguageManagement, config_general: dict, con ltr = Gtk.StackTransitionType.SLIDE_LEFT_RIGHT self._component.get_component('main_window_right_stack').set_transition_type(ltr) self._settings.set_property('gtk-application-prefer-dark-theme', True) + self.register_all_pages() + self.load_lang() + self.update_page() + + self._component.get_component('main_window_prev_btn').connect('clicked', lambda x: self.prev_page_btn()) + self._component.get_component('main_window_next_btn').connect('clicked', lambda x: self.next_page_btn()) self._component.get_component('main_window').show_all() + GLib.idle_add(self.prepare_all_long_tasks_page) def set_title(self, message: str) -> None: self._component.get_component('main_window_header_right_label').set_halign(Gtk.Align.START) self._component.get_component('main_window_header_right_label').set_label( u'{}'.format(message)) + def register_all_pages(self) -> None: + all_pages = list() + + all_pages.append(LanguageLivePage(self._locale_general, self._config_general)) + for current_page in all_pages: + current_page.load_win(self) + self._component.get_component('main_window_right_stack').add_named( + current_page._components.get_component('general_box'), current_page.get_page_id()) + self._component.get_component('main_window_left_list_text_box').pack_start( + TitleLabel(current_page.get_page_id(), current_page.get_page_sidebar_title()), False, False, 0) + self._pages.append(current_page) + + def load_lang(self) -> None: + component = self._component.get_component('main_window_left_list_text_box') + for label in component.get_children(): + component.remove(label) + + for current_page in self._pages: + label_in_box = TitleLabel(current_page.get_page_id(), current_page.get_page_sidebar_title()) + if label_in_box.get_page_id() == self._pages[self._page_index].get_page_id(): + label_in_box.get_style_context().remove_class('dim-label') + else: + label_in_box.get_style_context().add_class('dim-label') + self._component.get_component('main_window_left_list_text_box').pack_start(label_in_box, False, + False, 0) + current_page.refresh_ui_language() + self._component.get_component('main_window_left_list_text_box').show_all() + + self.set_title(self._pages[self._page_index].get_page_title()) + self._component.get_component('main_window_prev_btn').set_label( + self._locale_general.translate_msg('main_window', 'bot_right_prev_btn')) + self._component.get_component('main_window_next_btn').set_label( + self._locale_general.translate_msg('main_window', 'bot_right_next_btn')) + self._component.get_component('main_window_header_right_quit_btn').set_label( + self._locale_general.translate_msg('main_window', 'top_right_quit_btn')) + + def next_page_btn(self) -> None: + idx = self._page_index + 1 + if idx >= len(self._pages): + return + self._page_index = idx + self.update_page() + + def prev_page_btn(self) -> None: + idx = self._page_index - 1 + if idx < 0: + return + self._page_index = idx + self.update_page() + + def update_page(self) -> None: + self.set_title(self._pages[self._page_index].get_page_title()) + + if self._page_index == len(self._pages) - 1: + self.set_can_next(False) + self.set_hide_next(True) + else: + self.set_can_next(True) + self.set_hide_next(False) + + if self._page_index == 0: + self.set_can_prev(False) + self.set_hide_prev(True) + else: + self.set_can_prev(True) + self.set_hide_prev(False) + + self._pages[self._page_index].load_page() + + pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale(self._pages[self._page_index].get_page_icon(), 50, 50, False) + self._component.get_component('main_window_top_left_logo').set_from_pixbuf(pixbuf) + for label in self._component.get_component('main_window_left_list_text_box').get_children(): + if label.get_page_id() == self._pages[self._page_index].get_page_id(): + label.get_style_context().remove_class('dim-label') + else: + label.get_style_context().add_class('dim-label') + self._component.get_component('main_window_right_stack').set_visible_child_name( + self._pages[self._page_index].get_page_id()) + + def set_can_prev(self, can_prev: bool) -> None: + if self._page_index == 0: + can_prev = False + self._component.get_component('main_window_prev_btn').set_sensitive(can_prev) + + def set_can_next(self, can_next: bool) -> None: + if self._page_index == len(self._pages) - 1: + can_next = False + self._component.get_component('main_window_next_btn').set_sensitive(can_next) + + def set_hide_prev(self, hide: bool) -> None: + if hide: + self._component.get_component('main_window_prev_btn').hide() + else: + self._component.get_component('main_window_prev_btn').show_all() + + def set_hide_next(self, hide: bool) -> None: + if hide: + self._component.get_component('main_window_next_btn').hide() + else: + self._component.get_component('main_window_next_btn').show_all() + + def init_background_tasks(self) -> None: + for page in self._pages: + try: + page.long_task() + except Exception as e: + pass + + def prepare_all_long_tasks_page(self) -> bool: + self.set_can_next(False) + thread = threading.Thread(target=self.init_background_tasks) + thread.daemon = True + thread.start() + return False + def launch(self) -> None: Gtk.main() diff --git a/ui/gtk/pages/__init__.py b/ui/gtk/pages/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ui/gtk/pages/language_live_page.py b/ui/gtk/pages/language_live_page.py new file mode 100644 index 0000000..22c1946 --- /dev/null +++ b/ui/gtk/pages/language_live_page.py @@ -0,0 +1,375 @@ +from gi.repository import Gtk, Gdk, GnomeDesktop +import subprocess +import locale + + +class KeyboardLabel(Gtk.Label): + keyboard_name = None + keyboard_id = None + + def __init__(self, keyboard_id, keyboard_name): + Gtk.Label.__init__(self) + self.keyboard_id = keyboard_id + self.keyboard_name = keyboard_name + + self.set_property("margin", 10) + self.set_halign(Gtk.Align.START) + self.set_text(self.keyboard_name) + self.show() + + +class LanguageLabel(Gtk.Label): + language_code = None + language_name = None + + def __init__(self, language_code, language_name): + Gtk.Label.__init__(self) + self.language_code = language_code + self.language_name = language_name + + self.set_property("margin", 8) + self.set_halign(Gtk.Align.START) + self.set_text(self.language_name) + self.show() + + +class Components(): + _components = {} + + def __init__(self): + self._components["general_box"] = Gtk.Box(self, orientation=Gtk.Orientation.VERTICAL, spacing=0) + self._components["general_grid"] = Gtk.Grid() + self._components["language_window_scroll"] = Gtk.ScrolledWindow(None, None) + self._components["keyboard_window_scroll"] = Gtk.ScrolledWindow(None, None) + self._components["language_window_listbox"] = Gtk.ListBox() + self._components["keyboard_window_listbox"] = Gtk.ListBox() + self._components["language_window_more_btn"] = Gtk.Image.new_from_icon_name("view-more-symbolic", + Gtk.IconSize.MENU) + self._components["keyboard_window_more_btn"] = Gtk.Image.new_from_icon_name("view-more-symbolic", + Gtk.IconSize.MENU) + self._components["language_window_label"] = Gtk.Label() + self._components["keyboard_window_label"] = Gtk.Label() + self._components["keyboard_window_grid"] = Gtk.Grid() + self._components["keyboard_window_input"] = Gtk.Entry() + + def get_component(self, component_name): + return self._components[component_name] + + +class LanguageLivePage(): + _components = None + _win_parent = None + + keyboard_already_showed = set() + country_depending_keyboard = list() + nb_default_languages = 2 + nb_default_keyboard = 7 + + def __init__(self, locale_general, config_general): + self._locale_general = locale_general + self._config_general = config_general + self._config_general["language_live_page"] = {} + self._config_general["language_live_page"]["locale"] = self._locale_general.current_language + self._config_general["language_live_page"]["language_next"] = False + self._config_general["language_live_page"]["keyboard_next"] = False + + self._components = Components() + self.init_components() + self.refresh_ui_language() + + def init_components(self): + # General grid + self._components.get_component("general_box").pack_start(self._components.get_component("general_grid"), True, + True, 0) + self._components.get_component("general_grid").set_margin_start(10) + self._components.get_component("general_grid").set_margin_end(10) + self._components.get_component("general_grid").set_margin_top(10) + self._components.get_component("general_grid").set_margin_bottom(10) + self._components.get_component("general_grid").set_column_spacing(50) + self._components.get_component("general_grid").set_row_spacing(5) + self._components.get_component("general_grid").set_halign(Gtk.Align.START) + + # Language box + self._components.get_component("language_window_scroll").set_shadow_type(Gtk.ShadowType.ETCHED_IN) + self._components.get_component("language_window_scroll").add( + self._components.get_component("language_window_listbox")) + + self._components.get_component("language_window_scroll").set_halign(Gtk.Align.CENTER) + self._components.get_component("language_window_listbox").set_size_request(60, -1) + + self._components.get_component("language_window_scroll").set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.NEVER) + self._components.get_component("language_window_more_btn").set_property("margin", 8) + self._components.get_component("language_window_more_btn").show_all() + self._components.get_component("language_window_listbox").connect_after("row-selected", self.on_row_click_language) + + # Title for box + self._components.get_component("language_window_label").set_halign(Gtk.Align.START) + self._components.get_component("language_window_label").set_line_wrap(True) + + self._components.get_component("keyboard_window_label").set_halign(Gtk.Align.START) + self._components.get_component("keyboard_window_label").set_line_wrap(True) + + # Keyboard box + self._components.get_component("keyboard_window_grid").set_row_spacing(6) + self._components.get_component("keyboard_window_grid").set_halign(Gtk.Align.CENTER) + + self._components.get_component("keyboard_window_listbox").set_size_request(60, -1) + + self._components.get_component("keyboard_window_scroll").set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) + self._components.get_component("keyboard_window_scroll").add( + self._components.get_component("keyboard_window_listbox")) + self._components.get_component("keyboard_window_scroll").set_shadow_type(Gtk.ShadowType.ETCHED_IN) + self._components.get_component("keyboard_window_scroll").set_vexpand(True) + self._components.get_component("keyboard_window_grid").attach( + self._components.get_component("keyboard_window_scroll"), 0, 0, 2, 1) + + # Input tester + self._components.get_component("keyboard_window_grid").attach(self._components.get_component("keyboard_window_input"), + 0, 1, 2, 1) + self._components.get_component("keyboard_window_more_btn").set_property("margin", 8) + self._components.get_component("keyboard_window_listbox").connect_after("row-selected", self.on_row_click_keyboard) + + # Attach general grid + self._components.get_component("general_grid").attach(self._components.get_component("language_window_scroll"), 0, + 1, 1, 1) + self._components.get_component("general_grid").attach(self._components.get_component("language_window_label"), 0, + 0, 1, 1) + self._components.get_component("general_grid").attach(self._components.get_component("keyboard_window_label"), 1, + 0, 1, 1) + self._components.get_component("general_grid").attach(self._components.get_component("keyboard_window_grid"), 1, 1, + 1, 1) + + def on_row_click_language(self, list_box_language, current_row_language_clicked=None): + if not current_row_language_clicked: + self._config_general["language_live_page"]["locale"] = None + self._config_general["language_live_page"]["locale_sz"] = None + self._config_general["language_live_page"]["language_next"] = False + self._win_parent.set_can_next(False) + return + + row_elem = current_row_language_clicked.get_child() + if row_elem != self._components.get_component("language_window_more_btn"): + self._config_general["language_live_page"]["locale"] = row_elem.language_code + self._config_general["language_live_page"]["locale_sz"] = row_elem.language_name + + self._locale_general.change_language_all_files(self._config_general["language_live_page"]["locale"]) + self._win_parent.load_lang() + self._config_general["language_live_page"]["language_next"] = True + if self._config_general["language_live_page"]["language_next"] and \ + self._config_general["language_live_page"]["keyboard_next"]: + self._win_parent.set_can_next(True) + return + + self._components.get_component("language_window_scroll").set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) + self._components.get_component("language_window_scroll").set_vexpand(True) + self._components.get_component("language_window_scroll").set_valign(Gtk.Align.FILL) + self._components.get_component("language_window_more_btn").get_parent().hide() + languages = self._locale_general.available_languages + languages_keys = list(languages)[0:self.nb_default_languages] + languages_extra = list() + for key in languages: + if key in languages_keys: + continue + languages_extra.append( + LanguageLabel(key, self._locale_general.translate_msg("language_live_page", languages[key]))) + + languages_extra.sort(key=lambda sort: sort.language_name.lower()) + for current in languages_extra: + self._components.get_component("language_window_listbox").add(current) + self.set_selected_language_row() + + def on_row_click_keyboard(self, list_box_keyboard, current_row_keyboard_clicked=None): + if not current_row_keyboard_clicked: + self._config_general["language_live_page"]["keyboard"] = None + self._config_general["language_live_page"]["keyboard_sz"] = None + self._config_general["language_live_page"]["keyboard_next"] = False + self._win_parent.set_can_next(False) + return + + row_elem = current_row_keyboard_clicked.get_child() + if row_elem != self._components.get_component("keyboard_window_more_btn"): + self._config_general["language_live_page"]["keyboard"] = row_elem.keyboard_id + self._config_general["language_live_page"]["keyboard_sz"] = row_elem.keyboard_name + self.set_keyboard() + self._config_general["language_live_page"]["keyboard_next"] = True + if self._config_general["language_live_page"]["language_next"] and \ + self._config_general["language_live_page"]["keyboard_next"]: + self._win_parent.set_can_next(True) + self._components.get_component("keyboard_window_input").set_text("") + return + + self._components.get_component("keyboard_window_more_btn").get_parent().hide() + + keyboard_info = GnomeDesktop.XkbInfo() + all_keyboard_code_info = keyboard_info.get_all_layouts() + all_expand_languages = list() + + for current in self.country_depending_keyboard: + if not current.keyboard_id in self.keyboard_already_showed: + self.keyboard_already_showed.add(current.keyboard_id) + all_expand_languages.append(current) + + for current in all_keyboard_code_info: + if not current in self.keyboard_already_showed: + info = keyboard_info.get_layout_info(current) + if info[0]: + all_expand_languages.append(KeyboardLabel(current, info.display_name)) + + all_expand_languages.sort(key=lambda sort: sort.keyboard_name.lower()) + for current in all_expand_languages: + if not current.keyboard_id in self.keyboard_already_showed: + self._components.get_component("keyboard_window_listbox").add(current) + self.set_selected_keyboard_row() + + def init_view_keyboard(self): + keyboard_info = GnomeDesktop.XkbInfo() + country = self._locale_general.get_detailed_locale_country( + self._config_general["language_live_page"]["locale"]) + country_lower = country.lower() + input_locale = GnomeDesktop.get_input_source_from_locale( + self._locale_general.get_detailed_locale(self._config_general["language_live_page"]["locale"])) + + keyboard_depending_language = list([input_locale.id]) + keyboard_depending_language_after = list() + all_keyboard_and_extra = list() + + all_keyboard = keyboard_info.get_all_layouts() + for current in all_keyboard: + info = keyboard_info.get_layout_info(current) + if not info[0]: + continue + if info[3].lower() == country_lower: + keyboard_depending_language_after.append(current) + + keyboard_depending_language_after.remove(input_locale.id) + keyboard_depending_language_after = sorted(keyboard_depending_language_after) + keyboard_depending_language.extend(keyboard_depending_language_after) + + for current in keyboard_depending_language: + info = keyboard_info.get_layout_info(current) + if info[0]: + all_keyboard_and_extra.append(KeyboardLabel(current, info.display_name)) + + for current in all_keyboard_and_extra: + if current.keyboard_id in self.keyboard_already_showed: + continue + if len(self.keyboard_already_showed) >= self.nb_default_keyboard: + self.country_depending_keyboard.append(current) + continue + self.keyboard_already_showed.add(current.keyboard_id) + self._components.get_component("keyboard_window_listbox").add(current) + + self._components.get_component("keyboard_window_more_btn").show_all() + self._components.get_component("keyboard_window_listbox").add( + self._components.get_component("keyboard_window_more_btn")) + self.set_selected_keyboard_row() + + def set_keyboard(self): + if "keyboard" in self._config_general["language_live_page"]\ + and self._config_general["language_live_page"]["keyboard"] != None: + try: + subprocess.check_call("setxkbmap {}".format(self._config_general["language_live_page"]["keyboard"]), + shell=True) + except Exception as e: + pass + + def set_system_language(self): + if "locale" in self._config_general["language_live_page"]\ + and self._config_general["language_live_page"]["locale"]\ + in self._locale_general.available_languages: + locale_detailed = self._locale_general.get_detailed_locale( + self._config_general["language_live_page"]["locale"]) + locale.setlocale(locale.LC_ALL, locale_detailed) + + def set_selected_language_row(self): + check_not_empty = self._components.get_component("language_window_listbox").get_children() + if not check_not_empty: + return + + for current in self._components.get_component("language_window_listbox").get_children(): + label = current.get_child() + if label != self._components.get_component("language_window_more_btn")\ + and "locale" in self._config_general["language_live_page"]\ + and label.language_code == self._config_general["language_live_page"]["locale"]: + self._components.get_component("language_window_listbox").select_row(current) + return + + def set_selected_keyboard_row(self): + check_not_empty = self._components.get_component("keyboard_window_listbox").get_children() + if not check_not_empty: + return + selected_row = self._components.get_component("keyboard_window_listbox").get_children()[0] + self._components.get_component("keyboard_window_listbox").select_row(selected_row) + + def long_task(self): + Gdk.threads_enter() + languages = self._locale_general.available_languages + languages_keys = list(languages)[0:self.nb_default_languages] + languages_label = list() + for key in languages_keys: + languages_label.append( + LanguageLabel(key, self._locale_general.translate_msg("language_live_page", languages[key]))) + + languages_label.sort(key=lambda sort: sort.language_name.lower()) + for current in languages_label: + self._components.get_component("language_window_listbox").add(current) + + self._components.get_component("language_window_listbox").add( + self._components.get_component("language_window_more_btn")) + self.set_selected_language_row() + self.init_view_keyboard() + Gdk.threads_leave() + + def load_win(self, win): + self._win_parent = win + + def load_page(self): + self.set_system_language() + self.set_keyboard() + self.set_selected_language_row() + self.set_selected_keyboard_row() + + if "locale" in self._config_general["language_live_page"]\ + and "keyboard" in self._config_general["language_live_page"]: + self._win_parent.set_can_next(True) + else: + self._win_parent.set_can_next(False) + + def refresh_ui_language(self): + self._components.get_component("language_window_label").set_markup(u"{}".format( + self._locale_general.translate_msg("language_live_page", "desc_language"))) + self._components.get_component("keyboard_window_label").set_markup(u"{}".format( + self._locale_general.translate_msg("language_live_page", "desc_keyboard"))) + self._components.get_component("keyboard_window_input").set_placeholder_text( + self._locale_general.translate_msg("language_live_page", "input_keyboard")) + + self.set_system_language() + + languages = self._locale_general.available_languages + keyboard_info = GnomeDesktop.XkbInfo() + + for current_row in self._components.get_component("language_window_listbox").get_children(): + label = current_row.get_child() + if label != self._components.get_component("language_window_more_btn"): + label.language_name = self._locale_general.translate_msg("language_live_page", + languages[label.language_code]) + label.set_text(label.language_name) + + for current_row in self._components.get_component("keyboard_window_listbox").get_children(): + label = current_row.get_child() + if label != self._components.get_component("keyboard_window_more_btn"): + info = keyboard_info.get_layout_info(label.keyboard_id) + label.keyboard_name = info.display_name + label.set_text(label.keyboard_name) + + def get_page_title(self): + return self._locale_general.translate_msg("language_live_page", "title") + + def get_page_sidebar_title(self): + return self._locale_general.translate_msg("language_live_page", "sidebar_title") + + def get_page_id(self): + return self._config_general["config_page"]["language_live"]["id"] + + def get_page_icon(self): + return self._config_general["config_page"]["language_live"]["icon"] From a4639fa1ff6f4f3fb4b9eb9fa569078276b29bcb Mon Sep 17 00:00:00 2001 From: corentin desayes Date: Sun, 8 Sep 2019 16:39:28 +0200 Subject: [PATCH 2/4] Add enum for the next and back button (#8) * Add first features for read disk * delete some unused files, add message when no ui is found, change the README * delete some unused files, add message when no ui is found, change the README * add type hint * remove dependency_injector * add first page language live * remove services * add enum for the next and back button --- locales/en/LC_MESSAGES/language_live_page.po | 8 +- locales/fr/LC_MESSAGES/language_live_page.po | 12 +- ui/gtk/main_window.py | 78 ++--- ui/gtk/main_window_button.py | 6 + ui/gtk/pages/language_live_page.py | 310 +++++++++---------- ui/gtk/pages/page.py | 27 ++ 6 files changed, 230 insertions(+), 211 deletions(-) create mode 100644 ui/gtk/main_window_button.py create mode 100644 ui/gtk/pages/page.py diff --git a/locales/en/LC_MESSAGES/language_live_page.po b/locales/en/LC_MESSAGES/language_live_page.po index 965a134..604fffc 100644 --- a/locales/en/LC_MESSAGES/language_live_page.po +++ b/locales/en/LC_MESSAGES/language_live_page.po @@ -10,16 +10,16 @@ msgid "sidebar_title" msgstr "Live CD language" msgid "desc_language" -msgstr "Language:" +msgstr "Language :" msgid "desc_keyboard" -msgstr "Keyboard:" +msgstr "Keyboard :" msgid "input_keyboard" msgstr "Try the keyboard here" msgid "french" -msgstr "french" +msgstr "French" msgid "english" -msgstr "english" \ No newline at end of file +msgstr "English" \ No newline at end of file diff --git a/locales/fr/LC_MESSAGES/language_live_page.po b/locales/fr/LC_MESSAGES/language_live_page.po index 1d8a712..9c42496 100644 --- a/locales/fr/LC_MESSAGES/language_live_page.po +++ b/locales/fr/LC_MESSAGES/language_live_page.po @@ -4,22 +4,22 @@ msgstr "" "X-Poedit-SourceCharset: UTF-8\n" msgid "title" -msgstr "Configuration de langue du CD autonomne" +msgstr "Configuration du langage de l'installeur" msgid "sidebar_title" -msgstr "Langage CD autonomne" +msgstr "Langage de l'installeur" msgid "desc_language" -msgstr "Langue:" +msgstr "Langue :" msgid "desc_keyboard" -msgstr "Clavier:" +msgstr "Clavier :" msgid "input_keyboard" msgstr "Essayez le clavier ici" msgid "french" -msgstr "français" +msgstr "Français" msgid "english" -msgstr "anglais" \ No newline at end of file +msgstr "Anglais" diff --git a/ui/gtk/main_window.py b/ui/gtk/main_window.py index 202ddd3..fc6abbf 100644 --- a/ui/gtk/main_window.py +++ b/ui/gtk/main_window.py @@ -4,7 +4,9 @@ gi.require_version('Gtk', '3.0') from gi.repository import Gdk, GObject, Gtk, GLib, GdkPixbuf +from ui.gtk.main_window_button import MainWindowButton from egg.language_management import LanguageManagement +from ui.gtk.pages.page import Page from ui.gtk.pages.language_live_page import LanguageLivePage @@ -97,9 +99,10 @@ def set_title(self, message: str) -> None: u'{}'.format(message)) def register_all_pages(self) -> None: - all_pages = list() - - all_pages.append(LanguageLivePage(self._locale_general, self._config_general)) + all_pages = [ + LanguageLivePage(self._locale_general, self._config_general) + ] + # Add pages in the stack for current_page in all_pages: current_page.load_win(self) self._component.get_component('main_window_right_stack').add_named( @@ -107,15 +110,19 @@ def register_all_pages(self) -> None: self._component.get_component('main_window_left_list_text_box').pack_start( TitleLabel(current_page.get_page_id(), current_page.get_page_sidebar_title()), False, False, 0) self._pages.append(current_page) + + def current_page(self) -> Page: + return self._pages[self._page_index] def load_lang(self) -> None: component = self._component.get_component('main_window_left_list_text_box') for label in component.get_children(): component.remove(label) + # Load pages labels with the current on the left box for current_page in self._pages: label_in_box = TitleLabel(current_page.get_page_id(), current_page.get_page_sidebar_title()) - if label_in_box.get_page_id() == self._pages[self._page_index].get_page_id(): + if label_in_box.get_page_id() == self.current_page().get_page_id(): label_in_box.get_style_context().remove_class('dim-label') else: label_in_box.get_style_context().add_class('dim-label') @@ -124,7 +131,7 @@ def load_lang(self) -> None: current_page.refresh_ui_language() self._component.get_component('main_window_left_list_text_box').show_all() - self.set_title(self._pages[self._page_index].get_page_title()) + self.set_title(self.current_page().get_page_title()) self._component.get_component('main_window_prev_btn').set_label( self._locale_general.translate_msg('main_window', 'bot_right_prev_btn')) self._component.get_component('main_window_next_btn').set_label( @@ -147,55 +154,34 @@ def prev_page_btn(self) -> None: self.update_page() def update_page(self) -> None: - self.set_title(self._pages[self._page_index].get_page_title()) - - if self._page_index == len(self._pages) - 1: - self.set_can_next(False) - self.set_hide_next(True) - else: - self.set_can_next(True) - self.set_hide_next(False) - - if self._page_index == 0: - self.set_can_prev(False) - self.set_hide_prev(True) - else: - self.set_can_prev(True) - self.set_hide_prev(False) - - self._pages[self._page_index].load_page() - - pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale(self._pages[self._page_index].get_page_icon(), 50, 50, False) + self.set_title(self.current_page().get_page_title()) + self.set_button_action_visibility(MainWindowButton.NEXT, self._page_index != len(self._pages) - 1) + self.set_button_action_visibility(MainWindowButton.PREV, self._page_index != 0) + self.set_button_visibility(MainWindowButton.NEXT, self._page_index == len(self._pages) - 1) + self.set_button_visibility(MainWindowButton.PREV, self._page_index == 0) + + self.current_page().load_page() + # Update the current page icon + pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale(self.current_page().get_page_icon(), 50, 50, False) self._component.get_component('main_window_top_left_logo').set_from_pixbuf(pixbuf) + + # Update the current highlight page label for label in self._component.get_component('main_window_left_list_text_box').get_children(): - if label.get_page_id() == self._pages[self._page_index].get_page_id(): + if label.get_page_id() == self.current_page().get_page_id(): label.get_style_context().remove_class('dim-label') else: label.get_style_context().add_class('dim-label') self._component.get_component('main_window_right_stack').set_visible_child_name( - self._pages[self._page_index].get_page_id()) - - def set_can_prev(self, can_prev: bool) -> None: - if self._page_index == 0: - can_prev = False - self._component.get_component('main_window_prev_btn').set_sensitive(can_prev) + self.current_page().get_page_id()) - def set_can_next(self, can_next: bool) -> None: - if self._page_index == len(self._pages) - 1: - can_next = False - self._component.get_component('main_window_next_btn').set_sensitive(can_next) - - def set_hide_prev(self, hide: bool) -> None: - if hide: - self._component.get_component('main_window_prev_btn').hide() - else: - self._component.get_component('main_window_prev_btn').show_all() + def set_button_action_visibility(self, button: MainWindowButton, status: bool) -> None: + self._component.get_component(button.value).set_sensitive(status) - def set_hide_next(self, hide: bool) -> None: - if hide: - self._component.get_component('main_window_next_btn').hide() + def set_button_visibility(self, button: MainWindowButton, hidden: bool) -> None: + if hidden: + self._component.get_component(button.value).hide() else: - self._component.get_component('main_window_next_btn').show_all() + self._component.get_component(button.value).show_all() def init_background_tasks(self) -> None: for page in self._pages: @@ -205,7 +191,7 @@ def init_background_tasks(self) -> None: pass def prepare_all_long_tasks_page(self) -> bool: - self.set_can_next(False) + self.set_button_action_visibility(MainWindowButton.NEXT, False) thread = threading.Thread(target=self.init_background_tasks) thread.daemon = True thread.start() diff --git a/ui/gtk/main_window_button.py b/ui/gtk/main_window_button.py new file mode 100644 index 0000000..86526be --- /dev/null +++ b/ui/gtk/main_window_button.py @@ -0,0 +1,6 @@ +from enum import Enum + + +class MainWindowButton(Enum): + NEXT = 'main_window_next_btn' + PREV = 'main_window_prev_btn' diff --git a/ui/gtk/pages/language_live_page.py b/ui/gtk/pages/language_live_page.py index 22c1946..e308f94 100644 --- a/ui/gtk/pages/language_live_page.py +++ b/ui/gtk/pages/language_live_page.py @@ -1,4 +1,6 @@ -from gi.repository import Gtk, Gdk, GnomeDesktop +from gi.repository import Gtk, Gdk, GObject, GnomeDesktop +from ui.gtk.main_window_button import MainWindowButton +from ui.gtk.pages.page import Page import subprocess import locale @@ -7,12 +9,12 @@ class KeyboardLabel(Gtk.Label): keyboard_name = None keyboard_id = None - def __init__(self, keyboard_id, keyboard_name): + def __init__(self, keyboard_id: str, keyboard_name: str) -> None: Gtk.Label.__init__(self) self.keyboard_id = keyboard_id self.keyboard_name = keyboard_name - self.set_property("margin", 10) + self.set_property('margin', 10) self.set_halign(Gtk.Align.START) self.set_text(self.keyboard_name) self.show() @@ -22,12 +24,12 @@ class LanguageLabel(Gtk.Label): language_code = None language_name = None - def __init__(self, language_code, language_name): + def __init__(self, language_code: str, language_name: str) -> None: Gtk.Label.__init__(self) self.language_code = language_code self.language_name = language_name - self.set_property("margin", 8) + self.set_property('margin', 8) self.set_halign(Gtk.Align.START) self.set_text(self.language_name) self.show() @@ -36,27 +38,27 @@ def __init__(self, language_code, language_name): class Components(): _components = {} - def __init__(self): - self._components["general_box"] = Gtk.Box(self, orientation=Gtk.Orientation.VERTICAL, spacing=0) - self._components["general_grid"] = Gtk.Grid() - self._components["language_window_scroll"] = Gtk.ScrolledWindow(None, None) - self._components["keyboard_window_scroll"] = Gtk.ScrolledWindow(None, None) - self._components["language_window_listbox"] = Gtk.ListBox() - self._components["keyboard_window_listbox"] = Gtk.ListBox() - self._components["language_window_more_btn"] = Gtk.Image.new_from_icon_name("view-more-symbolic", + def __init__(self) -> None: + self._components['general_box'] = Gtk.Box(self, orientation=Gtk.Orientation.VERTICAL, spacing=0) + self._components['general_grid'] = Gtk.Grid() + self._components['language_window_scroll'] = Gtk.ScrolledWindow(None, None) + self._components['keyboard_window_scroll'] = Gtk.ScrolledWindow(None, None) + self._components['language_window_listbox'] = Gtk.ListBox() + self._components['keyboard_window_listbox'] = Gtk.ListBox() + self._components['language_window_more_btn'] = Gtk.Image.new_from_icon_name('view-more-symbolic', Gtk.IconSize.MENU) - self._components["keyboard_window_more_btn"] = Gtk.Image.new_from_icon_name("view-more-symbolic", + self._components['keyboard_window_more_btn'] = Gtk.Image.new_from_icon_name('view-more-symbolic', Gtk.IconSize.MENU) - self._components["language_window_label"] = Gtk.Label() - self._components["keyboard_window_label"] = Gtk.Label() - self._components["keyboard_window_grid"] = Gtk.Grid() - self._components["keyboard_window_input"] = Gtk.Entry() + self._components['language_window_label'] = Gtk.Label() + self._components['keyboard_window_label'] = Gtk.Label() + self._components['keyboard_window_grid'] = Gtk.Grid() + self._components['keyboard_window_input'] = Gtk.Entry() - def get_component(self, component_name): + def get_component(self, component_name: str) -> GObject: return self._components[component_name] -class LanguageLivePage(): +class LanguageLivePage(Page): _components = None _win_parent = None @@ -65,105 +67,106 @@ class LanguageLivePage(): nb_default_languages = 2 nb_default_keyboard = 7 - def __init__(self, locale_general, config_general): + def __init__(self, locale_general: dict, config_general: dict) -> None: + super(LanguageLivePage, self).__init__() self._locale_general = locale_general self._config_general = config_general - self._config_general["language_live_page"] = {} - self._config_general["language_live_page"]["locale"] = self._locale_general.current_language - self._config_general["language_live_page"]["language_next"] = False - self._config_general["language_live_page"]["keyboard_next"] = False + self._config_general['language_live_page'] = {} + self._config_general['language_live_page']['locale'] = self._locale_general.current_language + self._config_general['language_live_page']['language_next'] = False + self._config_general['language_live_page']['keyboard_next'] = False self._components = Components() self.init_components() self.refresh_ui_language() - def init_components(self): + def init_components(self) -> None: # General grid - self._components.get_component("general_box").pack_start(self._components.get_component("general_grid"), True, + self._components.get_component('general_box').pack_start(self._components.get_component('general_grid'), True, True, 0) - self._components.get_component("general_grid").set_margin_start(10) - self._components.get_component("general_grid").set_margin_end(10) - self._components.get_component("general_grid").set_margin_top(10) - self._components.get_component("general_grid").set_margin_bottom(10) - self._components.get_component("general_grid").set_column_spacing(50) - self._components.get_component("general_grid").set_row_spacing(5) - self._components.get_component("general_grid").set_halign(Gtk.Align.START) + self._components.get_component('general_grid').set_margin_start(10) + self._components.get_component('general_grid').set_margin_end(10) + self._components.get_component('general_grid').set_margin_top(10) + self._components.get_component('general_grid').set_margin_bottom(10) + self._components.get_component('general_grid').set_column_spacing(50) + self._components.get_component('general_grid').set_row_spacing(5) + self._components.get_component('general_grid').set_halign(Gtk.Align.START) # Language box - self._components.get_component("language_window_scroll").set_shadow_type(Gtk.ShadowType.ETCHED_IN) - self._components.get_component("language_window_scroll").add( - self._components.get_component("language_window_listbox")) + self._components.get_component('language_window_scroll').set_shadow_type(Gtk.ShadowType.ETCHED_IN) + self._components.get_component('language_window_scroll').add( + self._components.get_component('language_window_listbox')) - self._components.get_component("language_window_scroll").set_halign(Gtk.Align.CENTER) - self._components.get_component("language_window_listbox").set_size_request(60, -1) + self._components.get_component('language_window_scroll').set_halign(Gtk.Align.CENTER) + self._components.get_component('language_window_listbox').set_size_request(60, -1) - self._components.get_component("language_window_scroll").set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.NEVER) - self._components.get_component("language_window_more_btn").set_property("margin", 8) - self._components.get_component("language_window_more_btn").show_all() - self._components.get_component("language_window_listbox").connect_after("row-selected", self.on_row_click_language) + self._components.get_component('language_window_scroll').set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.NEVER) + self._components.get_component('language_window_more_btn').set_property('margin', 8) + self._components.get_component('language_window_more_btn').show_all() + self._components.get_component('language_window_listbox').connect_after('row-selected', self.on_row_click_language) # Title for box - self._components.get_component("language_window_label").set_halign(Gtk.Align.START) - self._components.get_component("language_window_label").set_line_wrap(True) + self._components.get_component('language_window_label').set_halign(Gtk.Align.START) + self._components.get_component('language_window_label').set_line_wrap(True) - self._components.get_component("keyboard_window_label").set_halign(Gtk.Align.START) - self._components.get_component("keyboard_window_label").set_line_wrap(True) + self._components.get_component('keyboard_window_label').set_halign(Gtk.Align.START) + self._components.get_component('keyboard_window_label').set_line_wrap(True) # Keyboard box - self._components.get_component("keyboard_window_grid").set_row_spacing(6) - self._components.get_component("keyboard_window_grid").set_halign(Gtk.Align.CENTER) + self._components.get_component('keyboard_window_grid').set_row_spacing(6) + self._components.get_component('keyboard_window_grid').set_halign(Gtk.Align.CENTER) - self._components.get_component("keyboard_window_listbox").set_size_request(60, -1) + self._components.get_component('keyboard_window_listbox').set_size_request(60, -1) - self._components.get_component("keyboard_window_scroll").set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) - self._components.get_component("keyboard_window_scroll").add( - self._components.get_component("keyboard_window_listbox")) - self._components.get_component("keyboard_window_scroll").set_shadow_type(Gtk.ShadowType.ETCHED_IN) - self._components.get_component("keyboard_window_scroll").set_vexpand(True) - self._components.get_component("keyboard_window_grid").attach( - self._components.get_component("keyboard_window_scroll"), 0, 0, 2, 1) + self._components.get_component('keyboard_window_scroll').set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) + self._components.get_component('keyboard_window_scroll').add( + self._components.get_component('keyboard_window_listbox')) + self._components.get_component('keyboard_window_scroll').set_shadow_type(Gtk.ShadowType.ETCHED_IN) + self._components.get_component('keyboard_window_scroll').set_vexpand(True) + self._components.get_component('keyboard_window_grid').attach( + self._components.get_component('keyboard_window_scroll'), 0, 0, 2, 1) # Input tester - self._components.get_component("keyboard_window_grid").attach(self._components.get_component("keyboard_window_input"), + self._components.get_component('keyboard_window_grid').attach(self._components.get_component('keyboard_window_input'), 0, 1, 2, 1) - self._components.get_component("keyboard_window_more_btn").set_property("margin", 8) - self._components.get_component("keyboard_window_listbox").connect_after("row-selected", self.on_row_click_keyboard) + self._components.get_component('keyboard_window_more_btn').set_property('margin', 8) + self._components.get_component('keyboard_window_listbox').connect_after('row-selected', self.on_row_click_keyboard) # Attach general grid - self._components.get_component("general_grid").attach(self._components.get_component("language_window_scroll"), 0, + self._components.get_component('general_grid').attach(self._components.get_component('language_window_scroll'), 0, 1, 1, 1) - self._components.get_component("general_grid").attach(self._components.get_component("language_window_label"), 0, + self._components.get_component('general_grid').attach(self._components.get_component('language_window_label'), 0, 0, 1, 1) - self._components.get_component("general_grid").attach(self._components.get_component("keyboard_window_label"), 1, + self._components.get_component('general_grid').attach(self._components.get_component('keyboard_window_label'), 1, 0, 1, 1) - self._components.get_component("general_grid").attach(self._components.get_component("keyboard_window_grid"), 1, 1, + self._components.get_component('general_grid').attach(self._components.get_component('keyboard_window_grid'), 1, 1, 1, 1) - def on_row_click_language(self, list_box_language, current_row_language_clicked=None): + def on_row_click_language(self, list_box_language, current_row_language_clicked=None) -> None: if not current_row_language_clicked: - self._config_general["language_live_page"]["locale"] = None - self._config_general["language_live_page"]["locale_sz"] = None - self._config_general["language_live_page"]["language_next"] = False - self._win_parent.set_can_next(False) + self._config_general['language_live_page']['locale'] = None + self._config_general['language_live_page']['locale_sz'] = None + self._config_general['language_live_page']['language_next'] = False + self._win_parent.set_button_action_visibility(MainWindowButton.NEXT, False) return row_elem = current_row_language_clicked.get_child() - if row_elem != self._components.get_component("language_window_more_btn"): - self._config_general["language_live_page"]["locale"] = row_elem.language_code - self._config_general["language_live_page"]["locale_sz"] = row_elem.language_name + if row_elem != self._components.get_component('language_window_more_btn'): + self._config_general['language_live_page']['locale'] = row_elem.language_code + self._config_general['language_live_page']['locale_sz'] = row_elem.language_name - self._locale_general.change_language_all_files(self._config_general["language_live_page"]["locale"]) + self._locale_general.change_language_all_files(self._config_general['language_live_page']['locale']) self._win_parent.load_lang() - self._config_general["language_live_page"]["language_next"] = True - if self._config_general["language_live_page"]["language_next"] and \ - self._config_general["language_live_page"]["keyboard_next"]: - self._win_parent.set_can_next(True) + self._config_general['language_live_page']['language_next'] = True + if self._config_general['language_live_page']['language_next'] and \ + self._config_general['language_live_page']['keyboard_next']: + self._win_parent.set_button_action_visibility(MainWindowButton.NEXT, True) return - self._components.get_component("language_window_scroll").set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) - self._components.get_component("language_window_scroll").set_vexpand(True) - self._components.get_component("language_window_scroll").set_valign(Gtk.Align.FILL) - self._components.get_component("language_window_more_btn").get_parent().hide() + self._components.get_component('language_window_scroll').set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) + self._components.get_component('language_window_scroll').set_vexpand(True) + self._components.get_component('language_window_scroll').set_valign(Gtk.Align.FILL) + self._components.get_component('language_window_more_btn').get_parent().hide() languages = self._locale_general.available_languages languages_keys = list(languages)[0:self.nb_default_languages] languages_extra = list() @@ -171,34 +174,34 @@ def on_row_click_language(self, list_box_language, current_row_language_clicked= if key in languages_keys: continue languages_extra.append( - LanguageLabel(key, self._locale_general.translate_msg("language_live_page", languages[key]))) + LanguageLabel(key, self._locale_general.translate_msg('language_live_page', languages[key]))) languages_extra.sort(key=lambda sort: sort.language_name.lower()) for current in languages_extra: - self._components.get_component("language_window_listbox").add(current) + self._components.get_component('language_window_listbox').add(current) self.set_selected_language_row() - def on_row_click_keyboard(self, list_box_keyboard, current_row_keyboard_clicked=None): + def on_row_click_keyboard(self, list_box_keyboard, current_row_keyboard_clicked=None) -> None: if not current_row_keyboard_clicked: - self._config_general["language_live_page"]["keyboard"] = None - self._config_general["language_live_page"]["keyboard_sz"] = None - self._config_general["language_live_page"]["keyboard_next"] = False - self._win_parent.set_can_next(False) + self._config_general['language_live_page']['keyboard'] = None + self._config_general['language_live_page']['keyboard_sz'] = None + self._config_general['language_live_page']['keyboard_next'] = False + self._win_parent.set_button_action_visibility(MainWindowButton.NEXT, False) return row_elem = current_row_keyboard_clicked.get_child() - if row_elem != self._components.get_component("keyboard_window_more_btn"): - self._config_general["language_live_page"]["keyboard"] = row_elem.keyboard_id - self._config_general["language_live_page"]["keyboard_sz"] = row_elem.keyboard_name + if row_elem != self._components.get_component('keyboard_window_more_btn'): + self._config_general['language_live_page']['keyboard'] = row_elem.keyboard_id + self._config_general['language_live_page']['keyboard_sz'] = row_elem.keyboard_name self.set_keyboard() - self._config_general["language_live_page"]["keyboard_next"] = True - if self._config_general["language_live_page"]["language_next"] and \ - self._config_general["language_live_page"]["keyboard_next"]: - self._win_parent.set_can_next(True) - self._components.get_component("keyboard_window_input").set_text("") + self._config_general['language_live_page']['keyboard_next'] = True + if self._config_general['language_live_page']['language_next'] and \ + self._config_general['language_live_page']['keyboard_next']: + self._win_parent.set_button_action_visibility(MainWindowButton.NEXT, True) + self._components.get_component('keyboard_window_input').set_text('') return - self._components.get_component("keyboard_window_more_btn").get_parent().hide() + self._components.get_component('keyboard_window_more_btn').get_parent().hide() keyboard_info = GnomeDesktop.XkbInfo() all_keyboard_code_info = keyboard_info.get_all_layouts() @@ -218,16 +221,16 @@ def on_row_click_keyboard(self, list_box_keyboard, current_row_keyboard_clicked= all_expand_languages.sort(key=lambda sort: sort.keyboard_name.lower()) for current in all_expand_languages: if not current.keyboard_id in self.keyboard_already_showed: - self._components.get_component("keyboard_window_listbox").add(current) + self._components.get_component('keyboard_window_listbox').add(current) self.set_selected_keyboard_row() - def init_view_keyboard(self): + def init_view_keyboard(self) -> None: keyboard_info = GnomeDesktop.XkbInfo() country = self._locale_general.get_detailed_locale_country( - self._config_general["language_live_page"]["locale"]) + self._config_general['language_live_page']['locale']) country_lower = country.lower() input_locale = GnomeDesktop.get_input_source_from_locale( - self._locale_general.get_detailed_locale(self._config_general["language_live_page"]["locale"])) + self._locale_general.get_detailed_locale(self._config_general['language_live_page']['locale'])) keyboard_depending_language = list([input_locale.id]) keyboard_depending_language_after = list() @@ -257,49 +260,49 @@ def init_view_keyboard(self): self.country_depending_keyboard.append(current) continue self.keyboard_already_showed.add(current.keyboard_id) - self._components.get_component("keyboard_window_listbox").add(current) + self._components.get_component('keyboard_window_listbox').add(current) - self._components.get_component("keyboard_window_more_btn").show_all() - self._components.get_component("keyboard_window_listbox").add( - self._components.get_component("keyboard_window_more_btn")) + self._components.get_component('keyboard_window_more_btn').show_all() + self._components.get_component('keyboard_window_listbox').add( + self._components.get_component('keyboard_window_more_btn')) self.set_selected_keyboard_row() - def set_keyboard(self): - if "keyboard" in self._config_general["language_live_page"]\ - and self._config_general["language_live_page"]["keyboard"] != None: + def set_keyboard(self) -> None: + if 'keyboard' in self._config_general['language_live_page']\ + and self._config_general['language_live_page']['keyboard'] != None: try: - subprocess.check_call("setxkbmap {}".format(self._config_general["language_live_page"]["keyboard"]), + subprocess.check_call("setxkbmap {}".format(self._config_general['language_live_page']['keyboard']), shell=True) except Exception as e: pass - def set_system_language(self): - if "locale" in self._config_general["language_live_page"]\ - and self._config_general["language_live_page"]["locale"]\ + def set_system_language(self) -> None: + if 'locale' in self._config_general['language_live_page']\ + and self._config_general['language_live_page']['locale']\ in self._locale_general.available_languages: locale_detailed = self._locale_general.get_detailed_locale( - self._config_general["language_live_page"]["locale"]) + self._config_general['language_live_page']['locale']) locale.setlocale(locale.LC_ALL, locale_detailed) - def set_selected_language_row(self): - check_not_empty = self._components.get_component("language_window_listbox").get_children() + def set_selected_language_row(self) -> None: + check_not_empty = self._components.get_component('language_window_listbox').get_children() if not check_not_empty: return - for current in self._components.get_component("language_window_listbox").get_children(): + for current in self._components.get_component('language_window_listbox').get_children(): label = current.get_child() - if label != self._components.get_component("language_window_more_btn")\ - and "locale" in self._config_general["language_live_page"]\ - and label.language_code == self._config_general["language_live_page"]["locale"]: - self._components.get_component("language_window_listbox").select_row(current) + if label != self._components.get_component('language_window_more_btn')\ + and 'locale' in self._config_general['language_live_page']\ + and label.language_code == self._config_general['language_live_page']['locale']: + self._components.get_component('language_window_listbox').select_row(current) return - def set_selected_keyboard_row(self): - check_not_empty = self._components.get_component("keyboard_window_listbox").get_children() + def set_selected_keyboard_row(self) -> None: + check_not_empty = self._components.get_component('keyboard_window_listbox').get_children() if not check_not_empty: return - selected_row = self._components.get_component("keyboard_window_listbox").get_children()[0] - self._components.get_component("keyboard_window_listbox").select_row(selected_row) + selected_row = self._components.get_component('keyboard_window_listbox').get_children()[0] + self._components.get_component('keyboard_window_listbox').select_row(selected_row) def long_task(self): Gdk.threads_enter() @@ -308,68 +311,65 @@ def long_task(self): languages_label = list() for key in languages_keys: languages_label.append( - LanguageLabel(key, self._locale_general.translate_msg("language_live_page", languages[key]))) + LanguageLabel(key, self._locale_general.translate_msg('language_live_page', languages[key]))) languages_label.sort(key=lambda sort: sort.language_name.lower()) for current in languages_label: - self._components.get_component("language_window_listbox").add(current) + self._components.get_component('language_window_listbox').add(current) - self._components.get_component("language_window_listbox").add( - self._components.get_component("language_window_more_btn")) + self._components.get_component('language_window_listbox').add( + self._components.get_component('language_window_more_btn')) self.set_selected_language_row() self.init_view_keyboard() Gdk.threads_leave() - def load_win(self, win): + def load_win(self, win) -> None: self._win_parent = win - def load_page(self): + def load_page(self) -> None: self.set_system_language() self.set_keyboard() self.set_selected_language_row() self.set_selected_keyboard_row() - if "locale" in self._config_general["language_live_page"]\ - and "keyboard" in self._config_general["language_live_page"]: - self._win_parent.set_can_next(True) - else: - self._win_parent.set_can_next(False) + self._win_parent.set_button_action_visibility(MainWindowButton.NEXT, 'locale' in self._config_general['language_live_page']\ + and 'keyboard' in self._config_general['language_live_page']) - def refresh_ui_language(self): - self._components.get_component("language_window_label").set_markup(u"{}".format( - self._locale_general.translate_msg("language_live_page", "desc_language"))) - self._components.get_component("keyboard_window_label").set_markup(u"{}".format( - self._locale_general.translate_msg("language_live_page", "desc_keyboard"))) - self._components.get_component("keyboard_window_input").set_placeholder_text( - self._locale_general.translate_msg("language_live_page", "input_keyboard")) + def refresh_ui_language(self) -> None: + self._components.get_component('language_window_label').set_markup(u'{}'.format( + self._locale_general.translate_msg('language_live_page', 'desc_language'))) + self._components.get_component('keyboard_window_label').set_markup(u'{}'.format( + self._locale_general.translate_msg('language_live_page', 'desc_keyboard'))) + self._components.get_component('keyboard_window_input').set_placeholder_text( + self._locale_general.translate_msg('language_live_page', 'input_keyboard')) self.set_system_language() languages = self._locale_general.available_languages keyboard_info = GnomeDesktop.XkbInfo() - for current_row in self._components.get_component("language_window_listbox").get_children(): + for current_row in self._components.get_component('language_window_listbox').get_children(): label = current_row.get_child() - if label != self._components.get_component("language_window_more_btn"): - label.language_name = self._locale_general.translate_msg("language_live_page", + if label != self._components.get_component('language_window_more_btn'): + label.language_name = self._locale_general.translate_msg('language_live_page', languages[label.language_code]) label.set_text(label.language_name) - for current_row in self._components.get_component("keyboard_window_listbox").get_children(): + for current_row in self._components.get_component('keyboard_window_listbox').get_children(): label = current_row.get_child() - if label != self._components.get_component("keyboard_window_more_btn"): + if label != self._components.get_component('keyboard_window_more_btn'): info = keyboard_info.get_layout_info(label.keyboard_id) label.keyboard_name = info.display_name label.set_text(label.keyboard_name) - def get_page_title(self): - return self._locale_general.translate_msg("language_live_page", "title") + def get_page_title(self) -> str: + return self._locale_general.translate_msg('language_live_page', 'title') - def get_page_sidebar_title(self): - return self._locale_general.translate_msg("language_live_page", "sidebar_title") + def get_page_sidebar_title(self) -> str: + return self._locale_general.translate_msg('language_live_page', 'sidebar_title') - def get_page_id(self): - return self._config_general["config_page"]["language_live"]["id"] + def get_page_id(self) -> str: + return self._config_general['config_page']['language_live']['id'] - def get_page_icon(self): - return self._config_general["config_page"]["language_live"]["icon"] + def get_page_icon(self) -> str: + return self._config_general['config_page']['language_live']['icon'] diff --git a/ui/gtk/pages/page.py b/ui/gtk/pages/page.py new file mode 100644 index 0000000..b30c4f4 --- /dev/null +++ b/ui/gtk/pages/page.py @@ -0,0 +1,27 @@ +class Page: + def __init__(self) -> None: + pass + + def load_page(self) -> None: + pass + + def load_win(self, win): + pass + + def long_task(self) -> None: + pass + + def refresh_ui_language(self) -> None: + pass + + def get_page_title(self) -> str: + pass + + def get_page_sidebar_title(self) -> str: + pass + + def get_page_id(self) -> str: + pass + + def get_page_icon(self) -> str: + pass \ No newline at end of file From 63e0bc8ca3c88aee808bf74c96e78b2c6fc4cdb6 Mon Sep 17 00:00:00 2001 From: corentin desayes Date: Mon, 11 Nov 2019 20:24:33 +0100 Subject: [PATCH 3/4] Update text file and refacto (#9) * Add first features for read disk * delete some unused files, add message when no ui is found, change the README * delete some unused files, add message when no ui is found, change the README * add type hint * remove dependency_injector * add first page language live * remove services * add enum for the next and back button * update .po From 1f1c215517676ac08597bb0ef2017e587b1b2eea Mon Sep 17 00:00:00 2001 From: corentin desayes Date: Sat, 16 Nov 2019 22:46:47 +0100 Subject: [PATCH 4/4] Update text file and refacto (#10) * Add first features for read disk * delete some unused files, add message when no ui is found, change the README * delete some unused files, add message when no ui is found, change the README * add type hint * remove dependency_injector * add first page language live * remove services * add enum for the next and back button * update .po