Skip to content

Instantly share code, notes, and snippets.

@thbwd
Last active January 7, 2022 07:03
Show Gist options
  • Save thbwd/e1de669d112567ed95e79498b25a61c6 to your computer and use it in GitHub Desktop.
Save thbwd/e1de669d112567ed95e79498b25a61c6 to your computer and use it in GitHub Desktop.
Emojicocoa
//
// Emojicocoa.h
// Emojicocoa
//
// Created by Theo Weidmann on 22.02.20.
// Copyright Β© 2020 Theo Weidmann. All rights reserved.
//
#import <Cocoa/Cocoa.h>
#include <emojicode/runtime/Runtime.h>
@interface AppDelegate : NSObject<NSApplicationDelegate> {
runtime::Callable<void> _ready;
}
- (id) initWithReady:(runtime::Callable<void>)ready;
- (void) applicationDidFinishLaunching:(NSNotification *)notification;
@end
//
// Emojicocoa.m
// Emojicocoa
//
// Created by Theo Weidmann on 22.02.20.
// Copyright Β© 2020 Theo Weidmann. All rights reserved.
//
#import "Emojicocoa.hpp"
#include <emojicode/s/String.h>
@implementation AppDelegate
- (id) initWithReady:(runtime::Callable<void>)ready {
self = [super init];
_ready = ready;
return self;
}
- (void) applicationDidFinishLaunching:(NSNotification *)notification {
_ready();
}
@end
template <typename T>
class CocoaWrapper : public runtime::Object<CocoaWrapper<T>> {
public:
CocoaWrapper(T *value) {
value_ = value;
}
T* get() const { return value_; }
private:
T *value_;
};
@interface ControlHandler : NSObject {
runtime::Callable<void> _callable;
}
- (id) initWithHandler:(runtime::Callable<void>)callable;
- (void) handle;
@end
@implementation ControlHandler
- (id)initWithHandler:(runtime::Callable<void>)callable {
self = [super init];
_callable = callable;
_callable.retain();
return self;
}
- (void)handle {
_callable();
}
@end
extern "C" void startCocoa(void *object, runtime::Callable<void> ready) {
NSApplication *application = [NSApplication sharedApplication];
[NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];
[NSApp activateIgnoringOtherApps:YES];
AppDelegate *applicationDelegate = [[AppDelegate alloc] initWithReady: ready];
[application setDelegate:applicationDelegate];
[application run];
}
extern "C" CocoaWrapper<NSWindow>* createWindow() {
NSRect frame = NSMakeRect(0, 0, 200, 200);
NSWindow* window = [[NSWindow alloc] initWithContentRect:frame
styleMask:NSWindowStyleMaskResizable | NSWindowStyleMaskTitled | NSWindowStyleMaskMiniaturizable
backing:NSBackingStoreBuffered
defer:NO];
[window makeKeyAndOrderFront:NSApp];
return CocoaWrapper<NSWindow>::init(window);
}
extern "C" void addViewToWindow(CocoaWrapper<NSWindow> *window, CocoaWrapper<NSView> *view) {
[window->get().contentView addSubview:view->get()];
}
NSString* nsstringFromString(s::String *string) {
return [[NSString alloc] initWithBytes:string->characters.get() length:string->count encoding:NSUTF8StringEncoding];
}
extern "C" CocoaWrapper<NSButton>* createButton(s::String *label, runtime::Callable<void> handler) {
NSButton *button = [NSButton buttonWithTitle:nsstringFromString(label)
target:[[ControlHandler alloc] initWithHandler:handler]
action:@selector(handle)];
return CocoaWrapper<NSButton>::init(button);
}
extern "C" CocoaWrapper<NSTextField>* createTextField() {
NSTextField *field = [[NSTextField textFieldWithString:@""] retain];
field.frame = CGRectMake(100, 100, 100, 20);
return CocoaWrapper<NSTextField>::init(field);
}
extern "C" CocoaWrapper<NSProgressIndicator>* createProgressIndicator() {
NSProgressIndicator *pi = [[NSProgressIndicator alloc] initWithFrame:CGRectMake(200, 100, 100, 20)];
pi.indeterminate = false;
pi.minValue = 0;
pi.maxValue = 1;
return CocoaWrapper<NSProgressIndicator>::init(pi);
}
extern "C" void setProgress(CocoaWrapper<NSProgressIndicator> *pi, runtime::Real pro) {
pi->get().doubleValue = pro;
}
extern "C" s::String* getTextTextField(CocoaWrapper<NSTextField> *field) {
return s::String::init([field->get().stringValue UTF8String]);
}
extern "C" void setTextTextField(CocoaWrapper<NSTextField> *field, s::String *s) {
return [field->get() setStringValue:nsstringFromString(s)];
}
SET_INFO_FOR(CocoaWrapper<NSWindow>, emojicocoa, 1f499)
SET_INFO_FOR(CocoaWrapper<NSButton>, emojicocoa, 1f967)
SET_INFO_FOR(CocoaWrapper<NSTextField>, emojicocoa, 1f6f9)
SET_INFO_FOR(CocoaWrapper<NSProgressIndicator>, emojicocoa, 1f6e4)
πŸ“¦ emojicocoa 🏠
πŸπŸ‡
πŸ˜€ πŸ”€bonjourπŸ”€β—οΈ
πŸ†•πŸ«πŸ‡
πŸ˜€ πŸ”€let's rockπŸ”€β—οΈ
πŸ†•πŸ’™β—οΈ ➑️ window
πŸ†•πŸ›Ήβ—οΈ ➑️ field
πŸ†•πŸ›€β—οΈ ➑️ progress
πŸŒ‹ window πŸ†•πŸ₯§ πŸ”€HelloπŸ”€ πŸ‡πŸŽπŸ₯‘
πŸ”‘ field πŸ”€πŸ§²πŸ•°πŸ‡πŸ’»β—οΈπŸ§²πŸ”€β—οΈ
πŸ’― progress 0.5❗️
πŸ‰β—οΈβ—οΈ
πŸŒ‹ window field❗️
πŸŒ‹ window progress❗️
πŸ‰β—οΈ
πŸ‰
🌍 πŸ‡ 🍫 πŸ‡
πŸ†• ready πŸ‡πŸ‰ πŸ“» πŸ”€startCocoaπŸ”€
πŸ‰
🌍 πŸ“» πŸ‡ πŸ’™ πŸ‡
πŸ†• πŸ“» πŸ”€createWindowπŸ”€
β—οΈπŸŒ‹ view 🏐 πŸ“» πŸ”€addViewToWindowπŸ”€
πŸ‰
🌍 πŸ“» πŸ‡ 🏐 πŸ‡
πŸ‰
🌍 πŸ“» πŸ‡ πŸ₯§ 🏐 πŸ‡
πŸ†• label πŸ”‘ 🎍πŸ₯‘ handler πŸ‡πŸ‰ πŸ“» πŸ”€createButtonπŸ”€
πŸ‰
🌍 πŸ“» πŸ‡ πŸ›€ 🏐 πŸ‡
πŸ†• πŸ“» πŸ”€createProgressIndicatorπŸ”€
❗️ πŸ’― value πŸ’― πŸ“» πŸ”€setProgressπŸ”€
πŸ‰
🌍 πŸ“» πŸ‡ πŸ›Ή 🏐 πŸ‡
πŸ†• πŸ“» πŸ”€createTextFieldπŸ”€
❓ πŸ”‘ ➑️ πŸ”‘ πŸ“» πŸ”€getTextTextFieldπŸ”€
❗️ πŸ”‘ text πŸ”‘ πŸ“» πŸ”€setTextTextFieldπŸ”€
πŸ‰
πŸ”— πŸ”€m -framework Foundation -framework CocoaπŸ”€ πŸ”—
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment