source: lliurex-up/trunk/fuentes/lliurex-up-gui/lliurex-up @ 2654

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

WIP in gui

File size: 9.0 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')
7gi.require_version('Vte', '2.91')
8
9import cairo
10import os
11import threading
12import ConfigParser
13import platform
14import subprocess
15import sys
16
17from gi.repository import Gtk, Gdk, GObject, GLib, PangoCairo, Pango, Vte
18
19import signal
20signal.signal(signal.SIGINT, signal.SIG_DFL)
21
22import gettext
23gettext.textdomain('lliurex-up')
24_ = gettext.gettext
25
26
27
28RSRC_DIR="rsrc/"
29
30
31class LliurexUp:
32
33        def __init__(self):
34
35                self.start_gui()
36
37        def start_gui(self):
38               
39                builder=Gtk.Builder()
40               
41                glade_path=RSRC_DIR+"lliurex-up.ui"
42                builder.add_from_file(glade_path)
43
44                self.stack = Gtk.Stack()
45                self.stack.set_transition_duration(1000)
46                self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT)
47
48
49                self.window=builder.get_object("main_window")
50                self.main_box=builder.get_object("main_box")
51                self.pbar=builder.get_object("progressbar")
52                #self.pbar_label=builder.get_object("pbar_label")
53               
54
55                self.cancel_button_box=builder.get_object("cancel_button_box")
56                self.cancel_eb=builder.get_object("cancel_button_eventbox")
57                self.cancel_eb.connect("button-press-event", self.quit)
58                self.cancel_label=builder.get_object("cancel_button_label")
59
60
61                self.gather_box=builder.get_object("gather_box")
62                self.yes_button_box=builder.get_object("yes_button_box")
63                self.yes_button_label=builder.get_object("yes_button_label")
64                self.no_button_box=builder.get_object("no_button_box")
65                self.no_button_eb=builder.get_object("no_button_eventbox")
66                self.no_button_eb.add_events(Gdk.EventMask.BUTTON_RELEASE_MASK)
67                self.no_button_eb.connect("button-release-event", self.no_button_clicked)
68                self.no_button_label=builder.get_object("no_button_label")
69                self.gather_logo_box=builder.get_object("gather_logo_box")
70                self.gather_label=builder.get_object("gather_label")
71
72                self.update_box=builder.get_object("update_box")
73                self.version_label=builder.get_object("version_label")
74                self.number_packages_label=builder.get_object("number_packages_label")
75                self.size_update_label=builder.get_object("size_update_label")
76                self.view_packages_button_box=builder.get_object("view_packages_button_box")
77                self.view_packages_eb=builder.get_object("view_packages_eventbox")
78                self.view_packages_eb.add_events(Gdk.EventMask.BUTTON_RELEASE_MASK)
79                self.view_packages_eb.connect("button-release-event", self.view_packages_clicked)
80                self.view_packages_label=builder.get_object("view_packages_label")
81
82                self.update_button=builder.get_object("update_button")
83                self.update_button.connect("button-press-event",self.install_packages)
84                self.update_button_label=builder.get_object("update_button_label")
85                self.terminal_label=builder.get_object("terminal_label")
86                self.viewport=builder.get_object("viewport")
87                self.terminal_scrolled=builder.get_object("terminalScrolledWindow")
88                self.vterminal=Vte.Terminal()
89                font_terminal = Pango.FontDescription("monospace normal 10")
90                self.vterminal.set_font(font_terminal)
91                self.terminal_scrolled.add(self.vterminal)
92               
93
94                self.packages_box=builder.get_object("packages_box")
95                self.return_arrow_box=builder.get_object("return_arrow_box")
96                self.return_arrow_eb=builder.get_object("return_arrow_eventbox")
97                self.return_arrow_eb.add_events(Gdk.EventMask.BUTTON_RELEASE_MASK)
98                self.return_arrow_eb.connect("button-release-event", self.arrow_clicked)
99                self.packages_label=builder.get_object("packages_label")
100       
101
102                self.stack.add_titled(self.gather_box,"gather","Gather")
103                self.stack.add_titled(self.update_box,"update", "Update")
104                self.stack.add_titled(self.packages_box, "packages", "Packages")
105
106                self.main_box.add(self.stack)
107
108                self.window.show_all()
109                self.terminal_scrolled.hide()
110                self.viewport.hide()
111                self.terminal_label.hide()
112                self.cancel_button_box.hide()
113
114                #self.pbar_label.hide()
115                self.pbar.show()
116               
117                self.window.connect("destroy",self.quit)
118               
119               
120                self.set_css_info()
121                #self.get_update_info()
122
123
124                GLib.timeout_add(100,self.pulsate_gathering_info)
125               
126                self.t=threading.Thread(target=self.gather_info)
127                self.t.daemon=True
128                self.t.start()
129                self.no_mirror=False
130
131                GObject.threads_init()
132                Gtk.main()
133
134
135        def set_css_info(self):
136       
137                css = """
138
139
140                #WHITE_BACKGROUND {
141                        background-image:-gtk-gradient (linear, left top, left bottom, from (#ffffff),  to (#ffffff));;
142               
143                }
144
145                #BUTTON_LABEL{
146                        color:white;
147                        font: Roboto 10;
148                }
149
150                #DISABLED_BUTTON_OVER{
151                        background-image:-gtk-gradient (linear, left top, left bottom, from (#888888),  to (#888888));;
152                }
153               
154                #DISABLED_BUTTON{
155                        background-image:-gtk-gradient (linear, left top, left bottom, from (#666666),  to (#666666));;
156                }
157               
158                #CANCEL_BUTTON{
159                        background-image:-gtk-gradient (linear, left top, left bottom, from (#D32F2F),  to (#D32F2F));;
160                }
161               
162                #CANCEL_BUTTON_OVER{
163                        background-image:-gtk-gradient (linear, left top, left bottom, from (#F44336),  to (#F44336));;
164                }
165
166                #BUTTON_COLOR {
167                        background-image:-gtk-gradient (linear, left top, left bottom, from (#448AFF),  to (#448AFF));;
168               
169                }
170               
171                #UPDATE_BUTTON_LABEL{
172                        color:white;
173                        font: Roboto 11;
174                }
175               
176                #UPDATE_BUTTON_COLOR {
177                        background-image:-gtk-gradient (linear, left top, left bottom, from (#43A047),  to (#43A047));;
178               
179                }
180               
181                #GATHER_ICON_COLOR {
182                        background-image:-gtk-gradient (linear, left top, left bottom, from (#b0bec5),  to (#b0bec5));;
183               
184                }
185               
186               
187                #BLUE_FONT {
188                        color: #3366cc;
189                        font: Roboto 10;
190                       
191                }       
192               
193
194                #LABEL_OPTION{
195               
196                        color: #808080;
197                        font: Roboto 11;
198                }
199               
200                """
201
202                self.style_provider=Gtk.CssProvider()
203                self.style_provider.load_from_data(css)
204                Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(),self.style_provider,Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
205               
206                self.update_box.set_name("WHITE_BACKGROUN")
207                self.gather_logo_box.set_name("GATHER_ICON_COLOR")
208                self.gather_label.set_name("BLUE_FONT")
209
210                self.yes_button_box.set_name("BUTTON_COLOR")
211                self.yes_button_label.set_name("BUTTON_LABEL")
212
213                self.no_button_box.set_name("BUTTON_COLOR")
214                self.no_button_label.set_name("BUTTON_LABEL")
215
216                self.view_packages_button_box.set_name("BUTTON_COLOR")
217                self.view_packages_label.set_name("BUTTON_LABEL")
218
219                self.cancel_button_box.set_name("BUTTON_COLOR")
220                self.cancel_label.set_name("BUTTON_LABEL")     
221
222                self.version_label.set_name("LABEL_OPTION")     
223                self.number_packages_label.set_name("LABEL_OPTION")
224                self.size_update_label.set_name("LABEL_OPTION")
225                self.update_button_label.set_name("UPDATE_BUTTON_LABEL")
226                self.update_button.set_name("UPDATE_BUTTON_COLOR")
227                self.terminal_label.set_name("LABEL_OPTION")
228
229
230                self.packages_label.set_name("LABEL OPTION")
231               
232
233
234        def gather_info(self):
235
236                cmd="sudo apt-get update"
237                msg_gather="<span><b>"+_("Do you want to update your mirror?")+"</b></span>"
238                self.gather_label.set_markup(msg_gather)
239
240                if not self.no_mirror:
241                        p=subprocess.Popen([cmd],shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)     
242                        output=p.communicate() 
243
244       
245        def pulsate_gathering_info(self):
246               
247                self.pbar.pulse()
248               
249                if not self.t.is_alive():
250                       
251                        self.get_update_info()
252                        self.pbar.hide()
253                        self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT)
254                        self.stack.set_visible_child_name("update")     
255                        self.cancel_button_box.show()
256
257                return self.t.is_alive()       
258
259        def execute(self):
260               
261                self.vterminal.spawn_sync(
262                        Vte.PtyFlags.DEFAULT,
263                        os.environ['HOME'],
264                        ["/usr/sbin/dpkg-reconfigure", "xdm"],
265                        [],
266                        GLib.SpawnFlags.DO_NOT_REAP_CHILD,
267                        None,
268                        None,
269                )
270
271                               
272        def install_packages(self,widget, event=None):
273                self.t=threading.Thread(target=self.execute,args=())
274                self.t.daemon=True
275                self.t.start()
276                GLib.timeout_add(100,self.pulsate_pbar)
277                self.pbar.show()
278                self.viewport.show()
279                self.terminal_scrolled.show()
280                self.terminal_label.show()
281                msg_terminal=_("Update process details")
282                self.terminal_label.set_markup(msg_terminal)
283                               
284       
285        def get_update_info(self):
286                self.version_update="16.160916"
287                self.number_pkg="15"
288                self.size_update="100 Mb"
289               
290                msg_version=_("Version available: ")+"<span foreground='#3366cc'><b>"+self.version_update+"</b></span>"
291                msg_number=_("Number packages: ")+"<span foreground='#3366cc'><b>"+self.number_pkg+"</b></span>"
292                msg_size=_("Size of update: ")+"<span foreground='#3366cc'><b>"+self.size_update+"</b></span>"
293               
294                self.version_label.set_markup(msg_version)
295                self.number_packages_label.set_markup(msg_number)
296                self.size_update_label.set_markup(msg_size)
297               
298
299        def pulsate_pbar(self):
300                if not self.t.is_alive():
301                        self.pbar.pulse()
302                else:
303                        self.pbar.hide()
304                       
305        def view_packages_clicked(self,widget,event):
306                self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT)
307                self.stack.set_visible_child_name("packages")
308
309
310        def no_button_clicked(self,widget,event):
311                self.yes_button_box.hide()
312                self.no_button_box.hide()
313                msg_gather="<span><b>"+_("Checking for updates...")+"</b></span>"
314                self.gather_label.set_markup(msg_gather)
315                #self.stack.set_visible_child_name("update")   
316                self.no_mirror=True
317
318        def arrow_clicked(self,widget,event):
319                self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_RIGHT)
320                self.stack.set_visible_child_name("update")     
321       
322
323        def quit(self,widget,event=None):
324               
325                Gtk.main_quit() 
326
327#class LliurexMirror
328
329at=LliurexUp()         
Note: See TracBrowser for help on using the repository browser.