diff --git a/src/calls-history-box.c b/src/calls-history-box.c
index 6c48116..a626ca6 100644
--- a/src/calls-history-box.c
+++ b/src/calls-history-box.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018, 2019 Purism SPC
+ * Copyright (C) 2018, 2019, 2022 Purism SPC
*
* This file is part of Calls.
*
@@ -17,10 +17,12 @@
* along with Calls. If not, see .
*
* Author: Adrien Plazas
+ * Evangelos Ribeiro Tzaras
*
* SPDX-License-Identifier: GPL-3.0-or-later
*
*/
+#define G_LOG_DOMAIN "CallsHistoryBox"
#include "calls-history-box.h"
#include "calls-call-record.h"
@@ -31,16 +33,22 @@
#include
#include
+#define CALLS_HISTORY_SIZE_INITIAL 75
+#define CALLS_HISTORY_SIZE_INCREMENTS 50
+#define CALLS_HISTORY_RESET_SIZE_POSITION_THRESHOLD 500
+#define CALLS_HISTORY_INCREASE_N_PAGES_THRESHOLD 2
struct _CallsHistoryBox {
- GtkStack parent_instance;
+ GtkStack parent_instance;
- GtkListBox *history;
+ GtkListBox *history;
+ GtkScrolledWindow *scrolled_window;
+ GtkAdjustment *scroll_adjustment;
- GListModel *model;
+ GListModel *model;
GtkSliceListModel *slice_model;
- gulong model_changed_handler_id;
+ gulong model_changed_handler_id;
};
@@ -122,6 +130,43 @@ create_row_cb (CallsCallRecord *record,
}
+static void
+on_adjustment_position_changed (GtkAdjustment *adjustment,
+ CallsHistoryBox *self)
+{
+ double position;
+ double upper_limit;
+ double page_size;
+ guint old_size;
+
+ g_assert (CALLS_IS_HISTORY_BOX (self));
+
+ position = gtk_adjustment_get_value (adjustment);
+ page_size = gtk_adjustment_get_page_size (adjustment);
+ old_size = gtk_slice_list_model_get_size (self->slice_model);
+
+ if (position < CALLS_HISTORY_RESET_SIZE_POSITION_THRESHOLD) {
+ if (old_size == CALLS_HISTORY_SIZE_INITIAL)
+ return;
+
+ g_debug ("Resetting to initial size: %u",
+ CALLS_HISTORY_SIZE_INITIAL);
+ gtk_slice_list_model_set_size (self->slice_model, CALLS_HISTORY_SIZE_INITIAL);
+ return;
+ }
+
+ upper_limit = gtk_adjustment_get_upper (adjustment);
+
+ if (position > upper_limit - CALLS_HISTORY_INCREASE_N_PAGES_THRESHOLD * page_size) {
+ guint new_size = old_size + CALLS_HISTORY_SIZE_INCREMENTS;
+
+ g_debug ("Increasing history slice from %u to %u",
+ old_size, new_size);
+ gtk_slice_list_model_set_size (self->slice_model, new_size);
+ }
+}
+
+
static void
set_property (GObject *object,
guint property_id,
@@ -152,7 +197,9 @@ constructed (GObject *object)
G_OBJECT_CLASS (calls_history_box_parent_class)->constructed (object);
- self->slice_model = gtk_slice_list_model_new (self->model, 0, 75);
+ self->slice_model = gtk_slice_list_model_new (self->model,
+ 0,
+ CALLS_HISTORY_SIZE_INITIAL);
self->model_changed_handler_id =
g_signal_connect_swapped
@@ -203,6 +250,7 @@ calls_history_box_class_init (CallsHistoryBoxClass *klass)
gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Calls/ui/history-box.ui");
gtk_widget_class_bind_template_child (widget_class, CallsHistoryBox, history);
+ gtk_widget_class_bind_template_child (widget_class, CallsHistoryBox, scrolled_window);
}
@@ -210,6 +258,13 @@ static void
calls_history_box_init (CallsHistoryBox *self)
{
gtk_widget_init_template (GTK_WIDGET (self));
+
+ self->scroll_adjustment = gtk_scrolled_window_get_vadjustment (self->scrolled_window);
+
+ g_signal_connect (self->scroll_adjustment,
+ "value-changed",
+ G_CALLBACK (on_adjustment_position_changed),
+ self);
}
diff --git a/src/ui/history-box.ui b/src/ui/history-box.ui
index ff22164..48671ff 100644
--- a/src/ui/history-box.ui
+++ b/src/ui/history-box.ui
@@ -15,7 +15,7 @@
-