4 # Copyright (C) 2010 Stefanos Harhalakis
6 # This file is part of wifieye.
8 # wifieye is free software: you can redistribute it and/or modify
9 # it under the terms of the GNU General Public License as published by
10 # the Free Software Foundation, either version 3 of the License, or
11 # (at your option) any later version.
13 # wifieye is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 # GNU General Public License for more details.
18 # You should have received a copy of the GNU General Public License
19 # along with wifieye. If not, see <http://www.gnu.org/licenses/>.
21 # $Id: 0.py 2265 2010-02-21 19:16:26Z v13 $
23 __version__ = "$Id: 0.py 2265 2010-02-21 19:16:26Z v13 $"
28 from hildondesktop import *
34 from portrait import FremantleRotation
35 #from xdg.IconTheme import getIconPath
41 from icons import Icons
43 #def getIcon(name, iconsize):
44 # ico=getIconPath(name, iconsize)
45 # ret=gtk.gdk.pixbuf_new_from_file_at_size(ico, iconsize, iconsize)
49 #class IconGrid(gtk.Widget, FremantleRotation):
50 class IconGrid(object): #(gobject.GObject):
51 def __init__(self, isconfig=False):
52 # self.__gobject_init__()
58 self.isconfig=isconfig
61 self.lasticon=None # The last icon that got selected
63 self.draw_pending=False
67 # If this is False then animations are forcefully disabled
68 self.do_animations=True
70 self.angle_timer_start=0
72 # Duration of the rotation effect
73 self.rotation_time=0.8
75 def do_realize(self, config):
78 self.icons=Icons(self.isconfig, self.config)
80 self.setSize(config.getMaxSize())
83 def connect(self, what, *args):
84 if what in icon.signals:
85 self.icons.connect(what, *args)
87 super(IconGrid, self).connect(what, *args)
89 def setSize(self, size):
91 self.icons.setSize(size)
94 ret=self.icons.getSize()
97 def setMode(self, mode):
103 if not isinstance(self, gtk.Widget):
109 v=self.get_property('is-on-current-desktop')
113 self.draw_pending=True
117 if do_draw and self.config.getAnimate() and self.do_animations:
119 # Don't start another timer
120 # Instead adjust the time start to produce a nice effect ;-)
121 if self.angle_timer_start==0:
122 self.angle_timer_start=time.time()
123 gobject.timeout_add(20, self.timerAngle)
125 dt=time.time()-self.angle_timer_start
126 da=90.0*dt/self.rotation_time
129 dt2=da2*self.rotation_time/90.0
130 self.angle_timer_start=time.time()-dt2
140 def disableAnimation(self):
141 self.do_animations=False
143 def enableAnimation(self):
144 self.do_animations=True
146 def setAnimationEnable(self, value):
148 self.enableAnimation()
150 self.disableAnimation()
152 def timerAngle(self):
153 if self.angle_timer_start==0:
154 self.angle_timer_start=time.time()-0.05
156 dt=time.time()-self.angle_timer_start
158 da=90.0*dt/self.rotation_time
174 if self.setAngle(angle):
178 self.angle_timer_start=0
182 def iconAt(self, x, y):
183 """ Get icon at coordinates x,y. X and Y are in pixels """
185 w=self.config.getIconSizeFull()
187 if self.mode=='l' or self.config.getIndiv():
191 x2=self.size[1] - int(y/w) - 1
199 ret=self.icons.get(x,y)
203 def _draw(self, cr, event):
204 self.draw_pending=False
206 w=self.config.getIconSizeFull()
207 for x,y in self.icons:
208 if self.mode=='l' or self.config.getIndiv():
209 #x2=x * (self.config.iconsize + self.config.iconspace)
210 #y2=y * (self.config.iconsize + self.config.iconspace)
211 x2=x * self.config.getIconSizeFull()
212 y2=y * self.config.getIconSizeFull()
214 #x2=y * (self.config.iconsize + self.config.iconspace)
215 #y2=(self.size[1]-x-1) * \
216 # (self.config.iconsize + self.config.iconspace)
217 x2=y * self.config.getIconSizeFull()
218 y2=(self.size[1]-x-1) * self.config.getIconSizeFull()
220 # Only repaint the needed icons
221 rect=gdk.Rectangle(x2, y2, w, w)
222 t=rect.intersect(event.area)
223 if t.width==0 and t.height==0:
226 ico=self.icons.get(x,y)
229 def setAngle(self, angle):
230 """ Return True/False indicating that angle has changed """
232 for x,y in self.icons:
233 ic=self.icons.get(x,y)
234 if ic.setAngle(angle):
239 def clearAnimationCache(self):
240 """ Clear animation cache, freeing memory """
241 for x,y in self.icons:
242 ic=self.icons.get(x,y)
243 ic.clearAnimationCache()
245 def clearBgCache(self):
246 """ Clear backgrounds cache """
247 for x,y in self.icons:
248 ic=self.icons.get(x,y)
251 def do_expose_event(self, event):
252 cr=self.window.cairo_create()
254 cr.rectangle(event.area.x, event.area.y,
255 event.area.width, event.area.height)
259 if not self.init_done:
260 self.icons.setWindow(self.window)
263 self._draw(cr, event)
265 def setLastIcon(self, icon):
266 if icon==self.lasticon:
269 if self.lasticon!=None:
270 self.lasticon.doCancel()
271 self.lasticon.invalidate(self.window)
274 def do_button_press_event(self, event):
275 icon=self.iconAt(event.x, event.y)
278 # rect=gdk.Rectangle(event.x,event.y,1,1)
279 # rect=gdk.Rectangle(0, 0, 100, 100)
281 icon.invalidate(self.window)
282 self.setLastIcon(icon)
284 # gdk.Window.invalidate_rect(self.window, rect, True)
288 def do_button_release_event(self, event):
289 if self.lasticon!=None:
290 self.lasticon.invalidate(self.window)
291 self.lasticon.doRelease()
293 self.setLastIcon(None)
297 def do_leave_notify_event(self, event):
298 self.setLastIcon(None)
301 def do_pproperty_notify_event(self, event):
302 icon=self.iconAt(event.x, event.y)
306 icon.invalidate(self.window)
309 def do_motion_notify_event(self, event):
310 icon=self.iconAt(event.x, event.y)
311 if self.lasticon==icon:
314 self.setLastIcon(None)
316 icon.invalidate(self.window)
319 def do_button_press_event_old(self, event):
320 if event.type==gdk.BUTTON_PRESS:
329 def do_event1(self, event):
330 print "event:", event, event.type
332 def reloadIcons(self):
335 # def on_orientation_changed(self, orientation):
336 # print "orch:", orientation
340 class IconGridWidget(IconGrid, gtk.Widget):
341 def __init__(self, isconfig, config, animation=True):
342 IconGrid.__init__(self, isconfig)
343 gtk.Widget.__init__(self)
345 # This must be called before do_realize
346 self.setAnimationEnable(animation)
350 IconGrid.do_realize(self, self.config)
352 self.setSize(self.size)
354 def setSize(self, size):
355 IconGrid.setSize(self, size)
357 w=self.size[0] * self.config.getIconSizeFull()
358 h=self.size[1] * self.config.getIconSizeFull()
360 self.set_size_request(w, h)
364 self.setSize(self.size)
365 self.icons.resizeMax()
368 def do_realize(self):
369 screen=self.get_screen()
370 self.set_colormap(screen.get_rgba_colormap())
371 self.set_app_paintable(True)
373 self.set_flags(self.flags() | gtk.REALIZED)
375 self.window=gdk.Window(
376 self.get_parent_window(),
377 width=self.allocation.width,
378 height=self.allocation.height,
379 window_type=gdk.WINDOW_CHILD,
380 wclass=gdk.INPUT_OUTPUT,
381 event_mask=self.get_events() | gdk.EXPOSURE_MASK
382 | gdk.BUTTON_PRESS_MASK
383 | gdk.BUTTON_RELEASE_MASK
384 | gdk.BUTTON_MOTION_MASK
385 | gdk.POINTER_MOTION_MASK
386 | gdk.POINTER_MOTION_HINT_MASK
387 | gdk.ENTER_NOTIFY_MASK
388 | gdk.LEAVE_NOTIFY_MASK )
390 self.window.set_user_data(self)
391 self.style.attach(self.window)
393 # self.style.set_background(self.window, gtk.STATE_NORMAL)
394 self.window.move_resize(*self.allocation)
396 # self.pixmap, mask = gtk.gdk.pixmap_create_from_xpm_d(
397 # self.window, self.style.bg[gtk.STATE_NORMAL], STAR_PIXMAP)
399 # self.gc = self.style.fg_gc[gtk.STATE_NORMAL]
401 #gtk.Widget.do_realize(self)
402 #HomePluginItem.do_realize(self)
404 # screen=self.get_screen()
405 # self.set_colormap(screen.get_rgba_colormap())
406 # self.set_app_paintable(True)
408 def do_unrealize(self):
409 #self.window.set_user_data(None)
410 self.window.destroy()
412 #gobject.type_register(IconGrid)
413 gobject.type_register(IconGridWidget)
416 # vim: set ts=8 sts=4 sw=4 noet formatoptions=r ai nocindent: