Пример #1
0
    def __init__(self,
                 parent,
                 widgetsUpdateManager,
                 repo,
                 userLogin,
                 items,
                 startItemIndex=0):
        '''
            parent --- parent of this widget.
            widgetsUpdateManager --- object that would inform other widgets that some
        Item has changed after edit action.
            items --- a list of items to show.
            startItemIndex --- index of the first item to show.

        be able to edit items.
        '''
        super(ImageViewer, self).__init__(parent)
        self.ui = Ui_ImageViewer()
        self.ui.setupUi(self)
        self.setWindowModality(Qt.WindowModal)

        self.__widgetsUpdateManager = widgetsUpdateManager
        self.connect(self, QtCore.SIGNAL("handlerSignal"),
                     self.__widgetsUpdateManager.onHandlerSignal)
        self.connect(self, QtCore.SIGNAL("handlerSignals"),
                     self.__widgetsUpdateManager.onHandlerSignals)

        self.items = items
        self.i_current = startItemIndex if 0 <= startItemIndex < len(
            items) else 0
        self.repo = repo
        self.user_login = userLogin

        self.ui.canvas = Canvas(self)
        self.setCentralWidget(self.ui.canvas)

        self.__renderCurrentItemFile()

        self.connect(self.ui.action_prev, QtCore.SIGNAL("triggered()"),
                     self.action_prev)
        self.connect(self.ui.action_next, QtCore.SIGNAL("triggered()"),
                     self.action_next)
        self.connect(self.ui.action_zoom_in, QtCore.SIGNAL("triggered()"),
                     self.action_zoom_in)
        self.connect(self.ui.action_zoom_out, QtCore.SIGNAL("triggered()"),
                     self.action_zoom_out)
        self.connect(self.ui.action_fit_window,
                     QtCore.SIGNAL("triggered(bool)"), self.action_fit_window)
        self.ui.action_fit_window.setChecked(self.ui.canvas.fit_window)

        self.connect(self.ui.action_edit_item, QtCore.SIGNAL("triggered()"),
                     self.action_edit_item)

        self.connect(self.ui.canvas, QtCore.SIGNAL("fit_window_changed"), \
                     lambda x: self.ui.action_fit_window.setChecked(x))

        # Trying to restore window size
        try:
            width = int(UserConfig().get("image_viewer.width", 640))
            height = int(UserConfig().get("image_viewer.height", 480))
            self.resize(width, height)
        except:
            pass

        # This code stores window size (after window resizing)
        self.save_state_timer = QtCore.QTimer(self)
        self.save_state_timer.setSingleShot(True)
        self.connect(self.save_state_timer, QtCore.SIGNAL("timeout()"),
                     self.save_window_state)

        #Context menu
        self.menu = QtGui.QMenu()
        self.menu.addAction(self.ui.action_edit_item)
        self.ui.canvas.setContextMenuPolicy(Qt.CustomContextMenu)
        self.connect(self.ui.canvas, QtCore.SIGNAL("customContextMenuRequested(const QPoint &)"), \
                     lambda pos: self.menu.exec_(self.ui.canvas.mapToGlobal(pos)))
Пример #2
0
    def __init__(self, parent, widgetsUpdateManager, repo, userLogin, items, startItemIndex=0):
        '''
            parent --- parent of this widget.
            widgetsUpdateManager --- object that would inform other widgets that some
        Item has changed after edit action.
            items --- a list of items to show.
            startItemIndex --- index of the first item to show.

        be able to edit items.
        '''
        super(ImageViewer, self).__init__(parent)
        self.ui = Ui_ImageViewer()
        self.ui.setupUi(self)
        self.setWindowModality(Qt.WindowModal)

        self.__widgetsUpdateManager = widgetsUpdateManager
        self.connect(self, QtCore.SIGNAL("handlerSignal"),
                     self.__widgetsUpdateManager.onHandlerSignal)
        self.connect(self, QtCore.SIGNAL("handlerSignals"),
                     self.__widgetsUpdateManager.onHandlerSignals)

        self.items = items
        self.i_current = startItemIndex if 0 <= startItemIndex < len(items) else 0
        self.repo = repo
        self.user_login = userLogin

        self.ui.canvas = Canvas(self)
        self.setCentralWidget(self.ui.canvas)

        self.__renderCurrentItemFile()

        self.connect(self.ui.action_prev, QtCore.SIGNAL("triggered()"), self.action_prev)
        self.connect(self.ui.action_next, QtCore.SIGNAL("triggered()"), self.action_next)
        self.connect(self.ui.action_zoom_in, QtCore.SIGNAL("triggered()"), self.action_zoom_in)
        self.connect(self.ui.action_zoom_out, QtCore.SIGNAL("triggered()"), self.action_zoom_out)
        self.connect(self.ui.action_fit_window, QtCore.SIGNAL("triggered(bool)"), self.action_fit_window)
        self.ui.action_fit_window.setChecked(self.ui.canvas.fit_window)

        self.connect(self.ui.action_edit_item, QtCore.SIGNAL("triggered()"), self.action_edit_item)

        self.connect(self.ui.canvas, QtCore.SIGNAL("fit_window_changed"), \
                     lambda x: self.ui.action_fit_window.setChecked(x))

        # Trying to restore window size
        try:
            width = int(UserConfig().get("image_viewer.width", 640))
            height = int(UserConfig().get("image_viewer.height", 480))
            self.resize(width, height)
        except:
            pass

        # This code stores window size (after window resizing)
        self.save_state_timer = QtCore.QTimer(self)
        self.save_state_timer.setSingleShot(True)
        self.connect(self.save_state_timer, QtCore.SIGNAL("timeout()"), self.save_window_state)

        #Context menu
        self.menu = QtGui.QMenu()
        self.menu.addAction(self.ui.action_edit_item)
        self.ui.canvas.setContextMenuPolicy(Qt.CustomContextMenu)
        self.connect(self.ui.canvas, QtCore.SIGNAL("customContextMenuRequested(const QPoint &)"), \
                     lambda pos: self.menu.exec_(self.ui.canvas.mapToGlobal(pos)))
Пример #3
0
class ImageViewer(QtGui.QMainWindow):
    '''
    This is a built-in Reggata Image Viewer.
    '''
    def __init__(self,
                 parent,
                 widgetsUpdateManager,
                 repo,
                 userLogin,
                 items,
                 startItemIndex=0):
        '''
            parent --- parent of this widget.
            widgetsUpdateManager --- object that would inform other widgets that some
        Item has changed after edit action.
            items --- a list of items to show.
            startItemIndex --- index of the first item to show.

        be able to edit items.
        '''
        super(ImageViewer, self).__init__(parent)
        self.ui = Ui_ImageViewer()
        self.ui.setupUi(self)
        self.setWindowModality(Qt.WindowModal)

        self.__widgetsUpdateManager = widgetsUpdateManager
        self.connect(self, QtCore.SIGNAL("handlerSignal"),
                     self.__widgetsUpdateManager.onHandlerSignal)
        self.connect(self, QtCore.SIGNAL("handlerSignals"),
                     self.__widgetsUpdateManager.onHandlerSignals)

        self.items = items
        self.i_current = startItemIndex if 0 <= startItemIndex < len(
            items) else 0
        self.repo = repo
        self.user_login = userLogin

        self.ui.canvas = Canvas(self)
        self.setCentralWidget(self.ui.canvas)

        self.__renderCurrentItemFile()

        self.connect(self.ui.action_prev, QtCore.SIGNAL("triggered()"),
                     self.action_prev)
        self.connect(self.ui.action_next, QtCore.SIGNAL("triggered()"),
                     self.action_next)
        self.connect(self.ui.action_zoom_in, QtCore.SIGNAL("triggered()"),
                     self.action_zoom_in)
        self.connect(self.ui.action_zoom_out, QtCore.SIGNAL("triggered()"),
                     self.action_zoom_out)
        self.connect(self.ui.action_fit_window,
                     QtCore.SIGNAL("triggered(bool)"), self.action_fit_window)
        self.ui.action_fit_window.setChecked(self.ui.canvas.fit_window)

        self.connect(self.ui.action_edit_item, QtCore.SIGNAL("triggered()"),
                     self.action_edit_item)

        self.connect(self.ui.canvas, QtCore.SIGNAL("fit_window_changed"), \
                     lambda x: self.ui.action_fit_window.setChecked(x))

        # Trying to restore window size
        try:
            width = int(UserConfig().get("image_viewer.width", 640))
            height = int(UserConfig().get("image_viewer.height", 480))
            self.resize(width, height)
        except:
            pass

        # This code stores window size (after window resizing)
        self.save_state_timer = QtCore.QTimer(self)
        self.save_state_timer.setSingleShot(True)
        self.connect(self.save_state_timer, QtCore.SIGNAL("timeout()"),
                     self.save_window_state)

        #Context menu
        self.menu = QtGui.QMenu()
        self.menu.addAction(self.ui.action_edit_item)
        self.ui.canvas.setContextMenuPolicy(Qt.CustomContextMenu)
        self.connect(self.ui.canvas, QtCore.SIGNAL("customContextMenuRequested(const QPoint &)"), \
                     lambda pos: self.menu.exec_(self.ui.canvas.mapToGlobal(pos)))

    def keyPressEvent(self, event):
        if event.key() == Qt.Key_Plus:
            self.ui.canvas.zoom_in()
        elif event.key() == Qt.Key_Minus:
            self.ui.canvas.zoom_out()
        elif event.key() == Qt.Key_Space or event.key() == Qt.Key_Right:
            self.action_next()
        elif event.key() == Qt.Key_Backspace or event.key() == Qt.Key_Left:
            self.action_prev()
        elif event.key() == Qt.Key_Escape:
            self.close()
        else:
            super(ImageViewer, self).keyPressEvent(event)

    def wheelEvent(self, event):
        if event.delta() < 0:
            #scroll down
            self.action_next()
        else:
            #scroll up
            self.action_prev()

    def save_window_state(self):
        UserConfig().storeAll({
            "image_viewer.width": self.width(),
            "image_viewer.height": self.height()
        })

    def resizeEvent(self, resize_event):
        self.save_state_timer.start(3000)

    def action_zoom_in(self):
        try:
            self.ui.canvas.zoom_in()
        except Exception as ex:
            show_exc_info(self, ex)

    def action_zoom_out(self):
        try:
            self.ui.canvas.zoom_out()
        except Exception as ex:
            show_exc_info(self, ex)

    def action_fit_window(self, checked):
        try:
            self.ui.canvas.fit_window = checked
            self.update()
        except Exception as ex:
            show_exc_info(self, ex)

    def action_next(self):
        try:
            self.i_current += 1
            if self.i_current >= len(self.items):
                self.i_current = 0

            self.__renderCurrentItemFile()

        except Exception as ex:
            show_exc_info(self, ex)

    def action_prev(self):
        try:
            self.i_current -= 1
            if self.i_current < 0:
                self.i_current = len(self.items) - 1

            self.__renderCurrentItemFile()

        except Exception as ex:
            show_exc_info(self, ex)

    def __renderCurrentItemFile(self):
        item = self.items[self.i_current]
        if item.data_ref is not None:
            path = os.path.join(self.repo.base_path, item.data_ref.url)
        else:
            path = None
        self.ui.canvas.abs_path = path
        self.update()

        message = item.title + ", " + (path if path is not None else
                                       self.tr("No file"))
        self.ui.statusbar.showMessage(message)

    def __checkActiveRepoIsNotNone(self):
        if self.repo is None:
            raise MsgException(
                self.tr("Cannot edit items, repository is not given."))

    def __checkActiveUserIsNotNone(self):
        if helpers.is_none_or_empty(self.user_login):
            raise MsgException(
                self.tr("Cannot edit items, user is not given."))

    def action_edit_item(self):
        try:
            self.__checkActiveRepoIsNotNone()
            self.__checkActiveUserIsNotNone()

            itemId = self.items[self.i_current].id
            self.__editSingleItem(itemId)

        except Exception as ex:
            show_exc_info(self, ex)
        else:
            # TODO: pass some item id so widgets could update only edited item
            self.emit(QtCore.SIGNAL("handlerSignal"),
                      HandlerSignals.ITEM_CHANGED)

    def __editSingleItem(self, itemId):
        uow = self.repo.createUnitOfWork()
        try:
            item = uow.executeCommand(GetExpungedItemCommand(itemId))

            dialogs = UserDialogsFacade()
            if not dialogs.execItemDialog(item=item,
                                          gui=self,
                                          repo=self.repo,
                                          dialogMode=ItemDialog.EDIT_MODE):
                self.ui.statusbar.showMessage(self.tr("Operation cancelled."),
                                              consts.STATUSBAR_TIMEOUT)
                return

            srcAbsPath = item.data_ref.srcAbsPath if item.data_ref is not None else None
            dstRelPath = item.data_ref.dstRelPath if item.data_ref is not None else None
            cmd = UpdateExistingItemCommand(item, srcAbsPath, dstRelPath,
                                            self.user_login)
            uow.executeCommand(cmd)
            self.ui.statusbar.showMessage(self.tr("Operation completed."),
                                          consts.STATUSBAR_TIMEOUT)
        finally:
            uow.close()

    # This property is needed for partial compatibility with AbstractGui
    # It is called by DialogsFacade to create Completer object
    @property
    def model(self):
        class FakeModel(object):
            pass

        fakeModel = FakeModel()
        fakeModel.repo = self.repo
        return fakeModel
Пример #4
0
class ImageViewer(QtGui.QMainWindow):
    '''
    This is a built-in Reggata Image Viewer.
    '''

    def __init__(self, parent, widgetsUpdateManager, repo, userLogin, items, startItemIndex=0):
        '''
            parent --- parent of this widget.
            widgetsUpdateManager --- object that would inform other widgets that some
        Item has changed after edit action.
            items --- a list of items to show.
            startItemIndex --- index of the first item to show.

        be able to edit items.
        '''
        super(ImageViewer, self).__init__(parent)
        self.ui = Ui_ImageViewer()
        self.ui.setupUi(self)
        self.setWindowModality(Qt.WindowModal)

        self.__widgetsUpdateManager = widgetsUpdateManager
        self.connect(self, QtCore.SIGNAL("handlerSignal"),
                     self.__widgetsUpdateManager.onHandlerSignal)
        self.connect(self, QtCore.SIGNAL("handlerSignals"),
                     self.__widgetsUpdateManager.onHandlerSignals)

        self.items = items
        self.i_current = startItemIndex if 0 <= startItemIndex < len(items) else 0
        self.repo = repo
        self.user_login = userLogin

        self.ui.canvas = Canvas(self)
        self.setCentralWidget(self.ui.canvas)

        self.__renderCurrentItemFile()

        self.connect(self.ui.action_prev, QtCore.SIGNAL("triggered()"), self.action_prev)
        self.connect(self.ui.action_next, QtCore.SIGNAL("triggered()"), self.action_next)
        self.connect(self.ui.action_zoom_in, QtCore.SIGNAL("triggered()"), self.action_zoom_in)
        self.connect(self.ui.action_zoom_out, QtCore.SIGNAL("triggered()"), self.action_zoom_out)
        self.connect(self.ui.action_fit_window, QtCore.SIGNAL("triggered(bool)"), self.action_fit_window)
        self.ui.action_fit_window.setChecked(self.ui.canvas.fit_window)

        self.connect(self.ui.action_edit_item, QtCore.SIGNAL("triggered()"), self.action_edit_item)

        self.connect(self.ui.canvas, QtCore.SIGNAL("fit_window_changed"), \
                     lambda x: self.ui.action_fit_window.setChecked(x))

        # Trying to restore window size
        try:
            width = int(UserConfig().get("image_viewer.width", 640))
            height = int(UserConfig().get("image_viewer.height", 480))
            self.resize(width, height)
        except:
            pass

        # This code stores window size (after window resizing)
        self.save_state_timer = QtCore.QTimer(self)
        self.save_state_timer.setSingleShot(True)
        self.connect(self.save_state_timer, QtCore.SIGNAL("timeout()"), self.save_window_state)

        #Context menu
        self.menu = QtGui.QMenu()
        self.menu.addAction(self.ui.action_edit_item)
        self.ui.canvas.setContextMenuPolicy(Qt.CustomContextMenu)
        self.connect(self.ui.canvas, QtCore.SIGNAL("customContextMenuRequested(const QPoint &)"), \
                     lambda pos: self.menu.exec_(self.ui.canvas.mapToGlobal(pos)))


    def keyPressEvent(self, event):
        if event.key() == Qt.Key_Plus:
            self.ui.canvas.zoom_in()
        elif event.key() == Qt.Key_Minus:
            self.ui.canvas.zoom_out()
        elif event.key() == Qt.Key_Space or event.key() == Qt.Key_Right:
            self.action_next()
        elif event.key() == Qt.Key_Backspace or event.key() == Qt.Key_Left:
            self.action_prev()
        elif event.key() == Qt.Key_Escape:
            self.close()
        else:
            super(ImageViewer, self).keyPressEvent(event)

    def wheelEvent(self, event):
        if event.delta() < 0:
            #scroll down
            self.action_next()
        else:
            #scroll up
            self.action_prev()


    def save_window_state(self):
        UserConfig().storeAll({"image_viewer.width":self.width(), "image_viewer.height":self.height()})


    def resizeEvent(self, resize_event):
        self.save_state_timer.start(3000)

    def action_zoom_in(self):
        try:
            self.ui.canvas.zoom_in()
        except Exception as ex:
            show_exc_info(self, ex)

    def action_zoom_out(self):
        try:
            self.ui.canvas.zoom_out()
        except Exception as ex:
            show_exc_info(self, ex)

    def action_fit_window(self, checked):
        try:
            self.ui.canvas.fit_window = checked
            self.update()
        except Exception as ex:
            show_exc_info(self, ex)

    def action_next(self):
        try:
            self.i_current += 1
            if self.i_current >= len(self.items):
                self.i_current = 0

            self.__renderCurrentItemFile()

        except Exception as ex:
            show_exc_info(self, ex)

    def action_prev(self):
        try:
            self.i_current -= 1
            if self.i_current < 0:
                self.i_current = len(self.items) - 1

            self.__renderCurrentItemFile()

        except Exception as ex:
            show_exc_info(self, ex)


    def __renderCurrentItemFile(self):
        item = self.items[self.i_current]
        if item.data_ref is not None:
            path = os.path.join(self.repo.base_path, item.data_ref.url)
        else:
            path = None
        self.ui.canvas.abs_path = path
        self.update()

        message = item.title + ", " + (path if path is not None else self.tr("No file"))
        self.ui.statusbar.showMessage(message)



    def __checkActiveRepoIsNotNone(self):
        if self.repo is None:
            raise MsgException(self.tr("Cannot edit items, repository is not given."))

    def __checkActiveUserIsNotNone(self):
        if helpers.is_none_or_empty(self.user_login):
            raise MsgException(self.tr("Cannot edit items, user is not given."))


    def action_edit_item(self):
        try:
            self.__checkActiveRepoIsNotNone()
            self.__checkActiveUserIsNotNone()

            itemId = self.items[self.i_current].id
            self.__editSingleItem(itemId)

        except Exception as ex:
            show_exc_info(self, ex)
        else:
            # TODO: pass some item id so widgets could update only edited item
            self.emit(QtCore.SIGNAL("handlerSignal"), HandlerSignals.ITEM_CHANGED)


    def __editSingleItem(self, itemId):
        uow = self.repo.createUnitOfWork()
        try:
            item = uow.executeCommand(GetExpungedItemCommand(itemId))

            dialogs = UserDialogsFacade()
            if not dialogs.execItemDialog(
                item=item, gui=self, repo=self.repo, dialogMode=ItemDialog.EDIT_MODE):
                self.ui.statusbar.showMessage(self.tr("Operation cancelled."), consts.STATUSBAR_TIMEOUT)
                return

            srcAbsPath = item.data_ref.srcAbsPath if item.data_ref is not None else None
            dstRelPath = item.data_ref.dstRelPath if item.data_ref is not None else None
            cmd = UpdateExistingItemCommand(item, srcAbsPath, dstRelPath, self.user_login)
            uow.executeCommand(cmd)
            self.ui.statusbar.showMessage(self.tr("Operation completed."), consts.STATUSBAR_TIMEOUT)
        finally:
            uow.close()


    # This property is needed for partial compatibility with AbstractGui
    # It is called by DialogsFacade to create Completer object
    @property
    def model(self):
        class FakeModel(object):
            pass

        fakeModel = FakeModel()
        fakeModel.repo = self.repo
        return fakeModel