From bac074e37decb1504be416314cc2fa5588dd503f Mon Sep 17 00:00:00 2001 From: Chris Hennes Date: Fri, 21 Jun 2024 14:53:56 -0500 Subject: [PATCH] Addon Manager: Remember scroll position on Back (#14753) * Addon Manager: Remember scroll position on Back * Addon Manager: Linter cleanup --- src/Mod/AddonManager/composite_view.py | 28 ++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/src/Mod/AddonManager/composite_view.py b/src/Mod/AddonManager/composite_view.py index bba9dff9ba..f0b52c0d73 100644 --- a/src/Mod/AddonManager/composite_view.py +++ b/src/Mod/AddonManager/composite_view.py @@ -29,8 +29,8 @@ from addonmanager_freecad_interface import Preferences from Addon import Addon from Widgets.addonmanager_widget_package_details_view import PackageDetailsView -from addonmanager_package_details_controller import PackageDetailsController from Widgets.addonmanager_widget_view_selector import AddonManagerDisplayStyle +from addonmanager_package_details_controller import PackageDetailsController from package_list import PackageList # Get whatever version of PySide we can @@ -38,13 +38,10 @@ try: import PySide # Use the FreeCAD wrapper except ImportError: try: - import PySide6 # Outside FreeCAD, try Qt6 first - - PySide = PySide6 + import PySide6 as PySide # Outside FreeCAD, try Qt6 first except ImportError: - import PySide2 # Fall back to Qt5 (if this fails, Python will kill this module's import) - - PySide = PySide2 + # Fall back to Qt5 (if this fails, Python will kill this module's import) + import PySide2 as PySide from PySide import QtCore, QtWidgets @@ -84,6 +81,7 @@ class CompositeView(QtWidgets.QWidget): self._setup_ui() self._setup_connections() self._restore_splitter_state() + self.scroll_position = 0 def _save_splitter_state(self): """Write the splitter state into an Addon manager preference, CompositeSplitterState""" @@ -145,16 +143,30 @@ class CompositeView(QtWidgets.QWidget): self.splitter.splitterMoved.connect(self._splitter_moved) def addon_selected(self, addon): + """Depending on the display_style, show addon details (possibly hiding the package_list + widget in the process.""" self.package_details_controller.show_repo(addon) if self.display_style != AddonManagerDisplayStyle.COMPOSITE: + self.scroll_position = ( + self.package_list.ui.listPackages.verticalScrollBar().sliderPosition() + ) + print(f"Saved slider position at {self.scroll_position}") self.package_list.hide() self.package_details.show() self.package_details.button_bar.set_show_back_button(True) def _back_button_clicked(self): if self.display_style != AddonManagerDisplayStyle.COMPOSITE: + print(f"Set slider position to {self.scroll_position}") self.package_list.show() self.package_details.hide() + # The following must be done *after* a cycle through the event loop + QtCore.QTimer.singleShot( + 0, + lambda: self.package_list.ui.listPackages.verticalScrollBar().setSliderPosition( + self.scroll_position + ), + ) - def _splitter_moved(self, position: int, index: int) -> None: + def _splitter_moved(self, _1: int, _2: int) -> None: self._save_splitter_state()