123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 |
- from collections import deque
- import os
- from typing import TYPE_CHECKING, Optional, List, Dict, Any, Deque
- from PyQt5.QtCore import QUrl, Qt, pyqtSlot, pyqtProperty, pyqtSignal
- from UM.Logger import Logger
- from UM.Qt.ListModel import ListModel
- from UM.Resources import Resources
- if TYPE_CHECKING:
- from PyQt5.QtCore import QObject
- class WelcomePagesModel(ListModel):
- IdRole = Qt.UserRole + 1
- PageUrlRole = Qt.UserRole + 2
- NextPageIdRole = Qt.UserRole + 3
- def __init__(self, parent: Optional["QObject"] = None) -> None:
- super().__init__(parent)
- self.addRoleName(self.IdRole, "id")
- self.addRoleName(self.PageUrlRole, "page_url")
- self.addRoleName(self.NextPageIdRole, "next_page_id")
- self._pages = []
- self._current_page_index = 0
-
- self._previous_page_indices_stack = deque()
- allFinished = pyqtSignal()
- currentPageIndexChanged = pyqtSignal()
- @pyqtProperty(int, notify = currentPageIndexChanged)
- def currentPageIndex(self) -> int:
- return self._current_page_index
-
- @pyqtProperty(float, notify = currentPageIndexChanged)
- def currentProgress(self) -> float:
- return self._current_page_index / len(self._items)
-
- @pyqtProperty(bool, notify = currentPageIndexChanged)
- def isCurrentPageLast(self) -> bool:
- return self._current_page_index == len(self._items) - 1
- def _setCurrentPageIndex(self, page_index: int) -> None:
- if page_index != self._current_page_index:
- self._previous_page_indices_stack.append(self._current_page_index)
- self._current_page_index = page_index
- self.currentPageIndexChanged.emit()
-
- @pyqtSlot()
- def goToNextPage(self) -> None:
- page_item = self._items[self._current_page_index]
-
-
- next_page_id = page_item.get("next_page_id")
- next_page_index = self._current_page_index + 1
- if next_page_id:
- idx = self.getPageIndexById(next_page_id)
- if idx is None:
-
- Logger.log("e", "Cannot find page with ID [%s]", next_page_id)
- return
- next_page_index = idx
-
- if next_page_index == len(self._items):
- self.allFinished.emit()
- self.resetState()
-
- self._setCurrentPageIndex(next_page_index)
-
- @pyqtSlot()
- def goToPreviousPage(self) -> None:
- if len(self._previous_page_indices_stack) == 0:
- Logger.log("i", "No previous page, do nothing")
- return
- previous_page_index = self._previous_page_indices_stack.pop()
- self._current_page_index = previous_page_index
- self.currentPageIndexChanged.emit()
-
- @pyqtSlot(str)
- def goToPage(self, page_id: str) -> None:
- page_index = self.getPageIndexById(page_id)
- if page_index is None:
-
- Logger.log("e", "Cannot find page with ID [%s]", page_index)
- return
-
- self._setCurrentPageIndex(page_index)
-
-
-
- @pyqtSlot()
- def resetState(self) -> None:
- self._current_page_index = 0
- self._previous_page_indices_stack.clear()
- self.currentPageIndexChanged.emit()
-
- def getPageIndexById(self, page_id: str) -> Optional[int]:
- page_idx = None
- for idx, page_item in enumerate(self._items):
- if page_item["id"] == page_id:
- page_idx = idx
- break
- return page_idx
-
- def _getBuiltinWelcomePagePath(self, page_filename: str) -> "QUrl":
- from cura.CuraApplication import CuraApplication
- return QUrl.fromLocalFile(Resources.getPath(CuraApplication.ResourceTypes.QmlFiles,
- os.path.join("WelcomePages", page_filename)))
- def initialize(self) -> None:
-
- self._pages.append({"id": "welcome",
- "page_url": self._getBuiltinWelcomePagePath("WelcomeContent.qml"),
- })
- self._pages.append({"id": "user_agreement",
- "page_url": self._getBuiltinWelcomePagePath("UserAgreementContent.qml"),
- })
- self._pages.append({"id": "whats_new",
- "page_url": self._getBuiltinWelcomePagePath("WhatsNewContent.qml"),
- })
- self._pages.append({"id": "data_collections",
- "page_url": self._getBuiltinWelcomePagePath("DataCollectionsContent.qml"),
- })
- self._pages.append({"id": "add_network_or_local_printer",
- "page_url": self._getBuiltinWelcomePagePath("AddNetworkOrLocalPrinterContent.qml"),
- "next_page_id": "cloud",
- })
- self._pages.append({"id": "add_printer_by_ip",
- "page_url": self._getBuiltinWelcomePagePath("AddPrinterByIpContent.qml"),
- "next_page_id": "cloud",
- })
- self._pages.append({"id": "cloud",
- "page_url": self._getBuiltinWelcomePagePath("CloudContent.qml"),
- })
- self.setItems(self._pages)
- def addPage(self) -> None:
- pass
- __all__ = ["WelcomePagesModel"]
|