~gdesklets-desklet-team/gdesklets/0.36

« back to all changes in this revision

Viewing changes to display/TargetFrame.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 ContainerTarget import ContainerTarget
 
2
from utils.datatypes import *
 
3
from layout import Unit
 
4
from utils import vfs
 
5
import utils
 
6
 
 
7
import os
 
8
import gtk
 
9
 
 
10
try:
 
11
    from utils.tiling import Tiling
 
12
except ImportError:
 
13
    import sys
 
14
    log("Could not import tiling module!")
 
15
    sys.exit(1)
 
16
 
 
17
 
 
18
#
 
19
# Class for putting frames around targets.
 
20
#
 
21
class TargetFrame(ContainerTarget):
 
22
 
 
23
    def __init__(self, name, parent):
 
24
 
 
25
        self.__frame_widths = [Unit.ZERO] * 4
 
26
        self.__images = []
 
27
 
 
28
 
 
29
        ContainerTarget.__init__(self, name, parent)
 
30
        self.__table = gtk.Table(3, 3)
 
31
        self.__table.set_direction(gtk.TEXT_DIR_LTR)
 
32
        self.__table.show()
 
33
 
 
34
        r, g, b, a = utils.parse_color("black")
 
35
        for x, y in ((0, 1), (1, 0), (2, 1), (1, 2),
 
36
                     (0, 0), (2, 0), (2, 2), (0, 2)):
 
37
            img = Tiling()
 
38
            img.set_from_color(r, g, b, a)
 
39
            img.show()
 
40
            self.__table.attach(img, x, x + 1, y, y + 1)
 
41
            self.__images.append(img)
 
42
 
 
43
        self.__box = gtk.HBox()
 
44
        self.__box.show()
 
45
        self.__table.attach(self.__box, 1, 2, 1, 2)
 
46
 
 
47
        self._register_property("border-uris", TYPE_LIST,
 
48
                                self._setp_border_uris, self._getp)
 
49
        self._register_property("border-width", TYPE_UNIT_LIST,
 
50
                                self._setp_border_width, self._getp)
 
51
        self._register_property("color", TYPE_STRING,
 
52
                                self._setp_border_color, self._getp)
 
53
 
 
54
        self.set_prop("border-width",
 
55
                      [Unit.Unit(2, Unit.UNIT_PX), Unit.Unit(2, Unit.UNIT_PX),
 
56
                       Unit.Unit(2, Unit.UNIT_PX), Unit.Unit(2, Unit.UNIT_PX)])
 
57
        self._setp("color", "black")
 
58
 
 
59
 
 
60
        # watch for geometry changes
 
61
        self.add_observer(self.__on_observe_size)
 
62
 
 
63
 
 
64
 
 
65
    def get_widget(self): return self.__table
 
66
 
 
67
    def new_child(self, childtype, settings, children):
 
68
 
 
69
        child = ContainerTarget.new_child(self, childtype, settings, children)
 
70
        self.__box.add(child.get_widget())
 
71
        self.__redraw_frame()
 
72
 
 
73
 
 
74
 
 
75
    #
 
76
    # Observer for size changes.
 
77
    #
 
78
    def __on_observe_size(self, src, cmd, *args):
 
79
 
 
80
        x, y, w, h = src.get_geometry()
 
81
        if (cmd == src.OBS_GEOMETRY and
 
82
                                (w.as_px() != 0) and (h.as_px() != 0)):
 
83
            self.__redraw_frame()
 
84
 
 
85
 
 
86
 
 
87
    def __redraw_frame(self, src = None, event = None):
 
88
 
 
89
        x, y, w, h = self.get_geometry()
 
90
        w1, h1, w2, h2 = self.__frame_widths
 
91
 
 
92
        iw = max(Unit.ZERO, w - w1 - w2)
 
93
        ih = max(Unit.ZERO, h - h1 - h2)
 
94
 
 
95
        self.__box.set_size_request(iw.as_px(), ih.as_px())
 
96
        cnt = 0
 
97
        for bw, bh in ((w1, ih), (iw, h1),
 
98
                       (w2, ih), (iw, h2),
 
99
                       (w1, h1), (w2, h1),
 
100
                       (w2, h2), (w1, h2)):
 
101
            img = self.__images[cnt]
 
102
            cnt += 1
 
103
 
 
104
            if (bw.as_px() == 0 or bh.as_px() == 0):
 
105
                img.hide()
 
106
            else:
 
107
                img.show()
 
108
 
 
109
                img.tile(bw.as_px(), bh.as_px())
 
110
                img.set_size_request(bw.as_px(), bh.as_px())
 
111
        #end for
 
112
 
 
113
 
 
114
 
 
115
    def __set_border_width(self, args):
 
116
 
 
117
        for i in xrange(len(args)):
 
118
            self.__frame_widths[i] = args[i]
 
119
 
 
120
        self.get_layout_object().set_border_width(*args)
 
121
 
 
122
 
 
123
 
 
124
    def __set_border(self, args):
 
125
 
 
126
        cnt = 0
 
127
        for uri in args:
 
128
            uri = self._get_display().get_full_path(uri)
 
129
            if (vfs.exists(uri)):
 
130
                try:
 
131
                    data = vfs.read_entire_file(uri)
 
132
                except:
 
133
                    return
 
134
                self.__images[cnt].set_from_data(data)
 
135
            cnt += 1
 
136
 
 
137
        self.__redraw_frame()
 
138
 
 
139
 
 
140
 
 
141
    def __set_border_color(self, color):
 
142
 
 
143
        r, g, b, a = utils.parse_color(color)
 
144
        for cnt in range(8):
 
145
            self.__images[cnt].set_from_color(r, g, b, a)
 
146
 
 
147
        self.__redraw_frame()
 
148
 
 
149
 
 
150
 
 
151
    def get_border_size(self):
 
152
 
 
153
        w1, h1, w2, h2 = self.__frame_widths
 
154
        return (w1, h1, w2, h2)
 
155
 
 
156
 
 
157
 
 
158
    def _setp_border_uris(self, key, value):
 
159
 
 
160
        self.__set_border(value)
 
161
        self._setp(key, value)
 
162
 
 
163
 
 
164
 
 
165
    def _setp_border_color(self, key, value):
 
166
 
 
167
        self.__set_border_color(value)
 
168
        self._setp(key, value)
 
169
 
 
170
 
 
171
 
 
172
    def _setp_border_width(self, key, value):
 
173
 
 
174
        self.__set_border_width(value)
 
175
        self._setp(key, value)