ultimatepp/uppsrc/CtrlLib/ChCocoMM.mm
2026-04-18 10:16:13 +02:00

105 lines
3.7 KiB
Text

#include <Core/config.h>
#ifdef PLATFORM_COCOA
#include <Carbon/Carbon.h>
#endif
#include <CtrlLib/CtrlLib.h>
#ifdef GUI_COCOA
#include <CtrlCore/CocoMM.h>
#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