[gtkmm] Demos: Add Gestures demo



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]