Exemple #1
1
class MDIHistory(QWidget, _HalWidgetBase):
    def __init__(self, parent=None):
        super(MDIHistory, self).__init__(parent)
        self.setMinimumSize(QSize(300, 200))    
        self.setWindowTitle("PyQt5 editor test example") 

        lay = QVBoxLayout()
        lay.setContentsMargins(0,0,0,0)
        self.setLayout(lay)

        self.list = QListView()
        self.list.setEditTriggers(QListView.NoEditTriggers)
        self.list.activated.connect(self.activated)
        self.list.setAlternatingRowColors(True)
        self.list.selectionChanged = self.selectionChanged
        self.model = QStandardItemModel(self.list)


        self.MDILine = MDILine()
        self.MDILine.soft_keyboard = False
        self.MDILine.line_up = self.line_up
        self.MDILine.line_down = self.line_down

        # add widgets
        lay.addWidget(self.list)
        lay.addWidget(self.MDILine)
        self.reload()

    def _hal_init(self):
        STATUS.connect('state-off', lambda w: self.setEnabled(False))
        STATUS.connect('state-estop', lambda w: self.setEnabled(False))
        STATUS.connect('interp-idle', lambda w: self.setEnabled(STATUS.machine_is_on()
                                                                and (STATUS.is_all_homed()
                                                                or INFO.NO_HOME_REQUIRED)))
        STATUS.connect('interp-run', lambda w: self.setEnabled(not STATUS.is_auto_mode()))
        STATUS.connect('all-homed', lambda w: self.setEnabled(STATUS.machine_is_on()))

    def reload(self, w=None ):
        print 'RELOAD'
        try:
            fp = os.path.expanduser(INFO.MDI_HISTORY_PATH)
            with open(fp,'r') as inputfile:
                for line in inputfile:
                    line = line.rstrip('\n')
                    item = QStandardItem(line)
                    self.model.appendRow(item)
            self.list.setModel(self.model)
            self.list.scrollToBottom()
        except Exception as e:
            print e
            LOG.error('File path is not valid: {}]n,()'.format(fp),e)

    def line_up(self):
        print 'up'

    def line_down(self):
        print 'down'

    def selectionChanged(self,old, new):
        cmd = self.getSelected()
        self.MDILine.setText(cmd)


    def getSelected(self):
        selected_indexes = self.list.selectedIndexes()
        selected_rows = [item.row() for item in selected_indexes]
        # iterates each selected row in descending order
        for selected_row in sorted(selected_rows, reverse=True):
            text = self.model.item(selected_row).text()
            return text

    def activated(self):
        cmd = self.getSelected()
        self.MDILine.setText(cmd)
        self.MDILine.submit()
        item = QStandardItem(cmd)
        self.model.appendRow(item)
        self.list.update()
    #########################################################################
    # This is how designer can interact with our widget properties.
    # designer will show the pyqtProperty properties in the editor
    # it will use the get set and reset calls to do those actions
    #########################################################################

    def set_soft_keyboard(self, data):
        self.MDILine.soft_keyboard = data
    def get_soft_keyboard(self):
        return self.MDILine.soft_keyboard
    def reset_soft_keyboard(self):
        self.MDILine.soft_keyboard = False

    # designer will show these properties in this order:
    soft_keyboard_option = pyqtProperty(bool, get_soft_keyboard, set_soft_keyboard, reset_soft_keyboard)
Exemple #2
0
    def __init__(self):
        QWidget.__init__(self, flags=Qt.Widget)
        self.setWindowTitle("ItemView QListView")
        self.setFixedWidth(210)
        self.setFixedHeight(100)

        fruits = [
            {
                "name": "banana",
                "color": "yellow",
                "bg_color": "yellow"
            },
            {
                "name": "apple",
                "color": "red",
                "bg_color": "red"
            },
            {
                "name": "pear",
                "color": "green",
                "bg_color": "gray"
            },
        ]

        view = QListView(self)
        view.setEditTriggers(QAbstractItemView.DoubleClicked)

        model = UserModel(fruits)
        view.setModel(model)
Exemple #3
0
class MainForm(QDialog):

    def __init__(self, parent=None):
        super(MainForm, self).__init__(parent)

        self.model = BarGraphModel()
        self.barGraphView = BarGraphView()
        self.barGraphView.setModel(self.model)
        self.listView = QListView()
        self.listView.setModel(self.model)
        self.listView.setItemDelegate(BarGraphDelegate(0, 1000, self))
        self.listView.setMaximumWidth(100)
        self.listView.setEditTriggers(QListView.DoubleClicked|
                                      QListView.EditKeyPressed)
        layout = QHBoxLayout()
        layout.addWidget(self.listView)
        layout.addWidget(self.barGraphView, 1)
        self.setLayout(layout)

        self.setWindowTitle("Bar Grapher")
        QTimer.singleShot(0, self.initialLoad)


    def initialLoad(self):
        # Generate fake data
        count = 20
        self.model.insertRows(0, count - 1)
        for row in range(count):
            value = random.randint(1, 150)
            color = QColor(random.randint(0, 255), random.randint(0, 255),
                           random.randint(0, 255))
            index = self.model.index(row)
            self.model.setData(index, value)
            self.model.setData(index, QVariant(color), Qt.UserRole)
Exemple #4
0
    def __init__(self):
        QWidget.__init__(self, flags=Qt.Widget)
        self.setWindowTitle("ItemView QListView")
        self.setFixedWidth(210)
        self.setFixedHeight(100)

        fruits = [
            {
                "name": "Mail",
                "icon": "assets/mail.png"
            },
            {
                "name": "Calender",
                "icon": "assets/calender.png"
            },
            {
                "name": "Network",
                "icon": "assets/network.png"
            },
        ]

        view = QListView(self)
        view.setAlternatingRowColors(True)
        view.setEditTriggers(QAbstractItemView.DoubleClicked)

        model = UserModel(fruits)
        view.setModel(model)
class Window(QWidget):

    def __init__(self, *args, **kwargs):
        super(Window, self).__init__(*args, **kwargs)
        self.resize(600, 400)
        layout = QVBoxLayout(self)
        self.listView = QListView(self)
        self.listView.setEditTriggers(QListView.NoEditTriggers)
        layout.addWidget(self.listView)
        layout.addWidget(QPushButton('恢复默认顺序', self, clicked=self.restoreSort))
        layout.addWidget(QPushButton('唐', self, clicked=self.sortByClassify))
        layout.addWidget(QPushButton('宋', self, clicked=self.sortByClassify))
        layout.addWidget(QPushButton('元', self, clicked=self.sortByClassify))
        layout.addWidget(QPushButton('明', self, clicked=self.sortByClassify))
        layout.addWidget(QPushButton('清', self, clicked=self.sortByClassify))

        self._initItems()

    def restoreSort(self):
        # 恢复默认排序
        self.fmodel.setSortRole(IdRole)     # 必须设置排序角色为ID
        self.fmodel.sort(0)                 # 排序第一列按照ID升序

    def sortByClassify(self):
        self.fmodel.setSortIndex(NameDict.get(
            self.sender().text(), ['', 100])[1])
        # self.restoreSort()
        self.fmodel.setSortRole(IdRole)
        # 按照给定的分类排序(这里注意还要按照把给定分类的放在最前面)
        self.fmodel.setSortRole(ClassifyRole)
        self.fmodel.sort(0)

    def _initItems(self):
        # 初始化Items
        self.dmodel = QStandardItemModel(self.listView)
        self.fmodel = SortFilterProxyModel(self.listView)
        self.fmodel.setSourceModel(self.dmodel)
        self.listView.setModel(self.fmodel)

        keys = list(NameDict.keys())
        print(keys)  # ['清', '元', '唐', '明', '宋']
        classifies = [v[1] for v in NameDict.values()]
        for i in range(5):
            # 添加5个100, 用于模拟没有分类, 排序的时候就显示在最后面
            classifies.append(100)
        print(classifies)  # [4, 2, 0, 3, 1, 100, 100, 100, 100, 100]

        # 生成50个Item
        for i in range(50):
            #             name = keys[i % 4]  # 随机取一个朝代
            item = QStandardItem()
            # 设置ID角色
            item.setData(i, IdRole)
            # 设置分类角色
            c = choice(classifies)
            item.setData(c, ClassifyRole)
            # 设置显示内容
            item.setText('Name: {}\t\tId: {}\t\tClassify: {}'.format(
                IndexDict.get(c, '其它'), i, c))
            self.dmodel.appendRow(item)
Exemple #6
0
class Browser():
    def __init__(self, app):
        self.listViewModel = QStandardItemModel()

        self.app = app

        self.listView = QListView(app)
        self.listView.move(15, 145)
        self.listView.setFixedSize(app.width - 30, app.height - 190)
        self.listView.setModel(self.listViewModel)
        self.listView.setEditTriggers(QAbstractItemView.NoEditTriggers)
        self.listView.doubleClicked.connect(self.processItem)
        self.listView.keyPressEvent = self.keyPressEvent
        self.listView.selectionModel().selectionChanged.connect(
            self.selectionChanged)

    def populate(self, entries):
        self.listViewModel.clear()

        for entry in entries:
            item = QStandardItem(
                QIcon('icons/' + (
                    'file.png' if entry['type'] == 'file' else 'folder.png')),
                entry['name'])

            item.setData(entry)
            self.listViewModel.appendRow(item)

    def processItem(self):
        if self.item.data()['type'] == 'dir':
            self.app.navigateDown(self.selectedItem())
        else:
            self.app.extract()

    def keyPressEvent(self, event):
        super(QListView, self.listView).keyPressEvent(event)

        if event.key() == Qt.Key_Return:
            self.processItem()

    def deselect(self):
        self.item = None
        self.app.disableFileActions()

    def selectedItem(self):
        return self.item.text() if self.item else None

    def selectionChanged(self, selected, deselected):
        if len(selected.indexes()):
            modelIndex = selected.indexes()[0]

            self.item = modelIndex.model().item(modelIndex.row())
            self.app.enableFileActions()
        else:
            self.deselect()
Exemple #7
0
def create_QListView(ui, qle=None):
    ql = QListView(ui)
    ql.setEditTriggers(QAbstractItemView.NoEditTriggers)
    ql.setSelectionMode(QAbstractItemView.ExtendedSelection)
    ql.setDefaultDropAction(Qt.TargetMoveAction)
    ql.setDragDropMode(QAbstractItemView.InternalMove);
    ql.setMinimumHeight(80)
    ql.clicked.connect(lambda: slot_qlv_check_list(ui, ql))
    if qle is not None:
        ql.doubleClicked.connect(lambda: slot_qlv_double_click(ui, ql, qle))
    return ql
Exemple #8
0
class DatabaseWidget(QSplitter):

    def __init__(self):
        super().__init__()
        self.setOrientation(Qt.Vertical)
        self.create_ui()

    def create_ui(self):
        top = QWidget()
        box = QVBoxLayout()
        top.setLayout(box)

        box.addWidget(label('<strong>Stored regions</strong>'))

        self.listview = QListView()
        self.listview.setModel(DatabaseModel(db))
        self.listview.selectionModel().selectionChanged.connect(self.selection_changed)
        self.listview.doubleClicked.connect(self.list_double_clicked)
        self.listview.setEditTriggers(QListView.EditKeyPressed | QListView.SelectedClicked)
        box.addWidget(self.listview)

        self.addWidget(top)

        self.poly = PolyWidget()
        self.addWidget(self.poly)

    def unselect(self):
        selection_model = self.listview.selectionModel()
        selection_model.select(QModelIndex(), QItemSelectionModel.SelectCurrent)

    def select(self, row):
        selection_model = self.listview.selectionModel()
        index = self.listview.model().index(row, 0, QModelIndex())
        selection_model.select(index, QItemSelectionModel.SelectCurrent)

    def selection_changed(self, selected, deselected):
        try:
            index = selected.indexes()[0]
        except IndexError:
            main_widget.set_selected()
            self.poly.show()
            return
        poly = db[index.row()]
        main_widget.set_selected(poly.lfid)
        self.poly.show(poly)

    def list_double_clicked(self, item):
        main_widget.focus(db[item.row()].lfid)
Exemple #9
0
class ListTab(QWidget):
    def __init__(self, data_manager, parent=None):
        super(ListTab, self).__init__(parent)
        self.data_manager = data_manager

        self.layout = QVBoxLayout()
        self.form_layout = QFormLayout()
        self.grid_layout = QGridLayout()

        self.package_label = QListView()
        self.package_label.setEditTriggers(QAbstractItemView.NoEditTriggers)
        self.model = QStandardItemModel(self.package_label)

        self.grid_layout.addWidget(self.package_label, 0, 0, 0, 0)

    def configure_layout(self):
        self.layout.addLayout(self.form_layout)
        self.layout.addLayout(self.grid_layout)
        self.setLayout(self.layout)

    def create_button(self, text, listener=None):
        new_button = QPushButton(text)
        new_button.setFixedWidth(new_button.sizeHint().width())
        if listener:
            new_button.clicked.connect(listener)
        return new_button

    def add_form_element(self, text, widget=None):
        self.form_layout.addRow(text, QLabel("") if widget is None else widget)

    def select_all(self):
        self.change_state(Qt.Checked)

    def unselect_all(self):
        self.change_state(Qt.Unchecked)

    def change_state(self, state):
        for index in range(self.model.rowCount()):
            item = self.model.item(index)
            item.setCheckState(state)

    def add_select_buttons(self):
        select_all_button = self.create_button("Select all", self.select_all)
        unselect_all_button = self.create_button("Unselect all", self.unselect_all)
        self.add_form_element("", select_all_button)
        self.add_form_element("", unselect_all_button)
    def __init__(self, parent, plugins_available):
        QWidget.__init__(self, parent)

        main_layout = QVBoxLayout()
        label = QLabel("Tilastolaskimen valinta")
        main_layout.addWidget(label)

        calculator_list_view = QListView()

        model = QStandardItemModel(calculator_list_view)

        for plugin_name in plugins_available:
            print(plugin_name)
            item = QStandardItem(plugin_name)
            model.appendRow(item)
            calculator_list_view.setModel(model)
            calculator_list_view.clicked.connect(self.on_item_changed)

        main_layout.addWidget(calculator_list_view)
        calculator_list_view.setEditTriggers(QAbstractItemView.NoEditTriggers)
        self.setLayout(main_layout)
Exemple #11
0
class Demo(QWidget):
    def __init__(self):
        super(Demo, self).__init__()

        self.item_list = ['item %s' % i for i in range(11)]  # 1
        self.model_1 = QStringListModel(self)
        self.model_1.setStringList(self.item_list)

        self.model_2 = QStringListModel(self)  # 2

        self.listview_1 = QListView(self)  # 3
        self.listview_1.setModel(self.model_1)
        self.listview_1.setEditTriggers(QAbstractItemView.NoEditTriggers)
        self.listview_1.doubleClicked.connect(
            lambda: self.change_func(self.listview_1))

        self.listview_2 = QListView(self)  # 4
        self.listview_2.setModel(self.model_2)
        self.listview_2.setEditTriggers(QAbstractItemView.NoEditTriggers)
        self.listview_2.doubleClicked.connect(
            lambda: self.change_func(self.listview_2))

        self.pic_label = QLabel(self)  # 5
        self.pic_label.setPixmap(QPixmap('arrow.png'))

        self.h_layout = QHBoxLayout()
        self.h_layout.addWidget(self.listview_1)
        self.h_layout.addWidget(self.pic_label)
        self.h_layout.addWidget(self.listview_2)
        self.setLayout(self.h_layout)

    def change_func(self, listview):
        if listview == self.listview_1:  # 6
            self.model_2.insertRows(self.model_2.rowCount(), 1)

            data = self.listview_1.currentIndex().data()
            index = self.model_2.index(self.model_2.rowCount() - 1)
            self.model_2.setData(index, data)
        else:  # 7
            self.model_2.removeRows(self.listview_2.currentIndex().row(), 1)
Exemple #12
0
class ShowListWindow(QMainWindow):
    def __init__(self,
                 app_context: ApplicationContext,
                 flashcard_manager: FlashcardManager,
                 card_list: CardList,
                 parent=None):
        super(ShowListWindow, self).__init__(parent)

        self.app_context = app_context
        self.flashcard_manager = flashcard_manager
        self.card_list = card_list

        self.setFixedSize(600, 400)
        self.setWindowTitle(self.card_list.name + " - TangoCards")

        main_widget = QWidget()
        main_widget.setProperty("cssClass", "background")
        main_layout = QVBoxLayout()

        learn_button = QPushButton("Frag mich ab!")
        learn_button.clicked.connect(self.on_click_learn)
        main_layout.addWidget(learn_button)

        self.card_list_model = QStringListModel(
            self.card_list.get_card_name_list())
        self.cards_list_component = QListView()
        self.cards_list_component.setModel(self.card_list_model)
        self.cards_list_component.setEditTriggers(
            QAbstractItemView.NoEditTriggers)

        main_layout.addWidget(self.cards_list_component)

        tool_buttons_widget = QWidget()
        tool_buttons_layout = QHBoxLayout()
        tool_buttons_widget.setLayout(tool_buttons_layout)

        add_button = QPushButton("Hinzufügen")
        add_button.clicked.connect(self.on_click_add)
        delete_button = QPushButton("Löschen")
        delete_button.clicked.connect(self.on_click_delete)
        tool_buttons_layout.addWidget(add_button)
        tool_buttons_layout.addWidget(delete_button)

        main_layout.addWidget(tool_buttons_widget)

        main_widget.setLayout(main_layout)
        self.setCentralWidget(main_widget)

    def update_list(self):
        self.card_list_model = QStringListModel(
            self.card_list.get_card_name_list())
        self.cards_list_component.setModel(self.card_list_model)
        self.cards_list_component.repaint()

    def on_click_add(self):
        word_text, ok1 = QInputDialog.getText(self, 'Karte hinzufügen',
                                              'Wort:')

        if not ok1:
            return

        if word_text is None or len(word_text) < 2:
            msg = QMessageBox()
            msg.setIcon(QMessageBox.Warning)
            msg.setText("Der Text ist leer oder zu kurz!")
            msg.exec_()

            return

        if self.card_list.get_card(word_text) is not None:
            msg = QMessageBox()
            msg.setIcon(QMessageBox.Warning)
            msg.setText("Wort ist bereits in der Lernkartei!")
            msg.exec_()

            return

        solution_text, ok2 = QInputDialog.getText(self, 'Karte hinzufügen',
                                                  'Lösung:')

        if not ok2:
            return

        if solution_text is None or len(word_text) < 2:
            msg = QMessageBox()
            msg.setIcon(QMessageBox.Warning)
            msg.setText("Der Text ist leer oder zu kurz!")
            msg.exec_()

            return

        self.card_list.add_card(word_text, solution_text)
        self.flashcard_manager.save_list(self.card_list)
        self.update_list()

    def on_click_learn(self):
        if len(self.card_list.cards) < 1:
            msg = QMessageBox()
            msg.setIcon(QMessageBox.Warning)
            msg.setText("Du musst erst Lernkarten hinzufügen!")
            msg.exec_()

            return

        window = LearnWindow(self.app_context,
                             self.flashcard_manager,
                             self.card_list,
                             parent=self.parent())
        self.hide()
        window.show()

    def on_click_delete(self):
        if len(self.cards_list_component.selectedIndexes()) < 1:
            return

        word_text = self.cards_list_component.selectedIndexes()[0].data()
        card = self.card_list.get_card(word_text)

        if card is not None:
            self.card_list.remove_card(card)
            self.flashcard_manager.save_list(self.card_list)
            self.update_list()
Exemple #13
0
class RepositoryTab(QWidget):
    def __init__(self, data_manager, parent=None):
        super(RepositoryTab, self).__init__(parent)

        self.data_manager = data_manager
        # initialize widgets
        self.repo_box = QComboBox()
        self.delete_button = QPushButton("Delete")
        self.package_label = QListView()
        self.package_label.setEditTriggers(QAbstractItemView.NoEditTriggers)

        # place widget in the layout
        layout = QGridLayout()
        layout.addWidget(self.repo_box, 0, 0, 1, 1)
        layout.addWidget(self.delete_button, 0, 1, 1, 1)
        layout.addWidget(self.package_label, 1, 1, 2, 1)
        self.setLayout(layout)

        # initialize data
        self.model = QStandardItemModel(self.package_label)
        self.repo_dictionary = {}
        # controllers
        self.load_repository()
        self.repo_box.currentIndexChanged.connect(self.update_list)
        self.delete_button.clicked.connect(self.remove_package)

    def load_repository(self):
        repos = self.data_manager.client.do_get('/repos')
        repo_list = []
        for repo in repos:
            repo_list.append(repo["Name"])
        for repo in sorted(repo_list):
            self.repo_box.addItem(repo)
        self.repo_box.update()
        self.update_list()

    def update_list(self):
        self.model.removeRows(0, self.model.rowCount())
        current_repo = self.repo_box.currentText()
        if current_repo == "":
            return
        if current_repo not in self.repo_dictionary.keys():
            self.repo_dictionary[current_repo] = sorted(
                Publish._get_packages(self.data_manager.get_client(), "repos",
                                      current_repo))

        if self.repo_dictionary[current_repo]:
            for package in self.repo_dictionary[current_repo]:
                item = QStandardItem(package)
                item.setCheckable(True)
                item.setCheckState(Qt.Unchecked)
                self.model.appendRow(item)
            self.package_label.setModel(self.model)

    def remove_package(self):
        package_list = []
        repo_name = self.repo_box.currentText()
        self.repo_dictionary[repo_name] = []
        for index in range(self.model.rowCount()):
            current_item = self.model.item(index)
            if current_item and current_item.checkState() != 0:
                package_list.append(current_item.text())
            else:
                self.repo_dictionary[repo_name].append(current_item.text())
        print(package_list)
        self.data_manager.get_client().do_delete(
            '/repos/%s/packages' % repo_name,
            data={'PackageRefs': package_list})
        self.update_list()

    # TODO: disable buttons if no packages...
    def reload_component(self):
        return
Exemple #14
0
class MDIHistory(QWidget, _HalWidgetBase):
    def __init__(self, parent=None):
        super(MDIHistory, self).__init__(parent)
        self.setMinimumSize(QSize(200, 150))
        self.setWindowTitle("PyQt5 editor test example")

        lay = QVBoxLayout()
        lay.setContentsMargins(0, 0, 0, 0)
        self.setLayout(lay)

        self.list = QListView()
        self.list.setEditTriggers(QListView.NoEditTriggers)
        self.list.activated.connect(self.activated)
        self.list.setAlternatingRowColors(True)
        self.list.selectionChanged = self.selectionChanged
        self.model = QStandardItemModel(self.list)

        self.MDILine = MDILine()
        self.MDILine.soft_keyboard = False
        self.MDILine.line_up = self.line_up
        self.MDILine.line_down = self.line_down

        STATUS.connect('mdi-history-changed', self.reload)

        # add widgets
        lay.addWidget(self.list)
        lay.addWidget(self.MDILine)

        self.fp = os.path.expanduser(INFO.MDI_HISTORY_PATH)
        try:
            open(self.fp, 'r')
        except:
            open(self.fp, 'a+')
            LOG.debug('MDI History file created: {}'.format(self.fp))
        self.reload()
        self.select_row('last')

    def _hal_init(self):
        STATUS.connect('state-off', lambda w: self.setEnabled(False))
        STATUS.connect('state-estop', lambda w: self.setEnabled(False))
        STATUS.connect(
            'interp-idle', lambda w: self.setEnabled(STATUS.machine_is_on(
            ) and (STATUS.is_all_homed() or INFO.NO_HOME_REQUIRED)))
        STATUS.connect('interp-run',
                       lambda w: self.setEnabled(not STATUS.is_auto_mode()))
        STATUS.connect('all-homed',
                       lambda w: self.setEnabled(STATUS.machine_is_on()))

    def reload(self, w=None):
        self.model.clear()
        try:
            with open(self.fp, 'r') as inputfile:
                for line in inputfile:
                    line = line.rstrip('\n')
                    item = QStandardItem(line)
                    self.model.appendRow(item)
            self.list.setModel(self.model)
            self.list.scrollToBottom()
            if self.MDILine.hasFocus():
                self.select_row('last')
        except:
            LOG.debug('File path is not valid: {}'.format(fp))

    def selectionChanged(self, old, new):
        cmd = self.getSelected()
        self.MDILine.setText(cmd)
        selectionModel = self.list.selectionModel()
        if selectionModel.hasSelection():
            self.row = selectionModel.currentIndex().row()

    def getSelected(self):
        selected_indexes = self.list.selectedIndexes()
        selected_rows = [item.row() for item in selected_indexes]
        # iterates each selected row in descending order
        for selected_row in sorted(selected_rows, reverse=True):
            text = self.model.item(selected_row).text()
            return text

    def activated(self):
        cmd = self.getSelected()
        self.MDILine.setText(cmd)
        self.MDILine.submit()
        self.select_row('down')

    def run_command(self):
        self.MDILine.submit()
        self.select_row('last')

    def select_row(self, style):
        style = style.lower()
        selectionModel = self.list.selectionModel()
        parent = QModelIndex()
        self.rows = self.model.rowCount(parent) - 1
        if style == 'last':
            self.row = self.rows
            print 'last =', self.row
        elif style == 'up':
            if self.row > 0:
                self.row -= 1
            else:
                self.row = 0
        elif style == 'down':
            if self.row < self.rows:
                self.row += 1
            else:
                self.row = self.rows
        else:
            return
        top = self.model.index(self.row, 0, parent)
        bottom = self.model.index(self.row, 0, parent)
        selectionModel.setCurrentIndex(
            top, QItemSelectionModel.Select | QItemSelectionModel.Rows)
        selection = QItemSelection(top, top)
        selectionModel.clearSelection()
        selectionModel.select(selection, QItemSelectionModel.Select)

    def line_up(self):
        self.select_row('up')

    def line_down(self):
        self.select_row('down')

    #########################################################################
    # This is how designer can interact with our widget properties.
    # designer will show the pyqtProperty properties in the editor
    # it will use the get set and reset calls to do those actions
    #########################################################################

    def set_soft_keyboard(self, data):
        self.MDILine.soft_keyboard = data

    def get_soft_keyboard(self):
        return self.MDILine.soft_keyboard

    def reset_soft_keyboard(self):
        self.MDILine.soft_keyboard = False

    # designer will show these properties in this order:
    soft_keyboard_option = pyqtProperty(bool, get_soft_keyboard,
                                        set_soft_keyboard, reset_soft_keyboard)
Exemple #15
0
    def __init__(self, *args, **kwargs):
        super(KwWorkFontDialog, self).__init__(*args, **kwargs)

        #fontIds = []
        #for font_fname in free_font_path_generator():
        #    fontIds = QFontDatabase.addApplicationFont(font_fname)
        #QFontDatabase.removeAllApplicationFonts()

        fontFreeFilterChecker = QCheckBox(u'Вільні')
        fontNoFreeFilterChecker = QCheckBox(u'Невільні')

        fontRating5FilterChecker = QCheckBox(u'Найкращі')
        fontRating4FilterChecker = QCheckBox(u'Добрі')
        fontRating3FilterChecker = QCheckBox(u'Задовільні')

        fontUseStrict_FilterChecker = QCheckBox(u'Діловодство, наука')
        fontUseWriting_FilterChecker = QCheckBox(u'Рукопис')
        fontUseFantasy_FilterChecker = QCheckBox(u'Декорації, реклама')

        fontFamilyListView = QListView()
        fontFamilyListView.setMinimumWidth(250)
        #fontFamilyModel = QStringListModel([str(fontDatabase.sty)])

        fontStyleListView = QListView()
        fontStyleListView.setFixedWidth(150)

        fontSizeListView = QListView()
        fontSizeListView.setFixedWidth(60)
        fontSizeModel = QStringListModel([
            str(v) for v in (6, 7, 8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24,
                             26, 28, 36, 48, 72)
        ])
        fontSizeListView.setModel(fontSizeModel)
        fontSizeListView.setEditTriggers(QAbstractItemView.NoEditTriggers)

        fontSampleWidget = QLabel(u'ІіЇїРр')
        fontSampleWidget.setFrameStyle(QFrame.StyledPanel | QFrame.Sunken)
        fontSampleWidget.setStyleSheet(r'''QLabel {
          font: normal normal 72pt "Consolas";
          padding: 3px;
          qproperty-alignment: AlignCenter;
          color: black;
          background-color: white;
          }''')

        sampleGroup = QGroupBox(u'Зразок:')
        sampleLayout = QHBoxLayout(sampleGroup)
        sampleLayout.addWidget(fontSampleWidget)

        fontFilterLayout = QHBoxLayout()

        fontAccessFilterGroup = QGroupBox(u'Доступність:')
        fontAccessFilterLayout = QVBoxLayout(fontAccessFilterGroup)
        fontAccessFilterLayout.addWidget(fontFreeFilterChecker)
        fontAccessFilterLayout.addWidget(fontNoFreeFilterChecker)
        fontAccessFilterLayout.addStretch()
        fontFilterLayout.addWidget(fontAccessFilterGroup)

        fontUseFilterGroup = QGroupBox(u'Призначення:')
        fontUseFilterLayout = QVBoxLayout(fontUseFilterGroup)
        fontUseFilterLayout.addWidget(fontUseStrict_FilterChecker)
        fontUseFilterLayout.addWidget(fontUseWriting_FilterChecker)
        fontUseFilterLayout.addWidget(fontUseFantasy_FilterChecker)
        fontFilterLayout.addWidget(fontUseFilterGroup)

        fontRatingFilterGroup = QGroupBox(u'Оцінка:')
        fontRatingFilterLayout = QVBoxLayout(fontRatingFilterGroup)
        fontRatingFilterLayout.addWidget(fontRating5FilterChecker)
        fontRatingFilterLayout.addWidget(fontRating4FilterChecker)
        fontRatingFilterLayout.addWidget(fontRating3FilterChecker)
        fontFilterLayout.addWidget(fontRatingFilterGroup)

        fontLayout = QGridLayout()

        familyLayout = QVBoxLayout()
        familyLayout.setSpacing(3)
        familyLayout.addWidget(QLabel(u'Шрифт:'))
        familyLayout.addWidget(fontFamilyListView)
        fontLayout.addLayout(familyLayout, 0, 0)

        styleLayout = QVBoxLayout()
        styleLayout.setSpacing(3)
        styleLayout.addWidget(QLabel(u'Стиль:'))
        styleLayout.addWidget(fontStyleListView)
        fontLayout.addLayout(styleLayout, 0, 1)

        sizeLayout = QVBoxLayout()
        sizeLayout.setSpacing(3)
        sizeLayout.addWidget(QLabel(u'Розмір:'))
        sizeLayout.addWidget(fontSizeListView)
        fontLayout.addLayout(sizeLayout, 0, 2)

        fontLayout.addWidget(sampleGroup, 1, 0, 1, 3)

        bbox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)

        layout = QVBoxLayout(self)
        testButton = QPushButton(u'Тестова: відкрити шрифт')
        testButton.clicked.connect(lambda: QFontDialog.getFont())
        layout.addWidget(testButton)
        layout.addLayout(fontFilterLayout)
        layout.addLayout(fontLayout)
        layout.addSpacing(5)
        layout.addWidget(bbox)

        self.setWindowTitle(u'Вибір шрифта')
        self.setWindowFlags(self.windowFlags()
                            ^ Qt.WindowContextHelpButtonHint)

        # Налаштування.
        fontMaxPointSize = fontSizeListView.font()
        # print(QFontDatabase.families())
        fontMaxPointSize.setPointSize(72)
        fm = QFontMetrics(fontMaxPointSize)
        fontSampleWidget.setMinimumHeight(
            fm.size(Qt.TextSingleLine
                    | Qt.TextShowMnemonic, u'Їр').height())

        fontSizeListView.setCurrentIndex(
            fontSizeModel.match(fontSizeModel.index(0, 0), Qt.DisplayRole,
                                fontSizeListView.font().pointSize())[0])

        fontFreeFilterChecker.setChecked(True)

        fontUseStrict_FilterChecker.setChecked(True)

        fontRating5FilterChecker.setChecked(True)
        fontRating4FilterChecker.setChecked(True)
Exemple #16
0
class DesktopIconWidget(QFrame):
    def __init__(self, parent):
        QFrame.__init__(self, parent)
        self.setFrameStyle(QFrame.Box | QFrame.Sunken)
        self.setStyleSheet("QListView{background:transparent;}")

        self.listView = QListView(self)
        self.setLayout(QHBoxLayout())
        self.layout().setContentsMargins(0, 0, 0, 0)
        self.layout().addWidget(self.listView)

        self.listView.setContextMenuPolicy(Qt.CustomContextMenu)
        self.listView.setEditTriggers(QAbstractItemView.NoEditTriggers)
        self.listView.setMovement(QListView.Snap)
        self.listView.setFlow(QListView.LeftToRight)
        self.listView.setResizeMode(QListView.Adjust)
        self.listView.setGridSize(QSize(self.logicalDpiX() / 96 * 70,
                                        self.logicalDpiY() / 96 * 70))
        self.listView.setViewMode(QListView.IconMode)

        self.quickDesktopModel = QuickDesktopModel(self.window().platform.databaseFile)
        self.listView.setModel(self.quickDesktopModel)
        self.createActions()
        self.makeConnections()

    def createActions(self):
        self.actionCreateComputer = QAction(self.tr("我的电脑(&C)"), self)
        self.actionCreateDocuments = QAction(self.tr("我的文档(&D)"), self)
        self.actionCreateMusic = QAction(self.tr("我的音乐(&M)"), self)
        self.actionCreatePictures = QAction(self.tr("我的图片(&P)"), self)
        self.actionCreateShortcut = QAction(self.tr("创建快捷方式(&C)"), self)
        self.actionCreateShortcut.setIcon(QIcon(":/images/new.png"))
        self.actionCreateBookmark = QAction(self.tr("创建网络链接(&B)"), self)
        self.actionCreateBookmark.setIcon(QIcon(":/images/insert-link.png"))
        self.actionRemoveShortcut = QAction(self.tr("删除快捷方式(&R)"), self)
        self.actionRemoveShortcut.setIcon(QIcon(":/images/delete.png"))
        self.actionRenameShortcut = QAction(self.tr("重命名(&N)"), self)
        self.actionRenameShortcut.setIcon(QIcon(":/images/edit-rename.png"))
        self.actionEditShortcut = QAction(self.tr("编辑快捷方式(&E)"), self)
        self.actionEditShortcut.setIcon(QIcon(":/images/edit.png"))

    def makeConnections(self):
        self.listView.customContextMenuRequested.connect(self.onQuickDesktopContextMenuRequest)
        self.listView.activated.connect(self.runQuickDesktopShortcut)

        self.actionCreateComputer.triggered.connect(self.createComputerShortcut)
        self.actionCreateDocuments.triggered.connect(self.createDocumentsShortcut)
        self.actionCreateMusic.triggered.connect(self.createMusicShortcut)
        self.actionCreatePictures.triggered.connect(self.createPicturesShortcut)
        self.actionCreateShortcut.triggered.connect(self.createShortcut)
        self.actionCreateBookmark.triggered.connect(self.createBookmark)
        self.actionEditShortcut.triggered.connect(self.editShortcut)
        self.actionRemoveShortcut.triggered.connect(self.removeShortcut)
        self.actionRenameShortcut.triggered.connect(self.renameShortcut)

    def onQuickDesktopContextMenuRequest(self, pos):
        index = self.listView.indexAt(pos)
        self.listView.setCurrentIndex(index)
        menu = QMenu()
        menu.addAction(self.actionCreateShortcut)
        menu.addAction(self.actionCreateBookmark)
        menu2 = menu.addMenu(self.tr("创建特殊快捷方式(&S)"))
        if os.name == "nt":
            menu2.addAction(self.actionCreateComputer)
        menu2.addAction(self.actionCreateDocuments)
        menu2.addAction(self.actionCreatePictures)
        menu2.addAction(self.actionCreateMusic)
        if index.isValid():
            menu.addAction(self.actionRemoveShortcut)
            if not self.quickDesktopModel.isSpecialShortcut(index):
                menu.addAction(self.actionEditShortcut)
            menu.addAction(self.actionRenameShortcut)
        try:
            getattr(menu, "exec")(QCursor.pos())
        except AttributeError:
            getattr(menu, "exec_")(QCursor.pos())

    def createShortcut(self):
        d = ShortcutDialog(self)
        if self.window().runDialog(d.create) == QDialog.Accepted:
            shortcut = d.getResult()
            shortcut["id"] = str(uuid.uuid4())
            self.quickDesktopModel.addShortcut(shortcut)
        d.deleteLater()

    def createBookmark(self):
        d = BookmarkDialog(self)
        if self.window().runDialog(d.create) == QDialog.Accepted:
            shortcut = {
                    "id": str(uuid.uuid4()),
                    "icon": "",
                    "openwith": "",
                    "dir": "",
            }
            shortcut.update(d.getResult())
            self.quickDesktopModel.addShortcut(shortcut)
        d.deleteLater()

    def createComputerShortcut(self):
        shortcut = {
                "id": str(uuid.uuid4()),
                "name": self.tr("我的电脑"),
                "path": COMPUTER_PATH,
                "icon": "",
                "dir": "",
                "openwith": "",
        }
        self.quickDesktopModel.addShortcut(shortcut)

    def createDocumentsShortcut(self):
        shortcut = {
                "id": str(uuid.uuid4()),
                "name": self.tr("我的文档"),
                "path": DOCUMENTS_PATH,
                "icon": "",
                "dir": "",
                "openwith": "",
        }
        self.quickDesktopModel.addShortcut(shortcut)

    def createPicturesShortcut(self):
        shortcut = {
                "id": str(uuid.uuid4()),
                "name": self.tr("图片收藏"),
                "path": PICTURES_PATH,
                "icon": "",
                "dir": "",
                "openwith": "",
        }
        self.quickDesktopModel.addShortcut(shortcut)

    def createMusicShortcut(self):
        shortcut = {
                "id": str(uuid.uuid4()),
                "name": self.tr("我的音乐"),
                "path": MUSIC_PATH,
                "icon": "",
                "dir": "",
                "openwith": "",
        }
        self.quickDesktopModel.addShortcut(shortcut)

    def renameShortcut(self):
        self.listView.edit(self.listView.currentIndex())

    def removeShortcut(self):
        self.quickDesktopModel.removeShortcut(self.listView.currentIndex())

    def editShortcut(self):
        index = self.listView.currentIndex()
        if not index.isValid():
            return
        shortcut = self.quickDesktopModel.shortcutAt(index)
        url = QUrl.fromUserInput(shortcut["path"])
        if not url.isValid():
            return
        if url.scheme() == "special":
            QMessageBox.information(self, self.tr("编辑快捷方式"), self.tr("不能编辑特殊图标。"))
            return
        elif url.scheme() == "file":
            d = ShortcutDialog(self)
        else:
            d = BookmarkDialog(self)
        if self.window().runDialog(d.edit, shortcut) == QDialog.Accepted:
            shortcut.update(d.getResult())
            self.quickDesktopModel.updateShortcut(shortcut, index)
        d.deleteLater()

    def runQuickDesktopShortcut(self):
        index = self.listView.currentIndex()
        if not index.isValid():
            return
        if not self.quickDesktopModel.runShortcut(index):
            QMessageBox.information(self, self.tr("快捷面板"), \
                    self.tr("不能运行快捷方式。请检查文件是否存在或者程序是否正确。"))
        else:
            self.window().close()
Exemple #17
0
class Read_Cheat_Sheet(QWidget):
    def __init__(self, font, size_policy, base_directory):
        super().__init__()
        self.setWindowIcon(QIcon('BEI_Logo.png'))
        self.setWindowTitle('Cheat Sheet Reading')
        self.font = font
        self.size_policy = size_policy
        self.base_directory = base_directory
        self.setup()

    def setup(self):
        '''Setup the cheat sheet viewing
        '''
        self.display = QTextEdit(self)
        self.display.setFont(self.font)
        self.display.setSizePolicy(self.size_policy, self.size_policy)
        self.display.setReadOnly(True)

        self.options = QListView(self)
        self.options.setFont(self.font)
        self.options.setSizePolicy(self.size_policy, self.size_policy)
        #        self.options.setReadOnly(True)
        self.options.setEditTriggers(QAbstractItemView.NoEditTriggers)

        layout = QHBoxLayout(self)
        layout.addWidget(self.options)
        layout.addWidget(self.display)
        self.setLayout(layout)

        #get the different topics from cheat_sheet_topics.txt
        c = open(
            os.path.join(os.path.join(self.base_directory, 'Cheat_Sheets'),
                         'Topics.txt'), 'r')
        c_data = c.readlines()
        c.close()
        if len(c_data) == 0:
            replay = QMessageBox.information(
                self, 'No Cheat Sheets', 'There are currently no cheat sheets',
                QMessageBox.Ok)
            if replay == QMessageBox.Ok:
                self.close()
        else:
            self.topics = []
            for i in c_data:
                self.topics.append(i.replace('\n', ''))

            self.entry = QStandardItemModel()
            self.options.setModel(self.entry)

            self.options.doubleClicked[QModelIndex].connect(self.openFile)
            for tex in self.topics:
                self.entry.appendRow(QStandardItem(tex))
            self.show()

    def openFile(self, index):
        item = self.entry.itemFromIndex(index)
        text = str(item.text()).replace(' ', '_')
        #open the text file associated with the clicked item
        u = open(
            os.path.join(os.path.join(self.base_directory, 'Cheat_Sheets'),
                         '{}.txt'.format(text)), 'r')
        data = u.readlines()
        u.close()
        combi = ''
        for i in data:
            combi += i
        self.display.setText(combi)
Exemple #18
0
class PackagePromotion(QWidget):
    def __init__(self, data_manager, parent=None):
        super(PackagePromotion, self).__init__(parent)

        self.data_manager = data_manager

        # initialize widgets
        self.component_box = QComboBox()
        self.component_label = QLabel("Component")
        self.source_publish_box = QComboBox()
        self.source_publish_label = QLabel("Source")
        self.target_publish_box = QComboBox()
        self.target_publish_label = QLabel("Target")
        self.publish_button = QPushButton("Promote")

        self.package_label = QListView()
        self.package_label.setEditTriggers(QAbstractItemView.NoEditTriggers)

        # place widget in the layout
        layout = QGridLayout()
        layout.addWidget(self.source_publish_box, 0, 0, 1, 1)
        layout.addWidget(self.component_box, 0, 1, 1, 1)
        layout.addWidget(self.target_publish_box, 0, 2, 1, 1)
        layout.addWidget(self.package_label, 1, 1, 2, 1)
        layout.addWidget(self.publish_button, 1, 2, 1, 1)
        self.setLayout(layout)

        # initialize data
        self.model = QStandardItemModel(self.package_label)
        self.fill_publish_box()
        self.recreate_package_box()
        # controllers
        self.source_publish_box.currentIndexChanged.connect(self.update_snapshot_box)
        self.component_box.currentIndexChanged.connect(self.recreate_package_box)
        self.publish_button.clicked.connect(self.update_publish)

    def load_snapshot(self, name):
        return Publish.get_packages(self.data_manager.get_client(), "snapshots", name)

    def update_publish_old(self):
        target_publish = self.data_manager.get_publish(self.target_publish_box.currentText())
        target_publish.load()
        package_list = set()
        # find a better way to get packages
        for index in reversed(range(self.model.rowCount())):
            current_item = self.model.item(index)
            if current_item and current_item.checkState() != 0:
                package_list.add(current_item.text())

        component = self.component_box.currentText()
        old_snapshot_name = target_publish.components[component][0]
        new_snapshot_name = DataManager.generate_snapshot_name(old_snapshot_name)

        old_packages = target_publish._get_packages(self.data_manager.get_client(), "snapshots", old_snapshot_name)
        for package in old_packages:
            package_list.add(package)

        target_publish.create_snapshots_from_packages(list(package_list), new_snapshot_name, 'Snapshot created from GUI for component {}'.format(component))
        target_publish.replace_snapshot(component, new_snapshot_name)
        target_publish.do_publish(recreate=False, merge_snapshots=False)

    def update_publish(self):
        target_publish_name = self.target_publish_box.currentText()
        component = self.component_box.currentText()

        package_list = []
        for index in reversed(range(self.model.rowCount())):
            currentItem = self.model.item(index)
            if currentItem and currentItem.checkState() != 0:
                package_list.append(currentItem.text())

        wait_dialog = WaitDialog(target_publish_name, self.data_manager, self, component=component,
                                 package_list=package_list, merge=True)

    def fill_publish_box(self):
        self.source_publish_box.clear()
        self.target_publish_box.clear()
        publishes = self.data_manager.get_publish_list()
        for publish in publishes:
            self.source_publish_box.addItem(publish)
            self.target_publish_box.addItem(publish)
        self.source_publish_box.update()
        self.target_publish_box.update()
        # update snapshot box
        if len(publishes) > 0:
            self.update_snapshot_box()

    def update_snapshot_box(self):
        name = self.source_publish_box.currentText()
        current_publish = self.data_manager.get_publish(name)
        current_publish.load()
        self.component_box.clear()
        for component in sorted(list(current_publish.components.keys())):
            self.component_box.addItem(component)
        self.component_box.update()

    def recreate_package_box(self):
        self.model.removeRows(0, self.model.rowCount())
        component = self.component_box.currentText()
        publish = self.source_publish_box.currentText()

        # empty sometimes?
        if not component:
            return

        packages = self.data_manager.get_package_from_publish_component(publish, component)

        for package in packages:
            item = QStandardItem(package)
            item.setCheckable(True)
            item.setCheckState(Qt.Checked)
            self.model.appendRow(item)
        self.package_label.setModel(self.model)

    def reload_component(self):
        if len(self.data_manager.get_publish_list()) > 0:
            self.update_snapshot_box()
Exemple #19
0
class OperacaoLogistica(QDialog):
    #TODO: Acertar formatação na listagem de items por SIMAFIC
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setWindowFlags(Qt.WindowMinMaxButtonsHint
                            | Qt.WindowCloseButtonHint)
        self.setWindowTitle('Operação Logística')
        self.setMinimumSize(QSize(h_size, v_size))
        self.setWindowIcon(QIcon(main_icon))

        verticalSpacer = QSpacerItem(40, 20, QSizePolicy.Minimum,
                                     QSizePolicy.Expanding)

        #Pedido Input Field
        self.proxy_list_result_id = QSortFilterProxyModel()
        self.numero_pedido = QLineEdit(self)
        self.numero_pedido.setPlaceholderText("Insira o Número do Pedido")
        self.numero_pedido.textChanged.connect(
            lambda wildcard: self.proxy_list_result_id.setFilterWildcard(
                wildcard))

        #Voltar Btn
        self.voltar_btn = QPushButton(self)
        #self.voltar_btn.setStyleSheet('background-color: rgb(0,0,255); color: #fff')
        self.voltar_btn.setText('Voltar')
        self.voltar_btn.clicked.connect(self.goMainWindow)
        self.close()

        #Adicionar Cores no StyleSheet
        colors = ['##393318', '  ##fff']
        self.pedidos = services.get_all_pedidos()
        self.item_result = None
        self.item_escolhido = None

        self.id_pedido_list = QListView()
        self.simafics_do_id = QListWidget()
        #self.simafics_do_id.setHidden(True)
        self.createPedidoIdList()

        self.id_pedido_list.clicked.connect(
            lambda id_pedido: self.createListaSimafics(id_pedido))
        self.simafics_do_id.itemDoubleClicked.connect(
            lambda pedido: self.simaficSelecionado(pedido))

        self.pedidos_label = QLabel()
        self.pedidos_label.setBuddy(self.id_pedido_list)
        self.simafic_label = QLabel()
        self.simafic_label.setBuddy(self.simafics_do_id)

        self.itensTree = PedidoItensTree()
        self.treeItensTV = QTreeView()
        self.treeItensTV.setEditTriggers(QAbstractItemView.NoEditTriggers)
        self.treeItensTV.setAlternatingRowColors(True)
        self.treeItensTV.setRootIsDecorated(True)
        self.treeItensTV.doubleClicked.connect(self.simaficSelecionado)
        self.treeItensTV.setColumnHidden(8, True)

        if len(self.pedidos) <= 0:
            self.pedidos_label.setText(
                "É necessário adicionar um pedido na tela de cadastro.")
            self.pedidos_label.setStyleSheet("QLabel { color: red; }")
        else:
            self.pedidos_label.setText("Listagem de Pedidos:")
            self.pedidos_label.setStyleSheet("QLabel { color: black; }")
            self.simafic_label.setText(
                "Selecione um pedido para ver a listagem de Itens por SIMAFIC:"
            )
            self.simafic_label.setStyleSheet("QLabel { color: red; }")

        layout = QGridLayout()
        layout.setColumnStretch(0, 1)
        layout.setColumnStretch(1, 4)
        layout.addWidget(self.numero_pedido, 0, 0)
        layout.addWidget(self.voltar_btn, 0, 1)
        layout.addWidget(self.pedidos_label, 1, 0)
        layout.addWidget(self.simafic_label, 1, 1)
        layout.addWidget(self.id_pedido_list, 2, 0)
        layout.addWidget(self.treeItensTV, 2, 1)
        #layout.addWidget(self.simafics_do_id, 2,1)
        self.setLayout(layout)

    def createPedidoIdList(self):
        print('def createPedidoIdList(self):')
        onlyids = set()
        pedidosbyid = []
        pedidosCompletos = []
        self.proxy_list_result_id = QSortFilterProxyModel()
        for obj in self.pedidos:
            if obj.id_pedido not in onlyids:
                pedidosbyid.append(obj)
                onlyids.add(obj.id_pedido)

        self.pedidoId_model = QStringListModel(onlyids, self)
        self.proxy_list_result_id.setSourceModel(self.pedidoId_model)
        self.id_pedido_list.setModel(self.proxy_list_result_id)
        self.id_pedido_list.setAlternatingRowColors(True)
        self.id_pedido_list.setEditTriggers(QAbstractItemView.NoEditTriggers)

    def createListaSimafics(self, id_pedido):

        pedido = id_pedido.data()
        self.pedidosModel = self.itensTree.createPedidosModel(self.itensTree)
        self.treeItensTV.setModel(self.pedidosModel)
        print('def listaSimafics(self, id_pedido): {id_pedido}'.format(
            id_pedido=pedido))
        self.item_result = None
        self.item_result = [x for x in self.pedidos if x.id_pedido == pedido]
        self.simafics_do_id.clear()
        self.pedidosModel.beginResetModel
        self.pedidosModel.modelReset
        self.pedidosModel.endResetModel

        for idx, item in enumerate(self.item_result):
            print(item)
            self.itensTree.addItens(
                self.pedidosModel, item.cod_simafic, item.desc,
                item.qty_scanneada, item.qty_total, item.nome_responsavel,
                item.id_caixa, item.time_updated.strftime("%d/%m/%y %H:%M:%S"),
                item.id_pedido, item)

        self.simafic_label.setText(
            "Listagem de Itens do pedido {} por SIMAFIC:".format(pedido))
        self.simafic_label.setStyleSheet("QLabel { color: black; }")

        #self.simafics_do_id.setHidden(False)

    def simaficSelecionado(self, item):
        print(item.column(), item.row())
        simafic_escolhido = self.treeItensTV.model().index(item.row(),
                                                           0).data()
        id_pedido = self.treeItensTV.model().index(item.row(), 7).data()
        self.item_escolhido = [
            x for x in self.item_result
            if x.cod_simafic == simafic_escolhido and x.id_pedido == id_pedido
        ]
        self.cams = ItemScanner(self.item_escolhido[0])
        self.cams.show()
        self.close()

    def goMainWindow(self):
        self.cams = mainView
        self.cams.show()
        self.close()

    def goScan(self):
        self.cams = ItemScanner("Eu sou o Pedido", "Eu sou o Simafic",
                                "Eu sou a Descrição", "300")
        self.cams.show()
        self.close()
class ImageInpainting(QWidget):
    PREVIEW_CLIP_WIDTH = 200
    PREVIEW_MASK_WIDTH = 200
    PREVIEW_CLIP_MASK_WIDTH = 200
    PREVIEW_EDGE_WIDTH = 200
    PREVIEW_RESULT_WIDTH = 450

    INFO_READY = 'Info : READY'
    INFO_PROCESS = 'Info : PROCESSING......'
    INFO_FINSH = 'Info : ACCOMPLISHMENT !'

    def __init__(self, parent=None):
        super(ImageInpainting, self).__init__(parent=parent)
        self.parent = parent
        self.image_clip_data = None
        self.image_mask_data = None
        self.image_clip_mask_data = None
        self.image_edge_data = None
        self.image_result_data = None
        self.item_name_to_clip_image_info = {
        }  # (clip image, clip_pos_size, left_up_pos, size)
        self.item_name_to_mask_image_info = {}  # (mask image)
        self.item_name_to_result_image_info = {}  # (edge image, result image)
        self.current_item_name = 'image 1'
        self.edge_model = None
        self.inpaint_model = None
        self.config = None

        self.btn_start = QPushButton('Start Process !', self)
        self.btn_start.clicked.connect(self.on_clicked_start)
        self.btn_show = QPushButton('Show Final Image !', self)
        self.btn_show.clicked.connect(self.on_clicked_show)

        self.thread_inpainting = InpaintingThread(self)

        # label
        ft1, ft2 = QFont(), QFont()
        ft1.setPointSize(15)
        ft2.setPointSize(20)
        self.label_clip = QLabel('Origin image')
        self.label_mask = QLabel('Mask image')
        self.label_clip_mask = QLabel('Origin image with mask')
        self.label_edge = QLabel('generated edge image')
        self.label_result = QLabel('Result')
        self.label_result.setFont(ft1)
        self.label_info = QLabel(self.INFO_READY)
        self.label_info.setFont(ft2)

        # image
        self.label_image_clip = QLabel('image clip')
        self.label_image_mask = QLabel('image mask')
        self.label_image_clip_mask = QLabel('image clip mask')
        self.label_image_edge = QLabel('image edge')
        self.label_image_result = QLabel('image mask')

        # listview
        self.label_listview = QLabel('Select Image')
        self.model_image_clip = QStringListModel(self)
        self.model_image_clip.setStringList(
            self.item_name_to_clip_image_info.keys())
        self.listview_image_clip = QListView(self)
        self.listview_image_clip.setModel(self.model_image_clip)
        self.listview_image_clip.setEditTriggers(
            QAbstractItemView.NoEditTriggers)
        self.listview_image_clip.doubleClicked.connect(
            lambda: self.on_clicked_listview_item(self.listview_image_clip))

        self.vbox_layout1 = QVBoxLayout()
        self.vbox_layout1.addWidget(self.label_clip, alignment=Qt.AlignBottom)
        self.vbox_layout1.addWidget(self.label_image_clip)
        self.vbox_layout1.addWidget(self.label_mask, alignment=Qt.AlignBottom)
        self.vbox_layout1.addWidget(self.label_image_mask)
        self.vbox_layout2 = QVBoxLayout()
        self.vbox_layout2.addWidget(self.label_clip_mask,
                                    alignment=Qt.AlignBottom)
        self.vbox_layout2.addWidget(self.label_image_clip_mask)
        self.vbox_layout2.addWidget(self.label_edge, alignment=Qt.AlignBottom)
        self.vbox_layout2.addWidget(self.label_image_edge)

        self.vbox_layout3 = QVBoxLayout()
        self.vbox_layout3.addWidget(self.label_result)
        self.vbox_layout3.addWidget(self.label_image_result)
        self.vbox_layout3.addWidget(self.label_info)

        self.hbox_layout1 = QHBoxLayout()
        self.hbox_layout1.addLayout(self.vbox_layout1)
        self.hbox_layout1.addLayout(self.vbox_layout2)
        self.vbox_layout4 = QVBoxLayout()
        self.vbox_layout4.addLayout(self.hbox_layout1)
        self.vbox_layout4.addWidget(self.label_listview)
        self.vbox_layout4.addWidget(self.listview_image_clip)

        self.grid_layout = QGridLayout()
        self.grid_layout.addWidget(self.btn_start, 0, 0, 1, 3)
        self.grid_layout.addWidget(self.btn_show, 0, 4, 1, 3)
        self.grid_layout.addLayout(self.vbox_layout4, 1, 0, 9, 6)
        self.grid_layout.addLayout(self.vbox_layout3, 1, 6, 9, 9,
                                   Qt.AlignCenter)
        self.setLayout(self.grid_layout)

    def set_image(self, item_name_to_clip_image_info,
                  item_name_to_mask_image_info):
        self.item_name_to_clip_image_info = item_name_to_clip_image_info
        self.item_name_to_mask_image_info = item_name_to_mask_image_info

        self.model_image_clip.setStringList(
            self.item_name_to_clip_image_info.keys())

        for item_name, image_info in self.item_name_to_clip_image_info.items():
            image_clip_data = image_info[0]
            self.item_name_to_result_image_info[item_name] = \
                (np.zeros(image_clip_data.shape, np.uint8), np.copy(image_clip_data))

        self.set_current_draw('image 1')

    def set_current_draw(self, item_name):
        from image_inpainting_demo import set_label_image
        self.current_item_name = item_name

        # clip image
        self.image_clip_data = self.item_name_to_clip_image_info[
            self.current_item_name][0]
        set_label_image(self.label_image_clip, self.PREVIEW_CLIP_WIDTH,
                        self.image_clip_data)

        # mask image
        self.image_mask_data = self.item_name_to_mask_image_info[
            self.current_item_name][0]
        set_label_image(self.label_image_mask, self.PREVIEW_MASK_WIDTH,
                        self.image_mask_data)

        # clip mask image
        color = (255, 255, 255)
        self.image_clip_mask_data = np.copy(
            (self.image_mask_data / 255 * color) +
            ((1 - self.image_mask_data / 255) * self.image_clip_data))
        self.image_clip_mask_data = np.array(self.image_clip_mask_data,
                                             np.uint8)
        set_label_image(self.label_image_clip_mask,
                        self.PREVIEW_CLIP_MASK_WIDTH,
                        self.image_clip_mask_data)

        # edge image
        self.image_edge_data = self.item_name_to_result_image_info[item_name][
            0]
        set_label_image(self.label_image_edge, self.PREVIEW_EDGE_WIDTH,
                        self.image_edge_data)

        # result image
        self.image_result_data = self.item_name_to_result_image_info[
            item_name][1]
        set_label_image(self.label_image_result, self.PREVIEW_RESULT_WIDTH,
                        self.image_result_data)

        self.parent.setTabEnabled(3, True)
        self.label_info.setText(self.INFO_READY)

    def on_clicked_start(self):
        print('on_click_start')
        self.btn_start.setEnabled(False)
        self.btn_show.setEnabled(False)
        self.parent.setTabEnabled(0, False)
        self.parent.setTabEnabled(1, False)
        self.parent.setTabEnabled(2, False)
        self.label_info.setText(self.INFO_PROCESS)
        self.thread_inpainting.start()

    def on_clicked_show(self):
        row_image_data = np.copy(self.parent.file_explorer.image_selected_data)
        row_img = Image.fromarray(row_image_data)
        for item_name in self.item_name_to_clip_image_info.keys():
            image_result_data = self.item_name_to_result_image_info[item_name][
                1]
            clip_pos_size = self.item_name_to_clip_image_info[item_name][1]
            paste_pos_size = clip_pos_size
            x, y, width, height = paste_pos_size
            result_img = Image.fromarray(image_result_data)
            row_img.paste(result_img, (x, y, x + width, y + height))

        row_img.show('inpainted image')

    def on_clicked_listview_item(self, listview):
        data = listview.currentIndex().data()
        self.set_current_draw(data)

    def image_inpainting(self):
        from shutil import copyfile

        from image_inpainting_demo import set_label_image
        from src.models import EdgeModel
        from src.models import InpaintingModel
        from config import Config

        mode = 2  # test

        if not self.config:
            cfg_path = '.././checkpoints'
            config_path = os.path.join(cfg_path, 'config.yml')
            # create checkpoints path if does't exist
            if not os.path.exists(cfg_path):
                os.makedirs(cfg_path)

            # copy config template if does't exist
            if not os.path.exists(config_path):
                copyfile('./config.yml.example', config_path)

            # load config file
            self.config = Config(config_path)
            self.config.MODE = mode

        # cuda visble devices
        os.environ['CUDA_VISIBLE_DEVICES'] = ','.join(
            str(e) for e in self.config.GPU)

        # init device
        if torch.cuda.is_available():
            self.config.DEVICE = torch.device("cuda")
            torch.backends.cudnn.benchmark = True  # cudnn auto-tuner
        else:
            self.config.DEVICE = torch.device("cpu")

        # set cv2 running threads to 1 (prevents deadlocks with pytorch dataloader)
        cv2.setNumThreads(0)

        # initialize random seed
        torch.manual_seed(self.config.SEED)
        torch.cuda.manual_seed_all(self.config.SEED)
        np.random.seed(self.config.SEED)
        random.seed(self.config.SEED)

        if not self.edge_model and not self.inpaint_model:
            self.edge_model = EdgeModel(self.config).to(self.config.DEVICE)
            self.inpaint_model = InpaintingModel(self.config).to(
                self.config.DEVICE)
            # load model
            self.edge_model.load()
            self.inpaint_model.load()
            # init edge connect
            self.edge_model.eval()
            self.inpaint_model.eval()

        # load dataset
        image_clip_data_list = []
        image_mask_data_list = []
        item_name_list = []
        for item_name in self.item_name_to_clip_image_info.keys():
            item_name_list.append(item_name)
            image_clip_data_list.append(
                self.item_name_to_clip_image_info[item_name][0])
            image_mask_data_list.append(
                self.item_name_to_mask_image_info[item_name][0])
        test_dataset = ImageDataset(self.config,
                                    image_clip_data_list, [],
                                    image_mask_data_list,
                                    augment=False,
                                    training=False)

        # start testing
        print('start testing...')

        test_loader = DataLoader(dataset=test_dataset, batch_size=1)

        def to_cuda(*args):
            return (item.to(self.config.DEVICE)
                    if hasattr(item, 'to') else item for item in args)

        for index, items in enumerate(test_loader):
            ori_shapes, images, images_gray, edges, masks = to_cuda(*items)
            edges = self.edge_model(images_gray, edges, masks).detach()
            outputs = self.inpaint_model(images, edges, masks)
            outputs_merged = (outputs * masks) + (images * (1 - masks))

            # output edge img
            image_edge_data = self._get_image_data_from_tensor(
                edges, ori_shapes)

            # output result img
            image_result_data = self._get_image_data_from_tensor(
                outputs_merged, ori_shapes)

            # save to image info
            item_name = item_name_list[index]
            self.item_name_to_result_image_info[item_name] = (
                image_edge_data, image_result_data)

        print('End test....')

        self.set_current_draw(self.current_item_name)

        self.btn_start.setEnabled(True)
        self.btn_show.setEnabled(True)
        self.parent.setTabEnabled(0, True)
        self.parent.setTabEnabled(1, True)
        self.parent.setTabEnabled(2, True)
        self.label_info.setText(self.INFO_FINSH)

    def _get_image_data_from_tensor(self, gpu_data, ori_shapes):
        # postprocess
        outputs_merged = gpu_data * 255.0
        outputs_merged = outputs_merged.permute(0, 2, 3, 1)
        output = outputs_merged.int()
        output = output[0]

        # output result img
        ori_shapes = [t.item() for t in ori_shapes]
        image = output.cpu().numpy().astype(np.uint8)
        image = image.squeeze()
        image_data = utils.resize(image, ori_shapes[0], ori_shapes[1], False)

        return image_data
Exemple #21
0
class LocationView(QWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # TODO load this from the data layer
        self.name = "Your Home"  # the name of the shown location
        self.ppl = []
        self.push_alt_views = []
        self.push_actions = []
        self.push_ctl = []
        nrof_actions = 3
        nrof_controls = 2
        # create widgets
        self.site_view = QScalingNoticeBoard(parent=self)
        self.person_interact = PersonInteraction(self)
        self.people_list = QListView(self)
        self.calendar_notes_lbl = QLabel(self)
        self.person_site_lbl = QLabel(self)

        # create layout
        grid = QGridLayout(self)
        grid.setRowStretch(0, 2)
        grid.setColumnStretch(0, 1)
        grid.setColumnStretch(1, 7)
        grid.setColumnStretch(2, 2)
        grid.addWidget(self.site_view, 0, 0, 1, 2)
        grid.addWidget(self.people_list, 0, 2, 1, 1)

        hbox2 = QHBoxLayout()
        for _ in range(nrof_actions):
            pushbtn = QPushButton(self)
            hbox2.addWidget(pushbtn)
            self.push_actions.append(pushbtn)
        grid.addLayout(hbox2, 1, 0, 1, 1)

        grid.addWidget(self.calendar_notes_lbl, 1, 1, 1, 1)

        hbox3 = QHBoxLayout()
        hbox3.addWidget(self.person_site_lbl, 2, Qt.AlignLeft)

        for _ in range(nrof_controls):
            pushbtn = QPushButton(self)
            hbox3.addWidget(pushbtn)
            self.push_ctl.append(pushbtn)
        grid.addLayout(hbox3, 1, 2, 1, 1)

        self.setLayout(grid)

        # configure widgets
        self.setContentsMargins(0, 0, 0, 0)
        self.person_site_lbl.setObjectName("text")  # use text style
        self.calendar_notes_lbl.setObjectName("text")
        self.calendar_notes_lbl.setAlignment(Qt.AlignCenter)
        maximized = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
        maximized.setHorizontalStretch(0)
        maximized.setVerticalStretch(0)
        self.setSizePolicy(maximized)
        #        self.site_view.setScaledContents(True)

        model = QStringListModel()
        #        model.setStringList(self.forenames)
        self.people_list.setModel(model)
        self.people_list.setStyleSheet(style.people_list_style)
        self.people_list.setEditTriggers(QListView.NoEditTriggers)
        self.people_list.setProperty("showDropIndicator", False)
        self.people_list.setDefaultDropAction(Qt.IgnoreAction)
        selectionModel = QItemSelectionModel(model)
        self.people_list.setSelectionModel(selectionModel)

        self.setImage(world.locationImage(self.name))

        # TODO: location buttons belong to a location
        btn_size = (100, 35)
        for text, pos in world.locationButtons(self.name):
            pushbtn = QPushButton(self.site_view)
            pushbtn.setGeometry(*pos, *btn_size)
            pushbtn.setText(text)
            pushbtn.setToolTip(text)
            notice = self.site_view.addNotice(pushbtn)
            notice.setFixedGeometry(True)
            self.push_alt_views.append(pushbtn)

        self.retranslateUi()

        # connect signals
        self.push_alt_views[0].clicked.connect(
            self.parent().toggle_school_management)
        selectionModel.selectionChanged.connect(self.on_selectionChanged)

        self.site_view.show()

    def addPerson(self, person):
        self.ppl.append(person)
        self.people_list.model().setStringList(self.forenames)

    def removePerson(self, person):
        pass  # TODO

    def setImage(self, path):
        self.site_view.setPixmap(QPixmap(str(path)))

    def retranslateUi(self):
        tra = QApplication.translate
        ctxt = "LocationView"
        self.person_site_lbl.setText(tra(ctxt, "Oliver Klozoff | Lubriscity"))
        self.calendar_notes_lbl.setText(
            tra(ctxt, "No calendar notes for today"))
        self.push_actions[0].setText(tra(ctxt, "Smartphone"))
        self.push_actions[1].setText(tra(ctxt, "Inventory"))
        self.push_actions[2].setText(tra(ctxt, "Map"))
        self.push_ctl[0].setText(tra(ctxt, "Settings"))
        self.push_ctl[1].setText(tra(ctxt, "Debug"))
        btnnames = [data[0] for data in world.locationButtons(self.name)]
        for btn, text in zip(self.push_alt_views, btnnames):
            btn.setText(tra(ctxt, text))

    @property
    def forenames(self):
        return [p.forename for p in self.ppl]

    @pyqtSlot(QItemSelection, QItemSelection)
    def on_selectionChanged(self, selected, deselected):
        # TODO: implement blur
        #        self.site_view.toggle_blur()
        #        self.person_interact.setVisible(True)
        self.person_interact.exec()
Exemple #22
0
class CollectData(QWidget):
    def __init__(self):
        super().__init__()
        self.init_variable()
        self.init_img()

        self.init_ui()
        self.show()

    '''
    def paintEvent(self, QPaintEvent):
        painter = QPainter(self)
        painter.setPen(QColor(166,66,250))          
        painter.begin(self)
        painter.draw()
        painter.end()
    '''

    def init_img(self):
        self.qlabel = myLabel(self)
        img = cv2.imread('data/test.png')  # 打开图片
        self.qlabel.img = img.copy()
        self.qlabel.img_current = img.copy()
        self.qlabel.update_img()

    def init_variable(self):
        self.label = 0
        self.transformation_type = 0
        self.total_img_number = 0
        self.current_img_index = 0
        self.folder_path = r"data"
        self.jump_img_index = -1
        self.img_list = []
        self.img_name_list = []
        self.whether_to_crop = 0

    def init_ui(self):
        self.setGeometry(200, 200, 1000, 800)
        self.setWindowTitle('数据标注')
        self.qlabel.setGeometry(QRect(30, 30, 640, 480))
        self.init_buttons()

        for file_name in os.listdir(self.folder_path + '/'):
            img = cv2.imread(self.folder_path + '/' + file_name)
            if img is None:
                continue
            self.img_list.append(img)
            self.img_name_list.append(os.path.splitext(file_name)[0])
        #QMessageBox.information(self, 'complete', '图片加载完毕')
        self.total_img_number = len(self.img_list)
        self.current_img_index = 1
        self.refresh_img()

        self.update_list()

    def init_buttons(self):
        self.previous_img_button = QPushButton("上一张图片", self)
        self.next_img_button = QPushButton("下一张图片", self)
        self.save_message_button = QPushButton("保存当前图片信息", self)
        self.show_message_button = QPushButton("显示当前图片信息", self)
        self.open_folder_button = QPushButton("打开文件夹", self)
        self.add_border_button = QPushButton("保存当前框", self)
        self.delete_border_button = QPushButton("删除选中框", self)
        self.img_folder_text = QLineEdit('data', self)
        self.goto_chosen_img_button = QPushButton("跳转图片", self)
        self.jump_img_text = QLineEdit('', self)
        self.show_index_message = QLabel(self)
        self.crop_message_box = QCheckBox('裁剪所选图片', self)

        self.img_folder_text.selectAll()
        self.img_folder_text.setFocus()

        self.previous_img_button.setGeometry(30, 530, 150, 40)
        self.next_img_button.setGeometry(200, 530, 150, 40)
        self.save_message_button.setGeometry(370, 530, 150, 40)
        self.show_message_button.setGeometry(540, 530, 150, 40)
        self.img_folder_text.setGeometry(30, 590, 660, 40)
        self.open_folder_button.setGeometry(710, 590, 150, 40)
        self.jump_img_text.setGeometry(30, 650, 150, 40)
        self.goto_chosen_img_button.setGeometry(200, 650, 150, 40)
        self.show_index_message.setGeometry(30, 710, 300, 40)
        self.crop_message_box.setGeometry(30, 750, 150, 40)
        self.add_border_button.setGeometry(710, 380, 150, 40)
        self.delete_border_button.setGeometry(710, 440, 150, 40)

        self.previous_img_button.clicked.connect(self.previous_img)
        self.next_img_button.clicked.connect(self.next_img)
        self.save_message_button.clicked.connect(self.save_message)
        self.show_message_button.clicked.connect(self.show_message)
        self.open_folder_button.clicked.connect(self.open_folder)
        self.add_border_button.clicked.connect(self.save_current_border)
        self.delete_border_button.clicked.connect(self.delete_border)
        self.goto_chosen_img_button.clicked.connect(self.goto_chosen_img)
        self.crop_message_box.stateChanged.connect(self.crop_message)

        self.label_combo = QComboBox(self)
        for i in range(len(LABEL_LIST)):
            self.label_combo.addItem(LABEL_LIST[i])
        self.label_combo.move(900, 30)
        self.label_combo.activated[str].connect(self.label_on_activated)

        self.listview = QListView(self)
        self.listview.setGeometry(710, 30, 150, 320)
        self.listview.doubleClicked.connect(self.list_clicked)
        self.listview.setEditTriggers(QListView.NoEditTriggers)

    def crop_message(self):
        self.whether_to_crop = self.crop_message_box.checkState()

    def previous_img(self):
        if self.current_img_index == 1:
            QMessageBox.information(self, 'warning', '已经是第一张啦')
            return
        self.current_img_index -= 1
        self.refresh_img()

    def next_img(self):
        if self.current_img_index == self.total_img_number:
            QMessageBox.information(self, 'warning', '已经是最后一张啦')
            return
        self.current_img_index += 1
        self.refresh_img()

    def show_message(self):
        if len(self.qlabel.rectangle_label) > 0:
            reply = QMessageBox.question(self, '确认', '当前有未保存信息,是否继续?',
                                         QMessageBox.Yes | QMessageBox.No,
                                         QMessageBox.No)
            if reply == QMessageBox.No:
                return
        self.qlabel.rectangle_label.clear()
        if os.path.isfile(self.folder_path + '/' +
                          self.img_name_list[self.current_img_index - 1] +
                          '.csv') == False:
            QMessageBox.information(self, 'warning', '当前图片无信息')
            return
        message = pd.read_csv(self.folder_path + '/' +
                              self.img_name_list[self.current_img_index - 1] +
                              '.csv',
                              sep=',',
                              header=None)
        message = np.array(message.T)
        message = message.astype(int)
        for i in range(len(message)):
            self.qlabel.rectangle_label.append(
                Rectangle(message[i][1], message[i][2], message[i][3],
                          message[i][4], True, message[i][0]))
        self.update_list()
        self.refresh_img()

        QMessageBox.information(self, 'complete', '信息加载完毕')

    def open_folder(self):
        self.folder_path = self.img_folder_text.text()
        if os.path.isdir(self.folder_path) == False:
            QMessageBox.information(self, 'warning', '文件夹路径非法')
            return
        self.img_list.clear()
        self.img_name_list.clear()
        for file_name in os.listdir(self.folder_path + '/'):
            img = cv2.imread(self.folder_path + '/' + file_name)
            if img is None:
                continue
            self.img_list.append(img)
            self.img_name_list.append(os.path.splitext(file_name)[0])
        QMessageBox.information(self, 'complete', '图片加载完毕')
        self.total_img_number = len(self.img_list)
        self.current_img_index = 1
        self.refresh_img()

    def goto_chosen_img(self):
        if self.jump_img_text.text().isdigit() == False:
            QMessageBox.information(self, 'warning', '请输入合法的数字')
            return
        if int(self.jump_img_text.text()) <= 0 or int(
                self.jump_img_text.text()) > self.total_img_number:
            QMessageBox.information(self, 'warning', '请输入合法的数字')
            return
        self.current_img_index = int(self.jump_img_text.text())
        self.refresh_img()

    def refresh_img(self):
        img = self.img_list[self.current_img_index - 1]
        self.qlabel.img = img.copy()
        self.qlabel.update_qlabel_img()
        self.qlabel.update_img()
        self.show_index_message.setText('一共' + str(self.total_img_number) +
                                        '张图片,当前第' +
                                        str(self.current_img_index) + '张图片')

    def label_on_activated(self):
        self.label = self.label_combo.currentIndex()

    def update_list(self):
        slm = QStringListModel()
        string_list = []
        for i in range(len(self.qlabel.rectangle_label)):
            string_list.append(
                LABEL_LIST[self.qlabel.rectangle_label[i].label])
        slm.setStringList(string_list)
        self.listview.setModel(slm)

    def list_clicked(self, qModelIndex):
        if self.qlabel.rectangle_label[
                qModelIndex.row()].whether_display == True:
            self.qlabel.rectangle_label[
                qModelIndex.row()].whether_display = False
        else:
            self.qlabel.rectangle_label[
                qModelIndex.row()].whether_display = True
        self.qlabel.update_qlabel_img()
        self.qlabel.update_img()

    def save_current_border(self):
        self.qlabel.save_current_border(self.label)
        self.qlabel.update_qlabel_img()
        self.qlabel.update_img()
        self.update_list()

    def label_clicked(self):
        sender = self.sender()
        if sender == self.label_button:
            self.label = self.label_button.checkedId()

    def save_message(self):
        if self.save_current_angle() == False:
            return
        self.qlabel.rectangle_label.clear()
        self.update_list()
        self.refresh_img()

    def save_current_angle(self):
        save_data = []
        for i in range(5):
            save_data.append([])
        if len(self.qlabel.rectangle_label) > 0:
            if os.path.isfile(self.folder_path + '/' +
                              self.img_name_list[self.current_img_index - 1] +
                              '.csv'):
                reply = QMessageBox.question(self, '确认', '是否覆盖当前图片已保存信息?',
                                             QMessageBox.Yes | QMessageBox.No,
                                             QMessageBox.No)
                if reply == QMessageBox.No:
                    return False
            for i in range(len(self.qlabel.rectangle_label)):
                save_data[0].append(self.qlabel.rectangle_label[i].label)
                save_data[1].append(self.qlabel.rectangle_label[i].x0)
                save_data[2].append(self.qlabel.rectangle_label[i].x1)
                save_data[3].append(self.qlabel.rectangle_label[i].y0)
                save_data[4].append(self.qlabel.rectangle_label[i].y1)

                if os.path.exists('crop_img/') == False:
                    os.makedirs('crop_img/')
                h, w, channel = self.qlabel.img.shape
                img_after_crop = self.qlabel.img[
                    self.qlabel.rectangle_label[i].y0 * h // self.qlabel.
                    qlabel_width:self.qlabel.rectangle_label[i].y1 * h //
                    self.qlabel.qlabel_width,
                    self.qlabel.rectangle_label[i].x0 * w // self.qlabel.
                    qlabel_length:self.qlabel.rectangle_label[i].x1 * w //
                    self.qlabel.qlabel_length]
                if self.whether_to_crop == 1:
                    cv2.imwrite(
                        'crop_img/' +
                        self.img_name_list[self.current_img_index - 1] + '_' +
                        str(i) + '.jpg', img_after_crop)

            if np.shape(np.array(save_data)) != (5, 0):
                np.savetxt(self.folder_path + '/' +
                           self.img_name_list[self.current_img_index - 1] +
                           '.csv',
                           np.array(save_data),
                           delimiter=',')

    def delete_border(self):
        if self.listview.currentIndex().row() > -1:
            self.qlabel.delete_border(self.listview.currentIndex().row())
            self.qlabel.update_qlabel_img()
            self.qlabel.update_img()
            self.update_list()
        else:
            QMessageBox.information(self, 'warning', '请先选中一行')
Exemple #23
0
class MDIHistory(QWidget, _HalWidgetBase):
    def __init__(self, parent=None):
        super(MDIHistory, self).__init__(parent)
        self.setMinimumSize(QSize(300, 200))
        self.setWindowTitle("PyQt5 editor test example")

        lay = QVBoxLayout()
        lay.setContentsMargins(0, 0, 0, 0)
        self.setLayout(lay)

        self.list = QListView()
        self.list.setEditTriggers(QListView.NoEditTriggers)
        self.list.activated.connect(self.activated)
        self.list.setAlternatingRowColors(True)
        self.list.selectionChanged = self.selectionChanged
        self.model = QStandardItemModel(self.list)

        self.MDILine = MDILine()
        self.MDILine.soft_keyboard = False
        self.MDILine.line_up = self.line_up
        self.MDILine.line_down = self.line_down

        # add widgets
        lay.addWidget(self.list)
        lay.addWidget(self.MDILine)
        self.reload()

    def _hal_init(self):
        STATUS.connect('state-off', lambda w: self.setEnabled(False))
        STATUS.connect('state-estop', lambda w: self.setEnabled(False))
        STATUS.connect(
            'interp-idle', lambda w: self.setEnabled(STATUS.machine_is_on(
            ) and (STATUS.is_all_homed() or INFO.NO_HOME_REQUIRED)))
        STATUS.connect('interp-run',
                       lambda w: self.setEnabled(not STATUS.is_auto_mode()))
        STATUS.connect('all-homed',
                       lambda w: self.setEnabled(STATUS.machine_is_on()))

    def reload(self, w=None):
        print 'RELOAD'
        try:
            fp = os.path.expanduser(INFO.MDI_HISTORY_PATH)
            with open(fp, 'r') as inputfile:
                for line in inputfile:
                    line = line.rstrip('\n')
                    item = QStandardItem(line)
                    self.model.appendRow(item)
            self.list.setModel(self.model)
            self.list.scrollToBottom()
        except Exception as e:
            print e
            LOG.error('File path is not valid: {}]n,()'.format(fp), e)

    def line_up(self):
        print 'up'

    def line_down(self):
        print 'down'

    def selectionChanged(self, old, new):
        cmd = self.getSelected()
        self.MDILine.setText(cmd)

    def getSelected(self):
        selected_indexes = self.list.selectedIndexes()
        selected_rows = [item.row() for item in selected_indexes]
        # iterates each selected row in descending order
        for selected_row in sorted(selected_rows, reverse=True):
            text = self.model.item(selected_row).text()
            return text

    def activated(self):
        cmd = self.getSelected()
        self.MDILine.setText(cmd)
        self.MDILine.submit()
        item = QStandardItem(cmd)
        self.model.appendRow(item)
        self.list.update()

    #########################################################################
    # This is how designer can interact with our widget properties.
    # designer will show the pyqtProperty properties in the editor
    # it will use the get set and reset calls to do those actions
    #########################################################################

    def set_soft_keyboard(self, data):
        self.MDILine.soft_keyboard = data

    def get_soft_keyboard(self):
        return self.MDILine.soft_keyboard

    def reset_soft_keyboard(self):
        self.MDILine.soft_keyboard = False

    # designer will show these properties in this order:
    soft_keyboard_option = pyqtProperty(bool, get_soft_keyboard,
                                        set_soft_keyboard, reset_soft_keyboard)
Exemple #24
0
class FontViewWidget(QWidget):
    def __init__(self, statusBar, config, *args, **kwargs):
        super(FontViewWidget, self).__init__(*args, **kwargs)
        self.statusBar = statusBar
        layout = QVBoxLayout(self)
        self.retButton = QToolButton(self)
        self.retButton.setIconSize(QSize(60, 60))
        self.retButton.setToolButtonStyle(Qt.ToolButtonTextUnderIcon)
        self.retButton.setMinimumSize(200, 100)
        self.retButton.setMaximumSize(200, 100)
        layout.addWidget(self.retButton)
        # 过滤输入框
        layout.addWidget(
            QLineEdit(self, textChanged=self.doFilter,
                      placeholderText='过滤...'))
        # Material Font
        self.listView = QListView(self)
        self.listView.setMouseTracking(True)
        self.listView.setViewMode(QListView.IconMode)
        self.listView.setMovement(QListView.Static)
        self.listView.setFlow(QListView.LeftToRight)
        self.listView.setWrapping(True)
        self.listView.setEditTriggers(QListView.NoEditTriggers)
        self.listView.setResizeMode(QListView.Adjust)
        self.listView.doubleClicked.connect(self.onDoubleClicked)
        self.listView.entered.connect(self.onEntered)
        self.dmodel = QStandardItemModel(self.listView)
        self.fmodel = QSortFilterProxyModel(self.listView)
        self.fmodel.setSourceModel(self.dmodel)
        self.fmodel.setFilterRole(Qt.ToolTipRole)
        self.listView.setModel(self.fmodel)
        layout.addWidget(self.listView)

        # 字体加载器
        loader = config[0]

        # 添加Item
        fontMap = json.loads(open(config[1],
                                  'rb').read().decode(encoding='utf_8',
                                                      errors='ignore'),
                             encoding='utf_8')
        for name, _ in fontMap.items():
            item = QStandardItem(loader.icon(name), '')
            item.setData(name, Qt.ToolTipRole)
            item.setData(name, Qt.StatusTipRole)
            item.setTextAlignment(Qt.AlignCenter)
            item.setFlags(item.flags())
            self.dmodel.appendRow(item)

    def doFilter(self, _):
        self.fmodel.setFilterRegExp(self.sender().text())

    def onEntered(self, index):
        index = self.fmodel.mapToSource(index)
        text = index.data(Qt.ToolTipRole)
        if text:
            self.retButton.setText(text)
            self.retButton.setIcon(self.dmodel.itemFromIndex(index).icon())

    def onDoubleClicked(self, index):
        index = self.fmodel.mapToSource(index)
        text = index.data(Qt.ToolTipRole)
        if text:
            QApplication.clipboard().setText(text)
            self.statusBar.showMessage('已复制: %s' % text)
Exemple #25
0
class UploadDialog(QDialog):
    """文件上传对话框"""
    new_infos = pyqtSignal(object)

    def __init__(self):
        super().__init__()
        self.cwd = os.getcwd()
        self.selected = []
        self.max_len = 400
        self.initUI()
        self.set_size()
        self.setStyleSheet(dialog_qss_style)

    def set_values(self, folder_name):
        self.setWindowTitle("上传文件至 ➩ " + str(folder_name))

    def initUI(self):
        self.setWindowTitle("上传文件")
        self.setWindowIcon(QIcon("./icon/upload.ico"))
        self.logo = QLabel()
        self.logo.setPixmap(QPixmap("./icon/logo3.gif"))
        self.logo.setStyleSheet("background-color:rgb(0,153,255);")
        self.logo.setAlignment(Qt.AlignCenter)

        # btn 1
        self.btn_chooseDir = QPushButton("选择文件夹", self)
        self.btn_chooseDir.setObjectName("btn_chooseDir")
        self.btn_chooseDir.setObjectName("btn_chooseDir")
        self.btn_chooseDir.setIcon(QIcon("./icon/folder.gif"))

        # btn 2
        self.btn_chooseMutiFile = QPushButton("选择多文件", self)
        self.btn_chooseDir.setObjectName("btn_chooseMutiFile")
        self.btn_chooseMutiFile.setObjectName("btn_chooseMutiFile")
        self.btn_chooseMutiFile.setIcon(QIcon("./icon/file.ico"))

        # btn 3
        self.btn_deleteSelect = QPushButton("删除", self)
        self.btn_deleteSelect.setObjectName("btn_deleteSelect")
        self.btn_deleteSelect.setIcon(QIcon("./icon/delete.ico"))

        # 列表
        self.list_view = QListView(self)
        self.list_view.setViewMode(QListView.ListMode)
        self.slm = QStandardItem()
        self.model = QStandardItemModel()
        self.list_view.setModel(self.model)
        self.model.removeRows(0, self.model.rowCount())  # 清除旧的选择
        self.list_view.setEditTriggers(QAbstractItemView.NoEditTriggers)
        self.list_view.setSelectionBehavior(QAbstractItemView.SelectRows)
        self.list_view.setSelectionMode(QAbstractItemView.ExtendedSelection)

        self.buttonBox = QDialogButtonBox()
        self.buttonBox.setOrientation(Qt.Horizontal)
        self.buttonBox.setStandardButtons(QDialogButtonBox.Ok
                                          | QDialogButtonBox.Cancel)

        grid = QGridLayout()
        grid.setSpacing(10)
        grid.addWidget(self.logo, 1, 0, 1, 3)
        grid.addWidget(self.btn_chooseDir, 2, 0)
        grid.addWidget(self.btn_chooseMutiFile, 2, 2)
        grid.addWidget(self.list_view, 3, 0, 2, 3)
        grid.addWidget(self.btn_deleteSelect, 5, 0)
        grid.addWidget(self.buttonBox, 5, 1, 1, 2)
        self.setLayout(grid)

        self.setMinimumWidth(350)

        # 设置信号
        self.btn_chooseDir.clicked.connect(self.slot_btn_chooseDir)
        self.btn_chooseMutiFile.clicked.connect(self.slot_btn_chooseMutiFile)
        self.btn_deleteSelect.clicked.connect(self.slot_btn_deleteSelect)

        self.buttonBox.accepted.connect(self.slot_btn_ok)
        self.buttonBox.accepted.connect(self.accept)
        self.buttonBox.rejected.connect(self.clear_old)
        self.buttonBox.rejected.connect(self.reject)

    def set_size(self):
        rows = self.model.rowCount()
        for i in range(rows):
            m_len = int(len(self.model.item(i, 0).text()) * 4)
            if m_len > self.max_len:
                self.max_len = m_len
        rows = 10 if rows >= 10 else rows  # 限制最大高度
        self.resize(self.max_len, 250 + rows * 28)

    def clear_old(self):
        self.selected = []
        self.model.removeRows(0, self.model.rowCount())
        self.set_size()

    def slot_btn_ok(self):
        if self.selected:
            self.new_infos.emit(self.selected)
            self.clear_old()

    def slot_btn_deleteSelect(self):
        _indexes = self.list_view.selectionModel().selection().indexes()
        if not _indexes:
            return
        indexes = []
        for i in _indexes:  # 获取所选行号
            indexes.append(i.row())
        indexes = set(indexes)
        for i in sorted(indexes, reverse=True):
            self.selected.remove(self.model.item(i, 0).text())
            self.model.removeRow(i)
        self.set_size()

    def slot_btn_chooseDir(self):
        dir_choose = QFileDialog.getExistingDirectory(self, "选择文件夹",
                                                      self.cwd)  # 起始路径

        if dir_choose == "":
            return
        if dir_choose not in self.selected:
            self.selected.append(dir_choose)
            self.model.appendRow(
                QStandardItem(QIcon("./icon/folder.gif"), dir_choose))
            self.set_size()

    def slot_btn_chooseMutiFile(self):
        files, _ = QFileDialog.getOpenFileNames(self, "选择多文件", self.cwd,
                                                "All Files (*)")
        if len(files) == 0:
            return

        for _file in files:
            if _file not in self.selected:
                self.selected.append(_file)
                self.model.appendRow(
                    QStandardItem(QIcon("./icon/file.ico"), _file))
        self.set_size()
Exemple #26
0
class MatchViewGroup(QGroupBox):
    def __init__(self, ui_template):
        super(MatchViewGroup, self).__init__()
        """
        Import settings
        """
        self.ui_template = ui_template
        self.settings = import_settings()

        self.current_match = Match()

        self.setTitle('Match View')
        """
        Layout
        """
        self.grid_layout = QGridLayout()
        self.setLayout(self.grid_layout)
        self.grid_layout.setColumnStretch(1, 1)
        self.grid_layout.setColumnStretch(2, 1)
        self.grid_layout.setColumnStretch(3, 1)
        self.grid_layout.setRowStretch(1, 1)
        """
        Rounds list
        """
        self.rounds_list = QListView()
        self.rounds_list_model = QStandardItemModel()
        self.rounds_list.setModel(self.rounds_list_model)
        self.rounds_list.setEditTriggers(QAbstractItemView.NoEditTriggers)
        self.grid_layout.addWidget(self.rounds_list, 0, 0, 2, 1)
        """
        End game state info
        """
        self.end_game_state_info_group = QGroupBox()
        self.end_game_state_info_layout = QVBoxLayout()
        self.end_game_state_info_group.setLayout(
            self.end_game_state_info_layout)
        self.end_game_state_info_group.setTitle('Results')
        self.grid_layout.addWidget(self.end_game_state_info_group, 2, 0, 2, 1)
        # Results
        self.match_seed_label = QLabel()
        self.end_game_state_info_layout.addWidget(self.match_seed_label)
        self.match_winner_label = QLabel()
        self.end_game_state_info_layout.addWidget(self.match_winner_label)
        self.player_A_results_label = QLabel()
        self.end_game_state_info_layout.addWidget(self.player_A_results_label)
        self.player_B_results_label = QLabel()
        self.end_game_state_info_layout.addWidget(self.player_B_results_label)
        self.referee_messages_label = QLabel()
        self.referee_messages_label.setText('Referee Messages')
        self.end_game_state_info_layout.addWidget(self.referee_messages_label)
        self.referee_messages_text = QTextBrowser()
        self.end_game_state_info_layout.addWidget(self.referee_messages_text)

        # Map view
        self.map_view = QGraphicsView()
        self.map_scene = QGraphicsScene()
        self.map_view.setScene(self.map_scene)
        self.grid_layout.addWidget(self.map_view, 1, 1, 2, 2)

        # Add groups and field labels to the match view
        self.groups = {}
        self.populate_fields(self.ui_template, self.grid_layout)

    def populate_fields(self, template, layout, i=0):
        groups = template['groups']
        for group_ in groups:
            group = QGroupBox()
            group.setTitle(group_['title'])
            layout_ = QGridLayout()
            layout_.setSpacing(0)
            group.setLayout(layout_)
            self.groups[group_['name']] = group
            coordinates = [i, 0]
            span = [1, 1]
            if 'row' in group_ and 'col' in group_:
                coordinates = [group_['row'], group_['col']]
            if 'colSpan' in group_ or 'rowSpan' in group_:
                span = [group_.get('rowSpan', 1), group_.get('colSpan', 1)]
            layout.addWidget(group, *coordinates, *span)
            group.fields = {}
            if 'fields' in group_:
                for index, field_ in enumerate(group_['fields']):
                    if field_['name'] == 'worm':
                        field = QLabel()
                        field.setPixmap(QPixmap(field_['resource']))
                        layout_.addWidget(field, index - 1, 0)
                    else:
                        field_label = QLabel()
                        field_label.setText(field_['label'])
                        field = QLabel()
                        if field_['label'] != '':
                            group.fields[field_['name']] = field
                            layout_.addWidget(field_label, index, 0)
                            layout_.addWidget(field, index, 1)
                        else:
                            group.fields[field_['name']] = field
                            layout_.addWidget(field, index, 1)
            if 'groups' in group_:
                self.populate_fields(group_, layout_, index + 1)

    def match_selected(self, *args):
        match = args[0].indexes()[0].data()
        match_logs_directory = self.settings.value('match_logs_directory')
        directory = os.path.join(match_logs_directory, match)
        self.map_scene.clear()
        if os.path.isdir(directory):
            self.load_match(directory)

    def round_selected(self, *args):
        index_array = args[0].indexes()
        if len(index_array):
            index = index_array[0]
            self.current_match.set_current_round(index.data())
            self.update_fields()
            self.draw_map()

    def draw_map(self):
        cells = self.current_match.current_round.state['map']
        self.map_scene.clear()
        self.map_scene.setSceneRect(
            0, 0, self.current_match.state['mapSize'] * PIXEL_SIZE,
            self.current_match.state['mapSize'] * PIXEL_SIZE)
        for row in cells:
            for cell in row:
                pic = QPixmap(IMAGE[cell['type']])
                item = self.map_scene.addPixmap(
                    pic.scaled(PIXEL_SIZE, PIXEL_SIZE))
                item.setPos(cell['x'] * PIXEL_SIZE, cell['y'] * PIXEL_SIZE)
                if 'occupier' in cell:
                    if cell['occupier']['playerId'] == 1:
                        pic = QPixmap(':resources/icons/map/wormA.png')
                    else:
                        pic = QPixmap(':resources/icons/map/wormB.png')
                    item = self.map_scene.addPixmap(
                        pic.scaled(PIXEL_SIZE, PIXEL_SIZE))
                    item.setPos(cell['x'] * PIXEL_SIZE, cell['y'] * PIXEL_SIZE)
                    health_label = QLabel()
                    font = QFont()
                    font.setBold(True)
                    health_label.setFont(font)
                    health_label.setText(
                        str(cell['occupier']['id']) + ' - ' +
                        str(cell['occupier']['health']))
                    item = self.map_scene.addWidget(health_label)
                    item.setPos((cell['x'] - 0.5) * PIXEL_SIZE,
                                (cell['y'] - 1) * PIXEL_SIZE)
                if 'powerup' in cell:
                    pic = QPixmap(IMAGE[cell['powerup']['type']])
                    item = self.map_scene.addPixmap(
                        pic.scaled(PIXEL_SIZE, PIXEL_SIZE))
                    item.setPos(cell['x'] * PIXEL_SIZE, cell['y'] * PIXEL_SIZE)

    def load_match(self, directory):
        self.current_match = Match(directory)
        self.list_rounds()
        self.update_end_game_state()
        self.rounds_list.setCurrentIndex(self.rounds_list_model.index(0, 0))

    def update_end_game_state(self):
        results = self.current_match.end_game_state
        self.match_seed_label.setText(results['seed'])
        self.match_winner_label.setText(results['winner'])
        self.player_A_results_label.setText(results['playerA'])
        self.player_B_results_label.setText(results['playerB'])
        self.referee_messages_text.setText(results['referee'])

    def list_rounds(self):
        match_directory = self.current_match.match_directory
        model = self.rounds_list_model
        model.clear()
        rounds = [
            round_ for round_ in os.listdir(match_directory) if
            'Round' in round_ and os.path.isdir(os.path.join(match_directory))
        ]
        for round_ in rounds:
            item = QStandardItem(round_)
            model.appendRow(item)

    def update_fields(self):
        for group_key, group in self.groups.items():
            if group_key == 'match_info_group':
                state = self.current_match.state
                self.update_labels(group, state)
            if 'player_A_move_info' in group_key:
                temp = [
                    value for key, value in
                    self.current_match.current_round.player_command.items()
                    if 'A -' in key
                ]
                self.update_labels(group, temp[0])
            if 'player_B_move_info' in group_key:
                temp = [
                    value for key, value in
                    self.current_match.current_round.player_command.items()
                    if 'B -' in key
                ]
                self.update_labels(group, temp[0])
            if group_key == 'player_A_info_group':
                temp = [
                    value for key, value in
                    self.current_match.current_round.state.items()
                    if 'A - ' in key
                ]
                self.update_labels(group, temp[0])
            if group_key == 'player_B_info_group':
                temp = [
                    value for key, value in
                    self.current_match.current_round.state.items()
                    if 'B - ' in key
                ]
                self.update_labels(group, temp[0])
            if group_key == 'player_A_worms_info_group':
                players = [player for player in self.current_match.players]
                self.populate_worms_info(group, players[0])
            if group_key == 'player_B_worms_info_group':
                self.populate_worms_info(group, players[1])

    @staticmethod
    def update_labels(group, state):
        for field_key, field in group.fields.items():
            field.setText(str(state[field_key]))
            if field_key == 'colour':
                field.setIcon()

    def populate_worms_info(self, group, player):
        # Clears the layout before re-adding worms info
        for i in reversed(range(group.layout().count())):
            group.layout().itemAt(i).widget().setParent(None)
        worms = self.current_match.current_round.state[player]['worms']
        for worm in worms:
            wormGroup = QGroupBox()
            wormGroup_layout = QGridLayout()
            wormGroup_layout.setSpacing(0)
            wormGroup.setLayout(wormGroup_layout)
            group.layout().addWidget(wormGroup)
            for index, (key, value) in enumerate(worm.items()):
                label_ = QLabel()
                label_.setText(key + ': ')
                label = QLabel()
                label.setText(str(value))
                wormGroup_layout.addWidget(label_, index, 0)
                wormGroup_layout.addWidget(label, index, 1)
class Viewer(QMainWindow):
    loaded_spectrum = {}
    count_rates = {}
    plotted_spectrum = []
    e_plot = []
    e_calibration = []
    mini = 0
    maxi = 14
    plotted_tracking = []
    not_plotted_tracking = []

    def __init__(self):
        super().__init__()
        self.size_policy = QSizePolicy.Expanding
        self.font = QFont()
        self.font.setPointSize(12)
        self.setWindowTitle('Calibrated Spectrum Viewer')
        self.menu()
        self.geometry()
        self.showMaximized()
        self.show()

    def menu(self):
        self.menuFile = self.menuBar().addMenu('&File')
        self.load_new = QAction('&Load New Spectrum')
        self.load_new.triggered.connect(self.new_spectrum)
        self.load_new.setShortcut('Ctrl+O')
        self.load_new.setToolTip('Load a new calibrated spectrum')

        self.save_figure = QAction('&Save Spectrum Image')
        self.save_figure.triggered.connect(self.save_fig)
        self.save_figure.setShortcut('Ctrl+Shift+S')
        self.save_spec = QAction('&Save Spe File')
        self.save_spec.triggered.connect(self.spe)
        self.save_spec.setShortcut('Ctrl+S')
        self.menuFile.addActions(
            [self.load_new, self.save_figure, self.save_spec])

        self.menuEdit = self.menuBar().addMenu('&Edit')
        self.calibrate_spectrum = QAction('&Calibrate Spectrum')
        self.calibrate_spectrum.triggered.connect(self.spectrum_calibrate)
        self.calibrate_spectrum.setShortcut('Ctrl+G')
        self.calibrate_spectrum.setToolTip('Calibrate a raw spectrum')
        self.menuEdit.addActions([self.calibrate_spectrum])

        self.change_zoom = QAction('&Change Zoom Location')
        self.change_zoom.triggered.connect(self.zoom_change)
        self.change_zoom.setShortcut('Ctrl+Z')
        self.change_zoom.setToolTip('Change the initial zoom on the spectrum')

        self.menuView = self.menuBar().addMenu('&View Spectrum Data')
        self.view_energies = QAction('&View Energies')
        self.view_energies.setToolTip('Add Vertical Energy Lines')
        self.view_energies.triggered.connect(self.vert_lines)
        self.view_calibration_energies = QAction('&Calibration Energies')
        self.view_calibration_energies.triggered.connect(self.calib_lines)
        self.view_countrate = QAction('&Count Rates')
        self.view_countrate.triggered.connect(self.rate_tracking)
        self.roi_uncertainty = QAction('&ROI Uncertainties')
        self.roi_uncertainty.triggered.connect(self.roi_count_rate_uncertainty)
        self.res_action = QAction('&Energy Resolution')
        self.res_action.triggered.connect(self.find_peaks)

        self.menuView.addActions([
            self.view_energies, self.change_zoom,
            self.view_calibration_energies, self.view_countrate,
            self.roi_uncertainty, self.res_action
        ])

        self.menuList = self.menuBar().addMenu('&List Mode Data Analysis')
        self.timing_window = QAction('&View Time Decay')
        self.timing_window.triggered.connect(self.time_display)
        self.list_mode = QAction('&Analyze List Mode Data')
        self.list_mode.triggered.connect(self.list_moder)
        self.detection_probability = QAction('&Detection Probability')
        self.detection_probability.triggered.connect(self.detec_prob)
        self.dieaway = QAction('&Analyze Die Away')
        self.dieaway.triggered.connect(self.bck_die_away)
        self.video = QAction('&Save Probability Videos')
        self.video.triggered.connect(self.save_detec_videos)
        self.view_probs = QAction('&View Detection Probability')
        self.view_probs.triggered.connect(self.view_probabilities)

        self.menuList.addActions([
            self.timing_window, self.list_mode, self.detection_probability,
            self.dieaway, self.video, self.view_probs
        ])

    def geometry(self):
        self.open_ = QDockWidget('Loaded Spectrums')
        #initialize the widget to be used for loading the spectrum
        self.open_spectrum = QListView(self)
        self.open_spectrum.setFont(self.font)
        self.open_spectrum.setSizePolicy(self.size_policy, self.size_policy)
        self.open_spectrum.setEditTriggers(QAbstractItemView.NoEditTriggers)

        self.loader = QStandardItemModel()
        self.open_spectrum.setModel(self.loader)
        self.open_spectrum.doubleClicked[QModelIndex].connect(self.update_add)

        self.open_.setWidget(self.open_spectrum)
        self.addDockWidget(Qt.LeftDockWidgetArea, self.open_)
        #initialize the widget to remove a spectrum from the plotter
        self.close_ = QDockWidget('Plotted Spectrum')
        self.close_spectrum = QListView(self)
        self.close_spectrum.setFont(self.font)
        self.close_spectrum.setSizePolicy(self.size_policy, self.size_policy)
        self.close_spectrum.setEditTriggers(QAbstractItemView.NoEditTriggers)

        self.unloader = QStandardItemModel()
        self.close_spectrum.setModel(self.unloader)
        self.close_spectrum.doubleClicked[QModelIndex].connect(
            self.update_close)

        self.close_.setWidget(self.close_spectrum)
        self.addDockWidget(Qt.RightDockWidgetArea, self.close_)

        #add the plot window
        self.plot_window = QWidget()
        layout = QVBoxLayout()
        self.figure = Figure()
        self._canvas = FigureCanvas(self.figure)
        self.toolbar = NavigationToolbar(self._canvas, self)
        layout.addWidget(self.toolbar)
        layout.addWidget(self._canvas)
        self.plot_window.setLayout(layout)
        self.setCentralWidget(self.plot_window)
        self.static_ax = self._canvas.figure.subplots()
        self.static_ax.set_yscale('log')
        self.static_ax.set_xlim(0, 14)
        self.static_ax.set_xlabel('Energy [MeV]')
        self.static_ax.set_ylabel('Count Rate [cps]')
        self.figure.tight_layout()

    def new_spectrum(self):
        self.vals = New()
        self.vals.add.clicked.connect(self.new_getter)

    def new_getter(self):
        self.vals.add_spectrum()
        counts = self.vals.counts
        calibr = self.vals.calibration
        legend = self.vals.legend.text()
        accum_time = self.vals.accum_time
        self.count_rates[legend] = self.vals.count_rate
        self.loaded_spectrum[legend] = [calibr, counts, accum_time]
        self.loader.appendRow(QStandardItem(legend))
        self.not_plotted_tracking.append(legend)

    def vert_lines(self):
        self.widget = QWidget()
        self.widget.setWindowTitle('Add Energies')
        current_lines = ''
        for i in range(len(self.e_plot)):
            if i != 0:
                current_lines += ',{}'.format(self.e_plot[i])
            else:
                current_lines += '{}'.format(self.e_plot[i])
        self.line = QLineEdit(self)
        self.line.setFont(self.font)
        self.line.setSizePolicy(self.size_policy, self.size_policy)
        self.line.setToolTip('Enter energies in MeV, seperated by commas')
        self.line.setText(current_lines)

        self.line_label = QLabel('Energies:', self)
        self.line_label.setFont(self.font)
        self.line_label.setSizePolicy(self.size_policy, self.size_policy)

        self.add = QPushButton('Update')
        self.add.setFont(self.font)
        self.add.setSizePolicy(self.size_policy, self.size_policy)
        self.add.clicked.connect(self.add_lines)
        layout = QGridLayout()
        layout.addWidget(self.line_label, 0, 0)
        layout.addWidget(self.line, 0, 1)
        layout.addWidget(self.add, 1, 0, 1, 2)
        self.widget.setLayout(layout)
        self.widget.show()

    def calib_lines(self):
        self.widget1 = QWidget()
        self.widget1.setWindowTitle('Add Energies')
        current_lines = ''
        for i in range(len(self.e_calibration)):
            if i != 0:
                current_lines += ',{}'.format(self.e_calibration[i])
            else:
                current_lines += '{}'.format(self.e_calibration[i])
        self.line1 = QLineEdit(self)
        self.line1.setFont(self.font)
        self.line1.setSizePolicy(self.size_policy, self.size_policy)
        self.line1.setToolTip(
            'Enter energies in MeV used for calibration, seperated by commas')
        self.line1.setText(current_lines)

        self.line_label1 = QLabel('Energies:', self)
        self.line_label1.setFont(self.font)
        self.line_label1.setSizePolicy(self.size_policy, self.size_policy)

        self.add1 = QPushButton('Update')
        self.add1.setFont(self.font)
        self.add1.setSizePolicy(self.size_policy, self.size_policy)
        self.add1.clicked.connect(self.add_cal_lines)
        layout = QGridLayout()
        layout.addWidget(self.line_label1, 0, 0)
        layout.addWidget(self.line1, 0, 1)
        layout.addWidget(self.add1, 1, 0, 1, 2)
        self.widget1.setLayout(layout)
        self.widget1.show()

    def add_lines(self):
        text = self.line.text().split(sep=',')
        try:
            self.e_plot = [float(i) for i in text]
        except:
            self.e_plot = []
        self.widget.close()
        self.replot()

    def add_cal_lines(self):
        text = self.line1.text().split(sep=',')
        try:
            self.e_calibration = [float(i) for i in text]
        except:
            self.e_calibration = []
        self.widget1.close()
        self.replot()

    def zoom_change(self):
        self.change_zoomed = QWidget()

        min_label = QLabel('Min:[MeV]', self)
        min_label.setFont(self.font)
        min_label.setSizePolicy(self.size_policy, self.size_policy)
        max_label = QLabel('Max:[MeV]', self)
        max_label.setFont(self.font)
        max_label.setSizePolicy(self.size_policy, self.size_policy)

        self.min_ = QLineEdit(self)
        self.min_.setFont(self.font)
        self.min_.setSizePolicy(self.size_policy, self.size_policy)
        self.min_.setText(str(self.mini))

        self.max_ = QLineEdit(self)
        self.max_.setFont(self.font)
        self.max_.setSizePolicy(self.size_policy, self.size_policy)
        self.max_.setText(str(self.maxi))

        self.add_ = QPushButton('Update')
        self.add_.setFont(self.font)
        self.add_.setSizePolicy(self.size_policy, self.size_policy)
        self.add_.clicked.connect(self.zoomed_update)

        layout = QGridLayout()
        layout.addWidget(min_label, 0, 0)
        layout.addWidget(self.min_, 0, 1)
        layout.addWidget(max_label, 1, 0)
        layout.addWidget(self.max_, 1, 1)
        layout.addWidget(self.add_, 2, 0, 1, 2)
        self.change_zoomed.setLayout(layout)
        self.change_zoomed.show()

    def zoomed_update(self):
        self.mini = float(self.min_.text())
        self.maxi = float(self.max_.text())
        self.change_zoomed.close()
        self.replot()

    def update_add(self, index):
        item = self.loader.itemFromIndex(index)
        val = item.text()
        self.plotted_spectrum.append(val)
        #add the item selected to the plotted side
        self.plotted_tracking.append(val)
        self.unloader.appendRow(QStandardItem(val))
        #remove all the values from the add plot
        self.loader.removeRows(0, self.loader.rowCount())
        #remove the values clicked from the not plotted list
        self.not_plotted_tracking.remove(val)
        #add the remaining items back to the options
        for i in self.not_plotted_tracking:
            self.loader.appendRow(QStandardItem(i))
        self.replot()

    def update_close(self, index):
        item = self.unloader.itemFromIndex(index)
        val = item.text()
        self.plotted_spectrum.remove(val)
        #add the value to the not plotted side
        self.not_plotted_tracking.append(val)
        self.loader.appendRow(QStandardItem(val))
        #remove all the values from the unloading side
        self.unloader.removeRows(0, self.unloader.rowCount())
        #remove the value from the tracking list
        self.plotted_tracking.remove(val)
        #put the items back into the unloader
        for i in self.plotted_tracking:
            self.unloader.appendRow(QStandardItem(i))
        self.replot()

    def replot(self):
        self.static_ax.clear()
        self.mouse_tracking()
        self.static_ax.set_yscale('log')
        self.static_ax.set_xlim(self.mini, self.maxi)
        self.static_ax.set_xlabel('Energy [MeV]')
        self.static_ax.set_ylabel('Count Rate [cps]')
        current = list(self.static_ax.get_xticks())

        for i in self.e_plot:
            current.append(i)
            self.static_ax.axvline(i, color='r', linestyle='--', linewidth=0.8)
        for i in self.e_calibration:
            current.append(i)
            self.static_ax.axvline(i, color='k', linestyle='-', linewidth=1)

        for i in self.plotted_spectrum:
            spec = self.loaded_spectrum[i]
            self.static_ax.plot(spec[0],
                                spec[1],
                                label='{}, Accum Time: {}s'.format(i, spec[2]))

        current = [round(float(k), 2) for k in current]
        self.static_ax.set_xticks(current)
        self.static_ax.set_xticklabels(current, rotation=90)
        self.static_ax.legend(prop={'size': 18})
        #        self.static_ax.tick_params(labelsize=18)
        self._canvas.draw()
        self.figure.tight_layout()

    def save_fig(self):
        options = 'Portable Network Graphics (*.png);;'
        options_ = 'Joint Photographic Experts Group(*.jpg)'
        options = options + options_
        file_name, ok = QFileDialog.getSaveFileName(self,
                                                    'Spectrum Image Save', "",
                                                    options)

        if file_name and ok:
            self.figure.savefig(file_name, dpi=600, figsize=(10, 10))

    def spectrum_calibrate(self):
        '''Launch a calibration window
        '''
        self.calibrator = Window()

    def rate_tracking(self):
        '''Show the count rate for all the loaded spectrum
        '''
        self.rater = QWidget()
        self.rater.setWindowTitle('Count Rates')
        editor = QTextEdit()
        editor.setFont(self.font)
        editor.setReadOnly(True)
        editor.setSizePolicy(self.size_policy, self.size_policy)

        for i in list(self.count_rates.keys()):
            editor.append('{}: {:,.2f}cps'.format(i, self.count_rates[i]))
        layout = QVBoxLayout()
        layout.addWidget(editor)
        self.rater.setLayout(layout)
        self.rater.show()

    def mouse_tracking(self):
        self.txt = self.static_ax.text(0.85,
                                       0.6,
                                       "",
                                       transform=self.static_ax.transAxes)
        self.figure.canvas.mpl_connect('motion_notify_event', self.mouse_move)

    def mouse_move(self, event):
        if not event.inaxes:
            return
        self.txt.set_text('Energy: {:,.3f} MeV'.format(event.xdata))
        self._canvas.draw()

    def roi_display(self):
        '''Determine the number of counts 
        in a specified ROI and display them
        '''
        self.change_roi = QWidget()

        min_label = QLabel('Min:[MeV]', self)
        min_label.setFont(self.font)
        min_label.setSizePolicy(self.size_policy, self.size_policy)
        max_label = QLabel('Max:[MeV]', self)
        max_label.setFont(self.font)
        max_label.setSizePolicy(self.size_policy, self.size_policy)

        self.min_roi = QLineEdit(self)
        self.min_roi.setFont(self.font)
        self.min_roi.setSizePolicy(self.size_policy, self.size_policy)

        self.max_roi = QLineEdit(self)
        self.max_roi.setFont(self.font)
        self.max_roi.setSizePolicy(self.size_policy, self.size_policy)

        self.add_roi = QPushButton('Update')
        self.add_roi.setFont(self.font)
        self.add_roi.setSizePolicy(self.size_policy, self.size_policy)
        self.add_roi.clicked.connect(self.roi_update)

        layout = QGridLayout()
        layout.addWidget(min_label, 0, 0)
        layout.addWidget(self.min_roi, 0, 1)
        layout.addWidget(max_label, 1, 0)
        layout.addWidget(self.max_roi, 1, 1)
        layout.addWidget(self.add_roi, 2, 0, 1, 2)
        self.change_roi.setLayout(layout)
        self.change_roi.show()

    def roi_update(self):
        self.change_roi.close()
        roi_counts = {}
        for i in self.plotted_spectrum:
            calibration = self.loaded_spectrum[i]
            ma = 0
            mi = len(calibration[0])
            for j in range(len(calibration[0])):
                if calibration[0][j] <= float(self.max_roi.text()):
                    ma = j
                if calibration[0][j] <= float(self.min_roi.text()):
                    #                    print(calibration[0][j])
                    mi = j
#            print(mi,ma)
            roi_counts[i] = self.loaded_spectrum[i][1][mi:ma]


#        scale the rois by the accumulation time and determine the sum of the
#        area using np
        roi = {}
        for i in list(roi_counts.keys()):
            timer = float(self.loaded_spectrum[i][2])
            scale = 0
            for j in range(len(roi_counts[i])):
                scale += roi_counts[i][j]  #*timer
            roi[i] = scale
        self.roi_counts = roi
        if self.display == False:
            self.uncertain()
        if self.display:
            self.display_roi = QWidget()
            self.display_roi.setWindowTitle('ROI counts')
            rois = QTextEdit()
            rois.setFont(self.font)
            rois.setSizePolicy(self.size_policy, self.size_policy)
            for i in list(roi.keys()):
                rois.append('{}: {:.4f} cps'.format(i, roi[i]))
            layout = QVBoxLayout()
            layout.addWidget(rois)
            self.display_roi.setLayout(layout)
            self.display_roi.show()
        self.display = True

    def spe(self):
        '''Save the selected file out to an spe file format, even though the
        calibration will likely not be correct
        '''
        items = self.loaded_spectrum.keys()
        text, ok = QInputDialog.getItem(self, 'Save Spectrum', 'Saving:',
                                        items, 0, False)
        if ok and text:
            name = QFileDialog.getSaveFileName(self, 'Spe File Name', '',
                                               'IAEA (*.spe)')
            if name != " ":
                try:
                    Save_Spe(self.loaded_spectrum[text], text, name)
                except:
                    pass

    def time_display(self):
        self.di = Time_Window()

    def list_moder(self):
        self.lm = List_Mode_Viewer()

    def roi_count_rate_uncertainty(self):
        '''Calculate the std of the ROI count rates-- will 
        eventaully have the ability to indicate which loaded spectrum 
        are desired'''
        self.display = False
        self.roi_display()
        # self.display=True
    def uncertain(self):
        # now to select the foreground and background spectrum:
        foreground, ok = QInputDialog.getItem(self, 'Foreground',
                                              'Select Foreground',
                                              self.roi_counts.keys(), 0, False)
        background, ok2 = QInputDialog.getItem(self, 'Background',
                                               'Select Background',
                                               self.roi_counts.keys(), 0,
                                               False)
        if ok and ok2:
            #get the count rates from both of them
            uncer = net_std(self.roi_counts[foreground],
                            self.roi_counts[background])
            u = uncer.calculate_uncertainties()
            net_cr = self.roi_counts[foreground] - self.roi_counts[background]
            self.uncertainty_display(u, net_cr, foreground, background)

    def uncertainty_display(self, net_uncer, net_count_rate, foreground,
                            background):
        self.rateu = QWidget()
        self.rateu.setWindowTitle('Count Rates')
        editor = QTextEdit()
        editor.setFont(self.font)
        editor.setReadOnly(True)
        editor.setSizePolicy(self.size_policy, self.size_policy)
        fore_cps = self.roi_counts[foreground]
        back_cps = self.roi_counts[background]
        editorappd = [
            'Foreground: {}: {:.3f} +\- {:.3f} cps'.format(
                foreground, fore_cps,
                fore_cps**0.5), 'Background: {}: {:.3f} +\- {:.3f} cps'.format(
                    background, back_cps, back_cps**0.5),
            'Net: {:.3f} +\- {:.3f} cps'.format(net_count_rate, net_uncer)
        ]
        for i in editorappd:
            editor.append(i)

        layout = QVBoxLayout()
        layout.addWidget(editor)
        self.rateu.setLayout(layout)
        self.rateu.show()

    def bck_die_away(self):
        #get the file
        file_name, ok = QFileDialog.getOpenFileName(
            self, 'Background Die Away List Mode File', "",
            'Comma Seperated File (*.csv);;Text File (*.txt)')

        num_bins, ok2 = QInputDialog.getInt(self, 'Enter number of bins',
                                            'Bins:', 300, 0, 10000)
        if file_name != '' and ok and ok2:
            cts, time = bkg(file_name, num_bins).process_data()
            io = max(cts[1::])
            index = (np.abs(cts - io / 2)).argmin()
            t_12 = time[index]
            lambd = np.log(2) / t_12
            fit = [io * np.exp(-lambd * i) for i in time]
            plt.plot(time[1::], cts[1::], '*')
            # plt.plot(time[1::],fit[1::])
            plt.ylabel('Count Rate (cps)')
            plt.xlabel('Time (s)')
            plt.show()
            f = open('Back_Die_Away.csv', 'w')
            f.write('Time,Counts\n')
            for i in range(len(cts)):
                f.write('{:.5f},{:.5f}\n'.format(cts[i], time[i]))
            f.close()

    def detec_prob(self):
        #get the foreground and background file names and info
        #get the file
        file_nameb, ok = QFileDialog.getOpenFileName(
            self, 'Background List Mode File', "",
            'Comma Seperated File (*.csv);;Text File (*.txt)')
        file_namef, ok2 = QFileDialog.getOpenFileName(
            self, 'Foreground List Mode File', "",
            'Comma Seperated File (*.csv);;Text File (*.txt)')
        if ok and ok2:
            num, ok3 = QInputDialog.getInt(self, 'Detection Probability',
                                           'Percentage:', 99, 0, 100)
            if ok3:
                evals = np.linspace(0, 1800, 181)
                detection_probability = DT(file_namef, file_nameb, evals)
                probs = detection_probability.probs
                probs = [i * 100 for i in probs]
                #need to parse through the probabilities and find the first
                #real data point that doesn't represent a statistical anamoly
                #set a lower threshold to start counting at
                threshold = 90  #if the probability drops below this
                s_index = 0
                for i in range(len(probs)):
                    if probs[i] <= threshold:
                        s_index = i
                        break
                probs = probs[s_index::]
                evals = evals[s_index::]
                time_detect = np.interp(num, probs, evals)
                plt.figure(1)
                plt.plot(evals, probs, '*')
                plt.axvline(
                    time_detect,
                    label='Time to {}% detection probability: {:.2f}s'.format(
                        num, time_detect))
                plt.xlabel('Time(s)')
                plt.ylabel('Probability (%)')
                plt.legend()
                # print(probs)
                plt.show()

                #save the raw data out
                fore_sums = detection_probability.f_sums[s_index::]
                back_sums = detection_probability.b_sums[s_index::]
                analysis_times = detection_probability.a_times[s_index::]
                raw_name, ok3 = QFileDialog.getSaveFileName(
                    self, 'Raw Data Save File Name', "",
                    'Comma Seperated File (*.csv);;Text File (*.txt)')
                if ok3:
                    f = open(raw_name, 'w')
                    for i in range(len(fore_sums)):
                        f.write('{},{},{:.4f},{:.4f}\n'.format(
                            fore_sums[i], back_sums[i], analysis_times[i],
                            probs[i]))
                    f.close()

    def save_detec_videos(self):
        file_nameb, ok = QFileDialog.getOpenFileName(
            self, 'Raw Data File', "",
            'Comma Seperated File (*.csv);;Text File (*.txt)')
        file_nameg, ok1 = QFileDialog.getSaveFileName(self, 'Curve Save File',
                                                      "", 'Multimeda (*.mp4)')
        file_namep, ok2 = QFileDialog.getSaveFileName(self,
                                                      'Probability Save File',
                                                      "", 'Multimeda (*.mp4)')

        if ok and ok1 and ok2:
            Movie = movie(file_nameb, file_nameg, file_namep)
            Movie.save_gaussian()
            Movie.save_probability()

    def find_peaks(self):
        #first get all the plotted spectrum names
        loaded_spectrum = self.plotted_spectrum
        selection, ok = QInputDialog.getItem(self, 'Energy Resolution',
                                             'Selection', loaded_spectrum, 0,
                                             False)
        if ok:
            x = self.loaded_spectrum[selection][1]
            y = self.loaded_spectrum[selection][0]
            #then let the user select which one to pick

            #then get the counts to analyze

            peaks, properties = signal.find_peaks(x, width=3, distance=2)
            e_res = []
            widths = properties['widths']  #the fwhm of the peak
            left = properties['left_ips']  #left point of the fwhm
            right = properties['right_ips']  #right point of the fwhm
            sigma = [i / (2 * np.sqrt(2 * np.log(2)))
                     for i in widths]  #standard deviation
            left_sig = []
            right_sig = []
            #recalculate the peak location based on the average fo the left and right fwhm
            for i in range(len(peaks)):
                avg = (left[i] + right[i]) / 2
                peaks[i] = avg
                left_sig.append(avg - 4 * sigma[i])
                right_sig.append(avg + 4 * sigma[i])
                e_res.append(widths[i] / avg * 100)

            plt.plot(y, x)
            plt.yscale('log')
            _, y_max = plt.gca().get_ylim()
            y_max = y_max - .5 * y_max
            for i in range(len(peaks)):
                plt.axvline(y[int(peaks[i])],
                            linestyle='--',
                            color='m',
                            linewidth=1)
                v = y[int(peaks[i])] + 0.005 * y[int(peaks[i])]
                plt.annotate('{:.2f}%'.format(e_res[i]),
                             xy=(v, y_max),
                             rotation='vertical',
                             color='m')
            # plt.axvspan(y[int(left_sig[2])],y[int(right_sig[2])],facecolor='g',alpha=0.5)
            plt.show()
            return peaks, e_res

    def view_probabilities(self):
        self.view = Plotter()
    def __init__(self):
        super(SoundpacksTab, self).__init__()

        self.tab_disabled = False

        self.qnam = QNetworkAccessManager()

        self.http_reply = None
        self.download_http_reply = None
        self.current_repo_info = None

        self.soundpacks = []
        self.soundpacks_model = None

        self.installing_new_soundpack = False
        self.downloading_new_soundpack = False
        self.extracting_new_soundpack = False

        self.close_after_install = False

        self.game_dir = None
        self.soundpacks_dir = None

        layout = QVBoxLayout()

        top_part = QWidget()
        tp_layout = QHBoxLayout()
        tp_layout.setContentsMargins(0, 0, 0, 0)
        self.tp_layout = tp_layout

        installed_gb = QGroupBox()
        tp_layout.addWidget(installed_gb)
        self.installed_gb = installed_gb

        installed_gb_layout = QVBoxLayout()
        installed_gb.setLayout(installed_gb_layout)
        self.installed_gb_layout = installed_gb_layout

        installed_lv = QListView()
        installed_lv.clicked.connect(self.installed_clicked)
        installed_lv.setEditTriggers(QAbstractItemView.NoEditTriggers)
        installed_gb_layout.addWidget(installed_lv)
        self.installed_lv = installed_lv

        installed_buttons = QWidget()
        ib_layout = QHBoxLayout()
        installed_buttons.setLayout(ib_layout)
        ib_layout.setContentsMargins(0, 0, 0, 0)
        self.ib_layout = ib_layout
        self.installed_buttons = installed_buttons
        installed_gb_layout.addWidget(installed_buttons)

        disable_existing_button = QPushButton()
        disable_existing_button.clicked.connect(self.disable_existing)
        disable_existing_button.setEnabled(False)
        ib_layout.addWidget(disable_existing_button)
        self.disable_existing_button = disable_existing_button

        delete_existing_button = QPushButton()
        delete_existing_button.clicked.connect(self.delete_existing)
        delete_existing_button.setEnabled(False)
        ib_layout.addWidget(delete_existing_button)
        self.delete_existing_button = delete_existing_button

        repository_gb = QGroupBox()
        tp_layout.addWidget(repository_gb)
        self.repository_gb = repository_gb

        repository_gb_layout = QVBoxLayout()
        repository_gb.setLayout(repository_gb_layout)
        self.repository_gb_layout = repository_gb_layout

        repository_lv = QListView()
        repository_lv.clicked.connect(self.repository_clicked)
        repository_lv.setEditTriggers(QAbstractItemView.NoEditTriggers)
        repository_gb_layout.addWidget(repository_lv)
        self.repository_lv = repository_lv

        suggest_new_label = QLabel()
        suggest_new_label.setOpenExternalLinks(True)
        repository_gb_layout.addWidget(suggest_new_label)
        self.suggest_new_label = suggest_new_label

        install_new_button = QPushButton()
        install_new_button.clicked.connect(self.install_new)
        install_new_button.setEnabled(False)
        repository_gb_layout.addWidget(install_new_button)
        self.install_new_button = install_new_button

        top_part.setLayout(tp_layout)
        layout.addWidget(top_part)
        self.top_part = top_part

        details_gb = QGroupBox()
        layout.addWidget(details_gb)
        self.details_gb = details_gb

        details_gb_layout = QGridLayout()

        viewname_label = QLabel()
        details_gb_layout.addWidget(viewname_label, 0, 0, Qt.AlignRight)
        self.viewname_label = viewname_label

        viewname_le = QLineEdit()
        viewname_le.setReadOnly(True)
        details_gb_layout.addWidget(viewname_le, 0, 1)
        self.viewname_le = viewname_le

        name_label = QLabel()
        details_gb_layout.addWidget(name_label, 1, 0, Qt.AlignRight)
        self.name_label = name_label

        name_le = QLineEdit()
        name_le.setReadOnly(True)
        details_gb_layout.addWidget(name_le, 1, 1)
        self.name_le = name_le

        path_label = QLabel()
        details_gb_layout.addWidget(path_label, 2, 0, Qt.AlignRight)
        self.path_label = path_label

        path_le = QLineEdit()
        path_le.setReadOnly(True)
        details_gb_layout.addWidget(path_le, 2, 1)
        self.path_le = path_le

        size_label = QLabel()
        details_gb_layout.addWidget(size_label, 3, 0, Qt.AlignRight)
        self.size_label = size_label

        size_le = QLineEdit()
        size_le.setReadOnly(True)
        details_gb_layout.addWidget(size_le, 3, 1)
        self.size_le = size_le

        homepage_label = QLabel()
        details_gb_layout.addWidget(homepage_label, 4, 0, Qt.AlignRight)
        self.homepage_label = homepage_label

        homepage_tb = QTextBrowser()
        homepage_tb.setReadOnly(True)
        homepage_tb.setOpenExternalLinks(True)
        homepage_tb.setMaximumHeight(23)
        homepage_tb.setLineWrapMode(QTextEdit.NoWrap)
        homepage_tb.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        details_gb_layout.addWidget(homepage_tb, 4, 1)
        self.homepage_tb = homepage_tb

        details_gb.setLayout(details_gb_layout)
        self.details_gb_layout = details_gb_layout

        self.setLayout(layout)

        self.load_repository()
        self.set_text()
Exemple #29
0
class SnapshotTab(QWidget):
    def __init__(self, dataManager, parent=None):
        self.dataManager = dataManager
        super(SnapshotTab, self).__init__(parent)

        # initialize widgets
        self.component_box = QComboBox()
        self.publish_box = QComboBox()
        self.publish_button = QPushButton("Publish")
        self.reload_button = QPushButton("Reload")
        self.package_label = QListView()
        self.package_label.setEditTriggers(QAbstractItemView.NoEditTriggers)

        # place widget in the layout
        layout = QGridLayout()
        layout.addWidget(self.publish_box, 0, 0, 1, 1)
        layout.addWidget(self.component_box, 0, 1, 1, 1)
        layout.addWidget(self.publish_button, 0, 2, 1, 1)
        layout.addWidget(self.package_label, 1, 1, 2, 1)
        layout.addWidget(self.reload_button, 1, 2, 1, 1)
        self.setLayout(layout)

        # initialize data
        self.model = QStandardItemModel(self.package_label)
        self.fill_publish_box()
        self.recreate_package_box()
        # controllers
        self.publish_box.currentIndexChanged.connect(self.update_snapshot_box)
        self.component_box.currentIndexChanged.connect(self.recreate_package_box)
        self.publish_button.clicked.connect(self.update_publish)

    def update_publish(self):
        publish_name = self.publish_box.currentText()
        package_list = []
        for index in reversed(range(self.model.rowCount())):
            currentItem = self.model.item(index)
            if currentItem and currentItem.checkState() != 0:
                package_list.append(currentItem.text())

        # TODO: create function for snapshot name?
        component = self.component_box.currentText()
        waitDialog = WaitDialog(publish_name, self.dataManager, self, component=component, package_list=package_list)

    def fill_publish_box(self):
        self.publish_box.clear()
        publishes = self.dataManager.get_publish_list()
        for publish in publishes:
            self.publish_box.addItem(publish)
        if len(publishes) > 0:
            self.publish_box.update()
            self.update_snapshot_box()

    def update_snapshot_box(self):
        name = self.publish_box.currentText()
        current_publish = self.dataManager.get_publish(name)
        self.component_box.clear()
        for component in sorted(list(current_publish.components.keys())):
            self.component_box.addItem(component)
        self.component_box.update()

    def recreate_package_box(self):
        self.model.removeRows(0, self.model.rowCount())
        component = self.component_box.currentText()
        current_publish = self.publish_box.currentText()

        # empty sometimes?
        if not component:
            return

        packages = self.dataManager.get_package_from_publish_component(current_publish, component)

        for package in packages:
            item = QStandardItem(package)
            item.setCheckable(True)
            item.setCheckState(Qt.Checked)
            self.model.appendRow(item)
        self.package_label.setModel(self.model)

    def reload_component(self):
        if len(self.dataManager.get_publish_list()) > 0:
            self.update_snapshot_box()
            self.recreate_package_box()
Exemple #30
0
class VistaListaPrenotazioniAdmin(QWidget):

    def __init__(self, data_inizio=None, parent=None):
        super(VistaListaPrenotazioniAdmin, self).__init__(parent)
        self.controllore_lista_prenotazioni = ControlloreListaPrenotazioni()
        self.data_inizio = data_inizio

        self.v_layout = QVBoxLayout()
        self.font = QFont("Arial", 15, 15, True)

        #Se non è stata passata alcuna data di inizio visualizza tutte le prenotazioni, altrimenti visualizza le prenotazioni
        #che iniziano in quella data
        if data_inizio is not None:
            self.label_prenotazioni_by_data = QLabel("Arrivi del giorno " + data_inizio.strftime("%d/%m/%Y") + ":")
        else:
            self.label_prenotazioni_by_data = QLabel("Tutte le prenotazioni: ")
        self.label_prenotazioni_by_data.setStyleSheet("font:  20pt \"Papyrus\";""color: rgb(0,0,255);")
        self.label_prenotazioni_by_data.setAlignment(Qt.AlignCenter)
        self.v_layout.addWidget(self.label_prenotazioni_by_data)
        self.v_layout.addSpacing(15)

        self.lista_prenotazioni = QListView()
        self.aggiorna_dati_prenotazioni()
        self.v_layout.addWidget(self.lista_prenotazioni)

        self.bottone_dettagli_prenotaizone = QPushButton("Dettagli prenotazione")
        self.bottone_dettagli_prenotaizone.setFont(self.font)
        self.bottone_dettagli_prenotaizone.setStyleSheet("background-color: rgb(170,180,255);")
        self.bottone_dettagli_prenotaizone.clicked.connect(self.dettagli_prenotazione)
        self.shortcut_open = QShortcut(QKeySequence('Return'), self)
        self.shortcut_open.activated.connect(self.dettagli_prenotazione)
        self.v_layout.addWidget(self.bottone_dettagli_prenotaizone)
        self.v_layout.addSpacing(15)

        #Se è stata passata una data di inizio, verrà creato nella finestra un piccolo sommario della situazione del
        #resort in quella data
        if data_inizio is not None:
            self.label_stato_resort = QLabel("Sommario prenotazioni:")
            self.label_stato_resort.setAlignment(Qt.AlignCenter)
            self.label_stato_resort.setStyleSheet("font:  18pt \"Papyrus\";""color: rgb(0,0,255);")
            self.v_layout.addWidget(self.label_stato_resort)
            self.lista_stato_resort = QListView()
            self.get_stato_resort(data_inizio)
            self.lista_stato_resort.setAlternatingRowColors(True)
            self.lista_stato_resort.setEditTriggers(QAbstractItemView.NoEditTriggers)
            self.v_layout.addWidget(self.lista_stato_resort)

        self.setLayout(self.v_layout)
        self.resize(900, 800)
        self.setWindowTitle("Lista Prenotazioni")

    #Ottiene i dati delle prenotazioni e li mette nella lista visualizzata
    def aggiorna_dati_prenotazioni(self):
        self.modello_lista_prenotazioni = QStandardItemModel()

        for prenotazione in self.controllore_lista_prenotazioni.get_lista_prenotazioni():

            if self.data_inizio == prenotazione.data_inizio:
                item = QStandardItem()
                item.setText("Prenotazione del " + prenotazione.data_inizio.strftime("%d/%m/%Y")
                             + " - " + prenotazione.data_fine.strftime("%d/%m/%Y") + " effettuata da " + prenotazione.email_cliente)
                item.setEditable(False)
                item.setFont(self.font)
                self.modello_lista_prenotazioni.appendRow(item)
            elif self.data_inizio is None:
                item = QStandardItem()
                item.setText("Prenotazione del " + prenotazione.data_inizio.strftime("%d/%m/%Y")
                             + " - " + prenotazione.data_fine.strftime("%d/%m/%Y") + " effettuata da " + prenotazione.email_cliente)
                item.setEditable(False)
                item.setFont(self.font)
                self.modello_lista_prenotazioni.appendRow(item)

        self.lista_prenotazioni.setModel(self.modello_lista_prenotazioni)

    #Visualizza i dettagli della prenotazione selezionata, se non ne è stata selezionata alcuna mostra un messaggio di errore
    def dettagli_prenotazione(self):
        try:
            indice = self.lista_prenotazioni.selectedIndexes()[0].row()
            if self.data_inizio is not None:
                lista_prenotazioni_filtrata = []
                for prenotazione in self.controllore_lista_prenotazioni.get_lista_prenotazioni():
                    if prenotazione.data_inizio == self.data_inizio:
                        lista_prenotazioni_filtrata.append(prenotazione)
                da_visualizzare = lista_prenotazioni_filtrata[indice]
            else:
                da_visualizzare = self.controllore_lista_prenotazioni.get_lista_prenotazioni()[indice]
        except:
            QMessageBox.critical(self, "Errore", "Seleziona la prenotazione da visualizzare", QMessageBox.Ok, QMessageBox.Ok)
            return

        self.vista_prenotazione = VistaPrenotazione(ControllorePrenotazione(da_visualizzare))
        self.vista_prenotazione.show()

    #Crea il sommario dello stato del reort nella data passata come argomento
    def get_stato_resort(self, data_controllo_stato):
        self.modello_stato_resort = QStandardItemModel()

        #Inizializza il numero di posti occupati dei serivizi disponibili a 0
        numero_suite_occupate = 0
        numero_stanze_doppie_occupate = 0
        numero_stanze_familiari_occupate = 0
        numero_bungalow_occupati = 0

        numero_mezzi_elettrici_occupati = 0
        numero_prenotazioni_centro_benessere = 0

        for prenotazione in self.controllore_lista_prenotazioni.get_lista_prenotazioni():

            #Controlla se la data del sommario ricade tra l'inizio e la fine di ogni prenotazione
            if data_controllo_stato >= prenotazione.data_inizio and data_controllo_stato <= prenotazione.data_fine:

                #Se il controllo dà esito positivo, viene aggiunto un posto occupato al servizio di alloggio scelto nella prenotazione
                if prenotazione.servizio_alloggio == Servizio("Suite", "Alloggio", 235):
                    numero_suite_occupate = numero_suite_occupate + 1
                if prenotazione.servizio_alloggio == Servizio("Camera doppia", "Alloggio", 80):
                    numero_stanze_doppie_occupate = numero_stanze_doppie_occupate + 1
                if prenotazione.servizio_alloggio == Servizio("Camera famigliare", "Alloggio", 125):
                    numero_stanze_familiari_occupate = numero_stanze_familiari_occupate + 1
                if prenotazione.servizio_alloggio == Servizio("Bungalow", "Alloggio", 150):
                    numero_bungalow_occupati = numero_bungalow_occupati + 1

                #Se il controllo dà esito positivo, viene aggiunto un numero di posti occupati al servizio aggiuntivo
                # pari al numero di persone della prenotazione
                for servizio_aggiuntivo in prenotazione.servizi_aggiuntivi:
                    if servizio_aggiuntivo == Servizio("Noleggio mezzi elettrici", "Servizi aggiuntivi", 30):
                        numero_mezzi_elettrici_occupati = numero_mezzi_elettrici_occupati + prenotazione.numero_persone
                    if servizio_aggiuntivo == Servizio("Centro benessere", "Servizi aggiuntivi", 50):
                        numero_prenotazioni_centro_benessere = numero_prenotazioni_centro_benessere + prenotazione.numero_persone

        #I dati vengono aggiunti alla lista del sommario tramite degli item
        item_suite = QStandardItem()
        item_suite.setFont(self.font)
        item_suite.setEditable(False)
        item_suite.setText("Suite occupate: " + str(numero_suite_occupate))
        self.modello_stato_resort.appendRow(item_suite)

        item_camere_doppie = QStandardItem()
        item_camere_doppie.setFont(self.font)
        item_camere_doppie.setEditable(False)
        item_camere_doppie.setText("Camere doppie occupate: " + str(numero_stanze_doppie_occupate))
        self.modello_stato_resort.appendRow(item_camere_doppie)

        item_camere_famigliari = QStandardItem()
        item_camere_famigliari.setFont(self.font)
        item_camere_famigliari.setEditable(False)
        item_camere_famigliari.setText("Camere famigliari occupate: " + str(numero_stanze_doppie_occupate))
        self.modello_stato_resort.appendRow(item_camere_famigliari)

        item_bungalow = QStandardItem()
        item_bungalow.setFont(self.font)
        item_bungalow.setEditable(False)
        item_bungalow.setText("Bungalow occupati: " + str(numero_bungalow_occupati))
        self.modello_stato_resort.appendRow(item_bungalow)

        item_vuoto = QStandardItem()
        item_vuoto.setEditable(False)
        self.modello_stato_resort.appendRow(item_vuoto)

        item_mezzi_elettrici = QStandardItem()
        item_mezzi_elettrici.setFont(self.font)
        item_mezzi_elettrici.setEditable(False)
        item_mezzi_elettrici.setText("Numero mezzi elettrici noleggiati: " + str(numero_mezzi_elettrici_occupati))
        self.modello_stato_resort.appendRow(item_mezzi_elettrici)

        item_centro_benessere = QStandardItem()
        item_centro_benessere.setFont(self.font)
        item_centro_benessere.setEditable(False)
        item_centro_benessere.setText("Numero prenotazioni centro benessere: " + str(numero_prenotazioni_centro_benessere))
        self.modello_stato_resort.appendRow(item_centro_benessere)

        self.lista_stato_resort.setModel(self.modello_stato_resort)
Exemple #31
0
class MDIHistory(QWidget, _HalWidgetBase):
    def __init__(self, parent=None):
        super(MDIHistory, self).__init__(parent)
        self.setMinimumSize(QSize(200, 150))    
        self.setWindowTitle("PyQt5 editor test example") 

        lay = QVBoxLayout()
        lay.setContentsMargins(0,0,0,0)
        self.setLayout(lay)

        self.list = QListView()
        self.list.setEditTriggers(QListView.NoEditTriggers)
        self.list.activated.connect(self.activated)
        self.list.setAlternatingRowColors(True)
        self.list.selectionChanged = self.selectionChanged
        self.model = QStandardItemModel(self.list)

        self.MDILine = MDILine()
        self.MDILine.soft_keyboard = False
        self.MDILine.line_up = self.line_up
        self.MDILine.line_down = self.line_down

        STATUS.connect('reload-mdi-history', self.reload)

        # add widgets
        lay.addWidget(self.list)
        lay.addWidget(self.MDILine)

        self.fp = os.path.expanduser(INFO.MDI_HISTORY_PATH)
        try:
            open(self.fp, 'r')
        except:
            open(self.fp, 'a+')
            LOG.debug('MDI History file created: {}'.format(self.fp))
        self.reload()
        self.select_row('last')

    def _hal_init(self):
        STATUS.connect('state-off', lambda w: self.setEnabled(False))
        STATUS.connect('state-estop', lambda w: self.setEnabled(False))
        STATUS.connect('interp-idle', lambda w: self.setEnabled(STATUS.machine_is_on()
                                                                and (STATUS.is_all_homed()
                                                                or INFO.NO_HOME_REQUIRED)))
        STATUS.connect('interp-run', lambda w: self.setEnabled(not STATUS.is_auto_mode()))
        STATUS.connect('all-homed', lambda w: self.setEnabled(STATUS.machine_is_on()))

    def reload(self, w=None ):
        self.model.clear()
        try:
            with open(self.fp,'r') as inputfile:
                for line in inputfile:
                    line = line.rstrip('\n')
                    item = QStandardItem(line)
                    self.model.appendRow(item)
            self.list.setModel(self.model)
            self.list.scrollToBottom()
            if self.MDILine.hasFocus():
                self.select_row('last')
        except:
            LOG.debug('File path is not valid: {}'.format(fp))

    def selectionChanged(self,old, new):
        cmd = self.getSelected()
        self.MDILine.setText(cmd)
        selectionModel = self.list.selectionModel()
        if selectionModel.hasSelection():
            self.row = selectionModel.currentIndex().row()

    def getSelected(self):
        selected_indexes = self.list.selectedIndexes()
        selected_rows = [item.row() for item in selected_indexes]
        # iterates each selected row in descending order
        for selected_row in sorted(selected_rows, reverse=True):
            text = self.model.item(selected_row).text()
            return text

    def activated(self):
        cmd = self.getSelected()
        self.MDILine.setText(cmd)
        self.MDILine.submit()
        self.select_row('down')

    def select_row(self, style):
        selectionModel = self.list.selectionModel()
        parent = QModelIndex()
        self.rows = self.model.rowCount(parent) - 1
        if style == 'last':
            self.row = self.rows
        elif style == 'up':
            if self.row > 0:
                self.row -= 1
            else:
                self.row = self.rows
        elif style == 'down':
            if self.row < self.rows:
                self.row += 1
            else:
                self.row = 0
        else:
            return
        top = self.model.index(self.row, 0, parent)
        bottom = self.model.index(self.row, 0, parent)
        selectionModel.setCurrentIndex(top, QItemSelectionModel.Select | QItemSelectionModel.Rows)
        selection = QItemSelection(top, top)
        selectionModel.clearSelection()
        selectionModel.select(selection, QItemSelectionModel.Select)

    def line_up(self):
        self.select_row('up')

    def line_down(self):
        self.select_row('down')

    #########################################################################
    # This is how designer can interact with our widget properties.
    # designer will show the pyqtProperty properties in the editor
    # it will use the get set and reset calls to do those actions
    #########################################################################

    def set_soft_keyboard(self, data):
        self.MDILine.soft_keyboard = data
    def get_soft_keyboard(self):
        return self.MDILine.soft_keyboard
    def reset_soft_keyboard(self):
        self.MDILine.soft_keyboard = False

    # designer will show these properties in this order:
    soft_keyboard_option = pyqtProperty(bool, get_soft_keyboard, set_soft_keyboard, reset_soft_keyboard)
Exemple #32
0
class Chat(QWidget):
    msg_signal = pyqtSignal(dict)
    after_close = None
    chats = []
    cur_chat = None

    def __init__(self, parent=None):
        super().__init__(parent)

        self.msg_signal.connect(self.fill_msg)
        MsgWorker().do_recv_msg = self.do_recv_msg
        self.setWindowTitle('')
        self.op_bar = QFrame(self)
        self.op_bar.setStyleSheet('background-color:rgb(255, 255, 255);')
        self.send_bar = QFrame(self)
        self.send_bar.setStyleSheet('background-color:rgb(255, 255, 255);')
        self.rcTxt = QTextBrowser(self)
        self.rcTxt.setStyleSheet('background-color:rgb(255, 255, 255);')
        self.sdTxt = QTextEdit(self)
        self.sdTxt.setStyleSheet('background-color:rgb(255, 255, 255);')
        self.btn = QPushButton("发送", self.send_bar)
        self.btn.clicked.connect(self.send)
        self.lv = QListView(self)
        self.lv.setViewMode(QListView.ListMode)
        self.lv.setIconSize(QSize(30, 30))
        self.lv.setEditTriggers(QAbstractItemView.NoEditTriggers)
        self.lv.setResizeMode(QListView.Adjust)
        self.lv_model = QStandardItemModel()
        self.lv.setModel(self.lv_model)
        self.lv.clicked.connect(self.lv_clicked)
        self.lv.move(0, 0)

        w, h = 600, 400
        self.resize(800, 600)

    def resizeEvent(self, evt):
        self.after_resize(evt.size().width(), evt.size().height())

    def after_resize(self, w, h):
        lv_width = 200
        sdTxt_height = 120
        bar_height = 30
        self.op_bar.move(200, h - sdTxt_height - bar_height * 2)
        self.op_bar.resize(w - lv_width, bar_height)
        self.send_bar.move(200, h - bar_height)
        self.send_bar.resize(w - lv_width, bar_height)

        self.lv.resize(lv_width, h)
        self.rcTxt.move(lv_width, 0)
        self.rcTxt.resize(w - lv_width, h - sdTxt_height - bar_height * 2)
        self.sdTxt.move(lv_width, h - sdTxt_height - bar_height)
        self.sdTxt.resize(w - lv_width, sdTxt_height)

    def lv_clicked(self, model_index):
        cur_chat = self.chats[model_index.row()]
        if cur_chat['mode'] == 'user':
            self.setWindowTitle(cur_chat['data'].nick_name)

    def refresh_cur_chat(self):
        if self.cur_chat['mode'] == 'user':
            self.setWindowTitle(self.cur_chat['data'].nick_name)

    def get_in_chat_index(self, chat):
        if chat['mode'] == 'user':
            name = chat['data'].name
            match = lambda x: x['mode'] == 'user' and x['data'].name == name
        for i in range(len(self.chats)):
            if match(self.chats[i]):
                return i

        return -1

    def chat_to(self, chat):
        i = self.get_in_chat_index(chat)
        if i == -1:
            if chat['mode'] == 'user':
                self.lv_model.appendRow(
                    QStandardItem(QIcon("./client/image/man.png"),
                                  chat['data'].nick_name))
            self.chats.append(chat)
            self.cur_chat = chat
            i = len(self.chats) - 1
        else:
            self.cur_chat = self.chats[i]
        self.refresh_cur_chat()
        self.lv.setCurrentIndex(self.lv_model.index(i, 0))

    def fill_msg(self, data):
        ufrom = data['from']
        uto = data['to']
        val = data['val']
        ufrom_nickname = ufrom
        try:
            self.rcTxt.setPlainText(self.rcTxt.toPlainText() + '%s:%s\n' %
                                    (ufrom_nickname, val))
        except Exception as ex:
            print(ex)

    def do_recv_msg(self, data):
        self.msg_signal.emit(data)

    def send(self):
        # val = self.sdTxt.toHtml()
        val = self.sdTxt.toPlainText()
        if self.cur_chat['mode'] == 'user':
            MsgWorker().send_msg(
                msg_lib.build_chat_msg(MsgWorker().user_info.name,
                                       self.cur_chat['data'].name, val))
        # self.rcTxt.setHtml(self.rcTxt.toHtml()+'\n我:%s'%val)
        self.rcTxt.setPlainText(self.rcTxt.toPlainText() + '我:%s\n' % val)
        self.sdTxt.setPlainText('')

    def closeEvent(self, event):
        self.chats.clear()
        if self.after_close:
            self.after_close()
Exemple #33
0
Note2B = QTextEdit()
Note2B.setTabChangesFocus(True)
NotesLayout.addWidget(Note2B)
CreateButton = QPushButton('Save')
CreateButton.clicked.connect(lambda: on_click(0))
NotesLayout.addWidget(CreateButton)
ClearButton = QPushButton('Clear')
ClearButton.clicked.connect(lambda: on_click(1))
NotesLayout.addWidget(ClearButton)

List = QWidget()
List.setObjectName("List")

ListLayout = QGridLayout(List)
NotesListTable = QListView()
NotesListTable.setEditTriggers(QListView.NoEditTriggers)
NotesListTable.setModel(model)
NotesListTable.clicked.connect(lambda: on_select(1))
ListLayout.addWidget(NotesListTable)
NotePreview = QTextBrowser()
ListLayout.addWidget(NotePreview)
EditButton = QPushButton('Edit')
EditButton.clicked.connect(lambda: on_click(2))
ListLayout.addWidget(EditButton)
DeleteButton = QPushButton('Move to Trash')
DeleteButton.clicked.connect(lambda: on_click(3))
ListLayout.addWidget(DeleteButton)

Editor = QWidget()
Editor.setObjectName("Editor")