FreeCAD

Форк
0
/
composite_view.py 
160 строк · 7.2 Кб
1
# SPDX-License-Identifier: LGPL-2.1-or-later
2
# ***************************************************************************
3
# *                                                                         *
4
# *   Copyright (c) 2022-2024 FreeCAD Project Association                   *
5
# *                                                                         *
6
# *   This file is part of FreeCAD.                                         *
7
# *                                                                         *
8
# *   FreeCAD is free software: you can redistribute it and/or modify it    *
9
# *   under the terms of the GNU Lesser General Public License as           *
10
# *   published by the Free Software Foundation, either version 2.1 of the  *
11
# *   License, or (at your option) any later version.                       *
12
# *                                                                         *
13
# *   FreeCAD is distributed in the hope that it will be useful, but        *
14
# *   WITHOUT ANY WARRANTY; without even the implied warranty of            *
15
# *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      *
16
# *   Lesser General Public License for more details.                       *
17
# *                                                                         *
18
# *   You should have received a copy of the GNU Lesser General Public      *
19
# *   License along with FreeCAD. If not, see                               *
20
# *   <https://www.gnu.org/licenses/>.                                      *
21
# *                                                                         *
22
# ***************************************************************************
23

24
""" Provides a class for showing the list view and detail view at the same time. """
25

26
import base64
27

28
from addonmanager_freecad_interface import Preferences
29

30
from Addon import Addon
31
from Widgets.addonmanager_widget_package_details_view import PackageDetailsView
32
from addonmanager_package_details_controller import PackageDetailsController
33
from Widgets.addonmanager_widget_view_selector import AddonManagerDisplayStyle
34
from package_list import PackageList
35

36
# Get whatever version of PySide we can
37
try:
38
    import PySide  # Use the FreeCAD wrapper
39
except ImportError:
40
    try:
41
        import PySide6  # Outside FreeCAD, try Qt6 first
42

43
        PySide = PySide6
44
    except ImportError:
45
        import PySide2  # Fall back to Qt5 (if this fails, Python will kill this module's import)
46

47
        PySide = PySide2
48

49
from PySide import QtCore, QtWidgets
50

51

52
class CompositeView(QtWidgets.QWidget):
53
    """A widget that displays the Addon Manager's top bar, the list of Addons, and the detail
54
    view. Depending on the view mode selected, these may all be displayed at once, or selecting
55
    an addon in the list may case the list to hide and the detail view to show."""
56

57
    install = QtCore.Signal(Addon)
58
    uninstall = QtCore.Signal(Addon)
59
    update = QtCore.Signal(Addon)
60
    execute = QtCore.Signal(Addon)
61
    update_status = QtCore.Signal(Addon)
62
    check_for_update = QtCore.Signal(Addon)
63

64
    def __init__(self, parent=None):
65
        super().__init__(parent)
66
        self.package_details = PackageDetailsView(self)
67
        self.package_details_controller = PackageDetailsController(self.package_details)
68
        self.package_list = PackageList(self)
69
        prefs = Preferences()
70
        self.display_style = prefs.get("ViewStyle")
71
        self.main_layout = QtWidgets.QHBoxLayout(self)
72
        self.splitter = QtWidgets.QSplitter(self)
73
        self.splitter.addWidget(self.package_list)
74
        self.package_list.setSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
75
        self.splitter.addWidget(self.package_details)
76
        self.package_details.setSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
77
        self.splitter.setOrientation(QtCore.Qt.Horizontal)
78
        self.splitter.setContentsMargins(0, 0, 0, 0)
79
        self.splitter.setSizePolicy(
80
            QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding
81
        )
82
        self.main_layout.addWidget(self.splitter)
83
        self.layout().setContentsMargins(0, 0, 0, 0)
84
        self._setup_ui()
85
        self._setup_connections()
86
        self._restore_splitter_state()
87

88
    def _save_splitter_state(self):
89
        """Write the splitter state into an Addon manager preference, CompositeSplitterState"""
90
        prefs = Preferences()
91
        state = self.splitter.saveState()
92
        encoded = base64.b64encode(state).decode("ASCII")
93
        prefs.set("CompositeSplitterState", encoded)
94

95
    def _restore_splitter_state(self):
96
        """Restore the splitter state from CompositeSplitterState"""
97
        prefs = Preferences()
98
        encoded = prefs.get("CompositeSplitterState")
99
        if encoded:
100
            state = base64.b64decode(encoded)
101
            self.splitter.restoreState(state)
102

103
    def setModel(self, model):
104
        self.package_list.setModel(model)
105

106
    def set_display_style(self, style: AddonManagerDisplayStyle):
107
        self.display_style = style
108
        self._setup_ui()
109

110
    def _setup_ui(self):
111
        if self.display_style == AddonManagerDisplayStyle.EXPANDED:
112
            self._setup_expanded_ui()
113
        elif self.display_style == AddonManagerDisplayStyle.COMPACT:
114
            self._setup_compact_ui()
115
        elif self.display_style == AddonManagerDisplayStyle.COMPOSITE:
116
            self._setup_composite_ui()
117
        else:
118
            raise RuntimeError("Invalid display style")
119
        self.package_list.set_view_style(self.display_style)
120

121
    def _setup_expanded_ui(self):
122
        self.package_list.show()
123
        self.package_details.hide()
124
        self.package_details.button_bar.set_show_back_button(True)
125

126
    def _setup_compact_ui(self):
127
        self.package_list.show()
128
        self.package_details.hide()
129
        self.package_details.button_bar.set_show_back_button(True)
130

131
    def _setup_composite_ui(self):
132
        self.package_list.show()
133
        self.package_details.show()
134
        self.package_details.button_bar.set_show_back_button(False)
135

136
    def _setup_connections(self):
137
        self.package_list.itemSelected.connect(self.addon_selected)
138
        self.package_details_controller.back.connect(self._back_button_clicked)
139
        self.package_details_controller.install.connect(self.install)
140
        self.package_details_controller.uninstall.connect(self.uninstall)
141
        self.package_details_controller.update.connect(self.update)
142
        self.package_details_controller.execute.connect(self.execute)
143
        self.package_details_controller.update_status.connect(self.update_status)
144
        self.package_list.ui.view_bar.view_changed.connect(self.set_display_style)
145
        self.splitter.splitterMoved.connect(self._splitter_moved)
146

147
    def addon_selected(self, addon):
148
        self.package_details_controller.show_repo(addon)
149
        if self.display_style != AddonManagerDisplayStyle.COMPOSITE:
150
            self.package_list.hide()
151
            self.package_details.show()
152
            self.package_details.button_bar.set_show_back_button(True)
153

154
    def _back_button_clicked(self):
155
        if self.display_style != AddonManagerDisplayStyle.COMPOSITE:
156
            self.package_list.show()
157
            self.package_details.hide()
158

159
    def _splitter_moved(self, position: int, index: int) -> None:
160
        self._save_splitter_state()
161

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.