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

Last change on this file since 2039 was 2039, checked in by jrpelegrina, 3 years ago

Wip in banner and code

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