class Chapter(QtCore.QObject): """A Chapter""" pageChanged = QtCore.pyqtSignal(Page, int) def __init__(self, name=""): super(Chapter, self).__init__() self.name = name self.book = None self.root = SoSeparator() self.root.setName("Chapter:root") self.pagesSwitch = SoSwitch() self.pagesSwitch.setName("Chapter:pages") self.root.addChild(self.pagesSwitch) self.__pages = nodeDict() ## ============================ self.setupGui() def setupGui(self): ## self.widget has next, prev buttons, plus a QStackedWidget for holding per page controls self.widget = ChangePageUI() ## the initial state self.widget.previous.hide() self.widget.next.hide() connect(self.widget.next, "clicked(bool)", self.nextPage) connect(self.widget.previous, "clicked(bool)", self.prevPage) ## ============================ self.notesStack = QtGui.QStackedWidget() ## ============================ def setBook(self, book): self.book = book @property def pages(self): """The list of pages""" return self.__pages def createPage(self): """ Creates a new page and appends it to this chapter """ page = Page() self.addPage(page) return page def addPage(self, page): """ Adds 'page' to this chapter. page can be a Page or a SoNode. Searches page for a 'getGui' function, which should return a widget. @param page: Page | SoNode """ ## ============================ ## page can be a Page or SoNode root = getattr(page, "root", page) self.pages[root] = page self.pagesSwitch.addChild(root) ## ============================ guiLayout = QtGui.QVBoxLayout() guiLayout.setMargin(0) guiLayout.setSpacing(0) widget = QtGui.QWidget() widget.setObjectName("PageGui") widget.setLayout(guiLayout) self.widget.pageStack.addWidget(widget) ## ============================ notesLayout = QtGui.QVBoxLayout() notesLayout.setMargin(0) notesLayout.setSpacing(0) widget = QtGui.QWidget() widget.setObjectName("PageNotas") widget.setLayout(notesLayout) self.notesStack.addWidget(widget) ## ============================ ## this sets self.pagesSwitch, self.widget.pageStack, self.notasStack ## only change the page if theres a book already if self.book is not None: self.whichPage = len(self.pagesSwitch) - 1 ## ============================ guiLayout.addWidget(page.getGui()) notesLayout.addWidget(page.getNotes()) ## ============================ if len(self.pagesSwitch) == 2: self.widget.previous.show() self.widget.next.show() def getGui(self): return self.widget def getNotes(self): return self.notesStack def chapterSpecificIn(self): """code to be executed whenever the chapter is displayed this is intended for global changes to the scenegraph that are needed by this chapter """ pass @property def page(self): """the current page""" if self.whichPage < 0: return None return self.pages[self.pagesSwitch[self.whichPage]] def getWhichPage(self): """ Returns the index of the current page """ return self.pagesSwitch.whichChild.getValue() def setWhichPage(self, n): """ Activates the n-th page @param n: """ if len(self.pagesSwitch) > 0: self.pagesSwitch.getChild(n) self.pagesSwitch.whichChild = n self.widget.pageStack.setCurrentIndex(n) self.notesStack.setCurrentIndex(n) self.pageChanged.emit(self.page, n) whichPage = property(getWhichPage, setWhichPage) def changePage(self, direction): self.whichPage = (self.whichPage + direction) % len(self.pagesSwitch) def nextPage(self): self.changePage(1) def prevPage(self): self.changePage(-1)