#include #ifdef PLATFORM_COCOA #include #endif #include #ifdef GUI_COCOA #include #include "ChCocoMM.h" void Coco_PaintCh(void *cgcontext, int type, int value, int state) { auto dopaint = [&] { auto cg = (CGContextRef) cgcontext; if(Upp::IsUHDMode()) CGContextScaleCTM(cg, 2, 2); CGRect cr = CGRectMake(0, 0, 140, 140); if(type == COCO_NSCOLOR) { CGContextSaveGState(cg); CGContextSetFillColorWithColor(cg, Upp::decode(value, COCO_PAPER, [NSColor textBackgroundColor].CGColor, COCO_SELECTEDTEXT, [NSColor selectedTextColor].CGColor, COCO_SELECTEDPAPER, [NSColor selectedTextBackgroundColor].CGColor, COCO_DISABLED, [NSColor disabledControlTextColor].CGColor, COCO_WINDOW, [NSColor windowBackgroundColor].CGColor, COCO_SELECTEDMENUTEXT, [NSColor selectedMenuItemTextColor].CGColor, [NSColor textColor].CGColor )); CGContextFillRect(cg, cr); CGContextRestoreGState(cg); } else if(type == COCO_NSIMAGE) { NSImage *img = [NSImage imageNamed:(value ? NSImageNameInfo : NSImageNameCaution)]; NSGraphicsContext *gc = [NSGraphicsContext graphicsContextWithCGContext:cg flipped:YES]; NSGraphicsContext* cgc = [NSGraphicsContext currentContext]; [NSGraphicsContext setCurrentContext:gc]; [img drawInRect:NSMakeRect(0, 0, 48, 48)]; [NSGraphicsContext setCurrentContext:cgc]; } else { CGContextSaveGState(cg); [NSGraphicsContext saveGraphicsState]; [NSGraphicsContext setCurrentContext: [NSGraphicsContext graphicsContextWithCGContext:cg flipped:YES]]; const CGRect dirtyRect = CGRectMake(20, 20, 100, 100); if(Upp::findarg(type, COCO_SCROLLTHUMB, COCO_SCROLLTRACK) >= 0) { int cx = [NSScroller scrollerWidthForControlSize:NSControlSizeRegular scrollerStyle:NSScrollerStyleLegacy]; NSScroller *scroller = [[NSScroller alloc] initWithFrame:NSMakeRect(0, 0, 100, cx)]; scroller.floatValue = 0; scroller.knobProportion = 1; scroller.knobStyle = NSScrollerKnobStyleDefault; // scroller.knobStyle = Upp::IsDarkTheme() ? NSScrollerKnobStyleDark : NSScrollerKnobStyleLight; scroller.scrollerStyle = NSScrollerStyleLegacy; scroller.frame = cr; if(type == COCO_SCROLLTHUMB) [scroller drawKnob]; else [scroller drawKnobSlotInRect:CGRectMake(20, 20, 100, cx) highlight:YES]; [scroller release]; } else if(type == COCO_TEXTFIELD) { NSTextField *tf = [[NSTextField alloc] init]; tf.enabled = YES; tf.editable = YES; tf.bezeled = YES; tf.frame = CGRectMake(0, 0, 140, 40); [tf drawRect:dirtyRect]; [tf release]; } else { NSButton *bc = type == COCO_POPUPBUTTON ? [[NSPopUpButton alloc] init] : [[NSButton alloc] init]; bc.allowsMixedState = type == COCO_CHECKBOX; bc.title = @""; bc.controlSize = type == COCO_RADIOBUTTON ? NSControlSizeSmall : NSControlSizeRegular; bc.frame = cr; bc.buttonType = Upp::decode(type, COCO_CHECKBOX, NSButtonTypeSwitch, COCO_RADIOBUTTON, NSButtonTypeRadio, NSButtonTypePushOnPushOff); bc.bezelStyle = type == COCO_BUTTON ? NSBezelStyleRounded : NSBezelStyleRegularSquare; bc.state = Upp::decode(value, 0, NSControlStateValueOff, 1, NSControlStateValueOn, NSControlStateValueMixed); [bc highlight: state == Upp::CTRL_PRESSED]; bc.enabled = state != Upp::CTRL_DISABLED; [bc drawRect:dirtyRect]; [bc release]; } [NSGraphicsContext restoreGraphicsState]; CGContextRestoreGState(cg); } }; if (@available(macOS 11.0, *)) { [NSApp.effectiveAppearance performAsCurrentDrawingAppearance:^{ dopaint(); }]; } else { dopaint(); } } #endif