1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
|
#if defined(Hiro_VerticalScrollBar)
@implementation CocoaVerticalScrollBar : NSScroller
-(id) initWith:(hiro::mVerticalScrollBar&)verticalScrollBarReference {
if(self = [super initWithFrame:NSMakeRect(0, 0, 0, 1)]) {
verticalScrollBar = &verticalScrollBarReference;
[self setTarget:self];
[self setAction:@selector(scroll:)];
[self setControlSize:NSRegularControlSize];
[self setScrollerStyle:NSScrollerStyleLegacy];
[self setEnabled:YES];
[self update];
}
return self;
}
-(void) update {
f64 d = 1.0 / verticalScrollBar->state.length;
f64 f = d * verticalScrollBar->state.position;
[self setDoubleValue:f];
[self setKnobProportion:d];
}
-(IBAction) scroll:(id)sender {
auto& state = verticalScrollBar->state;
switch([self hitPart]) {
case NSScrollerIncrementLine:
case NSScrollerIncrementPage:
if(state.position < state.length - 1) state.position++;
[self update];
break;
case NSScrollerDecrementLine:
case NSScrollerDecrementPage:
if(state.position) state.position--;
[self update];
break;
case NSScrollerKnob:
state.position = [self doubleValue] * state.length;
break;
}
verticalScrollBar->doChange();
}
@end
namespace hiro {
auto pVerticalScrollBar::construct() -> void {
cocoaView = cocoaVerticalScrollBar = [[CocoaVerticalScrollBar alloc] initWith:self()];
pWidget::construct();
setLength(state().length);
setPosition(state().position);
}
auto pVerticalScrollBar::destruct() -> void {
[cocoaView removeFromSuperview];
}
auto pVerticalScrollBar::minimumSize() const -> Size {
return {(s32)[NSScroller scrollerWidthForControlSize:NSRegularControlSize scrollerStyle:NSScrollerStyleLegacy], 32};
}
auto pVerticalScrollBar::setLength(u32 length) -> void {
[(CocoaVerticalScrollBar*)cocoaView update];
}
auto pVerticalScrollBar::setPosition(u32 position) -> void {
[(CocoaVerticalScrollBar*)cocoaView update];
}
}
#endif
|