diff --git a/src/video/cocoa/cocoa_wnd.h b/src/video/cocoa/cocoa_wnd.h index 2b29dff42f..94bff1e1f8 100644 --- a/src/video/cocoa/cocoa_wnd.h +++ b/src/video/cocoa/cocoa_wnd.h @@ -11,8 +11,6 @@ #define COCOA_WND_H #import -#include "toolbar_gui.h" -#include "table/sprites.h" #ifdef MAC_OS_X_VERSION_10_12_2 # define HAVE_TOUCHBAR_SUPPORT @@ -34,58 +32,6 @@ extern NSString *OTTDMainLaunchGameEngine; + (NSCursor *) clearCocoaCursor; @end -#ifdef HAVE_TOUCHBAR_SUPPORT -/* 9 items can be displayed on the touch bar when using default buttons. */ -static NSArray *touchBarButtonIdentifiers = @[ - @"openttd.pause", - @"openttd.fastforward", - @"openttd.zoom_in", - @"openttd.zoom_out", - @"openttd.build_rail", - @"openttd.build_road", - @"openttd.build_tram", - @"openttd.build_docks", - @"openttd.build_airport", - NSTouchBarItemIdentifierOtherItemsProxy -]; - -static NSDictionary *touchBarButtonSprites = @{ - @"openttd.pause": [NSNumber numberWithInt:SPR_IMG_PAUSE], - @"openttd.fastforward": [NSNumber numberWithInt:SPR_IMG_FASTFORWARD], - @"openttd.zoom_in": [NSNumber numberWithInt:SPR_IMG_ZOOMIN], - @"openttd.zoom_out": [NSNumber numberWithInt:SPR_IMG_ZOOMOUT], - @"openttd.build_rail": [NSNumber numberWithInt:SPR_IMG_BUILDRAIL], - @"openttd.build_road": [NSNumber numberWithInt:SPR_IMG_BUILDROAD], - @"openttd.build_tram": [NSNumber numberWithInt:SPR_IMG_BUILDTRAMS], - @"openttd.build_docks": [NSNumber numberWithInt:SPR_IMG_BUILDWATER], - @"openttd.build_airport": [NSNumber numberWithInt:SPR_IMG_BUILDAIR], -}; - -static NSDictionary *touchBarButtonActions = @{ - @"openttd.pause": [NSNumber numberWithInt:MTHK_PAUSE], - @"openttd.fastforward": [NSNumber numberWithInt:MTHK_FASTFORWARD], - @"openttd.zoom_in": [NSNumber numberWithInt:MTHK_ZOOM_IN], - @"openttd.zoom_out": [NSNumber numberWithInt:MTHK_ZOOM_OUT], - @"openttd.build_rail": [NSNumber numberWithInt:MTHK_BUILD_RAIL], - @"openttd.build_road": [NSNumber numberWithInt:MTHK_BUILD_ROAD], - @"openttd.build_tram": [NSNumber numberWithInt:MTHK_BUILD_TRAM], - @"openttd.build_docks": [NSNumber numberWithInt:MTHK_BUILD_DOCKS], - @"openttd.build_airport": [NSNumber numberWithInt:MTHK_BUILD_AIRPORT], -}; - -static NSDictionary *touchBarFallbackText = @{ - @"openttd.pause": @"Pause", - @"openttd.fastforward": @"Fast Forward", - @"openttd.zoom_in": @"Zoom In", - @"openttd.zoom_out": @"Zoom Out", - @"openttd.build_rail": @"Rail", - @"openttd.build_road": @"Road", - @"openttd.build_tram": @"Tram", - @"openttd.build_docks": @"Docks", - @"openttd.build_airport": @"Airport", -}; -#endif - /** Subclass of NSWindow to cater our special needs */ @interface OTTD_CocoaWindow : NSWindow #ifdef HAVE_TOUCHBAR_SUPPORT diff --git a/src/video/cocoa/cocoa_wnd.mm b/src/video/cocoa/cocoa_wnd.mm index c240e64ede..95ac3feb16 100644 --- a/src/video/cocoa/cocoa_wnd.mm +++ b/src/video/cocoa/cocoa_wnd.mm @@ -32,7 +32,11 @@ #include "../../gfx_func.h" #include "../../window_func.h" #include "../../window_gui.h" -#include "spritecache.h" +#include "../../spritecache.h" +#include "../../toolbar_gui.h" +#include + +#include "table/sprites.h" /* Table data for key mapping. */ #include "cocoa_keys.h" @@ -56,6 +60,31 @@ * Read http://developer.apple.com/releasenotes/Cocoa/Objective-C++.html for more information. */ +#ifdef HAVE_TOUCHBAR_SUPPORT +struct TouchBarButton { + NSTouchBarItemIdentifier key; + SpriteID sprite; + MainToolbarHotkeys hotkey; + NSString *fallback_text; + + bool operator ==(const NSTouchBarItemIdentifier other) const { return this->key == other; } +}; + +/* 9 items can be displayed on the touch bar when using default buttons. */ +static const std::array _touchbar_buttons{{ + { @"openttd.pause", SPR_IMG_PAUSE, MTHK_PAUSE, @"Pause" }, + { @"openttd.fastforward", SPR_IMG_FASTFORWARD, MTHK_FASTFORWARD, @"Fast Forward" }, + { @"openttd.zoom_in", SPR_IMG_ZOOMIN, MTHK_ZOOM_IN, @"Zoom In" }, + { @"openttd.zoom_out", SPR_IMG_ZOOMOUT, MTHK_ZOOM_OUT, @"Zoom Out" }, + { @"openttd.build_rail", SPR_IMG_BUILDRAIL, MTHK_BUILD_RAIL, @"Rail" }, + { @"openttd.build_road", SPR_IMG_BUILDROAD, MTHK_BUILD_ROAD, @"Road" }, + { @"openttd.build_tram", SPR_IMG_BUILDTRAMS, MTHK_BUILD_TRAM, @"Tram" }, + { @"openttd.build_docks", SPR_IMG_BUILDWATER, MTHK_BUILD_DOCKS, @"Docks" }, + { @"openttd.build_airport", SPR_IMG_BUILDAIR, MTHK_BUILD_AIRPORT, @"Airport" } +}}; + +#endif + bool _allow_hidpi_window = true; // Referenced from table/misc_settings.ini @interface OTTDMain : NSObject @@ -453,15 +482,24 @@ void CocoaDialog(const char *title, const char *message, const char *buttonLabel - (void)touchBarButtonAction:(id)sender { NSButton *btn = (NSButton *)sender; - NSNumber *hotkeyIndex = [ touchBarButtonActions objectForKey:btn.identifier ]; - if (hotkeyIndex != nil) HandleToolbarHotkey(hotkeyIndex.intValue); + if (auto item = std::find(_touchbar_buttons.cbegin(), _touchbar_buttons.cend(), (NSTouchBarItemIdentifier)btn.identifier); item != _touchbar_buttons.cend()) { + HandleToolbarHotkey(item->hotkey); + } } - (nullable NSTouchBar *)makeTouchBar { + /* Make button identifier array. */ + NSMutableArray *button_ids = [ [ NSMutableArray alloc ] init ]; + for (const auto &button : _touchbar_buttons) { + [ button_ids addObject:button.key ]; + } + [ button_ids addObject:NSTouchBarItemIdentifierOtherItemsProxy ]; + NSTouchBar *bar = [ [ NSTouchBar alloc ] init ]; bar.delegate = self; - bar.defaultItemIdentifiers = touchBarButtonIdentifiers; + bar.defaultItemIdentifiers = button_ids; + [ button_ids release ]; self->touchbar_created = true; @@ -470,7 +508,10 @@ void CocoaDialog(const char *title, const char *message, const char *buttonLabel - (nullable NSTouchBarItem *)touchBar:(NSTouchBar *)touchBar makeItemForIdentifier:(NSTouchBarItemIdentifier)identifier { - NSButton *button = [ NSButton buttonWithTitle:touchBarFallbackText[identifier] target:self action:@selector(touchBarButtonAction:) ]; + auto item = std::find(_touchbar_buttons.cbegin(), _touchbar_buttons.cend(), identifier); + assert(item != _touchbar_buttons.cend()); + + NSButton *button = [ NSButton buttonWithTitle:item->fallback_text target:self action:@selector(touchBarButtonAction:) ]; button.identifier = identifier; button.imageScaling = NSImageScaleProportionallyDown; @@ -488,11 +529,13 @@ void CocoaDialog(const char *title, const char *message, const char *buttonLabel /* Re-create button images from OTTD sprites. */ for (NSTouchBarItemIdentifier ident in self.touchBar.itemIdentifiers) { + auto item = std::find(_touchbar_buttons.cbegin(), _touchbar_buttons.cend(), ident); + if (item == _touchbar_buttons.cend()) continue; + NSCustomTouchBarItem *tb_item = [ self.touchBar itemForIdentifier:ident ]; NSButton *button = tb_item.view; - NSNumber *num = touchBarButtonSprites[ident]; - NSImage *image = NSImageFromSprite(num.unsignedIntValue, _settings_client.gui.zoom_min); + NSImage *image = NSImageFromSprite(item->sprite, _settings_client.gui.zoom_min); if (image != nil) { /* Human Interface Guidelines: Maximum touch bar glyph size 22 pt. */ CGFloat max_dim = std::max(image.size.width, image.size.height);