source: zero-lliurex-flavours/trunk/fuentes/install-files/usr/share/lliurex-flavours-selector/lliurex-flavours-selector.py @ 2141

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

Add new es.po

  • Property svn:executable set to *
File size: 18.8 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('zero-lliurex-flavours')
25_ = gettext.gettext
26
27
28BASE_DIR="/usr/share/lliurex-flavours-selector/"
29RSRC_DIR=BASE_DIR+"rsrc/"
30SHADOW_BANNER=RSRC_DIR+"shadow.png"
31UNKNOWN_BANNER=RSRC_DIR+"unknown.png"
32BANNERS_PATH=BASE_DIR+"banners/"
33FLAVOURS_CONFIG_PATH=BASE_DIR+"supported-flavours/"
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["checked"]=False
44                self.info["shadow_alpha"]=0.1
45                self.info["animation_active"]=False
46                self.info["shadow_start"]=0
47                self.info["available"]=True
48                self.info["drawingarea"]=None
49               
50                if os.path.exists(BANNERS_PATH+self.info["pkg"]+".png"):
51                        self.info["image"]=BANNERS_PATH+self.info["pkg"]+".png"
52                else:
53                        self.info["image"]=UNKNOWN_BANNER
54               
55        #def init
56       
57       
58#class GridButton
59
60
61class ConfButton:
62       
63        def __init__(self,info):
64               
65                self.txt=info["txt"]
66                self.icon=info["icon"]
67                self.name=info["name"]
68                self.da=None
69                if "active" not in info:
70                        self.active=False
71                else:
72                        self.active=info["active"]
73               
74        #def
75
76#class ConfButton
77       
78       
79class ConfigurationParser:
80       
81        def __init__(self):
82                pass
83       
84        def load_plugin(self,path):
85       
86                try:
87                        config = ConfigParser.ConfigParser()
88                        config.optionxform=str
89                        config.read(path)
90                        if config.has_section("FLAVOUR"):
91                                info={}
92                                info["pkg"]=config.get("FLAVOUR","pkg")
93                                info["name"]=config.get("FLAVOUR","name")
94                               
95                                return GridButton(info)
96                               
97                except Exception as e:
98                        print e
99                        return None
100       
101       
102#class ConfigParser
103
104
105class CustomColor:
106       
107        def __init__(self,r,g,b):
108               
109                self.r=r/255.0
110                self.g=g/255.0
111                self.b=b/255.0
112
113#class CustomColor             
114
115class AwesomeTabs:
116       
117        def __init__(self):
118               
119                self.configuration_parser=ConfigurationParser()
120               
121                self.current_tab=-1
122                self.current_width=0
123                self.animation_left=False
124                self.animation_right=False
125               
126                self.current_red_width=0
127                self.current_red_pos=0
128                self.configuration_start=0
129               
130                self.first_run=True
131                self.update_alternatives=False
132               
133                self.current_grid_width=0
134                self.current_grid_height=0
135               
136                self.max_grid_width=2
137               
138                self.dark_gray=CustomColor(130.0,151.0,161.0)
139                self.light_gray=CustomColor(185.0,195.0,195.0)
140               
141                self.green=CustomColor(74.0,166.,69.0)
142                self.light_green=CustomColor(88.0,208.0,86.0)
143               
144               
145                self.conf_light=CustomColor(49.0,55.0,66.0)
146                self.conf_dark=CustomColor(30.0,36.0,42.0)
147               
148                self.conf_light_shadow=CustomColor(107.0,116.0,137.0)
149                self.conf_dark_shadow=CustomColor(0,0,0)
150               
151                self.current_conf_height=0
152                self.conf_buttons=[]
153                self.start_gui()
154               
155               
156        #def __init__
157       
158       
159       
160        def start_gui(self):
161               
162                builder=Gtk.Builder()
163                builder.set_translation_domain('zero-lliurex-flavours')
164                glade_path=RSRC_DIR+"lliurex-flavours-selector.ui"
165                builder.add_from_file(glade_path)
166               
167                self.installers_eb=builder.get_object("installers_eventbox")
168                self.installers_label=builder.get_object("installers_label")
169               
170               
171                self.top_divider_da=builder.get_object("top_divider_drawingarea")
172                self.bottom_divider_da=builder.get_object("bottom_divider_drawingarea")
173                self.top_divider_da.connect("draw",self.draw_top_divider)
174                self.bottom_divider_da.connect("draw",self.draw_bottom_divider)
175               
176                self.button_scroll=builder.get_object("button_scrolledwindow")
177                self.main_box=builder.get_object("main_box")
178                self.apply_eb=builder.get_object("apply_eventbox")
179                self.apply_da=builder.get_object("apply_drawingarea")
180                self.apply_eb.connect("button-press-event",self.accept_clicked)
181                self.apply_da.connect("draw",self.draw_apply_button)
182                self.close_eb=builder.get_object("close_eventbox")
183                self.close_da=builder.get_object("close_drawingarea")
184                self.close_eb.connect("button-press-event",self.quit)
185                self.close_da.connect("draw",self.draw_close_button)
186                self.msg_label=builder.get_object("msg_label")
187               
188                self.stack = Gtk.Stack()
189                self.stack.set_transition_duration(1000)
190                self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT)
191               
192                self.installers_grid=builder.get_object("button_grid")
193                               
194               
195               
196                self.stack.add_titled(self.button_scroll, "installers", "Installers")
197               
198               
199                self.main_box.add(self.stack)
200               
201                self.main_window=builder.get_object("main_window")
202               
203               
204                self.main_window.connect("destroy",self.quit)
205               
206               
207                self.progress_window=builder.get_object("progress_window")
208                self.pbar=builder.get_object("progressbar")
209                self.progress_window.set_transient_for(self.main_window)
210               
211                self.gather_window=builder.get_object("gather_window")
212                self.gather_pbar=builder.get_object("progressbar1")
213                self.progress_label=builder.get_object("progress_label")
214               
215                       
216                self.set_css_info()
217               
218                self.gather_window.show_all()
219                GLib.timeout_add(100,self.pulsate_gathering_info)
220               
221                self.t=threading.Thread(target=self.gather_info)
222                self.t.daemon=True
223                self.t.start()
224                self.install_metas=[]
225                self.update_metas=[]
226                GObject.threads_init()         
227                Gtk.main()
228               
229        #def start_gui
230       
231        def gather_info(self):
232               
233                import time
234                base_apt_cmd="apt-cache policy "
235               
236                self.gbs=[]
237                self.flavours_installed=0
238               
239                for item in sorted(os.listdir(FLAVOURS_CONFIG_PATH)):
240                        if os.path.isfile(FLAVOURS_CONFIG_PATH+item):
241                                gb=self.configuration_parser.load_plugin(FLAVOURS_CONFIG_PATH+item)
242                                if gb!=None:
243                                        sys.stdout.write("* Checking %s ...\t"%gb.info["pkg"])
244                                        gb.info["installed"]=self.is_installed(gb.info["pkg"])
245                                        sys.stdout.write("%s\n"%gb.info["installed"])
246                                        base_apt_cmd += "%s "%gb.info["pkg"]
247                                        self.gbs.append(gb)
248                                       
249                p=subprocess.Popen([base_apt_cmd],shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)     
250                output=p.communicate()
251               
252                for gb in self.gbs:
253                       
254                        if gb.info["pkg"] not in output[0]:
255                                print(" [!] %s not available [!] "%gb.info["pkg"])
256                                gb.info["available"]=False
257                        else:
258                                if gb.info["installed"]==True:
259                                        self.flavours_installed+=1     
260                                self.add_grid_button(gb)       
261                               
262               
263
264       
265        #def gather_info
266       
267        def pulsate_gathering_info(self):
268               
269                self.gather_pbar.pulse()
270               
271                if not self.t.is_alive():
272                       
273                        self.gather_window.hide()
274                        self.main_window.show_all()
275               
276                        if self.flavours_installed<1:
277                                msg=_("No flavour detected. Check one at least")
278                                self.msg_label.show()
279                                self.msg_label.set_markup(msg)
280                return self.t.is_alive()
281               
282        #def pulsate_gathering
283       
284        def set_css_info(self):
285               
286                css = """
287               
288                #BLUE {
289                        background-image:-gtk-gradient (linear, left top, left bottom, from (#0f72ff),  to (#0f72ff));;
290               
291                }
292               
293                #BLACK{
294                        background-image:-gtk-gradient (linear, left top, left bottom, from (#000000),  to (#000000));;
295               
296                }
297               
298               
299                #BACK_GRADIENT{
300                        background-image:-gtk-gradient (linear, left top, left bottom, from (#ffffff), to (#eceff3));;
301                }
302               
303                #WHITE {
304                        color: white;
305                        text-shadow: 0px 1px black;
306                }
307               
308                #MAIN_LABEL_ENABLED{
309                        color: #8297a1;
310                        font: Noto Sans Bold 18;
311                }
312               
313                #ALTERNATIVES_LABEL{
314                        color: #8297a1;
315                        font: Noto Sans Bold 12;               
316                }
317               
318                #MAIN_LABEL_DISABLED{
319                        color: #c9d4e2;
320                        font: Noto Sans Bold 18;
321                }
322               
323                #RED_PROGRESS{
324                       
325                        background-color: #FF0000;
326                        border: 0px;
327
328                }
329               
330                #DARK_BACK{
331                        background-color: #070809;
332                }
333               
334                #GREEN {
335                        background-image:-gtk-gradient (linear, left top, left bottom, from (#41ff70),  to (#41ff70));;
336               
337                }
338               
339                #ORANGE {
340                        background-image:-gtk-gradient (linear, left top, left bottom, from (#ff7f2a),  to (#ff7f2a));;
341               
342                }
343               
344                #LIGHTBLUE {
345                        -unico-border-gradient: -gtk-gradient (linear, left top, left bottom,
346                        from (shade (#ff0000, 0.68)),
347                        to (shade (#ff0000, 0.68)));
348               
349                }
350               
351                #RED_LABEL{
352                       
353                        color: red;
354                        font: Noto Sans Bold 11;
355                }
356
357               
358                GtkButton#RED GtkLabel {
359                        color: #8297a1;
360                        font: Noto Sans 11;
361                }
362
363
364                """
365                self.style_provider=Gtk.CssProvider()
366                self.style_provider.load_from_data(css)
367                Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(),self.style_provider,Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
368               
369                self.main_window.set_name("BACK_GRADIENT")
370                self.installers_label.set_name("MAIN_LABEL_ENABLED")
371                self.pbar.set_name("RED_PROGRESS")
372                self.gather_pbar.set_name("RED_PROGRESS")
373                self.progress_label.set_name("ALTERNATIVES_LABEL")
374                self.msg_label.set_name("RED_LABEL")
375               
376               
377        #def css_info
378
379        def is_installed(self,pkg):
380               
381               
382                p=subprocess.Popen(["dpkg-query -W -f='${db:Status-Status}' %s"%pkg],shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
383                output=p.communicate()
384               
385                if output[0]=="installed":
386                        return True
387                       
388                return False
389               
390               
391        #def is_installed
392       
393        def quit(self,widget,event=None):
394               
395                Gtk.main_quit()
396               
397        #def quit
398       
399        def execute(self,command):
400               
401                self.thread_ret=-1
402                self.thread_ret=os.system(command)
403               
404        #def execute
405       
406       
407        def pulsate_pbar(self,da):
408               
409                if self.t.is_alive():
410                       
411                        self.pbar.pulse()
412                               
413                if not self.t.is_alive():
414                        self.progress_window.hide()
415                        if self.thread_ret==0:
416                                for item in self.install_metas:
417                                        print item
418                                        if item.info["checked"]:
419                                                item.info["checked"]=False
420                                                item.info["drawingarea"].queue_draw()
421                                                self.mouse_left(item.info["drawingarea"],None,item)
422                                                item.info["installed"]=True
423                                try:
424                                        self.remove_desktop.info["checked"]=False
425                                        self.remove_desktop.info["drawingarea"].queue_draw()
426                                        self.mouse_left(self.remove_desktop.info["drawingarea"],None,self.remove_desktop)
427                                except:
428                                        print "No desktop flavour to remove"
429                                       
430                                self.install_metas=[]   
431                                self.msg_label.show()
432                                self.msg_label.set_markup("<span foreground='#4aa645'><b>"+_("Installation succesful. A reboot is required")+"</b></span>")
433                        else:
434                                self.msg_label.show()
435                                msg=_("An error ocurred during installation")
436                                self.msg_label.set_markup(msg) 
437                return self.t.is_alive()
438       
439        #def pulsate_pbar
440
441       
442       
443               
444        def add_grid_button(self,grid_button):
445               
446                da=Gtk.DrawingArea()
447                da.set_size_request(140,148)
448                da.add_events(Gdk.EventMask.POINTER_MOTION_MASK | Gdk.EventMask.LEAVE_NOTIFY_MASK | Gdk.EventMask.BUTTON_PRESS_MASK )
449               
450                da.connect("draw",self.draw_button,grid_button)
451                da.connect("motion-notify-event",self.mouse_over,grid_button)
452                da.connect("leave_notify_event",self.mouse_left,grid_button)
453                da.connect("button-press-event",self.button_clicked,grid_button)
454                grid_button.info["drawingarea"]=da
455               
456                da.show()
457                self.installers_grid.attach(da,self.current_grid_width,self.current_grid_height,1,1)
458               
459                self.current_grid_width+=1
460               
461                if self.current_grid_width > self.max_grid_width:
462                        self.current_grid_width=0
463                        self.current_grid_height+=1
464                       
465                       
466        #def add_grid_button
467       
468       
469        def button_clicked(self,widget,event,grid_button):
470               
471                if not grid_button.info["installed"]:
472                        if grid_button.info["checked"]:
473                                self.install_metas.remove(grid_button)
474                                grid_button.info["checked"]=False
475                        else:
476                                self.install_metas.append(grid_button)
477                                grid_button.info["checked"]=True
478                                grid_button.info["shadow_alpha"]+=0.1
479                               
480                                widget.queue_draw()
481               
482        #def button_clicked
483       
484       
485        def accept_clicked(self,widget,even=None):
486                ret, msg=self.check_meta_compatibility()
487               
488                if not ret:
489                        self.msg_label.show()
490                        self.msg_label.set_markup(msg)
491                        return
492               
493                self.msg_label.hide()           
494                cmd='apt-get update && apt-get install -y '
495                pkg=""
496                for item in self.update_metas:
497                        pkg+=item.info["pkg"] + ' '
498                       
499                for item in self.install_metas:
500                        pkg+=item.info["pkg"] + ' '
501                               
502                command=cmd+pkg
503                print command
504                command='apt-get update'
505                self.t=threading.Thread(target=self.execute,args=(command,))
506                self.t.daemon=True
507                self.t.start()
508                GLib.timeout_add(100,self.pulsate_pbar,widget)
509                self.progress_window.show()
510               
511               
512        def check_meta_compatibility(self):
513                               
514                if len(self.install_metas)>0:
515                       
516                        for gb in self.gbs:
517                                if gb.info["available"]:
518                                        if gb.info["installed"]:
519                                                if not gb in self.update_metas:
520                                                        self.update_metas.append(gb)
521                                                       
522                                                if gb.info["pkg"]=="lliurex-meta-server":
523                                                        for item in self.install_metas:
524                                                                if item.info["pkg"]=="lliurex-meta-client":
525                                                                        return [False,_("Incompatibility between Server and Client detected")]
526                                                                                                                                               
527                                                                if item.info["pkg"]=="lliurex-meta-desktop":
528                                                                        return [False, _("Is not possible adding Desktop Flavour in Server")]   
529                                                                       
530                                                if gb.info["pkg"]=="lliurex-meta-client":
531                                                        for item in self.install_metas:
532                                                                if item.info["pkg"]=="lliurex-meta-server":
533                                                                        return [False,_("Incompatibility between Server and Client detected")]
534                                               
535                                                if gb.info["pkg"]=="lliurex-meta-desktop":
536                                                        for item in self.install_metas:
537                                                                if item.info["pkg"]=="lliurex-meta-server":
538                                                                        if  gb in self.update_metas:
539                                                                                self.update_metas.remove(gb)                   
540                        i=0             
541                       
542                        for item in self.install_metas:
543                                if item.info["pkg"]=="lliurex-meta-server":
544                                        i+=1
545                                        for item in self.install_metas:
546                                                if item.info["pkg"]=="lliurex-meta-client":
547                                                        i+=1
548                                                if item.info["pkg"]=="lliurex-meta-desktop":
549                                                        self.install_metas.remove(item)
550                                                        self.remove_desktop=item
551                                                                       
552                        if i>1:
553                                return [False,_("Incompatibility between Server and Client detected")]
554                       
555                        return [True,""]
556                       
557                else:
558                        return [False,_("Choose new flavour to incorporate or close button")]
559                       
560        #def check_meta_compatibility
561                               
562        def draw_button(self,widget,ctx,grid_button):
563               
564                ctx.move_to(0,0)
565                img=cairo.ImageSurface.create_from_png(SHADOW_BANNER)
566                ctx.set_source_surface(img,0,grid_button.info["shadow_start"])
567                ctx.paint_with_alpha(grid_button.info["shadow_alpha"])
568               
569                ctx.move_to(0,0)
570                img=cairo.ImageSurface.create_from_png(grid_button.info["image"])
571                ctx.set_source_surface(img,0,0)
572                ctx.paint()
573               
574                ctx.move_to(0,0)
575                ctx.set_source_rgba(1,1,1,1)
576                ctx.rectangle(0,110,140,30)
577                ctx.fill()
578               
579               
580                ctx.set_source_rgba(self.dark_gray.r,self.dark_gray.g,self.dark_gray.b,1)
581               
582                pctx = PangoCairo.create_layout(ctx)
583                desc = Pango.font_description_from_string ("Noto Sans Bold 8")
584                pctx.set_font_description(desc)
585                pctx.set_markup(grid_button.info["name"])
586                ctx.move_to(5,118)
587                PangoCairo.show_layout(ctx, pctx)
588                width=pctx.get_pixel_size()[0]
589               
590               
591               
592                if grid_button.info["installed"]:
593               
594                        desc = Pango.font_description_from_string ("Noto Sans Bold 7")
595                        pctx.set_font_description(desc)
596                        ctx.set_source_rgba(self.green.r,self.green.g,self.green.b,1)
597                        txt=_("Installed")
598                        pctx.set_markup(txt)
599                        width=pctx.get_pixel_size()[0]
600                        ctx.move_to(140-width-5,120)
601                        PangoCairo.show_layout(ctx, pctx)
602                       
603                        ctx.rectangle(5,139,130,1)
604                        ctx.fill()
605               
606                if grid_button.info["checked"]:
607               
608                        desc = Pango.font_description_from_string ("Noto Sans Bold 7")
609                        pctx.set_font_description(desc)
610                        ctx.set_source_rgba(self.green.r,self.green.g,self.green.b,1)
611                        txt=_("Install")
612                        pctx.set_markup(txt)
613                        width=pctx.get_pixel_size()[0]
614                        ctx.move_to(140-width-5,120)
615                        PangoCairo.show_layout(ctx, pctx)
616                       
617                        ctx.rectangle(5,139,130,1)
618                        ctx.fill()
619               
620        #def draw_button
621       
622       
623        def drawing_label_event(self,widget,ctx,id):
624               
625                if id==self.current_tab:
626
627                        lg1 = cairo.LinearGradient(0.0,0.0, 300.0, 3.0)
628                        lg1.add_color_stop_rgba(0, 0, 1, 1, 0)
629                        lg1.add_color_stop_rgba(0.5, 0, 1, 1, 1)
630                        lg1.add_color_stop_rgba(1, 0, 1, 1, 0)
631                        ctx.rectangle(0, 0, 300, 3)
632                        ctx.set_source(lg1)
633                        ctx.fill()
634                       
635        #drawing_label_event
636       
637       
638        def draw_apply_button(self,widget,ctx):
639               
640               
641                button_border=22
642               
643                pctx = PangoCairo.create_layout(ctx)
644                desc = Pango.font_description_from_string ("Noto Sans Bold 10")
645                pctx.set_font_description(desc)
646               
647                pctx.set_markup(_("APPLY"))
648                width=pctx.get_pixel_size()[0]
649                widget.set_size_request(width+button_border*2,30)
650               
651                ctx.set_source_rgba(1,1,0,1)
652                xx=0
653                yx=0
654                widthx=width+44
655                heightx=30
656                radius=5
657               
658                r=47.0
659                g=167.0
660                b=223.0
661                alpha=1.0
662               
663                r=r/255.0
664                g=g/255.0
665                b=b/255.0
666               
667                r2=83
668                g2=153
669                b2=252
670               
671                r2=r2/255.0
672                g2=g2/255.0
673                b2=b2/255.0
674               
675               
676                lg1 = cairo.LinearGradient(0.0,0.0, 90.0, 0)
677                lg1.add_color_stop_rgba(0, r, g, b, 1)
678                lg1.add_color_stop_rgba(1, r2, g2, b2, 1)
679                ctx.set_source(lg1)
680               
681               
682                ctx.move_to (xx + radius, yx);
683                ctx.arc (xx + widthx - radius, yx + radius, radius, pi * 1.5, pi * 2);
684                ctx.arc (xx + widthx - radius, yx + heightx - radius, radius, 0, pi * .5);
685                ctx.arc (xx + radius, yx + heightx - radius, radius, pi * .5, pi);
686                ctx.arc (xx + radius, yx + radius, radius, pi , pi * 1.5);
687                ctx.fill ();
688               
689                ctx.set_source_rgb(0.9,0.9,0.9)
690                ctx.move_to(button_border,7)
691                PangoCairo.show_layout(ctx, pctx)
692       
693        #draw_apply_button
694       
695        def draw_close_button(self,widget,ctx):
696               
697               
698                button_border=22
699               
700                pctx = PangoCairo.create_layout(ctx)
701                desc = Pango.font_description_from_string ("Noto Sans Bold 10")
702                pctx.set_font_description(desc)
703               
704                pctx.set_markup(_("CLOSE"))
705                width=pctx.get_pixel_size()[0]
706                widget.set_size_request(width+button_border*2,30)
707               
708                ctx.set_source_rgba(1,1,0,1)
709                xx=0
710                yx=0
711                widthx=width+44
712                heightx=30
713                radius=5
714               
715                r=47.0
716                g=167.0
717                b=223.0
718                alpha=1.0
719               
720                r=r/255.0
721                g=g/255.0
722                b=b/255.0
723               
724                r2=83
725                g2=153
726                b2=252
727               
728                r2=r2/255.0
729                g2=g2/255.0
730                b2=b2/255.0
731               
732               
733                lg1 = cairo.LinearGradient(0.0,0.0, 90.0, 0)
734                lg1.add_color_stop_rgba(0, r, g, b, 1)
735                lg1.add_color_stop_rgba(1, r2, g2, b2, 1)
736                ctx.set_source(lg1)
737               
738               
739                ctx.move_to (xx + radius, yx);
740                ctx.arc (xx + widthx - radius, yx + radius, radius, pi * 1.5, pi * 2);
741                ctx.arc (xx + widthx - radius, yx + heightx - radius, radius, 0, pi * .5);
742                ctx.arc (xx + radius, yx + heightx - radius, radius, pi * .5, pi);
743                ctx.arc (xx + radius, yx + radius, radius, pi , pi * 1.5);
744                ctx.fill ();
745               
746                ctx.set_source_rgb(0.9,0.9,0.9)
747                ctx.move_to(button_border,7)
748                PangoCairo.show_layout(ctx, pctx)
749               
750        #def draw_close_button
751
752       
753        def draw_top_divider(self,widget,ctx):
754               
755                r=self.dark_gray.r
756                g=self.dark_gray.g
757                b=self.dark_gray.b
758                alpha=1.0
759               
760                ctx.set_source_rgba(r,g,b,alpha)
761                ctx.rectangle(0,1,500,3)
762                ctx.fill()
763               
764               
765        #def draw_top_divider
766       
767       
768        def draw_bottom_divider(self,widget,ctx):
769               
770                r=self.dark_gray.r
771                g=self.dark_gray.g
772                b=self.dark_gray.b
773                alpha=1.0
774               
775                ctx.set_source_rgba(r,g,b,alpha)
776                ctx.rectangle(0,1,500,3)
777                ctx.fill()
778               
779        #def draw_bottom_divider
780       
781       
782        def mouse_over(self,widget,event,grid_button):
783               
784                grid_button.info["animation_active"]=False
785                if grid_button.info["shadow_alpha"] <0.5 :
786                        grid_button.info["shadow_alpha"]+=0.1
787                        widget.queue_draw()
788                        return True
789                       
790                return False
791               
792        #def mouse_over
793
794        def mouse_left(self,widget,event,grid_button):
795                if not grid_button.info["checked"]:
796                        if not grid_button.info["animation_active"]:
797                       
798                                grid_button.info["animation_active"]=True
799                                GLib.timeout_add(10,self.restore_shadow_alpha,grid_button,widget)
800                       
801        #def mouse_left
802
803       
804        def restore_shadow_alpha(self,grid_button,widget):
805               
806                if grid_button.info["shadow_alpha"] >0.2 :
807                        grid_button.info["shadow_alpha"]-=0.1
808               
809                        widget.queue_draw()
810                        return True
811                       
812                grid_button.info["animation_active"]=False
813                return False
814               
815        # def restore_shadow_alfpha     
816
817       
818#awesome tabs
819
820if __name__=="__main__":
821       
822        at=AwesomeTabs()
Note: See TracBrowser for help on using the repository browser.