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

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

WIP on locale

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