Mercurial > dwindows
changeset 707:86d76fc09237
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.
author | bsmith@81767d24-ef19-dc11-ae90-00e081727c95 |
---|---|
date | Sat, 12 Mar 2011 01:50:20 +0000 |
parents | 79b38b1f3346 |
children | 5fe2ca5ef88b |
files | mac/dw.m |
diffstat | 1 files changed, 51 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- 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