source: lliurex-remote-installer/trunk/fuentes/lliurex-remote-installer-gui.install/usr/share/lliurex-remote-installer/LliurexRemoteInstaller.py @ 4474

Last change on this file since 4474 was 4474, checked in by Juanma, 4 years ago

WIP on locale

File size: 11.5 KB
Line 
1import gi
2gi.require_version('Gtk', '3.0')
3from gi.repository import Gtk, Pango, GdkPixbuf, Gdk, Gio, GObject,GLib
4
5
6import gettext
7import signal
8
9import Core
10import Dialog
11import sys
12import time
13import threading
14
15signal.signal(signal.SIGINT, signal.SIG_DFL)
16gettext.textdomain('lliurex-remote-installer-gui')
17_=gettext.gettext
18
19
20RSRC="./"
21
22
23
24class LliurexRemoteInstaller:
25       
26       
27        #VALORES DE LOS DICCIONARIOS
28        DEB='deb'
29        APT='apt'
30        SH='sh'
31        LIST='lista'
32        URL='url'
33       
34        def __init__(self):
35               
36                self.core=Core.Core.get_core()
37               
38        #def init
39       
40        def load_gui(self):
41               
42                builder=Gtk.Builder()
43                builder.set_translation_domain('lliurex-remote-installer-gui')
44                ui_path=RSRC + "lliurex-remote-installer.ui"
45                builder.add_from_file(ui_path)
46               
47                self.main_window=builder.get_object("main_window")
48                self.main_box=builder.get_object("main_box")
49                self.apt_button=builder.get_object("apt_button")
50                self.debs_button=builder.get_object("debs_button")
51                self.exes_button=builder.get_object("exes_button")
52               
53               
54                #PANTALLA LOGIN
55                self.login_da_box=builder.get_object("login_da_box")
56                self.login_da=builder.get_object("login_drawingarea")
57                #self.login_da.connect("draw",self.draw_login)
58               
59                self.login_overlay=Gtk.Overlay()
60                self.login_overlay.add(self.login_da_box)
61               
62                self.login_box=builder.get_object("login_box")
63                self.login_button=builder.get_object("login_button")
64                self.user_entry=builder.get_object("user_entry")
65                self.password_entry=builder.get_object("password_entry")
66                self.login_eb_box=builder.get_object("login_eb_box")
67                self.login_msg_label=builder.get_object("login_msg_label")
68                self.server_ip_entry=builder.get_object("server_ip_entry")
69                self.validate_spinner=builder.get_object("validate_spinner")
70       
71                self.login_overlay.add_overlay(self.login_box)
72                self.login_overlay.show_all()
73               
74               
75                #FIN LOGIN
76               
77               
78                self.separator1=builder.get_object("separator1")
79                self.separator3=builder.get_object("separator3")
80                self.main_button_box=builder.get_object("box1")
81               
82
83
84               
85                self.stack=Gtk.Stack()
86                self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_DOWN)
87                self.stack.set_transition_duration(500)
88                self.main_box.pack_start(self.stack,True,True,5)
89               
90                # Add components
91               
92                self.apt_box=self.core.apt_box
93                self.stack.add_titled(self.apt_box,"apt","Apt")
94                self.deb_box=self.core.deb_box
95                self.stack.add_titled(self.deb_box,"debs","Debs")
96                self.exec_box=self.core.exec_box
97                self.stack.add_titled(self.exec_box,"exes","Executables")
98               
99                self.stack.add_titled(self.login_overlay,"login","Login")
100               
101                self.set_css_info()
102                self.connect_signals()
103                #self.load_values()
104               
105                self.not_validate=True
106               
107                self.main_window.show_all()
108                self.show_main_controls(False)
109                self.validate_spinner.hide()
110               
111               
112               
113        #def load_gui
114       
115       
116        def show_main_controls(self,status):
117               
118                if status:
119                        self.separator1.show()
120                        self.separator3.show()
121                        self.main_button_box.show()
122                else:
123                        self.separator1.hide()
124                        self.separator3.hide()
125                        self.main_button_box.hide()
126               
127        #def show_main_controls
128       
129       
130       
131        def load_values(self):
132               
133               
134               
135                self.core.n4d.test_var()
136                var_init=self.core.n4d.get_variable()
137                if var_init[0]:
138                        variable=var_init[1]
139                else:
140                        pass
141                        # #### LA VARIABLE NO EXISTE DEBEMOS DE INCIALIZARLA INICIALMENTE PARA QUE NO DE ERROR, AUNQUE CREO QUE ESO YA LO HACE LA API.
142               
143                var={}
144                var=variable
145               
146                self.apt_box.set_info(var)
147                self.deb_box.set_info(var)
148                self.exec_box.set_info(var)
149               
150               
151        #def load_values
152       
153        def set_css_info(self):
154               
155                self.style_provider=Gtk.CssProvider()
156                f=Gio.File.new_for_path("lliurex-remote-installer.css")
157                self.style_provider.load_from_file(f)
158                Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(),self.style_provider,Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
159                self.main_window.set_name("WINDOW")
160               
161                self.apt_button.set_name("SELECTED_OPTION_BUTTON")
162                self.debs_button.set_name("OPTION_BUTTON")
163                self.exes_button.set_name("OPTION_BUTTON")
164                self.login_msg_label.set_name("ERROR_LABEL")
165                       
166        #def set-css_info
167       
168        def connect_signals(self):
169               
170                self.main_window.connect("destroy",self.check_changes)
171                #self.main_window.connect("destroy",Gtk.main_quit)
172                self.apt_button.connect("clicked",self.apt_button_clicked)
173                self.debs_button.connect("clicked",self.debs_button_clicked)
174                self.exes_button.connect("clicked",self.exes_button_clicked)
175                self.main_window.connect("delete_event",self.check_changes)
176               
177                self.user_entry.connect("activate",self.entries_press_event)
178                self.password_entry.connect("activate",self.entries_press_event)
179                self.server_ip_entry.connect("activate",self.entries_press_event)
180                self.login_button.connect("clicked",self.validate_user)
181               
182        #def connect_signals
183       
184        def entries_press_event(self,widget):
185               
186                self.validate_user(None)
187               
188        #def entries_press_event
189
190       
191       
192        def validate_user_thread(self):
193               
194                self.login_ret=self.core.n4d.validate_user(self.user_entry.get_text(),self.password_entry.get_text(),self.server_ip_entry.get_text())
195               
196        #def validate_user_thread
197               
198       
199        def validate_user(self,widget):
200               
201                self.login_msg_label.hide()
202                self.validate_spinner.show()
203               
204                self.login_button.set_sensitive(False)
205               
206                self.thread=threading.Thread(target=self.validate_user_thread)
207                self.thread.daemon=True
208                self.thread.start()
209
210                GLib.timeout_add(500,self.validate_user_thread_listener)
211               
212               
213        #def validate_user
214       
215        def validate_user_thread_listener(self):
216               
217                if self.thread.is_alive():
218                        return True
219               
220                if not self.login_ret[0]:
221                        self.login_msg_label.set_text("%s"%self.login_ret[1])
222                        self.validate_spinner.hide()
223                        self.login_msg_label.show()
224                        self.login_button.set_sensitive(True)
225
226                else:
227                       
228                        self.load_values()
229                        self.stack.set_visible_child_name("apt")
230                        self.show_main_controls(True)
231                        self.not_validate=False
232               
233                return False
234               
235               
236               
237        #def validate_user_thread
238       
239        def check_changes(self,widget,event):
240               
241               
242                if self.not_validate:
243                        sys.exit(0)
244               
245                if self.core.current_var!=None and self.core.current_var != self.core.var:
246                        if not self.changes_detected_dialog():
247                                return True
248                #Listamos lo que se ha publicado:
249                COMMENT=[]
250
251                apt_list=False
252                list_apt_pub=[]
253                for id in self.core.var['apt']:
254                        if self.core.var['apt'][id]['packages'] not in [None,"",[],"[]"]:
255                                apt_list=True
256                                for pkg in self.core.var['apt'][id]['packages']:
257                                        list_apt_pub.append(pkg)
258                if apt_list:
259                        COMMENT.append("APT:")
260                        COMMENT=COMMENT+list_apt_pub
261                        COMMENT.append("")
262                if self.core.var['deb']['packages'] not in [None,"",[],"[]"]:
263                        COMMENT.append("DEB:")
264                        COMMENT=COMMENT+self.core.var['deb']['packages']
265                        COMMENT.append("")
266                if self.core.var['sh']['packages'] not in [None,"",[],"[]"]:
267                        COMMENT.append("EXECUTABLES:")
268                        pkg_list=[]
269                        for (pkg,md5) in self.core.var['sh']['packages']:
270                                pkg_list.append(pkg)
271                        COMMENT=COMMENT+pkg_list
272                if COMMENT not in [None,"",[]]:
273                        COMMENT='\n'.join(COMMENT)
274                        dialog=Dialog.InfoDialog(self.main_window,_(u"LliureX Remote Installer Summary"),_(u"You published this list to install:\n\n%s")%(COMMENT))
275                        response=dialog.run()
276                        dialog.destroy()
277               
278               
279                sys.exit(0)
280               
281        #def check_changes
282       
283       
284        def changes_detected_dialog(self):
285               
286               
287                dialog=Dialog.QuestionDialog(self.main_window,_(u"Changes detected"),_(u"There are unsaved changes. Do you want to discard them?"))
288                response=dialog.run()
289                dialog.destroy()
290               
291                if response== Gtk.ResponseType.OK:
292                        return True
293               
294                return False
295               
296        #def changes_detected_dialog
297               
298       
299       
300        def start_gui(self):
301               
302                GObject.threads_init()
303                Gtk.main()
304               
305        #def start_gui
306       
307        def apt_button_clicked(self,widget):
308               
309                change_child=True
310                if self.stack.get_visible_child_name()=="debs":
311                        selected="deb"
312                if self.stack.get_visible_child_name()=="exes":
313                        selected="sh"
314                       
315                       
316                if self.stack.get_visible_child_name()=="debs":
317                        if self.deb_box.check_changes():
318                                change_child=self.deb_box.changes_detected_dialog()
319                                if change_child:
320                                        self.deb_box.set_info(self.core.var)
321                                       
322                                        for c in self.deb_box.package_list_box.get_children():
323                                                self.deb_box.package_list_box.remove(c)
324                       
325                                        for x in self.core.var[selected]["packages"]:
326                                                self.deb_box.new_package_button("%s"%x)
327                                               
328                if self.stack.get_visible_child_name()=="exes":
329                        if self.exec_box.check_changes():
330                                change_child=self.exec_box.changes_detected_dialog()
331                                if change_child:
332                                        self.exec_box.set_info(self.core.var)
333                                       
334                                        for c in self.exec_box.package_list_box.get_children():
335                                                self.exec_box.package_list_box.remove(c)
336                       
337                                        for x in self.core.var[selected]["packages"]:
338                                                self.exec_box.new_package_button("%s"%x)
339                                       
340                                       
341                                        #self.apt_box.stack.set_visible_child_name("empty
342                if change_child:
343                        self.apt_box.set_info(self.core.var)
344                        self.stack.set_visible_child_name("apt")
345                        self.apt_button.set_name("SELECTED_OPTION_BUTTON")
346                        self.debs_button.set_name("OPTION_BUTTON")
347                        self.exes_button.set_name("OPTION_BUTTON")
348               
349        #def apt_button_clicked
350       
351        def debs_button_clicked(self,widget):
352               
353                change_child=True
354               
355                if self.stack.get_visible_child_name()=="apt":
356                        if self.apt_box.check_changes():
357                                change_child=self.apt_box.changes_detected_dialog()
358                                if change_child:
359                                        self.apt_box.set_info(self.core.var)
360                                        apt_id=self.apt_box.current_id
361                                        self.apt_box.url_entry.set_text(self.core.var["apt"][apt_id]["url"])
362                                       
363                                        for x in self.apt_box.package_list_box.get_children():
364                                                self.apt_box.package_list_box.remove(x)
365                       
366                                        for x in self.core.var["apt"][apt_id]["packages"]:
367                                                self.apt_box.new_package_button("%s"%x)
368                                               
369                if self.stack.get_visible_child_name()=="exes":
370                        if self.exec_box.check_changes():
371                                change_child=self.exec_box.changes_detected_dialog()
372                                if change_child:
373                                        self.exec_box.set_info(self.core.var)
374                                       
375                                        for c in self.exec_box.package_list_box.get_children():
376                                                self.exec_box.package_list_box.remove(c)
377                       
378                                        for x in self.core.var["sh"]["packages"]:
379                                                self.exec_box.new_package_button("%s"%x)
380                       
381                                       
382                                       
383                                        #self.apt_box.stack.set_visible_child_name("empty")
384                       
385                       
386               
387                if change_child:
388                        self.deb_box.set_info(self.core.var)
389                        self.stack.set_visible_child_name("debs")
390                        self.apt_button.set_name("OPTION_BUTTON")
391                        self.debs_button.set_name("SELECTED_OPTION_BUTTON")
392                        self.exes_button.set_name("OPTION_BUTTON")
393               
394        #def debs_button_clicked
395       
396        def exes_button_clicked(self,widget):
397               
398                change_child=True
399               
400                if self.stack.get_visible_child_name()=="apt":
401                        if self.apt_box.check_changes():
402                                change_child=self.apt_box.changes_detected_dialog()
403                                if change_child:
404                                        self.apt_box.set_info(self.core.var)
405                                        apt_id=self.apt_box.current_id
406                                        self.apt_box.url_entry.set_text(self.core.var["apt"][apt_id]["url"])
407                                       
408                                        for x in self.apt_box.package_list_box.get_children():
409                                                self.apt_box.package_list_box.remove(x)
410                       
411                                        for x in self.core.var["apt"][apt_id]["packages"]:
412                                                self.apt_box.new_package_button("%s"%x)
413                                               
414                if self.stack.get_visible_child_name()=="debs":
415                        if self.deb_box.check_changes():
416                                change_child=self.deb_box.changes_detected_dialog()
417                                if change_child:
418                                        self.deb_box.set_info(self.core.var)
419                                       
420                                        for c in self.deb_box.package_list_box.get_children():
421                                                self.deb_box.package_list_box.remove(c)
422                       
423                                        for x in self.core.var["deb"]["packages"]:
424                                                self.deb_box.new_package_button("%s"%x)
425                       
426                                       
427                                       
428                                        #self.apt_box.stack.set_visible_child_name("empty")
429                       
430                       
431               
432                if change_child:
433               
434                        self.stack.set_visible_child_name("exes")
435                        self.apt_button.set_name("OPTION_BUTTON")
436                        self.debs_button.set_name("OPTION_BUTTON")
437                        self.exes_button.set_name("SELECTED_OPTION_BUTTON")
438               
439        #def exes_button_clicked
440       
441#class LliurexRemoteInstaller
442
443
444if __name__=="__main__":
445       
446        lri=LliurexRemoteInstaller()
447        lri.start_gui()
448       
Note: See TracBrowser for help on using the repository browser.