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

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

wip on new gui

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