Began implementing menus on Mac OS X.
This commit is contained in:
parent
f303f066e2
commit
b258e1fc82
|
@ -6,6 +6,7 @@ OSMFILES = \
|
||||||
init.m \
|
init.m \
|
||||||
label.m \
|
label.m \
|
||||||
main.m \
|
main.m \
|
||||||
|
menu.m \
|
||||||
newcontrol.m \
|
newcontrol.m \
|
||||||
parent.m \
|
parent.m \
|
||||||
tab.m \
|
tab.m \
|
||||||
|
|
|
@ -56,6 +56,9 @@ const char *uiInit(uiInitOptions *o)
|
||||||
[NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];
|
[NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];
|
||||||
[NSApp setDelegate:[uiAppDelegate new]];
|
[NSApp setDelegate:[uiAppDelegate new]];
|
||||||
|
|
||||||
|
if (options.Menu != NULL)
|
||||||
|
[NSApp setMainMenu:makeMenubar()];
|
||||||
|
|
||||||
// we can use a stock NSView for this
|
// we can use a stock NSView for this
|
||||||
destroyedControlsView = [[NSView alloc] initWithFrame:NSZeroRect];
|
destroyedControlsView = [[NSView alloc] initWithFrame:NSZeroRect];
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,70 @@
|
||||||
|
// 20 april 2015
|
||||||
|
#import "uipriv_darwin.h"
|
||||||
|
|
||||||
|
struct menuConfig {
|
||||||
|
BOOL hasQuit;
|
||||||
|
BOOL hasPreferences;
|
||||||
|
BOOL hasAbout;
|
||||||
|
};
|
||||||
|
|
||||||
|
void appendMenuItem(NSMenu *menu, const uiMenuItem *item, struct menuConfig *menuConfig)
|
||||||
|
{
|
||||||
|
NSMenuItem *mitem;
|
||||||
|
|
||||||
|
if (item->Name == uiMenuItemQuit) {
|
||||||
|
// TODO verify type
|
||||||
|
menuConfig->hasQuit = YES;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (item->Name == uiMenuItemPreferences) {
|
||||||
|
// TODO verify type
|
||||||
|
menuConfig->hasPreferences = YES;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (item->Name == uiMenuItemAbout) {
|
||||||
|
// TODO verify type
|
||||||
|
menuConfig->hasAbout = YES;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (item->Name == uiMenuItemSeparator) {
|
||||||
|
// TODO verify type
|
||||||
|
[menu addItem:[NSMenuItem separatorItem]];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
switch (item->Type) {
|
||||||
|
case uiMenuItemTypeCommand:
|
||||||
|
case uiMenuItemTypeCheckbox:
|
||||||
|
mitem = [[NSMenuItem alloc] initWithTitle:toNSString(item->Name) action:NULL keyEquivalent:@""];
|
||||||
|
[menu addItem:mitem];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
NSMenuItem *makeMenu(const char *name, const uiMenuItem *items, struct menuConfig *menuConfig)
|
||||||
|
{
|
||||||
|
NSMenuItem *menubarItem;
|
||||||
|
NSMenu *menu;
|
||||||
|
const uiMenuItem *i;
|
||||||
|
|
||||||
|
menubarItem = [[NSMenuItem alloc] initWithTitle:toNSString(name) action:NULL keyEquivalent:@""];
|
||||||
|
menu = [[NSMenu alloc] initWithTitle:toNSString(name)];
|
||||||
|
for (i = items; i->Name != NULL; i++)
|
||||||
|
appendMenuItem(menu, i, menuConfig);
|
||||||
|
[menubarItem setSubmenu:menu];
|
||||||
|
return menubarItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
NSMenu *makeMenubar(void)
|
||||||
|
{
|
||||||
|
NSMenu *menubar;
|
||||||
|
struct menuConfig menuConfig;
|
||||||
|
const uiMenu *m;
|
||||||
|
|
||||||
|
menubar = [[NSMenu alloc] initWithTitle:@""];
|
||||||
|
|
||||||
|
memset(&menuConfig, 0, sizeof (struct menuConfig));
|
||||||
|
for (m = options.Menu; m->Name != NULL; m++)
|
||||||
|
[menubar addItem:makeMenu(m->Name, m->Items, &menuConfig)];
|
||||||
|
|
||||||
|
return menubar;
|
||||||
|
}
|
|
@ -28,7 +28,7 @@ uiLogObjCClassAllocations
|
||||||
{
|
{
|
||||||
if (self->mainControl != NULL) {
|
if (self->mainControl != NULL) {
|
||||||
// we have to do this before we can destroy controls
|
// we have to do this before we can destroy controls
|
||||||
uiControlSetParent(p->mainControl, NULL);
|
uiControlSetParent(self->mainControl, NULL);
|
||||||
uiControlDestroy(self->mainControl);
|
uiControlDestroy(self->mainControl);
|
||||||
self->mainControl = NULL;
|
self->mainControl = NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,17 +26,21 @@
|
||||||
|
|
||||||
#define VIEW(c) uiControlHandle(uiControl(c))
|
#define VIEW(c) uiControlHandle(uiControl(c))
|
||||||
|
|
||||||
// init_darwin.m
|
// init.m
|
||||||
extern NSView *destroyedControlsView;
|
extern NSView *destroyedControlsView;
|
||||||
|
|
||||||
// util_darwin.m
|
// util.m
|
||||||
extern void setStandardControlFont(NSControl *);
|
extern void setStandardControlFont(NSControl *);
|
||||||
extern void disableAutocorrect(NSTextView *);
|
extern void disableAutocorrect(NSTextView *);
|
||||||
|
|
||||||
|
// parent.m
|
||||||
// These are based on measurements from Interface Builder.
|
// These are based on measurements from Interface Builder.
|
||||||
// These seem to be based on Auto Layout constants, but I don't see an API that exposes these...
|
// These seem to be based on Auto Layout constants, but I don't see an API that exposes these...
|
||||||
#define macXMargin 20
|
#define macXMargin 20
|
||||||
#define macYMargin 20
|
#define macYMargin 20
|
||||||
|
|
||||||
// entry_darwin.m
|
// entry.m
|
||||||
extern void finishNewTextField(NSTextField *, BOOL);
|
extern void finishNewTextField(NSTextField *, BOOL);
|
||||||
|
|
||||||
|
// menu.m
|
||||||
|
extern NSMenu *makeMenubar(void);
|
||||||
|
|
|
@ -18,3 +18,8 @@ void disableAutocorrect(NSTextView *tv)
|
||||||
[tv setAutomaticLinkDetectionEnabled:NO];
|
[tv setAutomaticLinkDetectionEnabled:NO];
|
||||||
[tv setSmartInsertDeleteEnabled:NO];
|
[tv setSmartInsertDeleteEnabled:NO];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void complain(const char *fmt, ...)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
|
@ -116,7 +116,7 @@ static void windowSetMargined(uiWindow *ww, int margined)
|
||||||
uiParentUpdate(D.content);
|
uiParentUpdate(D.content);
|
||||||
}
|
}
|
||||||
|
|
||||||
uiWindow *uiNewWindow(const char *title, int width, int height)
|
uiWindow *uiNewWindow(const char *title, int width, int height, int hasMenubar)
|
||||||
{
|
{
|
||||||
uiWindowDelegate *d;
|
uiWindowDelegate *d;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue