Mercurial > dwindows
comparison mac/dw.m @ 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 |
comparison
equal
deleted
inserted
replaced
932:ed10b5284f36 | 933:b19e6e55fc8e |
---|---|
1082 | 1082 |
1083 /* Subclass for a slider type */ | 1083 /* Subclass for a slider type */ |
1084 @interface DWScrollbar : NSScroller | 1084 @interface DWScrollbar : NSScroller |
1085 { | 1085 { |
1086 void *userdata; | 1086 void *userdata; |
1087 float range; | 1087 double range; |
1088 float visible; | 1088 double visible; |
1089 } | 1089 } |
1090 -(void *)userdata; | 1090 -(void *)userdata; |
1091 -(void)setUserdata:(void *)input; | 1091 -(void)setUserdata:(void *)input; |
1092 -(float)range; | 1092 -(float)range; |
1093 -(float)visible; | 1093 -(float)visible; |
1094 -(void)setRange:(float)input1 andVisible:(float)input2; | 1094 -(void)setRange:(double)input1 andVisible:(double)input2; |
1095 -(void)scrollerChanged:(id)sender; | 1095 -(void)scrollerChanged:(id)sender; |
1096 @end | 1096 @end |
1097 | 1097 |
1098 @implementation DWScrollbar | 1098 @implementation DWScrollbar |
1099 -(void *)userdata { return userdata; } | 1099 -(void *)userdata { return userdata; } |
1100 -(void)setUserdata:(void *)input { userdata = input; } | 1100 -(void)setUserdata:(void *)input { userdata = input; } |
1101 -(float)range { return range; } | 1101 -(float)range { return range; } |
1102 -(float)visible { return visible; } | 1102 -(float)visible { return visible; } |
1103 -(void)setRange:(float)input1 andVisible:(float)input2 { range = input1; visible = input2; } | 1103 -(void)setRange:(double)input1 andVisible:(double)input2 { range = input1; visible = input2; } |
1104 -(void)scrollerChanged:(id)sender | 1104 -(void)scrollerChanged:(id)sender |
1105 { | 1105 { |
1106 double proportion = [self knobProportion]; | 1106 double max = (range - visible); |
1107 double page = (proportion * range); | |
1108 double max = (range - page); | |
1109 double result = ([self doubleValue] * max); | 1107 double result = ([self doubleValue] * max); |
1110 double newpos = result; | 1108 double newpos = result; |
1111 | 1109 |
1112 switch ([sender hitPart]) | 1110 switch ([sender hitPart]) |
1113 { | 1111 { |
1114 | 1112 |
1115 case NSScrollerDecrementLine: | 1113 case NSScrollerDecrementLine: |
1116 if(newpos > 0) | 1114 if(newpos > 0) |
1125 newpos++; | 1123 newpos++; |
1126 } | 1124 } |
1127 break; | 1125 break; |
1128 | 1126 |
1129 case NSScrollerDecrementPage: | 1127 case NSScrollerDecrementPage: |
1130 newpos -= page; | 1128 newpos -= visible; |
1131 if(newpos < 0) | 1129 if(newpos < 0) |
1132 { | 1130 { |
1133 newpos = 0; | 1131 newpos = 0; |
1134 } | 1132 } |
1135 break; | 1133 break; |
1136 | 1134 |
1137 case NSScrollerIncrementPage: | 1135 case NSScrollerIncrementPage: |
1138 newpos += page; | 1136 newpos += visible; |
1139 if(newpos > max) | 1137 if(newpos > max) |
1140 { | 1138 { |
1141 newpos = max; | 1139 newpos = max; |
1142 } | 1140 } |
1143 break; | 1141 break; |
1144 | 1142 |
1145 default: | 1143 default: |
1146 ; /* do nothing */ | 1144 ; /* do nothing */ |
1147 } | 1145 } |
1146 int newposi = (int)newpos; | |
1147 newpos = (newpos - (double)newposi) > 0.5 ? (double)(newposi + 1) : (double)newposi; | |
1148 if(newpos != result) | 1148 if(newpos != result) |
1149 { | 1149 { |
1150 [self setDoubleValue:(newpos/max)]; | 1150 [self setDoubleValue:(newpos/max)]; |
1151 } | 1151 } |
1152 _event_handler(self, (void *)(int)newpos, 14); | 1152 _event_handler(self, (void *)(int)newpos, 14); |
3571 * position: Position of the scrollbar withing the range. | 3571 * position: Position of the scrollbar withing the range. |
3572 */ | 3572 */ |
3573 void API dw_scrollbar_set_pos(HWND handle, unsigned int position) | 3573 void API dw_scrollbar_set_pos(HWND handle, unsigned int position) |
3574 { | 3574 { |
3575 DWScrollbar *scrollbar = handle; | 3575 DWScrollbar *scrollbar = handle; |
3576 double range = (double)[scrollbar range]; | 3576 double range = [scrollbar range]; |
3577 double newpos = (double)position/range; | 3577 double visible = [scrollbar visible]; |
3578 double newpos = (double)position/(range-visible); | |
3578 [scrollbar setDoubleValue:newpos]; | 3579 [scrollbar setDoubleValue:newpos]; |
3579 } | 3580 } |
3580 | 3581 |
3581 /* | 3582 /* |
3582 * Sets the scrollbar range. | 3583 * Sets the scrollbar range. |
3586 * visible: Visible area relative to the range. | 3587 * visible: Visible area relative to the range. |
3587 */ | 3588 */ |
3588 void API dw_scrollbar_set_range(HWND handle, unsigned int range, unsigned int visible) | 3589 void API dw_scrollbar_set_range(HWND handle, unsigned int range, unsigned int visible) |
3589 { | 3590 { |
3590 DWScrollbar *scrollbar = handle; | 3591 DWScrollbar *scrollbar = handle; |
3591 float knob = (float)visible/(float)range; | 3592 double knob = (double)visible/(double)range; |
3592 [scrollbar setRange:(float)range andVisible:(float)visible]; | 3593 [scrollbar setRange:(double)range andVisible:(double)visible]; |
3593 [scrollbar setKnobProportion:knob]; | 3594 [scrollbar setKnobProportion:knob]; |
3594 } | 3595 } |
3595 | 3596 |
3596 /* | 3597 /* |
3597 * Create a new percent bar window (widget) to be packed. | 3598 * Create a new percent bar window (widget) to be packed. |