[gtkmm] Demos: Add Gestures demo
- From: Kjell Ahlstedt <kjellahl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtkmm] Demos: Add Gestures demo
- Date: Wed, 2 Jul 2014 06:53:24 +0000 (UTC)
commit 8e2722a388eec38bc53552c086dbcdbf1aa68ab2
Author: Kjell Ahlstedt <kjell ahlstedt bredband net>
Date: Wed Jul 2 08:26:21 2014 +0200
Demos: Add Gestures demo
* demos/Makefile.am: Add example_gestures.cc.
* demos/gtk-demo/demos.h: Add Gestures demo.
* demos/gtk-demo/example_gestures.cc: New file.
This is gtk+/demos/gtk-demo/gestures.c, translated to C++.
demos/Makefile.am | 5 +-
demos/gtk-demo/demos.h | 5 +-
demos/gtk-demo/example_gestures.cc | 166 ++++++++++++++++++++++++++++++++++++
3 files changed, 169 insertions(+), 7 deletions(-)
---
diff --git a/demos/Makefile.am b/demos/Makefile.am
index ce7aa88..8944c23 100644
--- a/demos/Makefile.am
+++ b/demos/Makefile.am
@@ -34,6 +34,7 @@ gtk_demo_gtkmm_demo_SOURCES = \
gtk-demo/example_dialog.cc \
gtk-demo/example_drawingarea.cc \
gtk-demo/example_flowbox.cc \
+ gtk-demo/example_gestures.cc \
gtk-demo/example_headerbar.cc \
gtk-demo/example_icontheme.cc \
gtk-demo/example_iconview.cc \
@@ -51,10 +52,6 @@ gtk_demo_gtkmm_demo_SOURCES = \
gtk-demo/textwidget.cc \
gtk-demo/textwidget.h
-## These demos use deprecated API.
-## example_uimanager.cc should be replaced by a Gtk::Builder demo. \
-## gtk-demo/example_uimanager.cc \
-
dist_noinst_DATA = \
gtk-demo/alphatest.png \
gtk-demo/apple-red.png \
diff --git a/demos/gtk-demo/demos.h b/demos/gtk-demo/demos.h
index ada5a8e..7e96a4f 100644
--- a/demos/gtk-demo/demos.h
+++ b/demos/gtk-demo/demos.h
@@ -24,6 +24,7 @@ Gtk::Window* do_colorsel();
Gtk::Window* do_dialog();
Gtk::Window* do_drawingarea();
Gtk::Window* do_flowbox();
+Gtk::Window* do_gestures();
Gtk::Window* do_headerbar();
Gtk::Window* do_icontheme();
Gtk::Window* do_iconview();
@@ -33,7 +34,6 @@ Gtk::Window* do_overlay();
Gtk::Window* do_pixbufs();
Gtk::Window* do_panes();
Gtk::Window* do_sizegroup();
-//Gtk::Window* do_stock_browser();
Gtk::Window* do_textview();
Gtk::Window* do_treeview_editable_cells();
@@ -59,6 +59,7 @@ Demo testgtk_demos[] =
{ "Dialog and Message Boxes", "example_dialog.cc", sigc::ptr_fun(&do_dialog), 0 },
{ "Drawing Area", "example_drawingarea.cc", sigc::ptr_fun(&do_drawingarea), 0 },
{ "Flow Box", "example_flowbox.cc", sigc::ptr_fun(&do_flowbox), 0 },
+ { "Gestures", "example_gestures.cc", sigc::ptr_fun(&do_gestures), 0 },
{ "Header Bar", "example_headerbar.cc", sigc::ptr_fun(&do_headerbar), 0 },
{ "Icon Theme", "example_icontheme.cc", sigc::ptr_fun(&do_icontheme), 0 },
{ "Icon View", "example_iconview.cc", sigc::ptr_fun(&do_iconview), 0 },
@@ -68,10 +69,8 @@ Demo testgtk_demos[] =
{ "Paned Widgets", "example_panes.cc", sigc::ptr_fun(&do_panes), 0 },
{ "Pixbufs", "example_pixbufs.cc", sigc::ptr_fun(&do_pixbufs), 0 },
{ "Size Groups", "example_sizegroup.cc", sigc::ptr_fun(&do_sizegroup), 0 },
-// { "Stock Item and Icon Browser", "example_stockbrowser.cc", sigc::ptr_fun(&do_stock_browser), 0 },
{ "Text Widget", "example_textview.cc", sigc::ptr_fun(&do_textview), 0 },
{ "Tree View", "", type_slotDo(), child0 },
-// { "UI Manager", "example_uimanager.cc", sigc::ptr_fun(&do_ui_manager), 0},
{ 0, 0, type_slotDo(), 0 }
};
diff --git a/demos/gtk-demo/example_gestures.cc b/demos/gtk-demo/example_gestures.cc
new file mode 100644
index 0000000..a45b3d0
--- /dev/null
+++ b/demos/gtk-demo/example_gestures.cc
@@ -0,0 +1,166 @@
+/* Gestures
+ *
+ * Perform gestures on touchscreens and other input devices. This
+ * demo reacts to long presses and swipes from all devices, plus
+ * multi-touch rotate and zoom gestures from touchscreens.
+ */
+
+#include <gtkmm.h>
+
+class Example_Gestures : public Gtk::Window
+{
+public:
+ Example_Gestures();
+ virtual ~Example_Gestures();
+
+protected:
+
+ // Signal handlers:
+ bool on_drawing_area_draw(const ::Cairo::RefPtr< ::Cairo::Context>& cr);
+ void on_gesture_swipe_swipe(double velocity_x, double velocity_y);
+ void on_gesture_long_press_pressed(double x, double y);
+ void on_gesture_long_press_end(GdkEventSequence* sequence);
+ void on_gesture_rotate_angle_changed(double angle, double angle_delta);
+ void on_gesture_zoom_scale_changed(double scale);
+
+ // Child widget:
+ Gtk::DrawingArea m_DrawingArea;
+
+ // Gestures:
+ Glib::RefPtr<Gtk::GestureSwipe> m_GestureSwipe;
+ Glib::RefPtr<Gtk::GestureLongPress> m_GestureLongPress;
+ Glib::RefPtr<Gtk::GestureRotate> m_GestureRotate;
+ Glib::RefPtr<Gtk::GestureZoom> m_GestureZoom;
+
+ double m_swipe_x;
+ double m_swipe_y;
+ bool m_long_pressed;
+};
+
+
+Gtk::Window* do_gestures()
+{
+ return new Example_Gestures();
+}
+
+Example_Gestures::Example_Gestures()
+:
+ m_DrawingArea(),
+ m_swipe_x(0.0), m_swipe_y(0.0), m_long_pressed(false)
+{
+ set_title("Gestures demo");
+ set_default_size(400, 400);
+
+ add(m_DrawingArea);
+ m_DrawingArea.add_events(Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK |
+ Gdk::POINTER_MOTION_MASK | Gdk::TOUCH_MASK);
+ m_DrawingArea.signal_draw().connect(sigc::mem_fun(*this, &Example_Gestures::on_drawing_area_draw));
+
+ // Create gestures.
+ m_GestureSwipe = Gtk::GestureSwipe::create(m_DrawingArea);
+ m_GestureSwipe->set_propagation_phase(Gtk::PHASE_BUBBLE);
+ m_GestureSwipe->signal_swipe().connect(sigc::mem_fun(*this, &Example_Gestures::on_gesture_swipe_swipe));
+ m_GestureSwipe->set_touch_only(false);
+
+ m_GestureLongPress = Gtk::GestureLongPress::create(m_DrawingArea);
+ m_GestureLongPress->set_propagation_phase(Gtk::PHASE_BUBBLE);
+ m_GestureLongPress->signal_pressed().connect(sigc::mem_fun(*this,
&Example_Gestures::on_gesture_long_press_pressed));
+ m_GestureLongPress->signal_end().connect(sigc::mem_fun(*this,
&Example_Gestures::on_gesture_long_press_end));
+ m_GestureLongPress->set_touch_only(false);
+
+ m_GestureRotate = Gtk::GestureRotate::create(m_DrawingArea);
+ m_GestureRotate->set_propagation_phase(Gtk::PHASE_BUBBLE);
+ m_GestureRotate->signal_angle_changed().connect(sigc::mem_fun(*this,
&Example_Gestures::on_gesture_rotate_angle_changed));
+
+ m_GestureZoom = Gtk::GestureZoom::create(m_DrawingArea);
+ m_GestureZoom->set_propagation_phase(Gtk::PHASE_BUBBLE);
+ m_GestureZoom->signal_scale_changed().connect(sigc::mem_fun(*this,
&Example_Gestures::on_gesture_zoom_scale_changed));
+
+ show_all();
+}
+
+Example_Gestures::~Example_Gestures()
+{
+}
+
+bool Example_Gestures::on_drawing_area_draw(const ::Cairo::RefPtr< ::Cairo::Context>& cr)
+{
+ Gtk::Allocation allocation = m_DrawingArea.get_allocation();
+
+ // Coordinates for the center of the window
+ const int xc = allocation.get_width() / 2;
+ const int yc = allocation.get_height() / 2;
+
+ if (m_GestureRotate->is_recognized() || m_GestureZoom->is_recognized())
+ {
+ Cairo::Matrix matrix = Cairo::translation_matrix(xc, yc);
+ cr->save();
+
+ const double angle = m_GestureRotate->get_angle_delta();
+ matrix.rotate(angle);
+
+ const double scale = m_GestureZoom->get_scale_delta();
+ matrix.scale(scale, scale);
+
+ cr->set_matrix(matrix);
+ cr->rectangle(-100, -100, 200, 200);
+
+ ::Cairo::RefPtr<Cairo::LinearGradient> pattern = Cairo::LinearGradient::create(-100, 0, 200, 0);
+ pattern->add_color_stop_rgb(0, 0, 0, 1);
+ pattern->add_color_stop_rgb(1, 1, 0, 0);
+ cr->set_source(pattern);
+ cr->fill();
+ cr->restore();
+ }
+
+ if (m_swipe_x != 0.0 || m_swipe_y != 0.0)
+ {
+ cr->save();
+ cr->set_line_width(6);
+ cr->move_to(xc, yc);
+ cr->rel_line_to(m_swipe_x, m_swipe_y);
+ cr->set_source_rgba(1.0, 0.0, 0.0, 0.5);
+ cr->stroke();
+ cr->restore();
+ }
+
+ if (m_long_pressed)
+ {
+ cr->save();
+ cr->arc(xc, yc, 50, 0, 2 * G_PI);
+ cr->set_source_rgba(0.0, 1.0, 0.0, 0.5);
+ cr->stroke();
+ cr->restore();
+ }
+
+ return true;
+}
+
+void Example_Gestures::on_gesture_swipe_swipe(double velocity_x, double velocity_y)
+{
+ m_swipe_x = 0.2 * velocity_x;
+ m_swipe_y = 0.2 * velocity_y;
+ m_DrawingArea.queue_draw();
+}
+
+void Example_Gestures::on_gesture_long_press_pressed(double /* x */, double /* y */)
+{
+ m_long_pressed = true;
+ m_DrawingArea.queue_draw();
+}
+
+void Example_Gestures::on_gesture_long_press_end(GdkEventSequence* /* sequence */)
+{
+ m_long_pressed = false;
+ m_DrawingArea.queue_draw();
+}
+
+void Example_Gestures::on_gesture_rotate_angle_changed(double /* angle */, double /* angle_delta */)
+{
+ m_DrawingArea.queue_draw();
+}
+
+void Example_Gestures::on_gesture_zoom_scale_changed(double /* scale */)
+{
+ m_DrawingArea.queue_draw();
+}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]