# locale_screen.py # # Copyright 2022 axtlos # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, version 3 of the License only. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . from gi.repository import Gtk, Adw from gettext import gettext as _ import time, locale from jade_gui.classes.jade_screen import JadeScreen from jade_gui.widgets.locale import LocaleEntry from jade_gui.widgets.selected_locale import SelectedLocale from jade_gui.utils.gtk_helpers import set_list_text @Gtk.Template(resource_path="/al/getcryst/jadegui/pages/locale/locale_screen.ui") class LocaleScreen(JadeScreen, Adw.Bin): __gtype_name__ = "LocaleScreen" event_controller = Gtk.EventControllerKey.new() ### Page and widgets on timezone screen locale_search_button = Gtk.Template.Child() status_page = Gtk.Template.Child() main_locale_list = Gtk.Template.Child() other_locale_list = Gtk.Template.Child() empty_locales = Gtk.Template.Child() style_provider = Gtk.CssProvider() date_preview = Gtk.Template.Child() datespreview = Gtk.Template.Child() number_preview = Gtk.Template.Child() numberpreview = Gtk.Template.Child() chosen_locales = [] other_locales = [] move_to_summary = False def __init__(self, window, locations, set_valid, application, **kwargs): super().__init__(set_valid=set_valid, **kwargs) self.window = window self.application = application self.kwargs = kwargs self.style_provider.load_from_data(b".emptyLocales { font-style: italic; font-size: 15px; }") Gtk.StyleContext.add_provider( self.empty_locales.get_style_context(), self.style_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION ) builder = Gtk.Builder.new_from_resource( "/al/getcryst/jadegui/pages/locale/locale_dialog.ui" ) self.search_dialog = builder.get_object("search_dialog") self.search_dialog.set_transient_for(self.window) self.search_dialog.set_modal(self.window) self.locale_entry_search = builder.get_object("locale_entry_search") self.locale_list = builder.get_object("locale_list") self.locale_search = builder.get_object("locale_search") self.event_controller.connect("key-released", self.search_locales) self.locale_entry_search.add_controller(self.event_controller) self.locale_list.connect("row-selected", self.select_locale) self.locale_search_button.connect("clicked", self.present_dialog) self._locale_list_length = 1 en_US = LocaleEntry( page=self, window=window, locale="en_US.UTF-8 UTF-8", button_group=None, application=application, **kwargs, ) self.locale_list.append(en_US) if(len(self.chosen_locales) <= 0): self.chosen_locales.append("en_US.UTF-8 UTF-8") set_list_text(self.main_locale_list, self.chosen_locales[0]) locales=["en_US.UTF-8 UTF-8"] # Keep a list of added locales to avoid duplicates for i in locations: for locale in i: if locale.locales not in locales: row = LocaleEntry( page=self, window=window, locale=locale.locales, button_group=en_US.main_locale_button, application=application, **kwargs, ) locales.append(locale.locales) if row.locale in self.chosen_locales[0]: row.main_locale_button.set_active(True) self.locale_list.append(row) self._locale_list_length += 1 self.update_locale_preview() def present_dialog(self, *_): self.search_dialog.present() def update_from_row(self, row): if row.main_locale_button.get_active(): set_list_text(self.main_locale_list, row.locale) for i in self.other_locales: if i.locale == row.locale: self.update_selected_locale_list(remove=i.locale, row=i) if self.other_locales == []: self.empty_locales.show() self.update_selected_locale_list(main=row.locale) else: self.empty_locales.set_visible(False) locale = SelectedLocale( page=self, window=self.window, locale=row.locale, application=self.application, **self.kwargs, ) self.update_selected_locale_list(add=row.locale, row=locale) def update_locale_preview(self): locale.setlocale(locale.LC_ALL, self.chosen_locales[0][:-6]) self.datespreview.set_label(time.strftime(locale.nl_langinfo(locale.D_T_FMT))) self.numberpreview.set_label(locale.format_string("%.2f", 1234567.89, grouping=True)+" - "+locale.currency(1234.56, grouping=True)) def update_selected_locale_list(self, add=None, remove=None, main=None, row=None): if main: self.chosen_locales[0] = main self.set_valid(True) self.update_locale_preview() if add: if add not in self.chosen_locales: self.chosen_locales.append(add) if row is not None: self.other_locales.append(row) self.other_locale_list.add_row(row) if remove: if remove != self.chosen_locales[0]: self.chosen_locales.remove(remove) if row is not None: self.other_locales.remove(row) self.other_locale_list.remove(row) if self.other_locales == []: self.empty_locales.show() else: print("Tried to remove main locale!!") return print(self.chosen_locales) def select_locale(self, widget, row): self.search_dialog.hide() self.status_page.set_description("") self.update_from_row(row) def search_locales(self, *args): terms = self.locale_entry_search.get_text() self.locale_list.set_filter_func(self.filter_locales, terms) def on_show(self): self.chosen_locales = [self.window.timezone_screen.chosen_timezone.locale] if self.chosen_locales != []: self.set_valid(True) @staticmethod def filter_locales(row, terms=None): try: text = row.get_title() text = text.lower() + row.get_subtitle().lower() if terms.lower() in text: return True except: return True return False