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

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

wip

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