# HG changeset patch # User bsmith@81767d24-ef19-dc11-ae90-00e081727c95 # Date 1299894620 0 # Node ID 86d76fc092370d292f348cc35181f3ca3a54dcf6 # Parent 79b38b1f33468eca6d9a5c7350ee8e4d6ec5d79a Added support for scrollbar line and page scrolling. Need to check the calculations... It may need to scroll minus the viewport length instead of the entire range. diff -r 79b38b1f3346 -r 86d76fc09237 mac/dw.m --- a/mac/dw.m Fri Mar 11 21:53:01 2011 +0000 +++ b/mac/dw.m Sat Mar 12 01:50:20 2011 +0000 @@ -699,7 +699,57 @@ -(float)range { return range; } -(float)visible { return visible; } -(void)setRange:(float)input1 andVisible:(float)input2 { range = input1; visible = input2; } --(void)scrollerChanged:(id)sender { int result = (int)([self doubleValue] * [self range]); _event_handler(self, (void *)result, 14); } +-(void)scrollerChanged:(id)sender +{ + double proportion = [self knobProportion]; + int result = (int)([self doubleValue] * range); + int newpos = result; + int page = (int)(proportion * range); + int max = (int)(range - page); + + switch ([sender hitPart]) + { + + case NSScrollerDecrementLine: + if(newpos > 0) + { + newpos--; + } + break; + + case NSScrollerIncrementLine: + if(newpos < range) + { + newpos++; + } + break; + + case NSScrollerDecrementPage: + newpos -= page; + if(newpos < 0) + { + newpos = 0; + } + break; + + case NSScrollerIncrementPage: + newpos += page; + if(newpos > range) + { + newpos = range; + } + break; + + default: + ; // do nothing + } + if(newpos != result) + { + double newposd = (double)newpos/range; + [self setDoubleValue:newposd]; + } + _event_handler(self, (void *)newpos, 14); +} -(void)dealloc { UserData *root = userdata; _remove_userdata(&root, NULL, TRUE); [super dealloc]; } @end