A stack of documents

I said I wouldn't do an emacs-like stack of documents without any surrounding GUI — but it was so easy. PyQt contains a very basic class, QWidgetStack, which can contain any number of widgets, though only one is shown at a time. This class is used in QWizard, QTabWidget and QTabDialog, but it can be very useful when used by itself, too.

"""
stackspace.py - stacked view manager for the mdi framework

copyright: (C) 2001, Boudewijn Rempt
email:     boud@rempt.xs4all.nl
"""
from qt import *
from resources import TRUE, FALSE

class StackSpace(QWidgetStack):

    def __init__(self, *args):
        apply(QWidgetStack.__init__,(self, ) + args)
        self.views=[]

    def addView(self, view):
        self.views.append(view)
        self.addWidget(view, len(self.views) - 1)
        self.raiseWidget(view)

    def removeView(self, view):
        if view in self.views:
            self.views.remove(view)
            self.removeWidget(view)
    

QWidgetStack is one of those classes that wants its children to be explicitly added and removed. You also have to give a numerical ID to identify the widget.

    def activeWindow(self):
        return self.visibleWidget()

    def cascade(self): pass

    def tile(self): pass

    def canCascade(self):
        return FALSE

    def canTile(self):
        return FALSE

    def windowList(self):
        return self.views

    def activateView(self, view):
        self.raiseWidget(view)
    

In contrast with all other view managers we have created up to now, QWidgetStack does not automatically raise a window when it gets focus. This means that we have to add a new method to the view manager interface— activateView. This has to be added to all other view managers, too, and there is a small change necessary in the application class MDIApp:

    def slotWindowMenuActivated(self, index):
        self.menuToWindowMap[index].setFocus()
    

becomes:

    def slotWindowMenuActivated(self, index):
        self.workspace.activateView(self.menuToWindowMap[index])
    

Of course, this is merely an example of the use of QWidgetStack. If you want to present your users with stacked document windows, you ought to offer more than a mere ‘window' menu for selecting windows— A keyboard interface, for instance, or perhaps a listview with icons for open documents to the left.