~gdesklets-desklet-team/gdesklets/0.36

« back to all changes in this revision

Viewing changes to config/ConfigWidget.py

  • Committer: Robert Pastierovic
  • Date: 2007-10-07 10:08:42 UTC
  • Revision ID: pastierovic@gmail.com-20071007100842-fdvp2vzmqgh1j87k
merged 0.3x branch and basic documentation and some other changes

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
from utils.Element import Element
 
2
from utils.datatypes import *
 
3
 
 
4
import gobject
 
5
 
 
6
 
 
7
class ConfigWidget(Element):
 
8
    """
 
9
      Abstract base class for configuration widgets. Configuration widgets can
 
10
      be directly addressed to get/set values or can be visualized to allow the
 
11
      user to change settings.
 
12
    """
 
13
 
 
14
    def __init__(self, name, getter, setter, caller):
 
15
 
 
16
        Element.__init__(self, name)
 
17
 
 
18
        self.__may_set_back = False
 
19
        self.__initialized = False
 
20
 
 
21
        self.__path = ""
 
22
 
 
23
        self.__getter = getter
 
24
        self.__setter = setter
 
25
        self.__caller = caller
 
26
        self.__bind = ""
 
27
 
 
28
        self._register_property("bind", TYPE_STRING, self._setp_bind, None,
 
29
                                "",
 
30
                                doc = "Binds the value to an object property")
 
31
        self._register_property("callback", TYPE_STRING,
 
32
                                self._setp, self._getp, None,
 
33
                                doc = "Callback function")
 
34
        self._register_property("help", TYPE_STRING, self._setp, self._getp,
 
35
                                "", doc = "Tooltip text")
 
36
        self._register_property("label", TYPE_STRING,
 
37
                                self._setp_label, self._getp, "",
 
38
                                doc = "Description label text")
 
39
        self._register_property("enabled", TYPE_BOOL,
 
40
                                self._setp_enabled, self._getp, True,
 
41
                                doc = "Whether the widget is enabled")
 
42
 
 
43
 
 
44
    def _get_path(self): return self.__path
 
45
    def set_path(self, path): self.__path = path
 
46
    
 
47
 
 
48
 
 
49
    #
 
50
    # Tells the config widget to update itself by reading from the bound object.
 
51
    #
 
52
    def update(self):
 
53
 
 
54
        self.__may_set_back = True
 
55
 
 
56
        old_value = self.get_prop("value")
 
57
        try:
 
58
            new_value = self._get_config()
 
59
        except KeyError:
 
60
            return
 
61
 
 
62
        if (not self.__initialized or old_value != new_value):
 
63
            self.__initialized = True
 
64
            self.set_prop("value", new_value)
 
65
 
 
66
 
 
67
 
 
68
    def _get_config(self):
 
69
 
 
70
        return self.__getter(self.__bind)
 
71
 
 
72
 
 
73
    def _set_config(self, v):
 
74
        assert self.__bind
 
75
 
 
76
        if (not self.__may_set_back): return
 
77
 
 
78
        # get_datatype_of_property() doesn't throw here, since ConfigWidget has
 
79
        # a "value" property
 
80
        datatype = self.get_datatype_of_property("value")
 
81
        self.__setter(self.__bind, v, datatype)
 
82
 
 
83
        self.call_callback(self.__bind, v)
 
84
 
 
85
 
 
86
    def call_callback(self, *args):
 
87
 
 
88
        # invoke the callback handler
 
89
        callback = self.get_prop("callback")
 
90
        if (callback):
 
91
            # we get a much better startup performance with the idle handler
 
92
            gobject.idle_add(self.__caller, callback, *args)
 
93
 
 
94
 
 
95
 
 
96
    def get_widgets(self): raise NotImplementedError
 
97
 
 
98
    def _set_enabled(self, value): raise NotImplementedError
 
99
    def _set_label(self, value): raise NotImplementedError
 
100
 
 
101
 
 
102
    def _setp_bind(self, key, value):
 
103
 
 
104
        self.__bind = value
 
105
 
 
106
 
 
107
    def _setp_enabled(self, key, value):
 
108
 
 
109
        self._setp(key, value)
 
110
        self._set_enabled(value)
 
111
 
 
112
 
 
113
    def _setp_label(self, key, value):
 
114
 
 
115
        self._setp(key, value)
 
116
        self._set_label(value)