Beispiel #1
0
class SessionsManager(QDialog):
    """Session Manager, to load different configurations of ninja."""

    def __init__(self, parent=None):
        super(SessionsManager, self).__init__(parent, Qt.Dialog)
        self._ninja = parent
        self.setModal(True)
        self.setWindowTitle(translations.TR_SESSIONS_TITLE)
        self.setMinimumWidth(550)
        self.setMinimumHeight(450)
        self._manager = _SessionManager(parent)
        self._load_ui()

    def install(self):
        self._manager.load_sessions()

    def _load_ui(self):
        main_layout = QVBoxLayout(self)
        main_layout.addWidget(QLabel(translations.TR_SESSIONS_DIALOG_BODY))
        main_hbox = QHBoxLayout()
        # Session list
        session_layout = QVBoxLayout()
        self._session_list = QTreeWidget()
        self._session_list.setHeaderLabels(["Session", "Last Modified"])
        session_layout.addWidget(self._session_list)
        # Content frame
        content_frame = QFrame()
        content_frame.hide()
        frame_layout = QVBoxLayout(content_frame)
        content_frame.setFrameStyle(QFrame.StyledPanel | QFrame.Sunken)
        session_layout.addWidget(content_frame)
        frame_layout.setContentsMargins(0, 0, 0, 0)
        self._content_list = QTreeWidget()
        self._content_list.setHeaderHidden(True)
        frame_layout.addWidget(self._content_list)
        # Separator line
        line_frame = QFrame()
        line_frame.setFrameStyle(QFrame.VLine | QFrame.Sunken)
        # Buttons
        btn_layout = QVBoxLayout()
        btn_create = QPushButton(translations.TR_SESSIONS_BTN_CREATE)
        btn_activate = QPushButton(translations.TR_SESSIONS_BTN_ACTIVATE)
        btn_update = QPushButton(translations.TR_SESSIONS_BTN_UPDATE)
        btn_delete = QPushButton(translations.TR_SESSIONS_BTN_DELETE)
        btn_details = QPushButton(translations.TR_SESSIONS_BTN_DETAILS)
        btn_details.setCheckable(True)
        # Add buttons to layout
        btn_layout.addWidget(btn_create)
        btn_layout.addWidget(btn_activate)
        btn_layout.addWidget(btn_update)
        btn_layout.addWidget(btn_delete)
        btn_layout.addStretch()
        btn_layout.addWidget(btn_details)
        # Add widgets and layouts to the main layout
        main_layout.addLayout(main_hbox)
        main_hbox.addLayout(session_layout)
        main_hbox.addWidget(line_frame)
        main_hbox.addLayout(btn_layout)
        main_hbox.setSizeConstraint(QLayout.SetFixedSize)
        btn_details.toggled[bool].connect(content_frame.setVisible)
        # Connections
        self._session_list.itemSelectionChanged.connect(
            self.load_session_content)
        btn_activate.clicked.connect(self.open_session)
        btn_update.clicked.connect(self.save_session)
        btn_create.clicked.connect(self.create_session)
        btn_delete.clicked.connect(self.delete_session)

    def __load_sessions(self):
        for session_name in self._manager.sessions:
            item = QTreeWidgetItem()
            item.setText(0, session_name)
            item.setText(1, "FIXME: manage this!")
            self._session_list.addTopLevelItem(item)
        self._session_list.setCurrentItem(
            self._session_list.topLevelItem(0))

    def load_session_content(self):
        """Load the selected session, replacing the current session."""
        item = self._session_list.currentItem()
        self._content_list.clear()
        if item is not None:
            key = item.text(0)
            files, projects = self._manager.get_session(key)
            files_parent = QTreeWidgetItem(
                self._content_list, [translations.TR_FILES])
            for ffile in files:
                QTreeWidgetItem(files_parent, [ffile[0]])
            projects_parent = QTreeWidgetItem(
                self._content_list, [translations.TR_PROJECT])
            for project in projects:
                QTreeWidgetItem(projects_parent, [project])

            files_parent.setExpanded(True)
            projects_parent.setExpanded(True)

    def create_session(self):
        """Create a new Session."""
        session_info = QInputDialog.getText(
            None, translations.TR_SESSIONS_CREATE_TITLE,
            translations.TR_SESSIONS_CREATE_BODY)
        if session_info[1]:
            session_name = session_info[0]
            if not session_name or session_name in settings.SESSIONS:
                QMessageBox.information(
                    self,
                    translations.TR_SESSIONS_MESSAGE_TITLE,
                    translations.TR_SESSIONS_MESSAGE_BODY)
                return
            self._manager.save_session_data(session_name)
        self.close()

    def save_session(self):
        """Save current session"""
        if self._session_list.currentItem():
            session_name = self._session_list.currentItem().text(0)
            self._manager.save_session_data(session_name)
            self._ninja.show_message(
                translations.TR_SESSIONS_UPDATED_NOTIF.format(session_name))
            self.load_session_content()

    def open_session(self):
        """Open a saved session"""
        if self._session_list.currentItem():
            session_name = self._session_list.currentItem().text(0)
            self._manager.load_session(session_name)
            self._manager.set_current_session(session_name)
            self.close()

    def delete_session(self):
        """Delete a session"""
        if self._session_list.currentItem():
            key = self._session_list.currentItem().text(0)
            self._manager.delete_session(key)
            self._session_list.takeTopLevelItem(
                self._session_list.currentIndex().row())

    @property
    def current_session(self):
        return self._manager.current_session()

    def showEvent(self, event):
        super().showEvent(event)
        self.__load_sessions()

    def hideEvent(self, event):
        super().hideEvent(event)
        self._session_list.clear()
class Img_Tree(QFrame):
    """
    本class实现将加载的dict 转化为列表tree(Wb_Img|_background_img)视图
    """
    Tree_Click_Signal = pyqtSignal(list)

    def __init__(self, img_dict, *args, **kwargs):
        QFrame.__init__(self, *args, **kwargs)
        self.Tree = QTreeWidget(self)
        self.Tree.setDropIndicatorShown(True)
        self.Tree.setDragEnabled(True)
        self.Tree.viewport().acceptDrops()
        self.Tree.setDragDropMode(QAbstractItemView.InternalMove)
        self.img_dict = img_dict
        self.Tree.setHeaderHidden(True)
        self.imgs = []
        self.Save_Dir = ''
        self.Add_top_Level_Item(self.img_dict)
        self.layout = QVBoxLayout()
        self.layout.addWidget(self.Tree)
        self.setLayout(self.layout)
        self.Tree.clicked.connect(self.Tree_click)

    def Add_top_Level_Item(self, img_dict):
        if img_dict:
            for img in img_dict:
                c = My_TreeItem()
                _, File = os.path.split(img['wb'])
                c.setText(0, File)
                c.Path = img['wb']
                # 设置不可以被Drop
                c.setFlags(c.flags() & ~Qt.ItemIsDropEnabled)
                c.act_delete.triggered.connect(self.menu_delete)
                c.act_change.triggered.connect(self.menu_change)

                cc = My_TreeItem(c)
                cc.Type = 'BKGD'
                cc.act_change.triggered.connect(self.menu_change)
                _, File = os.path.split(img['bkgd'])
                cc.setText(0, File)
                cc.Path = img['bkgd']
                # 设置不可以被Drop
                cc.setFlags(cc.flags() & ~Qt.ItemIsDropEnabled)
                # 设置不可以被Drag
                cc.setFlags(cc.flags() & ~Qt.ItemIsDragEnabled)
                self.Tree.addTopLevelItem(c)
            self.imgs = self.imgs + img_dict

    def enable_bottom_btn(self, bool):
        if bool:
            self.Add_Btn = QPushButton('Add New', self)
            self.Add_Btn.clicked.connect(self.Open_Pop_Wid)
            self.layout.addWidget(self.Add_Btn)

    def enable_contextmenu(self, bool):
        if bool:
            self.Tree.itemPressed.connect(self.show_menu)

    @pyqtSlot(list)
    def connect_pop_wid(self, list):
        """
        将Pop_Wid选择的图片传递给左侧的文件树
        """
        self.Add_top_Level_Item(list)

    def Open_Pop_Wid(self):
        """
        显示弹窗事件
        """
        from Broswer_Image import Broswer_Img
        Pop = Broswer_Img(self)
        Pop.Close_Signal.connect(self.connect_pop_wid)
        Pop.show()

    def Tree_click(self, Index):
        t = self.Tree.currentItem()
        # 是顶层元素的时候
        if t.parent() is None and t.child(0) is not None:
            list = [t.Path, t.child(0).Path]
            if t.Img_Block_Pre is None:
                t.Img_Block_Pre = Img_Block_Pre(list, self)
            self.Tree_Click_Signal.emit([t.Img_Block_Pre])

    @pyqtSlot(list)
    def update_img_list(self, new_img_list):
        self.Tree.clear()
        self.Add_top_Level_Item(new_img_list)

    # 添加右键菜单事项
    def show_menu(self, item, int):
        if (QGuiApplication.mouseButtons() & Qt.RightButton):
            item.show_menu()

    # 右键菜单Action响应
    def menu_delete(self):
        self.Tree.takeTopLevelItem(self.Tree.currentIndex().row())

    def menu_change(self):
        item = self.Tree.currentItem()
        if item.Type == 'WB':
            # 调用增加窗口,同时显示WB 和 BKGD
            pass
        if item.Type == 'BKGD':
            # 只显示BKGD
            pass

    def Export_Raw(self):
        Tree_obj = self.Tree
        Imgs = []
        Infos=[]
        QFileDlg = QFileDialog.getExistingDirectory(self, "Select Save Dir",
                                                    self.Save_Dir)
        if QFileDlg:
            self.Save_Dir = QFileDlg
            for i in range(Tree_obj.topLevelItemCount()):
                t = Tree_obj.topLevelItem(i)
                Ib = t.Img_Block_Pre.ImgB
                Imgs.append({'wb': Ib.WB.FileName, 'bkgd': Ib.BG.FileName})
                info = Ib.Pack_Info()
                
                crops = info['crop']
                file = info['filename']
                rotation = info['rotation']
                flip_h = info['Flip_h']
                flip_v = info['Flip_v']
                cv_img = cv2RdImg(file)
                cv_img = CV_Img_Transform(cv_img, flip_h, flip_v, rotation)
                name = str(i)
                for crop in crops:
                    crop_name = crop['name']
                    if crop_name:
                        name += '_' + crop_name
                    crop_rect = crop['pos']
                    x, y, w, h = crop_rect
                    p1 = (x, y)
                    p2 = (x + w, y + h)
                    cv2DrawRect(cv_img, p1, p2)
                    cv2PutText(cv_img, crop_name, [p1, p2])
                cv_img = CV_Img_Transform(cv_img,
                                        flip_h,
                                        flip_v,
                                        -rotation,
                                        Cut_Edge_on_Rotation=True)
                cv2SaveTif(cv_img, os.path.join(self.Save_Dir, name + '_RAW.tif'))
                del info['src_img']
                info['w']=cv_img.shape[1]
                info['h']=cv_img.shape[0]
                Infos.append(info)
            jsondata = json.dumps(Imgs, ensure_ascii = False)
            infoJson=json.dumps(Infos,ensure_ascii= False)
            with open(os.path.join(self.Save_Dir,'Infos.json'),'w') as fh:
                fh.write(infoJson)
            fh = open(os.path.join(self.Save_Dir,'Imgs.json'), 'w')
            fh.write(jsondata)
            fh.close()
Beispiel #3
0
class UserWidget(QWidget):
    def __init__(self, parent=None):
        super(UserWidget, self).__init__(parent)
        self.__books = None

        self.book_service = BookService(self)
        self.user_id = UserService.user_id

        self.button_add_book = QPushButton('Add book')
        self.button_remove_book = QPushButton('Remove book')
        self.button_borrow_book = QPushButton('Borrow book')
        self.button_return_book = QPushButton('Return book')
        self.filter_choice = QComboBox()
        self.book_search_input = QLineEdit()
        self.book_list = QTreeWidget()
        self.button_logout = QPushButton('Logout')

        self.filter_choice.addItems(['All', 'Available', 'Borrowed'])
        self.button_remove_book.setEnabled(False)
        self.button_borrow_book.setEnabled(False)
        self.button_return_book.setEnabled(False)
        self.book_search_input.setPlaceholderText('Search books')
        self.book_list.setMinimumWidth(400)
        self.book_list.setHeaderLabels(['Author', 'Title', 'Publish year', 'Status'])
        self.book_list.setIndentation(0)

        left_column = QVBoxLayout()
        left_column.addWidget(self.filter_choice)
        left_column.addWidget(self.button_add_book)
        left_column.addWidget(self.button_remove_book)
        left_column.addWidget(self.button_borrow_book)
        left_column.addWidget(self.button_return_book)
        left_column.addStretch()
        left_column.addWidget(self.button_logout)

        right_column = QVBoxLayout()
        right_column.addWidget(self.book_search_input)
        right_column.addWidget(self.book_list)

        layout = QHBoxLayout()
        layout.addLayout(left_column)
        layout.addLayout(right_column)
        self.setLayout(layout)

        self.refresh()

        self.filter_choice.currentIndexChanged.connect(self.refresh)
        self.button_add_book.clicked.connect(self.add_book)
        self.button_remove_book.clicked.connect(
            lambda: self.book_service.delete_book(
                self.__books[self.book_list.currentIndex().row()]
            )
        )
        self.button_borrow_book.clicked.connect(
            lambda: self.book_service.borrow_book(
                self.__books[self.book_list.currentIndex().row()]
            )
        )
        self.button_return_book.clicked.connect(
            lambda: self.book_service.return_book(
                self.__books[self.book_list.currentIndex().row()]
            )
        )
        self.book_search_input.textChanged.connect(self.refresh)
        self.book_list.currentItemChanged.connect(self.book_choice)
        self.button_logout.clicked.connect(parent.request_logout)

    @pyqtSlot()
    def refresh(self):
        self.book_list.clear()
        self.apply_filters()
        for book in self.__books:
            item = QTreeWidgetItem([
                ', '.join([' '.join([author['name'], author['surname']]) for author in book['authors']]),
                book['title'],
                str(book['publishmentYear']),
                'Available' if book['assignUser'] is None else
                ('Unavailable' if book['assignUser']['id'] != self.user_id else 'Borrowed')
            ])
            self.book_list.addTopLevelItem(item)

    def apply_filters(self):
        self.__books = self.book_service.books
        search = self.book_search_input.text().lower()
        if search is not None:
            self.__books = filter(
                lambda x: True if x['title'].lower().find(search) > -1 \
                                  or str(x['publishmentYear']).find(search) > -1 \
                                  or any([author['surname'].find(search) > -1 for author in x['authors']]) else False,
                self.__books
            )
        if self.filter_choice.currentIndex() == 1:
            self.__books = filter(lambda x: True if x['assignUser'] is None else False, self.__books)
        if self.filter_choice.currentIndex() == 2:
            self.__books = filter(lambda x: True if x['assignUser'] is not None \
                and x['assignUser']['id'] == self.user_id else False, self.__books)
        self.__books = list(self.__books)

    def book_choice(self, index):
        selected = self.book_list.currentIndex().row()
        if selected == -1:
            self.button_remove_book.setEnabled(False)
            self.button_borrow_book.setEnabled(False)
            self.button_return_book.setEnabled(False)
            return
        book = self.__books[selected]
        self.button_remove_book.setEnabled(True)
        if book['assignUser'] is None:
            self.button_borrow_book.setEnabled(True)
        else:
            self.button_borrow_book.setEnabled(False)
            if book['assignUser']['id'] == self.user_id:
                self.button_return_book.setEnabled(True)
            else:
                self.button_return_book.setEnabled(False)

    def add_book(self):
        ok, book = AddBookDialog.get_result()
        if not ok:
            return
        self.book_service.add_book(book)
Beispiel #4
0
class SessionsManager(QDialog):
    """Session Manager, to load different configurations of ninja."""
    def __init__(self, parent=None):
        super(SessionsManager, self).__init__(parent, Qt.Dialog)
        self._ninja = parent
        self.setModal(True)
        self.setWindowTitle(translations.TR_SESSIONS_TITLE)
        self.setMinimumWidth(550)
        self.setMinimumHeight(450)
        self._manager = _SessionManager(parent)
        self._load_ui()

    def install(self):
        self._manager.load_sessions()

    def _load_ui(self):
        main_layout = QVBoxLayout(self)
        main_layout.addWidget(QLabel(translations.TR_SESSIONS_DIALOG_BODY))
        main_hbox = QHBoxLayout()
        # Session list
        session_layout = QVBoxLayout()
        self._session_list = QTreeWidget()
        self._session_list.setHeaderLabels(["Session", "Last Modified"])
        session_layout.addWidget(self._session_list)
        # Content frame
        content_frame = QFrame()
        content_frame.hide()
        frame_layout = QVBoxLayout(content_frame)
        content_frame.setFrameStyle(QFrame.StyledPanel | QFrame.Sunken)
        session_layout.addWidget(content_frame)
        frame_layout.setContentsMargins(0, 0, 0, 0)
        self._content_list = QTreeWidget()
        self._content_list.setHeaderHidden(True)
        frame_layout.addWidget(self._content_list)
        # Separator line
        line_frame = QFrame()
        line_frame.setFrameStyle(QFrame.VLine | QFrame.Sunken)
        # Buttons
        btn_layout = QVBoxLayout()
        btn_create = QPushButton(translations.TR_SESSIONS_BTN_CREATE)
        btn_activate = QPushButton(translations.TR_SESSIONS_BTN_ACTIVATE)
        btn_update = QPushButton(translations.TR_SESSIONS_BTN_UPDATE)
        btn_delete = QPushButton(translations.TR_SESSIONS_BTN_DELETE)
        btn_details = QPushButton(translations.TR_SESSIONS_BTN_DETAILS)
        btn_details.setCheckable(True)
        # Add buttons to layout
        btn_layout.addWidget(btn_create)
        btn_layout.addWidget(btn_activate)
        btn_layout.addWidget(btn_update)
        btn_layout.addWidget(btn_delete)
        btn_layout.addStretch()
        btn_layout.addWidget(btn_details)
        # Add widgets and layouts to the main layout
        main_layout.addLayout(main_hbox)
        main_hbox.addLayout(session_layout)
        main_hbox.addWidget(line_frame)
        main_hbox.addLayout(btn_layout)
        main_hbox.setSizeConstraint(QLayout.SetFixedSize)
        btn_details.toggled[bool].connect(content_frame.setVisible)
        # Connections
        self._session_list.itemSelectionChanged.connect(
            self.load_session_content)
        btn_activate.clicked.connect(self.open_session)
        btn_update.clicked.connect(self.save_session)
        btn_create.clicked.connect(self.create_session)
        btn_delete.clicked.connect(self.delete_session)

    def __load_sessions(self):
        for session_name in self._manager.sessions:
            item = QTreeWidgetItem()
            item.setText(0, session_name)
            item.setText(1, "FIXME: manage this!")
            self._session_list.addTopLevelItem(item)
        self._session_list.setCurrentItem(self._session_list.topLevelItem(0))

    def load_session_content(self):
        """Load the selected session, replacing the current session."""
        item = self._session_list.currentItem()
        self._content_list.clear()
        if item is not None:
            key = item.text(0)
            files, projects = self._manager.get_session(key)
            files_parent = QTreeWidgetItem(self._content_list,
                                           [translations.TR_FILES])
            for ffile in files:
                QTreeWidgetItem(files_parent, [ffile[0]])
            projects_parent = QTreeWidgetItem(self._content_list,
                                              [translations.TR_PROJECT])
            for project in projects:
                QTreeWidgetItem(projects_parent, [project])

            files_parent.setExpanded(True)
            projects_parent.setExpanded(True)

    def create_session(self):
        """Create a new Session."""
        session_info = QInputDialog.getText(
            None, translations.TR_SESSIONS_CREATE_TITLE,
            translations.TR_SESSIONS_CREATE_BODY)
        if session_info[1]:
            session_name = session_info[0]
            if not session_name or session_name in settings.SESSIONS:
                QMessageBox.information(self,
                                        translations.TR_SESSIONS_MESSAGE_TITLE,
                                        translations.TR_SESSIONS_MESSAGE_BODY)
                return
            self._manager.save_session_data(session_name)
        self.close()

    def save_session(self):
        """Save current session"""
        if self._session_list.currentItem():
            session_name = self._session_list.currentItem().text(0)
            self._manager.save_session_data(session_name)
            self._ninja.show_message(
                translations.TR_SESSIONS_UPDATED_NOTIF.format(session_name))
            self.load_session_content()

    def open_session(self):
        """Open a saved session"""
        if self._session_list.currentItem():
            session_name = self._session_list.currentItem().text(0)
            self._manager.load_session(session_name)
            self._manager.set_current_session(session_name)
            self.close()

    def delete_session(self):
        """Delete a session"""
        if self._session_list.currentItem():
            key = self._session_list.currentItem().text(0)
            self._manager.delete_session(key)
            self._session_list.takeTopLevelItem(
                self._session_list.currentIndex().row())

    @property
    def current_session(self):
        return self._manager.current_session()

    def showEvent(self, event):
        super().showEvent(event)
        self.__load_sessions()

    def hideEvent(self, event):
        super().hideEvent(event)
        self._session_list.clear()