1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 from box import EventBox
24 from constant import DEFAULT_FONT_SIZE
25 from draw import draw_line, draw_pixbuf, draw_text
26 from theme import ui_theme
27 from utils import widget_fix_cycle_destroy_bug, propagate_expose
28 import gobject
29 import gtk
30 import pango
31
33 '''
34 Navigatebar.
35
36 @undocumented: expose_nav_separator.
37 '''
38
49 '''
50 Initialize Navigatebar class.
51
52 @param items: A list of navigate item, item format: (item_icon_dpixbuf, item_content, clicked_callback)
53 @param add_separator: Whether add separator between navigatebar and body, default is False.
54 @param font_size: Font size, default is DEFAULT_FONT_SIZE.
55 @param padding_x: Padding value horizontal.
56 @param padding_y: Padding value vertical.
57 @param vertical: Draw direction, default is vertical.
58 @param item_hover_pixbuf: Item hover dpixbuf.
59 @param item_press_pixbuf: Item press dpixbuf.
60 '''
61
62 EventBox.__init__(self)
63 self.nav_index = 0
64 self.item_hover_pixbuf = item_hover_pixbuf
65 self.item_press_pixbuf = item_press_pixbuf
66
67
68 self.nav_box = gtk.VBox()
69 self.add(self.nav_box)
70
71
72 self.nav_item_box = gtk.HBox()
73 self.nav_box.pack_start(self.nav_item_box, False, False)
74
75
76 if items:
77 for (index, item) in enumerate(items):
78 nav_item = NavItem(item, index, font_size, padding_x, padding_y, vertical,
79 self.set_index, self.get_index,
80 self.item_hover_pixbuf,
81 self.item_press_pixbuf)
82 self.nav_item_box.pack_start(nav_item.item_box, False, False)
83
84
85 if add_separator:
86 self.separator = gtk.HBox()
87 self.separator.set_size_request(-1, 2)
88 self.separator.connect("expose-event", self.expose_nav_separator)
89 self.nav_box.pack_start(self.separator, False, False)
90
91
92 self.show_all()
93
95 '''
96 Set selected item with given index.
97
98 @param index: Item index.
99 '''
100 self.nav_item_box.queue_draw()
101 self.nav_index = index
102
104 '''
105 Get selected index.
106
107 @return: Return selected item index.
108 '''
109 return self.nav_index
110
112 '''
113 Internal callback for `expose-event` signal.
114 '''
115
116 cr = widget.window.cairo_create()
117 rect = widget.allocation
118
119
120 cr.set_source_rgba(1, 1, 1, 0.5)
121 draw_line(cr, rect.x + 1, rect.y + 1, rect.x + rect.width - 1, rect.y + 1)
122
123 cr.set_source_rgba(0, 0, 0, 0.5)
124 draw_line(cr, rect.x + 1, rect.y + 2, rect.x + rect.width - 1, rect.y + 2)
125
126 return True
127
128 gobject.type_register(Navigatebar)
129
131 '''
132 Navigate item.
133
134 @undocumented: wrap_nav_item_clicked_action
135 @undocumented: expose_nav_item
136 '''
137
138 - def __init__(self,
139 element,
140 index,
141 font_size,
142 padding_x,
143 padding_y,
144 vertical,
145 set_index, get_index,
146 item_hover_pixbuf,
147 item_press_pixbuf):
148 '''
149 Initialize NavItem class.
150
151 @param element: Item format: (item_icon_dpixbuf, item_content, clicked_callback)
152 @param index: Item index.
153 @param font_size: Font size.
154 @param padding_x: Padding value horizontal.
155 @param padding_y: Padding value vertical.
156 @param vertical: Draw direction.
157 @param set_index: Set index callback.
158 @param get_index: Get index callback.
159 @param item_hover_pixbuf: Item hover pixbuf.
160 @param item_press_pixbuf: Item press pixbuf.
161 '''
162
163 self.index = index
164 self.font_size = font_size
165 self.vertical = vertical
166 self.set_index = set_index
167 self.get_index = get_index
168 self.item_hover_pixbuf = item_hover_pixbuf
169 self.item_press_pixbuf = item_press_pixbuf
170 (self.icon_dpixbuf, self.content, self.clicked_callback) = element
171 pixbuf = self.item_hover_pixbuf.get_pixbuf()
172
173
174 self.item_button = gtk.Button()
175 self.item_button.set_size_request(pixbuf.get_width(), pixbuf.get_height())
176
177 widget_fix_cycle_destroy_bug(self.item_button)
178
179 self.item_button.connect("expose-event", self.expose_nav_item)
180 self.item_button.connect("clicked", lambda w: self.wrap_nav_item_clicked_action())
181
182
183 self.item_box = gtk.Alignment()
184 self.item_box.set(0.0, 0.0, 0.0, 0.0)
185 self.item_box.set_padding(padding_y, padding_y, padding_x, padding_x)
186 self.item_box.add(self.item_button)
187
189 '''
190 Internal function to wrap clicked action.
191 '''
192 if self.clicked_callback:
193 self.clicked_callback()
194 self.set_index(self.index)
195
197 '''
198 Internal callback `expose-event` signal.
199 '''
200
201 cr = widget.window.cairo_create()
202 rect = widget.allocation
203 select_index = self.get_index()
204 hover_pixbuf = self.item_hover_pixbuf.get_pixbuf()
205 press_pixbuf = self.item_press_pixbuf.get_pixbuf()
206
207
208 if widget.state == gtk.STATE_NORMAL:
209 if select_index == self.index:
210 select_pixbuf = press_pixbuf
211 else:
212 select_pixbuf = None
213 elif widget.state == gtk.STATE_PRELIGHT:
214 if select_index == self.index:
215 select_pixbuf = press_pixbuf
216 else:
217 select_pixbuf = hover_pixbuf
218 elif widget.state == gtk.STATE_ACTIVE:
219 select_pixbuf = press_pixbuf
220
221 if select_pixbuf:
222 draw_pixbuf(cr, select_pixbuf, rect.x, rect.y)
223
224
225 nav_item_pixbuf = self.icon_dpixbuf.get_pixbuf()
226 if self.vertical:
227 draw_pixbuf(
228 cr, nav_item_pixbuf,
229 rect.x + (rect.width - nav_item_pixbuf.get_width()) / 2,
230 rect.y)
231
232 draw_text(cr,
233 self.content,
234 rect.x,
235 rect.y + nav_item_pixbuf.get_height() - 3,
236 rect.width,
237 rect.height - nav_item_pixbuf.get_height(),
238 text_size=self.font_size,
239 text_color="#FFFFFF",
240 alignment=pango.ALIGN_CENTER,
241 gaussian_radious=2, gaussian_color="#000000",
242 border_radious=1, border_color="#000000",
243 )
244 else:
245 draw_pixbuf(
246 cr, nav_item_pixbuf,
247 rect.x,
248 rect.y + (rect.height - nav_item_pixbuf.get_height()) / 2)
249
250 draw_text(cr,
251 self.content,
252 rect.x + nav_item_pixbuf.get_width() - 3,
253 rect.y,
254 rect.width - nav_item_pixbuf.get_width(),
255 rect.height,
256 text_size=self.font_size,
257 text_color="#FFFFFF",
258 alignment=pango.ALIGN_CENTER,
259 gaussian_radious=2, gaussian_color="#000000",
260 border_radious=1, border_color="#000000",
261 )
262
263
264 propagate_expose(widget, event)
265
266 return True
267