[gtk/matthiasc/for-master] widget-factory: Ensure we have some backgrounds
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/matthiasc/for-master] widget-factory: Ensure we have some backgrounds
- Date: Thu, 14 May 2020 04:29:01 +0000 (UTC)
commit 102e7d0838cd70e06c4211457f47a5c8062aff9e
Author: Matthias Clasen <mclasen redhat com>
Date: Wed May 13 23:25:58 2020 -0400
widget-factory: Ensure we have some backgrounds
The flowbox demo is otherwise less than useful,
if /usr/share/gnome/backgrounds isn't present.
At the same time, give the scale in the listbox
some function.
demos/widget-factory/portland-rose.jpg | Bin 0 -> 469879 bytes
demos/widget-factory/snowy.jpg | Bin 0 -> 3010078 bytes
demos/widget-factory/sunset.jpg | Bin 0 -> 2112092 bytes
demos/widget-factory/widget-factory.c | 82 ++++++++++++++++++----
demos/widget-factory/widget-factory.gresource.xml | 3 +
demos/widget-factory/widget-factory.ui | 4 +-
6 files changed, 74 insertions(+), 15 deletions(-)
---
diff --git a/demos/widget-factory/portland-rose.jpg b/demos/widget-factory/portland-rose.jpg
new file mode 100644
index 0000000000..89974da6c7
Binary files /dev/null and b/demos/widget-factory/portland-rose.jpg differ
diff --git a/demos/widget-factory/snowy.jpg b/demos/widget-factory/snowy.jpg
new file mode 100644
index 0000000000..cd45b03b1a
Binary files /dev/null and b/demos/widget-factory/snowy.jpg differ
diff --git a/demos/widget-factory/sunset.jpg b/demos/widget-factory/sunset.jpg
new file mode 100644
index 0000000000..cc25599bae
Binary files /dev/null and b/demos/widget-factory/sunset.jpg differ
diff --git a/demos/widget-factory/widget-factory.c b/demos/widget-factory/widget-factory.c
index 34a594438e..493ae60af9 100644
--- a/demos/widget-factory/widget-factory.c
+++ b/demos/widget-factory/widget-factory.c
@@ -1082,13 +1082,29 @@ typedef struct {
gchar *filename;
} BackgroundData;
+static void
+add_background (GtkWidget *flowbox,
+ const char *filename,
+ GdkPixbuf *pixbuf,
+ gboolean is_resource)
+{
+ GtkWidget *child;
+
+ child = gtk_picture_new_for_pixbuf (pixbuf);
+ gtk_widget_set_size_request (child, 110, 70);
+ gtk_flow_box_insert (GTK_FLOW_BOX (flowbox), child, -1);
+ child = gtk_widget_get_parent (child);
+ g_object_set_data_full (G_OBJECT (child), "filename", g_strdup (filename), g_free);
+ if (is_resource)
+ g_object_set_data (G_OBJECT (child), "is-resource", GINT_TO_POINTER (1));
+}
+
static void
background_loaded_cb (GObject *source,
GAsyncResult *res,
gpointer data)
{
BackgroundData *bd = data;
- GtkWidget *child;
GdkPixbuf *pixbuf;
GError *error = NULL;
@@ -1100,11 +1116,9 @@ background_loaded_cb (GObject *source,
return;
}
- child = gtk_picture_new_for_pixbuf (pixbuf);
- gtk_widget_set_size_request (child, 110, 70);
- gtk_flow_box_insert (GTK_FLOW_BOX (bd->flowbox), child, -1);
- child = gtk_widget_get_parent (child);
- g_object_set_data_full (G_OBJECT (child), "filename", bd->filename, g_free);
+ add_background (bd->flowbox, bd->filename, pixbuf, FALSE);
+
+ g_free (bd->filename);
g_free (bd);
}
@@ -1121,6 +1135,10 @@ populate_flowbox (GtkWidget *flowbox)
BackgroundData *bd;
GdkPixbuf *pixbuf;
GtkWidget *child;
+ int i;
+ const char *resources[] = {
+ "sunset.jpg", "snowy.jpg", "portland-rose.jpg"
+ };
if (GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (flowbox), "populated")))
return;
@@ -1132,6 +1150,13 @@ populate_flowbox (GtkWidget *flowbox)
child = gtk_picture_new_for_pixbuf (pixbuf);
gtk_flow_box_insert (GTK_FLOW_BOX (flowbox), child, -1);
+ for (i = 0; i < G_N_ELEMENTS (resources); i++)
+ {
+ filename = g_strconcat ("/org/gtk/WidgetFactory4/", resources[i], NULL);
+ pixbuf = gdk_pixbuf_new_from_resource_at_scale (filename, 110, 110, TRUE, NULL);
+ add_background (flowbox, filename, pixbuf, TRUE);
+ }
+
location = "/usr/share/backgrounds/gnome";
dir = g_dir_open (location, 0, &error);
if (error)
@@ -1153,7 +1178,7 @@ populate_flowbox (GtkWidget *flowbox)
{
g_warning ("%s", error->message);
g_clear_error (&error);
- g_free (filename);
+ g_free (filename);
}
else
{
@@ -1169,6 +1194,7 @@ populate_flowbox (GtkWidget *flowbox)
}
g_dir_close (dir);
+
}
static void
@@ -1197,6 +1223,7 @@ typedef struct
{
GtkTextView tv;
GdkTexture *texture;
+ GtkAdjustment *adjustment;
} MyTextView;
typedef GtkTextViewClass MyTextViewClass;
@@ -1215,10 +1242,16 @@ my_tv_snapshot_layer (GtkTextView *widget,
GtkSnapshot *snapshot)
{
MyTextView *tv = (MyTextView *)widget;
+ double opacity;
+ double scale;
+
+ opacity = gtk_adjustment_get_value (tv->adjustment) / 100.0;
if (layer == GTK_TEXT_VIEW_LAYER_BELOW_TEXT && tv->texture)
{
- gtk_snapshot_push_opacity (snapshot, 0.333);
+ scale = gtk_widget_get_width (GTK_WIDGET (widget)) / (double)gdk_texture_get_width (tv->texture);
+ gtk_snapshot_push_opacity (snapshot, opacity);
+ gtk_snapshot_scale (snapshot, scale, scale);
gtk_snapshot_append_texture (snapshot,
tv->texture,
&GRAPHENE_RECT_INIT(
@@ -1226,6 +1259,7 @@ my_tv_snapshot_layer (GtkTextView *widget,
gdk_texture_get_width (tv->texture),
gdk_texture_get_height (tv->texture)
));
+ gtk_snapshot_scale (snapshot, 1/scale, 1/scale);
gtk_snapshot_pop (snapshot);
}
}
@@ -1251,7 +1285,7 @@ my_text_view_class_init (MyTextViewClass *class)
}
static void
-my_text_view_set_background (MyTextView *tv, const gchar *filename)
+my_text_view_set_background (MyTextView *tv, const gchar *filename, gboolean is_resource)
{
GError *error = NULL;
GFile *file;
@@ -1261,9 +1295,14 @@ my_text_view_set_background (MyTextView *tv, const gchar *filename)
if (filename == NULL)
return;
- file = g_file_new_for_path (filename);
- tv->texture = gdk_texture_new_from_file (file, &error);
- g_object_unref (file);
+ if (is_resource)
+ tv->texture = gdk_texture_new_from_resource (filename);
+ else
+ {
+ file = g_file_new_for_path (filename);
+ tv->texture = gdk_texture_new_from_file (file, &error);
+ g_object_unref (file);
+ }
if (error)
{
@@ -1275,6 +1314,19 @@ my_text_view_set_background (MyTextView *tv, const gchar *filename)
gtk_widget_queue_draw (GTK_WIDGET (tv));
}
+static void
+value_changed (GtkAdjustment *adjustment, MyTextView *tv)
+{
+ gtk_widget_queue_draw (GTK_WIDGET (tv));
+}
+
+static void
+my_text_view_set_adjustment (MyTextView *tv, GtkAdjustment *adjustment)
+{
+ g_set_object (&tv->adjustment, adjustment);
+ g_signal_connect (tv->adjustment, "value-changed", G_CALLBACK (value_changed), tv);
+}
+
static void
close_selection_dialog (GtkWidget *dialog, gint response, GtkWidget *tv)
{
@@ -1282,6 +1334,7 @@ close_selection_dialog (GtkWidget *dialog, gint response, GtkWidget *tv)
GtkWidget *child;
GList *children;
const gchar *filename;
+ gboolean is_resource;
gtk_widget_hide (dialog);
@@ -1297,10 +1350,11 @@ close_selection_dialog (GtkWidget *dialog, gint response, GtkWidget *tv)
child = children->data;
filename = (const gchar *)g_object_get_data (G_OBJECT (child), "filename");
+ is_resource = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (child), "is-resource"));
g_list_free (children);
- my_text_view_set_background ((MyTextView *)tv, filename);
+ my_text_view_set_background ((MyTextView *)tv, filename, is_resource);
}
static void
@@ -1985,6 +2039,8 @@ activate (GApplication *app)
g_object_set_data (G_OBJECT (window), "selection_dialog", dialog);
widget = (GtkWidget *)gtk_builder_get_object (builder, "text3");
g_signal_connect (dialog, "response", G_CALLBACK (close_selection_dialog), widget);
+ widget2 = (GtkWidget *)gtk_builder_get_object (builder, "opacity");
+ my_text_view_set_adjustment ((MyTextView *)widget, gtk_range_get_adjustment (GTK_RANGE (widget2)));
widget = (GtkWidget *)gtk_builder_get_object (builder, "selection_dialog_button");
g_signal_connect (widget, "clicked", G_CALLBACK (show_dialog), dialog);
diff --git a/demos/widget-factory/widget-factory.gresource.xml
b/demos/widget-factory/widget-factory.gresource.xml
index 3a5c2e9c29..660fd69f7a 100644
--- a/demos/widget-factory/widget-factory.gresource.xml
+++ b/demos/widget-factory/widget-factory.gresource.xml
@@ -37,5 +37,8 @@
</gresource>
<gresource prefix="/org/gtk/WidgetFactory4">
<file>gtk-logo.webm</file>
+ <file>sunset.jpg</file>
+ <file>snowy.jpg</file>
+ <file>portland-rose.jpg</file>
</gresource>
</gresources>
diff --git a/demos/widget-factory/widget-factory.ui b/demos/widget-factory/widget-factory.ui
index 09c3aa5676..7523595c4b 100644
--- a/demos/widget-factory/widget-factory.ui
+++ b/demos/widget-factory/widget-factory.ui
@@ -129,7 +129,7 @@
</menu>
<object class="GtkAdjustment" id="adjustment1">
<property name="upper">100</property>
- <property name="lower">1</property>
+ <property name="lower">0</property>
<property name="value">50</property>
<property name="step-increment">1</property>
<property name="page-increment">10</property>
@@ -1709,7 +1709,7 @@ microphone-sensitivity-medium-symbolic</property>
</object>
</child>
<child>
- <object class="GtkScale">
+ <object class="GtkScale" id="opacity">
<property name="halign">end</property>
<property name="valign">center</property>
<property name="margin-top">6</property>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]