source: panel-design-manager/trunk/fuentes/panel-design-manager.install/usr/share/panel-design-manager/PanelDesignWindow.py @ 8227

Last change on this file since 8227 was 8227, checked in by hectorgh, 13 months ago

fixed if

  • Property svn:executable set to *
File size: 10.8 KB
Line 
1#!/usr/bin/env python3
2# -*- coding: utf-8 -*
3
4import gi
5gi.require_version('Gtk', '3.0')
6from gi.repository import Gtk,GObject, GLib,Gio,Gdk
7
8import threading
9import copy
10import time
11import sys
12import socket
13import os
14
15import signal
16signal.signal(signal.SIGINT, signal.SIG_DFL)
17import N4dManager
18import PanelDesignManager
19
20import gettext
21gettext.textdomain('panel-design-manager')
22_ = gettext.gettext
23
24
25class PanelDesignWindow:
26       
27        DEBUG=True
28       
29        def __init__(self):
30               
31                self.n4dman=N4dManager.N4dManager("server")
32                self.pdm=PanelDesignManager.PanelDesignManager()
33
34                self.new_conf={}
35                self.new_conf["dconf"]=None
36                self.new_conf["date"]=None
37                self.new_conf["replicate"]=True
38                self.new_conf["plank"]=True
39               
40               
41                self.current_conf={}
42                self.current_conf["dconf"]=None
43                self.current_conf["date"]=None
44                self.current_conf["replicate"]=True
45                self.current_conf["plank"]=True
46                               
47                self.start_gui()
48               
49        #def init
50
51       
52        def dprint(self,data):
53               
54                if PanelDesignWindow.DEBUG:
55                        print("[panel-design-manager] %s"%str(data))
56               
57        #def dprint
58       
59       
60        def where_am_i(self):
61               
62                server="localhost"
63               
64                try:
65               
66                        if os.path.exists("/usr/bin/lliurex-version"):
67                                is_server=os.system("lliurex-version -t server")
68                                is_client=os.system("lliurex-version -t client")
69                                try:
70                                        server_known=socket.gethostbyname("server")
71                                except:
72                                        server_known=None
73                               
74                                if is_server==0 or is_client==0 or server_known!=None:
75                                        server=""
76                                       
77                        else:
78                                server="localhost"
79                       
80                except Exception as e:
81                       
82                        self.dprint(e)
83                        server="localhost"
84               
85                return server
86               
87        #def where_am_i
88       
89       
90        def start_gui(self):
91               
92                builder=Gtk.Builder()
93                builder.set_translation_domain('panel-design-manager')
94                builder.add_from_file("/usr/share/panel-design-manager/rsrc/panel_manager.ui")
95               
96                self.main_window=builder.get_object("window")
97                self.window_vbox=builder.get_object("window_vbox")
98                self.main_box=builder.get_object("main_box")
99
100                self.enable_design_label=builder.get_object("enable_design_label")
101                self.panel_design_label=builder.get_object("panel_design_label")
102                self.panel_info_label=builder.get_object("panel_info_label")
103                self.show_plank_label=builder.get_object("show_plank_label")
104                self.plank_info_label=builder.get_object("plank_info_label")
105                self.configuration_label=builder.get_object("configuration_label")
106                self.replication_label=builder.get_object("replication_label")
107                self.msg_label=builder.get_object("msg_label")
108               
109                self.configuration_image=builder.get_object("configuration_image")
110               
111                self.copy_button=builder.get_object("copy_button")
112                self.options_toolbutton=builder.get_object("options_toolbutton")
113                self.apply_button=builder.get_object("apply_button")
114               
115                self.main_frame=builder.get_object("main_frame")
116               
117                self.enable_design_switch=builder.get_object("enable_design_switch")
118                self.show_plank_switch=builder.get_object("show_plank_switch")
119                self.replication_switch=builder.get_object("replicate_switch")
120               
121                self.login_box=builder.get_object("login_box")
122                self.user_entry=builder.get_object("user_entry")
123                self.password_entry=builder.get_object("password_entry")
124                self.server_ip_entry=builder.get_object("server_ip_entry")
125                self.login_button=builder.get_object("login_button")
126                self.login_msg_label=builder.get_object("login_msg_label")
127               
128                self.changes_dialog=builder.get_object("changes_dialog")
129                self.exit_button=builder.get_object("exit_button")
130                self.cancel_button=builder.get_object("cancel_button")
131                self.changes_label=builder.get_object("changes_label")
132               
133                self.stack=Gtk.Stack()
134                self.stack.set_transition_type(Gtk.StackTransitionType.CROSSFADE)
135                self.stack.set_transition_duration(200)
136                self.stack.add_titled(self.login_box,"login","Login")
137                self.stack.add_titled(self.main_box,"main","Main Box")
138                self.stack.show_all()
139               
140                if self.where_am_i()=="localhost":
141                        self.server_ip_entry.set_text("localhost")
142               
143                self.options_popover=Gtk.Popover()
144                self.options_popover.set_relative_to(self.options_toolbutton)
145               
146                v=Gtk.VBox()
147                self.import_button=Gtk.Button("Import")
148                v.pack_start(self.import_button,True,True,5)
149                self.export_button=Gtk.Button("Export")
150                v.pack_start(self.export_button,True,True,5)
151                self.options_popover.add(v)
152               
153                self.window_vbox.pack_start(self.stack,True,True,0)
154               
155                self.set_css_info()
156                self.connect_signals()
157               
158                self.login_button.grab_focus()
159                self.apply_button.hide()
160                self.main_window.show()
161                GObject.threads_init()
162                Gtk.main()
163               
164        #def start_gui
165
166
167        def set_css_info(self):
168               
169                self.style_provider=Gtk.CssProvider()
170                f=Gio.File.new_for_path("/usr/share/panel-design-manager/rsrc/style.css")
171                self.style_provider.load_from_file(f)
172                Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(),self.style_provider,Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
173               
174                self.main_window.set_name("WHITE-BACKGROUND")
175                self.enable_design_label.set_name("HEADER-LABEL")
176                self.panel_design_label.set_name("DEFAULT-LABEL")
177                self.show_plank_label.set_name("DEFAULT-LABEL")
178                self.replication_label.set_name("DEFAULT-LABEL")
179               
180                self.changes_label.set_name("DEFAULT-LABEL")
181               
182                self.panel_info_label.set_name("INFO-LABEL")
183                self.plank_info_label.set_name("INFO-LABEL")
184                self.configuration_label.set_name("INFO-LABEL")
185               
186                self.import_button.set_name("BORDERLESS-BUTTON")
187                self.export_button.set_name("BORDERLESS-BUTTON")
188               
189        #def set-css_info       
190
191
192        def connect_signals(self):
193               
194                self.main_window.connect("destroy",Gtk.main_quit)
195                self.main_window.connect("delete_event",self.check_changes)
196                self.enable_design_switch.connect("notify::active",self.enable_design_switch_changed)
197               
198                self.options_toolbutton.connect("clicked",self.options_clicked)
199                self.copy_button.connect("clicked",self.copy_clicked)
200                self.apply_button.connect("clicked",self.apply_clicked)
201               
202                self.import_button.connect("clicked",self.import_clicked)
203                self.export_button.connect("clicked",self.export_clicked)
204               
205               
206                self.login_button.connect("clicked",self.login_clicked)
207                self.user_entry.connect("activate",self.entries_press_event)
208                self.password_entry.connect("activate",self.entries_press_event)
209                self.server_ip_entry.connect("activate",self.entries_press_event)
210               
211                self.changes_dialog.connect("delete_event",self.dialog_closed)
212                self.exit_button.connect("clicked",Gtk.main_quit)
213                self.cancel_button.connect("clicked",self.dialog_closed,None)
214               
215        #def connect_signals
216
217
218        def load_current_configuration(self):
219               
220                self.current_conf=self.n4dman.get_configuration()
221                if self.current_conf!=None:
222                        self.main_frame.set_sensitive(self.current_conf["status"])
223                        self.enable_design_switch.set_active(self.current_conf["status"])
224                        self.show_plank_switch.set_active(self.current_conf["plank"])
225                        self.replication_switch.set_active(self.current_conf["replicate"])
226                        if self.current_conf["date"]!=None:
227                                self.configuration_label.set_text(_("Configuration date") +": "+self.current_conf["date"])
228                                self.configuration_image.set_from_stock(Gtk.STOCK_YES,Gtk.IconSize.BUTTON)
229                       
230               
231        #def load_current_configuration
232       
233        def check_changes(self,widget,event):
234               
235                if self.stack.get_visible_child_name()=="main":
236                        self.gather_values()
237               
238                if self.new_conf!=self.current_conf:
239                        self.changes_dialog.show()
240                        return True
241               
242                Gtk.main_quit()
243               
244        #def check_changes
245
246
247        def gather_values(self):
248       
249                self.new_conf["status"]=self.enable_design_switch.get_active()
250                self.new_conf["plank"]=self.show_plank_switch.get_active()
251                self.new_conf["replicate"]=self.replication_switch.get_active()
252                if self.new_conf["dconf"]==None:
253                        self.new_conf["dconf"]=self.current_conf["dconf"]
254                if self.new_conf["date"]==None:
255                        self.new_conf["date"]=self.current_conf["date"]
256               
257        #def gather_values
258       
259       
260        def enable_design_switch_changed(self,switch,data):
261               
262                self.main_frame.set_sensitive(switch.get_active())
263               
264        #def enable_design_switch_changed
265       
266
267        def dialog_closed(self,widget,event):
268               
269                self.changes_dialog.hide()
270                return True
271               
272        #def dialog_closed
273
274       
275        def entries_press_event(self,widget):
276               
277                self.login_clicked(None)
278               
279        #def entries_press_event
280       
281       
282        def copy_clicked(self,button):
283               
284                self.dprint("COPY")
285               
286                self.new_conf["dconf"]=self.pdm.get_dconf()
287                self.new_conf["date"]=time.strftime("%d/%m/%Y")
288               
289                self.configuration_label.set_text(_("Configuration date")+": "+self.new_conf["date"])
290                self.configuration_image.set_from_stock(Gtk.STOCK_YES,Gtk.IconSize.BUTTON)
291               
292        #def copy_clicked
293       
294       
295        def apply_clicked(self,button):
296               
297                self.dprint("APPLY")
298                self.gather_values()
299               
300                if self.new_conf["dconf"]!=None:
301                        self.dprint("SAVING...")
302                        ret=self.n4dman.save_configuration(self.new_conf)
303                        self.dprint(ret)
304                        self.current_conf=copy.deepcopy(self.new_conf)
305                        self.msg_label.set_markup("<span foreground='#0062f5'>"+_("Configuration saved")+"</span>")
306                        GLib.timeout_add(5000,self.remove_msg_txt)
307                else:
308                        self.msg_label.set_markup("<span foreground='red'>"+_("There was an error when saving configuration.")+"</span>")
309               
310        #def apply_clicked
311       
312       
313        def remove_msg_txt(self):
314               
315                self.msg_label.set_text("")
316               
317        #def remove_msg_txt
318       
319       
320        def login_clicked(self,widget):
321               
322                user=self.user_entry.get_text()
323                password=self.password_entry.get_text()
324                server=self.server_ip_entry.get_text()
325
326                if server!="":
327                        self.n4dman.set_server(server)
328                #else server='server'
329               
330                if server=="localhost":
331                        self.replication_label.set_sensitive(False)
332                        self.replication_switch.set_sensitive(False)
333               
334                self.login_msg_label.set_text(_("Validating user..."))
335               
336                self.login_button.set_sensitive(False)
337                self.validate_user(user,password)
338               
339        #def login_clicked
340       
341       
342        def validate_user(self,user,password):
343               
344                t=threading.Thread(target=self.n4dman.validate_user,args=(user,password,))
345                t.daemon=True
346                t.start()
347                GLib.timeout_add(500,self.validate_user_listener,t)
348               
349        #def validate_user
350       
351       
352        def validate_user_listener(self,thread):
353                       
354                if thread.is_alive():
355                        return True
356                               
357                self.login_button.set_sensitive(True)
358                if not self.n4dman.user_validated:
359                        self.login_msg_label.set_markup("<span foreground='red'>"+_("Invalid user")+"</span>")
360                else:
361                        group_found=False
362                        for g in ["adm","admins"]:
363                                if g in self.n4dman.user_groups:
364                                        group_found=True
365                                        break
366                                       
367                        if group_found:
368                                self.login_msg_label.set_text("")
369                                self.load_current_configuration()
370                                self.stack.set_visible_child_name("main")
371                                self.apply_button.show()
372                               
373                        else:
374                                self.login_msg_label.set_markup("<span foreground='red'>"+_("User must be in 'adm' or 'admins' group")+"</span>")
375                               
376                return False
377                       
378        #def validate_user_listener
379       
380       
381        # ## POPOVER FUNCTIONS ## ########################
382       
383        def options_clicked(self,button):
384               
385                self.options_popover.show_all()
386               
387        #def options_clicked
388       
389       
390        def import_clicked(self,button):
391               
392                print("IMPORT")
393                self.options_popover.hide()
394               
395        #def import_clicked
396       
397       
398        def export_clicked(self,button):
399               
400                print("EXPORT")
401                self.options_popover.hide()
402               
403        #def import_clicked
404       
405        # ############################################
406       
407       
408if __name__=="__main__":
409       
410        pmw=PanelDesignWindow()
411       
Note: See TracBrowser for help on using the repository browser.