source: lliurex-store/trunk/fuentes/lliurex-store-gui/MainMenu.py @ 4114

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

wip

File size: 8.1 KB
RevLine 
[3155]1import gi
2gi.require_version('Gtk', '3.0')
3
4from gi.repository import Gtk, Pango, GdkPixbuf, Gdk, Gio, GObject,GLib
5
6import signal
7signal.signal(signal.SIGINT, signal.SIG_DFL)
8
[3814]9import urllib.request as urllib2
10import shutil
[3773]11import json
12import random
[3155]13
[3649]14import Core
15import Screenshot
[3734]16import ImageManager
[3830]17import Package
[4114]18import os
[3155]19
[4114]20import gettext
21gettext.textdomain('zero-center')
22_ = gettext.gettext
[3155]23
24RSRC_DIR="./"
25
[3814]26HOME_CONTENT_URL="http://svn.lliurex.net/xenial/lliurex-store/trunk/fuentes/lliurex-store-gui/home_content.json"
[4099]27HOME_CONTENT_URL="file:///srv/svn/xenial/lliurex-store/trunk/fuentes/lliurex-store-gui/home_content.json"
[3773]28TMP_STORE_DIR="/tmp/.lliurex-store/"
[4114]29TMP_STORE_DIR=os.path.expanduser("~/.cache/")
[3773]30
[3155]31class MainMenu(Gtk.VBox):
32       
33        def __init__(self):
34               
35                Gtk.VBox.__init__(self)
[3649]36               
37                self.paused=False
38                self.max_image_id=5
39               
[3773]40                self.banner_large_x=735
41                self.banner_large_y=180
42                self.banner_small=134
[3649]43               
[3773]44                self.core=Core.Core.get_core()
45               
46                ui_path=self.core.ui_path
47               
[3155]48                builder=Gtk.Builder()
49                builder.add_from_file(ui_path)
50               
51               
[3649]52                self.main_view_box=builder.get_object("main_view_box")
53                self.divider1=builder.get_object("mv_divider1")
54                self.divider2=builder.get_object("mv_divider2")
55                self.divider3=builder.get_object("mv_divider3")
56                self.featured_label=builder.get_object("featured_label")
57                self.categories_label=builder.get_object("categories_label")
58                self.featured_extra_box=builder.get_object("featured_extra_box")
59                self.rewind_button=builder.get_object("media_rewind_button")
60                self.play_button=builder.get_object("media_play_button")
61                self.forward_button=builder.get_object("media_forward_button")
62                self.media_play_image=builder.get_object("media_play_image")
[3734]63                self.categories_grid=builder.get_object("categories_grid")
[3649]64
[3155]65                self.image_stack=Gtk.Stack()
66                self.image_stack.set_transition_duration(800)
67                self.image_stack.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT)
[3649]68                self.image_stack.set_margin_right(10)
69                self.image_stack.set_margin_left(10)
[3773]70                self.image_stack.set_size_request(self.banner_large_x,self.banner_large_y)
[4099]71                self.image_stack.set_halign(Gtk.Align.CENTER)
[3773]72               
[3649]73                self.main_view_box.pack_start(self.image_stack,False,False,10)
74                self.main_view_box.reorder_child(self.image_stack,2)
[3155]75               
[3773]76                '''
[4114]77               
78                # MIGHT OR MIGHT NOT DO THIS IN THE FUTURE
79               
[3773]80                self.categories_flowbox = Gtk.FlowBox()
81                self.categories_flowbox.set_max_children_per_line(30)
[4109]82                self.categories_flowbox.set_column_spacing(0)
83                self.categories_flowbox.set_row_spacing(0)
84                self.categories_flowbox.set_margin_left(10)
85                self.categories_flowbox.set_margin_right(10)
86                self.categories_flowbox.set_halign(Gtk.Align.FILL)
[3649]87               
[3773]88                self.main_view_box.pack_start(self.categories_flowbox,False,False,10)
89                '''
[3649]90               
[3773]91                self.pack_start(self.main_view_box,True,True,0)
[3649]92               
93                self.rewind_button.connect("clicked",self.rewind_clicked)
94                self.play_button.connect("clicked",self.play_clicked)
95                self.forward_button.connect("clicked",self.forward_clicked)
96               
[3734]97                self.build_categories()
[3649]98                self.set_css_names()
99               
100                GLib.timeout_add(3000,self.next_image)
101               
102        #def __init__
103       
[3773]104        def download_home_info(self):
[3649]105               
[3773]106                #HOME_CONTENT_URL
[3649]107               
[3773]108                header = {
109                                        'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11'
110                                }
111                       
112                try:
113                       
114                        self.core.dprint("Downloading home_content.json...")
115                       
[3814]116                       
[3773]117                        req=urllib2.Request(HOME_CONTENT_URL,headers=header)
118                        res=urllib2.urlopen(req)
[3814]119                       
[3773]120                        f=open(TMP_STORE_DIR+"home_content.json","w")
[3814]121                        f.write(res.read().decode("utf-8"))
[3773]122                        f.close()
123                       
[3814]124                       
[3773]125                        f=open(TMP_STORE_DIR+"home_content.json")
126                        self.home_info=json.load(f)
[3830]127                       
[3773]128                        f.close()
129
130                except Exception as e:
131                       
[3814]132                        print(e)
[3649]133               
[3155]134               
[3773]135        #def download_home_info
136       
137        def build_banners(self):
138
139                # Main banners
[3155]140               
[3773]141                spacing=5
142                count=1
[3155]143               
[3773]144                for pkg in self.home_info["large"]:
145                        s=Screenshot.ScreenshotNeo()
146                        info={}
[3830]147                        info["image_url"]=pkg["banner_large"]
148                        info["image_id"]=pkg["package"]+"_banner_large"
[3773]149                        info["x"]=self.banner_large_x
150                        info["y"]=self.banner_large_y
151                        info["aspect_ratio"]=True
[4109]152                        info["name"]=pkg["name"]
153                        info["package"]=pkg["package"]
[3773]154                        s.download_image(info)
155                        s.set_size_request(self.banner_large_x,self.banner_large_y)
156                        b=Gtk.Button()
157                        b.set_name("RELATED_BUTTON")
158                        b.add(s)
159                        b.show_all()
160                        b.set_size_request(self.banner_large_x,self.banner_large_y)
[3830]161                        b.connect("clicked",self.banner_clicked,pkg)
[3773]162                        self.image_stack.add_titled(b,"image%s"%count,"Image %s"%count)
163                        count+=1
164
[3649]165               
166                # Smaller banners
167               
[3734]168               
[3773]169                banner_range=range(0,len(self.home_info["small"]))
170                sample=random.sample(banner_range,5)
[3649]171               
[3773]172                for b_id in banner_range:
173                       
174                        pkg=self.home_info["small"][b_id]
175                        s=Screenshot.ScreenshotNeo()
176                        info={}
[3830]177                        if pkg["banner_small"]!=None:
178                                info["image_url"]=pkg["banner_small"]
179                                info["aspect_ratio"]=False
[3773]180                        else:
[3830]181                                info["image_path"]=self.core.resources.get_icon(pkg)
182                                info["aspect_ratio"]=True
[3773]183                                info["custom_frame"]=True
[3830]184                               
185                        info["image_id"]=pkg["package"]+"_banner_small"
[3773]186                        info["x"]=self.banner_small
187                        info["y"]=self.banner_small
[3830]188                        info["name"]=pkg["name"]
[4109]189                        info["package"]=pkg["package"]
[3773]190                       
[3830]191                        if pkg["banner_small"]!=None:
192                                s.download_image(info)
193                        else:
194                                s.create_banner_from_file(info)
[3773]195                        b=Gtk.Button()
196                        b.set_name("RELATED_BUTTON")
197                        b.add(s)
[3830]198                        b.connect("clicked",self.banner_clicked,pkg)
[3773]199                        self.featured_extra_box.pack_start(b,True,False,spacing)
200                               
[3649]201               
202               
[3773]203                self.show_all()
[3649]204               
[3734]205               
[3649]206        #def build_related
207       
[3734]208        def build_categories(self):
209               
210                max_width=7
211                w_counter=0
212                h_counter=0
213                button_size=97
214               
[4104]215                               
216                for item in sorted(self.core.categories_manager.categories):
217                       
218                        icon_name=self.core.categories_manager.categories[item]["icon"]
[4114]219                        label=_(item)
[3734]220               
221                        b=Gtk.Button()
222                        b.set_name("RELATED_BUTTON")
223                        hbox=Gtk.HBox()
224                        hbox.set_halign(Gtk.Align.START)
[4104]225                                               
[3734]226                        s=Screenshot.ScreenshotNeo()
227                        i={}
[4104]228                        i["image_path"]=icon_name
[3734]229                        i["x"]=button_size
230                        i["y"]=button_size
231                        i["custom_frame"]=True
[3830]232                        i["name"]=label
[3734]233                       
234                        s.create_banner_from_file(i)
235                        b.add(s)
[4104]236                        b.connect("clicked",self.category_clicked,item)
[4114]237
238                        '''
239                        self.categories_flowbox.add(b)
240                        '''
[3734]241                        self.categories_grid.attach(b,w_counter,h_counter,1,1)
242                        w_counter+=1
243                        if w_counter ==max_width:
244                                w_counter=0
245                                h_counter+=1
[4109]246                       
[3796]247                self.categories_grid.show_all()
[3734]248               
[4114]249                '''
250                self.categories_flowbox.show_all()
251                '''
[4109]252               
[3734]253        #def build_categories
[3649]254       
255       
256        def set_css_names(self):
257               
258                self.main_view_box.set_name("DETAILS_BOX")
[3155]259                self.divider1.set_name("DIVIDER")
260                self.divider2.set_name("DIVIDER")
261                self.divider3.set_name("DIVIDER")
[3649]262                self.featured_label.set_name("RELATED_LABEL")
263                self.categories_label.set_name("RELATED_LABEL")
264                self.rewind_button.set_name("MEDIA_BUTTON")
265                self.play_button.set_name("MEDIA_BUTTON")
266                self.forward_button.set_name("MEDIA_BUTTON")
[3155]267               
[3649]268        #def set_css_info
269       
270       
[3830]271        def banner_clicked(self,widget,pkg):
[3155]272               
[3830]273                p=Package.Package(pkg)
[3840]274                self.core.main_window.load_pkg_data(p["package"])
[3155]275               
[3773]276        #def banner_clicked
[4114]277
[3773]278       
[4104]279        def category_clicked(self,widget,category_tag):
[3649]280               
[4114]281                self.core.search_box.current_category=_(category_tag)
[4109]282                self.core.main_window.search_category(category_tag)
[3649]283               
[3773]284        #def category_clicked
285       
286       
287        def next_image(self,force=False,add=True):
288               
289                tmp=self.image_stack.get_visible_child_name()
290                if tmp!=None:
291                        id=int(tmp.split("image")[1])
[3649]292                       
[3773]293                        if add:
294                       
295                                if id < self.max_image_id:
296                                        id+=1
297                                else:
298                                        id=1
299                        else:
300                               
301                                if id <= 1:
302                                        id=self.max_image_id
303                                else:
304                                        id-=1
305                       
306                        id="image%s"%id
307                       
308                        if not self.paused or force:
309                                if not self.image_stack.get_transition_running() or force:
310                                        self.image_stack.set_visible_child_name(id)
311                       
[3155]312                return True
313               
314        #def next_image
[4114]315
[3155]316       
[3649]317        def rewind_clicked(self,widget):
318               
319                self.image_stack.set_transition_type(Gtk.StackTransitionType.SLIDE_RIGHT)
320                self.next_image(True,False)
321                self.image_stack.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT)
322               
323        #def rewind_clicked
[4114]324
[3155]325       
[3649]326        def play_clicked(self,widget):
327
328                if self.paused:
329                        self.media_play_image.set_from_file(RSRC_DIR + "media_pause.svg")
330                else:
331                        self.media_play_image.set_from_file(RSRC_DIR + "media_play.svg")
332                       
333                self.paused=not self.paused
334               
335        #def rewind_clicked
[4114]336
[3649]337       
338        def forward_clicked(self,widget):
339               
340                self.next_image(True)
341               
342        #def rewind_clicked
343       
[3831]344#class MainMenu
Note: See TracBrowser for help on using the repository browser.