__author__ = 'laharah' # noinspection PyUnresolvedReferences import gtk # noinspection PyUnresolvedReferences from deluge.ui.client import client from filebottool.gtkui.common import inflate_list_store_combo from filebottool.common import LOG import user_messenger log = LOG class HandlerUI(object): """ handles ui functions for initializing and manipulating filebot handler widgets. Assumes that the glade file passed has correctly named widgets. Args: glade: A gtk.glade object containing the following widgets: format_string_entry output_entry rename_action_combo database_combo query_entry episode_order_combo on_conflict_combo download_subs_checkbox encoding_entry language_code_entry subs_language_entry """ def __init__(self, glade, settings=None): """ Initial setup :param glade: a gtk.glade object, see class doc_strings for info :param settings: a dict of handler settings to pre-populate with """ self.glade = glade self.initial_settings = settings self.database_combo = self.glade.get_widget("database_combo") self.rename_action_combo = self.glade.get_widget("rename_action_combo") self.on_conflict_combo = self.glade.get_widget("on_conflict_combo") self.episode_order_combo = self.glade.get_widget("episode_order_combo") self.format_string_entry = self.glade.get_widget("format_string_entry") self.query_entry = self.glade.get_widget("query_entry") self.download_subs_checkbox = self.glade.get_widget("download_subs_checkbox") self.subs_language_entry = self.glade.get_widget("subs_language_entry") self.language_code_entry = self.glade.get_widget("language_code_entry") self.encoding_entry = self.glade.get_widget("encoding_entry") self.output_entry = self.glade.get_widget("output_entry") self.populated = False self.monitor_changes = True self.glade.signal_autoconnect( {'on_conflict_combo_changed': self.on_conflict_combo_changed} ) client.filebottool.get_filebot_valid_values().addCallback( self.init_combo_boxes) def init_combo_boxes(self, combo_data): """retrieves valid values for combo boxes and inflates them""" self.monitor_changes = False log.debug("building database combo box") databases = combo_data["valid_databases"] inflate_list_store_combo(databases, self.database_combo) log.debug("building rename action combo box") rename_actions = combo_data["valid_rename_actions"] inflate_list_store_combo(rename_actions, self.rename_action_combo) log.debug("building on conflict combo box") on_conflicts = combo_data["valid_on_conflicts"] inflate_list_store_combo(on_conflicts, self.on_conflict_combo) log.debug("building episode order combo box") episode_orders = combo_data["valid_episode_orders"] inflate_list_store_combo(episode_orders, self.episode_order_combo) if self.initial_settings: self.populate_with_settings(self.initial_settings) self.populated = True self.monitor_changes = True def populate_with_settings(self, settings): """populates the UI with the desired settings dictionary Args: settings: The settings dict to populate. """ combo_value_pairs = [ (self.database_combo, settings["database"]), (self.rename_action_combo, settings["rename_action"]), (self.on_conflict_combo, settings["on_conflict"]), (self.episode_order_combo, settings["episode_order"]) ] log.debug("Setting combo boxes") for combo, value in combo_value_pairs: combo_model = combo.get_model() try: value_index = [index for index, row in enumerate(combo_model) if row[0] == value][0] except IndexError: log.warning("could not set {0} to value {1}, value {1} could " "not be found in {0}".format(combo, value)) else: combo.set_active(value_index) entry_value_pairs = [ (self.format_string_entry, settings.get("format_string", '')), (self.encoding_entry, settings.get("encoding", '')), (self.subs_language_entry, settings.get("subs_language", '')), (self.language_code_entry, settings.get("language_code", '')), (self.query_entry, settings.get("query_override", '')), (self.output_entry, settings.get("output", '')), ] log.debug("Setting entry widgets") for entry, value in entry_value_pairs: if value: entry.set_text(value) else: entry.set_text('') if settings["download_subs"]: self.download_subs_checkbox.set_active(True) else: self.download_subs_checkbox.set_active(False) def collect_dialog_settings(self): """collects the settings on the widgets and serializes them into a dict for sending to the server. returns: a dictionary containing the user's setting values """ settings = {} combos = { "database": self.database_combo, "rename_action": self.rename_action_combo, "on_conflict": self.on_conflict_combo, "episode_order": self.episode_order_combo } for setting in combos: combo_model = combos[setting].get_model() current_iter = combos[setting].get_active_iter() if current_iter: settings[setting] = combo_model[current_iter][0] else: settings[setting] = None entries = { "format_string": self.format_string_entry, "encoding": self.encoding_entry, "language_code": self.language_code_entry, "subs_language": self.subs_language_entry, "query_override": self.query_entry, "output": self.output_entry } for setting in entries: if not entries[setting]: entries[setting] = '' settings[setting] = entries[setting].get_text() settings["show_advanced"] = self.glade.get_widget( "advanced_options").get_visible() settings["download_subs"] = self.download_subs_checkbox.get_active() log.debug("Collected settings for server: {0}".format(settings)) return settings def on_conflict_combo_changed(self, on_conflict, *args): if not self.monitor_changes: return model = on_conflict.get_model() current_iter = on_conflict.get_active_iter() if current_iter: setting = model[current_iter][0] else: setting = None if setting == 'override': msg = 'Warning, override conflict resolution may overwrite files! Use Carefully!' warning = user_messenger.InfoDialog('FilebotTool Warning!', msg, modal=True) warning.run_async() return