[evolution] Let the New Collection Account window resize based on its content



commit cf89e68c18501979ffb208d3110983b2cf41b3cc
Author: Milan Crha <mcrha redhat com>
Date:   Wed Aug 26 17:52:11 2020 +0200

    Let the New Collection Account window resize based on its content
    
    This avoids unnecessary scrolling when doing lookup, which helps
    to notice whether any lookup worker needs to enter more details.

 src/e-util/e-collection-account-wizard.c | 18 ++++++++-
 src/e-util/e-filter-rule.c               | 59 ++-------------------------
 src/e-util/e-misc-utils.c                | 53 ++++++++++++++++++++++++
 src/e-util/e-misc-utils.h                |  3 ++
 src/mail/em-filter-rule.c                | 69 ++------------------------------
 5 files changed, 80 insertions(+), 122 deletions(-)
---
diff --git a/src/e-util/e-collection-account-wizard.c b/src/e-util/e-collection-account-wizard.c
index e7aef34e46..87398e8698 100644
--- a/src/e-util/e-collection-account-wizard.c
+++ b/src/e-util/e-collection-account-wizard.c
@@ -174,7 +174,7 @@ static GtkWindow *
 collection_account_wizard_create_window (GtkWindow *parent,
                                         GtkWidget *wizard)
 {
-       GtkWidget *widget, *vbox, *hbox;
+       GtkWidget *widget, *vbox, *hbox, *scrolled_window;
        GtkWindow *window;
        GtkAccelGroup *accel_group;
        WizardWindowData *wwd;
@@ -204,6 +204,8 @@ collection_account_wizard_create_window (GtkWindow *parent,
        gtk_container_add (GTK_CONTAINER (window), widget);
        gtk_widget_show (widget);
 
+       scrolled_window = widget;
+
        vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
        gtk_container_add (GTK_CONTAINER (widget), vbox);
        gtk_widget_show (vbox);
@@ -296,6 +298,12 @@ collection_account_wizard_create_window (GtkWindow *parent,
        e_collection_account_wizard_reset (wwd->collection_wizard);
        collection_wizard_window_update_button_captions (wwd);
 
+       e_signal_connect_notify_swapped (
+               gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)), "notify::upper",
+               G_CALLBACK (e_util_ensure_scrolled_window_height), scrolled_window);
+
+       g_signal_connect (scrolled_window, "map", G_CALLBACK (e_util_ensure_scrolled_window_height), NULL);
+
        return window;
 }
 
@@ -1733,6 +1741,8 @@ collection_account_wizard_constructed (GObject *object)
 
        gtk_box_pack_start (vbox, widget, TRUE, TRUE, 0);
 
+       scrolled_window = widget;
+
        label = gtk_label_new ("");
        g_object_set (G_OBJECT (label),
                "hexpand", FALSE,
@@ -1885,6 +1895,12 @@ collection_account_wizard_constructed (GObject *object)
 
        g_slist_free_full (workers, g_object_unref);
 
+       e_signal_connect_notify_swapped (
+               gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)), "notify::upper",
+               G_CALLBACK (e_util_ensure_scrolled_window_height), scrolled_window);
+
+       g_signal_connect (scrolled_window, "map", G_CALLBACK (e_util_ensure_scrolled_window_height), NULL);
+
        /* Parts page */
 
        vbox = GTK_BOX (gtk_box_new (GTK_ORIENTATION_VERTICAL, 6));
diff --git a/src/e-util/e-filter-rule.c b/src/e-util/e-filter-rule.c
index 72bfc6af5e..af7fed1567 100644
--- a/src/e-util/e-filter-rule.c
+++ b/src/e-util/e-filter-rule.c
@@ -974,59 +974,6 @@ ensure_scrolled_width_cb (GtkAdjustment *adj,
                gtk_adjustment_get_upper (adj));
 }
 
-static void
-ensure_scrolled_height_cb (GtkAdjustment *adj,
-                           GParamSpec *param_spec,
-                           GtkScrolledWindow *scrolled_window)
-{
-       GtkWidget *toplevel;
-       GdkScreen *screen;
-       gint toplevel_height, scw_height, require_scw_height = 0, max_height;
-
-       toplevel = gtk_widget_get_toplevel (GTK_WIDGET (scrolled_window));
-       if (!toplevel || !gtk_widget_is_toplevel (toplevel))
-               return;
-
-       scw_height = gtk_widget_get_allocated_height (GTK_WIDGET (scrolled_window));
-
-       gtk_widget_get_preferred_height_for_width (gtk_bin_get_child (GTK_BIN (scrolled_window)),
-               gtk_widget_get_allocated_width (GTK_WIDGET (scrolled_window)),
-               &require_scw_height, NULL);
-
-       if (scw_height >= require_scw_height) {
-               if (require_scw_height > 0)
-                       gtk_scrolled_window_set_min_content_height (scrolled_window, require_scw_height);
-               return;
-       }
-
-       if (!GTK_IS_WINDOW (toplevel) ||
-           !gtk_widget_get_window (toplevel))
-               return;
-
-       screen = gtk_window_get_screen (GTK_WINDOW (toplevel));
-       if (screen) {
-               gint monitor;
-               GdkRectangle workarea;
-
-               monitor = gdk_screen_get_monitor_at_window (screen, gtk_widget_get_window (toplevel));
-               if (monitor < 0)
-                       monitor = 0;
-
-               gdk_screen_get_monitor_workarea (screen, monitor, &workarea);
-
-               /* can enlarge up to 4 / 5 monitor's work area height */
-               max_height = workarea.height * 4 / 5;
-       } else {
-               return;
-       }
-
-       toplevel_height = gtk_widget_get_allocated_height (toplevel);
-       if (toplevel_height + require_scw_height - scw_height > max_height)
-               return;
-
-       gtk_scrolled_window_set_min_content_height (scrolled_window, require_scw_height);
-}
-
 static void
 parts_grid_mapped_cb (GtkWidget *widget,
                      GtkScrolledWindow *scrolled_window)
@@ -1034,7 +981,7 @@ parts_grid_mapped_cb (GtkWidget *widget,
        g_return_if_fail (GTK_IS_SCROLLED_WINDOW (scrolled_window));
 
        ensure_scrolled_width_cb (gtk_scrolled_window_get_hadjustment (scrolled_window), NULL, 
scrolled_window);
-       ensure_scrolled_height_cb (gtk_scrolled_window_get_vadjustment (scrolled_window), NULL, 
scrolled_window);
+       e_util_ensure_scrolled_window_height (scrolled_window);
 }
 
 static GtkWidget *
@@ -1224,9 +1171,9 @@ filter_rule_get_widget (EFilterRule *rule,
        e_signal_connect_notify (
                hadj, "notify::upper",
                G_CALLBACK (ensure_scrolled_width_cb), scrolledwindow);
-       e_signal_connect_notify (
+       e_signal_connect_notify_swapped (
                vadj, "notify::upper",
-               G_CALLBACK (ensure_scrolled_height_cb), scrolledwindow);
+               G_CALLBACK (e_util_ensure_scrolled_window_height), scrolledwindow);
 
        gtk_scrolled_window_set_policy (
                GTK_SCROLLED_WINDOW (scrolledwindow),
diff --git a/src/e-util/e-misc-utils.c b/src/e-util/e-misc-utils.c
index 1908109a03..e3107a2c24 100644
--- a/src/e-util/e-misc-utils.c
+++ b/src/e-util/e-misc-utils.c
@@ -4612,3 +4612,56 @@ e_util_get_uri_tooltip (const gchar *uri)
 
        return g_string_free (message, FALSE);
 }
+
+void
+e_util_ensure_scrolled_window_height (GtkScrolledWindow *scrolled_window)
+{
+       GtkWidget *toplevel;
+       GdkScreen *screen;
+       gint toplevel_height, scw_height, require_scw_height = 0, max_height;
+
+       g_return_if_fail (GTK_IS_SCROLLED_WINDOW (scrolled_window));
+
+       toplevel = gtk_widget_get_toplevel (GTK_WIDGET (scrolled_window));
+       if (!toplevel || !gtk_widget_is_toplevel (toplevel))
+               return;
+
+       scw_height = gtk_widget_get_allocated_height (GTK_WIDGET (scrolled_window));
+
+       gtk_widget_get_preferred_height_for_width (gtk_bin_get_child (GTK_BIN (scrolled_window)),
+               gtk_widget_get_allocated_width (GTK_WIDGET (scrolled_window)),
+               &require_scw_height, NULL);
+
+       if (scw_height >= require_scw_height) {
+               if (require_scw_height > 0)
+                       gtk_scrolled_window_set_min_content_height (scrolled_window, require_scw_height);
+               return;
+       }
+
+       if (!GTK_IS_WINDOW (toplevel) ||
+           !gtk_widget_get_window (toplevel))
+               return;
+
+       screen = gtk_window_get_screen (GTK_WINDOW (toplevel));
+       if (screen) {
+               gint monitor;
+               GdkRectangle workarea;
+
+               monitor = gdk_screen_get_monitor_at_window (screen, gtk_widget_get_window (toplevel));
+               if (monitor < 0)
+                       monitor = 0;
+
+               gdk_screen_get_monitor_workarea (screen, monitor, &workarea);
+
+               /* can enlarge up to 4 / 5 monitor's work area height */
+               max_height = workarea.height * 4 / 5;
+       } else {
+               return;
+       }
+
+       toplevel_height = gtk_widget_get_allocated_height (toplevel);
+       if (toplevel_height + require_scw_height - scw_height > max_height)
+               return;
+
+       gtk_scrolled_window_set_min_content_height (scrolled_window, require_scw_height);
+}
diff --git a/src/e-util/e-misc-utils.h b/src/e-util/e-misc-utils.h
index 5c8848ff0f..3a98e87051 100644
--- a/src/e-util/e-misc-utils.h
+++ b/src/e-util/e-misc-utils.h
@@ -339,6 +339,9 @@ void                e_util_enum_supported_locales   (void);
 const ESupportedLocales *
                e_util_get_supported_locales    (void);
 
+void           e_util_ensure_scrolled_window_height
+                                               (GtkScrolledWindow *scrolled_window);
+
 G_END_DECLS
 
 #endif /* E_MISC_UTILS_H */
diff --git a/src/mail/em-filter-rule.c b/src/mail/em-filter-rule.c
index a80042eda4..163130cae1 100644
--- a/src/mail/em-filter-rule.c
+++ b/src/mail/em-filter-rule.c
@@ -735,8 +735,6 @@ do_grab_focus_cb (GtkWidget *widget,
        }
 }
 
-static void ensure_scrolled_height (GtkScrolledWindow *scrolled_window);
-
 static void
 more_parts (GtkWidget *button,
             struct _rule_data *data)
@@ -777,70 +775,11 @@ more_parts (GtkWidget *button,
                                gtk_adjustment_set_value (adjustment, upper);
                        }
 
-                       ensure_scrolled_height (GTK_SCROLLED_WINDOW (w));
+                       e_util_ensure_scrolled_window_height (GTK_SCROLLED_WINDOW (w));
                }
        }
 }
 
-static void
-ensure_scrolled_height (GtkScrolledWindow *scrolled_window)
-{
-       GtkWidget *toplevel;
-       GdkScreen *screen;
-       gint toplevel_height, scw_height, require_scw_height = 0, max_height;
-
-       toplevel = gtk_widget_get_toplevel (GTK_WIDGET (scrolled_window));
-       if (!toplevel || !gtk_widget_is_toplevel (toplevel))
-               return;
-
-       scw_height = gtk_widget_get_allocated_height (GTK_WIDGET (scrolled_window));
-
-       gtk_widget_get_preferred_height_for_width (gtk_bin_get_child (GTK_BIN (scrolled_window)),
-               gtk_widget_get_allocated_width (GTK_WIDGET (scrolled_window)),
-               &require_scw_height, NULL);
-
-       if (scw_height >= require_scw_height) {
-               if (require_scw_height > 0)
-                       gtk_scrolled_window_set_min_content_height (scrolled_window, require_scw_height);
-               return;
-       }
-
-       if (!GTK_IS_WINDOW (toplevel) ||
-           !gtk_widget_get_window (toplevel))
-               return;
-
-       screen = gtk_window_get_screen (GTK_WINDOW (toplevel));
-       if (screen) {
-               gint monitor;
-               GdkRectangle workarea;
-
-               monitor = gdk_screen_get_monitor_at_window (screen, gtk_widget_get_window (toplevel));
-               if (monitor < 0)
-                       monitor = 0;
-
-               gdk_screen_get_monitor_workarea (screen, monitor, &workarea);
-
-               /* can enlarge up to 4 / 5 monitor's work area height */
-               max_height = workarea.height * 4 / 5;
-       } else {
-               return;
-       }
-
-       toplevel_height = gtk_widget_get_allocated_height (toplevel);
-       if (toplevel_height + require_scw_height - scw_height > max_height)
-               return;
-
-       gtk_scrolled_window_set_min_content_height (scrolled_window, require_scw_height);
-}
-
-static void
-ensure_scrolled_height_cb (GtkAdjustment *adj,
-                           GParamSpec *param_spec,
-                           GtkScrolledWindow *scrolled_window)
-{
-       ensure_scrolled_height (scrolled_window);
-}
-
 static void
 filter_type_changed_cb (GtkComboBox *combobox,
                        EFilterRule *fr)
@@ -1147,11 +1086,11 @@ get_widget (EFilterRule *fr,
 
        g_object_set_data (G_OBJECT (add), "scrolled-window", scrolledwindow);
 
-       e_signal_connect_notify (
+       e_signal_connect_notify_swapped (
                vadj, "notify::upper",
-               G_CALLBACK (ensure_scrolled_height_cb), scrolledwindow);
+               G_CALLBACK (e_util_ensure_scrolled_window_height), scrolledwindow);
 
-       g_signal_connect (scrolledwindow, "map", G_CALLBACK (ensure_scrolled_height), NULL);
+       g_signal_connect (scrolledwindow, "map", G_CALLBACK (e_util_ensure_scrolled_window_height), NULL);
 
        gtk_widget_show_all (widget);
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]