source: lliurex-mirror/trunk/fuentes/lliurex-mirror-gui/usr/share/lliurex-mirror/lliurex-mirror.py @ 2643

Last change on this file since 2643 was 2643, checked in by hectorgh, 4 years ago

wip

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