mirror of https://github.com/bsnes-emu/bsnes.git
92 lines
2.0 KiB
C++
92 lines
2.0 KiB
C++
|
@implementation CocoaHorizontalScroller : NSScroller
|
||
|
|
||
|
-(id) initWith :(phoenix::HorizontalScroller&)horizontalScrollerReference {
|
||
|
if(self = [super initWithFrame:NSMakeRect(0, 0, 1, 0)]) {
|
||
|
horizontalScroller = &horizontalScrollerReference;
|
||
|
|
||
|
[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 / horizontalScroller->state.length;
|
||
|
double f = d * horizontalScroller->state.position;
|
||
|
|
||
|
[self setDoubleValue:f];
|
||
|
[self setKnobProportion:d];
|
||
|
}
|
||
|
|
||
|
-(IBAction) scroll :(id)sender {
|
||
|
auto &state = horizontalScroller->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(horizontalScroller->onChange) horizontalScroller->onChange();
|
||
|
}
|
||
|
|
||
|
@end
|
||
|
|
||
|
namespace phoenix {
|
||
|
|
||
|
Size pHorizontalScroller::minimumSize() {
|
||
|
@autoreleasepool {
|
||
|
return {32, [NSScroller scrollerWidthForControlSize:NSRegularControlSize scrollerStyle:NSScrollerStyleLegacy]};
|
||
|
}
|
||
|
}
|
||
|
|
||
|
unsigned pHorizontalScroller::position() {
|
||
|
@autoreleasepool {
|
||
|
return [cocoaView doubleValue] * horizontalScroller.state.length;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void pHorizontalScroller::setLength(unsigned length) {
|
||
|
@autoreleasepool {
|
||
|
[cocoaView update];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void pHorizontalScroller::setPosition(unsigned position) {
|
||
|
@autoreleasepool {
|
||
|
[cocoaView update];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void pHorizontalScroller::constructor() {
|
||
|
@autoreleasepool {
|
||
|
cocoaView = cocoaHorizontalScroller = [[CocoaHorizontalScroller alloc] initWith:horizontalScroller];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void pHorizontalScroller::destructor() {
|
||
|
@autoreleasepool {
|
||
|
[cocoaView release];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|