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

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

adding check info window

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