[gnome-builder/wip/gtk4-port: 1028/1774] libide/greeter: toggle transparent separator on scroll
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder/wip/gtk4-port: 1028/1774] libide/greeter: toggle transparent separator on scroll
- Date: Mon, 11 Jul 2022 22:31:32 +0000 (UTC)
commit 607bcc63d8c14724eef52fb3fbe70409f1bfc0bd
Author: Christian Hergert <chergert redhat com>
Date: Mon May 16 12:53:14 2022 -0700
libide/greeter: toggle transparent separator on scroll
This makes an invisible separator visible when the scrolledwindow is
scrolled away from the zero position.
This uses a separator instead of box-shadow/border so that we can be
certain we don't affect the layout/sizing during the transition to reduce
chances of stutter.
Normally I don't use opacity: if i can help it, but in this case the GL
renderer knows how to simply alter alpha in the destination color instead
of an offscreen.
Fixes #1674
src/libide/greeter/ide-greeter-workspace.c | 27 ++++++++++++++++++++++++++-
src/libide/greeter/ide-greeter-workspace.ui | 9 ++++++++-
src/libide/gui/style.css | 4 ++++
3 files changed, 38 insertions(+), 2 deletions(-)
---
diff --git a/src/libide/greeter/ide-greeter-workspace.c b/src/libide/greeter/ide-greeter-workspace.c
index 05d1d1013..22e7a2218 100644
--- a/src/libide/greeter/ide-greeter-workspace.c
+++ b/src/libide/greeter/ide-greeter-workspace.c
@@ -65,6 +65,8 @@ struct _IdeGreeterWorkspace
AdwWindowTitle *title;
IdeGreeterButtonsSection *buttons_section;
AdwStatusPage *empty_state;
+ GtkScrolledWindow *scroller;
+ GtkSeparator *separator;
guint selection_mode : 1;
};
@@ -627,6 +629,19 @@ ide_greeter_workspace_page_action (GtkWidget *widget,
IDE_EXIT;
}
+static void
+on_scroller_value_changed_cb (IdeGreeterWorkspace *self,
+ GtkAdjustment *adj)
+{
+ g_assert (IDE_IS_GREETER_WORKSPACE (self));
+ g_assert (GTK_IS_ADJUSTMENT (adj));
+
+ if (gtk_adjustment_get_value (adj) > .0)
+ gtk_widget_remove_css_class (GTK_WIDGET (self->separator), "transparent");
+ else
+ gtk_widget_add_css_class (GTK_WIDGET (self->separator), "transparent");
+}
+
static void
ide_greeter_workspace_dispose (GObject *object)
{
@@ -729,11 +744,13 @@ ide_greeter_workspace_class_init (IdeGreeterWorkspaceClass *klass)
gtk_widget_class_bind_template_child (widget_class, IdeGreeterWorkspace, empty_state);
gtk_widget_class_bind_template_child (widget_class, IdeGreeterWorkspace, header_bar);
gtk_widget_class_bind_template_child (widget_class, IdeGreeterWorkspace, left_box);
+ gtk_widget_class_bind_template_child (widget_class, IdeGreeterWorkspace, pages);
gtk_widget_class_bind_template_child (widget_class, IdeGreeterWorkspace, projects_action_bar);
+ gtk_widget_class_bind_template_child (widget_class, IdeGreeterWorkspace, scroller);
gtk_widget_class_bind_template_child (widget_class, IdeGreeterWorkspace, search_entry);
gtk_widget_class_bind_template_child (widget_class, IdeGreeterWorkspace, sections);
gtk_widget_class_bind_template_child (widget_class, IdeGreeterWorkspace, select_button);
- gtk_widget_class_bind_template_child (widget_class, IdeGreeterWorkspace, pages);
+ gtk_widget_class_bind_template_child (widget_class, IdeGreeterWorkspace, separator);
gtk_widget_class_bind_template_child (widget_class, IdeGreeterWorkspace, title);
gtk_widget_class_bind_template_callback (widget_class, stack_notify_visible_child_cb);
@@ -757,10 +774,18 @@ ide_greeter_workspace_init (IdeGreeterWorkspace *self)
};
g_autoptr(GPropertyAction) selection_action = NULL;
+ GtkAdjustment *vadj;
GtkGesture *gesture;
gtk_widget_init_template (GTK_WIDGET (self));
+ vadj = gtk_scrolled_window_get_vadjustment (self->scroller);
+ g_signal_connect_object (vadj,
+ "value-changed",
+ G_CALLBACK (on_scroller_value_changed_cb),
+ self,
+ G_CONNECT_SWAPPED);
+
selection_action = g_property_action_new ("selection-mode", G_OBJECT (self), "selection-mode");
g_action_map_add_action (G_ACTION_MAP (self), G_ACTION (selection_action));
g_action_map_add_action_entries (G_ACTION_MAP (self), actions, G_N_ELEMENTS (actions), self);
diff --git a/src/libide/greeter/ide-greeter-workspace.ui b/src/libide/greeter/ide-greeter-workspace.ui
index 959896ac9..d13b2270f 100644
--- a/src/libide/greeter/ide-greeter-workspace.ui
+++ b/src/libide/greeter/ide-greeter-workspace.ui
@@ -59,7 +59,14 @@
<object class="GtkBox">
<property name="orientation">vertical</property>
<child>
- <object class="GtkScrolledWindow">
+ <object class="GtkSeparator" id="separator">
+ <style>
+ <class name="transparent"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="scroller">
<property name="vexpand">true</property>
<property name="hscrollbar-policy">never</property>
<child>
diff --git a/src/libide/gui/style.css b/src/libide/gui/style.css
index 4c225cc1e..3fce28b81 100644
--- a/src/libide/gui/style.css
+++ b/src/libide/gui/style.css
@@ -63,6 +63,10 @@ notificationstack button {
background: none;
}
+separator.transparent {
+ opacity: 0;
+}
+
button.pill.small {
font-size: .83333em;
border-radius: 99px;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]