changeset 933:b19e6e55fc8e

Rewrote the scrollbar handler with a more accurate method and fixed a bug setting the position on Mac.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Tue, 26 Apr 2011 03:23:05 +0000
parents ed10b5284f36
children 13384e89964c
files mac/dw.m
diffstat 1 files changed, 15 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/mac/dw.m	Mon Apr 25 20:42:56 2011 +0000
+++ b/mac/dw.m	Tue Apr 26 03:23:05 2011 +0000
@@ -1084,14 +1084,14 @@
 @interface DWScrollbar : NSScroller
 {
     void *userdata;
-    float range;
-    float visible;
+    double range;
+    double visible;
 }
 -(void *)userdata;
 -(void)setUserdata:(void *)input;
 -(float)range;
 -(float)visible;
--(void)setRange:(float)input1 andVisible:(float)input2;
+-(void)setRange:(double)input1 andVisible:(double)input2;
 -(void)scrollerChanged:(id)sender;
 @end
 
@@ -1100,15 +1100,13 @@
 -(void)setUserdata:(void *)input { userdata = input; }
 -(float)range { return range; }
 -(float)visible { return visible; }
--(void)setRange:(float)input1 andVisible:(float)input2 { range = input1; visible = input2; }
+-(void)setRange:(double)input1 andVisible:(double)input2 { range = input1; visible = input2; }
 -(void)scrollerChanged:(id)sender
 {
-    double proportion = [self knobProportion];
-    double page = (proportion * range);
-    double max = (range - page);
+    double max = (range - visible);
     double result = ([self doubleValue] * max);
     double newpos = result;
-
+    
     switch ([sender hitPart])
     {
 
@@ -1127,7 +1125,7 @@
             break;
 
         case NSScrollerDecrementPage:
-            newpos -= page;
+            newpos -= visible;
             if(newpos < 0)
             {
                 newpos = 0;
@@ -1135,7 +1133,7 @@
             break;
 
         case NSScrollerIncrementPage:
-            newpos += page;
+            newpos += visible;
             if(newpos > max)
             {
                 newpos = max;
@@ -1145,6 +1143,8 @@
         default:
             ; /* do nothing */
     }
+    int newposi = (int)newpos;
+    newpos = (newpos - (double)newposi) > 0.5 ? (double)(newposi + 1) : (double)newposi;
     if(newpos != result)
     {
         [self setDoubleValue:(newpos/max)];
@@ -3573,8 +3573,9 @@
 void API dw_scrollbar_set_pos(HWND handle, unsigned int position)
 {
     DWScrollbar *scrollbar = handle;
-    double range = (double)[scrollbar range];
-    double newpos = (double)position/range;
+    double range = [scrollbar range];
+    double visible = [scrollbar visible];
+    double newpos = (double)position/(range-visible);
     [scrollbar setDoubleValue:newpos];
 }
 
@@ -3588,8 +3589,8 @@
 void API dw_scrollbar_set_range(HWND handle, unsigned int range, unsigned int visible)
 {
     DWScrollbar *scrollbar = handle;
-    float knob = (float)visible/(float)range;
-    [scrollbar setRange:(float)range andVisible:(float)visible];
+    double knob = (double)visible/(double)range;
+    [scrollbar setRange:(double)range andVisible:(double)visible];
     [scrollbar setKnobProportion:knob];
 }