~stewart/mythremote/quickly_trunk

« back to all changes in this revision

Viewing changes to mythremote_lib/PreferencesDialog.py

  • Committer: Stewart Smith
  • Date: 2012-02-05 04:40:51 UTC
  • Revision ID: stewart@flamingspork.com-20120205044051-b86m7edpcxosnziq
Initial project creation with Quickly!

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
 
2
### BEGIN LICENSE
 
3
# This file is in the public domain
 
4
### END LICENSE
 
5
 
 
6
"""this dialog adjusts values in the preferences dictionary
 
7
 
 
8
requirements:
 
9
in module preferences: defaults[key] has a value
 
10
self.builder.get_object(key) is a suitable widget to adjust value
 
11
widget_methods[key] provides method names for the widget
 
12
each widget calls set_preference(...) when it has adjusted value
 
13
"""
 
14
 
 
15
import gtk
 
16
import logging
 
17
logger = logging.getLogger('mythremote_lib')
 
18
 
 
19
from . helpers import get_builder, show_uri, get_help_uri
 
20
from . preferences import preferences
 
21
 
 
22
class PreferencesDialog(gtk.Dialog):
 
23
    __gtype_name__ = "PreferencesDialog"
 
24
 
 
25
    def __new__(cls):
 
26
        """Special static method that's automatically called by Python when 
 
27
        constructing a new instance of this class.
 
28
        
 
29
        Returns a fully instantiated PreferencesDialog object.
 
30
        """
 
31
        builder = get_builder('PreferencesMythremoteDialog')
 
32
        new_object = builder.get_object("preferences_mythremote_dialog")
 
33
        new_object.finish_initializing(builder)
 
34
        return new_object
 
35
 
 
36
    def finish_initializing(self, builder):
 
37
        """Called while initializing this instance in __new__
 
38
 
 
39
        finish_initalizing should be called after parsing the ui definition
 
40
        and creating a PreferencesDialog object with it in order to
 
41
        finish initializing the start of the new PerferencesMythremoteDialog
 
42
        instance.
 
43
        
 
44
        Put your initialization code in here and leave __init__ undefined.
 
45
        """
 
46
 
 
47
        # Get a reference to the builder and set up the signals.
 
48
        self.builder = builder
 
49
        self.ui = builder.get_ui(self, True)
 
50
 
 
51
        # code for other initialization actions should be added here
 
52
        self.widget_methods = []
 
53
 
 
54
    def set_widgets_from_preferences(self):
 
55
        ''' these widgets show values in the preferences dictionary '''
 
56
        for key in preferences.keys():
 
57
            self.set_widget_from_preference(key)
 
58
 
 
59
    def set_widget_from_preference(self, key):
 
60
        '''set widget value from item in preferences'''
 
61
 
 
62
        value = preferences.get(key)
 
63
        widget = self.builder.get_object(key)
 
64
        if widget is None:
 
65
            # this preference is not adjustable by this dialog
 
66
            # for example: window and dialog geometries
 
67
            logger.debug('no widget for preference: %s' % key)
 
68
            return
 
69
 
 
70
        logger.debug('set_widget_from_preference: %s' % key)
 
71
        try:
 
72
            write_method_name = self.widget_methods[key][1]
 
73
        except KeyError:
 
74
            logger.warn('%s not in widget_methods' % key)
 
75
            return
 
76
 
 
77
        try:
 
78
            method = getattr(widget, write_method_name)
 
79
        except AttributeError:
 
80
            logger.warn("""'%s' does not have a '%s' method.
 
81
Please edit 'widget_methods' in %s"""
 
82
            % (key, write_method_name, self.__gtype_name__))
 
83
            return
 
84
 
 
85
        try:
 
86
            widget.connect(self.widget_methods[key][2], self.set_preference)
 
87
        except TypeError:
 
88
            logger.warn("""'%s' unknown signal name '%s'
 
89
Please edit 'widget_methods' in %s"""
 
90
            % (key, self.widget_methods[key][2], self.__gtype_name__))
 
91
 
 
92
        method(value)
 
93
 
 
94
    def get_key_for_widget(self, widget):
 
95
        key = None
 
96
        for key_try in preferences.keys():
 
97
            obj = self.builder.get_object(key_try)
 
98
            if obj == widget:
 
99
                key = key_try
 
100
        return key
 
101
 
 
102
    def set_preference(self, widget, data=None):
 
103
        '''set a preference from a widget'''
 
104
        key = self.get_key_for_widget(widget)
 
105
        if key is None:
 
106
            logger.warn('''This widget will not write to a preference.
 
107
The preference must already exist so add this widget's name
 
108
to default_preferences in your main function''')
 
109
            return
 
110
 
 
111
        # set_widget_from_preference is called first
 
112
        # so no KeyError test is needed here
 
113
        read_method_name = self.widget_methods[key][0]
 
114
 
 
115
        try:
 
116
            read_method = getattr(widget, read_method_name)
 
117
        except AttributeError:
 
118
            logger.warn("""'%s' does not have a '%s' method.
 
119
Please edit 'widget_methods' in %s"""
 
120
            % (key, read_method_name, self.__gtype_name__))
 
121
            return
 
122
 
 
123
        value=read_method()
 
124
        logger.debug('set_preference: %s = %s' % (key, str(value)))
 
125
        preferences[key] = value
 
126
 
 
127
    def on_btn_close_clicked(self, widget, data=None):
 
128
        self.destroy()
 
129
 
 
130
    def on_btn_help_clicked(self, widget, data=None):
 
131
        show_uri(self, "ghelp:%s" % get_help_uri('preferences'))
 
132