Source code for steno.dialogs

# -*- coding: utf-8 -*-
"""
.. module:: dialogs
   :platform: Unix, Windows
   :synopsis: Application dialogs definition

.. moduleauthor:: Anton Konyshev <anton.konyshev@gmail.com>

"""
# License: wxWidgets (wxWindows Library Licence) 3.1

import wx

from player_gui import PreferencesDialogGUI
from player_gui import UserManualDialogGUI
import ids
from defaults import Defaults


[docs]class PreferencesDialog(PreferencesDialogGUI): """Dialog allows user to edit the configuration using a graphical interface. """
[docs] def __init__(self, player=None): """Dialog for editing of the configuration data. :param player: Player frame instance :type player: :class:`player.Player` """ self.player = player self.app = getattr(self.player, u'app', None) super(PreferencesDialog, self).__init__(None) self.SetMinSize(wx.Size(*Defaults.PREFERENCES_DIALOG_MIN_SIZE)) self.ok_button.SetDefault() self.SetEscapeId(wx.ID_CANCEL) self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.on_filter_select) self.Bind(wx.EVT_LIST_ITEM_DESELECTED, self.on_filter_deselect) self._set_init_values()
[docs] def on_filter_select(self, event): """Fills fields for filter editing by values of a selected filter. :param event: Event that contains an identifier of a selected filter :type event: :class:`wx.ListEvent` with type :const:`wx.EVT_LIST_ITEM_SELECTED` """ regex, repl = self.filter_list.get_filter(event.GetIndex()) self.filter_regex_edit.ChangeValue(regex) self.filter_replace_edit.ChangeValue(repl)
[docs] def on_filter_deselect(self, event): """Clears fields for filter editing when user clears selection. :param event: Event that entailed an execution of the callback :type event: :class:`wx.ListEvent` with type :const: `wx.EVT_LIST_ITEM_DESELECTED` """ self.filter_regex_edit.ChangeValue(u'') self.filter_replace_edit.ChangeValue(u'')
[docs] def on_filter_action(self, event): """Adds, updates or removes a selected filter. :param event: Event that entailed an execution of the callback :type event: :class:`wx.CommandEvent` with type :const:`wx.EVT_BUTTON` """ widget_id = event.GetId() if widget_id == ids.ADD_FILTER: regex = self.filter_regex_edit.GetValue() repl = self.filter_replace_edit.GetValue() if regex or repl: sel = self.filter_list.selected() if sel: self.change_filter(ids.REMOVE_FILTER, *self.filter_list.get_filter(sel)) index = self.filter_list.add_or_update_filter(regex, repl) self.change_filter(widget_id, *self.filter_list.get_filter(index)) elif widget_id == ids.REMOVE_FILTER: self.change_filter(widget_id, *self.filter_list.remove_selected())
[docs] def change_filter(self, action, regex=None, repl=None): """Changes values of a filter, adds a new filter or removes it. :param int action: Identifier of requested operation (may be one of ids.ADD_FILTER, ids.REMOVE_FILTER) :param regex: RegEx pattern :type regex: str or unicode :param repl: Replacement data :type repl: str or unicode """ if regex is not None and repl is not None: if action == ids.ADD_FILTER: self._filters[regex] = repl elif action == ids.REMOVE_FILTER: try: del self._filters[regex] except KeyError: pass
[docs] def _set_filters(self): """Receives filters from the player instance and inserts them into filters list. """ self._filters = self.player.get_filters(copy=True) for regex, repl in self._filters.iteritems(): self.filter_list.add_or_update_filter(regex, repl)
[docs] def get_filters(self): """Returns a collection of filters. :return: RegEx filters :rtype: dict """ return self._filters.copy()
[docs] def _set_languages(self): """Sets initial values of language selection widgets. """ learning = self.player.app.get_setting( u'learning_language', Defaults.DEFAULT_LEARNING_LANGUAGE) native = self.player.app.get_setting(u'user_language', None) if native is None or native not in set( code for _, code in Defaults.LANGUAGES): native = Defaults.DEFAULT_USER_LANGUAGE idx = learning_idx = native_idx = 0 for langname, langcode in Defaults.LANGUAGES: self.learning_language_choice.Append(langname) self.user_language_choice.Append(langname) if langcode == learning: learning_idx = idx if langcode == native: native_idx = idx idx += 1 self.learning_language_choice.SetSelection(learning_idx) self.user_language_choice.SetSelection(native_idx)
[docs] def _set_init_values(self): """Sets initial values for widgets. """ self._set_languages() self._set_filters() self.translation_cb.SetValue( self.player.app.get_setting(u'translation', Defaults.DEFAULT_TRANSLATION_ENABLE)) [getattr(self, u'{0}_{1}_cp'.format(group, ground)).SetColour( getattr(getattr(self.player, widget), u'Get{0}Colour'.format(method))()) for ground, method in { u'fg': u'Foreground', u'bg': u'Background'}.iteritems() for group, widget in { u'answer': u'answer_edit', u'translation': u'word_translate' }.iteritems()] [getattr(self, u'answer_{0}_cp'.format(correctness)).SetColour( getattr(self.player, u'{0}_highlighting'.format(correctness))()) for correctness in (u'correct', u'incorrect',)] self._answer_font = self.player.answer_edit.GetFont() self._translation_font = self.player.word_translate.GetFont() self._show_font_names()
[docs] def _show_font_names(self): """Sets labels for buttons of font selection dialogs. """ for group in (u'answer', u'translation',): getattr(self, u'{0}_font_button'.format(group)).SetLabel( u'{0} {1}'.format( getattr(self, u'_{0}_font'.format( group)).GetFaceName().title(), getattr(self, u'_{0}_font'.format(group)).GetPointSize()))
[docs] def on_font(self, event): """Creates and shows a font selection dialog with initial data. :param event: Event that entailed an execution of the callback :type event: :class:`wx.CommandEvent` with type :const:`wx.EVT_BUTTON` """ widget_id = event.GetId() for group, font_id in { u'answer': ids.ANSWER_FONT, u'translation': ids.TRANSLATION_FONT }.iteritems(): if widget_id == font_id: data = wx.FontData() data.SetInitialFont(getattr(self, u'_{0}_font'.format(group))) dialog = wx.FontDialog(None, data) if dialog.ShowModal() == wx.ID_OK: setattr(self, u'_{0}_font'.format(group), dialog.GetFontData().GetChosenFont()) self._show_font_names() return None
[docs] def get_preferences(self): """Returns current configuration data. :returns: Configuration data :rtype: dict """ prefs = { u'translation': self.translation_cb.GetValue(), u'learning_language': Defaults.LANGUAGES[ self.learning_language_choice.GetSelection()][1], u'user_language': Defaults.LANGUAGES[ self.user_language_choice.GetSelection()][1], u'answer_correct': self.answer_correct_cp.GetColour().GetRGB(), u'answer_incorrect': self.answer_incorrect_cp.GetColour().GetRGB(), u'answer_font': self._answer_font.GetNativeFontInfoDesc(), u'translation_font': self._translation_font.GetNativeFontInfoDesc(), } prefs.update(dict( [(u'{0}_{1}'.format(group, ground), getattr( self, u'{0}_{1}_cp'.format(group, ground)).GetColour().GetRGB()) for group in (u'answer', u'translation',) for ground in (u'fg', u'bg',)])) return prefs
[docs]class UserManualDialog(UserManualDialogGUI): """Dialog allows user to read user manual while working with the application. """
[docs] def __init__(self, player=None): """Dialog to showing of the user manual text. :param player: Player window instance :type player: :class:`player.Player` """ self.player = player self.app = getattr(self.player, u'app', None) super(UserManualDialog, self).__init__(None) self.SetMinSize(wx.Size(*Defaults.USER_MANUAL_DIALOG_MIN_SIZE)) self.html_widget.SetPage(Defaults.USER_MANUAL_TEXT) self.close_button.SetDefault() self.SetEscapeId(wx.ID_CANCEL)