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

Last change on this file since 3831 was 3831, checked in by daduve, 3 years ago

wip

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