25
25
#include "exm-info-bar.h"
26
26
#include "exm-comment-tile.h"
27
27
#include "exm-comment-dialog.h"
28
+ #include "exm-unified-data.h"
28
29
29
30
#include "web/exm-data-provider.h"
30
31
#include "web/exm-image-resolver.h"
@@ -42,6 +43,8 @@ struct _ExmDetailView
42
43
{
43
44
AdwNavigationPage parent_instance ;
44
45
46
+ ExmUnifiedData * data ;
47
+
45
48
ExmManager * manager ;
46
49
ExmDataProvider * provider ;
47
50
ExmImageResolver * resolver ;
86
89
PROP_0 ,
87
90
PROP_MANAGER ,
88
91
PROP_SHELL_VERSION ,
92
+ PROP_DATA ,
89
93
N_PROPS
90
94
};
91
95
@@ -121,6 +125,9 @@ exm_detail_view_get_property (GObject *object,
121
125
case PROP_SHELL_VERSION :
122
126
g_value_set_string (value , self -> shell_version );
123
127
break ;
128
+ case PROP_DATA :
129
+ g_value_set_object (value , self -> data );
130
+ break ;
124
131
default :
125
132
G_OBJECT_WARN_INVALID_PROPERTY_ID (object , prop_id , pspec );
126
133
}
@@ -145,6 +152,9 @@ exm_detail_view_set_property (GObject *object,
145
152
case PROP_SHELL_VERSION :
146
153
self -> shell_version = g_value_dup_string (value );
147
154
break ;
155
+ case PROP_DATA :
156
+ self -> data = g_value_get_object (value );
157
+ break ;
148
158
default :
149
159
G_OBJECT_WARN_INVALID_PROPERTY_ID (object , prop_id , pspec );
150
160
}
@@ -293,10 +303,9 @@ install_remote (GtkButton *button,
293
303
"(sb)" , self -> uuid , warn );
294
304
}
295
305
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)
300
309
{
301
310
ExmSearchResult *data;
302
311
GError *error = NULL;
@@ -307,132 +316,167 @@ on_data_loaded (GObject *source,
307
316
308
317
self = EXM_DETAIL_VIEW (user_data);
309
318
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)
311
405
{
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);
367
413
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);
371
418
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
+ }
377
421
378
- g_object_set ( self -> ext_install , "state" , install_state , NULL ) ;
422
+ self->pk = pk ;
379
423
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);
384
426
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 );
389
431
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);
392
433
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);
394
436
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
+ }*/
401
439
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 ;
403
448
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 ;
408
451
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 ));
411
453
412
- g_free (version );
413
- }
454
+ self = EXM_DETAIL_VIEW (user_data );
414
455
415
- self -> pk = pk ;
456
+ data = exm_unified_data_new () ;
416
457
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 );
419
461
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 );
424
464
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 );
426
468
427
- // Reset scroll position
469
+ // Reset scroll position
428
470
gtk_adjustment_set_value (gtk_scrolled_window_get_vadjustment (self -> scroll_area ), 0 );
429
-
430
471
gtk_stack_set_visible_child_name (self -> stack , "page_detail" );
431
472
432
473
return ;
433
474
}
434
475
476
+ adw_window_title_set_title (self -> title , _ ("An Error Occurred" ));
477
+ adw_window_title_set_subtitle (self -> title , NULL );
435
478
gtk_stack_set_visible_child_name (self -> stack , "page_error" );
479
+ return ;
436
480
}
437
481
438
482
void
@@ -564,6 +608,13 @@ exm_detail_view_class_init (ExmDetailViewClass *klass)
564
608
NULL ,
565
609
G_PARAM_READWRITE );
566
610
611
+ properties [PROP_DATA ]
612
+ = g_param_spec_object ("data" ,
613
+ "Data" ,
614
+ "Data" ,
615
+ EXM_TYPE_UNIFIED_DATA ,
616
+ G_PARAM_READWRITE );
617
+
567
618
g_object_class_install_properties (object_class , N_PROPS , properties );
568
619
569
620
GtkWidgetClass * widget_class = GTK_WIDGET_CLASS (klass );
0 commit comments