summaryrefslogtreecommitdiff
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
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.
-rw-r--r--meson.build2
-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
5 files changed, 104 insertions, 79 deletions
diff --git a/meson.build b/meson.build
index 4251f6e73..0514e7d42 100644
--- a/meson.build
+++ b/meson.build
@@ -132,7 +132,7 @@ gtk_dep = dependency(
libadwaita_dep = dependency(
'libadwaita-1',
- version: '>= 1.2.alpha',
+ version: '>= 1.3.alpha',
fallback: ['libadwaita', 'libadwaita_dep'],
default_options: ['examples=false', 'introspection=disabled', 'tests=false', 'vapi=false'],
)
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