示例#1
0
文件: Window.py 项目: TienHP/Splat
class Window(QtGui.QMainWindow):
    def __init__(self, parent=None):
        print >> sys.stderr, 'Window::init()'
        QtGui.QMainWindow.__init__(self, None, QtCore.Qt.Tool|QtCore.Qt.FramelessWindowHint)
        self.setFocusPolicy(QtCore.Qt.StrongFocus)
        self.setAttribute(QtCore.Qt.WA_QuitOnClose, True)
        self.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint)
        self.setWindowTitle('FYP module 2012')
        self.select_img_folder()

    def select_img_folder(self):
        fd = QtGui.QFileDialog(caption="Select image folder")
        tree = fd.findChild(QtGui.QTreeView)
        tree.setRootIsDecorated(True)
        tree.setItemsExpandable(True)
        fd.setFileMode(QtGui.QFileDialog.Directory)
        fd.setViewMode(QtGui.QFileDialog.Detail)
        if fd.exec_():
            self.init_ui(str(fd.selectedFiles()[0]))
        else:
            sys.exit(0)

    def init_ui(self, directory):
        # UI style
        QtGui.QApplication.setStyle(QtGui.QStyleFactory.create('macintosh'))
        # UI position
        self.move(0, 0)
        self.resolution = QtGui.QDesktopWidget().availableGeometry()
        self.setGeometry(self.resolution)
        self.showFullScreen()

        # UI components
        self.splitter = QtGui.QSplitter(QtCore.Qt.Horizontal)
        # pane1
        self.left = QtGui.QFrame(self)
        self.left.setFrameShape(QtGui.QFrame.StyledPanel)

        self.scene = QtGui.QGraphicsScene()
        self.view = GraphicsView(None, self.scene, self.left)
        self.view.setDragMode(QtGui.QGraphicsView.ScrollHandDrag)
        self.view.setMinimumSize(.8*self.resolution.width(),
            self.resolution.height())
        self.view.setCacheMode(QtGui.QGraphicsView.CacheBackground)
        self.view.setViewportUpdateMode(QtGui.QGraphicsView.BoundingRectViewportUpdate)
        self.splitter.addWidget(self.view)

        # pane2
        self.right = QtGui.QSplitter(QtCore.Qt.Vertical)
        self.right_top_model = QtGui.QDirModel()
        self.right_top_model.setNameFilters(['*.png'])
        self.right_top_model.setFilter(QtCore.QDir.AllDirs|QtCore.QDir.Files|
            QtCore.QDir.NoDotAndDotDot|QtCore.QDir.CaseSensitive)
        self.right_top_model.setSorting(QtCore.QDir.Name|QtCore.QDir.DirsFirst)
        self.right_top_tree = FileTree(self.right_top_model, directory)
        QtCore.QObject.connect(self.right_top_tree,
            QtCore.SIGNAL("clicked(QModelIndex)"), self.right_top_clicked)
        self.right.addWidget(self.right_top_tree)
        self.right_bottom_tree = FileTree(None, directory)
        QtCore.QObject.connect(self.right_bottom_tree,
            QtCore.SIGNAL("clicked(QModelIndex)"), self.right_bottom_clicked)
        self.right.addWidget(self.right_bottom_tree)
        self.splitter.addWidget(self.right)
        self.setCentralWidget(self.splitter)

    def load_image(self, filename, qwidget):
        print >> sys.stderr, "Window::load_image(%s)" % filename
        self.filename = filename
        self.qwidget = qwidget
        if filename and os.path.isfile(filename) \
            and os.path.splitext(filename)[1].endswith('.png'):
            [self.scene.removeItem(item) for item in self.scene.items()]
            self.image = Image.open(str(filename))
            width, height = self.image.size
            self.pixmap = QtGui.QPixmap(filename)
            self.qgpi = QtGui.QGraphicsPixmapItem(self.pixmap)
            self.scene.addItem(self.qgpi)
            self.scene.setSceneRect(self.scene.itemsBoundingRect())
            self.view.centerOn(self.view.size().width()/2,
                self.view.size().height()/2)
            assert len(self.scene.items()) == 1
            self.view.scene  = self.scene
            self.view.pixmap = self.pixmap
#            print >> sys.stderr, self.left.size(), self.view.size(), self.scene.sceneRect(), self.scene.itemsBoundingRect(), (width, height)

    def right_top_clicked(self, index):
        print >> sys.stderr, 'Window::right_top_clicked()'
        if index and index.isValid() and index.row() >= 0:
            model = index.model()
            if model:
                path = str(model.filePath(index))
                if os.path.isfile(path) \
                    and os.path.splitext(path)[1].endswith('.png'):
                    print >> sys.stderr, 'Window::show_image(%s)' % path
                    self.load_image(path, self.left)

                    self.right_bottom_tree.setModel(None)
                elif os.path.isdir(path) and model.isDir(index):
                    print >> sys.stderr, 'Window::show_dir(%s)' % path

                    self.model = QtGui.QDirModel()
                    self.model.setNameFilters(['*.png'])
                    self.model.setFilter(QtCore.QDir.Files|
                        QtCore.QDir.NoDotAndDotDot|QtCore.QDir.CaseSensitive)
                    self.model.setSorting(QtCore.QDir.Name)

                    self.right_bottom_tree.setModel(self.model)
                    self.right_bottom_tree.setRootIndex(self.model.index(path))
                    [self.right_bottom_tree.hideColumn(n) for n in xrange(1,4)]
                    self.right_bottom_tree.header().hide()
                    self.right_bottom_tree.setColumnWidth(0,256)

                    # clear image loaded
    def right_bottom_clicked(self, index):
        if index and index.isValid() and index.row() >= 0:
            model = index.model()
            if model:
                path = str(model.filePath(index))
                if os.path.isfile(path) \
                    and os.path.splitext(path)[1].endswith('.png'):
                        print >> sys.stderr, 'Window::right_bottom_clicked(%s)' % path
                        self.load_image(path, self.left)

    def keyPressEvent(self, event):
        if isinstance(event, QtGui.QKeyEvent):
            event.accept()
        else:
            event.ignore()
        if event.key() == QtCore.Qt.Key_Q \
            and QtGui.QMessageBox.question(self, 'Question',
                "Exit application?", QtGui.QMessageBox.Yes|QtGui.QMessageBox.No,
                QtGui.QMessageBox.No) == QtGui.QMessageBox.Yes:
                self.close()
                sys.exit(0)
        QtGui.QMainWindow.keyPressEvent(self,event)
    def handleMessage(self, message):
        print >> sys.stderr, 'Window::handleMessage(%s)' % message

    def closeEvent(self, event):
        QtGui.QApplication.instance().quit()