source: lliurex-mirror/trunk/fuentes/lliurex-mirror2/lliurex-mirror.py @ 2481

Last change on this file since 2481 was 2481, checked in by hectorgh, 3 years ago

adding new lliurex-mirror (tmp branch)

File size: 38.1 KB
Line 
1import gi
2gi.require_version('Gtk', '3.0')
3gi.require_version('PangoCairo', '1.0')
4
5import cairo
6import os
7import threading
8import ConfigParser
9import platform
10import json
11import random
12
13import math
14from math import pi
15
16from gi.repository import Gtk, Gdk, GObject, GLib, PangoCairo, Pango,GdkPixbuf
17
18import signal
19signal.signal(signal.SIGINT, signal.SIG_DFL)
20
21import glob
22
23import gettext
24gettext.textdomain('lliurex-mirror')
25_ = gettext.gettext
26
27BANNERS_PATH="./banners/"
28UNKNOWN_BANNER=BANNERS_PATH+"mirror_banner.png"
29SHADOW_BANNER=BANNERS_PATH+"shadow.png"
30MIRROR_CONF_DIR="./mirrors/"
31GLADE_FILE="rsrc/lliurex-mirror.ui"
32ADD_IMAGE="rsrc/a1.png"
33ADD_IMAGE_OVER="rsrc/a2.png"
34
35class MirrorButton:
36       
37        def __init__(self,info):
38               
39                self.info=info # "pkg"
40                self.info["updating"]=False
41                self.info["exporting"]=False
42                self.info["shadow_alpha"]=0.1
43                self.info["animation_active"]=False
44                self.info["shadow_start"]=0
45                self.info["available"]=True
46                self.info["degree_offset"]=0
47                self.info["red_position"]=0
48                self.info["red_right"]=True
49                self.info["max_random_lights"]=30
50                self.info["random_lights"]=[]
51                self.info["cancelled"]=False
52               
53                if os.path.exists(BANNERS_PATH+self.info["BANNER"]+".png"):
54                        self.info["image"]=BANNERS_PATH+self.info["BANNER"]+".png"
55                else:
56                        self.info["image"]=UNKNOWN_BANNER
57               
58        #def init
59       
60       
61#class GridButton
62
63class LightPoint:
64       
65        def __init__(self,x,y,radius=None):
66               
67                #self.degree=degree
68                self.radius=radius
69               
70                self.x=x
71                self.y=y
72                self.opacity=1.0
73               
74        #def
75
76class CustomColor:
77       
78        def __init__(self,r,g,b):
79               
80                self.r=r/255.0
81                self.g=g/255.0
82                self.b=b/255.0
83
84#class CustomColor             
85
86class LliurexMirror:
87       
88        def __init__(self):
89       
90                self.frame_size=116
91                self.percentage=0
92                self.circle={}
93                self.circle["x"]=58
94                self.circle["y"]=58
95                self.circle["radius"]=46
96                self.degree_offset=0
97                self.y_offset=5
98               
99                self.wave_xoffset=0
100                self.wave_yoffset=0
101                self.wave_lenght=80
102                self.wave_amplitude=3
103                self.wave_amplitude2=2
104                self.wave_amplitude3=2
105                self.wave_xoffset2=50
106                self.wave_xoffset3=80
107               
108                self.add_flag=False
109               
110                self.current_grid_width=0
111                self.current_grid_height=0
112                self.max_grid_width=2
113       
114                self.dark_gray=CustomColor(130.0,151.0,161.0)
115                self.light_gray=CustomColor(185.0,195.0,195.0)
116               
117                self.green=CustomColor(74.0,166.,69.0)
118                self.light_green=CustomColor(88.0,208.0,86.0)
119               
120               
121                self.conf_light=CustomColor(49.0,55.0,66.0)
122                self.conf_dark=CustomColor(30.0,36.0,42.0)
123               
124                self.conf_light_shadow=CustomColor(107.0,116.0,137.0)
125                self.conf_dark_shadow=CustomColor(0,0,0)
126                self.red=CustomColor(255,0,0)
127               
128                self.update_water_colors=[]
129               
130                self.update_water_colors.append(CustomColor(12,54,64))
131                self.update_water_colors.append(CustomColor(17,92,108))
132                self.update_water_colors.append(CustomColor(0.2*255,0.93*255,0.97*255))
133                self.update_water_colors.append(CustomColor(82, 176, 225))
134                self.update_water_colors.append(CustomColor(68, 159, 255))
135               
136               
137                self.export_water_colors=[]
138               
139               
140               
141                self.export_water_colors.append(CustomColor(29,12,64))
142                self.export_water_colors.append(CustomColor(47,17,108))
143                self.export_water_colors.append(CustomColor(93,51,247))
144                self.export_water_colors.append(CustomColor(153,82,225))
145                self.export_water_colors.append(CustomColor(182,68,225))
146               
147                #self.update_water_colors=self.export_water_colors
148               
149                self.current_mirror=None
150                self.updating_mirror=None
151       
152               
153        #def init
154       
155        def start_gui(self):
156               
157                ui_path=GLADE_FILE
158                builder=Gtk.Builder()
159                builder.add_from_file(ui_path)
160               
161               
162               
163               
164                self.stack = Gtk.Stack()
165                self.stack.set_transition_duration(1000)
166                self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT)
167               
168                self.label_image=builder.get_object("label_da")
169                self.label_image1=builder.get_object("label_da1")
170                self.label_image.connect("draw",self.draw_label)
171                self.label_image1.connect("draw",self.draw_label)
172               
173               
174                self.window=builder.get_object("main_window")
175                self.mirror_header_box=builder.get_object("mirror_header_box")
176                self.mirror_name_label=builder.get_object("mirror_name_label")
177                self.conf_mirror_name_label=builder.get_object("conf_mirror_name_label")
178                self.llx_mirror_label=builder.get_object("llx_mirror_label")
179                self.arch_label=builder.get_object("arch_label")
180                self.progress_da=builder.get_object("progress_drawingarea")
181                self.shadow_box=builder.get_object("shadow_box")
182                self.shadow_box1=builder.get_object("shadow_box1")
183                self.shadow_box2=builder.get_object("shadow_box2")
184                self.content_box=builder.get_object("mirror_box")
185                #self.main_content_box=builder.get_object("main_content_box")
186                self.progress_label=builder.get_object("progress_label")
187                self.list_box=builder.get_object("list_box")
188                self.arrow_eb=builder.get_object("arrow_eventbox")
189                self.main_header_box=builder.get_object("main_header_box")
190                self.update_label_box=builder.get_object("update_label_box")
191                self.export_label_box=builder.get_object("export_label_box")
192                self.configuration_label_box=builder.get_object("configuration_label_box")
193                self.folder_fcb=builder.get_object("folder_fcb")
194                self.folder_fcb.connect("file-set",self.folder_fcb_changed)
195                self.local_folder_label=builder.get_object("local_folder_label")
196                self.destination_fcb=builder.get_object("destination_fcb")
197                self.destination_fcb.connect("file-set",self.destination_fcb_changed)
198                self.destination_label=builder.get_object("destination_label")
199                self.scrolledwindow=builder.get_object("scrolledwindow1")
200               
201                self.internet_rb=builder.get_object("internet_rb")
202                self.local_folder_rb=builder.get_object("local_folder_rb")
203                self.url_rb=builder.get_object("url_rb")
204                self.url_entry=builder.get_object("url_entry")
205               
206                self.arrow_eb.add_events(Gdk.EventMask.BUTTON_RELEASE_MASK )
207                self.arrow_eb.connect("button-release-event",self.arrow_clicked)
208               
209                self.update_eb=builder.get_object("update_eventbox")
210                self.update_eb.add_events(Gdk.EventMask.BUTTON_RELEASE_MASK | Gdk.EventMask.POINTER_MOTION_MASK | Gdk.EventMask.LEAVE_NOTIFY_MASK )
211                self.update_eb.connect("motion-notify-event",self.mouse_over_update)
212                self.update_eb.connect("leave_notify_event",self.mouse_exit_update)
213                self.update_eb.connect("button-release-event",self.update_clicked)
214               
215                self.export_eb=builder.get_object("export_eventbox")
216                self.export_eb.add_events(Gdk.EventMask.BUTTON_RELEASE_MASK | Gdk.EventMask.POINTER_MOTION_MASK | Gdk.EventMask.LEAVE_NOTIFY_MASK )
217                self.export_eb.connect("motion-notify-event",self.mouse_over_export)
218                self.export_eb.connect("leave_notify_event",self.mouse_exit_export)
219                self.export_eb.connect("button-release-event",self.export_clicked)
220               
221                self.configuration_eb=builder.get_object("configuration_eventbox")
222                self.configuration_eb.add_events(Gdk.EventMask.BUTTON_RELEASE_MASK | Gdk.EventMask.POINTER_MOTION_MASK | Gdk.EventMask.LEAVE_NOTIFY_MASK )
223                self.configuration_eb.connect("motion-notify-event",self.mouse_over_conf)
224                self.configuration_eb.connect("leave_notify_event",self.mouse_exit_conf)
225                self.configuration_eb.connect("button-release-event",self.conf_clicked)
226               
227               
228                self.configuration_box=builder.get_object("configuration_box")
229                self.configuration_header_box=builder.get_object("configuration_header_box")
230                self.configuration_arrow_eb=builder.get_object("configuration_arrow_eventbox")
231                self.configuration_arrow_eb.add_events(Gdk.EventMask.BUTTON_RELEASE_MASK )
232                self.configuration_arrow_eb.connect("button-release-event",self.configuration_arrow_clicked)
233               
234                self.name_label=builder.get_object("name_label")
235                self.banner_label=builder.get_object("banner_label")
236                self.origin_label=builder.get_object("origin_label")
237                self.distributions_label=builder.get_object("distributions_label")
238                self.sections_label=builder.get_object("sections_label")
239                self.architectures_label=builder.get_object("architectures_label")
240                self.local_path_label=builder.get_object("local_path_label")
241                self.check_md5_label=builder.get_object("check_md5_label")
242                self.ign_gpg_label=builder.get_object("ign_gpg_label")
243                self.ign_release_label=builder.get_object("ign_release_label")
244               
245                self.name_entry=builder.get_object("name_entry")
246                self.banner_combobox=builder.get_object("banner_combobox")
247                self.origin_entry=builder.get_object("origin_entry")
248                self.distributions_entry=builder.get_object("distributions_entry")
249                self.sections_entry=builder.get_object("sections_entry")
250                self.i386_cb=builder.get_object("i386_checkbutton")
251                self.amd64_cb=builder.get_object("amd64_checkbutton")
252                self.mirror_path_entry=builder.get_object("mirror_path_entry")
253                self.check_md5_cb=builder.get_object("check_md5_checkbutton")
254                self.ign_gpg_cb=builder.get_object("ign_gpg_checkbutton")
255                self.ign_release_cb=builder.get_object("ign_release_checkbutton")
256               
257               
258                self.save_button_box=builder.get_object("save_button_box")
259                self.save_eb=builder.get_object("save_eventbox")
260                self.save_eb.add_events(Gdk.EventMask.BUTTON_RELEASE_MASK | Gdk.EventMask.POINTER_MOTION_MASK | Gdk.EventMask.LEAVE_NOTIFY_MASK  )
261                self.save_eb.connect("button-release-event",self.save_button_clicked)
262                self.save_eb.connect("motion-notify-event",self.mouse_over_save)
263                self.save_eb.connect("leave_notify_event",self.mouse_exit_save)
264               
265                self.export_label=builder.get_object("export_label")
266                self.update_label=builder.get_object("update_label")
267                self.save_label=builder.get_object("save_label")
268                self.conf_label=builder.get_object("conf_label")
269                self.i386_label=builder.get_object("i386_label")
270                self.amd64_label=builder.get_object("amd64_label")
271               
272                self.update_header_label=builder.get_object("update_header_label")
273                self.export_header_label=builder.get_object("export_header_label")
274                self.internet_rb_label=builder.get_object("internet_rb_label")
275                self.internet_rb_label=builder.get_object("internet_rb_label")
276                self.local_folder_rb_label=builder.get_object("local_folder_rb_label")
277                self.url_rb_label=builder.get_object("url_rb_label")
278                self.destination_opt_label=builder.get_object("destination_opt_label")
279               
280               
281               
282                self.ib=builder.get_object("infobar1")
283                self.ib.connect("response",self.ib_response)
284                self.info_label=builder.get_object("info_label")
285               
286                self.main_content_box=Gtk.Grid()
287                self.main_content_box.set_column_homogeneous(True)
288                self.main_content_box.set_row_spacing(10)
289                self.main_content_box.set_margin_top(15)
290                self.main_content_box.set_margin_left(40)
291               
292                self.viewport=builder.get_object("viewport1")
293                self.viewport.add(self.main_content_box)
294               
295       
296                self.overlay=Gtk.Overlay()
297                self.overlay.add(self.list_box)
298                self.overlay.show_all()
299               
300                eb=Gtk.EventBox()
301                eb.add_events(Gdk.EventMask.BUTTON_RELEASE_MASK | Gdk.EventMask.POINTER_MOTION_MASK | Gdk.EventMask.LEAVE_NOTIFY_MASK  )
302                b=Gtk.Image()
303               
304                eb.connect("button-release-event",self.add_clicked)
305                eb.connect("motion-notify-event",self.add_mouse_over,b)
306                eb.connect("leave_notify_event",self.add_mouse_left,b)
307                b.set_from_file(ADD_IMAGE)
308                b.show()
309               
310                eb.add(b)
311               
312                eb.set_valign(Gtk.Align.END)
313                eb.set_halign(Gtk.Align.END)
314                eb.set_margin_bottom(45)
315                eb.set_margin_right(20)
316                self.overlay.add_overlay(eb)
317               
318               
319               
320                self.stack.add_titled(self.overlay, "main", "Main")
321                self.stack.add_titled(self.content_box, "mirror", "Mirror")
322                self.stack.add_titled(self.configuration_box,"configuration","Configuration")
323               
324               
325                self.banner_combo=builder.get_object("banner_combobox")
326                self.banner_store=Gtk.ListStore(GdkPixbuf.Pixbuf,str)
327               
328                for x in glob.glob(BANNERS_PATH+"*.png"):
329                        f_name=x.replace(BANNERS_PATH,"").split(".png")[0]
330                        image=Gtk.Image()
331                        image.set_from_file(x)
332                        pixbuf=image.get_pixbuf()
333                        pixbuf=pixbuf.scale_simple(64,64,GdkPixbuf.InterpType.BILINEAR)
334                        self.banner_store.append([pixbuf,f_name])
335                       
336                       
337                self.banner_combobox.set_model(self.banner_store)
338                txt_renderer=Gtk.CellRendererText()
339                pixbuf_renderer=Gtk.CellRendererPixbuf()
340               
341                self.banner_combobox.pack_start(pixbuf_renderer,True)
342                self.banner_combobox.add_attribute(pixbuf_renderer,"pixbuf",0)
343                self.banner_combobox.pack_start(txt_renderer,True)
344                self.banner_combobox.add_attribute(txt_renderer,"text",1)
345               
346               
347               
348               
349                self.window.add(self.stack)
350                self.window.show_all()
351                self.ib.hide()
352               
353                self.progress_da.connect("draw",self.draw_progress)
354                self.window.connect("destroy",self.quit)
355               
356                               
357                self.set_css_info()
358               
359               
360               
361                self.set_previous_values()
362               
363                self.parse_mirrors()
364                GObject.threads_init()
365                Gtk.main()
366               
367        #def start_gui
368       
369       
370        def set_css_info(self):
371               
372                css = """
373               
374                #BLUE_HEADER {
375                        background-image:-gtk-gradient (linear, left top, left bottom, from (#455A64),  to (#455A64));;
376                       
377                }
378               
379                #LIGHT_BLUE_BACKGROUND {
380                        background-image:-gtk-gradient (linear, left top, left bottom, from (#338fef),  to (#338fef));;
381                       
382                }
383               
384                #HEADER_SHADOW {
385                        background-image:-gtk-gradient (linear, left top, left bottom, from (#7b7b7b),  to (#ffffff));;
386               
387                }
388               
389               
390                #WHITE_BACKGROUND {
391                        background-image:-gtk-gradient (linear, left top, left bottom, from (#ffffff),  to (#ffffff));;
392               
393                }
394               
395                #RED_BACKGROUND {
396                        background-image:-gtk-gradient (linear, left top, left bottom, from (#cc0000),  to (#cc0000));;
397               
398                }
399               
400                #ORANGE_BACKGROUND {
401                        background-image:-gtk-gradient (linear, left top, left bottom, from (#ff6600),  to (#ff6600));;
402                }
403               
404                #LIGHT_RED_BACKGROUND {
405                        background-image:-gtk-gradient (linear, left top, left bottom, from (#ff2d2d),  to (#ff2d2d));;
406               
407                }
408               
409                #BUTTON_COLOR {
410                        background-image:-gtk-gradient (linear, left top, left bottom, from (#448AFF),  to (#448AFF));;
411                       
412               
413                }
414               
415                #DISABLED_BUTTON_OVER{
416                        background-image:-gtk-gradient (linear, left top, left bottom, from (#888888),  to (#888888));;
417                }
418               
419                #DISABLED_BUTTON{
420                        background-image:-gtk-gradient (linear, left top, left bottom, from (#666666),  to (#666666));;
421                }
422               
423                #CANCEL_BUTTON{
424                        background-image:-gtk-gradient (linear, left top, left bottom, from (#D32F2F),  to (#D32F2F));;
425                }
426               
427                #CANCEL_BUTTON_OVER{
428                        background-image:-gtk-gradient (linear, left top, left bottom, from (#F44336),  to (#F44336));;
429                }
430               
431                #SECTION_LABEL {
432                        font: Roboto 16;
433                }
434               
435               
436                #BUTTON_OVER_COLOR {
437                        background-image:-gtk-gradient (linear, left top, left bottom, from (#449fff),  to (#449fff));;
438                       
439               
440                }
441               
442                #BUTTON_LABEL{
443                        color:white;
444                        font: Roboto 10;
445                }
446               
447               
448                #WHITE_MIRROR_NAME {
449                        color: white;
450                        font: Roboto Medium 20;
451               
452                }
453               
454                #WHITE_EXTRA_INFO {
455                        color: white;
456                        font: Roboto Light 12;
457               
458                }
459               
460                #BLUE_FONT {
461                        color: #3366cc;
462                        font: Roboto 10;
463                       
464                }
465
466                #LABEL_OPTION{
467               
468                        color: #808080;
469                        font: Roboto 11;
470                }
471               
472
473               
474               
475
476                """
477               
478                self.style_provider=Gtk.CssProvider()
479                self.style_provider.load_from_data(css)
480                Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(),self.style_provider,Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
481               
482                self.mirror_header_box.set_name("BLUE_HEADER")
483                self.main_header_box.set_name("BLUE_HEADER")
484                self.update_label_box.set_name("BUTTON_COLOR")
485                self.export_label_box.set_name("BUTTON_COLOR")
486                self.save_button_box.set_name("BUTTON_COLOR")
487                self.configuration_header_box.set_name("BLUE_HEADER")
488                self.configuration_label_box.set_name("BUTTON_COLOR")
489               
490                self.mirror_name_label.set_name("WHITE_MIRROR_NAME")
491                self.llx_mirror_label.set_name("WHITE_MIRROR_NAME")
492                self.conf_mirror_name_label.set_name("WHITE_MIRROR_NAME")
493                self.arch_label.set_name("WHITE_EXTRA_INFO")
494                self.shadow_box.set_name("HEADER_SHADOW")
495                self.shadow_box1.set_name("HEADER_SHADOW")
496                self.shadow_box2.set_name("HEADER_SHADOW")
497                self.content_box.set_name("WHITE_BACKGROUND")
498                self.list_box.set_name("WHITE_BACKGROUND")
499                self.configuration_box.set_name("WHITE_BACKGROUND")
500               
501                self.name_label.set_name("LABEL_OPTION")
502                self.banner_label.set_name("LABEL_OPTION")
503                self.origin_label.set_name("LABEL_OPTION")
504                self.distributions_label.set_name("LABEL_OPTION")
505                self.sections_label.set_name("LABEL_OPTION")
506                self.architectures_label.set_name("LABEL_OPTION")
507                self.local_path_label.set_name("LABEL_OPTION")
508                self.check_md5_label.set_name("LABEL_OPTION")
509                self.ign_gpg_label.set_name("LABEL_OPTION")
510                self.ign_release_label.set_name("LABEL_OPTION")
511       
512                self.update_label.set_name("BUTTON_LABEL")
513                self.export_label.set_name("BUTTON_LABEL")
514                self.save_label.set_name("BUTTON_LABEL")
515                self.conf_label.set_name("BUTTON_LABEL")
516               
517                self.url_entry.set_name("BLUE_FONT")
518                self.name_entry.set_name("BLUE_FONT")
519                self.origin_entry.set_name("BLUE_FONT")
520                self.distributions_entry.set_name("BLUE_FONT")
521                self.sections_entry.set_name("BLUE_FONT")
522                self.mirror_path_entry.set_name("BLUE_FONT")
523                self.i386_label.set_name("BLUE_FONT")
524                self.amd64_label.set_name("BLUE_FONT")
525               
526                self.update_header_label.set_name("SECTION_LABEL")
527                self.export_header_label.set_name("SECTION_LABEL")
528               
529                self.internet_rb_label.set_name("LABEL_OPTION")
530                self.local_folder_rb_label.set_name("LABEL_OPTION")
531                self.url_rb_label.set_name("LABEL_OPTION")
532                self.destination_opt_label.set_name("LABEL_OPTION")
533               
534                self.local_folder_label.set_name("BLUE_FONT")
535                self.destination_label.set_name("BLUE_FONT")
536               
537        #def set_css
538       
539        def set_mirror_info(self,mirror_button):
540
541                self.url_entry.set_text(mirror_button.info["LAST_URL"])
542                if len(mirror_button.info["NAME"]) < 22 :
543                        self.mirror_name_label.set_text(mirror_button.info["NAME"])
544                        self.conf_mirror_name_label.set_text(mirror_button.info["NAME"])
545                        self.mirror_name_label.set_tooltip_text("")
546                        self.conf_mirror_name_label.set_tooltip_text("")
547                else:
548                        self.mirror_name_label.set_text(mirror_button.info["NAME"][0:19]+"...")
549                        self.mirror_name_label.set_tooltip_text(mirror_button.info["NAME"])
550                        self.conf_mirror_name_label.set_tooltip_text(mirror_button.info["NAME"])       
551                        self.conf_mirror_name_label.set_text(mirror_button.info["NAME"][0:19]+"...")
552               
553               
554               
555               
556                self.arch_label.set_text(", ".join(mirror_button.info["ARCHITECTURES"]))
557               
558                if mirror_button.info["LAST_UPDATE_OPTION"]==1:
559                        self.internet_rb.set_active(True)
560                       
561                if mirror_button.info["LAST_UPDATE_OPTION"]==2:
562                        self.local_folder_rb.set_active(True)
563                       
564                if mirror_button.info["LAST_UPDATE_OPTION"]==3:
565                        self.url_rb.set_active(True)
566               
567                self.name_entry.set_text(mirror_button.info["NAME"])
568               
569                c=0
570               
571                for i in self.banner_store:
572                        if i[1]==mirror_button.info["BANNER"]:
573                                break
574                        c+=1
575                       
576                self.banner_combobox.set_active(c)
577                       
578                       
579               
580                self.origin_entry.set_text(mirror_button.info["LLIUREX_ORIG"])
581                self.distributions_entry.set_text(", ".join(mirror_button.info["DISTROS"]))
582                self.sections_entry.set_text(", ".join(mirror_button.info["SECTIONS"]))
583                self.i386_cb.set_active("i386" in mirror_button.info["ARCHITECTURES"])
584                self.amd64_cb.set_active("amd64" in mirror_button.info["ARCHITECTURES"])
585                self.mirror_path_entry.set_text(mirror_button.info["MIRRORPATH"])
586               
587                self.check_md5_cb.set_active(mirror_button.info["CHK_MD5"]==1)
588                self.ign_gpg_cb.set_active(mirror_button.info["IGN_GPG"]==1)
589                self.ign_release_cb.set_active(mirror_button.info["IGN_RELEASE"]==1)
590               
591                self.progress_label.set_text("")
592               
593                self.current_mirror=mirror_button
594               
595               
596                if self.updating_mirror!=None:
597                        if self.current_mirror!=self.updating_mirror and self.updating_mirror.info["updating"]:
598                                self.update_label_box.set_name("DISABLED_BUTTON")
599                                self.update_label.set_text("Update")
600                        if self.current_mirror==self.updating_mirror:
601                               
602                                if self.updating_mirror.info["updating"]:
603                                        self.update_label.set_text("Cancel")
604                                        self.update_label_box.set_name("CANCEL_BUTTON")
605                               
606               
607                return True
608               
609        #def set_mirror_info
610
611
612        def parse_mirrors(self):
613               
614                self.mirrors={}
615               
616                once=True
617               
618                for t in range(0,1):
619               
620                        for m_file in glob.glob(MIRROR_CONF_DIR+"*"):
621                               
622                                f=open(m_file,"r")
623                                data=json.load(f)
624                                f.close()
625                                m=MirrorButton(data)
626
627                                if once:
628                                       
629                                        if m.info["updating"]:
630                                                if once:
631                                                        GLib.timeout_add(5,self.update_mirror_button_animation,m)
632                                                        once=False
633                                                               
634                                else:
635                                               
636                                        m.info["updating"]=False
637                                       
638                                       
639                                self.mirrors[m_file.split("/")[-1]]=m
640                                self.add_mirror_button(m)
641               
642                '''                     
643               
644                for m_file in glob.glob(MIRROR_CONF_DIR+"*"):
645                       
646                        f=open(m_file,"r")
647                        data=json.load(f)
648                        f.close()
649                               
650                        m=MirrorButton(data)
651                               
652                        if once:
653                               
654                                if m.info["updating"]:
655                                        if once:
656                                                GLib.timeout_add(5,self.update_mirror_button_animation,m)
657                                                once=False
658                                                       
659                        else:
660                                       
661                                m.info["updating"]=False
662                               
663                        self.mirrors.append(m)
664                        self.add_mirror_button(m)
665               
666               
667                       
668                for m_file in glob.glob(MIRROR_CONF_DIR+"*"):
669                       
670                        f=open(m_file,"r")
671                        data=json.load(f)
672                        f.close()
673                               
674                        m=MirrorButton(data)
675                               
676                        if once:
677                               
678                                if m.info["updating"]:
679                                        if once:
680                                                GLib.timeout_add(5,self.update_mirror_button_animation,m)
681                                                once=False
682                                                       
683                        else:
684                                       
685                                m.info["updating"]=False
686                               
687                        self.mirrors.append(m)
688                        self.add_mirror_button(m)
689                '''     
690                return True
691               
692        #def parse_mirrors
693       
694
695        def set_previous_values(self):
696               
697                #self.folder_fcb.set_filename("/home/cless")
698                #self.local_folder_label.set_text("/home/cless")
699               
700                #self.destination_fcb.set_filename("/home/cless")
701                #self.destination_label.set_text("/home/cless")
702               
703                pass
704               
705        #def set_previous_values
706       
707        def set_info_text(self,txt,message_type=Gtk.MessageType.INFO):
708               
709                self.ib.set_message_type(message_type)
710                self.info_label.set_text(txt)
711                self.ib.show()
712               
713        #def set_info_text
714       
715        def show_content(self,widget):
716               
717                self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT)
718                self.stack.set_visible_child_name("mirror")
719               
720               
721        #show_content
722       
723        def add_mirror_button(self,mirror_button):
724               
725                #print mirror_button.info
726               
727                da=Gtk.DrawingArea()
728                da.set_size_request(140,148)
729                da.add_events(Gdk.EventMask.POINTER_MOTION_MASK | Gdk.EventMask.LEAVE_NOTIFY_MASK | Gdk.EventMask.BUTTON_PRESS_MASK )
730               
731                da.connect("draw",self.draw_button,mirror_button)
732                da.connect("motion-notify-event",self.mouse_over,mirror_button)
733                da.connect("leave_notify_event",self.mouse_left,mirror_button)
734                da.connect("button-press-event",self.mirror_button_clicked,mirror_button)
735               
736                da.size_request()
737               
738                da.show()
739               
740                mirror_button.info["da"]=da
741               
742                self.main_content_box.attach(da,self.current_grid_width,self.current_grid_height,1,1)
743               
744                self.current_grid_width+=1
745               
746                if self.current_grid_width > self.max_grid_width:
747                        self.current_grid_width=0
748                        self.current_grid_height+=1
749                       
750        #def add_mirror_button
751       
752
753        def add_clicked(self,widget,event):
754               
755                print "add clicked"
756               
757                self.add_flag=True
758       
759                info={}
760               
761                info["LAST_URL"]=""
762                info["NAME"]=""
763                info["ARCHITECTURES"]=""
764                info["LAST_UPDATE_OPTION"]=""
765                info["BANNER"]=""
766                info["LLIUREX_ORIG"]=""
767                info["DISTROS"]=""
768                info["SECTIONS"]=""
769                info["MIRRORPATH"]=""
770                info["CHK_MD5"]=""
771                info["IGN_GPG"]=""
772                info["IGN_RELEASE"]=""
773               
774               
775                mirror=MirrorButton(info)
776                mirror.info["updating"]=False
777               
778                self.set_mirror_info(mirror)
779                self.banner_combobox.set_active(0)
780                self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT)
781                self.stack.set_visible_child_name("configuration")
782               
783               
784               
785        #def add_clicked
786       
787        def add_mouse_over(self,widget,event,i):
788               
789                i.set_from_file(ADD_IMAGE_OVER)
790               
791        #def add_mouse_over
792       
793       
794        def add_mouse_left(self,widget,event,i):
795               
796                i.set_from_file(ADD_IMAGE)
797               
798        #def add_mouse_over
799       
800       
801
802        def ib_response(self,widget,response):
803
804                self.ib.hide()
805               
806        #
807       
808        def folder_fcb_changed(self,widget):
809               
810               
811                self.local_folder_label.set_text(self.folder_fcb.get_filename())
812               
813        #def
814       
815        def destination_fcb_changed(self,widget):
816               
817               
818                self.destination_label.set_text(self.destination_fcb.get_filename())
819               
820        #def
821       
822       
823        def configuration_arrow_clicked(self,widget,event):
824               
825                self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_RIGHT)
826                if self.add_flag:
827                        self.stack.set_visible_child_name("main")
828                        self.add_flag=False
829                        return True
830                       
831                self.stack.set_visible_child_name("mirror")
832               
833               
834        #def arrow_clicked
835       
836       
837        def arrow_clicked(self,widget,event):
838               
839                self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_RIGHT)
840                self.stack.set_visible_child_name("main")
841               
842               
843        #def arrow_clicked
844
845       
846        def mouse_over_update(self,widget,event):
847               
848                if self.updating_mirror!=None:
849                        if self.current_mirror!=self.updating_mirror and self.updating_mirror.info["updating"]:
850                                self.update_label_box.set_name("DISABLED_BUTTON_OVER")
851                                return True
852                       
853                        if self.current_mirror==self.updating_mirror and self.updating_mirror.info["updating"]:
854                                self.update_label_box.set_name("CANCEL_BUTTON_OVER")
855                                return True
856                       
857                self.update_label_box.set_name("BUTTON_OVER_COLOR")
858               
859        #def mouse_over_event
860       
861        def mouse_exit_update(self,widget,event):
862               
863                if self.updating_mirror!=None:
864                        if self.current_mirror!=self.updating_mirror and self.updating_mirror.info["updating"]:
865                                self.update_label_box.set_name("DISABLED_BUTTON")
866                                return True
867                        if self.current_mirror==self.updating_mirror and self.updating_mirror.info["updating"]:
868                                self.update_label_box.set_name("CANCEL_BUTTON")
869                                return True
870               
871                self.update_label_box.set_name("BUTTON_COLOR")
872               
873        #def mouse left_update
874       
875        def update_clicked(self,widget,event):
876               
877                print "Update clicked"
878       
879                self.current_mirror.info["cancelled"]=False
880               
881                if self.updating_mirror!=None:
882                        if self.current_mirror!=self.updating_mirror and self.updating_mirror.info["updating"]:
883                                self.set_info_text("'%s' is already updating."%self.updating_mirror.info["NAME"],Gtk.MessageType.ERROR)
884                                return False
885               
886                if self.internet_rb.get_active():
887                        print "INTERNET"
888               
889                if self.local_folder_rb.get_active():
890                        print "LOCAL_FOLDER: %s"%self.folder_fcb.get_filename()
891                       
892                if self.url_rb.get_active():
893                        print "URL: %s"%self.url_entry.get_text()
894               
895               
896                if not self.current_mirror.info["updating"]:
897                        self.percentage=0
898                        self.updating_mirror=self.current_mirror
899                        self.current_mirror.info["updating"]=True
900                        GLib.timeout_add(20,self.update_ys)
901                        GLib.timeout_add(50,self.update_percentage)
902                        GLib.timeout_add(10,self.update_degree)
903                       
904                       
905                        GLib.timeout_add(5,self.update_mirror_button_animation,self.updating_mirror)
906                        self.update_label.set_text("Cancel")
907                        self.update_label_box.set_name("CANCEL_BUTTON_OVER")
908
909                       
910                else:
911                       
912                        self.updating_mirror.info["updating"]=False
913                        self.updating_mirror.info["cancelled"]=True
914                        self.update_label.set_text("Update")
915                        self.update_label_box.set_name("BUTTON_COLOR")
916
917        #def update_clicked
918
919       
920        def mouse_over_export(self,widget,event):
921               
922                self.export_label_box.set_name("BUTTON_OVER_COLOR")
923               
924        #def mouse_over_event
925       
926        def mouse_exit_export(self,widget,event):
927               
928                self.export_label_box.set_name("BUTTON_COLOR")
929               
930        #def mouse left_update
931       
932        def export_clicked(self,widget,event):
933               
934                print "Export clicked: %s"%self.destination_fcb.get_filename()
935               
936                self.set_info_text("ajklshdjklasdajklsdh")
937               
938        #def update_clicked
939               
940
941        def mouse_over_conf(self,widget,event):
942               
943                self.configuration_label_box.set_name("BUTTON_OVER_COLOR")
944               
945        #def mouse_over_event
946       
947        def mouse_exit_conf(self,widget,event):
948               
949                self.configuration_label_box.set_name("BUTTON_COLOR")
950               
951        #def mouse left_update
952       
953        def conf_clicked(self,widget,event):
954               
955                print "Configuration clicked"
956                self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT)
957                self.stack.set_visible_child_name("configuration")
958               
959        #def update_clicked
960
961        def mirror_button_clicked(self,widget,event,mirror_button):
962               
963                self.set_mirror_info(mirror_button)
964                self.show_content(None)
965               
966        #def button_clicked
967       
968        def mouse_over_save(self,widget,event):
969               
970                self.save_button_box.set_name("BUTTON_OVER_COLOR")
971               
972        #def mouse_over_event
973       
974        def mouse_exit_save(self,widget,event):
975               
976                self.save_button_box.set_name("BUTTON_COLOR")
977               
978        #def mouse left_update
979       
980       
981        def save_button_clicked(self,widget,event):
982               
983                self.current_mirror.info["NAME"]=self.name_entry.get_text()
984               
985                self.current_mirror.info["BANNER"]=self.banner_store[self.banner_combobox.get_active()][1]
986               
987                # internal info based on banner name
988                if os.path.exists(BANNERS_PATH+self.current_mirror.info["BANNER"]+".png"):
989                        self.current_mirror.info["image"]=BANNERS_PATH+self.current_mirror.info["BANNER"]+".png"
990                else:
991                        self.current_mirror.info["image"]=UNKNOWN_BANNER
992                #
993               
994                self.label_image.queue_draw()
995                self.label_image1.queue_draw()
996               
997               
998                self.current_mirror.info["LLIUREX_ORIG"]=self.origin_entry.get_text()
999               
1000                self.current_mirror.info["DISTROS"]=[]
1001                for item in self.distributions_entry.get_text().split(","):
1002                       
1003                        item=item.lstrip(" ").rstrip(" ")
1004                        self.current_mirror.info["DISTROS"].append(item)
1005               
1006                self.current_mirror.info["SECTIONS"]=[]
1007                for item in self.sections_entry.get_text().split(","):
1008                       
1009                        item=item.lstrip(" ").rstrip(" ")
1010                        self.current_mirror.info["SECTIONS"].append(item)
1011                       
1012                self.current_mirror.info["ARCHITECTURES"]=[]
1013                if self.i386_cb.get_active():
1014                        self.current_mirror.info["ARCHITECTURES"].append("i386")
1015                if self.amd64_cb.get_active():
1016                        self.current_mirror.info["ARCHITECTURES"].append("amd64")
1017               
1018                self.current_mirror.info["MIRRORPATH"]=self.mirror_path_entry.get_text()
1019               
1020                self.current_mirror.info["IGN_GPG"]=0
1021                if self.ign_gpg_cb.get_active():
1022                        self.current_mirror.info["IGN_GPG"]=1
1023               
1024                self.current_mirror.info["IGN_RELEASE"]=0
1025                if self.ign_release_cb.get_active():
1026                        self.current_mirror.info["IGN_RELEASE"]=1
1027               
1028                self.current_mirror.info["CHK_MD5"]=0
1029                if self.check_md5_cb.get_active():
1030                        self.current_mirror.info["CHK_MD5"]=1
1031
1032                self.set_mirror_info(self.current_mirror)
1033               
1034                if self.add_flag:
1035                       
1036                        self.mirrors[str(random.random())]=self.current_mirror
1037                        self.add_mirror_button(self.current_mirror)
1038                        self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_RIGHT)
1039                        self.stack.set_visible_child_name("mirror")
1040                       
1041                        self.add_flag=False
1042               
1043        #def save_button_clicked
1044
1045       
1046        def update_mirror_button_animation(self,mirror_button):
1047               
1048                mirror_button.info["degree_offset"]+=1
1049               
1050                if self.updating_mirror.info["updating"]:
1051                        return True
1052               
1053        #def update_mirror_animation
1054
1055
1056        def update_ys(self):
1057               
1058                self.wave_xoffset-=1
1059                self.wave_xoffset2+=2
1060                self.wave_xoffset3+=1
1061               
1062                self.progress_da.queue_draw()
1063
1064                if self.updating_mirror.info["updating"]:
1065               
1066                        return True
1067               
1068        #def update_ys
1069
1070               
1071        def update_percentage(self):
1072               
1073                if self.updating_mirror.info["updating"]:
1074               
1075                        if self.percentage<99:
1076                                self.percentage+=1
1077                        else:
1078                                self.percentage=0
1079                       
1080                        if self.current_mirror==self.updating_mirror and self.updating_mirror.info["updating"]:
1081                               
1082                                self.progress_label.set_text(str(self.percentage) + "%")
1083                       
1084                        return True
1085               
1086        #def update_percentage
1087
1088               
1089        def update_degree(self):
1090               
1091                self.degree_offset+=1
1092               
1093                if self.degree_offset==360:
1094                        self.dregree_offset=0
1095               
1096                if self.updating_mirror.info["updating"]:
1097                       
1098                        self.updating_mirror.info["da"].queue_draw()
1099                       
1100                        return True
1101               
1102        #def update_degree
1103       
1104
1105        def draw_label(self,widget,ctx):
1106               
1107               
1108                ctx.move_to(0,0)
1109                img=cairo.ImageSurface.create_from_png(self.current_mirror.info["image"])
1110                ctx.set_source_surface(img,(140-116)/-2,(140-116)/-2)
1111                ctx.paint()
1112               
1113                ctx.set_source_rgba(69/255.0,90/255.0,100/255.0,1)
1114                ctx.rectangle(0,0,116,116)
1115                ctx.arc_negative(self.circle["x"],self.circle["y"],self.circle["radius"]*0.9,self.to_rad(360),self.to_rad(0))
1116                ctx.set_fill_rule(cairo.FILL_RULE_EVEN_ODD)
1117                ctx.fill()
1118               
1119                ctx.set_fill_rule(cairo.FILL_RULE_WINDING)
1120                ctx.set_source_rgba(1,1,1,1)
1121                ctx.set_line_width(1)
1122                ctx.arc(self.circle["x"],self.circle["y"],self.circle["radius"]*0.9,self.to_rad(0),self.to_rad(360))
1123                ctx.stroke()
1124               
1125        #def draw
1126
1127       
1128        def draw_progress(self,widget,ctx):
1129
1130
1131                if self.current_mirror==self.updating_mirror and self.updating_mirror.info["updating"]:
1132                        percentage=self.percentage
1133                else:
1134                        percentage=110
1135
1136                ctx.set_source_rgba(1,1,1,1)
1137                ctx.rectangle(0,0,self.frame_size,self.frame_size)
1138                ctx.fill()
1139               
1140                ctx.move_to(0,self.frame_size)
1141
1142               
1143
1144                ctx.set_source_rgba(self.update_water_colors[0].r,self.update_water_colors[0].g,self.update_water_colors[0].b,1)
1145                self.wave_yoffset=self.frame_size-(self.frame_size - (self.circle["radius"]*2))/2 - 7  - self.circle["radius"]*2*percentage/100
1146               
1147                first=True
1148                for x in range(0,self.frame_size + 1):
1149                       
1150                        y=self.get_wave_y(x,2)
1151                        if y>self.frame_size:
1152                                y=self.frame_size
1153                        if first:
1154                                fy=y
1155                                first=False
1156                        ctx.line_to(x,y)
1157               
1158                ctx.line_to(x,self.frame_size)
1159                ctx.line_to(0,self.frame_size)
1160                ctx.fill()
1161               
1162                               
1163                ctx.set_source_rgba(self.update_water_colors[1].r,self.update_water_colors[1].g,self.update_water_colors[1].b,1)
1164                self.wave_yoffset=self.frame_size-(self.frame_size - (self.circle["radius"]*2))/2 - 5  - self.circle["radius"]*2*percentage/100
1165               
1166                first=True
1167                for x in range(0,self.frame_size + 1):
1168                       
1169                        y=self.get_wave_y(x,1)
1170                        if y>self.frame_size:
1171                                y=self.frame_size
1172                        if first:
1173                                fy=y
1174                                first=False
1175                        ctx.line_to(x,y)
1176               
1177                ctx.line_to(x,self.frame_size)
1178                ctx.line_to(0,self.frame_size)
1179                ctx.fill()
1180               
1181                               
1182                ctx.set_source_rgba(self.update_water_colors[2].r,self.update_water_colors[2].g,self.update_water_colors[2].b,1)
1183                self.wave_yoffset=self.frame_size- (self.frame_size - (self.circle["radius"]*2))/2  - 2  - self.circle["radius"]*2*percentage/100
1184               
1185                first=True
1186               
1187                for x in range(0,self.frame_size + 1):
1188                       
1189                        y=self.get_wave_y(x)
1190                       
1191                        if y>self.frame_size:
1192                                y=self.frame_size
1193                       
1194                        if first:
1195                                fy=y
1196                                first=False
1197                               
1198                       
1199                        ctx.line_to(x,y)
1200               
1201                ctx.line_to(x,self.frame_size)
1202                ctx.line_to(0,self.frame_size)
1203                ctx.fill()
1204               
1205               
1206               
1207                r2 = cairo.RadialGradient(0, 40, 1,0, 50, 100)
1208                r2.add_color_stop_rgb(0,self.update_water_colors[3].r,self.update_water_colors[3].g,self.update_water_colors[3].b)
1209                r2.add_color_stop_rgb(1, self.update_water_colors[4].r,self.update_water_colors[4].g,self.update_water_colors[4].b)
1210                ctx.set_source(r2)
1211                self.wave_yoffset=self.frame_size -  (self.frame_size - (self.circle["radius"]*2))/2   - self.circle["radius"]*2*percentage/100
1212               
1213                first=True
1214               
1215                for x in range(0,self.frame_size + 1):
1216                       
1217                        y=self.get_wave_y(x)
1218                       
1219                        if y>self.frame_size:
1220                                y=self.frame_size
1221                       
1222                        if first:
1223                                fy=y
1224                                first=False
1225                               
1226                       
1227                        ctx.line_to(x,y)
1228               
1229                ctx.line_to(x,self.frame_size)
1230                ctx.line_to(0,self.frame_size)
1231                ctx.fill()
1232               
1233                ctx.set_source_rgba(69/255.0,90/255.0,100/255.0,1)
1234                ctx.rectangle(0,0,self.frame_size,self.frame_size)
1235                ctx.arc_negative(self.circle["x"],self.circle["y"],self.circle["radius"],self.to_rad(360),self.to_rad(0))
1236                ctx.set_fill_rule(cairo.FILL_RULE_EVEN_ODD)
1237                ctx.fill()
1238               
1239                ctx.set_fill_rule(cairo.FILL_RULE_WINDING)
1240                ctx.set_source_rgba(52/255.0,52/255.0,52/255.0,1)
1241                ctx.set_line_width(2)
1242                ctx.arc(self.circle["x"],self.circle["y"],self.circle["radius"],self.to_rad(0),self.to_rad(360))
1243                ctx.stroke()
1244               
1245                ctx.set_line_width(2)
1246                ctx.set_source_rgba(1,1,1,1)
1247                if self.current_mirror.info["cancelled"]:
1248                        ctx.set_source_rgba(1,0,0,1)
1249                ctx.arc(self.circle["x"],self.circle["y"],self.circle["radius"]+1,self.to_rad(0+self.degree_offset),self.to_rad(percentage*360/100+self.degree_offset))
1250                ctx.stroke()
1251               
1252        #
1253
1254
1255        def draw_button(self,widget,ctx,mirror_button):
1256               
1257                ctx.move_to(0,0)
1258                img=cairo.ImageSurface.create_from_png(SHADOW_BANNER)
1259                ctx.set_source_surface(img,0,mirror_button.info["shadow_start"])
1260                ctx.paint_with_alpha(mirror_button.info["shadow_alpha"])
1261               
1262                ctx.move_to(0,0)
1263                img=cairo.ImageSurface.create_from_png(mirror_button.info["image"])
1264                ctx.set_source_surface(img,0,0)
1265                ctx.paint()
1266               
1267                ctx.move_to(0,0)
1268                ctx.set_source_rgba(1,1,1,1)
1269                ctx.rectangle(0,110,140,30)
1270                ctx.fill()
1271               
1272                ctx.set_source_rgba(self.dark_gray.r,self.dark_gray.g,self.dark_gray.b,1)
1273               
1274                pctx = PangoCairo.create_layout(ctx)
1275               
1276                desc = Pango.font_description_from_string ("Roboto 9")
1277                pctx.set_font_description(desc)
1278                pctx.set_markup(mirror_button.info["NAME"])
1279                width=pctx.get_pixel_size()[0]
1280               
1281                if width > 130:
1282                        pctx.set_markup(mirror_button.info["NAME"][0:22]+"...")
1283                       
1284                       
1285               
1286                ctx.move_to(5,118)
1287                PangoCairo.show_layout(ctx, pctx)
1288               
1289               
1290               
1291               
1292                if mirror_button.info["updating"]:
1293                       
1294                        ctx.move_to(0,0)
1295                        ctx.set_source_rgba(0,0,0,0.5)
1296                        ctx.rectangle(0,0,140,110)
1297                        ctx.fill()
1298                       
1299                        ctx.arc(70,70-15,40,self.to_rad(0+mirror_button.info["degree_offset"]),self.to_rad(180+mirror_button.info["degree_offset"]))
1300                        x,y=ctx.get_current_point()
1301
1302                        r2 = cairo.RadialGradient(x, y, 10,x, y, 60)
1303                        r2.add_color_stop_rgba(0, 1,1,1,1)
1304                        r2.add_color_stop_rgba(1, 68/255.0, 159/255.0, 255/255.0,0)
1305                        ctx.set_line_width(8)
1306                        ctx.set_source(r2)
1307                       
1308                        ctx.stroke()
1309                       
1310                        ctx.set_line_width(1)
1311                       
1312                        ctx.set_source_rgba(1,1,1,1)
1313                        ctx.arc(x,y,4,self.to_rad(0),self.to_rad(360))
1314                        ctx.fill()
1315                       
1316                        if int(random.random()*100) > 35:
1317       
1318                                if len(mirror_button.info["random_lights"]) < mirror_button.info["max_random_lights"]:
1319                                       
1320                                        offset=int(random.random()*12)
1321                                       
1322                                        if offset > 6:
1323                                               
1324                                                offset=offset/-2
1325                                       
1326                                        mirror_button.info["random_lights"].append(LightPoint(x+offset,y,random.random()*2))
1327
1328                               
1329                        for i in range(len(mirror_button.info["random_lights"])-1,-1,-1):
1330                               
1331                                mirror_button.info["random_lights"][i].opacity-=0.02
1332                                if mirror_button.info["random_lights"][i].opacity <=0.0:
1333                                        mirror_button.info["random_lights"].pop(i)
1334                                        continue
1335                               
1336                                #ctx.set_source_rgba(1,1,1,mirror_button.info["random_lights"][i].opacity)
1337                                ctx.set_source_rgba(random.random(),1,1,mirror_button.info["random_lights"][i].opacity)
1338                                ctx.arc(mirror_button.info["random_lights"][i].x,mirror_button.info["random_lights"][i].y,mirror_button.info["random_lights"][i].radius,self.to_rad(0),self.to_rad(360))
1339                                #ctx.arc(mirror_button.info["random_lights"][i].x,mirror_button.info["random_lights"][i].y,random.random()*3,self.to_rad(0),self.to_rad(360))
1340                                ctx.fill()
1341       
1342        #def draw_button
1343
1344       
1345        def mouse_over(self,widget,event,mirror_button):
1346               
1347                #print mirror_button.info
1348                mirror_button.info["animation_active"]=False
1349                if mirror_button.info["shadow_alpha"] <0.3 :
1350                        mirror_button.info["shadow_alpha"]+=0.1
1351                        widget.queue_draw()
1352                        return True
1353                       
1354                return False
1355               
1356        #def mouse_over
1357
1358       
1359        def mouse_left(self,widget,event,mirror_button):
1360               
1361                if not mirror_button.info["animation_active"]:
1362                       
1363                        mirror_button.info["animation_active"]=True
1364                        GLib.timeout_add(10,self.restore_shadow_alpha,mirror_button,widget)
1365                       
1366        #def mouse_left
1367
1368       
1369        def restore_shadow_alpha(self,mirror_button,widget):
1370
1371                if mirror_button.info["shadow_alpha"] >=0.2 :
1372                        mirror_button.info["shadow_alpha"]-=0.1
1373                        widget.queue_draw()
1374                        return True
1375                       
1376                mirror_button.info["animation_active"]=False
1377                return False
1378               
1379        #def  restore_shadow_alpha
1380       
1381
1382        def to_rad(self,degree):
1383               
1384                return degree * (pi/180)
1385               
1386        #def to_rad
1387       
1388       
1389        def get_wave_y(self,x,wtype=0):
1390               
1391               
1392                x_offset=self.wave_xoffset
1393                amplitude=self.wave_amplitude
1394               
1395                if wtype==1:
1396                        x_offset=self.wave_xoffset2
1397                        amplitude=self.wave_amplitude2
1398                       
1399                if wtype==2:
1400                        x_offset=self.wave_xoffset3
1401                        amplitude=self.wave_amplitude3
1402               
1403                return amplitude * math.sin((2*pi / self.wave_lenght)*(x - x_offset)) + self.wave_yoffset
1404               
1405               
1406        #def get_wave_y
1407
1408
1409        def quit(self,widget):
1410               
1411                Gtk.main_quit()
1412       
1413        #def quit
1414
1415       
1416#class LliurexMirror
1417
1418lm=LliurexMirror()
1419
1420lm.start_gui()
Note: See TracBrowser for help on using the repository browser.