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

Last change on this file since 3853 was 3853, checked in by daduve, 2 years ago

Exit aplly changes, new current.core.var

File size: 13.6 KB
Line 
1import gi
2gi.require_version('Gtk', '3.0')
3from gi.repository import Gtk, Pango, GdkPixbuf, Gdk, Gio, GObject,GLib
4
5import copy
6import gettext
7import Core
8
9import Dialog
10import time
11import threading
12import sys
13
14_=gettext.gettext
15
16
17RSRC="./"
18
19
20class AptBox(Gtk.VBox):
21       
22        def __init__(self):
23               
24                Gtk.VBox.__init__(self)
25               
26                self.core=Core.Core.get_core()
27               
28                builder=Gtk.Builder()
29                ui_path=RSRC + "lliurex-remote-installer.ui"
30                builder.add_from_file(ui_path)
31                self.main_box=builder.get_object("section_box")
32                self.list_box=builder.get_object("list_box")
33                self.package_list_box=builder.get_object("package_list_box")
34                self.package_list_vp=builder.get_object("package_list_viewport")
35                self.add_package_button=builder.get_object("add_package_button")
36                self.delete_apt_button=builder.get_object("delete_button")
37                self.add_apt_button=builder.get_object("add_button")
38                self.apply_button=builder.get_object("apply_button")
39                self.url_entry=builder.get_object("url_entry")
40                self.data_box=builder.get_object("apt_data_box")
41                self.data_vp=builder.get_object("apt_data_viewport")
42                self.package_label=builder.get_object("package_label")
43                self.url_label=builder.get_object("url_label")
44                self.new_package_window=builder.get_object("new_package_window")
45                self.new_apt_window=builder.get_object("new_apt_window")
46                self.cancel_apt_button=builder.get_object("cancel_apt_button")
47                self.accept_apt_button=builder.get_object("accept_apt_button")
48                self.cancel_add_package_button=builder.get_object("cancel_add_package_button")
49                self.accept_add_package_button=builder.get_object("accept_add_package_button")
50                self.apt_name_entry=builder.get_object("apt_name_entry")
51                self.apt_url_entry=builder.get_object("apt_url_entry")
52                self.apt_msg_label=builder.get_object("apt_msg_label")
53                self.package_msg_label=builder.get_object("package_msg_label")
54                self.apply_changes_button=builder.get_object("apply_changes_button")
55                self.package_list_entry=builder.get_object("package_list_entry")
56               
57                self.stack=Gtk.Stack()
58                self.stack.set_transition_type(Gtk.StackTransitionType.CROSSFADE)
59                self.stack.set_transition_duration(250)
60                hbox=Gtk.HBox()
61                hbox.show()
62                self.stack.add_titled(hbox,"empty","Empty Box")
63                self.stack.add_titled(self.data_box,"apt_data","Apt Data Box")
64                self.data_vp.add(self.stack)
65               
66                self.pack_start(self.main_box,True,True,0)
67               
68               
69                self.connect_signals()
70                self.set_css_info()
71               
72                self.core.current_var=None
73                self.current_id=None
74               
75                self.thread=threading.Thread()
76                self.thread_ret=None
77               
78        #def __init__
79       
80       
81        def set_css_info(self):
82               
83                self.style_provider=Gtk.CssProvider()
84                f=Gio.File.new_for_path("lliurex-remote-installer.css")
85                self.style_provider.load_from_file(f)
86                Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(),self.style_provider,Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
87                self.package_label.set_name("OPTION_LABEL")
88                self.url_label.set_name("OPTION_LABEL")
89               
90                       
91        #def set-css_info
92       
93       
94        def connect_signals(self):
95               
96                self.add_apt_button.connect("clicked",self.add_apt_button_clicked)
97                self.delete_apt_button.connect("clicked",self.delete_apt_button_clicked)
98                self.add_package_button.connect("clicked",self.add_package_clicked)
99               
100                self.accept_add_package_button.connect("clicked",self.accept_add_package_button_clicked)
101                self.cancel_add_package_button.connect("clicked",self.cancel_add_package_button_clicked)
102               
103                self.accept_apt_button.connect("clicked",self.accept_apt_button_clicked)
104                self.cancel_apt_button.connect("clicked",self.cancel_apt_button_clicked)
105               
106                self.apply_changes_button.connect("clicked",self.apply_changes_button_clicked)
107                self.url_entry.connect("changed",self.url_entry_changed)
108               
109                self.new_package_window.connect("delete_event",self.hide_window)
110                self.new_apt_window.connect("delete_event",self.hide_window)
111               
112        #def connect_signals
113       
114       
115        def hide_window(self,widget,event):
116               
117                widget.hide()
118                return True
119               
120        #def new_package_window
121
122
123        def check_changes(self,widget=True,event=True,manage_dialog=False):
124               
125               
126                if not manage_dialog:
127                        if self.core.current_var==None:
128                                return False
129                        return self.core.current_var != self.core.var
130               
131               
132                if self.core.current_var!=None and self.core.current_var != self.core.var:
133                        if not self.changes_detected_dialog(False):
134                                return True
135               
136                sys.exit(0)
137                       
138
139        #def check_changes
140               
141       
142        def set_info(self,info):
143               
144                #Empty list
145                for x in self.list_box.get_children():
146                        self.list_box.remove(x)
147               
148                self.core.var=info
149               
150                times=1
151               
152                for t in range(0,times):
153                        if self.core.var["apt"] not in [{},"",None,'{}']:
154                                for x in self.core.var["apt"]:
155                                        self.new_apt_button(x)
156                       
157                self.core.current_var=copy.deepcopy(self.core.var)
158                self.list_box.show_all()
159               
160
161        #def set_info
162       
163
164        def new_apt_button(self,source_name):
165               
166                new_source_name=source_name
167               
168                if len(source_name) > 8:
169                       
170                        new_source_name=source_name[0:7]+"..."
171               
172                b=Gtk.Button(new_source_name)
173                b.connect("clicked",self.apt_clicked,source_name)
174                b.set_size_request(100,100)
175                b.set_halign(Gtk.Align.START)
176                b.set_name("OPTION_BUTTON")
177                b.show_all()
178                self.list_box.pack_start(b,False,False,5)
179                b.queue_draw()
180                b.set_tooltip_text(source_name)
181               
182                return b
183               
184        #def new_apt_button
185
186       
187        def new_package_button(self,pkg_name):
188               
189                hbox=Gtk.HBox()
190                label=Gtk.Label(pkg_name)
191                b=Gtk.Button()
192                i=Gtk.Image.new_from_file("trash.svg")
193                b.add(i)
194                b.set_halign(Gtk.Align.CENTER)
195                b.set_valign(Gtk.Align.CENTER)
196                b.set_name("DELETE_ITEM_BUTTON")
197                b.connect("clicked",self.delete_package_clicked,hbox)
198                hbox.pack_start(label,False,False,0)
199                hbox.pack_end(b,False,False,10)
200                hbox.show_all()
201                label.set_margin_right(20)
202                label.set_margin_left(20)
203                label.set_margin_top(20)
204                label.set_margin_bottom(20)
205                hbox.set_name("PKG_BOX")
206                self.package_list_box.pack_start(hbox,False,False,5)
207                self.package_list_box.queue_draw()
208                hbox.queue_draw()
209               
210        #def new_package_button
211       
212       
213        # ## APT ### ################################################
214       
215        def apt_clicked(self,widget,apt_id,ignore_changes=False):
216               
217               
218                if not ignore_changes:
219                       
220                        if self.core.current_var!=None:
221                                if self.check_changes():
222                                        if not self.changes_detected_dialog(False):
223                                                return
224                       
225                        if apt_id !=self.current_id:
226                                self.core.current_var=copy.deepcopy(self.core.var)
227                               
228                self.current_id=apt_id
229               
230                self.stack.set_visible_child_name("apt_data")
231
232                for b in self.list_box.get_children():
233                        b.set_name("OPTION_BUTTON")
234                       
235                widget.set_name("SELECTED_OPTION_BUTTON")
236                       
237               
238                for x in self.package_list_box.get_children():
239                        self.package_list_box.remove(x)
240                       
241                self.url_entry.set_text(self.core.current_var["apt"][apt_id]["url"])
242                       
243                for x in self.core.current_var["apt"][apt_id]["packages"]:
244                        self.new_package_button("%s"%x)
245                               
246                               
247                self.package_list_box.show_all()
248               
249                if not ignore_changes:
250               
251                        for apt in self.list_box:
252                                if apt.get_tooltip_text() not in self.core.current_var["apt"]:
253                                        self.list_box.remove(apt)
254                       
255               
256               
257                #self.core.lri.main_window.connect("delete_event",self.check_changes,True)
258               
259               
260        #def apt_clicked
261       
262        def add_apt_button_clicked(self,widget):
263               
264                self.apt_name_entry.set_text("")
265                self.apt_url_entry.set_text("")
266                self.apt_msg_label.set_text("")
267                self.new_apt_window.show()
268               
269        #def add_button_clicked
270       
271       
272        def delete_apt_button_clicked(self,widget):
273               
274                if self.current_id==None:
275                        return
276               
277                if self.delete_apt_dialog(self.current_id):
278                        for apt_button in self.list_box.get_children():
279                               
280                                if apt_button.get_tooltip_text() == self.current_id:
281                                        self.list_box.remove(apt_button)
282                                        self.stack.set_visible_child_name("empty")
283                                        self.core.var["apt"].pop(self.current_id)
284                                        self.current_id=None
285                                        self.core.current_var=None
286                                        self.core.n4d.set_variable(self.core.var)
287               
288        #def add_button_clicked
289       
290        def accept_apt_button_clicked(self,widget):
291               
292               
293                name=self.apt_name_entry.get_text()
294                source=self.apt_url_entry.get_text()
295               
296                if len(name) < 1 or len(source) < 8:
297                        self.apt_msg_label.set_markup("<span foreground='red'>"+"Invalid values"+"</span>")
298                        return
299                if name in self.core.var["apt"]:
300                        self.apt_msg_label.set_markup("<span foreground='red'>"+"Apt name already exists"+"</span>")
301                        return
302               
303                if len(name) > 0 and len(source)>0 and name not in self.core.var:
304                        name=(name.lower())
305                        b=self.new_apt_button(name)
306                       
307                        if self.core.current_var ==None:
308                                self.core.current_var=copy.deepcopy(self.core.var)
309                               
310                        self.core.current_var["apt"][name]={}
311                        self.core.current_var["apt"][name]["packages"]=[]
312                        self.core.current_var["apt"][name]["url"]=source
313                        self.new_apt_window.hide()
314                       
315                        self.core.var=copy.deepcopy(self.core.current_var)
316                        self.core.n4d.set_variable(self.core.var)
317                       
318                        self.apt_clicked(b,name,True)
319                       
320
321               
322        #def accept_apt_button_clicked
323       
324       
325        def cancel_apt_button_clicked(self,widget):
326               
327                self.new_apt_window.hide()
328               
329        #def cancel_apt_button_clicked
330       
331        # #################################################### #####
332       
333       
334       
335        # #### PACKAGE CHANGES ################### #
336       
337       
338        def add_package_clicked(self,widget):
339               
340                self.package_list_entry.set_text("")
341                self.new_package_window.show()
342               
343        #def add_package_clicked
344       
345       
346        def delete_package_clicked(self,button,hbox):
347               
348                pkg=hbox.get_children()[0].get_text()
349               
350                if self.delete_package_dialog(pkg):
351               
352                        self.package_list_box.remove(hbox)
353                               
354                        for p in range(len(self.core.current_var["apt"][self.current_id]["packages"])-1,-1,-1):
355                                if self.core.current_var["apt"][self.current_id]["packages"][p]==pkg:
356                                        self.core.current_var["apt"][self.current_id]["packages"].pop(p)
357                                       
358                        # STORE VALUE IN N4D HERE IF NEEDED
359                       
360                        # ######### #
361       
362        #def delete_package_clicked
363       
364       
365        def url_entry_changed(self,widget):
366               
367                if self.core.current_var !=None:
368                        txt=widget.get_text()
369                        if len(txt)>6:
370                                self.core.current_var["apt"][self.current_id]["url"]=txt
371
372        #def url_entry_changed 
373       
374       
375        def accept_add_package_button_clicked(self,widget):
376               
377               
378                self.package_list_entry.grab_focus()
379                txt=self.package_list_entry.get_text()
380               
381                for pkg in txt.split(","):
382                       
383                        pkg=pkg.strip(" ")
384                        if pkg not in self.core.current_var["apt"][self.current_id]["packages"]:
385                                self.core.current_var["apt"][self.current_id]["packages"].append(pkg)
386                        self.new_package_button(pkg)
387                       
388                self.new_package_window.hide()
389               
390        #def accept_add_package_button_clicked
391       
392       
393        def cancel_add_package_button_clicked(self,widget):
394               
395                self.new_package_window.hide()
396               
397        #def cancel_add_package_button_clicked
398       
399       
400        def apply_changes_button_clicked(self,widget):
401               
402                self.thread=threading.Thread(target=self.apply_changes_thread)
403                self.thread.daemon=True
404                self.thread.start()
405               
406                main_window=self.core.lri.main_window
407                dialog=Dialog.ApplyingChangesDialog(main_window)
408                dialog.show()
409                GLib.timeout_add(500,self.check_apply_thread,dialog)
410               
411        #def apply_changes_button_clicked
412       
413       
414        def apply_changes_thread(self):
415               
416                try:
417                        self.core.dprint("Applying changes...")
418               
419                        # SAMPLE CODE
420                       
421                        #self.core.n4d.lliurex_version()
422                        print "testeando....."
423                        #time.sleep(1.5)
424                        # ######### #
425                       
426                        self.core.var=copy.deepcopy(self.core.current_var)
427                        self.test_apt=self.core.n4d.test_apt_list(self.core.var)
428                        self.thread_ret={"status":True,"msg":"SE HA ROTO"}
429       
430                        # store return value here
431                       
432                       
433                       
434                except Exception as e:
435                        print e
436                        return False
437               
438               
439        #def apply_changes_thread
440       
441        def check_apply_thread(self,dialog):
442               
443               
444                if self.thread.is_alive():
445                        return True
446               
447                dialog.destroy()
448               
449               
450                if self.test_apt[0]:
451                        if self.test_apt[3] not in [None,"","[]",[]]:
452                                if self.delete_test_apt_dialog(self.test_apt[3]):
453                                        self.core.n4d.set_variable(self.test_apt[1])
454                                        self.core.var=copy.deepcopy(self.test_apt[1])
455                                        self.core.current_var=copy.deepcopy(self.test_apt[1])
456                                else:
457                                        self.core.n4d.set_variable(self.core.var)
458                        self.core.dprint("Done")
459                else:
460                        self.core.dprint("Error en el test, no se guarda la variable")
461               
462               
463                for b in self.list_box:
464                        if b.get_tooltip_text()==self.current_id:
465                                break
466               
467               
468                self.apt_clicked(b,self.current_id)
469               
470               
471               
472                if not self.thread_ret["status"]:
473                        mw=self.core.lri.main_window
474                        d=Dialog.ErrorDialog(mw,"asdasd",self.thread_ret["msg"])
475                        d.run()
476                        d.destroy()
477               
478
479                return False
480               
481        #def check_thread
482       
483       
484        # ######################################################### #
485       
486
487        # ### DIALOGS ##### ##################
488       
489        def delete_apt_dialog(self,pkg_name):
490               
491                main_window=self.core.lri.main_window
492               
493                dialog=Dialog.QuestionDialog(main_window,"Delete apt list","Do you want to delete '%s' packages list?"%pkg_name)
494                response=dialog.run()
495                dialog.destroy()
496               
497                if response== Gtk.ResponseType.OK:
498                        return True
499               
500                return False
501               
502        #def delete_package_dialog
503       
504        def delete_test_apt_dialog(self,pkg_name_orig):
505               
506                main_window=self.core.lri.main_window
507                pkg_name='\n'.join(pkg_name_orig)
508                dialog=Dialog.QuestionDialog(main_window,"Delete apt list","This pakage list is unavaiable from your repos:\n%s\nDo you want delete it?"%pkg_name)
509                response=dialog.run()
510                dialog.destroy()
511               
512                if response== Gtk.ResponseType.OK:
513                        return True
514               
515                return False
516               
517        #def delete_package_dialog
518       
519        def delete_package_dialog(self,pkg_name):
520               
521                main_window=self.core.lri.main_window
522                dialog=Dialog.QuestionDialog(main_window,"Delete package","Do you want to delete '%s'?"%pkg_name)
523                response=dialog.run()
524                dialog.destroy()
525               
526                if response== Gtk.ResponseType.OK:
527                        return True
528               
529                return False
530               
531        #def delete_package_dialog
532       
533        def changes_detected_dialog(self,force_exit=False):
534               
535                main_window=self.core.lri.main_window
536               
537                dialog=Dialog.QuestionDialog(main_window,"Changes detected","There are unsaved changes. Do you want to discard them?")
538                response=dialog.run()
539                dialog.destroy()
540               
541                if response== Gtk.ResponseType.OK:
542                        if force_exit:
543                                sys.exit(0)
544                               
545                        return True
546               
547                return False
548               
549        #def changes_detected_dialog
550       
551        # #####################################################
552               
553       
554       
555       
556#class aptbox
Note: See TracBrowser for help on using the repository browser.