You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
jade-gui/jade_gui/functions/locale_screen.py

199 lines
7.4 KiB
Python

2 years ago
# locale_screen.py
#
# Copyright 2022 axtlos <axtlos@getcryst.al>
#
# 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 <http://www.gnu.org/licenses/>.
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(".emptyLocales { font-style: italic; font-size: 15px; }", -1)
2 years ago
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
try:
self.chosen_locales = [self.window.timezone_screen.chosen_timezone.locale]
except:
self.chosen_locales = ["en_US.UTF-8 UTF-U"]
2 years ago
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]
set_list_text(self.main_locale_list, self.chosen_locales[0])
self.update_locale_preview()
2 years ago
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