Skip to content

Commit

Permalink
install-button: Disable during installation
Browse files Browse the repository at this point in the history
Introduces a new installing state that is set before activating
`ext.install` action. To deal with cancellations, a new `install-status`
signal is added to ExmManager which is emitted whenever it happens and
reverts the button state to the last one it had, either default or
unsupported.

ExmSearchRow drops `is-installed` and `is-supported` properties in favor
of a new `manager` property to connect to ExmManager's `install-status
signal.

The implementation will most likely be simplified in the future with the
unified subsystem, binding the downloading state of ExmExtension to the
installing state introduced here.
  • Loading branch information
oscfdezdz committed Jan 29, 2025
1 parent 4daabcd commit 9429a32
Show file tree
Hide file tree
Showing 9 changed files with 224 additions and 100 deletions.
16 changes: 1 addition & 15 deletions src/exm-browse-page.c
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@ struct _ExmBrowsePage

GtkStringList *suggestions;
GListModel *search_results_model;
gchar *shell_version;

int current_page;
int max_pages;
Expand Down Expand Up @@ -133,19 +132,7 @@ static GtkWidget *
search_widget_factory (ExmSearchResult *result,
ExmBrowsePage *self)
{
ExmSearchRow *row;
gchar *uuid;
gboolean is_installed;
gboolean is_supported;

g_object_get (result, "uuid", &uuid, NULL);

is_installed = exm_manager_is_installed_uuid (self->manager, uuid);
is_supported = exm_search_result_supports_shell_version (result, self->shell_version);

row = exm_search_row_new (result, is_installed, is_supported);

return GTK_WIDGET (row);
return GTK_WIDGET (exm_search_row_new (self->manager, result));
}

static void
Expand Down Expand Up @@ -356,7 +343,6 @@ on_bind_manager (ExmBrowsePage *self)
&shell_version,
NULL);

self->shell_version = shell_version;
g_object_set (self->search, "shell-version", shell_version, NULL);

refresh_search (self);
Expand Down
46 changes: 35 additions & 11 deletions src/exm-detail-view.c
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,8 @@ struct _ExmDetailView
AdwActionRow *link_extensions;
gchar *uri_extensions;
int pk;
guint signal_id;
guint comments_signal_id;
guint install_signal_id;
};

G_DEFINE_FINAL_TYPE (ExmDetailView, exm_detail_view, ADW_TYPE_NAVIGATION_PAGE)
Expand Down Expand Up @@ -272,6 +273,14 @@ show_more_comments (GtkButton *button G_GNUC_UNUSED,
adw_dialog_present (ADW_DIALOG (dlg), GTK_WIDGET (toplevel));
}

static void
on_install_status (ExmManager *manager G_GNUC_UNUSED,
ExmInstallButtonState state,
ExmDetailView *self)
{
g_object_set (self->ext_install, "state", state, NULL);
}

static void
install_remote (GtkButton *button,
ExmDetailView *self)
Expand All @@ -282,6 +291,9 @@ install_remote (GtkButton *button,
g_object_get (self->ext_install, "state", &state, NULL);

warn = (state == EXM_INSTALL_BUTTON_STATE_UNSUPPORTED);

g_object_set (self->ext_install, "state", EXM_INSTALL_BUTTON_STATE_INSTALLING, NULL);

gtk_widget_activate_action (GTK_WIDGET (button),
"ext.install",
"(sb)", self->uuid, warn);
Expand Down Expand Up @@ -500,13 +512,13 @@ on_data_loaded (GObject *source,

self->pk = pk;

if (self->signal_id > 0)
g_signal_handler_disconnect (self->show_more_btn, self->signal_id);
if (self->comments_signal_id > 0)
g_signal_handler_disconnect (self->show_more_btn, self->comments_signal_id);

self->signal_id = g_signal_connect (self->show_more_btn,
"clicked",
G_CALLBACK (show_more_comments),
self);
self->comments_signal_id = g_signal_connect (self->show_more_btn,
"clicked",
G_CALLBACK (show_more_comments),
self);

queue_resolve_comments (self, pk, self->resolver_cancel);

Expand Down Expand Up @@ -546,9 +558,7 @@ exm_detail_view_update (ExmDetailView *self)
// Check if the newly installed extension is the
// one being displayed in this detail view
if (exm_manager_is_installed_uuid (self->manager, self->uuid))
{
g_object_set (self->ext_install, "state", EXM_INSTALL_BUTTON_STATE_INSTALLED, NULL);
}
}

static void
Expand All @@ -562,17 +572,23 @@ open_link (ExmDetailView *self,
toplevel = GTK_WIDGET (gtk_widget_get_root (GTK_WIDGET (self)));

if (strcmp (action_name, "detail.open-extensions") == 0)
{
uri = gtk_uri_launcher_new (self->uri_extensions);
}
else if (strcmp (action_name, "detail.open-homepage") == 0)
{
uri = gtk_uri_launcher_new (self->uri_homepage);
}
else if (strcmp (action_name, "detail.open-donation") == 0)
{
guint val;
g_variant_get (param, "i", &val);
uri = gtk_uri_launcher_new (self->uri_donations[val]);
}
else
{
g_critical ("open_link() invalid action: %s", action_name);
}

gtk_uri_launcher_launch (uri, GTK_WINDOW (toplevel), NULL, NULL, NULL);
}
Expand All @@ -586,6 +602,14 @@ on_bind_manager (ExmDetailView *self)
"extensions", &ext_model,
NULL);

if (self->install_signal_id > 0)
g_signal_handler_disconnect (self->ext_install, self->install_signal_id);

self->install_signal_id = g_signal_connect (self->manager,
"install-status",
G_CALLBACK (on_install_status),
self);

g_signal_connect_swapped (ext_model,
"items-changed",
G_CALLBACK (exm_detail_view_update),
Expand Down Expand Up @@ -664,8 +688,8 @@ exm_detail_view_class_init (ExmDetailViewClass *klass)
gtk_widget_class_bind_template_child (widget_class, ExmDetailView, ext_description);
gtk_widget_class_bind_template_child (widget_class, ExmDetailView, ext_install);
gtk_widget_class_bind_template_child (widget_class, ExmDetailView, ext_screenshot);
gtk_widget_class_bind_template_child (widget_class, ExmDetailView, ext_screenshot_container);
gtk_widget_class_bind_template_child (widget_class, ExmDetailView, ext_screenshot_popout_button);
gtk_widget_class_bind_template_child (widget_class, ExmDetailView, ext_screenshot_container);
gtk_widget_class_bind_template_child (widget_class, ExmDetailView, ext_screenshot_popout_button);
gtk_widget_class_bind_template_child (widget_class, ExmDetailView, ext_info_bar);
gtk_widget_class_bind_template_child (widget_class, ExmDetailView, link_homepage);
gtk_widget_class_bind_template_child (widget_class, ExmDetailView, links_donations);
Expand Down
4 changes: 4 additions & 0 deletions src/exm-install-button.c
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,10 @@ update_state (ExmInstallButton *button)
gtk_widget_set_sensitive (GTK_WIDGET (button), TRUE);
gtk_widget_add_css_class (GTK_WIDGET (button), "suggested-action");
break;
case EXM_INSTALL_BUTTON_STATE_INSTALLING:
gtk_button_set_label (GTK_BUTTON (button), _("Installing"));
gtk_widget_set_sensitive (GTK_WIDGET (button), FALSE);
break;
case EXM_INSTALL_BUTTON_STATE_INSTALLED:
gtk_button_set_label (GTK_BUTTON (button), C_("State", "Installed"));
gtk_widget_set_sensitive (GTK_WIDGET (button), FALSE);
Expand Down
5 changes: 3 additions & 2 deletions src/exm-install-button.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
/* exm-install-button.h
/*
* exm-install-button.h
*
* Copyright 2022 Matthew Jakeman <mjakeman26@outlook.co.nz>
* Copyright 2022-2025 Matthew Jakeman <mjakeman26@outlook.co.nz>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
Expand Down
93 changes: 52 additions & 41 deletions src/exm-search-row.c
Original file line number Diff line number Diff line change
Expand Up @@ -20,48 +20,43 @@

#include "exm-search-row.h"

#include "exm-config.h"
#include "exm-enums.h"
#include "exm-install-button.h"

#include "exm-types.h"
#include "exm-enums.h"

#include "exm-config.h"

#include <glib/gi18n.h>

struct _ExmSearchRow
{
GtkListBoxRow parent_instance;

ExmManager *manager;
ExmSearchResult *search_result;
gboolean is_installed;
gboolean is_supported;
gchar *uuid;

ExmInstallButton *install_btn;
guint signal_id;
};

G_DEFINE_FINAL_TYPE (ExmSearchRow, exm_search_row, GTK_TYPE_LIST_BOX_ROW)

enum {
PROP_0,
PROP_MANAGER,
PROP_SEARCH_RESULT,
PROP_IS_INSTALLED,
PROP_IS_SUPPORTED,
N_PROPS
};

static GParamSpec *properties [N_PROPS];

ExmSearchRow *
exm_search_row_new (ExmSearchResult *search_result,
gboolean is_installed,
gboolean is_supported)
exm_search_row_new (ExmManager *manager,
ExmSearchResult *search_result)
{
return g_object_new (EXM_TYPE_SEARCH_ROW,
"manager", manager,
"search-result", search_result,
"is-installed", is_installed,
"is-supported", is_supported,
NULL);
}

Expand All @@ -75,15 +70,12 @@ exm_search_row_get_property (GObject *object,

switch (prop_id)
{
case PROP_MANAGER:
g_value_set_object (value, self->manager);
break;
case PROP_SEARCH_RESULT:
g_value_set_object (value, self->search_result);
break;
case PROP_IS_INSTALLED:
g_value_set_boolean (value, self->is_installed);
break;
case PROP_IS_SUPPORTED:
g_value_set_boolean (value, self->is_supported);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
Expand All @@ -99,6 +91,9 @@ exm_search_row_set_property (GObject *object,

switch (prop_id)
{
case PROP_MANAGER:
self->manager = g_value_get_object (value);
break;
case PROP_SEARCH_RESULT:
self->search_result = g_value_get_object (value);
if (self->search_result)
Expand All @@ -109,17 +104,22 @@ exm_search_row_set_property (GObject *object,
NULL);
}
break;
case PROP_IS_INSTALLED:
self->is_installed = g_value_get_boolean (value);
break;
case PROP_IS_SUPPORTED:
self->is_supported = g_value_get_boolean (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
}

static void
on_install_status (ExmManager *manager G_GNUC_UNUSED,
ExmInstallButtonState state,
ExmSearchRow *self)
{
g_object_set (self->install_btn, "state", state, NULL);

if (self->signal_id > 0)
g_signal_handler_disconnect (self->manager, self->signal_id);
}

static void
install_remote (GtkButton *button,
ExmSearchRow *self)
Expand All @@ -129,7 +129,15 @@ install_remote (GtkButton *button,

g_object_get (self->install_btn, "state", &state, NULL);

self->signal_id = g_signal_connect (self->manager,
"install-status",
G_CALLBACK (on_install_status),
self);

warn = (state == EXM_INSTALL_BUTTON_STATE_UNSUPPORTED);

g_object_set (self->install_btn, "state", EXM_INSTALL_BUTTON_STATE_INSTALLING, NULL);

gtk_widget_activate_action (GTK_WIDGET (button),
"ext.install",
"(sb)", self->uuid, warn);
Expand All @@ -141,6 +149,8 @@ exm_search_row_constructed (GObject *object)
ExmSearchRow *self = EXM_SEARCH_ROW (object);

ExmInstallButtonState install_state;
gboolean is_installed;
gboolean is_supported;

gchar *uuid, *name, *creator;
g_object_get (self->search_result,
Expand All @@ -149,11 +159,19 @@ exm_search_row_constructed (GObject *object)
"creator", &creator,
NULL);

gchar *shell_version;
g_object_get (self->manager,
"shell-version",
&shell_version,
NULL);

gtk_actionable_set_action_target (GTK_ACTIONABLE (self), "s", uuid);
is_installed = exm_manager_is_installed_uuid (self->manager, uuid);
is_supported = exm_search_result_supports_shell_version (self->search_result, shell_version);

install_state = self->is_installed
install_state = is_installed
? EXM_INSTALL_BUTTON_STATE_INSTALLED
: (self->is_supported
: (is_supported
? EXM_INSTALL_BUTTON_STATE_DEFAULT
: EXM_INSTALL_BUTTON_STATE_UNSUPPORTED);

Expand All @@ -176,27 +194,20 @@ exm_search_row_class_init (ExmSearchRowClass *klass)
object_class->set_property = exm_search_row_set_property;
object_class->constructed = exm_search_row_constructed;

properties [PROP_MANAGER]
= g_param_spec_object ("manager",
"Manager",
"Manager",
EXM_TYPE_MANAGER,
G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY);

properties [PROP_SEARCH_RESULT] =
g_param_spec_object ("search-result",
"Search Result",
"Search Result",
EXM_TYPE_SEARCH_RESULT,
G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY);

properties [PROP_IS_INSTALLED] =
g_param_spec_boolean ("is-installed",
"Is Installed",
"Is Installed",
FALSE,
G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY);

properties [PROP_IS_SUPPORTED] =
g_param_spec_boolean ("is-supported",
"Is Supported",
"Is Supported",
FALSE,
G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY);

g_object_class_install_properties (object_class, N_PROPS, properties);

GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
Expand Down
Loading

0 comments on commit 9429a32

Please sign in to comment.