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

Last change on this file since 8201 was 8201, checked in by hectorgh, 2 years ago

translation support

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