Add language selection to settings dialog
This commit is contained in:
parent
177605d9bf
commit
60d102eb8d
|
@ -18,34 +18,39 @@
|
|||
|
||||
import gi
|
||||
gi.require_version('Gtk', '3.0')
|
||||
from gi.repository import Gtk, Gdk, GdkX11
|
||||
from gi.repository import Gtk, Gdk, GdkX11, GObject
|
||||
|
||||
class SettingsDialog:
|
||||
"""docstring for SettingsDialog"""
|
||||
def __init__(self, config, language, on_save_settings, glade_file):
|
||||
"""
|
||||
Create and initialize SettingsDialog instance.
|
||||
"""
|
||||
def __init__(self, config, language, languages, on_save_settings, glade_file):
|
||||
self.config = config
|
||||
self.on_save_settings = on_save_settings
|
||||
self.languages = []
|
||||
|
||||
builder = Gtk.Builder()
|
||||
builder.add_from_file(glade_file)
|
||||
builder.connect_signals(self)
|
||||
|
||||
self.window = builder.get_object("window_settings")
|
||||
self.spin_short_break_duration = builder.get_object("spin_short_break_duration")
|
||||
self.spin_long_break_duration = builder.get_object("spin_long_break_duration")
|
||||
self.spin_interval_between_two_breaks = builder.get_object("spin_interval_between_two_breaks")
|
||||
self.spin_short_between_long = builder.get_object("spin_short_between_long")
|
||||
self.spin_time_to_prepare = builder.get_object("spin_time_to_prepare")
|
||||
self.switch_strict_break = builder.get_object("switch_strict_break")
|
||||
self.window = builder.get_object('window_settings')
|
||||
self.spin_short_break_duration = builder.get_object('spin_short_break_duration')
|
||||
self.spin_long_break_duration = builder.get_object('spin_long_break_duration')
|
||||
self.spin_interval_between_two_breaks = builder.get_object('spin_interval_between_two_breaks')
|
||||
self.spin_short_between_long = builder.get_object('spin_short_between_long')
|
||||
self.spin_time_to_prepare = builder.get_object('spin_time_to_prepare')
|
||||
self.switch_strict_break = builder.get_object('switch_strict_break')
|
||||
self.cmb_language = builder.get_object('cmb_language')
|
||||
|
||||
builder.get_object("lbl_short_break").set_label(language['ui_controls']['short_break_duration'])
|
||||
builder.get_object("lbl_long_break").set_label(language['ui_controls']['long_break_duration'])
|
||||
builder.get_object("lbl_interval_bettween_breaks").set_label(language['ui_controls']['interval_between_two_breaks'])
|
||||
builder.get_object("lbl_short_per_long").set_label(language['ui_controls']['no_of_short_breaks_between_two_long_breaks'])
|
||||
builder.get_object("lbl_time_to_prepare").set_label(language['ui_controls']['time_to_prepare_for_break'])
|
||||
builder.get_object("lbl_strict_break").set_label(language['ui_controls']['strict_break'])
|
||||
builder.get_object("btn_cancel").set_label(language['ui_controls']['cancel'])
|
||||
builder.get_object("btn_save").set_label(language['ui_controls']['save'])
|
||||
builder.get_object('lbl_short_break').set_label(language['ui_controls']['short_break_duration'])
|
||||
builder.get_object('lbl_long_break').set_label(language['ui_controls']['long_break_duration'])
|
||||
builder.get_object('lbl_interval_bettween_breaks').set_label(language['ui_controls']['interval_between_two_breaks'])
|
||||
builder.get_object('lbl_short_per_long').set_label(language['ui_controls']['no_of_short_breaks_between_two_long_breaks'])
|
||||
builder.get_object('lbl_time_to_prepare').set_label(language['ui_controls']['time_to_prepare_for_break'])
|
||||
builder.get_object('lbl_strict_break').set_label(language['ui_controls']['strict_break'])
|
||||
builder.get_object('lbl_language').set_label(language['ui_controls']['language'])
|
||||
builder.get_object('btn_cancel').set_label(language['ui_controls']['cancel'])
|
||||
builder.get_object('btn_save').set_label(language['ui_controls']['save'])
|
||||
|
||||
self.spin_short_break_duration.set_value(config['short_break_duration'])
|
||||
self.spin_long_break_duration.set_value(config['long_break_duration'])
|
||||
|
@ -54,7 +59,24 @@ class SettingsDialog:
|
|||
self.spin_time_to_prepare.set_value(config['pre_break_warning_time'])
|
||||
self.switch_strict_break.set_active(config['strict_break'])
|
||||
|
||||
# Initialize the language combobox
|
||||
language_list_store = Gtk.ListStore(GObject.TYPE_STRING)
|
||||
language_index = 0
|
||||
for key in sorted(languages.keys()):
|
||||
language_list_store.append([languages[key]])
|
||||
self.languages.append(key)
|
||||
if key == config['language']:
|
||||
self.cmb_language.set_active(language_index)
|
||||
language_index += 1
|
||||
|
||||
self.cmb_language.set_model(language_list_store)
|
||||
cell = Gtk.CellRendererText()
|
||||
self.cmb_language.pack_start(cell, True)
|
||||
self.cmb_language.add_attribute(cell, 'text', 0)
|
||||
|
||||
"""
|
||||
Show the SettingsDialog.
|
||||
"""
|
||||
def show(self):
|
||||
self.window.show_all()
|
||||
|
||||
|
@ -68,6 +90,7 @@ class SettingsDialog:
|
|||
self.config['no_of_short_breaks_per_long_break'] = self.spin_short_between_long.get_value_as_int()
|
||||
self.config['pre_break_warning_time'] = self.spin_time_to_prepare.get_value_as_int()
|
||||
self.config['strict_break'] = self.switch_strict_break.get_active()
|
||||
self.config['language'] = self.languages[self.cmb_language.get_active()]
|
||||
|
||||
self.on_save_settings(self.config) # Call the provided save method
|
||||
self.window.destroy() # Close the settings window
|
||||
|
|
|
@ -36,6 +36,7 @@ class TrayIcon:
|
|||
self.on_enable = on_enable
|
||||
self.on_disable = on_disable
|
||||
self.language = language
|
||||
self.dateTime = None
|
||||
|
||||
# Construct the tray icon
|
||||
self.indicator = appindicator.Indicator.new(APPINDICATOR_ID, "safeeyes_enabled", appindicator.IndicatorCategory.APPLICATION_STATUS)
|
||||
|
@ -44,37 +45,57 @@ class TrayIcon:
|
|||
# Construct the context menu
|
||||
self.menu = Gtk.Menu()
|
||||
|
||||
|
||||
self.item_info = Gtk.ImageMenuItem('Next break at 10.30 AM')
|
||||
# Next break info menu item
|
||||
self.item_info = Gtk.ImageMenuItem()
|
||||
img_timer = Gtk.Image()
|
||||
img_timer.set_from_icon_name("safeeyes_timer", 16)
|
||||
self.item_info.set_image(img_timer)
|
||||
|
||||
self.item_separator = Gtk.SeparatorMenuItem()
|
||||
|
||||
self.item_enable = Gtk.CheckMenuItem(self.language['ui_controls']['enable'])
|
||||
# Enable menu item with check box
|
||||
self.item_enable = Gtk.CheckMenuItem()
|
||||
self.item_enable.set_active(True)
|
||||
self.item_enable.connect('activate', self.on_toogle_enable)
|
||||
|
||||
item_settings = Gtk.MenuItem(self.language['ui_controls']['settings'])
|
||||
item_settings.connect('activate', self.show_settings)
|
||||
# Settings menu item
|
||||
self.item_settings = Gtk.MenuItem()
|
||||
self.item_settings.connect('activate', self.show_settings)
|
||||
|
||||
item_about = Gtk.MenuItem(self.language['ui_controls']['about'])
|
||||
item_about.connect('activate', self.show_about)
|
||||
# About menu item
|
||||
self.item_about = Gtk.MenuItem()
|
||||
self.item_about.connect('activate', self.show_about)
|
||||
|
||||
item_quit = Gtk.MenuItem(self.language['ui_controls']['quit'])
|
||||
item_quit.connect('activate', self.quit_safe_eyes)
|
||||
# Quit menu item
|
||||
self.item_quit = Gtk.MenuItem()
|
||||
self.item_quit.connect('activate', self.quit_safe_eyes)
|
||||
|
||||
self.set_labels(language)
|
||||
|
||||
# Append all menu items and show the menu
|
||||
self.menu.append(self.item_info)
|
||||
self.menu.append(self.item_separator)
|
||||
self.menu.append(self.item_enable)
|
||||
self.menu.append(item_settings)
|
||||
self.menu.append(item_about)
|
||||
self.menu.append(item_quit)
|
||||
self.menu.append(self.item_settings)
|
||||
self.menu.append(self.item_about)
|
||||
self.menu.append(self.item_quit)
|
||||
self.menu.show_all()
|
||||
|
||||
self.indicator.set_menu(self.menu)
|
||||
|
||||
def set_labels(self, language):
|
||||
self.language = language
|
||||
active = self.item_enable.get_active()
|
||||
if active:
|
||||
if self.dateTime:
|
||||
self.set_next_break_info(self.dateTime)
|
||||
else:
|
||||
self.item_info.set_label(self.language['messages']['safe_eyes_is_disabled'])
|
||||
self.item_enable.set_label(self.language['ui_controls']['enable'])
|
||||
self.item_settings.set_label(self.language['ui_controls']['settings'])
|
||||
self.item_about.set_label(self.language['ui_controls']['about'])
|
||||
self.item_quit.set_label(self.language['ui_controls']['quit'])
|
||||
|
||||
def show_icon(self):
|
||||
GLib.idle_add(lambda: self.indicator.set_status(appindicator.IndicatorStatus.ACTIVE))
|
||||
|
||||
|
@ -92,13 +113,17 @@ class TrayIcon:
|
|||
|
||||
def next_break_time(self, dateTime):
|
||||
logging.info("Update next break information")
|
||||
timeStr = dateTime.strftime("%l:%M")
|
||||
self.dateTime = dateTime
|
||||
self.set_next_break_info(self.dateTime)
|
||||
|
||||
def set_next_break_info(self, dateTime):
|
||||
formatted_time = dateTime.strftime("%l:%M")
|
||||
if dateTime.hour == 12:
|
||||
message = self.language['messages']['next_break_at_noon'].format(timeStr)
|
||||
message = self.language['messages']['next_break_at_noon'].format(formatted_time)
|
||||
elif dateTime.hour < 12:
|
||||
message = self.language['messages']['next_break_at_am'].format(timeStr)
|
||||
message = self.language['messages']['next_break_at_am'].format(formatted_time)
|
||||
else:
|
||||
message = self.language['messages']['next_break_at_pm'].format(timeStr)
|
||||
message = self.language['messages']['next_break_at_pm'].format(formatted_time)
|
||||
|
||||
GLib.idle_add(lambda: self.item_info.set_label(message))
|
||||
|
||||
|
|
|
@ -32,9 +32,10 @@
|
|||
"no_of_short_breaks_between_two_long_breaks": "Počet krátkých přestávek mezi dvěma dlouhými přestávkami",
|
||||
"time_to_prepare_for_break": "Čas k přípravě na přestávku (v sekundách)",
|
||||
"strict_break": "Povinná přestávka (Skryj tlačítko přeskočení)",
|
||||
"language": "Jazyk",
|
||||
"enable": "Povol Safe Eyes",
|
||||
"settings": "Nastavení",
|
||||
"about": "O",
|
||||
"about": "Asi",
|
||||
"quit": "Ukončit",
|
||||
"save": "Uložit",
|
||||
"cancel": "Zrušit"
|
||||
|
|
|
@ -32,6 +32,7 @@
|
|||
"no_of_short_breaks_between_two_long_breaks": "Number of short breaks between two long breaks",
|
||||
"time_to_prepare_for_break": "Time to prepare for break (in seconds)",
|
||||
"strict_break": "Strict break (Hide skip button)",
|
||||
"language": "Language",
|
||||
"enable": "Enable Safe Eyes",
|
||||
"settings": "Settings",
|
||||
"about": "About",
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
"ready_for_a_break": "Tervezett szünet {} másodperc múlva!",
|
||||
"safe_eyes_is_disabled": "Safe Eyes kikapcsolva",
|
||||
"next_break_at_noon": "A következő szünet {}",
|
||||
"next_break_at_am": A következő szünet de. {}",
|
||||
"next_break_at_am": "A következő szünet de. {}",
|
||||
"next_break_at_pm": "A következő szünet du. {}"
|
||||
},
|
||||
"ui_controls": {
|
||||
|
@ -31,6 +31,7 @@
|
|||
"no_of_short_breaks_between_two_long_breaks": "Hány rövid szünet legyen a hosszabbak között?",
|
||||
"time_to_prepare_for_break": "Szünet előtti figyelmeztetés (másodperc)",
|
||||
"strict_break": "Kötelezők a szünetek? (nincs átugrás gomb)",
|
||||
"language": "Nyelv",
|
||||
"enable": "Safe Eyes Bekapcsolása",
|
||||
"settings": "Beállítások",
|
||||
"about": "Ról ről",
|
||||
|
|
|
@ -32,6 +32,7 @@
|
|||
"no_of_short_breaks_between_two_long_breaks": "Número de pausas curtas entre duas pausas longas",
|
||||
"time_to_prepare_for_break": "Tempo para se preparar para a pausa (em segundos)",
|
||||
"strict_break": "Pausa rigorosa (Esconder botão pular)",
|
||||
"language": "Língua",
|
||||
"enable": "Habilitar Safe Eyes",
|
||||
"settings": "Configuração",
|
||||
"about": "Sobre",
|
||||
|
|
|
@ -32,6 +32,7 @@
|
|||
"no_of_short_breaks_between_two_long_breaks": "Počet krátkych prestávok medzi dvomi dlhými prestávkami",
|
||||
"time_to_prepare_for_break": "Čas na prípravu na prestávku (v sekundách)",
|
||||
"strict_break": "Povinná prestávka (Skryje tlačitko Preskočiť)",
|
||||
"language": "Jazyk",
|
||||
"enable": "Povoliť Safe Eyes",
|
||||
"settings": "Nastavenia",
|
||||
"about": "Ohľadom",
|
||||
|
|
|
@ -37,6 +37,7 @@
|
|||
"short_break_duration": "குறுகிய கால இடைவேளை (விநாடிகளில்)",
|
||||
"skip": "தவிர்",
|
||||
"strict_break": "கட்டாய இடைவேளை (தவிர்க்கும் பொத்தான் காண்பிக்கப்பட மாட்டாது)",
|
||||
"language": "மொழி",
|
||||
"time_to_prepare_for_break": "இடைவேளைக்கு தயாராக தேவைப்படும் நேரம் (விநாடிகளில்)"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -22,9 +22,7 @@
|
|||
<interface>
|
||||
<requires lib="gtk+" version="3.10"/>
|
||||
<object class="GtkTextBuffer" id="text_buffer_license">
|
||||
<property name="text" translatable="yes">Copyright (C) 2016 Gobinath
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
<property name="text" translatable="yes">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, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
|
|
@ -264,6 +264,29 @@
|
|||
<property name="top_attach">5</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel" id="lbl_language">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="halign">start</property>
|
||||
<property name="valign">center</property>
|
||||
<property name="label" translatable="yes">Language</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="left_attach">0</property>
|
||||
<property name="top_attach">6</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkComboBox" id="cmb_language">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="left_attach">1</property>
|
||||
<property name="top_attach">6</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">True</property>
|
||||
|
|
|
@ -25,6 +25,7 @@ import shutil
|
|||
import errno
|
||||
import dbus
|
||||
import logging
|
||||
import operator
|
||||
from threading import Timer
|
||||
from dbus.mainloop.glib import DBusGMainLoop
|
||||
|
||||
|
@ -59,7 +60,7 @@ SAFE_EYES_VERSION = "1.1.1"
|
|||
"""
|
||||
def show_settings():
|
||||
logging.info("Show Settings dialog")
|
||||
settings_dialog = SettingsDialog(config, language, save_settings, settings_dialog_glade)
|
||||
settings_dialog = SettingsDialog(config, language, read_lang_files(), save_settings, settings_dialog_glade)
|
||||
settings_dialog.show()
|
||||
|
||||
"""
|
||||
|
@ -141,15 +142,28 @@ def on_skipped():
|
|||
Listen to Settings dialog Save action and write to the config file.
|
||||
"""
|
||||
def save_settings(config):
|
||||
global language
|
||||
|
||||
logging.info("Saving settings to safeeyes.json")
|
||||
|
||||
# Stop the Safe Eyes core
|
||||
if is_active:
|
||||
core.stop()
|
||||
|
||||
# Write the configuration to file
|
||||
with open(config_file_path, 'w') as config_file:
|
||||
json.dump(config, config_file, indent=4, sort_keys=True)
|
||||
|
||||
# Reload the language translation
|
||||
language_file_path = os.path.join(system_language_directory, str(config['language']) + '.json')
|
||||
with open(language_file_path) as language_file:
|
||||
language = json.load(language_file)
|
||||
|
||||
tray_icon.set_labels(language)
|
||||
|
||||
# Restart the core and intialize the components
|
||||
logging.info("Initialize SafeEyesCore with modified settings")
|
||||
|
||||
# Restart the core and intialize the components
|
||||
core.initialize(config, language)
|
||||
break_screen.initialize(config, language)
|
||||
if is_active:
|
||||
|
@ -242,6 +256,21 @@ def validate_config():
|
|||
# Create config files again
|
||||
initialize_config()
|
||||
|
||||
"""
|
||||
Read all the language translations and build a key-value mapping of language names
|
||||
in English and ISO 639-1 (Filename without extension).
|
||||
"""
|
||||
def read_lang_files():
|
||||
languages = {}
|
||||
for lang_file_name in os.listdir(system_language_directory):
|
||||
lang_file_path = os.path.join(system_language_directory, lang_file_name)
|
||||
if os.path.isfile(lang_file_path):
|
||||
with open(lang_file_path) as lang_file:
|
||||
lang = json.load(lang_file)
|
||||
languages[lang_file_name.lower().replace(".json", "")] = lang['meta_info']['language_name']
|
||||
|
||||
return languages
|
||||
|
||||
def main():
|
||||
initialize_config()
|
||||
|
||||
|
|
Loading…
Reference in New Issue