Example #1
0
    def update_filename_box(self):
        doing_multiple = self.doing_multiple

        model = QStandardItemModel()
        self.filename_box.setModel(model)
        self.icon_file_names.sort(key=sort_key)
        if doing_multiple:
            item = QStandardItem(_('Open to see checkboxes'))
            item.setIcon(QIcon(I('blank.png')))
        else:
            item = QStandardItem('')
        item.setFlags(Qt.ItemFlag(0))
        model.appendRow(item)

        for i, filename in enumerate(self.icon_file_names):
            item = QStandardItem(filename)
            if doing_multiple:
                item.setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsEnabled)
                item.setData(Qt.Unchecked, Qt.CheckStateRole)
            else:
                item.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)
            icon = QIcon(
                QPixmap(os.path.join(self.icon_folder, filename)).scaled(
                    self.filenamebox_view.iconSize(),
                    transformMode=Qt.SmoothTransformation))
            item.setIcon(icon)
            model.appendRow(item)
Example #2
0
    def update_usb_devices(self):
        model = QStandardItemModel()
        bus = dbus.SystemBus()
        self.iface = 'org.freedesktop.DBus.ObjectManager'
        #bus.add_signal_receiver(self.callback_function, signal, iface)
        proxy = bus.get_object("org.freedesktop.UDisks2",
                               "/org/freedesktop/UDisks2")
        self.iface = dbus.Interface(proxy, "org.freedesktop.UDisks2")

        self.iface.connect_to_signal('DeviceAdded', self.device_added_callback)
        self.iface.connect_to_signal('DeviceRemoved',
                                     self.device_removed_callback)
        self.iface.connect_to_signal('InterfacesAdded',
                                     self.device_changed_callback)

        dev1 = get_usb()
        items = get_usb()

        #for text, checked in items:
        for text in sorted(items):

            text_item = QStandardItem(text)
            #checked_item = QStandardItem()
            #checked_item.setData(QVariant(checked), Qt.CheckStateRole)
            model.appendRow(text_item)  #([text_item, checked_item])

        view = QTreeView()
        view.header().hide()
        view.setRootIsDecorated(False)

        combo = self.ui.comboBox_device
        combo.setView(view)
        combo.setModel(model)
        combo.show()
Example #3
0
class ItemList(QWidget):

    _ITEM_NAME, _OPERATIONS = range(2)

    def __init__(self):
        super().__init__()

        self.app_state = AppState()
        self.app_state.addAddItemListener(self._addItemListener)

        self.model = QStandardItemModel()
        self.model.setHeaderData(self._ITEM_NAME, Qt.Horizontal, "Name")
        self.model.setHeaderData(self._OPERATIONS, Qt.Horizontal, "Operations")
        self.model.itemChanged.connect(self._renameListener)
        self.initUI()

    def initUI(self):
        grid = QGridLayout()
        self.setLayout(grid)

        self.tree_view = QTreeView()
        self.tree_view.setModel(self.model)
        self.tree_view.clicked.connect(self._selectedItemListener)

        grid.addWidget(self.tree_view, 0, 0, 19, 1)

        self.load_data_button = QPushButton('Load Data')
        self.load_data_button.clicked.connect(self._loadDatauttonListener)
        grid.addWidget(self.load_data_button, 20, 0, 1, 1)

    #Private
    def _getItemKey(self, item):
        return self.model.itemData(item)[257]

    #Event Handlers
    def _selectedItemListener(self, event):
        key = self._getItemKey(self.tree_view.currentIndex())
        self.app_state.setCurrentItem(key)

    def _loadDatauttonListener(self):
        file_path, file_types = QFileDialog.getOpenFileName(
            self, 'Open file', os.path.expanduser("~"))
        if (len(file_path) <= 0):
            return

        item_data = Loader.load(file_path)
        self.app_state.addItem(item_data)

    #Called when a new item is added to the AppState
    def _addItemListener(self, key, item_data):
        item = QStandardItem(item_data.name)
        item.setData(key)  # Set my custom index as a payload
        item.setSelectable(True)
        item.setEditable(True)
        self.model.appendRow(item)

    def _renameListener(self, item):
        key = item.data()
        self.app_state.renameItemAt(key, item.text())
Example #4
0
    def update_filename_box(self):
        doing_multiple = self.doing_multiple

        model = QStandardItemModel()
        self.filename_box.setModel(model)
        self.icon_file_names.sort(key=sort_key)
        if doing_multiple:
            item = QStandardItem(_('Open to see checkboxes'))
        else:
            item = QStandardItem('')
        model.appendRow(item)

        for i,filename in enumerate(self.icon_file_names):
            item = QStandardItem(filename)
            if doing_multiple:
                item.setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsEnabled)
                item.setData(Qt.Unchecked, Qt.CheckStateRole)
            else:
                item.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)
            icon = QIcon(os.path.join(self.icon_folder, filename))
            item.setIcon(icon)
            model.appendRow(item)
Example #5
0
    def update_filename_box(self):
        doing_multiple = self.doing_multiple

        model = QStandardItemModel()
        self.filename_box.setModel(model)
        self.icon_file_names.sort(key=sort_key)
        if doing_multiple:
            item = QStandardItem(_('Open to see checkboxes'))
        else:
            item = QStandardItem('')
        model.appendRow(item)

        for i, filename in enumerate(self.icon_file_names):
            item = QStandardItem(filename)
            if doing_multiple:
                item.setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsEnabled)
                item.setData(Qt.Unchecked, Qt.CheckStateRole)
            else:
                item.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)
            icon = QIcon(os.path.join(self.icon_folder, filename))
            item.setIcon(icon)
            model.appendRow(item)
Example #6
0
    def update_filename_box(self):
        doing_multiple = self.doing_multiple

        model = QStandardItemModel()
        self.filename_box.setModel(model)
        self.icon_file_names.sort(key=sort_key)
        if doing_multiple:
            item = QStandardItem(_('Open to see checkboxes'))
            item.setIcon(QIcon(I('blank.png')))
        else:
            item = QStandardItem('')
        item.setFlags(Qt.ItemFlag(0))
        model.appendRow(item)

        for i,filename in enumerate(self.icon_file_names):
            item = QStandardItem(filename)
            if doing_multiple:
                item.setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsEnabled)
                item.setData(Qt.Unchecked, Qt.CheckStateRole)
            else:
                item.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)
            icon = QIcon(QPixmap(os.path.join(self.icon_folder, filename)).scaled(self.filenamebox_view.iconSize(), transformMode=Qt.SmoothTransformation))
            item.setIcon(icon)
            model.appendRow(item)
Example #7
0
class RegisterLayoutView(QtWidgets.QWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        layout = QtWidgets.QHBoxLayout()

        self.registerLayout = _RegisterLayout()
        self.registerLayout.SelectedField.connect(self.updateSelected)
        self.registerLayout.UpdatedData.connect(self.updatedData)

        self.scroll = QtWidgets.QScrollArea()

        self.scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
        self.scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.scroll.adjustSize()

        self.scroll.setWidget(self.registerLayout)

        leftLayout = QtWidgets.QVBoxLayout()
        leftLayout.addWidget(self.scroll)

        viewSettings = QtWidgets.QHBoxLayout()

        byteOrderHorizontalGroup = QtWidgets.QGroupBox("Horizontal Bit Order")
        byteOrderHorizontalLayout = QtWidgets.QVBoxLayout()
        byteOrderHorizontalGroup.setLayout(byteOrderHorizontalLayout)
        self.RadioHorizontalMSB = QtWidgets.QRadioButton("MSB")
        self.RadioHorizontalMSB.clicked.connect(self.updateByteOrder)
        self.RadioHorizontalMSB.setChecked(True)
        self.RadioHorizontalLSB = QtWidgets.QRadioButton("LSB")
        self.RadioHorizontalLSB.clicked.connect(self.updateByteOrder)
        byteOrderHorizontalLayout.addWidget(self.RadioHorizontalMSB)
        byteOrderHorizontalLayout.addWidget(self.RadioHorizontalLSB)
        viewSettings.addWidget(byteOrderHorizontalGroup)

        byteOrderVerticalGroup = QtWidgets.QGroupBox("Vertical Bit Order")
        byteOrderVerticalLayout = QtWidgets.QVBoxLayout()
        byteOrderVerticalGroup.setLayout(byteOrderVerticalLayout)
        self.RadioVerticalMSB = QtWidgets.QRadioButton("MSB")
        self.RadioVerticalMSB.clicked.connect(self.updateByteOrder)
        self.RadioVerticalMSB.setChecked(True)
        self.RadioVerticalLSB = QtWidgets.QRadioButton("LSB")
        self.RadioVerticalLSB.clicked.connect(self.updateByteOrder)
        byteOrderVerticalLayout.addWidget(self.RadioVerticalMSB)
        byteOrderVerticalLayout.addWidget(self.RadioVerticalLSB)
        viewSettings.addWidget(byteOrderVerticalGroup)

        self.updateByteOrder()

        bitwidthGroup = QtWidgets.QGroupBox("Bit Width")
        bitwidthLayout = QtWidgets.QVBoxLayout()
        bitwidthGroup.setLayout(bitwidthLayout)
        self.bitwidthSpin = QtWidgets.QSpinBox()
        self.bitwidthSpin.setMinimumHeight(30)
        self.bitwidthSpin.setMinimum(1)
        self.bitwidthSpin.setValue(8)
        self.bitwidthSpin.valueChanged.connect(self.updateBitWidth)
        bitwidthLayout.addWidget(self.bitwidthSpin)
        viewSettings.addWidget(bitwidthGroup)
        self.updateBitWidth()

        leftLayout.addLayout(viewSettings)

        layout.addLayout(leftLayout, 1)  # stretch 1 so it expands

        self.sideBar = QtWidgets.QVBoxLayout()

        self.saveButton = QtWidgets.QPushButton("Save")
        self.saveButton.clicked.connect(self.SaveRequest.emit)
        self.sideBar.addWidget(self.saveButton)

        font = QtGui.QFont()
        font.setPointSize(11)

        NameLabel = QtWidgets.QLabel("Name")
        self.sideBar.addWidget(NameLabel)
        self.LineEditName = QtWidgets.QLineEdit("")
        self.LineEditName.setAlignment(QtCore.Qt.AlignCenter)
        self.LineEditName.setFont(font)
        self.LineEditName.setReadOnly(True)
        self.LineEditName.textChanged.connect(self.updateName)
        self.sideBar.addWidget(self.LineEditName)

        TitleLabel = QtWidgets.QLabel("Title")
        self.sideBar.addWidget(TitleLabel)
        self.LineEditTitle = QtWidgets.QLineEdit("")
        self.LineEditTitle.setAlignment(QtCore.Qt.AlignCenter)
        self.LineEditTitle.setFont(font)
        self.LineEditTitle.setReadOnly(True)
        self.LineEditTitle.textChanged.connect(self.updateTitle)
        self.sideBar.addWidget(self.LineEditTitle)

        self.registerLayout.DoubleClickField.connect(self.focusTitle)

        startLabel = QtWidgets.QLabel("Start")
        startLabel.setContentsMargins(0, 10, 0, 0)
        self.sideBar.addWidget(startLabel)
        self.spinStart = QtWidgets.QSpinBox()
        self.spinStart.setEnabled(False)
        self.spinStart.setMinimumSize(QtCore.QSize(0, 40))
        self.spinStart.setMaximum(1000)
        self.spinStart.valueChanged.connect(self.updateStart)
        self.sideBar.addWidget(self.spinStart)

        endLabel = QtWidgets.QLabel("End")
        endLabel.setContentsMargins(0, 10, 0, 0)
        self.sideBar.addWidget(endLabel)
        self.spinEnd = QtWidgets.QSpinBox()
        self.spinEnd.setEnabled(False)
        self.spinEnd.setMinimumSize(QtCore.QSize(0, 40))
        self.spinEnd.setMaximum(1000)
        self.spinEnd.valueChanged.connect(self.updateEnd)
        self.sideBar.addWidget(self.spinEnd)

        widthLabel = QtWidgets.QLabel("Width")
        widthLabel.setContentsMargins(0, 10, 0, 0)
        self.sideBar.addWidget(widthLabel)
        self.spinWidth = QtWidgets.QSpinBox()
        self.spinWidth.setEnabled(False)
        self.spinWidth.setMinimumSize(QtCore.QSize(0, 40))
        self.spinWidth.setMaximum(1000)
        self.spinWidth.valueChanged.connect(self.updateSpinWidth)
        self.sideBar.addWidget(self.spinWidth)

        descriptionLabel = QtWidgets.QLabel("Description")
        self.sideBar.addWidget(descriptionLabel)
        self.DescriptionTextEdit = QtWidgets.QTextEdit()
        self.DescriptionTextEdit.textChanged.connect(self.updateDescription)
        self.sideBar.addWidget(self.DescriptionTextEdit)

        descriptionLabel = QtWidgets.QLabel("Read/Write")
        self.sideBar.addWidget(descriptionLabel)
        self.ReadWriteComboBox = FieldReadWriteDelegate(None).createEditor(
            None, None, None)
        self.ReadWriteComboBox.currentIndexChanged.connect(
            self.updateReadWrite)
        self.sideBar.addWidget(self.ReadWriteComboBox)

        typeLabel = QtWidgets.QLabel("Type")
        self.sideBar.addWidget(typeLabel)
        self.TypeComboBox = FieldTypeDelegate(None).createEditor(
            None, None, None)
        self.TypeComboBox.currentIndexChanged.connect(self.updateType)
        self.sideBar.addWidget(self.TypeComboBox)

        spacer = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum,
                                       QtWidgets.QSizePolicy.Expanding)
        self.sideBar.addSpacerItem(spacer)

        self.fieldlistModel = QStandardItemModel()

        self.fieldlistView = QtWidgets.QListView()
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum,
                                           QtWidgets.QSizePolicy.Minimum)
        self.fieldlistView.setSizePolicy(sizePolicy)
        self.fieldlistView.setModel(self.fieldlistModel)

        self.fieldlistView.selectionModel().selectionChanged.connect(
            self.changedSelected)

        self.sideBar.addWidget(self.fieldlistView)

        layout.addLayout(self.sideBar)

        self.setLayout(layout)

        self.updateList()

    SaveRequest = QtCore.pyqtSignal()
    CloseRequest = QtCore.pyqtSignal()

    def closeEvent(self, event):
        msg = QtWidgets.QMessageBox()
        msg.setIcon(QtWidgets.QMessageBox.Information)

        msg.setText("Do you want to save?")
        msg.setWindowTitle("Save")
        msg.setStandardButtons(QtWidgets.QMessageBox.Save
                               | QtWidgets.QMessageBox.Cancel
                               | QtWidgets.QMessageBox.Discard)

        retval = msg.exec_()

        if retval == QtWidgets.QMessageBox.Save:
            self.SaveRequest.emit()
            self.CloseRequest.emit()
            event.accept()
        elif retval == QtWidgets.QMessageBox.Discard:
            self.CloseRequest.emit()
            event.accept()
        elif retval == QtWidgets.QMessageBox.Cancel:
            event.ignore()

    #TODO Maybe move to widget
    def deleteSelectedField(self):
        self.registerLayout.fields.remove(self.registerLayout.selected)

        self.registerLayout.selected = None
        self.fieldlistView.clearSelection()
        self.registerLayout.update()
        self.updateList()

    def keyPressEvent(self, e):
        if e.key() == QtCore.Qt.Key_Delete:
            self.deleteSelectedField()

    def focusTitle(self):
        self.LineEditTitle.setFocus()
        self.LineEditTitle.selectAll()

    def updateName(self):
        pass

    def updateDescription(self):
        self.registerLayout.changeSelectedFieldData(
            description=self.DescriptionTextEdit.toPlainText())

    def updateReadWrite(self):
        self.registerLayout.changeSelectedFieldData(
            readWrite=self.ReadWriteComboBox.currentText())

    def updateType(self):
        self.registerLayout.changeSelectedFieldData(
            type=self.TypeComboBox.currentText())

    def updateTitle(self):
        self.registerLayout.changeSelectedFieldData(
            title=self.LineEditTitle.text())

    def updateBitWidth(self):
        self.registerLayout.bitwidth = self.bitwidthSpin.value()
        self.registerLayout.update()

    def updateByteOrder(self):
        if self.RadioVerticalMSB.isChecked():
            self.registerLayout.VerticalMSB = True
        else:
            self.registerLayout.VerticalMSB = False

        if self.RadioHorizontalMSB.isChecked():
            self.registerLayout.HorizontalMSB = True
        else:
            self.registerLayout.HorizontalMSB = False

        self.registerLayout.update()

    def updateSelected(self, field: FieldLayoutItem):

        if isinstance(field, FieldLayoutItem):
            i = field.listItem.index()
            self.fieldlistView.selectionModel().select(
                i, QtCore.QItemSelectionModel.ClearAndSelect)
            self.LineEditName.setReadOnly(False)
            self.LineEditTitle.setReadOnly(False)
            self.spinStart.setEnabled(True)
            self.spinEnd.setEnabled(True)
            self.spinWidth.setEnabled(True)
            self.DescriptionTextEdit.setReadOnly(False)
            self.ReadWriteComboBox.setEnabled(True)
            self.TypeComboBox.setEnabled(True)
        else:
            self.fieldlistView.selectionModel().clearSelection()
            self.LineEditName.setReadOnly(True)
            self.LineEditTitle.setReadOnly(True)
            self.spinStart.setEnabled(False)
            self.spinEnd.setEnabled(False)
            self.spinWidth.setEnabled(False)
            self.DescriptionTextEdit.setReadOnly(True)
            self.ReadWriteComboBox.setEnabled(False)
            self.TypeComboBox.setEnabled(False)

        self.updateSelectedData()

    def updateSelectedData(self):
        if self.registerLayout.selected is not None:
            self.LineEditName.setText(self.registerLayout.selected.name)
            self.LineEditTitle.setText(self.registerLayout.selected.title)

            start = self.registerLayout.selected.bitStart
            end = self.registerLayout.selected.bitEnd
            self.spinStart.setValue(start)
            self.spinEnd.setValue(end)
            self.spinWidth.setValue(start - end + 1)

            self.DescriptionTextEdit.setText(
                self.registerLayout.selected.description)
            self.ReadWriteComboBox.setCurrentText(
                self.registerLayout.selected.readWrite)
            self.TypeComboBox.setCurrentText(self.registerLayout.selected.type)

        else:
            self.LineEditName.setText("Select Field")
            self.LineEditTitle.setText("Select Field")

    def updatedData(self):
        self.updateList()
        self.updateSelectedData()

    def updateStart(self):
        if not self.registerLayout.dragging and self.spinStart.hasFocus():
            end = self.spinEnd.value()
            start = self.spinStart.value()

            if start >= end:
                self.registerLayout.changeSelectedFieldData(start=start)
                self.updateSelectedData()  # To trigger recalculation of width
            else:
                self.spinStart.setValue(end)

    def updateEnd(self):
        if not self.registerLayout.dragging and self.spinEnd.hasFocus():
            end = self.spinEnd.value()
            start = self.spinStart.value()

            if start >= end:
                self.registerLayout.changeSelectedFieldData(end=end)
                self.updateSelectedData()  # To trigger recalculation of width
            else:
                self.spinEnd.setValue(start)

    def updateSpinWidth(self):
        if not self.registerLayout.dragging and self.spinWidth.hasFocus():
            if self.spinWidth.value() > 0:
                self.registerLayout.changeSelectedFieldData(
                    end=self.spinStart.value() - self.spinWidth.value() + 1)
                self.updateSelectedData()  # To update end
            else:
                self.spinWidth.setValue(1)

    def updateList(self):  #TODO Upgrade to a table, with more data
        self.fieldlistModel.clear()
        for field in self.registerLayout.fields:
            field.listItem = QStandardItem(field.name)
            field.listItem.setEditable(False)
            self.fieldlistModel.appendRow(field.listItem)

        if self.registerLayout.selected is not None:
            self.updateSelected(self.registerLayout.selected)

    def changedSelected(self, selected: QtCore.QItemSelection):
        if isinstance(selected, QtCore.QItemSelection):
            if len(selected.indexes()):
                i = selected.indexes()[0].row()
                item = self.fieldlistModel.item(i)

                for field in self.registerLayout.fields:
                    if field.listItem == item:
                        self.registerLayout.setSelected(field)

    def resizeEvent(self, e):
        self.registerLayout.resize(self.scroll.width() - 20,
                                   self.registerLayout.size().height())

    def __getattr__(self, name):
        if name in self.__dict__:
            return self[name]

        return getattr(self._dial, name)
Example #8
0
class Documents_Tab(QWidget):
    
    def __init__(self):
        super(QWidget, self).__init__()
        
        self.main_layout = QGridLayout()
        self.setLayout(self.main_layout)
        
        
        self.tree_labels = QWidget()
        self.tree_labels_layout = QHBoxLayout()
        self.tree_labels.setLayout(self.tree_labels_layout)
        
        self.documents_tree_label = QLabel("List of Documents for Group:")
        self.documents_tree_label.setAlignment(Qt.AlignRight)
        self.documents_tree_group = QLabel("My Group")
        self.documents_tree_group.setAlignment(Qt.AlignLeft)
        self.tree_labels_layout.addWidget(self.documents_tree_label)
        self.tree_labels_layout.addWidget(self.documents_tree_group)
        
        self.tree_labels_layout.setAlignment(Qt.AlignCenter)

        
        self.documents_tree = QListView()
        self.documents_tree_model = QStandardItemModel()
        self.documents_tree.setModel(self.documents_tree_model)
        # self.documents_tree_model.appendRow(StandardItem("medsssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss"))
        #self.documents_tree.setGeometry(30,10,200,400)
        
        self.create_doc_widget = QWidget()
        
        self.create_doc_widget_layout = QVBoxLayout()
        self.create_doc_widget.setLayout(self.create_doc_widget_layout)
        
        self.create_doc_edits_widget = QWidget()
        self.create_doc_edits_widget_layout = QHBoxLayout()
        self.create_doc_edits_widget.setLayout(self.create_doc_edits_widget_layout)
        
        self.create_doc_label = QLabel("Create a Document")
        self.create_doc_label.setAlignment(Qt.AlignCenter)
        self.create_doc_edit = QLineEdit()
        self.create_doc_button = QPushButton("Create")
        self.create_doc_button.clicked.connect(lambda: self.create_doc(self.create_doc_edit.text()))
        
        self.create_doc_edits_widget_layout.addWidget(self.create_doc_edit)
        self.create_doc_edits_widget_layout.addWidget(self.create_doc_button)
        
        self.create_doc_widget_layout.addWidget(self.create_doc_label)
        self.create_doc_widget_layout.addWidget(self.create_doc_edits_widget)
        ###########################################################################
        
        self.share_doc_widget = QWidget()
        
        self.share_doc_widget_layout = QVBoxLayout()
        self.share_doc_widget.setLayout(self.share_doc_widget_layout)
        
        self.share_doc_edits_widget = QWidget()
        self.share_doc_edits_widget_layout = QHBoxLayout()
        self.share_doc_edits_widget.setLayout(self.share_doc_edits_widget_layout)
        
        self.share_doc_label = QLabel("Share a Document")
        self.share_doc_label.setAlignment(Qt.AlignCenter)
        self.share_doc_edit = QLineEdit()
        self.share_doc_button = QPushButton("Share")
        self.share_doc_button.clicked.connect(lambda: self.share_doc(self.share_doc_edit.text()))
        
        self.share_doc_edits_widget_layout.addWidget(self.share_doc_edit)
        self.share_doc_edits_widget_layout.addWidget(self.share_doc_button)
        
        self.share_doc_widget_layout.addWidget(self.share_doc_label)
        self.share_doc_widget_layout.addWidget(self.share_doc_edits_widget)
        ###########################################################################
        self.delete_doc_widget = QWidget()
        self.delete_doc_widget_layout = QVBoxLayout()
        self.delete_doc_widget.setLayout(self.delete_doc_widget_layout)
        
        self.delete_doc_edits_widget = QWidget()
        self.delete_doc_edits_widget_layout = QHBoxLayout()
        self.delete_doc_edits_widget.setLayout(self.delete_doc_edits_widget_layout)
        
        self.delete_doc_label = QLabel("Delete a Document")
        self.delete_doc_label.setAlignment(Qt.AlignCenter)
        self.delete_doc_edit = QLineEdit()
        self.delete_doc_button = QPushButton("Delete")
        self.delete_doc_button.clicked.connect(lambda: self.delete_doc(self.delete_doc_edit.text()))
        
        self.delete_doc_edits_widget_layout.addWidget(self.delete_doc_edit)
        self.delete_doc_edits_widget_layout.addWidget(self.delete_doc_button)
        
        self.delete_doc_widget_layout.addWidget(self.delete_doc_label)
        self.delete_doc_widget_layout.addWidget(self.delete_doc_edits_widget)
        ###########################################################################
        self.main_layout.addWidget(self.tree_labels)
        self.main_layout.addWidget(self.documents_tree)
        self.main_layout.addWidget(self.create_doc_widget)
        self.main_layout.addWidget(self.share_doc_widget)
        self.main_layout.addWidget(self.delete_doc_widget)

    @pyqtSlot()
    def switch_group(self, group):
        #emit signal to group widget needed
        self.documents_tree_group.setText(group)

    @pyqtSlot()
    def get_group_docs(self):
        # db call to groups docs
        pass
    
    @pyqtSlot()
    def create_doc(self, text):
        if text == "":
            error = "No name for creating a doc"
            
        else:
            print("creating doc:", text)
            self.add_doc_to_list(text)
            self.create_doc_edit.setText("")
        
    
    @pyqtSlot()
    def share_doc(self, text):
        if text == "":
            error = "No link for sharing a doc"
            
        else:
            print("sharing doc:", text)
            self.add_doc_to_list(text)
            self.share_doc_edit.setText("")

    
    @pyqtSlot()
    def delete_doc(self, text):
        if text == "":
            error = "No name for sharing a doc"
            
        else:
            print("deleting doc", text)
            self.delete_doc_edit.setText("")
    
    @pyqtSlot()
    def add_doc_to_list(self, doc):
        link = StandardItem(doc)
        self.documents_tree_model.appendRow(link)    
    
    def contextMenuEvent(self, event):
        contextMenu = QMenu(self.documents_tree)
        newAct = contextMenu.addAction("Delete Doc")
        action = contextMenu.exec_(self.mapToGlobal(event.pos()))
        if action == newAct:
            index = self.documents_tree.currentIndex()
            itemText = index.data()
            itemRow = index.row()
            
            self.documents_tree_model.removeRow(itemRow)
            print(itemText)
            print(itemRow)
Example #9
0
class App(QMainWindow):
    def __init__(self):
        super().__init__()
        # self.gfont = FontProperties(fname='assets/PingFang.ttc')
        self.accuser = Accuser()
        self.dbconn = DBConn()
        self.scheduler = Scheduler(self.dbconn)
        self.scheduler_status = False
        self.automaton = ReAutomaton()
        self.analyzer = anal.Analyzer(self.dbconn)
        self.init_ui()

    def closeEvent(self, a0):
        self.scheduler.browser.quit()
        return super().closeEvent(a0)

    def init_ui(self):
        self.setWindowTitle("Weibo Monitor")
        self.setGeometry(30, 30, 1024, 720)
        self.init_components()
        self.show()

    def init_components(self):
        self.gwidget = QTabWidget()
        self.setCentralWidget(self.gwidget)
        self.glayout = QHBoxLayout()
        self.crawl_widget = QWidget()
        self.ana_widget = QWidget()
        self.init_crawl_widget()
        self.init_ana_widget()
        self.gwidget.addTab(self.crawl_widget, "Crawl")
        self.gwidget.addTab(self.ana_widget, "Analyze")
        self.init_triggers()
        self.running = False

    def init_crawl_widget(self):
        self.llayout = QVBoxLayout()
        self.crawl_widget.setLayout(self.llayout)
        self.log_label = QLabel("Log")
        self.log_list = QTableView()
        self.log_model = QStandardItemModel()
        self.log_model.setColumnCount(3)
        self.log_model.setHorizontalHeaderLabels(["Status", "Time", "Message"])
        self.log_list.setModel(self.log_model)
        self.log_list.horizontalHeader().setSectionResizeMode(
            QHeaderView.Stretch)
        self.log_list.horizontalHeader().setSectionResizeMode(
            0, QHeaderView.ResizeToContents)
        self.log_list.horizontalHeader().setSectionResizeMode(
            1, QHeaderView.ResizeToContents)
        self.log_list.horizontalHeader().setSectionResizeMode(
            2, QHeaderView.ResizeToContents)
        log_widget = QWidget()
        log_layout = QVBoxLayout()
        log_layout.addWidget(self.log_label)
        log_layout.addWidget(self.log_list)
        log_widget.setLayout(log_layout)
        self.rule_label = QLabel("Rule")
        self.rule_edit = QTextEdit()
        rule_widget = QWidget()
        rule_layout = QVBoxLayout()
        rule_layout.addWidget(self.rule_label)
        rule_layout.addWidget(self.rule_edit)
        rule_widget.setLayout(rule_layout)
        self.crawl_button = QPushButton('Crawl')
        self.llayout.addWidget(log_widget)
        self.llayout.addWidget(rule_widget)
        self.llayout.addWidget(self.crawl_button)
        self.llayout.setStretch(0, 15)
        self.llayout.setStretch(1, 6)
        self.llayout.setStretch(2, 1)

    def init_ana_widget(self):
        self.rlayout = QHBoxLayout()
        self.ana_widget.setLayout(self.rlayout)
        self.fig = Figure()
        self.canvas = FigureCanvas(self.fig)
        self.canvas_label = QLabel("Result")
        canvas_widget = QWidget()
        canvas_layout = QVBoxLayout()
        canvas_widget.setLayout(canvas_layout)
        canvas_layout.addWidget(self.canvas_label)
        canvas_layout.addWidget(self.canvas)
        canvas_layout.setStretch(0, 1)
        canvas_layout.setStretch(1, 20)

        self.tracklist_panel = QWidget()
        self.tracklist_layout = QVBoxLayout()
        self.tracklist_panel.setLayout(self.tracklist_layout)
        self.init_topic_tracklist()
        self.init_weibo_tracklist()
        self.tracklist_layout.addWidget(self.topic_tracklist_widget)
        self.tracklist_layout.addWidget(self.weibo_tracklist_widget)
        self.rlayout.addWidget(self.tracklist_panel)
        self.rlayout.addWidget(canvas_widget)
        cfg = self.scheduler.load_config()
        for topic_name in cfg['topic_tracklist']:
            self.topic_tracklist_model.appendRow(QStandardItem(topic_name))
        for weibo_id in cfg["weibo_id_tracklist"]:
            self.weibo_tracklist_model.appendRow(QStandardItem(str(weibo_id)))

    def init_topic_tracklist(self):
        self.topic_tracklist = QListView()
        self.topic_tracklist_label = QLabel("Topic Track List")
        self.topic_tracklist_model = QStandardItemModel()
        self.topic_tracklist.setModel(self.topic_tracklist_model)
        topic_tracklist_buttons = QWidget()
        topic_tracklist_buttons_layout = QHBoxLayout()
        topic_tracklist_buttons_layout.setSpacing(0)
        topic_tracklist_buttons_layout.setContentsMargins(0, 0, 0, 0)
        topic_tracklist_buttons.setLayout(topic_tracklist_buttons_layout)
        self.topic_tracklist_add_button = QPushButton("+")
        self.topic_tracklist_del_button = QPushButton("-")
        self.topic_tracklist_conf_button = QPushButton("confirm")
        self.topic_analyze_button = QPushButton("analyze")
        topic_tracklist_buttons_layout.addWidget(
            self.topic_tracklist_add_button)
        topic_tracklist_buttons_layout.addWidget(
            self.topic_tracklist_del_button)
        topic_tracklist_buttons_layout.addStretch(20)
        topic_tracklist_buttons_layout.addWidget(
            self.topic_tracklist_conf_button)
        topic_tracklist_buttons_layout.addWidget(self.topic_analyze_button)
        topic_tracklist_buttons_layout.setStretch(0, 6)
        topic_tracklist_buttons_layout.setStretch(1, 6)
        topic_tracklist_buttons_layout.setStretch(2, 6)
        topic_tracklist_buttons_layout.setStretch(3, 6)
        self.topic_tracklist_widget = QWidget()
        topic_tracklist_layout = QVBoxLayout()
        self.topic_tracklist_widget.setLayout(topic_tracklist_layout)
        topic_tracklist_layout.addWidget(self.topic_tracklist_label)
        topic_tracklist_layout.addWidget(self.topic_tracklist)
        topic_tracklist_layout.addWidget(topic_tracklist_buttons)

    def init_weibo_tracklist(self):
        self.weibo_tracklist = QListView()
        self.weibo_tracklist_label = QLabel("Weibo Track List")
        self.weibo_tracklist_model = QStandardItemModel()
        self.weibo_tracklist.setModel(self.weibo_tracklist_model)
        weibo_tracklist_buttons = QWidget()
        weibo_tracklist_buttons_layout = QHBoxLayout()
        weibo_tracklist_buttons_layout.setSpacing(0)
        weibo_tracklist_buttons_layout.setContentsMargins(0, 0, 0, 0)
        weibo_tracklist_buttons.setLayout(weibo_tracklist_buttons_layout)
        self.weibo_tracklist_add_button = QPushButton("+")
        self.weibo_tracklist_del_button = QPushButton("-")
        self.weibo_tracklist_conf_button = QPushButton("confirm")
        self.weibo_analyze_button = QPushButton("analyze")
        weibo_tracklist_buttons_layout.addWidget(
            self.weibo_tracklist_add_button)
        weibo_tracklist_buttons_layout.addWidget(
            self.weibo_tracklist_del_button)
        weibo_tracklist_buttons_layout.addStretch(20)
        weibo_tracklist_buttons_layout.addWidget(
            self.weibo_tracklist_conf_button)
        weibo_tracklist_buttons_layout.addWidget(self.weibo_analyze_button)
        weibo_tracklist_buttons_layout.setStretch(0, 6)
        weibo_tracklist_buttons_layout.setStretch(1, 6)
        weibo_tracklist_buttons_layout.setStretch(2, 6)
        weibo_tracklist_buttons_layout.setStretch(3, 6)

        self.weibo_sentiment_checkbox = QCheckBox("Comment Sentimnet")
        weibo_analyze_options = QWidget()
        weibo_analyze_options_layout = QHBoxLayout()
        weibo_analyze_options.setLayout(weibo_analyze_options_layout)
        weibo_analyze_options_layout.addWidget(self.weibo_sentiment_checkbox)

        self.weibo_tracklist_widget = QWidget()
        weibo_tracklist_layout = QVBoxLayout()
        self.weibo_tracklist_widget.setLayout(weibo_tracklist_layout)
        weibo_tracklist_layout.addWidget(self.weibo_tracklist_label)
        weibo_tracklist_layout.addWidget(self.weibo_tracklist)
        weibo_tracklist_layout.addWidget(weibo_tracklist_buttons)
        weibo_tracklist_layout.addWidget(weibo_analyze_options)

    def init_triggers(self):
        self.crawl_button.clicked.connect(self.crawl_button_clicked)
        self.topic_tracklist_add_button.clicked.connect(
            self.topic_add_button_clicked)
        self.topic_tracklist_del_button.clicked.connect(
            self.topic_del_button_clicked)
        self.topic_tracklist_conf_button.clicked.connect(
            self.topic_conf_button_clicked)
        self.topic_analyze_button.clicked.connect(
            self.topic_analyze_button_clicked)
        self.weibo_tracklist_add_button.clicked.connect(
            self.weibo_add_button_clicked)
        self.weibo_tracklist_del_button.clicked.connect(
            self.weibo_del_button_clicked)
        self.weibo_tracklist_conf_button.clicked.connect(
            self.weibo_conf_button_clicked)
        self.weibo_analyze_button.clicked.connect(
            self.weibo_analyze_button_clicked)

    @pyqtSlot()
    def crawl_button_clicked(self):
        rule_text = self.rule_edit.toPlainText().strip()
        if rule_text:
            try:
                rule = eval(rule_text)
                assert isinstance(rule, ReRule)
            except Exception as ex:
                QMessageBox.information(self, "Invalid Rule Syntax",
                                        '\n'.join(ex.args))
                return
            self.automaton.set_rule(rule)
        if self.scheduler_status:
            self.log("Restart Crawlers", "INFO")
        else:
            self.scheduler_status = True
            self.crawl_button.setText("Restart Crawler")
            self.log("Start Crawlers", "INFO")
        self.scheduler.terminate()
        self.scheduler.wait()
        self.scheduler.set_weibo_handler(self.handle_weibo)
        self.scheduler.set_topic_handler(self.handle_topic)
        self.scheduler.start()

    @pyqtSlot()
    def topic_analyze_button_clicked(self):
        indexes = self.topic_tracklist.selectedIndexes()
        if not indexes:
            return
        index = indexes[0]
        topic_name = self.topic_tracklist_model.item(index.row()).text()

        if not topic_name:
            return
        topic = self.analyzer.get_topic(topic_name)
        if not topic:
            return
        topic_heat = self.analyzer.get_topic_heat(topic)
        self.fig.clear()
        ax = self.fig.add_subplot(111)
        times = list(map(lambda x: x[0], topic_heat))
        heats = list(map(lambda x: x[1], topic_heat))
        ax.plot(times, heats)
        # ax.set_title(topic_name, fontproperties=self.gfont)
        self.fig.autofmt_xdate()
        self.canvas.draw()

    @pyqtSlot()
    def weibo_analyze_button_clicked(self):
        indexes = self.weibo_tracklist.selectedIndexes()
        if not indexes:
            return
        index = indexes[0]
        weibo_id = self.weibo_tracklist_model.item(index.row()).text()
        if not weibo_id:
            return
        weibo_id = int(weibo_id)

        weibo = self.analyzer.get_weibo(weibo_id)
        if not weibo:
            return
        weibo_heat = self.analyzer.get_weibo_heat(weibo)
        self.fig.clear()
        ax = self.fig.add_subplot(111)
        times = list(map(lambda x: x[0], weibo_heat))
        heats = list(map(lambda x: x[1], weibo_heat))
        ax.plot(times, heats)
        topics = self.analyzer.get_weibo_topics(weibo_id)
        sentiment = self.analyzer.get_sentiment(weibo['text'])
        # ax.set_title('#'.join(topics) + "--Sentiment: {:.3f}".format(sentiment), fontproperties=self.gfont)
        self.fig.autofmt_xdate()
        self.canvas.draw()

    @pyqtSlot()
    def topic_add_button_clicked(self):
        item = QStandardItem("")
        self.topic_tracklist_model.appendRow(item)
        self.topic_tracklist.setCurrentIndex(item.index())

    @pyqtSlot()
    def topic_del_button_clicked(self):
        index = self.topic_tracklist.selectedIndexes()[0]
        self.topic_tracklist_model.removeRow(index.row())
        if self.topic_tracklist_model.rowCount():
            self.topic_tracklist.setCurrentIndex(
                self.topic_tracklist_model.index(0, 0))

    @pyqtSlot()
    def topic_conf_button_clicked(self):
        topics = [
            self.topic_tracklist_model.item(idx).text()
            for idx in range(self.topic_tracklist_model.rowCount())
        ]
        topic_tracklist = ','.join(topics)
        self.scheduler.config.set("TopicSpider", "topic_tracklist",
                                  topic_tracklist)
        with open("config.ini", "w") as fp:
            self.scheduler.config.write(fp)

    @pyqtSlot()
    def weibo_add_button_clicked(self):
        item = QStandardItem("")
        self.weibo_tracklist_model.appendRow(item)
        self.weibo_tracklist.setCurrentIndex(item.index())

    @pyqtSlot()
    def weibo_del_button_clicked(self):
        index = self.weibo_tracklist.selectedIndexes()[0]
        self.weibo_tracklist_model.removeRow(index.row())
        if self.weibo_tracklist_model.rowCount():
            self.weibo_tracklist.setCurrentIndex(
                self.weibo_tracklist_model.index(0, 0))

    @pyqtSlot()
    def weibo_conf_button_clicked(self):
        weibo_ids = [
            self.weibo_tracklist_model.item(idx).text()
            for idx in range(self.weibo_tracklist_model.rowCount())
        ]
        weibo_tracklist = ','.join(weibo_ids)
        self.scheduler.config.set("WeiboSpider", "weibo_id_tracklist",
                                  weibo_tracklist)
        with open("config.ini", "w") as fp:
            self.scheduler.config.write(fp)

    def handle_weibo(self, weibo):
        self.dbconn.process_weibo(weibo)
        if self.automaton.match(weibo.text):
            msg = "Matched Weibo {}: {}".format(weibo.weibo_id,
                                                repr(weibo.text))
            self.log(msg, "WARNING")
            self.handle_matched_weibo(weibo)
        else:
            msg = "Process Weibo {}".format(weibo.weibo_id)
            self.log(msg, "NORMAL")

    def handle_matched_weibo(self, weibo):
        reason = '匹配敏感关键字规则\n' + self.rule_edit.toPlainText()
        if self.accuser.accuse_weibo(weibo, reason):
            msg = "Accuse weibo {}".format(weibo.weibo_id)
            self.log(msg, "INFO")

    def handle_topic(self, topic):
        self.dbconn.process_topic(topic)
        msg = "Process Topic {}".format(repr(topic.name))
        self.log(msg, "NORMAL")

    def log(self, msg, status_str="INFO"):
        time_str = datetime.now().strftime("%Y-%m-%d-%H:%M:%S")
        self.log_model.appendRow([
            QStandardItem(status_str),
            QStandardItem(time_str),
            QStandardItem(msg)
        ])
Example #10
0
class Main_Win(MyQWidget, Ui_Form):
    def __init__(self, *args, **kwargs):
        super(Main_Win, self).__init__(*args, **kwargs)
        self.num = 1  #表格编号
        self.HeJiMoney = 0  #合计金额
        self.data = []
        self.setupUi(self)
        self.startTimer(100, Qt.PreciseTimer)
        self.win_close.connect(self.close_win)
        self.set_tableView()

    def threadstartslot(self):
        """
        开始线程
        :return:
        """
        self.work = Mythread()
        self.work.ZL_Data.connect(self.Set_ZLLcd)
        self.work.start()  # 开启线程

    def Set_ZLLcd(self, int):
        """
        自定义信号ZL_Data的槽函数,用于显示称重重量
        :param int: 称重重量值
        :return: None
        """
        self.Zhongliang.display(int)

    def timerEvent(self, a0: 'QTimerEvent') -> None:
        """
        定时器事件,用于刷新界面,显示金额信息
        :param a0:
        :return:
        """
        self.je = self.doubleSpinBox_2.value() * self.Zhongliang.value()
        self.JinE.display(round(self.je, 1))

    def close_win(self, bool):
        """
        窗口关闭槽函数
        :param bool:
        :return:
        """
        self.work.close()

    def set_tableView(self):
        """
        设置表格格式
        :return:
        """
        # 设置数据层次结构,4行4列
        self.model = QStandardItemModel(0, 4)
        # 设置水平方向四个头标签文本内容
        self.model.setHorizontalHeaderLabels(
            ['编号', '重量(g)', '单价(元/g)', '金额(元)'])
        self.tableView.setModel(self.model)
        # 水平方向标签拓展剩下的窗口部分,填满表格
        self.tableView.horizontalHeader().setStretchLastSection(True)
        self.tableView.horizontalHeader().setSectionResizeMode(
            QHeaderView.Stretch)  # 水平方向,表格大小拓展到适当的尺寸
        # self.tableView.setRowHeight(0,60) #设置行高
        self.tableView.setShowGrid(False)  #不显示网格
        # self.tableView.setEnabled(False)
        self.tableView.setSelectionBehavior(
            QAbstractItemView.SelectRows)  #设置点击选择一整行
        self.tableView.verticalHeader().hide()  #隐藏行头
        self.tableView.setEditTriggers(
            QAbstractItemView.NoEditTriggers)  #单元格不可编辑

    def OKBtn_click(self):
        val = []
        self.model.removeRow(self.num - 1)
        self.HeJiMoney = self.HeJiMoney + self.je
        val.append(QStandardItem("%d" % self.num))
        val.append(QStandardItem("%d" % self.Zhongliang.value()))
        val.append(QStandardItem("%.2f" % self.doubleSpinBox_2.value()))
        val.append(QStandardItem("%.1f" % self.je))
        self.data.append(val)
        self.model.appendRow(val)
        self.model.item(self.num - 1, 0).setTextAlignment(Qt.AlignCenter)
        self.model.item(self.num - 1, 1).setTextAlignment(Qt.AlignCenter)
        self.model.item(self.num - 1, 2).setTextAlignment(Qt.AlignCenter)
        self.model.item(self.num - 1, 3).setTextAlignment(Qt.AlignCenter)
        self.model.setItem(self.num, 3,
                           QStandardItem("合计:%.1f" % self.HeJiMoney))
        self.model.item(self.num, 3).setTextAlignment(Qt.AlignCenter)
        self.tableView.scrollToBottom()  #滚动到最底部
        self.num += 1

    def JieZhangBtn_click(self):
        for r in range(self.num - 1):
            self.model.removeRow(0)
        self.HeJiMoney = 0
        self.data.clear()
        self.num = 1

    def XiuGaiBtn_click(self):
        if len(self.data) != 0:  #判断是否还有数据
            self.HeJiMoney -= float(self.data[-1][3].text())
            self.data.pop()
            if self.HeJiMoney < 0:
                self.HeJiMoney = 0
            self.model.removeRow(self.num - 2)  #删除最后一次数据
            self.model.removeRow(self.num - 1)  #删除合计金额行
            self.model.setItem(self.num - 2, 3,
                               QStandardItem("合计:%.1f" % self.HeJiMoney))
            self.model.item(self.num - 2, 3).setTextAlignment(Qt.AlignCenter)
            self.num -= 1
            if self.num < 1:
                self.num = 1

    def QuPiBtn_click(self):
        UserCommunication.Write_Data("QP1")