foxygit / doom Log in
commit bc087b49e2e5a9c00b5b1620b4bd289ebee5ee73
Author:     Simon Howard <fraggle@gmail.com>
AuthorDate: Tue Mar 22 21:08:04 2011 +0000
Commit:     Simon Howard <fraggle@gmail.com>
CommitDate: Tue Mar 22 21:08:04 2011 +0000

    Fix scrollbars so that clicks scroll the pane to a location that matches
    the clicked location. Interpret mousewheel events so that scroll panes
    can be scrolled.

    Subversion-branch: /trunk/chocolate-doom
    Subversion-revision: 2307
---
 textscreen/txt_main.h       | 10 ++++++----
 textscreen/txt_scrollpane.c | 36 ++++++++++++++++++++++++++++++++----
 2 files changed, 38 insertions(+), 8 deletions(-)

diff --git a/textscreen/txt_main.h b/textscreen/txt_main.h
index add30fa3..601548e5 100644
--- a/textscreen/txt_main.h
+++ b/textscreen/txt_main.h
@@ -34,10 +34,12 @@

 // Special keypress values that correspond to mouse button clicks

-#define TXT_MOUSE_BASE   0x10000
-#define TXT_MOUSE_LEFT   (TXT_MOUSE_BASE + 0)
-#define TXT_MOUSE_RIGHT  (TXT_MOUSE_BASE + 1)
-#define TXT_MOUSE_MIDDLE (TXT_MOUSE_BASE + 2)
+#define TXT_MOUSE_BASE         0x10000
+#define TXT_MOUSE_LEFT         (TXT_MOUSE_BASE + 0)
+#define TXT_MOUSE_RIGHT        (TXT_MOUSE_BASE + 1)
+#define TXT_MOUSE_MIDDLE       (TXT_MOUSE_BASE + 2)
+#define TXT_MOUSE_SCROLLUP     (TXT_MOUSE_BASE + 3)
+#define TXT_MOUSE_SCROLLDOWN   (TXT_MOUSE_BASE + 4)
 #define TXT_MAX_MOUSE_BUTTONS  16

 // Screen size
diff --git a/textscreen/txt_scrollpane.c b/textscreen/txt_scrollpane.c
index 17c9bcbf..903c7910 100644
--- a/textscreen/txt_scrollpane.c
+++ b/textscreen/txt_scrollpane.c
@@ -416,6 +416,33 @@ static void TXT_ScrollPaneMousePress(TXT_UNCAST_ARG(scrollpane),

     scrollbars = NeedsScrollbars(scrollpane);

+    if (b == TXT_MOUSE_SCROLLUP)
+    {
+        if (scrollbars & SCROLLBAR_VERTICAL)
+        {
+            --scrollpane->y;
+        }
+        else if (scrollbars & SCROLLBAR_HORIZONTAL)
+        {
+            --scrollpane->x;
+        }
+
+        return;
+    }
+    else if (b == TXT_MOUSE_SCROLLDOWN)
+    {
+        if (scrollbars & SCROLLBAR_VERTICAL)
+        {
+            ++scrollpane->y;
+        }
+        else if (scrollbars & SCROLLBAR_HORIZONTAL)
+        {
+            ++scrollpane->x;
+        }
+
+        return;
+    }
+
     rel_x = x - scrollpane->widget.x;
     rel_y = y - scrollpane->widget.y;

@@ -433,14 +460,15 @@ static void TXT_ScrollPaneMousePress(TXT_UNCAST_ARG(scrollpane),
         else
         {
             int range = FullWidth(scrollpane) - scrollpane->w;
+            int bar_max = scrollpane->w - 3;

-            scrollpane->x = ((rel_x - 1) * range) / (scrollpane->w - 3);
+            scrollpane->x = ((rel_x - 1) * range + (bar_max / 2)) / bar_max;
         }

         return;
     }

-    // Click on the horizontal scrollbar?
+    // Click on the vertical scrollbar?
     if ((scrollbars & SCROLLBAR_VERTICAL) && rel_x == scrollpane->w)
     {
         if (rel_y == 0)
@@ -454,8 +482,9 @@ static void TXT_ScrollPaneMousePress(TXT_UNCAST_ARG(scrollpane),
         else
         {
             int range = FullHeight(scrollpane) - scrollpane->h;
+            int bar_max = scrollpane->h - 3;

-            scrollpane->y = ((rel_y - 1) * range) / (scrollpane->h - 3);
+            scrollpane->y = ((rel_y - 1) * range + (bar_max / 2)) / bar_max;
         }

         return;
@@ -465,7 +494,6 @@ static void TXT_ScrollPaneMousePress(TXT_UNCAST_ARG(scrollpane),
     {
         TXT_WidgetMousePress(scrollpane->child, x, y, b);
     }
-
 }

 static void TXT_ScrollPaneLayout(TXT_UNCAST_ARG(scrollpane))