source: lliurex-store/trunk/fuentes/lliurex-store-gui/MainWindow.py @ 3830

Last change on this file since 3830 was 3830, checked in by hectorgh, 3 years ago

wuo

File size: 10.7 KB
Line 
1import gi
2gi.require_version('Gtk', '3.0')
3from gi.repository import Gtk, Pango, GdkPixbuf, Gdk, Gio, GObject,GLib
4
5import Core
6import Package
7
8import threading
9import multiprocessing
10import gettext
11import signal
12import time
13
14signal.signal(signal.SIGINT, signal.SIG_DFL)
15_=gettext.gettext
16
17
18
19class MainWindow:
20       
21        def __init__(self):
22               
23                self.core=Core.Core.get_core()
24                self.load_thread=threading.Thread()
25                self.search_process=multiprocessing.Process()
26                self.thread_aborted=False
27                self.search_aborted=False
28                self.last_search=""
29                self.load_gui()
30               
31        #def init
32       
33
34       
35        # ### MAIN UI FUNCTIONS # ####################
36       
37        def load_gui(self):
38               
39                builder=Gtk.Builder()
40                ui_path=self.core.ui_path
41                builder.add_from_file(ui_path)
42               
43                self.window=builder.get_object("window1")
44                self.menu_button=builder.get_object("menu_button")
45               
46                self.main_scroll=builder.get_object("main_scrolledwindow")
47                self.location_label=builder.get_object("location_label")
48                self.search_entry=builder.get_object("search_entry")
49                self.main_box=builder.get_object("main_box")
50                self.header_box=builder.get_object("header_box")
51               
52                self.main_menu=self.core.main_menu
53                self.loading_box=self.core.loading_box
54                self.details_box=self.core.details_box
55                self.popup_menu=self.core.popup_menu
56                self.screenshot_viewer=self.core.screenshot_viewer
57                self.search_box=self.core.search_box
58               
59                self.stack=Gtk.Stack()
60                self.stack.set_transition_type(Gtk.StackTransitionType.CROSSFADE)
61                self.stack.set_transition_duration(500)
62               
63                self.stack.add_titled(self.loading_box,"loading","Loading")
64                self.stack.add_titled(self.main_menu,"main","Main")
65                self.stack.add_titled(self.details_box,"details","Details")
66                self.stack.add_titled(self.search_box,"search","Search")
67                self.main_scroll.add(self.stack)
68       
69                self.overlay=Gtk.Overlay()
70                self.main_eb=Gtk.EventBox()
71                self.main_eb.add(self.main_box)
72               
73                self.main_eb.add_events(Gdk.EventMask.BUTTON_PRESS_MASK)
74                self.main_eb.connect("button-press-event",self.main_eb_clicked)
75               
76                self.overlay.add(self.main_eb)
77                self.overlay.show_all()
78               
79                self.fade_box_revealer=Gtk.Revealer()
80                self.fade_box_revealer.set_valign(Gtk.Align.END)
81                self.fade_box_revealer.set_halign(Gtk.Align.END)
82               
83                self.fade_box=Gtk.HBox()
84                self.fade_eb=Gtk.EventBox()
85                self.fade_eb.add(self.fade_box)
86                self.fade_eb.add_events(Gdk.EventMask.BUTTON_PRESS_MASK)
87                self.fade_eb.connect("button-press-event",self.main_eb_clicked)
88               
89                self.fade_box_revealer.set_transition_type(Gtk.RevealerTransitionType.SLIDE_UP)
90                self.fade_box_revealer.set_transition_duration(self.popup_menu.revealer.get_transition_duration())
91                self.fade_box_revealer.add(self.fade_eb)
92                self.fade_box_revealer.show_all()
93               
94               
95                self.overlay.add_overlay(self.fade_box_revealer)
96                self.overlay.add_overlay(self.popup_menu)
97                self.overlay.add_overlay(self.screenshot_viewer)
98
99                self.window.add(self.overlay)
100               
101                self.connect_signals()
102                self.set_css_info()
103                self.build_home()
104               
105                self.window.show_all()
106               
107        #def load_gui
108
109       
110        def set_css_info(self):
111               
112                self.style_provider=Gtk.CssProvider()
113                f=Gio.File.new_for_path("lliurex-store.css")
114                self.style_provider.load_from_file(f)
115                Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(),self.style_provider,Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
116               
117                self.window.set_name("MAIN_BOX")
118                self.header_box.set_name("HEADER_MENU")
119                self.menu_button.set_name("MENU_BUTTON")
120                self.location_label.set_name("RELATED_LABEL")
121                self.fade_box.set_name("FADE_BOX")
122               
123        #def set-css_info       
124
125       
126        def connect_signals(self):
127               
128                self.window.connect("size-allocate",self.window_size_changed)
129                self.window.connect("destroy",Gtk.main_quit)
130                self.menu_button.connect("clicked",self.menu_button_clicked)
131                self.search_entry.connect("changed",self.search_entry_changed)
132                self.search_entry.connect("activate",self.entries_press_event)
133               
134        #def connect_signals
135       
136       
137        def start_gui(self):
138               
139                GObject.threads_init()
140                Gtk.main()
141               
142        #def start_gui
143
144        # #################################################### ##
145
146
147
148        # #### STACK FAST ACCESS FUNCTIONS # #################
149       
150        def show_loading(self):
151               
152                self.stack.set_visible_child_name("loading")
153               
154        #def kk
155
156
157        def show_details_box(self):
158               
159                self.thread_aborted=True
160                self.search_aborted=True
161                self.stack.set_visible_child_name("details")
162               
163        #def show_details_box
164
165
166        def show_home(self):
167               
168                self.thread_aborted=True
169                self.search_aborted=True
170                self.search_entry.set_text("")
171                self.location_label.set_text("Home")
172                self.stack.set_visible_child_name("main")
173               
174        #def show_details_box
175       
176        def show_search_results(self):
177               
178                self.location_label.set_text("Search")
179                self.stack.set_visible_child_name("search")
180               
181        #def show_search_results
182       
183        # ############################################
184
185
186
187        # ### HOME LOADING FUNCTIONS # ##############
188       
189        def build_home(self):
190               
191                self.load_thread=threading.Thread(target=self.download_home_info_thread)
192                self.load_thread.daemon=True
193                self.load_thread.start()
194               
195                GLib.timeout_add(500,self.build_home_listener)
196               
197        #def build_home
198
199
200        def build_home_listener(self):
201               
202                if self.thread_aborted:
203                        self.thread_aborted=False
204                        return False
205               
206               
207                if self.load_thread.is_alive():
208                        return True
209               
210               
211                self.main_menu.build_banners()
212                self.show_home()
213                return False
214               
215        #def load_home
216
217       
218        def download_home_info_thread(self):
219               
220                self.main_menu.download_home_info()
221               
222                #time.sleep(2)
223
224        #def load_home_thread
225       
226        # #################################
227
228       
229       
230        # ### LOAD PKG FUNCTIONS # ##################
231       
232       
233        def set_pkg_data(self,pkg):
234               
235                self.current_pkg=Package.Package(pkg)
236                self.details_box.set_package_info(self.current_pkg)
237                self.stack.set_visible_child_name("details")
238               
239        #def set_data
240       
241        def load_pkg_data(self,pkg_id,pkg_data=None):
242               
243                self.current_pkg=None
244                self.thread_aborted=False
245                self.load_thread=threading.Thread(target=self.load_pkg_data_thread,args=(pkg_id,))
246                self.load_thread.daemon=True
247                self.load_thread.start()
248                self.show_loading()
249                GLib.timeout_add(500,self.load_pkg_listener)
250               
251        #def load_pkg_data
252       
253        def load_pkg_data_thread(self,pkg_id):
254               
255                #self.current_pkg=Package.Package.get_demo_package(pkg_id)
256                print("!!!!!")
257                self.current_pkg=self.core.store.search_package(pkg_id)[0]
258                print("!!!2")
259                #time.sleep(2)
260               
261        #def load_pkg_data_thread
262       
263        def load_pkg_listener(self):
264               
265                print(1)
266               
267                if self.thread_aborted:
268                        self.thread_aborted=False
269                        return False
270               
271                if self.load_thread.is_alive():
272                        return True
273                       
274                if self.current_pkg!=None:
275                        print(2)
276                        self.details_box.set_package_info(self.current_pkg)
277                        print(3)
278                        self.stack.set_visible_child_name("details")
279               
280                return False
281               
282        #def load_pkg_listener
283       
284        # #################################
285
286
287        # ## SEARCH FUNCTIONS ######################
288       
289       
290        def entries_press_event(self,widget):
291               
292                self.last_search=None
293                self.search_entry_changed(None)
294               
295        #def entries_press_event
296       
297        def search_entry_changed(self,widget):
298               
299                txt=self.search_entry.get_text()
300                current_stack=self.stack.get_visible_child_name()
301                txt=txt.strip(" ")
302               
303                if self.last_search!=txt:
304                        self.last_search=txt
305                else:
306                        return
307               
308                if len(txt)==0:
309                        self.show_home()
310                        return
311                       
312                if len(txt)>2:
313                        self.search_aborted=False
314                        self.show_loading()
315                        self.search_package(txt)
316               
317        #def search_entry_changed
318       
319        def search_package(self,pkg_id):
320               
321                if self.search_process.is_alive():
322                        self.search_process.terminate()
323               
324                self.current_search_id=self.core.get_random_id()
325                self.search_queue=multiprocessing.Queue()
326                self.search_process=multiprocessing.Process(target=self.search_package_thread,args=(pkg_id,self.search_queue,))
327               
328                self.search_process.daemon=True
329                self.search_process.start()
330               
331                GLib.timeout_add(500, self.search_listener,self.current_search_id)
332               
333        #def search_package
334       
335        def search_package_thread(self,pkg_id,search_queue):
336               
337                ret=self.core.store.search_package(pkg_id)
338                self.core.dprint("Search complete")
339                '''
340                for p in ret:
341                        pkg["icon_url"]=self.core.resources.get_icon(p.dic)
342                        pkg["name"]=p.dic["name"]
343                        pkg["package"]=pkg_id
344                        pkg["short_description"]="Package that does a lot of things very well done askdjlaskl jdaklsdjkl asjkl dasjkl djkl asdjkl asdjkl asdjkl asdjkl asdjkl asdjkl asd"
345                        ret.append(pkg)
346                '''
347               
348               
349               
350                search_queue.put(ret)
351               
352        #def search_package_thread
353       
354        def search_listener(self,search_id):
355               
356                if self.current_search_id!=search_id:
357                        return False
358               
359                if self.search_aborted:
360                        self.thread_aborted=False
361                        return False
362               
363                if self.search_process.is_alive():
364                        return True
365                       
366                       
367                search_result=self.search_queue.get()
368                if search_result!=None:
369                        self.core.search_box.populate_search_results(search_result)
370                        self.show_search_results()
371               
372                return False
373               
374        #def search_listener
375       
376
377        # ########################################
378       
379
380        # ## SCREENSHOTVIEWER FUNCTIONS ## ##############
381       
382        def window_size_changed(self,widget,allocation):
383               
384                x,y=self.window.get_size()
385                self.popup_menu.popup_menu.set_size_request(400,y)
386                self.screenshot_viewer.content_box.set_size_request(x,y)
387                self.screenshot_viewer.sw.set_size_request(x-20,150)
388                self.fade_box.set_size_request(x,y)
389               
390        #def window_size_allocation
391
392
393        def screenshot_clicked(self,widget):
394
395                if widget.get_children()[0].get_visible_child_name()=="image":
396                       
397                        if self.popup_menu.revealer.get_reveal_child():
398                                self.popup_menu.revealer.set_reveal_child(False)
399                                return
400                       
401                        if widget.get_children()[0].image_info["video_url"]==None:
402                                self.screenshot_viewer.set_screenshot(widget.get_children()[0].image_info["image_id"],self.details_box.screenshots_box)
403                        else:
404                                self.screenshot_viewer.set_screenshot(widget.get_children()[0].image_info["video_url"],self.details_box.screenshots_box,True)
405                               
406                        self.screenshot_viewer.revealer.set_reveal_child(True)
407                       
408                       
409        #def screenshot_clicked
410       
411        # ####################################### #
412
413
414
415        # ## POPUP MENU FUNCTIONS # #####################
416
417        def main_eb_clicked(self,widget,event):
418               
419                if self.popup_menu.revealer.get_reveal_child():
420                        self.popup_menu.revealer.set_reveal_child(False)
421                       
422                if self.fade_box_revealer.get_reveal_child():
423                        self.fade_box_revealer.set_transition_type(Gtk.RevealerTransitionType.CROSSFADE)
424                        GLib.timeout_add(30,self.check_fade_out)
425                        self.fade_box_revealer.set_reveal_child(False)
426                       
427        #def main_eb_clicked
428
429       
430        def menu_button_clicked(self,widget):
431               
432                self.fade_box_revealer.set_transition_type(Gtk.RevealerTransitionType.CROSSFADE)
433                self.popup_menu.revealer.set_reveal_child(not self.popup_menu.revealer.get_reveal_child())
434                self.fade_box_revealer.set_reveal_child(True)
435               
436        #def menu_button_clicked
437
438
439        def check_fade_out(self):
440               
441                if self.fade_box_revealer.get_child_revealed():
442                        return True
443                       
444                self.fade_box_revealer.set_transition_type(Gtk.RevealerTransitionType.SLIDE_UP)
445               
446        #def check_fade_out
447       
448        # ########################################## #
449       
450
451
452       
453       
454       
455#class LliurexStore
456
457if __name__=="__main__":
458       
459        llx_store=LliurexStore()
Note: See TracBrowser for help on using the repository browser.