source: lliurex-java-panel/trunk/fuentes/install-files/usr/share/lliurex-java-panel/lliurex-java-panel.py @ 1992

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

added unknown banner

  • Property svn:executable set to *
File size: 23.3 KB
Line 
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3
4import gi
5gi.require_version('Gtk', '3.0')
6gi.require_version('PangoCairo', '1.0')
7
8import cairo
9import os
10import threading
11import ConfigParser
12import platform
13
14from math import pi
15
16from gi.repository import Gtk, Gdk, GObject, GLib, PangoCairo, Pango
17
18import signal
19signal.signal(signal.SIGINT, signal.SIG_DFL)
20
21
22import gettext
23gettext.textdomain('lliurex-java-panel')
24_ = gettext.gettext
25
26
27BASE_DIR="/usr/share/lliurex-java-panel/"
28RSRC_DIR=BASE_DIR+"rsrc/"
29SHADOW_BANNER=RSRC_DIR+"shadow.png"
30UNKNOWN_BANNER=RSRC_DIR+"unknown.png"
31BANNERS_PATH=BASE_DIR+"banners/"
32JAVAS_CONFIG_PATH=BASE_DIR+"supported-javas/"
33
34CURRENT_PLATFORM=platform.machine()
35
36class GridButton:
37       
38        def __init__(self,info):
39               
40                self.info=info
41                self.info["installed"]=False
42                self.info["shadow_alpha"]=0.1
43                self.info["animation_active"]=False
44                self.info["shadow_start"]=0
45               
46                if os.path.exists(BANNERS_PATH+self.info["pkg"]+".png"):
47                        self.info["image"]=BANNERS_PATH+self.info["pkg"]+".png"
48                else:
49                        self.info["image"]=UNKNOWN_BANNER
50               
51        #def init
52       
53       
54#class GridButton
55
56
57class ConfButton:
58       
59        def __init__(self,info):
60               
61                self.txt=info["txt"]
62                self.icon=info["icon"]
63                self.name=info["name"]
64                self.da=None
65                if "active" not in info:
66                        self.active=False
67                else:
68                        self.active=info["active"]
69               
70        #def
71
72#class ConfButton
73       
74       
75class Alternative(Gtk.RadioButton):
76
77        def __init__(self,label,command):
78               
79                Gtk.RadioButton.__init__(self, label)
80                self.command=command
81                #self.connect("toggled",self.alternative_toggled)
82               
83        def alternative_toggled(self,widget):
84               
85                if widget.get_active():
86                        print("* Executing %s ..."%self.command)
87                       
88                        os.system(self.command)
89               
90#def Alternative
91
92
93class ConfigurationParser:
94       
95        def __init__(self):
96                pass
97       
98        def load_plugin(self,path):
99       
100                try:
101                        config = ConfigParser.ConfigParser()
102                        config.optionxform=str
103                        config.read(path)
104                        if config.has_section("JAVA"):
105                                info={}
106                                info["pkg"]=config.get("JAVA","pkg")
107                                info["name"]=config.get("JAVA","name")
108                                info["cmd"]=config.get("JAVA","cmd")
109                                return GridButton(info)
110                               
111                except Exception as e:
112                        print e
113                        return None
114       
115       
116#class ConfigParser
117
118
119class CustomColor:
120       
121        def __init__(self,r,g,b):
122               
123                self.r=r/255.0
124                self.g=g/255.0
125                self.b=b/255.0
126
127class AwesomeTabs:
128       
129        def __init__(self):
130               
131                self.configuration_parser=ConfigurationParser()
132               
133                self.current_tab=-1
134                self.current_width=0
135                self.animation_left=False
136                self.animation_right=False
137               
138                self.current_red_width=0
139                self.current_red_pos=0
140                self.configuration_start=0
141               
142                self.first_run=True
143               
144                self.current_grid_width=0
145                self.current_grid_height=0
146               
147                self.max_grid_width=2
148               
149                self.dark_gray=CustomColor(130.0,151.0,161.0)
150                self.light_gray=CustomColor(185.0,195.0,195.0)
151               
152                self.green=CustomColor(74.0,166.,69.0)
153                self.light_green=CustomColor(88.0,208.0,86.0)
154               
155               
156                self.conf_light=CustomColor(49.0,55.0,66.0)
157                self.conf_dark=CustomColor(30.0,36.0,42.0)
158               
159                self.conf_light_shadow=CustomColor(107.0,116.0,137.0)
160                self.conf_dark_shadow=CustomColor(0,0,0)
161               
162                self.current_conf_height=0
163                self.conf_buttons=[]
164                self.start_gui()
165               
166               
167        #def init
168       
169       
170       
171        def start_gui(self):
172               
173                builder=Gtk.Builder()
174                glade_path=RSRC_DIR+"lliurex-java-panel.glade"
175                builder.add_from_file(glade_path)
176               
177                self.installers_eb=builder.get_object("installers_eventbox")
178                self.installers_eb.add_events(Gdk.EventMask.BUTTON_PRESS_MASK)
179                self.installers_eb.connect("button-press-event",self.label_clicked,0)
180               
181                self.configuration_eb=builder.get_object("configuration_eventbox")
182                self.configuration_eb.add_events(Gdk.EventMask.BUTTON_PRESS_MASK)
183                self.configuration_eb.connect("button-press-event",self.label_clicked,1)
184               
185                self.installers_label=builder.get_object("installers_label")
186                self.configuration_label=builder.get_object("configuration_label")
187                self.alternatives_label=builder.get_object("alternatives_label")
188               
189                self.top_divider_da=builder.get_object("top_divider_drawingarea")
190                self.bottom_divider_da=builder.get_object("bottom_divider_drawingarea")
191                #self.install_da.connect("draw",self.drawing_label_event,0)
192                self.top_divider_da.connect("draw",self.draw_top_divider)
193                self.bottom_divider_da.connect("draw",self.draw_bottom_divider)
194               
195                self.main_vp=builder.get_object("main_viewport")
196                self.close_eb=builder.get_object("close_eventbox")
197                self.close_da=builder.get_object("close_drawingarea")
198                self.close_eb.connect("button-press-event",self.quit)
199                self.close_da.connect("draw",self.draw_close_button)
200               
201               
202                self.stack = Gtk.Stack()
203                self.stack.set_transition_duration(1000)
204                self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT)
205               
206                self.installers_grid=builder.get_object("button_grid")
207                self.configuration_box=builder.get_object("configuration_box")
208               
209                '''
210                grid=GridButton("oracle-java6","Oracle Java 6")
211                self.add_grid_button(grid)
212               
213                grid=GridButton("oracle-java7","Oracle Java 7")
214                self.add_grid_button(grid)
215               
216                grid=GridButton("oracle-java8","Oracle Java 8")
217                self.add_grid_button(grid)
218               
219                grid=GridButton("openjdk6","Open JRE 6")
220                self.add_grid_button(grid)
221               
222                grid=GridButton("openjdk7","Open JRE 7")
223                self.add_grid_button(grid)
224                '''
225               
226                for item in sorted(os.listdir(JAVAS_CONFIG_PATH)):
227                        if os.path.isfile(JAVAS_CONFIG_PATH+item):
228                                gb=self.configuration_parser.load_plugin(JAVAS_CONFIG_PATH+item)
229                                if gb!=None:
230                                        self.add_grid_button(gb)
231                                       
232                               
233               
234               
235                self.stack.add_titled(self.installers_grid, "installers", "Installers")
236                self.stack.add_titled(self.configuration_box, "configuration", "Configuration")
237               
238                self.main_vp.add(self.stack)
239               
240                self.main_window=builder.get_object("main_window")
241                self.main_window.show_all()
242               
243                self.main_window.connect("destroy",self.quit)
244               
245               
246                self.progress_window=builder.get_object("progress_window")
247                self.pbar=builder.get_object("progressbar")
248                self.progress_window.set_transient_for(self.main_window)
249               
250                self.label_clicked(None,None,0)
251               
252                self.confbutton_grid=builder.get_object("confbutton_grid")
253               
254                info={}
255                info["txt"]="Control Panel"
256                info["icon"]=RSRC_DIR+"control_panel.png"
257                info["name"]="cpanel"
258                info["active"]=True
259               
260                self.add_conf_button(info)
261               
262                info["txt"]="Java Web Start"
263                info["icon"]=RSRC_DIR+"java_conf.png"
264                info["name"]="jws"
265                info["active"]=False
266               
267                self.add_conf_button(info)
268               
269                info["txt"]="Java Runtime\nEnvironment"
270                info["icon"]=RSRC_DIR+"java_conf.png"
271                info["name"]="jre"
272               
273                self.add_conf_button(info)
274               
275                info["txt"]="Firefox Plugin"
276                info["icon"]=RSRC_DIR+"firefox.png"
277                info["name"]="firefox"
278               
279                self.add_conf_button(info)
280               
281                self.configuration_box=builder.get_object("configuration_box")
282                self.alternatives_box=builder.get_object("alternatives_box")
283               
284                self.conf_stack=Gtk.Stack()
285                self.conf_stack.set_transition_duration(500)
286                self.conf_stack.set_transition_type(Gtk.StackTransitionType.UNDER_DOWN)
287               
288                self.alternatives_box.pack_start(self.conf_stack,True,True,0)
289               
290                self.build_cpanel_alternatives()
291                self.build_jws_alternatives()
292                self.build_jre_alternatives()
293                self.build_firefox_alternatives()
294
295                self.configuration_box.show_all()
296               
297                self.set_css_info()
298                GObject.threads_init()         
299                Gtk.main()
300               
301        #def
302       
303       
304        def set_css_info(self):
305               
306                css = """
307               
308                #BLUE {
309                        background-image:-gtk-gradient (linear, left top, left bottom, from (#0f72ff),  to (#0f72ff));;
310               
311                }
312               
313                #BLACK{
314                        background-image:-gtk-gradient (linear, left top, left bottom, from (#000000),  to (#000000));;
315               
316                }
317               
318               
319                #BACK_GRADIENT{
320                        background-image:-gtk-gradient (linear, left top, left bottom, from (#ffffff), to (#eceff3));;
321                }
322               
323                #WHITE {
324                        color: white;
325                        text-shadow: 0px 1px black;
326                }
327               
328                #MAIN_LABEL_ENABLED{
329                        color: #8297a1;
330                        font: Quattrocento Sans Bold 18;
331                }
332               
333                #ALTERNATIVES_LABEL{
334                        color: #8297a1;
335                        font: Quattrocento Sans Bold 12;
336                }
337               
338                #MAIN_LABEL_DISABLED{
339                        color: #c9d4e2;
340                        font: Quattrocento Sans Bold 18;
341                }
342               
343                #RED_PROGRESS{
344                       
345                        background-color: #FF0000;
346                        border: 0px;
347
348                }
349               
350                #DARK_BACK{
351                        background-color: #070809;
352                }
353               
354                #GREEN {
355                        background-image:-gtk-gradient (linear, left top, left bottom, from (#41ff70),  to (#41ff70));;
356               
357                }
358               
359                #ORANGE {
360                        background-image:-gtk-gradient (linear, left top, left bottom, from (#ff7f2a),  to (#ff7f2a));;
361               
362                }
363               
364                #LIGHTBLUE {
365                        -unico-border-gradient: -gtk-gradient (linear, left top, left bottom,
366                        from (shade (#ff0000, 0.68)),
367                        to (shade (#ff0000, 0.68)));
368               
369                }
370               
371
372
373                .radio#UNO {
374                  -gtk-icon-source: -gtk-scaled(url("/usr/share/lliurex-java-panel/rsrc/radio-unchecked.png"), url("/usr/share/lliurex-java-panel/rsrc/radio-unchecked.png")); }
375
376               
377               
378                .radio:checked#UNO {
379                  -gtk-icon-source: -gtk-scaled(url("/usr/share/lliurex-java-panel/rsrc/radio-checked.png"), url("/usr/share/lliurex-java-panel/rsrc/radio-checked.png")); }
380
381                GtkButton#UNO GtkLabel {
382                        color: #8297a1;
383                        font: Quattrocento Sans 11;
384                }
385
386
387                """
388                self.style_provider=Gtk.CssProvider()
389                self.style_provider.load_from_data(css)
390                Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(),self.style_provider,Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
391               
392                self.main_window.set_name("BACK_GRADIENT")
393                self.installers_label.set_name("MAIN_LABEL_ENABLED")
394                self.alternatives_label.set_name("ALTERNATIVES_LABEL")
395                self.configuration_label.set_name("MAIN_LABEL_DISABLED")
396                self.pbar.set_name("RED_PROGRESS")
397                self.confbutton_grid.set_name("DARK_BACK")
398               
399               
400        #def css_info
401
402       
403
404        def quit(self,widget,event=None):
405               
406                Gtk.main_quit()
407               
408        #def quit
409       
410        def execute(self,command):
411               
412                self.thread_ret=-1
413               
414                self.thread_ret=os.system(command)
415               
416        #def execute
417       
418       
419        def pulsate_pbar(self,grid_button,da):
420               
421                if self.t.is_alive():
422                       
423                        self.pbar.pulse()
424                       
425                       
426                if not self.t.is_alive():
427                        self.progress_window.hide()
428                        if self.thread_ret==0:
429                                grid_button.info["installed"]=True
430                        da.queue_draw()
431                       
432                return self.t.is_alive()
433       
434        #def pulsate_pbar
435
436       
437        def add_conf_button(self,info):
438               
439                cb=ConfButton(info)
440               
441                da=Gtk.DrawingArea()
442                da.set_size_request(110,123)
443                da.connect("draw",self.draw_configure_button,cb)
444                da.add_events(Gdk.EventMask.BUTTON_PRESS_MASK)
445                da.connect("button-press-event",self.conf_clicked,cb)
446                da.show()
447                self.confbutton_grid.attach(da,0,self.current_conf_height,1,1)
448                self.current_conf_height+=1
449                self.conf_buttons.append(cb)
450                cb.da=da
451               
452               
453        #deff add_conf_button
454       
455       
456        def build_cpanel_alternatives(self):
457       
458                tmp_box=Gtk.VBox()
459               
460                alternative_list=[]
461               
462                # build alternatives list here
463               
464                # ############### #
465               
466                # example list
467               
468                for x in range(0,4):
469               
470                        a=Alternative("CPANEL ALTERNATIVE #%s"%x,"command alternative cpanel #%s"%x)
471                        a.set_name("UNO")
472                        alternative_list.append(a)
473                        tmp_box.pack_start(a,False,False,15)
474                       
475                if len(alternative_list) > 0:
476                        for alternative in alternative_list[1:]:
477                                alternative.join_group(alternative_list[0])
478                               
479               
480               
481                for alternative in alternative_list:
482                        alternative.connect("toggled",alternative.alternative_toggled)
483                               
484                self.conf_stack.add_titled(tmp_box, "cpanel", "Control Panel")
485
486               
487        #def
488       
489       
490        def build_jws_alternatives(self):
491       
492                tmp_box=Gtk.VBox()
493               
494                alternative_list=[]
495               
496                # build alternatives list here
497               
498                # ############### #
499               
500                # example list
501               
502                for x in range(0,4):
503               
504                        a=Alternative("JWS ALTERNATIVE #%s"%x,"command alternative jws #%s"%x)
505                        a.set_name("UNO")
506                        alternative_list.append(a)
507                        tmp_box.pack_start(a,False,False,15)
508                       
509                if len(alternative_list) > 0:
510                        for alternative in alternative_list[1:]:
511                                alternative.join_group(alternative_list[0])
512                               
513                               
514                alternative_list[1].set_active(True)
515               
516                for alternative in alternative_list:
517                        alternative.connect("toggled",alternative.alternative_toggled)
518               
519                self.conf_stack.add_titled(tmp_box, "jws", "Java Web Start")
520
521               
522        #def
523       
524       
525        def build_jre_alternatives(self):
526       
527                tmp_box=Gtk.VBox()
528               
529                alternative_list=[]
530               
531                # build alternatives list here
532               
533                # ############### #
534               
535                # example list
536               
537                for x in range(0,4):
538               
539                        a=Alternative("JRE ALTERNATIVE #%s"%x,"command alternative jre #%s"%x)
540                        a.set_name("UNO")
541                        alternative_list.append(a)
542                        tmp_box.pack_start(a,False,False,15)
543                       
544                if len(alternative_list) > 0:
545                        for alternative in alternative_list[1:]:
546                                alternative.join_group(alternative_list[0])
547                               
548                               
549                alternative_list[2].set_active(True)
550
551                for alternative in alternative_list:
552                        alternative.connect("toggled",alternative.alternative_toggled)
553               
554               
555                self.conf_stack.add_titled(tmp_box, "jre", "JRE Selector")
556
557               
558        #def
559
560       
561        def build_firefox_alternatives(self):
562       
563                tmp_box=Gtk.VBox()
564               
565                alternative_list=[]
566               
567                # build alternatives list here
568               
569                # ############### #
570               
571                # example list
572               
573                for x in range(0,4):
574               
575                        a=Alternative("FIREFOX ALTERNATIVE #%s"%x,"command alternative firefox #%s"%x)
576                        a.set_name("UNO")
577                        alternative_list.append(a)
578                        tmp_box.pack_start(a,False,False,15)
579                       
580                if len(alternative_list) > 0:
581                        for alternative in alternative_list[1:]:
582                                alternative.join_group(alternative_list[0])
583                               
584                               
585                alternative_list[3].set_active(True)
586                for alternative in alternative_list:
587                        alternative.connect("toggled",alternative.alternative_toggled)
588               
589                self.conf_stack.add_titled(tmp_box, "firefox", "Firefox Alternatives")
590
591               
592        #def
593       
594        def add_grid_button(self,grid_button):
595               
596                da=Gtk.DrawingArea()
597                da.set_size_request(140,148)
598                da.add_events(Gdk.EventMask.POINTER_MOTION_MASK | Gdk.EventMask.LEAVE_NOTIFY_MASK | Gdk.EventMask.BUTTON_PRESS_MASK )
599               
600                da.connect("draw",self.draw_button,grid_button)
601                da.connect("motion-notify-event",self.mouse_over,grid_button)
602                da.connect("leave_notify_event",self.mouse_left,grid_button)
603                da.connect("button-press-event",self.button_clicked,grid_button)
604               
605               
606                #button.connect("motion-notify-event",self.mouse_over,app,image)
607                da.show()
608                self.installers_grid.attach(da,self.current_grid_width,self.current_grid_height,1,1)
609               
610                self.current_grid_width+=1
611               
612                if self.current_grid_width > self.max_grid_width:
613                        self.current_grid_width=0
614                        self.current_grid_height+=1
615                       
616        #def add_grid_button
617       
618       
619        def conf_clicked(self,widget,event,cb):
620               
621                for item in self.conf_buttons:
622                        item.active=False
623                        item.da.queue_draw()
624                       
625                cb.active=True
626               
627                self.conf_stack.set_visible_child_name(cb.name)
628                widget.queue_draw()
629               
630        #def conf_clicked
631       
632       
633        def button_clicked(self,widget,event,grid_button):
634               
635                self.t=threading.Thread(target=self.execute,args=(grid_button.info["cmd"],))
636                self.t.daemon=True
637                self.t.start()
638                GLib.timeout_add(100,self.pulsate_pbar,grid_button,widget)
639                self.progress_window.show()
640               
641               
642        #def button_clicked
643       
644       
645        def draw_configure_button(self,widget,ctx,cb):
646               
647                if cb.active:
648                        ctx.set_source_rgba(self.conf_light.r,self.conf_light.g,self.conf_light.b,1)
649                        ctx.rectangle(0,0,110,123)
650                        ctx.fill()
651                       
652                        ctx.set_source_rgba(1,0,0,1)
653                        ctx.move_to(0,0)
654                        ctx.rectangle(0,1,5,121)
655                        ctx.fill()
656                       
657                else:
658                        ctx.set_source_rgba(self.conf_dark.r,self.conf_dark.g,self.conf_dark.b,1)
659                        ctx.rectangle(0,0,110,123)
660                        ctx.fill()
661               
662               
663               
664                ctx.move_to(0,0)
665                ctx.set_source_rgba(self.conf_light_shadow.r,self.conf_light_shadow.g,self.conf_light_shadow.b,1)
666                ctx.rectangle(0,0,110,1)
667                ctx.fill()
668               
669                ctx.move_to(0,0)
670                ctx.set_source_rgba(self.conf_dark_shadow.r,self.conf_dark_shadow.g,self.conf_dark_shadow.b,1)
671                ctx.rectangle(0,121,110,2)
672                ctx.fill()
673               
674                ctx.move_to(0,0)
675                img=cairo.ImageSurface.create_from_png(cb.icon)
676                ctx.set_source_surface(img,33,22)
677                ctx.paint()
678               
679                pctx = PangoCairo.create_layout(ctx)
680                desc = Pango.font_description_from_string ("Quattrocento Sans Bold 10")
681                pctx.set_font_description(desc)
682                pctx.set_markup(cb.txt)
683                ctx.set_source_rgba(self.light_gray.r,self.light_gray.g,self.light_gray.b,1)
684                width=pctx.get_pixel_size()[0]
685                ctx.move_to((110-width)/2,80)
686                PangoCairo.show_layout(ctx, pctx)
687               
688        #def draw_configure_button
689       
690
691        def draw_button(self,widget,ctx,grid_button):
692               
693                ctx.move_to(0,0)
694                img=cairo.ImageSurface.create_from_png(SHADOW_BANNER)
695                ctx.set_source_surface(img,0,grid_button.info["shadow_start"])
696                ctx.paint_with_alpha(grid_button.info["shadow_alpha"])
697               
698                ctx.move_to(0,0)
699                img=cairo.ImageSurface.create_from_png(grid_button.info["image"])
700                ctx.set_source_surface(img,0,0)
701                ctx.paint()
702               
703                ctx.move_to(0,0)
704                ctx.set_source_rgba(1,1,1,1)
705                ctx.rectangle(0,110,140,30)
706                ctx.fill()
707               
708               
709                ctx.set_source_rgba(self.dark_gray.r,self.dark_gray.g,self.dark_gray.b,1)
710               
711                pctx = PangoCairo.create_layout(ctx)
712                desc = Pango.font_description_from_string ("Quattrocento Sans Bold 10")
713                pctx.set_font_description(desc)
714                pctx.set_markup(grid_button.info["name"])
715                ctx.move_to(5,118)
716                PangoCairo.show_layout(ctx, pctx)
717                width=pctx.get_pixel_size()[0]
718               
719               
720               
721                if grid_button.info["installed"]:
722               
723                        desc = Pango.font_description_from_string ("Quattrocento Sans Bold 8")
724                        pctx.set_font_description(desc)
725                        ctx.set_source_rgba(self.green.r,self.green.g,self.green.b,1)
726                        txt="Instal·lat"
727                        pctx.set_markup(txt)
728                        width=pctx.get_pixel_size()[0]
729                        ctx.move_to(140-width-5,120)
730                        PangoCairo.show_layout(ctx, pctx)
731                       
732                       
733                        #ctx.set_source_rgba(self.light_green.r,self.light_green.g,self.light_green.b,1)
734                        ctx.rectangle(5,139,130,1)
735                        ctx.fill()
736               
737               
738        #def draw_button
739       
740       
741        def drawing_label_event(self,widget,ctx,id):
742               
743                if id==self.current_tab:
744
745                        lg1 = cairo.LinearGradient(0.0,0.0, 300.0, 3.0)
746                        lg1.add_color_stop_rgba(0, 0, 1, 1, 0)
747                        lg1.add_color_stop_rgba(0.5, 0, 1, 1, 1)
748                        lg1.add_color_stop_rgba(1, 0, 1, 1, 0)
749                        ctx.rectangle(0, 0, 300, 3)
750                        ctx.set_source(lg1)
751                        ctx.fill()
752                       
753        #drawing_label_event
754       
755       
756        def draw_close_button(self,widget,ctx):
757               
758               
759                button_border=22
760               
761                pctx = PangoCairo.create_layout(ctx)
762                desc = Pango.font_description_from_string ("Quattrocento Sans Bold 12")
763                pctx.set_font_description(desc)
764               
765                pctx.set_markup(_("CLOSE"))
766                width=pctx.get_pixel_size()[0]
767                widget.set_size_request(width+button_border*2,30)
768               
769                ctx.set_source_rgba(1,1,0,1)
770                xx=0
771                yx=0
772                widthx=width+44
773                heightx=30
774                radius=5
775               
776                r=47.0
777                g=167.0
778                b=223.0
779                alpha=1.0
780               
781                r=r/255.0
782                g=g/255.0
783                b=b/255.0
784               
785                r2=83
786                g2=153
787                b2=252
788               
789                r2=r2/255.0
790                g2=g2/255.0
791                b2=b2/255.0
792               
793               
794                lg1 = cairo.LinearGradient(0.0,0.0, 90.0, 0)
795                lg1.add_color_stop_rgba(0, r, g, b, 1)
796                lg1.add_color_stop_rgba(1, r2, g2, b2, 1)
797                ctx.set_source(lg1)
798               
799               
800                ctx.move_to (xx + radius, yx);
801                ctx.arc (xx + widthx - radius, yx + radius, radius, pi * 1.5, pi * 2);
802                ctx.arc (xx + widthx - radius, yx + heightx - radius, radius, 0, pi * .5);
803                ctx.arc (xx + radius, yx + heightx - radius, radius, pi * .5, pi);
804                ctx.arc (xx + radius, yx + radius, radius, pi , pi * 1.5);
805                ctx.fill ();
806               
807                ctx.set_source_rgb(0.9,0.9,0.9)
808                ctx.move_to(button_border,7)
809                PangoCairo.show_layout(ctx, pctx)
810               
811        #def draw_close_button
812
813       
814        def draw_top_divider(self,widget,ctx):
815               
816                r=self.light_gray.r
817                g=self.light_gray.g
818                b=self.light_gray.b
819                alpha=1.0
820               
821               
822                ctx.set_source_rgba(r,g,b,alpha)
823                ctx.rectangle(0,1,510,3)
824                ctx.fill()
825               
826                width=0
827
828                if self.first_run:
829               
830                        pctx = PangoCairo.create_layout(ctx)
831                        desc = Pango.font_description_from_string ("Quattrocento Sans Bold 18")
832                        pctx.set_font_description(desc)
833                        pctx.set_markup("Installers")
834                        self.installers_width=pctx.get_pixel_size()[0]
835                        pctx.set_markup("Configuration")
836                        self.configuration_width=pctx.get_pixel_size()[0]
837                       
838                        self.first_run=False
839                       
840                if self.current_tab==0:
841                        width=self.installers_width
842                else:
843                        width=self.configuration_width
844                        self.configuration_start=469-width
845                       
846                ctx.set_source_rgba(1.0,0,0,alpha)
847               
848                               
849                if not self.animation_left and not self.animation_right:
850               
851                        if self.current_tab==0:
852                                ctx.rectangle(0,0,width,3)
853                               
854                                self.current_red_width=width
855                                self.current_red_start=0
856                               
857                        else:
858                                ctx.rectangle(469-width,0,width,3)
859                                self.current_red_width=width
860                                self.current_red_start=469-width
861                       
862                       
863                        ctx.fill()
864               
865                else:
866               
867                        ctx.rectangle(self.current_red_start,0,self.current_red_width,3)
868                        ctx.fill()
869               
870               
871        #def draw_top_divider
872       
873       
874        def draw_bottom_divider(self,widget,ctx):
875               
876                r=self.dark_gray.r
877                g=self.dark_gray.g
878                b=self.dark_gray.b
879                alpha=1.0
880               
881                ctx.set_source_rgba(r,g,b,alpha)
882                ctx.rectangle(0,1,500,3)
883                ctx.fill()
884               
885        #def draw_top_divider
886       
887       
888        def mouse_over(self,widget,event,grid_button):
889               
890                grid_button.info["animation_active"]=False
891                if grid_button.info["shadow_alpha"] <0.5 :
892                        grid_button.info["shadow_alpha"]+=0.1
893                        widget.queue_draw()
894                        return True
895                       
896                return False
897               
898        #def mouse_over
899
900       
901        def mouse_left(self,widget,event,grid_button):
902               
903                if not grid_button.info["animation_active"]:
904                       
905                        grid_button.info["animation_active"]=True
906                        GLib.timeout_add(10,self.restore_shadow_alpha,grid_button,widget)
907                       
908        #def mouse_over
909
910       
911        def restore_shadow_alpha(self,grid_button,widget):
912
913                if grid_button.info["shadow_alpha"] >0.2 :
914                        grid_button.info["shadow_alpha"]-=0.1
915               
916                       
917                        widget.queue_draw()
918                        return True
919                       
920                grid_button.info["animation_active"]=False
921                return False
922               
923        #def  restore_shadow
924       
925        def update_divider_right(self):
926               
927                if self.configuration_width > self.installers_width:
928               
929
930                        if self.current_red_width < self.configuration_width:
931                                self.current_red_width+=1
932                        if self.current_red_start < self.configuration_start:
933                                self.current_red_start+=1
934                       
935                       
936                        if self.current_red_width >= self.configuration_width and self.current_red_start >= self.configuration_start:
937                               
938                                self.animation_right=False
939                               
940                        self.top_divider_da.queue_draw()
941                       
942                else:
943                       
944                        if self.current_red_width > self.configuration_width:
945                                self.current_red_width-=1
946                        if self.current_red_start < self.configuration_start:
947                                self.current_red_start+=1
948                       
949                       
950                        if self.current_red_width <= self.configuration_width and self.current_red_start >= self.configuration_start:
951                               
952                                self.animation_right=False
953                               
954                        self.top_divider_da.queue_draw()
955               
956                return self.animation_right
957               
958        #def
959       
960        def update_divider_left(self):
961               
962               
963                if self.configuration_width > self.installers_width:
964
965                        if self.current_red_width > self.installers_width:
966                                self.current_red_width-=1
967                        if self.current_red_start > 0:
968                                self.current_red_start-=1
969                       
970                       
971                        if self.current_red_width <= self.installers_width and self.current_red_start <= 0:
972                               
973                                self.animation_left=False
974                               
975                        self.top_divider_da.queue_draw()
976                       
977                else:
978                       
979                        if self.current_red_width < self.installers_width:
980                                self.current_red_width+=1
981                        if self.current_red_start > 0:
982                                self.current_red_start-=1
983                       
984                       
985                        if self.current_red_width >= self.installers_width and self.current_red_start <= 0:
986                               
987                                self.animation_left=False
988                               
989                        self.top_divider_da.queue_draw()
990               
991                return self.animation_left
992               
993        #def
994       
995
996       
997        def label_clicked(self,widget,event,id):
998               
999                if id==0 and self.current_tab!=id:
1000                        try:
1001                               
1002                                self.stack.set_visible_child_name("installers")
1003                                self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT)
1004                                self.installers_label.set_name("MAIN_LABEL_ENABLED")
1005                                self.configuration_label.set_name("MAIN_LABEL_DISABLED")
1006                                if not self.first_run:
1007                                        self.animation_left=True
1008                                        self.animation_right=False
1009                                        GLib.timeout_add(1,self.update_divider_left)
1010                                       
1011                               
1012                        except Exception as e:
1013                                print e
1014               
1015                if id==1 and self.current_tab!=id:
1016                        try:
1017
1018                                self.stack.set_visible_child_name("configuration")
1019                                self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_RIGHT)
1020                                self.installers_label.set_name("MAIN_LABEL_DISABLED")
1021                                self.configuration_label.set_name("MAIN_LABEL_ENABLED")
1022                                self.animation_right=True
1023                                self.animation_left=False
1024                                GLib.timeout_add(1,self.update_divider_right)
1025                               
1026                        except:
1027                                pass
1028               
1029                self.current_tab=id
1030               
1031        #def label_clicked
1032       
1033
1034       
1035#awesome tabs
1036
1037if __name__=="__main__":
1038       
1039        at=AwesomeTabs()
Note: See TracBrowser for help on using the repository browser.