Skip to content

Commit

Permalink
[OSX] Implement menu
Browse files Browse the repository at this point in the history
  • Loading branch information
milani committed Oct 31, 2012
1 parent 73250d4 commit b3ebd9e
Show file tree
Hide file tree
Showing 4 changed files with 116 additions and 9 deletions.
9 changes: 8 additions & 1 deletion src/native_menu/native_menu.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@ class NativeMenu {
int AddSubMenu(GtkWidget*,Settings*);
bool Attach(GtkMenuShell*);
#elif defined(__MAC__)
//int AddSubMenu(Settings*);
int AddSubMenu(NSMenu*,Settings*);
bool Attach(NSMenu*);
#endif

private:
Expand All @@ -48,6 +49,12 @@ class NativeMenu {

};

typedef struct _appjs_action_callback {
v8::Persistent<v8::Object> action;
v8::Persistent<v8::Object> item;
NativeMenu* menu;
} appjs_action_callback;

} /* appjs */

#endif /* end of APPJS_BASE_NATIVE_MENU_H */
6 changes: 0 additions & 6 deletions src/native_menu/native_menu_linux.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,6 @@ namespace appjs {

using namespace v8;

typedef struct _appjs_action_callback {
Persistent<Object> action;
Persistent<Object> item;
NativeMenu* menu;
} appjs_action_callback;

void menu_active_handler(GtkWidget* menuItem,appjs_action_callback* actionCallback){
Persistent<Object> action = actionCallback->action;
NativeMenu* menu = actionCallback->menu;
Expand Down
107 changes: 105 additions & 2 deletions src/native_menu/native_menu_mac.mm
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,119 @@
#include "includes/cef_handler.h"
#include "native_menu/native_menu.h"

@interface MenuActionManager : NSObject {
appjs::appjs_action_callback* actionCb_;
}
- (id)initWithAction:(appjs::appjs_action_callback*)actionCb_;

@end

@interface MenuActionManager ()
@property (nonatomic,readwrite,assign)appjs::appjs_action_callback* actionCb;
@end

@implementation MenuActionManager

@synthesize actionCb = actionCb_;

- (id)initWithAction:(appjs::appjs_action_callback*)action {
self = [super init];
if(self != nil){
self.actionCb = action;
}
return self;
}

- (void)handleAction:(id)sender {
v8::Persistent<v8::Object> action = self.actionCb->action;
appjs::NativeMenu* menu = self.actionCb->menu;

if(action->IsCallable()) {
const int argc = 1;
v8::Handle<v8::Value> argv[argc] = {self.actionCb->item};
action->CallAsFunction(menu->GetV8Handle(),argc,argv);
}

menu->Emit("select",v8::Local<v8::Object>::New(self.actionCb->item));
}
@end
// The global ClientHandler reference.
extern CefRefPtr<ClientHandler> g_handler;

namespace appjs {

void NativeMenu::Init(Settings* settings) {
//NSArray* menuItems = [NSArray alloc];
NSMenu* menu = [[NSMenu alloc] initWithTitle:@"Sample"];
AddSubMenu(menu,settings);

NSArray* menuItems = [menu itemArray];

//for(NSMenuItem* menuItem in menuItems){
menuItems_ = menuItems;
//}
[menu removeAllItems];
}

//int NativeMenu::AddSubMenu(GtkWidget* menu,Settings* settings){
//}
int NativeMenu::AddSubMenu(NSMenu* menu,Settings* settings){
int length = settings->getInteger("length",0);

Settings* item;
NSMenuItem* menuItem;
NSString* label;
NSString* icon;
appjs_action_callback* actionCb;
MenuActionManager* actionManager;

for( int i = 0; i < length; i++ ) {

item = new Settings( settings->getObject( i ) );
label = [NSString stringWithUTF8String:item->getString("label","")];
icon = [NSString stringWithUTF8String:item->getString("icon","")];
actionCb = new appjs_action_callback();
actionCb->action = v8::Persistent<v8::Object>::New( item->getObject("action") );
actionCb->item = v8::Persistent<v8::Object>::New( settings->getObject( i ) );
actionCb->menu = this;
actionManager = [[MenuActionManager alloc] initWithAction:actionCb];

if( [label length] == 0 ) {
menuItem = [NSMenuItem separatorItem];
} else if( [icon length] == 0 ) {
menuItem = [[NSMenuItem alloc] initWithTitle:label action:NULL keyEquivalent:@""];
} else {
menuItem = [[NSMenuItem alloc] initWithTitle:label action:NULL keyEquivalent:@""];
}
[menuItem setEnabled:YES];

Settings* subsettings = new Settings(item->getObject("submenu"));
NSMenu* submenu = [[NSMenu alloc] initWithTitle:label];

if(AddSubMenu(submenu,subsettings)){
[menuItem setSubmenu:submenu];
} else {
[menuItem setTarget:actionManager];
[menuItem setAction:@selector(handleAction:)];
}

[menu addItem:menuItem];
}

return length;
}

bool NativeMenu::Attach(NSMenu* menu) {
if(!attached_) {
for(NSMenuItem* menuItem in menuItems_) {
[menu addItem:menuItem];
}

this->Emit("attached");

return true;
}

return FALSE;
}

} /* appjs */

3 changes: 3 additions & 0 deletions src/native_window/native_window_mac.mm
Original file line number Diff line number Diff line change
Expand Up @@ -358,7 +358,10 @@ void AddWebView(CefWindowHandle parent, char* url, Settings* settings) {
}

void NativeWindow::SetMenuBar(NativeMenu* nativeMenu) {
NSMenu* menu = [[NSMenu alloc] initWithTitle:@"AppJS Menu"];

nativeMenu->Attach(menu);
[NSApp setMainMenu:menu];
}

void NativeWindow::OpenFileDialog(uv_work_t* req) {
Expand Down

0 comments on commit b3ebd9e

Please sign in to comment.