summaryrefslogtreecommitdiff
path: root/panels
diff options
context:
space:
mode:
authorChristopher Davis <christopherdavis@gnome.org>2022-12-25 16:54:50 -0600
committerFelipe Borges <felipeborges@gnome.org>2023-04-11 12:23:16 +0000
commitd25c0e345d125150cc43bf51f3b4ae526e303842 (patch)
tree9c82fee6d2dcad0e0d2cce3ef58edd228a044c0c /panels
parent4702757b935c60bc7d429e0309026cd19f1b6d5d (diff)
downloadgnome-control-center-d25c0e345d125150cc43bf51f3b4ae526e303842.tar.gz
general: Use AdwBanner in CcPermissionInfobar
AdwBanner is a new adaptive widget that replaces GtkInfoBar. AdwBanner adapts better to mobile sizes and has an API that fits with how we use infobars. This commit changes CcPermissionInfobar to use an AdwBanner internally instead of a GtkInfoBar. It also re-implements part of GtkLockButton, as AdwBanner does not support adding arbitrary widgets.
Diffstat (limited to 'panels')
-rw-r--r--panels/common/cc-permission-infobar.c111
-rw-r--r--panels/common/cc-permission-infobar.ui66
-rw-r--r--panels/printers/cc-printers-panel.c2
-rw-r--r--panels/user-accounts/cc-user-panel.c2
4 files changed, 103 insertions, 78 deletions
diff --git a/panels/common/cc-permission-infobar.c b/panels/common/cc-permission-infobar.c
index 78e2b0711..836c14e03 100644
--- a/panels/common/cc-permission-infobar.c
+++ b/panels/common/cc-permission-infobar.c
@@ -28,6 +28,7 @@
#endif
#include <glib/gi18n.h>
+#include <adwaita.h>
#include "cc-permission-infobar.h"
@@ -35,9 +36,10 @@ struct _CcPermissionInfobar
{
AdwBin parent_instance;
- GtkRevealer *revealer;
- GtkLabel *title;
- GtkLockButton *lock_button;
+ AdwBanner *banner;
+ GPermission *permission;
+
+ GCancellable *cancellable;
};
G_DEFINE_TYPE (CcPermissionInfobar, cc_permission_infobar, ADW_TYPE_BIN)
@@ -45,27 +47,109 @@ G_DEFINE_TYPE (CcPermissionInfobar, cc_permission_infobar, ADW_TYPE_BIN)
static void
on_permission_changed (CcPermissionInfobar *self)
{
- GPermission *permission;
- gboolean is_authorized;
+ gboolean is_authorized = g_permission_get_allowed (self->permission);
+
+ adw_banner_set_revealed (self->banner, !is_authorized);
+}
+
+static void
+acquire_cb (GObject *source,
+ GAsyncResult *result,
+ gpointer user_data)
+{
+ CcPermissionInfobar *self = CC_PERMISSION_INFOBAR (user_data);
+ g_autoptr (GError) error = NULL;
+
+ if (!g_permission_acquire_finish (self->permission, result, &error))
+ {
+ g_warning ("Error acquiring permission: %s", error->message);
+ }
+
+ g_clear_object (&self->cancellable);
+}
+
+static void
+release_cb (GObject *source,
+ GAsyncResult *result,
+ gpointer user_data)
+{
+ CcPermissionInfobar *self = CC_PERMISSION_INFOBAR (user_data);
+ g_autoptr (GError) error = NULL;
- permission = gtk_lock_button_get_permission (self->lock_button);
- is_authorized = g_permission_get_allowed (permission);
+ if (!g_permission_release_finish (self->permission, result, &error))
+ {
+ g_warning ("Error releasing permission: %s", error->message);
+ g_error_free (error);
+ }
- gtk_revealer_set_reveal_child (self->revealer, !is_authorized);
+ g_clear_object (&self->cancellable);
+}
+
+static void
+banner_button_clicked_cb (CcPermissionInfobar *self)
+{
+ /* if we already have a pending interactive check or permission is not set,
+ * then do nothing
+ */
+ if (self->cancellable != NULL || self->permission == NULL)
+ return;
+
+ if (g_permission_get_allowed (self->permission))
+ {
+ if (g_permission_get_can_release (self->permission))
+ {
+ self->cancellable = g_cancellable_new ();
+
+ g_permission_release_async (self->permission,
+ self->cancellable,
+ release_cb,
+ self);
+ }
+ }
+ else
+ {
+ if (g_permission_get_can_acquire (self->permission))
+ {
+ self->cancellable = g_cancellable_new ();
+
+ g_permission_acquire_async (self->permission,
+ self->cancellable,
+ acquire_cb,
+ self);
+ }
+ }
+}
+
+static void
+cc_permission_infobar_dispose (GObject *object)
+{
+ CcPermissionInfobar *self = CC_PERMISSION_INFOBAR (object);
+
+ if (self->cancellable != NULL)
+ {
+ g_cancellable_cancel (self->cancellable);
+ }
+
+ g_clear_object (&self->cancellable);
+
+ G_OBJECT_CLASS (cc_permission_infobar_parent_class)->dispose (object);
}
static void
cc_permission_infobar_class_init (CcPermissionInfobarClass *klass)
{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+ object_class->dispose = cc_permission_infobar_dispose;
+
gtk_widget_class_set_template_from_resource (widget_class,
"/org/gnome/control-center/"
"common/cc-permission-infobar.ui");
- gtk_widget_class_bind_template_child (widget_class, CcPermissionInfobar, revealer);
- gtk_widget_class_bind_template_child (widget_class, CcPermissionInfobar, title);
- gtk_widget_class_bind_template_child (widget_class, CcPermissionInfobar, lock_button);
+ gtk_widget_class_bind_template_child (widget_class, CcPermissionInfobar, banner);
+ gtk_widget_class_bind_template_callback (widget_class,
+ banner_button_clicked_cb);
}
static void
@@ -82,8 +166,9 @@ cc_permission_infobar_set_permission (CcPermissionInfobar *self,
GPermission *permission)
{
g_return_if_fail (CC_IS_PERMISSION_INFOBAR (self));
+ g_return_if_fail (G_IS_PERMISSION (permission));
- gtk_lock_button_set_permission (self->lock_button, permission);
+ self->permission = permission;
g_signal_connect_object (permission, "notify",
G_CALLBACK (on_permission_changed),
@@ -108,5 +193,5 @@ cc_permission_infobar_set_title (CcPermissionInfobar *self,
if (title == NULL)
title = _("Unlock to Change Settings");
- gtk_label_set_text (self->title, title);
+ adw_banner_set_title (self->banner, title);
}
diff --git a/panels/common/cc-permission-infobar.ui b/panels/common/cc-permission-infobar.ui
index a2830b98f..d8e35c1ca 100644
--- a/panels/common/cc-permission-infobar.ui
+++ b/panels/common/cc-permission-infobar.ui
@@ -1,70 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<template class="CcPermissionInfobar" parent="AdwBin">
- <property name="valign">start</property>
<child>
- <object class="GtkRevealer" id="revealer">
- <property name="hexpand">True</property>
- <property name="reveal-child">True</property>
- <child>
- <object class="GtkInfoBar">
- <child>
- <object class="GtkBox">
- <property name="margin-top">10</property>
- <property name="margin-bottom">10</property>
- <property name="margin-start">10</property>
- <property name="margin-end">10</property>
- <property name="spacing">10</property>
- <child>
- <object class="GtkImage">
- <property name="icon-name">system-lock-screen-symbolic</property>
- </object>
- </child>
- <child>
- <object class="GtkBox">
- <property name="hexpand">True</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkLabel" id="title">
- <property name="halign">start</property>
- <property name="wrap">True</property>
- <!-- Actual string set in code -->
- <property name="label"></property>
- <attributes>
- <attribute name="weight" value="bold"/>
- </attributes>
- </object>
- </child>
- <child>
- <object class="GtkLabel">
- <property name="halign">start</property>
- <property name="wrap">True</property>
- <property name="label" translatable="yes">Some settings must be unlocked before they can be changed.</property>
- </object>
- </child>
- </object>
- </child>
- </object>
- </child>
-
- <child>
- <object class="GtkCenterBox">
- <property name="margin-top">10</property>
- <property name="margin-bottom">10</property>
- <property name="margin-start">10</property>
- <property name="margin-end">10</property>
- <child type="end">
- <object class="GtkLockButton" id="lock_button">
- <property name="receives-default">True</property>
- <property name="label" translatable="yes">Unlock…</property>
- <property name="valign">GTK_ALIGN_CENTER</property>
- </object>
- </child>
- </object>
- </child>
-
- </object>
- </child>
+ <object class="AdwBanner" id="banner">
+ <property name="button-label" translatable="yes">_Unlock…</property>
+ <signal name="button-clicked" handler="banner_button_clicked_cb" swapped="yes"/>
</object>
</child>
</template>
diff --git a/panels/printers/cc-printers-panel.c b/panels/printers/cc-printers-panel.c
index 2da79e16c..069d4575d 100644
--- a/panels/printers/cc-printers-panel.c
+++ b/panels/printers/cc-printers-panel.c
@@ -1310,7 +1310,7 @@ cc_printers_panel_init (CcPrintersPanel *self)
cc_permission_infobar_set_permission (self->permission_infobar,
self->permission);
cc_permission_infobar_set_title (self->permission_infobar,
- _("Unlock to Add Printers and Change Settings"));
+ _("Unlock to add printers and change settings"));
on_permission_changed (self);
}
diff --git a/panels/user-accounts/cc-user-panel.c b/panels/user-accounts/cc-user-panel.c
index 55b585297..012829160 100644
--- a/panels/user-accounts/cc-user-panel.c
+++ b/panels/user-accounts/cc-user-panel.c
@@ -1456,7 +1456,7 @@ cc_user_panel_constructed (GObject *object)
G_OBJECT_CLASS (cc_user_panel_parent_class)->constructed (object);
cc_permission_infobar_set_permission (self->permission_infobar, self->permission);
- cc_permission_infobar_set_title (self->permission_infobar, _("Unlock to Add Users and Change Settings"));
+ cc_permission_infobar_set_title (self->permission_infobar, _("Unlock to add users and change settings"));
}
static void