bsnes/phoenix/cocoa/widget/vertical-scroller.cpp

92 lines
2.0 KiB
C++

@implementation CocoaVerticalScroller : NSScroller
-(id) initWith:(phoenix::VerticalScroller&)verticalScrollerReference {
if(self = [super initWithFrame:NSMakeRect(0, 0, 0, 1)]) {
verticalScroller = &verticalScrollerReference;
[self setTarget:self];
[self setAction:@selector(scroll:)];
[self setControlSize:NSRegularControlSize];
[self setScrollerStyle:NSScrollerStyleLegacy];
[self setEnabled:YES];
[self update];
}
return self;
}
-(void) update {
double d = 1.0 / verticalScroller->state.length;
double f = d * verticalScroller->state.position;
[self setDoubleValue:f];
[self setKnobProportion:d];
}
-(IBAction) scroll:(id)sender {
auto& state = verticalScroller->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;
}
if(verticalScroller->onChange) verticalScroller->onChange();
}
@end
namespace phoenix {
Size pVerticalScroller::minimumSize() {
@autoreleasepool {
return {[NSScroller scrollerWidthForControlSize:NSRegularControlSize scrollerStyle:NSScrollerStyleLegacy], 32};
}
}
unsigned pVerticalScroller::position() {
@autoreleasepool {
return [cocoaView doubleValue] * verticalScroller.state.length;
}
}
void pVerticalScroller::setLength(unsigned length) {
@autoreleasepool {
[cocoaView update];
}
}
void pVerticalScroller::setPosition(unsigned position) {
@autoreleasepool {
[cocoaView update];
}
}
void pVerticalScroller::constructor() {
@autoreleasepool {
cocoaView = cocoaVerticalScroller = [[CocoaVerticalScroller alloc] initWith:verticalScroller];
}
}
void pVerticalScroller::destructor() {
@autoreleasepool {
[cocoaView release];
}
}
}