Files
DemonEditor/app/ui/settings_dialog.py

296 lines
15 KiB
Python
Raw Normal View History

2018-11-04 00:36:07 +03:00
from enum import Enum
from app.commons import run_task, run_idle
2018-11-08 13:07:24 +03:00
from app.connections import test_telnet, test_ftp, TestException, test_http
2019-12-13 13:31:07 +03:00
from app.settings import Profile
from .uicommons import Gtk, Gdk, UI_RESOURCES_PATH, TEXT_DOMAIN, FavClickMode
2018-01-11 17:59:59 +03:00
from .main_helper import update_entry_data
2017-10-14 13:23:34 +03:00
def show_settings_dialog(transient, options):
2017-12-30 21:51:57 +03:00
return SettingsDialog(transient, options).show()
2017-11-03 23:39:15 +03:00
2018-11-04 00:36:07 +03:00
class Property(Enum):
FTP = "ftp"
HTTP = "http"
TELNET = "telnet"
2017-11-03 23:39:15 +03:00
class SettingsDialog:
2018-05-28 18:45:31 +03:00
2019-12-13 13:31:07 +03:00
def __init__(self, transient, settings):
2019-01-12 18:10:04 +03:00
handlers = {"on_field_icon_press": self.on_field_icon_press,
2017-12-30 21:51:57 +03:00
"on_profile_changed": self.on_profile_changed,
2018-01-10 22:13:25 +03:00
"on_reset": self.on_reset,
2018-11-04 00:36:07 +03:00
"apply_settings": self.apply_settings,
"on_connection_test": self.on_connection_test,
"on_info_bar_close": self.on_info_bar_close,
"on_set_color_switch_state": self.on_set_color_switch_state,
"on_http_mode_switch_state": self.on_http_mode_switch_state,
"on_yt_dl_switch_state": self.on_yt_dl_switch_state,
"on_send_to_switch_state": self.on_send_to_switch_state}
2018-01-10 22:13:25 +03:00
2017-11-03 23:39:15 +03:00
builder = Gtk.Builder()
2018-03-02 17:06:53 +03:00
builder.set_translation_domain(TEXT_DOMAIN)
builder.add_from_file(UI_RESOURCES_PATH + "settings_dialog.glade")
2017-11-03 23:39:15 +03:00
builder.connect_signals(handlers)
2017-12-30 21:51:57 +03:00
2017-11-03 23:39:15 +03:00
self._dialog = builder.get_object("settings_dialog")
self._dialog.set_transient_for(transient)
self._header_bar = builder.get_object("header_bar")
# Network
2017-11-03 23:39:15 +03:00
self._host_field = builder.get_object("host_field")
self._port_field = builder.get_object("port_field")
self._login_field = builder.get_object("login_field")
self._password_field = builder.get_object("password_field")
2018-11-04 00:36:07 +03:00
self._http_login_field = builder.get_object("http_login_field")
self._http_password_field = builder.get_object("http_password_field")
self._http_port_field = builder.get_object("http_port_field")
2018-01-10 22:13:25 +03:00
self._telnet_login_field = builder.get_object("telnet_login_field")
self._telnet_password_field = builder.get_object("telnet_password_field")
self._telnet_port_field = builder.get_object("telnet_port_field")
self._telnet_timeout_spin_button = builder.get_object("telnet_timeout_spin_button")
self._settings_stack = builder.get_object("settings_stack")
# Paths
2017-11-03 23:39:15 +03:00
self._services_field = builder.get_object("services_field")
self._user_bouquet_field = builder.get_object("user_bouquet_field")
self._satellites_xml_field = builder.get_object("satellites_xml_field")
self._data_dir_field = builder.get_object("data_dir_field")
2018-01-10 18:09:44 +03:00
self._picons_field = builder.get_object("picons_field")
2018-01-10 12:15:41 +03:00
self._picons_dir_field = builder.get_object("picons_dir_field")
2019-01-12 18:10:04 +03:00
self._backup_dir_field = builder.get_object("backup_dir_field")
# Info bar
self._info_bar = builder.get_object("info_bar")
self._message_label = builder.get_object("info_bar_message_label")
self._test_spinner = builder.get_object("test_spinner")
# Profile
2017-12-30 21:51:57 +03:00
self._enigma_radio_button = builder.get_object("enigma_radio_button")
self._neutrino_radio_button = builder.get_object("neutrino_radio_button")
self._support_ver5_switch = builder.get_object("support_ver5_switch")
# Program
2019-01-03 23:32:28 +03:00
self._before_save_switch = builder.get_object("before_save_switch")
self._before_downloading_switch = builder.get_object("before_downloading_switch")
self._program_frame = builder.get_object("program_frame")
self._extra_support_grid = builder.get_object("extra_support_grid")
self._colors_grid = builder.get_object("colors_grid")
self._set_color_switch = builder.get_object("set_color_switch")
self._new_color_button = builder.get_object("new_color_button")
self._extra_color_button = builder.get_object("extra_color_button")
# HTTP API
self._support_http_api_switch = builder.get_object("support_http_api_switch")
self._enable_y_dl_switch = builder.get_object("enable_y_dl_switch")
self._enable_send_to_switch = builder.get_object("enable_send_to_switch")
self._click_mode_disabled_button = builder.get_object("click_mode_disabled_button")
self._click_mode_stream_button = builder.get_object("click_mode_stream_button")
self._click_mode_play_button = builder.get_object("click_mode_play_button")
self._click_mode_zap_button = builder.get_object("click_mode_zap_button")
self._click_mode_zap_button.bind_property("sensitive", self._click_mode_play_button, "sensitive")
self._click_mode_zap_button.bind_property("sensitive", self._enable_send_to_switch, "sensitive")
self._enable_send_to_switch.bind_property("sensitive", builder.get_object("enable_send_to_label"), "sensitive")
2019-11-22 09:34:17 +03:00
self._extra_support_grid.bind_property("sensitive", builder.get_object("v5_support_grid"), "sensitive")
2019-12-13 13:31:07 +03:00
# Settings
self._settings = settings
self._active_profile = settings.profile
2017-12-30 21:51:57 +03:00
self.set_settings()
2019-12-13 13:31:07 +03:00
self.init_ui_elements(self._active_profile)
def init_ui_elements(self, profile):
is_enigma_profile = profile is Profile.ENIGMA_2
2018-05-28 18:45:31 +03:00
self._neutrino_radio_button.set_active(profile is Profile.NEUTRINO_MP)
self._settings_stack.get_child_by_name(Property.HTTP.value).set_visible(is_enigma_profile)
self._program_frame.set_sensitive(is_enigma_profile)
self._extra_support_grid.set_sensitive(is_enigma_profile)
http_active = self._support_http_api_switch.get_active()
self._click_mode_zap_button.set_sensitive(is_enigma_profile and http_active)
2019-11-22 09:34:17 +03:00
self.on_info_bar_close() if is_enigma_profile else self.show_info_message(
"The Neutrino has only experimental support. Not all features are supported!", Gtk.MessageType.WARNING)
2017-12-30 21:51:57 +03:00
def show(self):
response = self._dialog.run()
if response == Gtk.ResponseType.OK:
self.apply_settings()
2017-11-03 23:39:15 +03:00
self._dialog.destroy()
2017-12-30 21:51:57 +03:00
return response
2019-01-12 18:10:04 +03:00
def on_field_icon_press(self, entry, icon, event_button):
2019-12-13 13:31:07 +03:00
update_entry_data(entry, self._dialog, self._settings.get(self._settings.get("profile")))
2017-10-27 20:48:35 +03:00
2017-12-30 21:51:57 +03:00
def on_profile_changed(self, item):
2018-05-28 18:45:31 +03:00
profile = Profile.ENIGMA_2 if self._enigma_radio_button.get_active() else Profile.NEUTRINO_MP
2019-12-13 13:31:07 +03:00
self._active_profile = profile
self._settings.profile = profile
self.set_settings()
self.init_ui_elements(profile)
2017-12-30 21:51:57 +03:00
def on_reset(self, item):
2019-12-13 13:31:07 +03:00
self._settings.reset()
2017-12-30 21:51:57 +03:00
self.set_settings()
def set_settings(self):
2019-12-13 13:31:07 +03:00
self._host_field.set_text(self._settings.host)
self._port_field.set_text(self._settings.port)
self._login_field.set_text(self._settings.user)
self._password_field.set_text(self._settings.password)
self._http_login_field.set_text(self._settings.http_user)
self._http_password_field.set_text(self._settings.http_password)
self._http_port_field.set_text(self._settings.http_port)
self._telnet_login_field.set_text(self._settings.telnet_user)
self._telnet_password_field.set_text(self._settings.telnet_password)
self._telnet_port_field.set_text(self._settings.telnet_port)
self._telnet_timeout_spin_button.set_value(self._settings.telnet_timeout)
self._services_field.set_text(self._settings.services_path)
self._user_bouquet_field.set_text(self._settings.user_bouquet_path)
self._satellites_xml_field.set_text(self._settings.satellites_xml_path)
self._picons_field.set_text(self._settings.picons_path)
self._data_dir_field.set_text(self._settings.data_dir_path)
self._picons_dir_field.set_text(self._settings.picons_dir_path)
self._backup_dir_field.set_text(self._settings.backup_dir_path)
self._before_save_switch.set_active(self._settings.backup_before_save)
self._before_downloading_switch.set_active(self._settings.backup_before_downloading)
self.set_fav_click_mode(self._settings.fav_click_mode)
if self._active_profile is Profile.ENIGMA_2:
self._support_ver5_switch.set_active(self._settings.v5_support)
self._support_http_api_switch.set_active(self._settings.http_api_support)
self._enable_y_dl_switch.set_active(self._settings.enable_yt_dl)
self._enable_send_to_switch.set_active(self._settings.enable_send_to)
self._set_color_switch.set_active(self._settings.use_colors)
new_rgb = Gdk.RGBA()
2019-12-13 13:31:07 +03:00
new_rgb.parse(self._settings.new_color)
extra_rgb = Gdk.RGBA()
2019-12-13 13:31:07 +03:00
extra_rgb.parse(self._settings.extra_color)
self._new_color_button.set_rgba(new_rgb)
self._extra_color_button.set_rgba(extra_rgb)
2017-12-30 21:51:57 +03:00
2018-01-10 22:13:25 +03:00
def apply_settings(self, item=None):
2019-12-13 13:31:07 +03:00
self._active_profile = Profile.ENIGMA_2 if self._enigma_radio_button.get_active() else Profile.NEUTRINO_MP
self._settings.profile = self._active_profile
self._settings.host = self._host_field.get_text()
self._settings.port = self._port_field.get_text()
self._settings.user = self._login_field.get_text()
self._settings.password = self._password_field.get_text()
self._settings.http_user = self._http_login_field.get_text()
self._settings.http_password = self._http_password_field.get_text()
self._settings.http_port = self._http_port_field.get_text()
self._settings.telnet_user = self._telnet_login_field.get_text()
self._settings.telnet_password = self._telnet_password_field.get_text()
self._settings.telnet_port = self._telnet_port_field.get_text()
self._settings.telnet_timeout = int(self._telnet_timeout_spin_button.get_value())
self._settings.services_path = self._services_field.get_text()
self._settings.user_bouquet_path = self._user_bouquet_field.get_text()
self._settings.satellites_xml_path = self._satellites_xml_field.get_text()
self._settings.picons_path = self._picons_field.get_text()
self._settings.data_dir_path = self._data_dir_field.get_text()
self._settings.picons_dir_path = self._picons_dir_field.get_text()
self._settings.backup_dir_path = self._backup_dir_field.get_text()
self._settings.backup_before_save = self._before_save_switch.get_active()
self._settings.backup_before_downloading = self._before_downloading_switch.get_active()
self._settings.fav_click_mode = self.get_fav_click_mode()
if self._active_profile is Profile.ENIGMA_2:
self._settings.use_colors = self._set_color_switch.get_active()
self._settings.new_color = self._new_color_button.get_rgba().to_string()
self._settings.extra_color = self._extra_color_button.get_rgba().to_string()
self._settings.v5_support = self._support_ver5_switch.get_active()
self._settings.http_api_support = self._support_http_api_switch.get_active()
self._settings.enable_yt_dl = self._enable_y_dl_switch.get_active()
self._settings.enable_send_to = self._enable_send_to_switch.get_active()
self._settings.save()
2017-12-30 21:51:57 +03:00
2018-11-04 00:36:07 +03:00
@run_task
def on_connection_test(self, item):
if self._test_spinner.get_state() is Gtk.StateType.ACTIVE:
return
self.show_spinner(True)
current_property = Property(self._settings_stack.get_visible_child_name())
if current_property is Property.HTTP:
self.test_http()
elif current_property is Property.TELNET:
self.test_telnet()
elif current_property is Property.FTP:
self.test_ftp()
def test_http(self):
user, password = self._http_login_field.get_text(), self._http_password_field.get_text()
2018-11-08 13:07:24 +03:00
host, port = self._host_field.get_text(), self._http_port_field.get_text()
2018-11-04 00:36:07 +03:00
try:
2018-11-08 13:07:24 +03:00
self.show_info_message(test_http(host, port, user, password), Gtk.MessageType.INFO)
except TestException as e:
2018-11-04 00:36:07 +03:00
self.show_info_message(str(e), Gtk.MessageType.ERROR)
finally:
self.show_spinner(False)
def test_telnet(self):
timeout = int(self._telnet_timeout_spin_button.get_value())
host, port = self._host_field.get_text(), self._telnet_port_field.get_text()
user, password = self._telnet_login_field.get_text(), self._telnet_password_field.get_text()
try:
2018-11-08 13:07:24 +03:00
self.show_info_message(test_telnet(host, port, user, password, timeout), Gtk.MessageType.INFO)
2018-11-04 00:36:07 +03:00
self.show_spinner(False)
2018-11-08 13:07:24 +03:00
except TestException as e:
2018-11-04 00:36:07 +03:00
self.show_info_message(str(e), Gtk.MessageType.ERROR)
self.show_spinner(False)
def test_ftp(self):
host, port = self._host_field.get_text(), self._port_field.get_text()
user, password = self._login_field.get_text(), self._password_field.get_text()
try:
2018-11-08 13:07:24 +03:00
self.show_info_message("OK. {}".format(test_ftp(host, port, user, password)), Gtk.MessageType.INFO)
except TestException as e:
2018-11-04 00:36:07 +03:00
self.show_info_message(str(e), Gtk.MessageType.ERROR)
finally:
self.show_spinner(False)
@run_idle
def show_info_message(self, text, message_type):
self._info_bar.set_visible(True)
self._info_bar.set_message_type(message_type)
self._message_label.set_text(text)
@run_idle
def show_spinner(self, show):
self._test_spinner.start() if show else self._test_spinner.stop()
self._test_spinner.set_state(Gtk.StateType.ACTIVE if show else Gtk.StateType.NORMAL)
def on_info_bar_close(self, bar=None, resp=None):
self._info_bar.set_visible(False)
def on_set_color_switch_state(self, switch, state):
self._colors_grid.set_sensitive(state)
def on_http_mode_switch_state(self, switch, state):
self._click_mode_zap_button.set_sensitive(state)
if self._click_mode_play_button.get_active() or self._click_mode_zap_button.get_active():
self._click_mode_disabled_button.set_active(True)
def on_yt_dl_switch_state(self, switch, state):
self.show_info_message("Not implemented yet!", Gtk.MessageType.WARNING)
def on_send_to_switch_state(self, switch, state):
self.show_info_message("Not implemented yet!", Gtk.MessageType.WARNING)
@run_idle
def set_fav_click_mode(self, mode):
mode = FavClickMode(mode)
self._click_mode_disabled_button.set_active(mode is FavClickMode.DISABLED)
self._click_mode_stream_button.set_active(mode is FavClickMode.STREAM)
self._click_mode_play_button.set_active(mode is FavClickMode.PLAY)
self._click_mode_zap_button.set_active(mode is FavClickMode.ZAP)
def get_fav_click_mode(self):
if self._click_mode_zap_button.get_active():
return FavClickMode.ZAP
if self._click_mode_play_button.get_active():
return FavClickMode.PLAY
if self._click_mode_stream_button.get_active():
return FavClickMode.STREAM
return FavClickMode.DISABLED
2017-10-14 13:23:34 +03:00
if __name__ == "__main__":
pass