diff --git a/cocoa.nim b/cocoa.nim index 5406558..96f0400 100644 --- a/cocoa.nim +++ b/cocoa.nim @@ -57,6 +57,9 @@ proc newSlider*(parent: ID; left, top, width, height: int, `func`: ACTION): ID { proc newTableview*(parent: ID, left, top, width, height: cint): ID {.cdecl, importc: "createTableView".} proc newTextEdit*(parent: ID; txt: cstring, left, top, width, height: int): ID {.cdecl, importc: "createTextEdit".} proc newTextField*(parent: ID; txt: cstring; left: cint; top: cint; width: cint; height: cint): ID {.cdecl, importc: "createTextField".} +proc newStatusBar*(resource: cstring): ID {.cdecl, importc: "createStatusBar".} +proc newStatusMenu*(): ID {.cdecl, importc: "createStatusMenu".} +proc newStatusMenuItem*(parent: ID, tag: int, title: cstring, callback: ACTION) {.cdecl, importc: "createStatusItem".} # GUI Containers @@ -113,6 +116,15 @@ proc loadTableView*(tview: ID, path: cstring) {.cdecl, importc: "tableviewLoadFr proc addTab*(parent: ID, label: cstring) {.cdecl, importc: "addTab".} proc getTab*(parent: ID, label: cstring): ID {.cdecl, importc: "getTab".} +# StatusBar Functions +proc separator*(parent: ID) {.cdecl, importc: "addSeparator".} +proc setStatusMenu*(parent, menu: ID) {.cdecl,importc: "setMenu".} +proc tag*(widget: ID): int {.cdecl, importc: "tag".} +proc Status_Init*() {.cdecl, importc: "Status_Init".} +proc `menu=`*(parent,widget: ID ) = + parent.setStatusMenu(widget) + + # *********** # ** TO-DO ** # *********** diff --git a/cocoa/NSStatusBar.nim b/cocoa/NSStatusBar.nim new file mode 100644 index 0000000..1f4cbb9 --- /dev/null +++ b/cocoa/NSStatusBar.nim @@ -0,0 +1,15 @@ +{.compile: "widgets/statusbar.m".} + +import NSFunctions + +proc newStatusBar*(resource: cstring): ID {.cdecl, importc: "createStatusBar".} +proc newStatusMenu*(): ID {.cdecl, importc: "createStatusMenu".} +proc newStatusMenuItem*(parent: ID, tag: int, title: cstring, callback: ACTION) {.cdecl, importc: "createStatusItem".} +proc separator*(parent: ID) {.cdecl, importc: "addSeparator".} + +proc setStatusMenu*(parent, menu: ID) {.cdecl,importc: "setMenu".} +proc tag*(widget: ID): int {.cdecl, importc: "tag".} +proc Status_Init*() {.cdecl, importc: "Status_Init".} + +proc `menu=`*(parent,widget: ID ) = + parent.setStatusMenu(widget) \ No newline at end of file diff --git a/cocoa/widgets/statusbar.m b/cocoa/widgets/statusbar.m new file mode 100644 index 0000000..4e2f6f9 --- /dev/null +++ b/cocoa/widgets/statusbar.m @@ -0,0 +1,102 @@ +#import +#import +#import +#import +#include + +typedef void(*ACTION)(id); + +// SUBCLASSED NSMENUITEM ENABLING C-STYLE CALLBACKS +@interface StatusMenuItem: NSMenuItem{ + ACTION menuAction; +} + @property ACTION menuAction; + + + - (void) click:(id)sender; +@end + +@implementation StatusMenuItem + + @synthesize menuAction; + + + - (void) click:(id)sender { + menuAction(sender); + } +@end +NSData *getResource(NSString *sectionName, NSString *itemName) { + unsigned long size; + void *ptr = getsectiondata(&_mh_execute_header, sectionName.UTF8String, itemName.UTF8String, &size); + NSData *resourceData = [NSData dataWithBytesNoCopy:ptr length:size freeWhenDone:NO]; + return resourceData; +} + +id createStatusBar(const char *resource) { + + NSString *tmpStr = [NSString stringWithUTF8String: resource]; + + NSStatusItem *self; + NSStatusBar *statusBar = [NSStatusBar systemStatusBar]; + self = [statusBar statusItemWithLength:NSSquareStatusItemLength]; + + NSImage *icon = [[NSImage alloc] initWithContentsOfFile: tmpStr]; + icon.template = YES; + + self.button.image = icon; + return self; +} + +void setMenu(id parent, id menu) { +// ((NSStatusItem *)parent).menu = menu; + [(NSStatusItem *)parent setMenu: menu]; +} + +// FUNCTION TO CREATE MENU ITEMS/ENTRIES +void createStatusItem(id parent, int tag, const char *title, ACTION func) { + StatusMenuItem *self = [StatusMenuItem new]; + self.title = [NSString stringWithUTF8String: title]; + self.target = self; + if (func) + { + self.menuAction = func; + self.action = @selector(click:); + + } + + if (tag) {self.tag = tag;} + + [parent addItem: self]; + + // return self; +} + +// FUNCTION THAT RETURNS A MENU OBJECT +NSMenu *createStatusMenu() { + return NSMenu.new; +} + +void setTag(id widget, int number) { + ((NSMenuItem*)widget).tag = number; +} + +int tag(id widget) { + return ((NSMenuItem*)widget).tag; +} + +// FUNCTION TO ADD A SEPARATOR TO A MENU +void addSeparator(id parent) { + [parent addItem: [NSMenuItem separatorItem]]; +} + +void Status_Init() { + [NSApplication sharedApplication]; + [NSApp setActivationPolicy:NSApplicationActivationPolicyAccessory]; +} + +// FUNCTION THAT PASSES CONTROL TO COCOA SUBSYSTEM +void Status_Run(id obj) { + [NSApp setDelegate: obj]; + [NSApp run]; +} + diff --git a/cocoa_lib.nim b/cocoa_lib.nim index ed0707c..eef0da1 100644 --- a/cocoa_lib.nim +++ b/cocoa_lib.nim @@ -20,7 +20,8 @@ import Cocoa / [NSButton, NSTableview, NSTextedit, NSTextfield, - NSWindow + NSWindow, + NSStatusBar ] export NSButton, @@ -43,4 +44,5 @@ export NSButton, NSTableview, NSTextedit, NSTextfield, - NSWindow + NSWindow, + NSStatusBar