forked from AuroraMiddleware/gtk
d732c869c2
Add the names of the main widgets as keywords to our demos, but also things like "game". This helps finding relevant demos in our growing list. You can now for example type "label", and find the "error states" and "links" demos showing GtkLabel features.
288 lines
7.4 KiB
C
288 lines
7.4 KiB
C
/* Benchmark/Scrolling
|
|
* #Keywords: GtkScrolledWindow
|
|
*
|
|
* This demo scrolls a view with various content.
|
|
*/
|
|
|
|
#include <gtk/gtk.h>
|
|
|
|
static guint tick_cb;
|
|
static GtkAdjustment *hadjustment;
|
|
static GtkAdjustment *vadjustment;
|
|
static GtkWidget *window = NULL;
|
|
static GtkWidget *scrolledwindow;
|
|
static int selected;
|
|
|
|
#define N_WIDGET_TYPES 6
|
|
|
|
|
|
static int hincrement = 5;
|
|
static int vincrement = 5;
|
|
|
|
static gboolean
|
|
scroll_cb (GtkWidget *widget,
|
|
GdkFrameClock *frame_clock,
|
|
gpointer data)
|
|
{
|
|
double value;
|
|
|
|
value = gtk_adjustment_get_value (vadjustment);
|
|
if (value + vincrement <= gtk_adjustment_get_lower (vadjustment) ||
|
|
(value + vincrement >= gtk_adjustment_get_upper (vadjustment) - gtk_adjustment_get_page_size (vadjustment)))
|
|
vincrement = - vincrement;
|
|
|
|
gtk_adjustment_set_value (vadjustment, value + vincrement);
|
|
|
|
value = gtk_adjustment_get_value (hadjustment);
|
|
if (value + hincrement <= gtk_adjustment_get_lower (hadjustment) ||
|
|
(value + hincrement >= gtk_adjustment_get_upper (hadjustment) - gtk_adjustment_get_page_size (hadjustment)))
|
|
hincrement = - hincrement;
|
|
|
|
gtk_adjustment_set_value (hadjustment, value + hincrement);
|
|
|
|
return G_SOURCE_CONTINUE;
|
|
}
|
|
|
|
extern GtkWidget *create_icon (void);
|
|
|
|
static void
|
|
populate_icons (void)
|
|
{
|
|
GtkWidget *grid;
|
|
int top, left;
|
|
|
|
grid = gtk_grid_new ();
|
|
gtk_widget_set_halign (grid, GTK_ALIGN_CENTER);
|
|
gtk_widget_set_margin_start (grid, 10);
|
|
gtk_widget_set_margin_end (grid, 10);
|
|
gtk_widget_set_margin_top (grid, 10);
|
|
gtk_widget_set_margin_bottom (grid, 10);
|
|
gtk_grid_set_row_spacing (GTK_GRID (grid), 10);
|
|
gtk_grid_set_column_spacing (GTK_GRID (grid), 10);
|
|
|
|
for (top = 0; top < 100; top++)
|
|
for (left = 0; left < 15; left++)
|
|
gtk_grid_attach (GTK_GRID (grid), create_icon (), left, top, 1, 1);
|
|
|
|
hincrement = 0;
|
|
vincrement = 5;
|
|
|
|
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow),
|
|
GTK_POLICY_NEVER,
|
|
GTK_POLICY_AUTOMATIC);
|
|
gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (scrolledwindow), grid);
|
|
}
|
|
|
|
static char *content;
|
|
static gsize content_len;
|
|
|
|
extern void fontify (const char *format, GtkTextBuffer *buffer);
|
|
|
|
static void
|
|
populate_text (gboolean highlight)
|
|
{
|
|
GtkWidget *textview;
|
|
GtkTextBuffer *buffer;
|
|
|
|
if (!content)
|
|
{
|
|
GBytes *bytes;
|
|
|
|
bytes = g_resources_lookup_data ("/sources/font_features.c", 0, NULL);
|
|
content = g_bytes_unref_to_data (bytes, &content_len);
|
|
}
|
|
|
|
buffer = gtk_text_buffer_new (NULL);
|
|
gtk_text_buffer_set_text (buffer, content, (int)content_len);
|
|
|
|
if (highlight)
|
|
fontify ("c", buffer);
|
|
|
|
textview = gtk_text_view_new ();
|
|
gtk_text_view_set_buffer (GTK_TEXT_VIEW (textview), buffer);
|
|
|
|
hincrement = 0;
|
|
vincrement = 5;
|
|
|
|
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow),
|
|
GTK_POLICY_NEVER,
|
|
GTK_POLICY_AUTOMATIC);
|
|
gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (scrolledwindow), textview);
|
|
}
|
|
|
|
static void
|
|
populate_image (void)
|
|
{
|
|
GtkWidget *image;
|
|
|
|
if (!content)
|
|
{
|
|
GBytes *bytes;
|
|
|
|
bytes = g_resources_lookup_data ("/sources/font_features.c", 0, NULL);
|
|
content = g_bytes_unref_to_data (bytes, &content_len);
|
|
}
|
|
|
|
image = gtk_picture_new_for_resource ("/sliding_puzzle/portland-rose.jpg");
|
|
gtk_picture_set_can_shrink (GTK_PICTURE (image), FALSE);
|
|
|
|
hincrement = 5;
|
|
vincrement = 5;
|
|
|
|
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow),
|
|
GTK_POLICY_AUTOMATIC,
|
|
GTK_POLICY_AUTOMATIC);
|
|
gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (scrolledwindow), image);
|
|
}
|
|
|
|
extern GtkWidget *create_weather_view (void);
|
|
|
|
static void
|
|
populate_list (void)
|
|
{
|
|
GtkWidget *list;
|
|
|
|
list = create_weather_view ();
|
|
|
|
hincrement = 5;
|
|
vincrement = 0;
|
|
|
|
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow),
|
|
GTK_POLICY_AUTOMATIC,
|
|
GTK_POLICY_AUTOMATIC);
|
|
gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (scrolledwindow), list);
|
|
}
|
|
|
|
extern GtkWidget *create_color_grid (void);
|
|
extern GListModel *gtk_color_list_new (guint size);
|
|
|
|
static void
|
|
populate_grid (void)
|
|
{
|
|
GtkWidget *list;
|
|
GtkNoSelection *selection;
|
|
|
|
list = create_color_grid ();
|
|
|
|
selection = gtk_no_selection_new (gtk_color_list_new (2097152));
|
|
gtk_grid_view_set_model (GTK_GRID_VIEW (list), GTK_SELECTION_MODEL (selection));
|
|
g_object_unref (selection);
|
|
|
|
hincrement = 0;
|
|
vincrement = 5;
|
|
|
|
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow),
|
|
GTK_POLICY_AUTOMATIC,
|
|
GTK_POLICY_AUTOMATIC);
|
|
gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (scrolledwindow), list);
|
|
}
|
|
|
|
static void
|
|
set_widget_type (int type)
|
|
{
|
|
if (tick_cb)
|
|
gtk_widget_remove_tick_callback (window, tick_cb);
|
|
|
|
if (gtk_scrolled_window_get_child (GTK_SCROLLED_WINDOW (scrolledwindow)))
|
|
gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (scrolledwindow), NULL);
|
|
|
|
selected = type;
|
|
|
|
switch (selected)
|
|
{
|
|
case 0:
|
|
gtk_window_set_title (GTK_WINDOW (window), "Scrolling icons");
|
|
populate_icons ();
|
|
break;
|
|
|
|
case 1:
|
|
gtk_window_set_title (GTK_WINDOW (window), "Scrolling plain text");
|
|
populate_text (FALSE);
|
|
break;
|
|
|
|
case 2:
|
|
gtk_window_set_title (GTK_WINDOW (window), "Scrolling complex text");
|
|
populate_text (TRUE);
|
|
break;
|
|
|
|
case 3:
|
|
gtk_window_set_title (GTK_WINDOW (window), "Scrolling a big image");
|
|
populate_image ();
|
|
break;
|
|
|
|
case 4:
|
|
gtk_window_set_title (GTK_WINDOW (window), "Scrolling a list");
|
|
populate_list ();
|
|
break;
|
|
|
|
case 5:
|
|
gtk_window_set_title (GTK_WINDOW (window), "Scrolling a grid");
|
|
populate_grid ();
|
|
break;
|
|
|
|
default:
|
|
g_assert_not_reached ();
|
|
}
|
|
|
|
tick_cb = gtk_widget_add_tick_callback (window, scroll_cb, NULL, NULL);
|
|
}
|
|
|
|
G_MODULE_EXPORT void
|
|
iconscroll_next_clicked_cb (GtkButton *source,
|
|
gpointer user_data)
|
|
{
|
|
int new_index;
|
|
|
|
if (selected + 1 >= N_WIDGET_TYPES)
|
|
new_index = 0;
|
|
else
|
|
new_index = selected + 1;
|
|
|
|
|
|
set_widget_type (new_index);
|
|
}
|
|
|
|
G_MODULE_EXPORT void
|
|
iconscroll_prev_clicked_cb (GtkButton *source,
|
|
gpointer user_data)
|
|
{
|
|
int new_index;
|
|
|
|
if (selected - 1 < 0)
|
|
new_index = N_WIDGET_TYPES - 1;
|
|
else
|
|
new_index = selected - 1;
|
|
|
|
set_widget_type (new_index);
|
|
}
|
|
|
|
G_MODULE_EXPORT GtkWidget *
|
|
do_iconscroll (GtkWidget *do_widget)
|
|
{
|
|
if (!window)
|
|
{
|
|
GtkBuilder *builder;
|
|
|
|
builder = gtk_builder_new_from_resource ("/iconscroll/iconscroll.ui");
|
|
window = GTK_WIDGET (gtk_builder_get_object (builder, "window"));
|
|
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
|
|
gtk_window_set_display (GTK_WINDOW (window),
|
|
gtk_widget_get_display (do_widget));
|
|
|
|
scrolledwindow = GTK_WIDGET (gtk_builder_get_object (builder, "scrolledwindow"));
|
|
gtk_widget_realize (window);
|
|
hadjustment = GTK_ADJUSTMENT (gtk_builder_get_object (builder, "hadjustment"));
|
|
vadjustment = GTK_ADJUSTMENT (gtk_builder_get_object (builder, "vadjustment"));
|
|
set_widget_type (0);
|
|
|
|
g_object_unref (builder);
|
|
}
|
|
|
|
if (!gtk_widget_get_visible (window))
|
|
gtk_widget_show (window);
|
|
else
|
|
gtk_window_destroy (GTK_WINDOW (window));
|
|
|
|
return window;
|
|
}
|