source: lliurex-store/trunk/fuentes/lliurex-store-gui/DetailsBox.py @ 4109

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

wip

File size: 15.4 KB
Line 
1import gi
2gi.require_version('Gtk', '3.0')
3
4from gi.repository import Gtk, Pango, GdkPixbuf, Gdk, Gio,GLib
5import Screenshot
6import ImageManager
7
8import Core
9
10import signal
11signal.signal(signal.SIGINT, signal.SIG_DFL)
12
13import gettext
14import time
15import threading
16import os
17import html2text
18
19_=gettext.gettext
20
21TMP_STORE_DIR="/tmp/.lliurex-store/"
22
23class DetailsBox(Gtk.VBox):
24
25        def __init__(self):
26               
27                Gtk.VBox.__init__(self)
28               
29                self.core=Core.Core.get_core()
30               
31                self.banner_full_size=250
32                self.screenshot_small=100
33                self.banner_small=134
34                self.icon_size=64
35               
36                self.details_max_width=25
37                self.app_max_width=8
38                self.short_description_max_width=10
39               
40                self.full_info_box=Gtk.HBox()
41                #self.full_info_box.set_valign(Gtk.Align.CENTER)
42                #self.full_info_box.set_halign(Gtk.Align.CENTER)
43                self.pack_start(self.full_info_box,True,True,5)
44                #self.set_valign(Gtk.Align.CENTER)
45                #self.set_halign(Gtk.Align.CENTER)
46               
47                #self.set_size_request(800,0)
48               
49                # ####### LEFT SIDE ######
50               
51                self.app_details=Gtk.VBox()
52                self.app_details.set_margin_left(10)
53                self.app_details.set_margin_bottom(10)
54                self.app_details.set_margin_top(5)
55                self.full_info_box.pack_start(self.app_details,False,False,0)
56
57                self.app_banner=Screenshot.ScreenshotNeo()
58                self.app_banner.set_size_request(self.banner_full_size,self.banner_full_size)
59
60                self.app_details.pack_start(self.app_banner,False,False,0)
61                self.install_button=Gtk.Button()
62                self.install_button_label=Gtk.Label("Install")
63                self.install_button.add(self.install_button_label)
64                self.install_button.connect("clicked",self.install_clicked)
65               
66                vbox=Gtk.VBox()
67                self.install_label=Gtk.Label("Installing...")
68                vbox.pack_start(self.install_label,False,False,0)
69                vbox.set_valign(Gtk.Align.FILL)
70                vbox.set_halign(Gtk.Align.FILL)
71               
72                self.install_label.set_halign(Gtk.Align.START)
73                self.install_pbar=Gtk.ProgressBar()
74                self.install_pbar.set_valign(Gtk.Align.FILL)
75                self.install_pbar.set_halign(Gtk.Align.FILL)
76                vbox.pack_start(self.install_pbar,True,True,0)
77
78                hbox=Gtk.HBox()
79                self.uninstall_button=Gtk.Button("Uninstall")
80                self.uninstall_button.connect("clicked",self.uninstall_clicked)
81                self.open_button=Gtk.Button("Open")
82                self.open_button.connect("clicked",self.open_clicked)
83                self.open_button.set_margin_right(10)
84                hbox.pack_start(self.open_button,True,True,0)
85                hbox.pack_start(self.uninstall_button,True,True,0)
86               
87               
88               
89                self.install_stack=Gtk.Stack()
90                self.install_stack.set_transition_type(Gtk.StackTransitionType.CROSSFADE)
91                self.install_stack.set_transition_duration(500)
92                self.install_stack.add_titled(self.install_button,"install","Install")
93                self.install_stack.add_titled(vbox,"progress","Progress")
94                self.install_stack.add_titled(hbox,"installed","Open/Uninstall")
95               
96               
97                self.app_details.pack_start(self.install_stack,False,False,10)
98               
99                self.details_label=Gtk.Label("Details")
100                self.details_label.set_alignment(0,0.5)
101                self.details_label.set_margin_left(0)
102                self.app_details.pack_start(self.details_label,False,False,0)
103               
104                self.details_divider=Gtk.HBox()
105                self.details_divider.set_size_request(0,1)
106                self.app_details.pack_start(self.details_divider,False,False,5)
107               
108                self.version_label=Gtk.Label(_("Version"))
109                self.version_label.set_alignment(0,0.5)
110                self.category_label=Gtk.Label(_("Category"))
111                self.category_label.set_alignment(0,0.5)
112                self.license_label=Gtk.Label(_("License"))
113                self.license_label.set_alignment(0,0.5)
114                self.size_label=Gtk.Label(_("Size"))
115                self.size_label.set_alignment(0,0.5)
116                self.website_label=Gtk.Label(_("Website"))
117                self.website_label.set_alignment(0,0.5)
118               
119
120                self.version_value_label=Gtk.Label()
121                self.version_value_label.set_alignment(1,0.5)
122                self.version_value_label.set_max_width_chars(self.details_max_width)
123                self.version_value_label.set_ellipsize(Pango.EllipsizeMode.END)
124                self.category_value_label=Gtk.Label()
125                self.category_value_label.set_alignment(1,0.5)
126                self.category_value_label.set_max_width_chars(self.details_max_width)
127                self.category_value_label.set_ellipsize(Pango.EllipsizeMode.END)
128                self.license_value_label=Gtk.Label()
129                self.license_value_label.set_alignment(1,0.5)
130                self.license_value_label.set_max_width_chars(self.details_max_width)
131                self.license_value_label.set_ellipsize(Pango.EllipsizeMode.END)
132                self.size_value_label=Gtk.Label()
133                self.size_value_label.set_alignment(1,0.5)
134                self.size_value_label.set_max_width_chars(self.details_max_width)
135                self.size_value_label.set_ellipsize(Pango.EllipsizeMode.END)
136                self.website_value_label=Gtk.Label()
137                self.website_value_label.set_alignment(1,0.5)
138                self.website_value_label.set_max_width_chars(self.details_max_width)
139                self.website_value_label.set_ellipsize(Pango.EllipsizeMode.END)
140               
141               
142                hbox=Gtk.HBox()
143                hbox.pack_start(self.version_label,False,False,0)
144                hbox.pack_end(self.version_value_label,False,False,0)
145                self.app_details.pack_start(hbox,False,False,0)
146                hbox=Gtk.HBox()
147                hbox.pack_start(self.category_label,False,False,0)
148                hbox.pack_end(self.category_value_label,False,False,0)
149                self.app_details.pack_start(hbox,False,False,0)
150                hbox=Gtk.HBox()
151                hbox.pack_start(self.license_label,False,False,0)
152                hbox.pack_end(self.license_value_label,False,False,0)
153                self.app_details.pack_start(hbox,False,False,0)
154                hbox=Gtk.HBox()
155                hbox.pack_start(self.size_label,False,False,0)
156                hbox.pack_end(self.size_value_label,False,False,0)
157                self.app_details.pack_start(hbox,False,False,0)
158                hbox=Gtk.HBox()
159                hbox.pack_start(self.website_label,False,False,0)
160                hbox.pack_end(self.website_value_label,False,False,0)
161                self.app_details.pack_start(hbox,False,False,0)
162               
163               
164                # ############# #
165               
166                # ####### RIGHT SIDE ######
167               
168                self.app_details_r=Gtk.VBox()
169                self.app_details_r.set_margin_top(5)
170                self.full_info_box.pack_start(self.app_details_r,True,True,20)
171               
172                hbox=Gtk.HBox()
173                self.app_icon=Screenshot.ScreenshotNeo()
174                self.app_icon.set_size_request(64,64)
175               
176                hbox.pack_start(self.app_icon,False,False,0)
177               
178                self.app_name_label=Gtk.Label("")
179                self.app_name_label.set_max_width_chars(self.app_max_width)
180                self.app_name_label.set_ellipsize(Pango.EllipsizeMode.END)
181                self.app_name_label.set_alignment(0,1)
182                self.short_description_label=Gtk.Label("")
183                self.short_description_label.set_alignment(0,0)
184                self.short_description_label.set_max_width_chars(self.short_description_max_width)
185                self.short_description_label.set_ellipsize(Pango.EllipsizeMode.END)
186               
187                vbox=Gtk.VBox()
188                vbox.pack_start(self.app_name_label,True,True,0)
189                vbox.pack_start(self.short_description_label,True,True,0)
190                hbox.pack_start(vbox,True,True,5)
191               
192                self.app_details_r.pack_start(hbox,False,False,0)
193               
194                self.full_description_label=Gtk.Label()
195                self.full_description_label.set_margin_right(10)
196                self.full_description_label.set_alignment(0,1)
197                self.full_description_label.set_justify(Gtk.Justification.FILL)
198                self.full_description_label.set_line_wrap(True)
199                self.full_description_label.set_valign(Gtk.Align.START)
200                self.full_description_label.set_halign(Gtk.Align.FILL)
201               
202               
203                sw=Gtk.ScrolledWindow()
204                sw.set_shadow_type(Gtk.ShadowType.NONE)
205                sw.set_overlay_scrolling(True)
206                sw.set_kinetic_scrolling(True)
207                vp=Gtk.Viewport()
208                sw.add(vp)
209                sw.set_size_request(0,100)
210                vp.add(self.full_description_label)
211               
212                self.app_details_r.pack_start(sw,True,True,10)
213               
214               
215                self.description_divider=Gtk.HBox()
216                self.description_divider.set_size_request(0,1)
217                self.description_divider.set_valign(Gtk.Align.START)
218                self.app_details_r.pack_start(self.description_divider,False,False,5)
219               
220                ss_sw=Gtk.ScrolledWindow()
221                ss_sw.set_shadow_type(Gtk.ShadowType.NONE)
222                ss_vp=Gtk.Viewport()
223               
224                ss_sw.add(ss_vp)
225               
226                self.screenshots_box=Gtk.HBox()
227               
228                ss_sw.set_size_request(0,130)
229                vbox=Gtk.VBox()
230                vbox.pack_start(self.screenshots_box,True,False,0)
231                ss_vp.add(vbox)
232                self.app_details_r.set_valign(Gtk.Align.FILL)
233                self.app_details_r.pack_start(ss_sw,False,False,5)
234               
235               
236               
237                # ####################### #
238               
239                # ## RELATED #######
240               
241                related_vbox=Gtk.VBox()
242                related_vbox.set_margin_left(10)
243               
244                self.related_label=Gtk.Label(_("Related"))
245                self.related_label.set_alignment(0,1)
246               
247                related_vbox.pack_start(self.related_label,False,False,0)
248                               
249                self.related_divider=Gtk.HBox()
250                self.related_divider.set_size_request(0,1)
251                self.related_divider.set_margin_right(20)
252                related_vbox.pack_start(self.related_divider,False,False,5)
253               
254                self.related_sw=Gtk.ScrolledWindow()
255                self.related_sw.set_shadow_type(Gtk.ShadowType.NONE)
256                self.related_sw.set_size_request(0,self.banner_small+40)
257                self.related_sw.set_margin_right(20)
258                related_vp=Gtk.Viewport()
259                self.related_sw.add(related_vp)
260               
261                self.related_box=Gtk.HBox()
262                self.related_box.set_margin_bottom(10)
263               
264                related_vp.add(self.related_box)
265               
266                related_vbox.pack_start(self.related_sw,False,False,5)
267                self.pack_start(related_vbox,True,True,0)
268               
269                # #################
270
271                self.set_css_info()
272               
273        #def
274       
275        def set_package_info(self,pkg):
276               
277                info={}
278               
279                info["image_url"]=pkg["banner_small"]
280                info["image_id"]=pkg["package"]+"_banner_small"
281                info["x"]=self.banner_full_size
282                info["y"]=self.banner_full_size
283                info["aspect_ratio"]=False
284                info["name"]=pkg["package"].capitalize()
285                info["installed"]=True if pkg["state"]=="installed" else False
286               
287
288                if pkg["banner_small"] !=None:
289                        self.app_banner.download_image(info)
290                else:
291                        info["name"]=None
292                        if os.path.exists(TMP_STORE_DIR+info["image_id"]):
293                               
294                                info["image_path"]=TMP_STORE_DIR+info["image_id"]
295                                self.app_banner.set_from_file(info)
296                        else:
297                                info["image_path"]=self.core.resources.get_icon(pkg)
298                       
299                                self.app_banner.create_banner_from_file(info)
300               
301                self.version_value_label.set_text(pkg["version"])
302                self.category_value_label.set_text(pkg["category"])
303                self.license_value_label.set_text(pkg["license"])
304                try:
305                        size= "{:.2f} MB".format(float(pkg["size"])/1000000) 
306                        self.size_value_label.set_text(size)
307                except:
308                        pass
309                self.website_value_label.set_markup("<a href=\"%s\">%s</a>"%(pkg["homepage"],pkg["homepage"]))
310                self.app_name_label.set_text(pkg["name"])
311                self.short_description_label.set_text(pkg["summary"])
312                h=html2text.HTML2Text()
313                h.body_width=500
314                self.full_description_label.set_text(h.handle(pkg["description"]))
315                #self.full_description_label.set_text(pkg["description"])
316               
317               
318                if info["installed"]:
319                        self.install_stack.set_visible_child_name("installed")
320                else:
321                        self.install_stack.set_visible_child_name("install")
322                       
323               
324                info["image_path"]=self.core.resources.get_icon(pkg)
325                info["image_id"]=pkg["icon"]+"_icon"
326                info["x"]=self.icon_size
327                info["y"]=self.icon_size
328               
329                self.app_icon.set_from_file(info)
330               
331                for s in self.screenshots_box.get_children():
332                        self.screenshots_box.remove(s)
333               
334                count=0
335                for v in pkg["videos"]:
336                       
337                        image=Screenshot.ScreenshotNeo()
338                        info["video_url"]=v["url"].replace("http://metadata.tanglu.org/appstream/media/xenial/","").replace("https://www.youtube.com/watch?v=","https://www.youtube.com/embed/")
339                        info["image_url"]=v["preview"]
340                        info["image_id"]=pkg["package"]+"_video_"+str(count)
341                        info["x"]=self.screenshot_small
342                        info["y"]=self.screenshot_small
343                       
344                        image.set_video_info(info)
345                       
346                        b=Gtk.Button()
347                        b.set_name("RELATED_BUTTON")
348                        b.add(image)
349                        self.screenshots_box.pack_start(b,False,False,5)
350                       
351                        count+=1
352                       
353                count=0
354                for s in pkg["screenshots"]:
355                       
356                        image=Screenshot.ScreenshotNeo()
357                        i={}
358                       
359                        i["image_url"]=s
360                        i["image_id"]=pkg["package"]+"_screenshot_"+str(count)
361                        i["x"]=self.screenshot_small
362                        i["y"]=self.screenshot_small
363                        i["aspect_ratio"]=False
364                                               
365                        image.download_image(i)
366                        b=Gtk.Button()
367                        b.set_name("RELATED_BUTTON")
368                        b.add(image)
369                        self.screenshots_box.pack_start(b,False,False,5)
370                        count+=1
371               
372                self.screenshots_box.show_all()
373               
374               
375               
376                for p in self.related_box.get_children():
377                        self.related_box.remove(p)
378                       
379
380               
381                       
382                for p in pkg["related_packages"]:
383                       
384                        image=Screenshot.ScreenshotNeo()
385
386                        i={}
387                        i["image_id"]=p["package"]+"_banner_small"
388                        i["x"]=self.banner_small
389                        i["y"]=self.banner_small
390                        i["name"]=p["package"].capitalize()
391                        i["package"]=p["package"]
392                        i["icon"]=p["icon"]
393                        i["component"]=p["component"]
394
395                        if p["banner"]!=None:
396                                i["image_url"]=p["banner"]
397                                i["custom_frame"]=False
398                        else:
399                                i["image_path"]=self.core.resources.get_icon(p)
400                                i["custom_frame"]=True
401                               
402                        if not i["custom_frame"]:
403                                image.download_image(i)
404                        else:
405                                i["force_text"]=True
406                                image.create_banner_from_file(i)
407                       
408                        b=Gtk.Button()
409                        b.add(image)
410                        b.set_size_request(self.banner_small,self.banner_small)
411                        b.set_margin_top(10)
412                        b.connect("clicked",self.related_app_clicked,p)
413                        b.set_name("RELATED_BUTTON")
414                        b.set_valign(Gtk.Align.CENTER)
415                        b.set_tooltip_text(p["name"])
416                        self.related_box.pack_start(b,False,False,3)
417                       
418                self.related_box.show_all()
419               
420                for x in self.screenshots_box.get_children():
421                        x.connect("clicked",self.core.main_window.screenshot_clicked)
422               
423               
424        #def set_values
425       
426       
427        def set_css_info(self):
428               
429                self.style_provider=Gtk.CssProvider()
430                f=Gio.File.new_for_path("lliurex-store.css")
431                self.style_provider.load_from_file(f)
432                Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(),self.style_provider,Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
433               
434                self.set_name("DETAILS_BOX")
435               
436                self.details_divider.set_name("DIVIDER")
437                self.description_divider.set_name("DIVIDER")
438                self.related_divider.set_name("DIVIDER")
439               
440                self.details_label.set_name("DETAILS_LABEL")
441                self.version_label.set_name("DETAILS_OPTIONS")
442                self.category_label.set_name("DETAILS_OPTIONS")
443                self.license_label.set_name("DETAILS_OPTIONS")
444                self.size_label.set_name("DETAILS_OPTIONS")
445                self.website_label.set_name("DETAILS_OPTIONS")
446               
447                self.version_value_label.set_name("DETAILS_VALUES")
448                self.category_value_label.set_name("DETAILS_VALUES")
449                self.license_value_label.set_name("DETAILS_VALUES")
450                self.size_value_label.set_name("DETAILS_VALUES")
451                self.website_value_label.set_name("DETAILS_VALUES")
452               
453                self.app_name_label.set_name("TITLE")
454                self.short_description_label.set_name("SHORT_DESCRIPTION")
455                self.full_description_label.set_name("FULL_DESCRIPTION")
456               
457                self.related_label.set_name("RELATED_LABEL")
458               
459                self.install_button.set_name("INSTALL_BUTTON")
460                self.install_label.set_name("DETAILS_LABEL")
461                self.uninstall_button.set_name("UNINSTALL_BUTTON")
462                self.open_button.set_name("INSTALL_BUTTON")
463               
464        #def set-css_info
465       
466        def related_app_clicked(self,widget,app):
467               
468                self.core.main_window.load_pkg_data(app["package"])
469               
470        #def related_app_clicked
471       
472        def install_clicked(self,widget):
473               
474                self.install_label.set_text("Installing...")
475                self.install_stack.set_visible_child_name("progress")
476               
477                t=threading.Thread(target=self.install_pkg)
478                t.daemon=True
479                t.start()
480                GLib.timeout_add(100,self.pulse_pbar,t,"installed")
481               
482               
483        #def install_clicked
484       
485        def uninstall_clicked(self,widget):
486               
487                self.install_label.set_text("Uninstalling...")
488                self.install_stack.set_visible_child_name("progress")
489               
490                t=threading.Thread(target=self.uninstall_pkg)
491                t.daemon=True
492                t.start()
493                GLib.timeout_add(100,self.pulse_pbar,t,"install")
494               
495               
496        #def install_clicked
497       
498               
499        def pulse_pbar(self,t,target):
500               
501                if t.is_alive():
502                        self.install_pbar.pulse()
503                        return True
504               
505                self.install_stack.set_visible_child_name(target)
506               
507                return False
508               
509        #def pulse_pbar
510       
511        def install_pkg(self):
512               
513                pkg=self.core.main_window.current_pkg["package"]
514                self.core.store.install_package(pkg)
515               
516        #def
517       
518       
519        def uninstall_pkg(self):
520               
521                pkg=self.core.main_window.current_pkg["package"]
522                self.core.store.uninstall_package(pkg)
523               
524        #def
525       
526       
527       
528        def open_clicked(self,widget):
529               
530                desktop=self.core.main_window.current_pkg["id"]
531                if os.path.exists("/usr/share/applications/%s"%desktop):
532                        os.system("gtk-launch %s"%desktop)
533               
534        #def open_clicked
535       
536
Note: See TracBrowser for help on using the repository browser.