2525#include "exm-info-bar.h"
2626#include "exm-comment-tile.h"
2727#include "exm-comment-dialog.h"
28+ #include "exm-unified-data.h"
2829
2930#include "web/exm-data-provider.h"
3031#include "web/exm-image-resolver.h"
@@ -42,6 +43,8 @@ struct _ExmDetailView
4243{
4344 AdwNavigationPage parent_instance ;
4445
46+ ExmUnifiedData * data ;
47+
4548 ExmManager * manager ;
4649 ExmDataProvider * provider ;
4750 ExmImageResolver * resolver ;
8689 PROP_0 ,
8790 PROP_MANAGER ,
8891 PROP_SHELL_VERSION ,
92+ PROP_DATA ,
8993 N_PROPS
9094};
9195
@@ -121,6 +125,9 @@ exm_detail_view_get_property (GObject *object,
121125 case PROP_SHELL_VERSION :
122126 g_value_set_string (value , self -> shell_version );
123127 break ;
128+ case PROP_DATA :
129+ g_value_set_object (value , self -> data );
130+ break ;
124131 default :
125132 G_OBJECT_WARN_INVALID_PROPERTY_ID (object , prop_id , pspec );
126133 }
@@ -145,6 +152,9 @@ exm_detail_view_set_property (GObject *object,
145152 case PROP_SHELL_VERSION :
146153 self -> shell_version = g_value_dup_string (value );
147154 break ;
155+ case PROP_DATA :
156+ self -> data = g_value_get_object (value );
157+ break ;
148158 default :
149159 G_OBJECT_WARN_INVALID_PROPERTY_ID (object , prop_id , pspec );
150160 }
@@ -293,10 +303,9 @@ install_remote (GtkButton *button,
293303 "(sb)" , self -> uuid , warn );
294304}
295305
296- static void
297- on_data_loaded (GObject * source ,
298- GAsyncResult * result ,
299- gpointer user_data )
306+ /*static void
307+ populate_with_data (ExmUnifiedData *data,
308+ gpointer user_data)
300309{
301310 ExmSearchResult *data;
302311 GError *error = NULL;
@@ -307,132 +316,167 @@ on_data_loaded (GObject *source,
307316
308317 self = EXM_DETAIL_VIEW (user_data);
309318
310- if ((data = exm_data_provider_get_finish (EXM_DATA_PROVIDER (source ), result , & error )) != FALSE)
319+ gint pk, downloads;
320+ gboolean is_installed, is_supported;
321+ gchar *uuid, *name, *creator, *icon_uri, *screenshot_uri, *link, *description, *url;
322+ g_object_get (data,
323+ "uuid", &uuid,
324+ "name", &name,
325+ "creator", &creator,
326+ "icon", &icon_uri,
327+ "screenshot", &screenshot_uri,
328+ "link", &link,
329+ "description", &description,
330+ "shell_version_map", &version_map,
331+ "pk", &pk,
332+ "url", &url,
333+ "downloads", &downloads,
334+ NULL);
335+
336+ adw_window_title_set_title (self->title, name);
337+ adw_window_title_set_subtitle (self->title, uuid);
338+ adw_navigation_page_set_title (ADW_NAVIGATION_PAGE (self), name);
339+
340+ is_installed = exm_manager_is_installed_uuid (self->manager, uuid);
341+ is_supported = exm_search_result_supports_shell_version (data, self->shell_version);
342+
343+ gtk_image_set_from_icon_name (self->ext_icon, "puzzle-piece-symbolic");
344+ gtk_label_set_label (self->ext_title, name);
345+ gtk_label_set_label (self->ext_author, creator);
346+ gtk_label_set_label (self->ext_description, description);
347+ exm_info_bar_set_downloads (self->ext_info_bar, downloads);
348+
349+ if (self->resolver_cancel)
350+ {
351+ g_cancellable_cancel (self->resolver_cancel);
352+ g_clear_object (&self->resolver_cancel);
353+ }
354+
355+ if (strcmp (icon_uri, "/static/images/plugin.png") != 0)
356+ {
357+ self->resolver_cancel = g_cancellable_new ();
358+
359+ queue_resolve_image (self, icon_uri, self->resolver_cancel, TRUE);
360+ }
361+
362+ if (screenshot_uri != NULL)
363+ {
364+ self->resolver_cancel = g_cancellable_new ();
365+
366+ exm_screenshot_set_paintable (self->ext_screenshot, NULL);
367+ exm_screenshot_reset (self->ext_screenshot);
368+
369+ gtk_widget_set_visible (GTK_WIDGET (self->ext_screenshot_container), TRUE);
370+ gtk_widget_set_visible (GTK_WIDGET (self->ext_screenshot_popout_button), FALSE);
371+
372+ queue_resolve_image (self, screenshot_uri, self->resolver_cancel, FALSE);
373+ }
374+ else
375+ {
376+ gtk_widget_set_visible (GTK_WIDGET (self->ext_screenshot_container), FALSE);
377+ }
378+
379+ install_state = is_installed
380+ ? EXM_INSTALL_BUTTON_STATE_INSTALLED
381+ : (is_supported
382+ ? EXM_INSTALL_BUTTON_STATE_DEFAULT
383+ : EXM_INSTALL_BUTTON_STATE_UNSUPPORTED);
384+
385+ g_object_set (self->ext_install, "state", install_state, NULL);
386+
387+ self->uri_homepage = g_uri_resolve_relative (url,
388+ "",
389+ G_URI_FLAGS_NONE,
390+ NULL);
391+
392+ self->uri_extensions = g_uri_resolve_relative ("https://extensions.gnome.org/",
393+ link,
394+ G_URI_FLAGS_NONE,
395+ NULL);
396+
397+ adw_action_row_set_subtitle (self->link_homepage, self->uri_homepage);
398+ adw_action_row_set_subtitle (self->link_extensions, self->uri_extensions);
399+
400+ exm_info_bar_set_version (self->ext_info_bar, -1);
401+
402+ for (version_iter = version_map->map;
403+ version_iter != NULL;
404+ version_iter = version_iter->next)
311405 {
312- gint pk , downloads ;
313- gboolean is_installed , is_supported ;
314- gchar * uuid , * name , * creator , * icon_uri , * screenshot_uri , * link , * description , * url ;
315- g_object_get (data ,
316- "uuid" , & uuid ,
317- "name" , & name ,
318- "creator" , & creator ,
319- "icon" , & icon_uri ,
320- "screenshot" , & screenshot_uri ,
321- "link" , & link ,
322- "description" , & description ,
323- "shell_version_map" , & version_map ,
324- "pk" , & pk ,
325- "url" , & url ,
326- "downloads" , & downloads ,
327- NULL );
328-
329- adw_window_title_set_title (self -> title , name );
330- adw_window_title_set_subtitle (self -> title , uuid );
331- adw_navigation_page_set_title (ADW_NAVIGATION_PAGE (self ), name );
332-
333- is_installed = exm_manager_is_installed_uuid (self -> manager , uuid );
334- is_supported = exm_search_result_supports_shell_version (data , self -> shell_version );
335-
336- gtk_image_set_from_icon_name (self -> ext_icon , "puzzle-piece-symbolic" );
337- gtk_label_set_label (self -> ext_title , name );
338- gtk_label_set_label (self -> ext_author , creator );
339- gtk_label_set_label (self -> ext_description , description );
340- exm_info_bar_set_downloads (self -> ext_info_bar , downloads );
341-
342- if (self -> resolver_cancel )
343- {
344- g_cancellable_cancel (self -> resolver_cancel );
345- g_clear_object (& self -> resolver_cancel );
346- }
347-
348- if (strcmp (icon_uri , "/static/images/plugin.png" ) != 0 )
349- {
350- self -> resolver_cancel = g_cancellable_new ();
351-
352- queue_resolve_image (self , icon_uri , self -> resolver_cancel , TRUE);
353- }
354-
355- if (screenshot_uri != NULL )
356- {
357- self -> resolver_cancel = g_cancellable_new ();
358-
359- exm_screenshot_set_paintable (self -> ext_screenshot , NULL );
360- exm_screenshot_reset (self -> ext_screenshot );
361-
362- gtk_widget_set_visible (GTK_WIDGET (self -> ext_screenshot_container ), TRUE);
363- gtk_widget_set_visible (GTK_WIDGET (self -> ext_screenshot_popout_button ), FALSE);
364-
365- queue_resolve_image (self , screenshot_uri , self -> resolver_cancel , FALSE);
366- }
406+ gchar *version;
407+ MapEntry *entry;
408+
409+ entry = version_iter->data;
410+
411+ if (entry->shell_minor_version)
412+ version = g_strdup_printf ("%s.%s", entry->shell_major_version, entry->shell_minor_version);
367413 else
368- {
369- gtk_widget_set_visible (GTK_WIDGET (self -> ext_screenshot_container ), FALSE);
370- }
414+ version = g_strdup_printf ("%s.0", entry->shell_major_version);
415+
416+ if (strcmp (version, self->shell_version) == 0 || strncmp(version, self->shell_version, strchr(version, '.') - version) == 0)
417+ exm_info_bar_set_version (self->ext_info_bar, entry->extension_version);
371418
372- install_state = is_installed
373- ? EXM_INSTALL_BUTTON_STATE_INSTALLED
374- : (is_supported
375- ? EXM_INSTALL_BUTTON_STATE_DEFAULT
376- : EXM_INSTALL_BUTTON_STATE_UNSUPPORTED );
419+ g_free (version);
420+ }
377421
378- g_object_set ( self -> ext_install , "state" , install_state , NULL ) ;
422+ self->pk = pk ;
379423
380- self -> uri_homepage = g_uri_resolve_relative (url ,
381- "" ,
382- G_URI_FLAGS_NONE ,
383- NULL );
424+ if (self->signal_id > 0)
425+ g_signal_handler_disconnect (self->show_more_btn, self->signal_id);
384426
385- self -> uri_extensions = g_uri_resolve_relative ( "https://extensions.gnome.org/" ,
386- link ,
387- G_URI_FLAGS_NONE ,
388- NULL );
427+ self->signal_id = g_signal_connect (self->show_more_btn ,
428+ "clicked" ,
429+ G_CALLBACK (show_more_comments) ,
430+ self );
389431
390- adw_action_row_set_subtitle (self -> link_homepage , self -> uri_homepage );
391- adw_action_row_set_subtitle (self -> link_extensions , self -> uri_extensions );
432+ queue_resolve_comments (self, pk, self->resolver_cancel);
392433
393- exm_info_bar_set_version (self -> ext_info_bar , -1 );
434+ // Reset scroll position
435+ gtk_adjustment_set_value (gtk_scrolled_window_get_vadjustment (self->scroll_area), 0);
394436
395- for (version_iter = version_map -> map ;
396- version_iter != NULL ;
397- version_iter = version_iter -> next )
398- {
399- gchar * version ;
400- MapEntry * entry ;
437+ gtk_stack_set_visible_child_name (self->stack, "page_detail");
438+ }*/
401439
402- entry = version_iter -> data ;
440+ static void
441+ on_data_loaded (GObject * source ,
442+ GAsyncResult * async_result ,
443+ gpointer user_data )
444+ {
445+ ExmUnifiedData * data ;
446+ ExmSearchResult * web_info ;
447+ ExmExtension * local_info ;
403448
404- if (entry -> shell_minor_version )
405- version = g_strdup_printf ("%s.%s" , entry -> shell_major_version , entry -> shell_minor_version );
406- else
407- version = g_strdup_printf ("%s.0" , entry -> shell_major_version );
449+ GError * error = NULL ;
450+ ExmDetailView * self ;
408451
409- if (strcmp (version , self -> shell_version ) == 0 || strncmp (version , self -> shell_version , strchr (version , '.' ) - version ) == 0 )
410- exm_info_bar_set_version (self -> ext_info_bar , entry -> extension_version );
452+ g_return_if_fail (EXM_IS_DETAIL_VIEW (user_data ));
411453
412- g_free (version );
413- }
454+ self = EXM_DETAIL_VIEW (user_data );
414455
415- self -> pk = pk ;
456+ data = exm_unified_data_new () ;
416457
417- if (self -> signal_id > 0 )
418- g_signal_handler_disconnect (self -> show_more_btn , self -> signal_id );
458+ // Build Unified Data Representation
459+ if ((local_info = exm_manager_get_by_uuid (self -> manager , self -> uuid )))
460+ exm_unified_data_set_local_data (data , local_info );
419461
420- self -> signal_id = g_signal_connect (self -> show_more_btn ,
421- "clicked" ,
422- G_CALLBACK (show_more_comments ),
423- self );
462+ if ((web_info = exm_data_provider_get_finish (EXM_DATA_PROVIDER (source ), async_result , & error )) != FALSE)
463+ exm_unified_data_set_web_data (data , web_info );
424464
425- queue_resolve_comments (self , pk , self -> resolver_cancel );
465+ // We need at least some data to proceed
466+ if (!exm_unified_data_is_empty (data )) {
467+ g_object_set (self , "data" , data , NULL );
426468
427- // Reset scroll position
469+ // Reset scroll position
428470 gtk_adjustment_set_value (gtk_scrolled_window_get_vadjustment (self -> scroll_area ), 0 );
429-
430471 gtk_stack_set_visible_child_name (self -> stack , "page_detail" );
431472
432473 return ;
433474 }
434475
476+ adw_window_title_set_title (self -> title , _ ("An Error Occurred" ));
477+ adw_window_title_set_subtitle (self -> title , NULL );
435478 gtk_stack_set_visible_child_name (self -> stack , "page_error" );
479+ return ;
436480}
437481
438482void
@@ -564,6 +608,13 @@ exm_detail_view_class_init (ExmDetailViewClass *klass)
564608 NULL ,
565609 G_PARAM_READWRITE );
566610
611+ properties [PROP_DATA ]
612+ = g_param_spec_object ("data" ,
613+ "Data" ,
614+ "Data" ,
615+ EXM_TYPE_UNIFIED_DATA ,
616+ G_PARAM_READWRITE );
617+
567618 g_object_class_install_properties (object_class , N_PROPS , properties );
568619
569620 GtkWidgetClass * widget_class = GTK_WIDGET_CLASS (klass );
0 commit comments