Skip to content

Commit c65d7a9

Browse files
committed
detail-view: Rewrite using unified data and property bindings
1 parent e6559dd commit c65d7a9

File tree

4 files changed

+393
-112
lines changed

4 files changed

+393
-112
lines changed

src/exm-detail-view.blp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,13 +92,14 @@ template $ExmDetailView : Adw.NavigationPage {
9292
styles ["title-1"]
9393
xalign: 0;
9494
ellipsize: end;
95+
label: bind template.data as <$ExmUnifiedData>.name;
9596
}
9697

9798
Gtk.Label ext_author {
9899
styles ["dim-label"]
99-
label: "Author";
100100
xalign: 0;
101101
ellipsize: end;
102+
label: bind template.data as <$ExmUnifiedData>.creator;
102103
}
103104
}
104105

@@ -145,6 +146,8 @@ template $ExmDetailView : Adw.NavigationPage {
145146
wrap: true;
146147
wrap-mode: word_char;
147148
selectable: true;
149+
150+
label: bind template.data as <$ExmUnifiedData>.description;
148151
}
149152
}
150153

@@ -175,6 +178,8 @@ template $ExmDetailView : Adw.NavigationPage {
175178
activatable: true;
176179
action-name: "detail.open-homepage";
177180

181+
subtitle: bind template.data as <$ExmUnifiedData>.homepage;
182+
178183
[suffix]
179184
Gtk.Image {
180185
styles ["dim-label"]
@@ -192,6 +197,8 @@ template $ExmDetailView : Adw.NavigationPage {
192197
activatable: true;
193198
action-name: "detail.open-extensions";
194199

200+
subtitle: bind template.data as <$ExmUnifiedData>.link;
201+
195202
[suffix]
196203
Gtk.Image {
197204
styles ["dim-label"]

src/exm-detail-view.c

Lines changed: 156 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
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;
@@ -86,6 +89,7 @@ enum {
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

438482
void
@@ -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

Comments
 (0)