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.