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

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

Adding es.po file

  • Property svn:executable set to *
File size: 28.5 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 ControlPanel | grep -v "gij"'
561                java_cmd_list=(subprocess.check_output(java_cmd, shell=True)).split("\n")
562                java_label='update-alternatives --list ControlPanel | 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                                cpanel_label_list.append(item)
570                                cpanel_cmd_list.append(java_cmd_list[i])
571                                i+=1
572                       
573                for x in cpanel_label_list:
574                        j=cpanel_label_list.index(x)
575                        a=CpanelButton(x.upper(),cpanel_cmd_list[j])
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               
586                for alternative in alternative_list:
587                        alternative.connect("toggled",alternative.alternative_toggled)
588                '''
589                               
590                self.conf_stack.add_titled(tmp_box, "cpanel", "Control Panel")
591
592               
593        #def build_cpanel_alternatives 
594       
595       
596        def build_jws_alternatives(self):
597       
598                tmp_box=Gtk.VBox()
599               
600                alternative_list=[]
601                jws_label_list=[]
602                jws_cmd_list=[]
603
604                # build alternatives list here
605               
606                # ############### #
607       
608                java_cmd='update-alternatives --list javaws | grep -v "gij"'
609                java_cmd_list=(subprocess.check_output(java_cmd, shell=True)).split("\n")
610                java_label='update-alternatives --list javaws | grep -v "gij" | cut -d"/" -f5'
611                java_label_list=(subprocess.check_output(java_label, shell=True)).split("\n")
612               
613                i=0
614                for item in java_label_list:
615                        if java_label_list[i]!='':
616                                jws_label_list.append(item)
617                                jws_cmd_list.append('update-alternatives --set javaws ' + java_cmd_list[i])
618                                i+=1
619               
620                for x in jws_label_list:
621                        j=jws_label_list.index(x)
622                        a=Alternative(x.upper(),jws_cmd_list[j])
623                        a.set_name("RED")
624                        alternative_list.append(a)
625                        tmp_box.pack_start(a,False,False,15)
626                       
627                if len(alternative_list) > 0:
628                        for alternative in alternative_list[1:]:
629                                alternative.join_group(alternative_list[0])
630                               
631                                                               
632                # get jws configured actually
633               
634                # ################ #
635               
636                jws_configured_cmd='update-alternatives --get-selections |grep javaws$' 
637                jws_configured_label= (subprocess.check_output(jws_configured_cmd, shell=True)).split("/")[4]   
638                k=jws_label_list.index(jws_configured_label)
639                               
640                alternative_list[k].set_active(True)
641               
642                for alternative in alternative_list:
643                        alternative.connect("toggled",alternative.alternative_toggled)
644               
645                self.conf_stack.add_titled(tmp_box, "jws", "Java Web Start")
646
647               
648        #def  build_jws_alternatives
649       
650       
651        def build_jre_alternatives(self):
652       
653                tmp_box=Gtk.VBox()
654               
655                alternative_list=[]
656                jre_label_list=[]
657                jre_cmd_list=[]
658
659                # build alternatives list here
660               
661                # ############### #
662                       
663                java_cmd='update-alternatives --list java | grep -v "gij"'
664                java_cmd_list=(subprocess.check_output(java_cmd, shell=True)).split("\n")
665                java_label='update-alternatives --list java | grep -v "gij" | cut -d"/" -f5'
666                java_label_list=(subprocess.check_output(java_label, shell=True)).split("\n")
667               
668                i=0
669                for item in java_label_list:
670                        if java_label_list[i]!='':
671                                jre_label_list.append(item)
672                                jre_cmd_list.append('update-alternatives --set java ' + java_cmd_list[i])
673                                i+=1
674               
675                for x in jre_label_list:
676                        j=jre_label_list.index(x)
677                        a=Alternative(x.upper(),jre_cmd_list[j])
678                        a.set_name("RED")
679                        alternative_list.append(a)
680                        tmp_box.pack_start(a,False,False,15)
681                       
682                if len(alternative_list) > 0:
683                        for alternative in alternative_list[1:]:
684                                alternative.join_group(alternative_list[0])
685                               
686                # get jre configured actually
687               
688                # ################ #
689               
690                jre_configured_cmd='update-alternatives --get-selections |grep java$' 
691                jre_configured_label= (subprocess.check_output(jre_configured_cmd, shell=True)).split("/")[4]   
692                k=jre_label_list.index(jre_configured_label)
693                               
694                alternative_list[k].set_active(True)
695
696                for alternative in alternative_list:
697                        alternative.connect("toggled",alternative.alternative_toggled)
698               
699               
700                self.conf_stack.add_titled(tmp_box, "jre", "JRE Selector")
701
702               
703        #def build_jre_alternatives
704
705       
706        def build_firefox_alternatives(self):
707       
708                tmp_box=Gtk.VBox()
709               
710                alternative_list=[]
711                firefox_label_list=[]
712                firefox_cmd_list=[]     
713               
714                # build alternatives list here
715               
716                # ############### #
717               
718                javaplugin_cmd='update-alternatives --list mozilla-javaplugin.so | grep -v "gij"' 
719                javaplugin_cmd_list=(subprocess.check_output(javaplugin_cmd, shell=True)).split("\n")
720                javaplugin_label='update-alternatives --list mozilla-javaplugin.so | grep -v "gij" | cut -d"/" -f5'
721                javaplugin_label_list=(subprocess.check_output(javaplugin_label, shell=True)).split("\n")
722
723                       
724                i=0
725                for item in javaplugin_label_list:
726                        if javaplugin_label_list[i]!='':
727                                firefox_label_list.append(item)
728                                firefox_cmd_list.append('update-alternatives --set mozilla-javaplugin.so ' + javaplugin_cmd_list[i])
729                                i+=1
730               
731                for x in firefox_label_list:
732                        j=firefox_label_list.index(x)
733                        a=Alternative(x.upper(),firefox_cmd_list[j])
734                        a.set_name("RED")
735                        alternative_list.append(a)
736                        tmp_box.pack_start(a,False,False,15)
737                       
738                if len(alternative_list) > 0:
739                        for alternative in alternative_list[1:]:
740                                alternative.join_group(alternative_list[0])
741                               
742                               
743                                       
744                # get mozilla plugin configured actually
745               
746                # ################ #
747               
748                firefox_configured_cmd='update-alternatives --get-selections |grep mozilla-javaplugin.so' 
749                firefox_configured_label= (subprocess.check_output(firefox_configured_cmd, shell=True)).split("/")[4]   
750                k=firefox_label_list.index(firefox_configured_label)
751                               
752                alternative_list[k].set_active(True)
753               
754                for alternative in alternative_list:
755                        alternative.connect("toggled",alternative.alternative_toggled)
756               
757                self.conf_stack.add_titled(tmp_box, "firefox", "Firefox Alternatives")
758
759               
760        #def  build_firefox_alternatives
761       
762        def add_grid_button(self,grid_button):
763               
764                da=Gtk.DrawingArea()
765                da.set_size_request(140,148)
766                da.add_events(Gdk.EventMask.POINTER_MOTION_MASK | Gdk.EventMask.LEAVE_NOTIFY_MASK | Gdk.EventMask.BUTTON_PRESS_MASK )
767               
768                da.connect("draw",self.draw_button,grid_button)
769                da.connect("motion-notify-event",self.mouse_over,grid_button)
770                da.connect("leave_notify_event",self.mouse_left,grid_button)
771                da.connect("button-press-event",self.button_clicked,grid_button)
772               
773               
774                #button.connect("motion-notify-event",self.mouse_over,app,image)
775                da.show()
776                self.installers_grid.attach(da,self.current_grid_width,self.current_grid_height,1,1)
777               
778                self.current_grid_width+=1
779               
780                if self.current_grid_width > self.max_grid_width:
781                        self.current_grid_width=0
782                        self.current_grid_height+=1
783                       
784        #def add_grid_button
785       
786       
787        def conf_clicked(self,widget,event,cb):
788               
789                for item in self.conf_buttons:
790                        item.active=False
791                        item.da.queue_draw()
792                       
793                cb.active=True
794               
795                self.conf_stack.set_visible_child_name(cb.name)
796                widget.queue_draw()
797               
798        #def conf_clicked
799       
800       
801        def button_clicked(self,widget,event,grid_button):
802               
803                self.t=threading.Thread(target=self.execute,args=(grid_button.info["cmd"],))
804                self.t.daemon=True
805                self.t.start()
806                GLib.timeout_add(100,self.pulsate_pbar,grid_button,widget)
807                self.progress_window.show()
808               
809               
810        #def button_clicked
811       
812       
813        def draw_configure_button(self,widget,ctx,cb):
814               
815                if cb.active:
816                        ctx.set_source_rgba(self.conf_light.r,self.conf_light.g,self.conf_light.b,1)
817                        ctx.rectangle(0,0,110,123)
818                        ctx.fill()
819                       
820                        ctx.set_source_rgba(1,0,0,1)
821                        ctx.move_to(0,0)
822                        ctx.rectangle(0,1,5,121)
823                        ctx.fill()
824                       
825                else:
826                        ctx.set_source_rgba(self.conf_dark.r,self.conf_dark.g,self.conf_dark.b,1)
827                        ctx.rectangle(0,0,110,123)
828                        ctx.fill()
829               
830               
831               
832                ctx.move_to(0,0)
833                ctx.set_source_rgba(self.conf_light_shadow.r,self.conf_light_shadow.g,self.conf_light_shadow.b,1)
834                ctx.rectangle(0,0,110,1)
835                ctx.fill()
836               
837                ctx.move_to(0,0)
838                ctx.set_source_rgba(self.conf_dark_shadow.r,self.conf_dark_shadow.g,self.conf_dark_shadow.b,1)
839                ctx.rectangle(0,121,110,2)
840                ctx.fill()
841               
842                ctx.move_to(0,0)
843                img=cairo.ImageSurface.create_from_png(cb.icon)
844                ctx.set_source_surface(img,33,22)
845                ctx.paint()
846               
847                pctx = PangoCairo.create_layout(ctx)
848                desc = Pango.font_description_from_string ("Quattrocento Sans Bold 10")
849                pctx.set_font_description(desc)
850                pctx.set_markup(cb.txt)
851                ctx.set_source_rgba(self.light_gray.r,self.light_gray.g,self.light_gray.b,1)
852                width=pctx.get_pixel_size()[0]
853                ctx.move_to((110-width)/2,80)
854                PangoCairo.show_layout(ctx, pctx)
855               
856        #def draw_configure_button
857       
858
859        def draw_button(self,widget,ctx,grid_button):
860               
861                ctx.move_to(0,0)
862                img=cairo.ImageSurface.create_from_png(SHADOW_BANNER)
863                ctx.set_source_surface(img,0,grid_button.info["shadow_start"])
864                ctx.paint_with_alpha(grid_button.info["shadow_alpha"])
865               
866                ctx.move_to(0,0)
867                img=cairo.ImageSurface.create_from_png(grid_button.info["image"])
868                ctx.set_source_surface(img,0,0)
869                ctx.paint()
870               
871                ctx.move_to(0,0)
872                ctx.set_source_rgba(1,1,1,1)
873                ctx.rectangle(0,110,140,30)
874                ctx.fill()
875               
876               
877                ctx.set_source_rgba(self.dark_gray.r,self.dark_gray.g,self.dark_gray.b,1)
878               
879                pctx = PangoCairo.create_layout(ctx)
880                desc = Pango.font_description_from_string ("Quattrocento Sans Bold 10")
881                pctx.set_font_description(desc)
882                pctx.set_markup(grid_button.info["name"])
883                ctx.move_to(5,118)
884                PangoCairo.show_layout(ctx, pctx)
885                width=pctx.get_pixel_size()[0]
886               
887               
888               
889                if grid_button.info["installed"]:
890               
891                        desc = Pango.font_description_from_string ("Quattrocento Sans Bold 8")
892                        pctx.set_font_description(desc)
893                        ctx.set_source_rgba(self.green.r,self.green.g,self.green.b,1)
894                        txt=_("Installed")
895                        pctx.set_markup(txt)
896                        width=pctx.get_pixel_size()[0]
897                        ctx.move_to(140-width-5,120)
898                        PangoCairo.show_layout(ctx, pctx)
899                       
900                       
901                        #ctx.set_source_rgba(self.light_green.r,self.light_green.g,self.light_green.b,1)
902                        ctx.rectangle(5,139,130,1)
903                        ctx.fill()
904               
905               
906        #def draw_button
907       
908       
909        def drawing_label_event(self,widget,ctx,id):
910               
911                if id==self.current_tab:
912
913                        lg1 = cairo.LinearGradient(0.0,0.0, 300.0, 3.0)
914                        lg1.add_color_stop_rgba(0, 0, 1, 1, 0)
915                        lg1.add_color_stop_rgba(0.5, 0, 1, 1, 1)
916                        lg1.add_color_stop_rgba(1, 0, 1, 1, 0)
917                        ctx.rectangle(0, 0, 300, 3)
918                        ctx.set_source(lg1)
919                        ctx.fill()
920                       
921        #drawing_label_event
922       
923       
924        def draw_close_button(self,widget,ctx):
925               
926               
927                button_border=22
928               
929                pctx = PangoCairo.create_layout(ctx)
930                desc = Pango.font_description_from_string ("Quattrocento Sans Bold 12")
931                pctx.set_font_description(desc)
932               
933                pctx.set_markup(_("CLOSE"))
934                width=pctx.get_pixel_size()[0]
935                widget.set_size_request(width+button_border*2,30)
936               
937                ctx.set_source_rgba(1,1,0,1)
938                xx=0
939                yx=0
940                widthx=width+44
941                heightx=30
942                radius=5
943               
944                r=47.0
945                g=167.0
946                b=223.0
947                alpha=1.0
948               
949                r=r/255.0
950                g=g/255.0
951                b=b/255.0
952               
953                r2=83
954                g2=153
955                b2=252
956               
957                r2=r2/255.0
958                g2=g2/255.0
959                b2=b2/255.0
960               
961               
962                lg1 = cairo.LinearGradient(0.0,0.0, 90.0, 0)
963                lg1.add_color_stop_rgba(0, r, g, b, 1)
964                lg1.add_color_stop_rgba(1, r2, g2, b2, 1)
965                ctx.set_source(lg1)
966               
967               
968                ctx.move_to (xx + radius, yx);
969                ctx.arc (xx + widthx - radius, yx + radius, radius, pi * 1.5, pi * 2);
970                ctx.arc (xx + widthx - radius, yx + heightx - radius, radius, 0, pi * .5);
971                ctx.arc (xx + radius, yx + heightx - radius, radius, pi * .5, pi);
972                ctx.arc (xx + radius, yx + radius, radius, pi , pi * 1.5);
973                ctx.fill ();
974               
975                ctx.set_source_rgb(0.9,0.9,0.9)
976                ctx.move_to(button_border,7)
977                PangoCairo.show_layout(ctx, pctx)
978               
979        #def draw_close_button
980
981       
982        def draw_top_divider(self,widget,ctx):
983               
984                r=self.light_gray.r
985                g=self.light_gray.g
986                b=self.light_gray.b
987                alpha=1.0
988               
989               
990                ctx.set_source_rgba(r,g,b,alpha)
991                ctx.rectangle(0,1,510,3)
992                ctx.fill()
993               
994                width=0
995
996                if self.first_run:
997               
998                        pctx = PangoCairo.create_layout(ctx)
999                        desc = Pango.font_description_from_string ("Quattrocento Sans Bold 18")
1000                        pctx.set_font_description(desc)
1001                        pctx.set_markup(_("Installers"))
1002                        self.installers_width=pctx.get_pixel_size()[0]
1003                        pctx.set_markup(_("Configuration"))
1004                        self.configuration_width=pctx.get_pixel_size()[0]
1005                       
1006                        self.first_run=False
1007                       
1008                if self.current_tab==0:
1009                        width=self.installers_width
1010                else:
1011                        width=self.configuration_width
1012                        self.configuration_start=469-width
1013                       
1014                ctx.set_source_rgba(1.0,0,0,alpha)
1015               
1016                               
1017                if not self.animation_left and not self.animation_right:
1018               
1019                        if self.current_tab==0:
1020                                ctx.rectangle(0,0,width,3)
1021                               
1022                                self.current_red_width=width
1023                                self.current_red_start=0
1024                               
1025                        else:
1026                                ctx.rectangle(469-width,0,width,3)
1027                                self.current_red_width=width
1028                                self.current_red_start=469-width
1029                       
1030                       
1031                        ctx.fill()
1032               
1033                else:
1034               
1035                        ctx.rectangle(self.current_red_start,0,self.current_red_width,3)
1036                        ctx.fill()
1037               
1038               
1039        #def draw_top_divider
1040       
1041       
1042        def draw_bottom_divider(self,widget,ctx):
1043               
1044                r=self.dark_gray.r
1045                g=self.dark_gray.g
1046                b=self.dark_gray.b
1047                alpha=1.0
1048               
1049                ctx.set_source_rgba(r,g,b,alpha)
1050                ctx.rectangle(0,1,500,3)
1051                ctx.fill()
1052               
1053        #def draw_bottom_divider
1054       
1055       
1056        def mouse_over(self,widget,event,grid_button):
1057               
1058                grid_button.info["animation_active"]=False
1059                if grid_button.info["shadow_alpha"] <0.5 :
1060                        grid_button.info["shadow_alpha"]+=0.1
1061                        widget.queue_draw()
1062                        return True
1063                       
1064                return False
1065               
1066        #def mouse_over
1067
1068       
1069        def mouse_left(self,widget,event,grid_button):
1070               
1071                if not grid_button.info["animation_active"]:
1072                       
1073                        grid_button.info["animation_active"]=True
1074                        GLib.timeout_add(10,self.restore_shadow_alpha,grid_button,widget)
1075                       
1076        #def mouse_left
1077
1078       
1079        def restore_shadow_alpha(self,grid_button,widget):
1080
1081                if grid_button.info["shadow_alpha"] >0.2 :
1082                        grid_button.info["shadow_alpha"]-=0.1
1083               
1084                       
1085                        widget.queue_draw()
1086                        return True
1087                       
1088                grid_button.info["animation_active"]=False
1089                return False
1090               
1091        #def  restore_shadow_alpha
1092       
1093        def update_divider_right(self):
1094               
1095                if self.configuration_width > self.installers_width:
1096               
1097
1098                        if self.current_red_width < self.configuration_width:
1099                                self.current_red_width+=1
1100                        if self.current_red_start < self.configuration_start:
1101                                self.current_red_start+=1
1102                       
1103                       
1104                        if self.current_red_width >= self.configuration_width and self.current_red_start >= self.configuration_start:
1105                               
1106                                self.animation_right=False
1107                               
1108                        self.top_divider_da.queue_draw()
1109                       
1110                else:
1111                       
1112                        if self.current_red_width > self.configuration_width:
1113                                self.current_red_width-=1
1114                        if self.current_red_start < self.configuration_start:
1115                                self.current_red_start+=1
1116                       
1117                       
1118                        if self.current_red_width <= self.configuration_width and self.current_red_start >= self.configuration_start:
1119                               
1120                                self.animation_right=False
1121                               
1122                        self.top_divider_da.queue_draw()
1123               
1124                return self.animation_right
1125               
1126        #def update_divider_right
1127       
1128        def update_divider_left(self):
1129               
1130               
1131                if self.configuration_width > self.installers_width:
1132
1133                        if self.current_red_width > self.installers_width:
1134                                self.current_red_width-=1
1135                        if self.current_red_start > 0:
1136                                self.current_red_start-=1
1137                       
1138                       
1139                        if self.current_red_width <= self.installers_width and self.current_red_start <= 0:
1140                               
1141                                self.animation_left=False
1142                               
1143                        self.top_divider_da.queue_draw()
1144                       
1145                else:
1146                       
1147                        if self.current_red_width < self.installers_width:
1148                                self.current_red_width+=1
1149                        if self.current_red_start > 0:
1150                                self.current_red_start-=1
1151                       
1152                       
1153                        if self.current_red_width >= self.installers_width and self.current_red_start <= 0:
1154                               
1155                                self.animation_left=False
1156                               
1157                        self.top_divider_da.queue_draw()
1158               
1159                return self.animation_left
1160               
1161        #def update_divider_left
1162       
1163
1164       
1165        def label_clicked(self,widget,event,id):
1166               
1167                if id==0 and self.current_tab!=id:
1168                        try:
1169                               
1170                                self.stack.set_visible_child_name("installers")
1171                                self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT)
1172                                self.installers_label.set_name("MAIN_LABEL_ENABLED")
1173                                self.configuration_label.set_name("MAIN_LABEL_DISABLED")
1174                                if not self.first_run:
1175                                        self.animation_left=True
1176                                        self.animation_right=False
1177                                        GLib.timeout_add(1,self.update_divider_left)
1178                                       
1179                               
1180                        except Exception as e:
1181                                print e
1182               
1183                if id==1 and self.current_tab!=id:
1184                        try:
1185
1186                                self.stack.set_visible_child_name("configuration")
1187                                self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_RIGHT)
1188                                self.installers_label.set_name("MAIN_LABEL_DISABLED")
1189                                self.configuration_label.set_name("MAIN_LABEL_ENABLED")
1190                                self.animation_right=True
1191                                self.animation_left=False
1192                                GLib.timeout_add(1,self.update_divider_right)
1193                               
1194                        except:
1195                                pass
1196               
1197                self.current_tab=id
1198               
1199        #def label_clicked
1200       
1201
1202       
1203#awesome tabs
1204
1205if __name__=="__main__":
1206       
1207        at=AwesomeTabs()
Note: See TracBrowser for help on using the repository browser.