D言語からObjective-CとCocoaAPIを使いたい

D言語で ウクライナ国旗を描いてみました。NSColor.colorCMYK を使用しました。 未完成ながら、mainMenu を追加してみました。

NSColor.colorCMYK(Cyan:magenta:yellow:black:alpha:)の使用

ウクライナに平和を

サンプルコード

Powered by Prism

uflag/dub.json

{
    "authors": ["hidhok"],
    "description": "A D/Objective-C Cocoa application.",
    "name": "uflag",
    "dflags": ["-L-framework", "-LCocoa"],
    "sourceFiles": ["../cocoa/window",
                    "../cocoa/control",
                    "../cocoa/menu"]
}               
uflag/source/app.d

/**
 *   uflag/source/app.d     ukrainianFlag     Version 0.0.4
 */
module uflag.main;
import core.attribute : optional, selector;
import std.conv : to;
import std.math;
import std.stdio;
import cocoa.window;
import cocoa.menu;

string appName = "ukrainianFlag";
string versionNo = "0.0.4";
string helpMessage =  "CocoaAPIを使用して ColorCMYK を、\nD言語で表示してみました。";

void main() {
    auto delegate_ = AppDelegate.alloc.init;
    NSApp.delegate_ = cast(void*) delegate_;
    NSApp.activationPolicy = NSAppActivationPolicy.regular;
    NSApp.run;
}

extern (Objective-C)
class DrawView : NSView {
    override static DrawView alloc() @selector("alloc");
    override DrawView init()@selector("init");
    override DrawView init(NSRect) @selector("initWithFrame:");
    override void drawRect(NSRect r) @selector("drawRect:") {
        NSColor ukraineB, ukraineY;
        NSPoint center;
        CGFloat radius, flagW, flagH;
        NSRect flagRectB, flagRectY;
        CGFloat w = r.size.width;
        CGFloat h = r.size.height;
        center.x = w / 2;
        center.y = h / 2;

        if (w > h * 1.5) {
            flagH = h - 20;
            flagW = flagH * 3 / 2;
        } else {
            flagW = w - 20;
            flagH = flagW * 2 / 3;
        }
        NSColor.white.fill;
        NSRectFill(r);
        flagRectB = NSMakeRect(
            center.x - flagW / 2, center.y, flagW, flagH / 2);
        flagRectY = NSMakeRect(
            center.x - flagW / 2, center.y - flagH / 2, flagW, flagH / 2);
        ukraineB = NSColor.colorCMYK(0.7, 0.4, 0, 0.23, 1);
        ukraineY = NSColor.colorCMYK(0, 0.11, 0.91, 0.02, 1);
        ukraineB.fill;
        NSRectFill(flagRectB);
        ukraineY.setFill;
        NSRectFill(flagRectY);
    } 
}

extern (Objective-C)
class AppDelegate : NSObject {
    override static AppDelegate alloc() @selector("alloc");
    override typeof(this) init() @selector("init");
    bool applicationShouldTerminateAfterLastWindowClosed(
            NSNotification notification) @selector(
            "applicationShouldTerminateAfterLastWindowClosed:") {
        return true;
    }
    void applicationDidFinishLaunching(NSNotification notification) 
                @selector("applicationDidFinishLaunching:") {
        buildWindow;
    }
    void aboutPanel() @selector("aboutPanel") {
        dialog(appName, "Version " ~ versionNo);
    }
    void showHelp() @selector("showHelp") {
        dialog("Help", helpMessage);
    } 
} 

void buildWindow() {
    NSWindow win;
    NSRect w_rect = NSMakeRect(100, 550, 400, 400);
    // appName = NSProcessInfo.processInfo.processName.toDs;
    NSApp.menu = mainMenu(appName);
    immutable w_style = NSWindowStyleMask.titled |
                        NSWindowStyleMask.closable |
                        NSWindowStyleMask.resizable |
                        NSWindowStyleMask.miniaturizable;
    win = NSWindow.alloc.init(w_rect, w_style, backing.buffered, false);
    win.title = (appName ~ " (ColorCMYK設定:D言語テスト)").toNs;
    DrawView dView = DrawView.alloc.init;
    win.contentView = dView;
    ViewController vCtrler = ViewController.alloc.init;
    vCtrler.view.subview = dView;
    win.makeKeyAndOrderFront = null;
    NSApp.activateIgnoringOtherApps = true;
}

extern (Objective-C) 
class ViewController : NSViewController {
    override static ViewController alloc() @selector("alloc");
    override ViewController init() @selector("init");
    override void loadView() @selector("loadView") {
        printf("loadView\n");
    }
    override void viewDidLoad() @selector("viewDidLoad") {
        printf("viewDidLoad\n");
    }
}               
cocoa/window.d
cocoa/control.d
cocoa/menu.d