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); }