--- a/eric7/E5Gui/E5SideBar.py Mon May 17 19:58:15 2021 +0200 +++ b/eric7/E5Gui/E5SideBar.py Tue May 18 18:19:47 2021 +0200 @@ -8,10 +8,9 @@ """ import enum +import json -from PyQt6.QtCore import ( - QEvent, QSize, Qt, QByteArray, QDataStream, QIODevice, QTimer -) +from PyQt6.QtCore import QEvent, QSize, Qt, QTimer from PyQt6.QtWidgets import ( QTabBar, QWidget, QStackedWidget, QBoxLayout, QToolButton, QSizePolicy ) @@ -580,19 +579,16 @@ self.__minSize = self.minimumSizeHint().width() self.__maxSize = self.maximumWidth() - data = QByteArray() - stream = QDataStream(data, QIODevice.OpenModeFlag.WriteOnly) - stream.setVersion(QDataStream.Version.Qt_6_1) - - stream.writeUInt16(self.Version) - stream.writeBool(self.__minimized) - stream << self.__bigSize - stream.writeUInt32(self.__minSize) - stream.writeUInt32(self.__maxSize) - stream.writeUInt32(len(self.splitterSizes)) - for size in self.splitterSizes: - stream.writeUInt32(size) - stream.writeBool(self.__autoHide) + dataDict = { + "version": self.Version, + "minimized": self.__minimized, + "big_size": [self.__bigSize.width(), self.__bigSize.height()], + "min_size": self.__minSize, + "max_size": self.__maxSize, + "splitter_sizes": self.splitterSizes, + "auto_hide": self.__autoHide + } + data = json.dumps(dataDict) return data @@ -603,7 +599,15 @@ @param state byte array containing the saved state (QByteArray) @return flag indicating success (boolean) """ - if state.isEmpty(): + if not isinstance(state, str) or state == "": + return False + + try: + stateDict = json.loads(state) + except json.JSONDecodeError: + return False + + if not stateDict: return False if self.__orientation in (E5SideBarSide.NORTH, E5SideBarSide.SOUTH): @@ -613,44 +617,24 @@ minSize = self.layout.minimumSize().width() maxSize = self.maximumWidth() - data = QByteArray(state) - stream = QDataStream(data, QIODevice.OpenModeFlag.ReadOnly) - stream.setVersion(QDataStream.Version.Qt_6_1) - version = stream.readUInt16() # version - minimized = stream.readBool() - - if minimized and not self.__minimized: - self.shrink() + if stateDict["version"] == 2: + if stateDict["minimized"] and not self.__minimized: + self.shrink() + + self.__bigSize = QSize(*stateDict["big_size"]) + self.__minSize = max(stateDict["min_size"], minSize) + self.__maxSize = max(stateDict["max_size"], maxSize) + self.splitterSizes = stateDict["splitter_sizes"] + + self.__autoHide = stateDict["auto_hide"] + self.__autoHideButton.setChecked(not self.__autoHide) + + if not stateDict["minimized"]: + self.expand() + + return True - stream >> self.__bigSize - if version == 1: - self.__minSize = max(stream.readUInt16(), minSize) - self.__maxSize = max(stream.readUInt16(), maxSize) - count = stream.readUInt16() - self.splitterSizes = [] - for _ in range(count): - self.splitterSizes.append(stream.readUInt16()) - elif version == 2: - self.__minSize = max(stream.readUInt32(), minSize) - self.__maxSize = max(stream.readUInt32(), maxSize) - count = stream.readUInt32() - self.splitterSizes = [] - for _ in range(count): - self.splitterSizes.append(stream.readUInt32()) - else: - # TODO: determine why version is always 0 - # set some defaults for unknown versions - self.__minSize = minSize - self.__maxSize = maxSize - self.splitterSizes = [] - - self.__autoHide = stream.readBool() - self.__autoHideButton.setChecked(not self.__autoHide) - - if not minimized: - self.expand() - - return True + return False ####################################################################### ## methods below implement the autohide functionality