RapaGUI & macOS

Discuss GUI programming with the RapaGUI plugin here
Post Reply
User avatar
mrupp
Posts: 147
Joined: Sun Jan 31, 2021 7:44 pm
Location: Switzerland
Contact:

RapaGUI & macOS

Post by mrupp »

Hi there

Some things I noticed with my GUI on macOS, that differ from the result on other OSes. Some might be bugs (or not), some other more in the line of feature requests:
  1. Possible bug: having a simple ListView (of type ListBox, 1 text column, no headers), it shows an unnecessary horizontal scrollbar, which is not present on Windows or AmigaOS4 (see red square in the screenshot below).
  2. Possible bug: having a ListView with 2 columns and headers, there is no spacing at all between the widget itself and the first column data (see red arrow in the screenshot below). This looks much better with Windows and AmigaOS4. Alright, it's not that big a deal, but not beautiful either... ;)
  3. Possible bug or feature request: the GUI looks and feels very native on macOS, I love it! But it's too bad it ignores the OS's dark mode. Might that be possible to fix/implement?
  4. Feature request: To follow macOS style guidelines, some menuitems would need to be in the default menu of the app (like "About SonosController", "Preferences..." and the like, generally everything that's in "File" on other OSes, see opened menu in the screenshot below). It would be great if menuitems could be integrated in the default menu. Maybe by giving the menu class a specific id or (better) attribute:

    Code: Select all

    <menu title="_File" macDefaultMenu="true">
      <item>A_bout...</item>
    </menu>
    I would expect my menuitems to be located on top of "Services".
macOS x64:
Image

Windows x64:
Image

AmigaOS4:
Image
(this scales somehow differently, but it might be my mistake, I'll investigate further before posting another thread... ;) )

Cheers,
Michael
User avatar
airsoftsoftwair
Posts: 5433
Joined: Fri Feb 12, 2010 2:33 pm
Location: Germany
Contact:

Re: RapaGUI & macOS

Post by airsoftsoftwair »

mrupp wrote: Sat Feb 20, 2021 5:54 pm [*]Possible bug: having a simple ListView (of type ListBox, 1 text column, no headers), it shows an unnecessary horizontal scrollbar, which is not present on Windows or AmigaOS4 (see red square in the screenshot below).
That's a bug in wxWidgets which I fixed for them a few months ago so will be gone in RapaGUI 2.0 as well.
mrupp wrote: Sat Feb 20, 2021 5:54 pm [*]Possible bug: having a ListView with 2 columns and headers, there is no spacing at all between the widget itself and the first column data (see red arrow in the screenshot below). This looks much better with Windows and AmigaOS4. Alright, it's not that big a deal, but not beautiful either... ;)
I think that's just the way macOS draws the widget. wxWidgets just uses macOS' native NSTableView widget.
mrupp wrote: Sat Feb 20, 2021 5:54 pm [*]Possible bug or feature request: the GUI looks and feels very native on macOS, I love it! But it's too bad it ignores the OS's dark mode. Might that be possible to fix/implement?
Right, that's a limitation of Hollywood. I've fixed it now:

Code: Select all

- Fix [macOS]: Hollywood, the Hollywood GUI and executables compiled by Hollywood ignored the system's dark
  mode setting and always appeared in normal mode
You can easily make your app dark-mode-aware by adding the following two lines to the Info.plist file that is part of the app bundle:

Code: Select all

<key>NSRequiresAquaSystemAppearance</key>
<false/>
If those lines are in Info.plist, your app will support dark mode.
mrupp wrote: Sat Feb 20, 2021 5:54 pm [*]Feature request: To follow macOS style guidelines, some menuitems would need to be in the default menu of the app (like "About SonosController", "Preferences..." and the like, generally everything that's in "File" on other OSes, see opened menu in the screenshot below). It would be great if menuitems could be integrated in the default menu. Maybe by giving the menu class a specific id or (better) attribute:
Makes sense. I'll see what I can do.
User avatar
mrupp
Posts: 147
Joined: Sun Jan 31, 2021 7:44 pm
Location: Switzerland
Contact:

Re: RapaGUI & macOS

Post by mrupp »

That's a bug in wxWidgets which I fixed for them a few months ago so will be gone in RapaGUI 2.0 as well.
Excellent!
If those lines are in Info.plist, your app will support dark mode.
This didn't work out as expected, not all elements were drawn in dark mode, but maybe this is fixed in RapaGUI 2.0 as well?

Without those lines in Info.plist:
Image

With those lines in Info.plist:
Image
User avatar
mrupp
Posts: 147
Joined: Sun Jan 31, 2021 7:44 pm
Location: Switzerland
Contact:

Re: RapaGUI & macOS

Post by mrupp »

I think that's just the way macOS draws the widget. wxWidgets just uses macOS' native NSTableView widget.
Hmm... not so sure. I created a test app using Eto.Forms (another multiplatform GUI kit that integrats natively, https://github.com/picoe/Eto/wiki) and they use NSTableView as well for the GridView class (https://searchcode.com/codesearch/view/98925786/) that I used in my example and it looks better, I'd say:
Image

And I also tried an NSTableView in XCode and this is how it looks in the preview (I don't know how to add data to it, I haven't really used XCode so far):
Image

You see there's a nice looking spacing between the control's border and the data of the first column in both cases.
But maybe this has already been fixed in RapaGUI 2.0 as well? ;)
User avatar
airsoftsoftwair
Posts: 5433
Joined: Fri Feb 12, 2010 2:33 pm
Location: Germany
Contact:

Re: RapaGUI & macOS

Post by airsoftsoftwair »

mrupp wrote: Fri Feb 26, 2021 9:29 pm This didn't work out as expected, not all elements were drawn in dark mode, but maybe this is fixed in RapaGUI 2.0 as well?
I didn't deliberately fix this but it might be fixed in wxWidgets. RapaGUI 2.0 of course uses the latest version of wxWidgets with lots of fixes. Remember that RapaGUI 1.2 is from 2017 and there probably wasn't even a darkmode back then. Can you provide a MCVE? Then I'll check and see if the problem is gone with RapaGUI 2.0.
mrupp wrote: Fri Feb 26, 2021 10:53 pm You see there's a nice looking spacing between the control's border and the data of the first column in both cases.
But maybe this has already been fixed in RapaGUI 2.0 as well? ;)
No, it still looks like that but this must be a wxWidgets issue then. You can report it here: http://trac.wxwidgets.org/
User avatar
mrupp
Posts: 147
Joined: Sun Jan 31, 2021 7:44 pm
Location: Switzerland
Contact:

Re: RapaGUI & macOS

Post by mrupp »

Can you provide a MCVE? Then I'll check and see if the problem is gone with RapaGUI 2.0.
Sure, this is easy enough:
  1. Take your RapaGUI Demo.xml and the follwing Demo.hws that has been altered only to include RapaGUI and Demo.xml in compilation:

    Code: Select all

    /****************************************************************
    **                                                             **
    ** Name:        Demo                                           **
    ** Author:      Andreas Falkenhahn                             **
    ** Version:     1.0                                            **
    ** Date:        24.04.16                                       **
    ** Interpreter: Hollywood 6.1                                  **
    ** Licence:     Sample program                                 **
    ** Function:    Demonstrates most of RapaGUI's widgets         **
    **                                                             **
    ** History:                                                    **
    **                                                             **
    ** 1.0: (24.04.16)                                             **
    **                                                             **
    ** - initial release                                           **
    **                                                             **
    ****************************************************************/
    
    /*
    ** Make sure we have at least Hollywood 6.1!
    */
    @VERSION 6,1
    
    
    /*
    ** This script requires the RapaGUI plugin
    */
    @REQUIRE "RapaGUI", {Link = True}
    
    
    /*
    ** Information about this app
    */
    @APPTITLE "Demo"
    @APPVERSION "$VER: Demo 1.0 (24.04.16)"
    @APPCOPYRIGHT "(C) Copyright 2015-2016 by Andreas Falkenhahn"
    @APPAUTHOR "Andreas Falkenhahn"
    @APPDESCRIPTION "Demonstrates RapaGUI's widgets"
    
    
    /*
    ** External brushes that we use in our GUI
    */
    @BRUSH 1, "data/ok.png", {LoadAlpha = True}
    @BRUSH 2, "data/cancel.png", {LoadAlpha = True}
    @BRUSH 3, "data/rapagui.png", {LoadAlpha = True}
    @BRUSH 4, "data/button.png", {LoadAlpha = True}
    @BRUSH 5, "data/checkbox.png", {LoadAlpha = True}
    @BRUSH 6, "data/choice.png", {LoadAlpha = True}
    @BRUSH 7, "data/editfield.png", {LoadAlpha = True}
    @BRUSH 8, "data/editor.png", {LoadAlpha = True}
    @BRUSH 9, "data/listview.png", {LoadAlpha = True}
    @BRUSH 10, "data/progress.png", {LoadAlpha = True}
    @BRUSH 11, "data/radiobuttons.png", {LoadAlpha = True}
    @BRUSH 12, "data/sliderbutton.png", {LoadAlpha = True}
    @BRUSH 13, "data/image.png", {LoadAlpha = True}
    @BRUSH 14, "data/register.png", {LoadAlpha = True}
    @BRUSH 15, "data/popfile.png", {LoadAlpha = True}
    @BRUSH 16, "data/busybar.png", {LoadAlpha = True}
    @BRUSH 17, "data/sketchboard.png", {LoadAlpha = True}
    @BRUSH 18, "data/treeview.png", {LoadAlpha = True}
    @BRUSH 19, "data/floattext.png", {LoadAlpha = True}
    @BRUSH 20, "data/listbox.png", {LoadAlpha = True}
    @BRUSH 21, "data/chooser.png", {LoadAlpha = True}
    
    @FILE 1, "Demo.xml"
    
    /*
    ** This display as the output device for Hollywood class
    */
    @DISPLAY {Width = 480, Height = 240}
    
    
    /*
    ** Add a message to our log listview
    */
    Function p_Log(t$)
    	
    	moai.DoMethod("log", "insert", "bottom", GetTime(True) .. ": " .. t$)
    	moai.DoMethod("log", "jump", "bottom")
    	
    EndFunction
    
    	
    /*
    ** Enable/disable list buttons
    */	
    Function p_EnableListButtons(pre$, d)
    	
    	d = Not d
    	
    	moai.Set(pre$ .. "delcur", "disabled", d)
    	moai.Set(pre$ .. "delitem", "disabled", d)
    	moai.Set(pre$ .. "visitem", "disabled", d)
    	moai.Set(pre$ .. "chgitem", "disabled", d)
    
    EndFunction
    
    
    /*
    ** Set progress bar level
    */
    Function p_SetProgress(x)
    
    	moai.Set("prgbar", "level", x)
    		
    EndFunction
    	
    
    /*
    ** Interval function which updates the progress bar
    */	
    Function p_ProgressbarTimer()
    
    	If prgbarc < moai.Get("prgbar", "max")
    		prgbarc = prgbarc + 1	
    		p_SetProgress(prgbarc)
    	Else
    		ClearInterval(1)
    		moai.Set("pbsimprg", "text", "Simulate progress")		
    		p_Log("Progress bar finished")	
    	EndIf 
    	
    EndFunction	
    
    
    /*
    ** Interval function which animates the busy bar
    */
    Function p_BusybarTimer()
    
    	moai.DoMethod("busybar", "move")
    	
    EndFunction	
    						
    									
    /*
    ** Handles all incoming events
    */
    Function p_EventFunc(msg)
    
    	Switch msg.action
    	Case "RapaGUI"
    		Switch msg.attribute
    		Case "Pressed":
    			Switch msg.id
    			Case "cycledemo":
    				moai.Set("cycle", "active", moai.Get("cycleactive", "text"), "nonotify", True)
    			Case "cmselect":
    				moai.Set("checkmark", "selected", True, "nonotify", True)
    			Case "cmdeselect":
    				moai.Set("checkmark", "selected", False, "nonotify", True)	
    			Case "lbaddfew":
    				Local t = {"First", "another one", "and the last (very very very very very very very very very very long) one"}
    				For Local k = 0 To ListItems(t) - 1 Do moai.DoMethod("listbox", "insert", "bottom", t[k])	
    			Case "lbaddmany":
    				For Local k = 0 To 999 Do moai.DoMethod("listbox", "insert", "bottom", "item #" .. k)	
    			Case "lbadditem":
    				moai.DoMethod("listbox", "insert", "bottom", moai.Get("lbadditemtxt", "text"))	
    			Case "lbchgitem":
    				moai.Set("listbox", "active", moai.Get("lbchgitemnum", "text"))
    			Case "lbvisitem":
    				moai.DoMethod("listbox", "jump", moai.Get("lbvisitemnum", "text"))	
    			Case "lbdelitem":
    				moai.DoMethod("listbox", "remove", moai.Get("lbdelitemnum", "text"))							
    			Case "lbdelcur":
    				moai.DoMethod("listbox", "remove", "active")		
    			Case "lbclear":
    				moai.DoMethod("listbox", "clear")
    			Case "lvaddfew":
    				Local c = moai.Get("listview", "entries")
    				For Local k = 0 To 2 Do moai.DoMethod("listview", "insert", "bottom", "Row " .. c + k .. " item " .. "1", "Row " .. c + k .. " item " .. "2", "Row " .. c + k .. " item " .. "3")	
    			Case "lvaddmany":
    				Local c = moai.Get("listview", "entries")
    				For Local k = 0 To 999 Do moai.DoMethod("listview", "insert", "bottom", "Row " .. c + k .. " item " .. "1", "Row " .. c + k .. " item " .. "2", "Row " .. c + k .. " item " .. "3")	
    			Case "lvadditem":
    				Local t$ = moai.Get("lvadditemtxt", "text")
    				moai.DoMethod("listview", "insert", "bottom", t$, t$, t$)	
    			Case "lvchgitem":
    				moai.Set("listview", "active", moai.Get("lvchgitemnum", "text"))
    			Case "lvvisitem":
    				moai.DoMethod("listview", "jump", moai.Get("lvvisitemnum", "text"))	
    			Case "lvdelitem":
    				moai.DoMethod("listview", "remove", moai.Get("lvdelitemnum", "text"))							
    			Case "lvdelcur":
    				moai.DoMethod("listview", "remove", "active")		
    			Case "lvclear":
    				moai.DoMethod("listview", "clear")
    			Case "pbsetval":
    				prgbarc = Val(moai.Get("pbsetvalnum", "text"))
    				moai.Set("prgbar", "level", prgbarc)		
    			Case "pbsetrange":
    				moai.Set("prgbar", "max", moai.Get("pbsetrangenum", "text"))	
    			Case "pbsimprg":
    				If Not HaveObject(#INTERVAL, 1)
    					p_Log("Starting progress bar...")
    					prgbarc = 0					
    					SetInterval(1, p_ProgressbarTimer, 100)		
    					moai.Set("pbsimprg", "text", "Stop timer")								
    				Else
    					ClearInterval(1)
    					moai.Set("pbsimprg", "text", "Simulate progress")
    				EndIf	
    			Case "pbclear":
    				moai.Set("prgbar", "level", 0)
    				prgbarc = 0	
    			Case "slsetval":
    				moai.Set("slider", "level", moai.Get("slsetvalnum", "text"))		
    			Case "slsetrange":
    				moai.Set("slider", "max", moai.Get("slsetrangenum", "text"))	
    			Case "rdsetval":
    				moai.Set("radio", "active", moai.Get("rdsetvalnum", "text"), "nonotify", True)	
    			Case "bbsimprg":
    				If Not HaveObject(#INTERVAL, 2)
    					p_Log("Starting busy bar...")		
    					SetInterval(2, p_BusybarTimer, 80)		
    					moai.Set("bbsimprg", "text", "Stop timer")								
    				Else
    					ClearInterval(2)
    					moai.DoMethod("busybar", "reset")
    					moai.Set("bbsimprg", "text", "Simulate activity")
    				EndIf	
    			Case "hwclear":
    				Cls	
    			Case "cosetval":
    				moai.Set("combobox", "value", moai.Get("cosetvalstr", "text"), "nonotify", True)									
    			Default:
    				p_Log("Button click: " .. msg.id)
    			EndSwitch
    			
    		Case "Active":
    			Switch msg.id
    			Case "cycle":
    				moai.Set("cycleactive", "text", msg.triggervalue)
    				p_Log("Choice select: " .. msg.triggervalue)
    			Case "listbox":
    				moai.Set("lbdelitemnum", "text", IIf(msg.triggervalue = -1, 0, msg.triggervalue))
    				p_EnableListButtons("lb", msg.triggervalue <> -1)
    				p_Log("Listbox active: " .. msg.triggervalue)	
    			Case "listview":
    				moai.Set("lvdelitemnum", "text", IIf(msg.triggervalue = -1, 0, msg.triggervalue))
    				p_EnableListButtons("lv", msg.triggervalue <> -1)
    				p_Log("Listview active: " .. msg.triggervalue)	
    			Case "radio":
    				p_Log("Radio select: " .. msg.triggervalue)	
    			Case "pageview":
    				p_Log("Changed page: " .. msg.triggervalue)													
    			EndSwitch	
    			
    		Case "Selected":
    			Switch msg.id
    			Case "checkmark":
    				p_Log("Checkbox toggle: " .. msg.triggervalue)	
    			Case "togglebutton":
    				p_Log("Button toggle: " .. msg.triggervalue)	
    			Case "mn_quit":
    				End
    			Case "mn_about":
    				moai.Request("", "Widgets demo\n(C) 2015-2016 by Andreas Falkenhahn\n\nVisit the official Hollywood portal at:\nhttp://www.hollywood-mal.com", "OK")				
    			Case "mn_aboutrapagui":
    				moai.DoMethod("app", "aboutrapagui")																
    			EndSwitch
    		
    		Case "Text":
    			p_Log("Textentry: " .. msg.id .. " " .. msg.triggervalue)	
    			
    		Case "Level":
    			Switch msg.id
    			Case "prgbar":
    				moai.Set("pblevel", "text", msg.triggervalue)
    			Case "slider":
    				moai.Set("sllevel", "text", msg.triggervalue)	
    			EndSwitch
    			
    		Case "File":
    			p_Log("Popfile: " .. msg.triggervalue)	
    			
    		Case "Path":
    			p_Log("Poppath: " .. msg.triggervalue)	
    
    		Case "Font":
    			p_Log("Popfont: " .. msg.triggervalue)	
    
    		Case "RGB":
    			p_Log("Popcolor: " .. HexStr(msg.triggervalue))	
    			
    		Case "Value":
    			p_Log("Combobox: " .. msg.triggervalue)																								
    		EndSwitch
    	
    	Case "OnMouseDown":
    		Circle(MouseX() - 5, MouseY() - 5, 5, #WHITE)	
    		
    	Case "OnMouseMove":
    		If IsLeftMouse() = True Then Circle(MouseX() - 5, MouseY() - 5, 5, #WHITE)			
    	EndSwitch
    
    EndFunction
    
    SetFillStyle(#FILLCOLOR)
    
    ; dynamically create GUI from an external *.xml file definition
    moai.CreateApp(ReadString(1))
    
    ; listen to these events!
    InstallEventHandler({RapaGUI = p_EventFunc, OnMouseDown = p_EventFunc, OnMouseMove = p_EventFunc})
    	
    ; main loop!
    Repeat
    	WaitEvent
    Forever
  2. Compile it for macOS (x64)
  3. Replace the Info.plist in the app bundle with this one (has entry NSRequiresAquaSystemAppearance):

    Code: Select all

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
    	<key>NSPrincipalClass</key>
    	<string>NSApplication</string>
    	<key>NSHighResolutionCapable</key>
    	<true/>
    	<key>CFBundleDevelopmentRegion</key>
    	<string>English</string>
    	<key>CFBundleExecutable</key>
    	<string>Demo.x86</string>
    	<key>CFBundleExecutableArgs</key>
    	<string></string>
    	<key>CFBundleIconFile</key>
    	<string>Demo.x86</string>
    	<key>CFBundleIdentifier</key>
    	<string>com.airsoftsoftwair.Hollywood.Demo.x86</string>
    	<key>CFBundleInfoDictionaryVersion</key>
    	<string>6.0</string>
    	<key>CFBundlePackageType</key>
    	<string>APPL</string>
    	<key>CFBundleSignature</key>
    	<string>????</string>
    	<key>CFBundleVersion</key>
    	<string>1.0</string>
    	<key>LSMinimumSystemVersion</key>
    	<string>10.6.0</string>
    	<key>NSRequiresAquaSystemAppearance</key>
    	<false/>
    </dict>
    </plist>
    
  4. Run it on a mac with dark mode (I tested on latest Big Sur 11.2.2).
  5. There you go, it looks similar to the screenshot I posted above: some widgets are drawn in dark mode, some not (incl. die application's background), some partially (buttons).
User avatar
mrupp
Posts: 147
Joined: Sun Jan 31, 2021 7:44 pm
Location: Switzerland
Contact:

Re: RapaGUI & macOS

Post by mrupp »

airsoftsoftwair wrote: Fri Feb 26, 2021 7:53 pm
mrupp wrote: Sat Feb 20, 2021 5:54 pm [*]Feature request: To follow macOS style guidelines, some menuitems would need to be in the default menu of the app (like "About SonosController", "Preferences..." and the like, generally everything that's in "File" on other OSes, see opened menu in the screenshot below). It would be great if menuitems could be integrated in the default menu. Maybe by giving the menu class a specific id or (better) attribute:
Makes sense. I'll see what I can do.
I did some research and tests and found the following in the wxWidgets FAQ (https://www.wxwidgets.org/docs/faq/osx/#aboutmenu):
How does wxMac support the standard Apple About menu item and Help menu?

Because wxWidgets does not have a specific API for the About menu item or the Help menu, the Mac OS port uses some static variables to help the engine make the right decisions:
- It assumes that the About menu item is part of a Help menu.
- The title of the Help menu is stored in ‘wxApp::s_macHelpMenuTitleName’, it defaults to “&Help”, but you can change it in your constructor to your specific menu title.
- The item Id of the About menu is stored in ‘wxApp::s_macAboutMenuItemID’, it defaults to ‘wxID_ABOUT’, but can be changed as well to suit your needs.
- The other items of the wxWidgets help menu are appended to the macOS Help menu and the translation of Ids is handled transparently for your application.
So I tried the following in the XML:

Code: Select all

<menubar id="menu">
	<menu title="_File">
		<item id="mn_aboutrapagui">About Rapa_GUI...</item>
		<item/>
		<item id="mn_quit">_Quit</item>
	</menu>
	<menu title="_Help">
		<item id="wxID_ABOUT">_About...</item>
		<item id="mn_help">_FAQ</item>
	</menu>
</menubar>
[+] The Help menu did indeed get the macOS-specific search textentry and searching did find menu items by name :) . Maybe this could be added as a hint in the RapaGUI docs.
[-] "About..." wasn't moved the the mac's default menu but stayed in the help menu. Maybe this works with RapaGUI 2.0 using a more current version of wxWidgets.
User avatar
airsoftsoftwair
Posts: 5433
Joined: Fri Feb 12, 2010 2:33 pm
Location: Germany
Contact:

Re: RapaGUI & macOS

Post by airsoftsoftwair »

mrupp wrote: Sun Feb 28, 2021 6:06 pm [*]Run it on a mac with dark mode (I tested on latest Big Sur 11.2.2).
[*]There you go, it looks similar to the screenshot I posted above: some widgets are drawn in dark mode, some not (incl. die application's background), some partially (buttons).
Tested it and I think it looks correct with RapaGUI 2.0. Just to make sure it's really gone, can you post a screenshot of the glitches you get so that I can compare?
User avatar
mrupp
Posts: 147
Joined: Sun Jan 31, 2021 7:44 pm
Location: Switzerland
Contact:

Re: RapaGUI & macOS

Post by mrupp »

airsoftsoftwair wrote: Tue Mar 02, 2021 7:55 pm Tested it and I think it looks correct with RapaGUI 2.0. Just to make sure it's really gone, can you post a screenshot of the glitches you get so that I can compare?
Sure, here you go, it's very similar to my screenshot above. I'm pretty sure you would've noticed... :lol:

Image
User avatar
airsoftsoftwair
Posts: 5433
Joined: Fri Feb 12, 2010 2:33 pm
Location: Germany
Contact:

Re: RapaGUI & macOS

Post by airsoftsoftwair »

mrupp wrote: Tue Mar 02, 2021 11:16 pm Sure, here you go, it's very similar to my screenshot above. I'm pretty sure you would've noticed... :lol:
Yup, definitely fixed :)
mrupp wrote: Mon Mar 01, 2021 10:21 am [-] "About..." wasn't moved the the mac's default menu but stayed in the help menu. Maybe this works with RapaGUI 2.0 using a more current version of wxWidgets.
I've added support for some macOS specific menu items now so this should be working correctly in RapaGUI 2.0.

Code: Select all

- New [macOS]: Added new types "About", "Quit", "Help", "Preferences" to the Menuitem.Type attribute; by
  setting a menu item to one of these types, RapaGUI will move it to its appropriate position according to
  the host OS' styleguide (e.g. the "About", "Preferences", and "Quit" menus are part of the program menu
  on macOS); on non-macOS systems, those new types don't have any effect and RapaGUI will just ignore them
Post Reply