windstille-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Windstille-devel] rev 353 - trunk/src


From: Ingo Ruhnke
Subject: [Windstille-devel] rev 353 - trunk/src
Date: Thu, 27 May 2004 14:44:27 +0200

Author: grumbel
Date: 2004-05-27 14:44:26 +0200 (Thu, 27 May 2004)
New Revision: 353

Modified:
   trunk/src/scrollbar.cxx
Log:
- added drag&drop to scrollbar

Modified: trunk/src/scrollbar.cxx
===================================================================
--- trunk/src/scrollbar.cxx     2004-05-27 12:04:43 UTC (rev 352)
+++ trunk/src/scrollbar.cxx     2004-05-27 12:44:26 UTC (rev 353)
@@ -18,6 +18,7 @@
 //  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
 #include <ClanLib/Display/display.h>
+#include <ClanLib/Display/keys.h>
 #include "scrollbar.hxx"
 
 class ScrollbarImpl
@@ -32,8 +33,16 @@
   float max;
   float pagesize;
   float pos;
+
+  float old_pos;
   
+  bool pressed;
+  CL_Point click_pos;
+  
   void draw();
+  void on_mouse_up(const CL_InputEvent& event);
+  void on_mouse_down(const CL_InputEvent& event);
+  void on_mouse_move(const CL_InputEvent& event);
 };
 
 Scrollbar::Scrollbar(const CL_Rect& rect, CL_Component* parent)
@@ -44,8 +53,13 @@
   impl->max = 100;
   impl->pagesize = 10;
   impl->pos  = 0;
+  impl->pressed = false;
 
   impl->slots.push_back(sig_paint().connect(impl.get(), &ScrollbarImpl::draw));
+
+  impl->slots.push_back(sig_mouse_down().connect(impl.get(), 
&ScrollbarImpl::on_mouse_down));
+  impl->slots.push_back(sig_mouse_up().connect(impl.get(), 
&ScrollbarImpl::on_mouse_up));
+  impl->slots.push_back(sig_mouse_move().connect(impl.get(), 
&ScrollbarImpl::on_mouse_move));
 }
   
 void
@@ -86,4 +100,44 @@
                         CL_Color(0, 0, 0));
 }
 
+void
+ScrollbarImpl::on_mouse_up(const CL_InputEvent& event)
+{
+  if (event.id == CL_MOUSE_LEFT)
+    {
+      pressed = false;
+      parent->release_mouse();
+    }
+}
+
+void
+ScrollbarImpl::on_mouse_down(const CL_InputEvent& event)
+{
+  if (event.id == CL_MOUSE_LEFT)
+    {
+      pressed   = true;
+      click_pos = event.mouse_pos;
+      
+      parent->capture_mouse();
+
+      float scale = parent->get_height()/(max - min);      
+      old_pos = pos * scale;
+
+      click_pos.x += parent->get_position().left;
+      click_pos.y += parent->get_position().top;
+    }
+}
+
+void
+ScrollbarImpl::on_mouse_move(const CL_InputEvent& event)
+{
+  if(pressed)
+    {
+      CL_Rect rect = parent->get_position();
+      
+      float scale = parent->get_height()/(max - min);
+      pos = (old_pos  - (click_pos.y - (rect.top  + event.mouse_pos.y)))/scale;
+    }
+}
+
 /* EOF */





reply via email to

[Prev in Thread] Current Thread [Next in Thread]