D言語からObjective-CとCocoaAPIを使いたい
NSTableView を使ってみたい
NSTableView NSTableViewDelegate NSTableViewDataSource を使ってみました。
NSTableViewのSample

サンプルコード
Powered by Prism
table/dub.json
{
"authors": ["hidhok"],
"description": "A D/Objective-C Cocoa application.",
"name": "table",
"dflags": ["-L-framework", "-LCocoa"],
"sourceFiles": ["../cocoa/window",
"../cocoa/control",
"../cocoa/tables",
"../cocoa/images",
"../cocoa/menu"]
}
table/source/app.d
/**
* table/source/app.d Version 0.0.1
*/
module table.main;
import core.attribute : optional, selector;
import std.stdio;
import cocoa.window;
import cocoa.control;
import cocoa.tables;
import cocoa.menu;
string appName;
string versionNo = "0.0.1";
string helpMessage = "CocoaAPIを使用して、\nmlb team の table を\nD言語で表示しています。";
string jsonPath = "../data/mlb.json";
NSScrollView scrView;
void main() {
auto delegate_ = AppDelegate.alloc.init;
NSApp.delegate_ = cast(void*) delegate_;
NSApp.activationPolicy = NSAppActivationPolicy.regular;
NSApp.run;
}
void buildWindow() {
NSWindow win;
NSRect rect = NSMakeRect(0, 0, 300, 240);
appName = NSProcessInfo.processInfo.processName.toDs;
NSApp.menu = mainMenu(appName);
immutable w_style = NSWindowStyleMask.titled |
NSWindowStyleMask.closable |
NSWindowStyleMask.resizable |
NSWindowStyleMask.miniaturizable;
win = NSWindow.alloc.init(rect, w_style, backing.buffered, false);
win.title = (appName ~ " (D言語)").toNs;
win.minSize = NSSize(100, 100);
win.moveTop = NSPoint(200, 900);
scrView = NSScrollView.alloc.init;
ViewController vCtrler = ViewController.alloc.init;
vCtrler.view.subview = scrView;
win.contentView = scrView;
win.makeKeyAndOrderFront = null;
NSApp.activateIgnoringOtherApps = true;
}
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);
}
}
extern (Objective-C)
class ViewController : NSViewController,
NSTableViewDelegate, NSTableViewDataSource {
NSMutableArray mlbArray;
override static ViewController alloc() @selector("alloc");
override ViewController init() @selector("init");
override void loadView() @selector("loadView") {
printf("loadView\n");
mlbArray = jsonPath.toArrayJson.copy;
NSTableView tblView = NSTableView.alloc.init;
scrView.hScroller = true;
scrView.vScroller = true;
NSClipView clpView = NSClipView.alloc.init;
tblView.resizeMask = ResizeMask.WidthSizable | ResizeMask.HeightSizable;
tblView.staticContents = true;
tblView.rowBgColors = true;
tblView.delegate_ = this;
tblView.dataSource = this;
NSString[3] idStr = ["Team".toNs, "Division".toNs, "League".toNs];
NSTableColumn[3] column;
double[3] columnWidth = [140, 50, 70];
foreach(i; 0..3) {
column[i] = NSTableColumn.alloc.init(idStr[i]);
column[i].title = idStr[i];
column[i].width = columnWidth[i];
tblView.addTableColumn = column[i];
}
clpView.documentView = tblView;
scrView.contentView = clpView;
}
override void viewDidLoad() @selector("viewDidLoad") {
printf("viewDidLoad\n");
}
// ----- Delegate -----
NSView tableView(NSTableView tv, NSTableColumn co, NSInteger ri)
@selector("tableView:viewForTableColumn:row:") {
NSTextField txtFld = NSTextField.alloc.init;
NSDictionary dict = mlbArray.dicAtIndex(ri);
txtFld.bezeled = false;
txtFld.bgColor = NSColor.clear;
txtFld.str = dict.strForKey(co.identifier);
return txtFld;
}
// ----- DataSource - Getting Values -----
NSInteger numOfRows(NSTableView tv) @selector("numberOfRowsInTableView:") {
return mlbArray.count;
}
NSString tableViewS(NSTableView tv, NSTableColumn co, NSInteger ri)
@selector("tableView:objectValueForTableColumn:row:") {
NSDictionary data = mlbArray.dicAtIndex(ri);
return data.strForKey(co.identifier);
}
}
mlb.json
cocoa/tables.d
cocoa/control.d
cocoa/window.d
cocoa/menu.d
- Log
- 2023-11-03 upload