diff --git a/.github/workflows/release_macos.yml b/.github/workflows/release_macos.yml
index 1cdcaf0c..c9ad8092 100644
--- a/.github/workflows/release_macos.yml
+++ b/.github/workflows/release_macos.yml
@@ -25,7 +25,7 @@ jobs:
mkdocs build -d help
-
name: Install PyOxidizer
- run: python3 -m pip install pyoxidizer==0.22.0
+ run: python3 -m pip install pyoxidizer==0.24.0
-
name: Download ffmpeg
uses: carlosperate/download-file-action@v2
diff --git a/.gitignore b/.gitignore
index 0e353ac2..285958bc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -82,3 +82,5 @@ venv.bak/
# docs builds
/site/
/help/
+
+.DS_Store
diff --git a/hydrus/client/ClientConstants.py b/hydrus/client/ClientConstants.py
index 290b9f54..f80b894e 100644
--- a/hydrus/client/ClientConstants.py
+++ b/hydrus/client/ClientConstants.py
@@ -618,7 +618,7 @@ class GlobalIcons( object ):
def _Initialise( self ):
- self.hydrus = QG.QIcon( os.path.join( HC.STATIC_DIR, 'hydrus_black.svg' ) )
+ self.hydrus = QG.QIcon( os.path.join( HC.STATIC_DIR, 'hydrus_black_square.svg' ) )
self.github = QG.QIcon( os.path.join( HC.STATIC_DIR, 'github.svg' ) )
self.twitter = QG.QIcon( os.path.join( HC.STATIC_DIR, 'twitter.svg' ) )
self.tumblr = QG.QIcon( os.path.join( HC.STATIC_DIR, 'tumblr.svg' ) )
diff --git a/hydrus/client/ClientOptions.py b/hydrus/client/ClientOptions.py
index 168c7a04..732518f3 100644
--- a/hydrus/client/ClientOptions.py
+++ b/hydrus/client/ClientOptions.py
@@ -272,7 +272,7 @@ class ClientOptions( HydrusSerialisable.SerialisableBase ):
self._dictionary[ 'booleans' ][ 'remember_last_advanced_file_deletion_reason' ] = True
self._dictionary[ 'booleans' ][ 'remember_last_advanced_file_deletion_special_action' ] = False
- self._dictionary[ 'booleans' ][ 'do_macos_debug_dialog_menus' ] = True
+ self._dictionary[ 'booleans' ][ 'do_macos_debug_dialog_menus' ] = False
self._dictionary[ 'booleans' ][ 'save_default_tag_service_tab_on_change' ] = True
diff --git a/hydrus/client/gui/ClientGUI.py b/hydrus/client/gui/ClientGUI.py
index 24ce7b94..9ff81876 100644
--- a/hydrus/client/gui/ClientGUI.py
+++ b/hydrus/client/gui/ClientGUI.py
@@ -2244,10 +2244,12 @@ class FrameGUI( CAC.ApplicationCommandProcessorMixin, ClientGUITopLevelWindows.M
def _InitialiseMenubar( self ):
- self._menubar = QW.QMenuBar( self )
-
- self._menubar.setNativeMenuBar( False )
+ self._menubar = QW.QMenuBar( )
+ if not self._menubar.isNativeMenuBar():
+
+ self._menubar.setParent( self )
+
self._menu_updater_file = self._InitialiseMenubarGetMenuUpdaterFile()
self._menu_updater_database = self._InitialiseMenubarGetMenuUpdaterDatabase()
self._menu_updater_network = self._InitialiseMenubarGetMenuUpdaterNetwork()
@@ -3265,19 +3267,19 @@ class FrameGUI( CAC.ApplicationCommandProcessorMixin, ClientGUITopLevelWindows.M
ClientGUIMenus.AppendSeparator( menu )
- ClientGUIMenus.AppendMenuItem( menu, 'options', 'Change how the client operates.', self._ManageOptions )
- ClientGUIMenus.AppendMenuItem( menu, 'shortcuts', 'Edit the shortcuts your client responds to.', ClientGUIShortcutControls.ManageShortcuts, self )
+ ClientGUIMenus.AppendMenuItem( menu, 'options', 'Change how the client operates.', self._ManageOptions, role = QW.QAction.MenuRole.PreferencesRole )
+ ClientGUIMenus.AppendMenuItem( menu, 'shortcuts', 'Edit the shortcuts your client responds to.', ClientGUIShortcutControls.ManageShortcuts, self, role = QW.QAction.MenuRole.ApplicationSpecificRole )
ClientGUIMenus.AppendSeparator( menu )
label = 'minimise to system tray'
- if not HC.PLATFORM_WINDOWS:
+ if not (HC.PLATFORM_WINDOWS or HC.PLATFORM_MACOS):
label += ' (may be buggy/crashy!)'
- self._menubar_file_minimise_to_system_tray = ClientGUIMenus.AppendMenuItem( menu, label, 'Hide the client to an icon on your system tray.', self._FlipShowHideWholeUI )
+ self._menubar_file_minimise_to_system_tray = ClientGUIMenus.AppendMenuItem( menu, label, 'Hide the client to an icon on your system tray.', self._FlipShowHideWholeUI, role = QW.QAction.MenuRole.ApplicationSpecificRole )
ClientGUIMenus.AppendSeparator( menu )
@@ -3285,12 +3287,12 @@ class FrameGUI( CAC.ApplicationCommandProcessorMixin, ClientGUITopLevelWindows.M
if not we_borked_linux_pyinstaller:
- ClientGUIMenus.AppendMenuItem( menu, 'restart', 'Shut the client down and then start it up again.', self.TryToExit, restart = True )
+ ClientGUIMenus.AppendMenuItem( menu, 'restart', 'Shut the client down and then start it up again.', self.TryToExit, role = QW.QAction.MenuRole.ApplicationSpecificRole, restart = True )
- ClientGUIMenus.AppendMenuItem( menu, 'exit and force shutdown maintenance', 'Shut the client down and force any outstanding shutdown maintenance to run.', self.TryToExit, force_shutdown_maintenance = True )
+ ClientGUIMenus.AppendMenuItem( menu, 'exit and force shutdown maintenance', 'Shut the client down and force any outstanding shutdown maintenance to run.', self.TryToExit, role = QW.QAction.MenuRole.ApplicationSpecificRole, force_shutdown_maintenance = True )
- ClientGUIMenus.AppendMenuItem( menu, 'exit', 'Shut the client down.', self.TryToExit )
+ ClientGUIMenus.AppendMenuItem( menu, 'exit', 'Shut the client down.', self.TryToExit, role = QW.QAction.MenuRole.QuitRole )
return ( menu, '&file' )
@@ -3471,8 +3473,8 @@ class FrameGUI( CAC.ApplicationCommandProcessorMixin, ClientGUITopLevelWindows.M
ClientGUIMenus.AppendSeparator( menu )
- ClientGUIMenus.AppendMenuItem( menu, 'about Qt', 'See information about the Qt framework.', QW.QMessageBox.aboutQt, self )
- ClientGUIMenus.AppendMenuItem( menu, 'about', 'See this client\'s version and other information.', self._AboutWindow )
+ ClientGUIMenus.AppendMenuItem( menu, 'about Qt', 'See information about the Qt framework.', QW.QMessageBox.aboutQt, self, role = QW.QAction.MenuRole.AboutQtRole )
+ ClientGUIMenus.AppendMenuItem( menu, 'about', 'See this client\'s version and other information.', self._AboutWindow, role = QW.QAction.MenuRole.AboutRole )
return ( menu, '&help' )
@@ -6790,7 +6792,7 @@ The password is cleartext here but obscured in the entry dialog. Enter a blank p
def _UpdateSystemTrayIcon( self, currently_booting = False ):
- if not ClientGUISystemTray.SystemTrayAvailable() or ( not HC.PLATFORM_WINDOWS and not CG.client_controller.new_options.GetBoolean( 'advanced_mode' ) ):
+ if not ClientGUISystemTray.SystemTrayAvailable() or ( not (HC.PLATFORM_WINDOWS or HC.PLATFORM_MACOS) and not CG.client_controller.new_options.GetBoolean( 'advanced_mode' ) ):
return
diff --git a/hydrus/client/gui/ClientGUIMenus.py b/hydrus/client/gui/ClientGUIMenus.py
index 05615b15..04391291 100644
--- a/hydrus/client/gui/ClientGUIMenus.py
+++ b/hydrus/client/gui/ClientGUIMenus.py
@@ -28,11 +28,6 @@ def AppendMenuIconItem( menu: QW.QMenu, label: str, description: str, icon: QG.Q
menu_item = QW.QAction( menu )
- if HC.PLATFORM_MACOS:
-
- menu_item.setMenuRole( QW.QAction.ApplicationSpecificRole )
-
-
SetMenuTexts( menu_item, label, description )
menu_item.setIcon( icon )
@@ -53,11 +48,6 @@ def AppendMenuCheckItem( menu, label, description, initial_value, callable, *arg
menu_item = QW.QAction( menu )
- if HC.PLATFORM_MACOS:
-
- menu_item.setMenuRole( QW.QAction.ApplicationSpecificRole )
-
-
SetMenuTexts( menu_item, label, description )
menu_item.setCheckable( True )
@@ -69,14 +59,14 @@ def AppendMenuCheckItem( menu, label, description, initial_value, callable, *arg
return menu_item
-def AppendMenuItem( menu, label, description, callable, *args, **kwargs ):
+def AppendMenuItem( menu, label, description, callable, *args, role: QW.QAction.MenuRole = None, **kwargs ):
menu_item = QW.QAction( menu )
if HC.PLATFORM_MACOS:
- menu_item.setMenuRole( QW.QAction.ApplicationSpecificRole )
-
+ menu_item.setMenuRole( role if role is not None else QW.QAction.MenuRole.NoRole )
+
SetMenuTexts( menu_item, label, description )
@@ -105,11 +95,6 @@ def AppendMenuLabel( menu, label, description = '', copy_text = '' ):
menu_item = QW.QAction( menu )
-
- if HC.PLATFORM_MACOS:
-
- menu_item.setMenuRole( QW.QAction.ApplicationSpecificRole )
-
SetMenuTexts( menu_item, label, description )
diff --git a/hydrus/client/gui/ClientGUISystemTray.py b/hydrus/client/gui/ClientGUISystemTray.py
index 4617edfb..e7ff5164 100644
--- a/hydrus/client/gui/ClientGUISystemTray.py
+++ b/hydrus/client/gui/ClientGUISystemTray.py
@@ -179,7 +179,7 @@ class ClientSystemTrayIcon( QW.QSystemTrayIcon ):
def _WasActivated( self, activation_reason ):
- if not QP.isValid( self ):
+ if not QP.isValid( self ) or HC.PLATFORM_MACOS:
return
diff --git a/static/build_files/macos/Info.plist b/static/build_files/macos/Info.plist
index 6ebe3c22..cd74b577 100644
--- a/static/build_files/macos/Info.plist
+++ b/static/build_files/macos/Info.plist
@@ -13,7 +13,7 @@
CFBundleInfoDictionaryVersion
6.0
CFBundleName
- Hydrus Client
+ Hydrus
CFBundlePackageType
APPL
CFBundleShortVersionString
diff --git a/static/build_files/macos/pyoxidizer.bzl b/static/build_files/macos/pyoxidizer.bzl
index cc7208bd..320a6257 100644
--- a/static/build_files/macos/pyoxidizer.bzl
+++ b/static/build_files/macos/pyoxidizer.bzl
@@ -1,5 +1,5 @@
def make_dist():
- return default_python_distribution( python_version = "3.9" )
+ return default_python_distribution( python_version = "3.10" )
def make_packaging_policy(dist):
policy = dist.make_python_packaging_policy()
diff --git a/static/hydrus_black_square.svg b/static/hydrus_black_square.svg
new file mode 100644
index 00000000..041680e2
--- /dev/null
+++ b/static/hydrus_black_square.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/static/icon.icns b/static/icon.icns
index e2e7a204..d518cf9b 100644
Binary files a/static/icon.icns and b/static/icon.icns differ
diff --git a/static/qss/default_hydrus.qss b/static/qss/default_hydrus.qss
index c8571b8b..55f3aaeb 100644
--- a/static/qss/default_hydrus.qss
+++ b/static/qss/default_hydrus.qss
@@ -128,12 +128,12 @@ This is the Command Palette (default Ctrl+P), and specifically the background co
QLocatorResultWidget#selectedLocatorResult
{
- background-color: #006ffa
+ background-color: palette(highlight);
}
QLocatorResultWidget QWidget
{
- background: transparent
+ background: transparent;
}
@@ -169,5 +169,5 @@ We hack it with hardcoded 'style' attribute in the html in python code.
QLabel#HydrusHyperlink
{
- qproperty-link_color: #0000ff;
+ qproperty-link_color: palette(link);
}