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

ボタンを表示する

D言語から Mac の GUI を使用して NSButton、NSTextField を表示します。 NSAttributedString の使用に変更しました。

NSButtonのSample

サンプルコード

Powered by Prism

button/dub.json

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

/**
 *   button/source/app.d      Version 0.0.8
 */
module button.main;
import core.attribute : optional, selector;
import std.stdio : printf;
import cocoa.window;
import cocoa.control;
import cocoa.menus;

string appName;
string versionNo = "0.0.8";
Button btn1, btn2;
NSTextField field, label;
NSAttributedString fAttrStr, lAttrStr;

string placeholderStr = "ここに、入力して下さい。";
string start_LabelStr = "貴方のお名前を入力して、\n下のボタンを押して下さい。";

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) @selector("drawRect:");
}

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;
        buildContents;
    }
    void aboutPanel() @selector("aboutPanel") {
        dialog(appName, "Version " ~ versionNo);
    }
    void showHelp() @selector("showHelp") {
        string helpMessage = "Button、 TextField、 Label\n"
                ~ "のテストプログラムです。\n";
        dialog(appName ~ " Help", helpMessage);
    }
}

void buildWindow() {
    NSWindow win;
    NSRect w_rect = NSMakeRect(0, 0, 300, 200);
    appName = NSProcessInfo.processInfo.processName.toDs;
    NSApp.menu = miniMenu(appName);
    immutable w_style = NSWindowStyleMask.titled |
                        NSWindowStyleMask.closable |
                        NSWindowStyleMask.miniaturizable;
    win = NSWindow.alloc.init(w_rect, w_style, backing.buffered, false);
    win.title = (appName ~ " (Dlang test)").toNs;
    win.moveTop = NSPoint(100, 950);
    win.makeKeyAndOrderFront = null;
    NSApp.activateIgnoringOtherApps = true; 
}

void buildContents() {
   // Button btn1, btn2
    btn1 = Button.alloc.init(NSMakeRect(50, 20, 150, 40));
    btn2 = Button.alloc.init(NSMakeRect(200, 20, 60, 40));
    btn1.setButton("Click Me !", NSColor.teal, "OnClickedButton1");
    btn2.setButton("Clear", NSColor.brown, "OnClickedButton2");
   // Check btn1, btn2
    if (btn1.respondsToSelector(sel_registerName("OnClickedButton1".toCs))) // 
        printf("btn1 = \"OnClickedButton1\"を確認できました!!!\n");
    else
        printf("btn1 = \"OnClickedButton1\"が見つかりません。\n");
    if (btn2.respondsToSelector(sel_registerName("OnClickedButton2".toCs))) //
        printf("btn2 = \"OnClickedButton2\"を確認できました!!!\n");
    else
        printf("btn2 = \"OnClickedButton2\"が見つかりません。\n");
   // TextField
    field = NSTextField.alloc.init(NSMakeRect(40, 80, 220, 30));
    field.attrStr = "".toAttrStr(NSColor.black);
    field.holderStr = placeholderStr.toAttrStr(NSColor.lightGray);
    field.font = NSFont.nameSize("YuMincho Demibold".toNs, 16);
   // Label
    label = NSTextField.alloc.init(NSMakeRect(40, 130, 220, 50));
    label.bgColor = NSColor.clear;
    label.bordered = false;
    label.editable = false;
    label.selectable = false;
    label.attrStr = start_LabelStr.toAttrStr(NSColor.black);
    win.contentView.subview = label;  //
}

extern (Objective-C)
class Button : NSButton, Res {
    override static Button alloc() @selector("alloc");
    override Button init(NSRect) @selector("initWithFrame:");
    bool respondsToSelector(SEL) @selector("respondsToSelector:");
    void setButton(string title, NSColor color, string action) 
            @selector("setButtonTitle:color:action:") {
        this.title = title;  // title.toNs;
        this.bezelStyle = NSBezelStyle.Push; //
        this.bezelColor = color;
        this.bordered = true;
        this.target = this;
        this.action_ = action; //  
        // this.action = sel_registerName(action.toCs); //
        win.contentView.subview = this;
    }
    void OnClickedButton1() @selector("OnClickedButton1") { 
        if (field.str.toDs != "") {
            string fText = "Hello " ~ field.str.toDs ~ " !!\n \t Nice going !!";
            label.attrStr = fText.toAttrStr(NSColor.black);
        } else {
            field.attrStr = "".toAttrStr(NSColor.black);
            label.attrStr = start_LabelStr.toAttrStr(NSColor.blue);
        }
    }
    void OnClickedButton2() @selector("OnClickedButton2") {
        field.attrStr = "".toAttrStr(NSColor.black);
        label.attrStr = start_LabelStr.toAttrStr(NSColor.black);
    }
}               
cocoa/window.d
cocoa/control.d
cocoa/menus.d