source: lliurex-store/trunk/fuentes/lliurex-store-gui/usr/share/lliurex-store/lliurex-store-gui/DetailsBox.py @ 7432

Last change on this file since 7432 was 7432, checked in by Juanma, 21 months ago

fix wrong update

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