summaryrefslogtreecommitdiff
path: root/src/baobab-cross-fade-notebook.vala
diff options
context:
space:
mode:
Diffstat (limited to 'src/baobab-cross-fade-notebook.vala')
-rw-r--r--src/baobab-cross-fade-notebook.vala60
1 files changed, 60 insertions, 0 deletions
diff --git a/src/baobab-cross-fade-notebook.vala b/src/baobab-cross-fade-notebook.vala
new file mode 100644
index 0000000..c1f82c6
--- /dev/null
+++ b/src/baobab-cross-fade-notebook.vala
@@ -0,0 +1,60 @@
+/* -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+namespace Baobab {
+
+ public class CrossFadeNotebook : Gtk.Grid, Gtk.Buildable {
+
+ Gtk.Widget current_page = null;
+ GtkClutter.Embed embed;
+
+ construct {
+ embed = new GtkClutter.Embed ();
+ add (embed);
+ embed.show ();
+
+ vexpand = false;
+ hexpand = false;
+
+ GtkClutter.embed_set_use_layout_size (embed, true);
+ var stage = embed.get_stage ();
+ stage.set_layout_manager (new Clutter.BinLayout (Clutter.BinAlignment.FILL, Clutter.BinAlignment.FILL));
+ }
+
+ public void add_page (Gtk.Widget widget) {
+ var actor = new GtkClutter.Actor.with_contents (widget);
+ widget.set_data ("clutter_actor", actor);
+ embed.get_stage ().add_child (actor);
+
+ select_page (widget);
+ }
+
+ public void select_page (Gtk.Widget widget) {
+ if (current_page == widget) {
+ return;
+ }
+
+ if (current_page != null) {
+ var cur_actor = current_page.get_data<Clutter.Actor> ("clutter_actor");
+ cur_actor.reactive = false;
+ cur_actor.save_easing_state ();
+ cur_actor.set_easing_duration (500);
+ cur_actor.opacity = 0;
+ cur_actor.restore_easing_state ();
+ }
+
+ var actor = widget.get_data<Clutter.Actor> ("clutter_actor");
+ actor.reactive = true;
+ actor.save_easing_state ();
+ actor.set_easing_duration (500);
+ actor.opacity = 0xff;
+ actor.restore_easing_state ();
+
+ current_page = widget;
+ }
+
+ // GtkBuildable interface
+
+ public void add_child (Gtk.Builder builder, Object child, string? type) {
+ add_page (child as Gtk.Widget);
+ }
+ }
+}