コード例 #1
0
ファイル: main.py プロジェクト: petersohn/photo-organizer
 def _select_next(self, view: W.QListView, sorted_rows: List[int]) -> None:
     if not sorted_rows:
         return
     next_row = sorted_rows[0] - len(sorted_rows) + 1
     row_count = view.model().rowCount()
     if next_row >= row_count:
         next_row = row_count - 1
     view.setCurrentIndex(view.model().index(next_row, 0))
コード例 #2
0
 def synchronize_selection(self, from_list: QListView, to_list: QListView):
     source_selection_model: QItemSelectionModel = from_list.selectionModel()
     destination_selection_model: QItemSelectionModel = to_list.selectionModel()
     rows = source_selection_model.selectedRows()
     if len(rows) > 0:
         idx = [r.row() for r in rows]
         min_idx, max_idx = min(idx), max(idx)
         top_index = QModelIndex(to_list.model().index(min_idx, 0))
         bottom_index = QModelIndex(to_list.model().index(max_idx, 0))
         destination_selection_model.select(QItemSelection(top_index, bottom_index),
                                            QItemSelectionModel.ClearAndSelect)
コード例 #3
0
 def makeTitleStyleBox(self) -> QComboBox:
     """
     Create Title Style Drop Down
     """
     # ComboBox for title style
     self.combo_title_style = QComboBox(self)
     view = QListView(self.combo_title_style)
     view.setStyleSheet("QListView::item { height : 23 px; }"
                        "selection-background-color: rgba(0,0,0,0.2);")
     self.combo_title_style.setView(view)
     self.combo_title_style.setToolTip('Styles')
     self.combo_title_style.addItems(self.doc_props.dict_title_styles)
     # traverses through combo_title_style items index
     for x in range(view.model().rowCount()):
         # mods by two to get the index with titles else gives "update" titles index
         # changes font to be bold for if and italic for else
         if x % 2 == 0:
             font = QFont()
             font.setWeight(QFont.Bold)
             self.combo_title_style.setItemData(x, font, Qt.FontRole)
         else:
             font = QFont()
             color = QBrush()
             font.setItalic(True)
             color.setColor(QColor("gray"))
             self.combo_title_style.setItemData(x, font, Qt.FontRole)
             self.combo_title_style.setItemData(x, color, Qt.ForegroundRole)
     # adds separators to clean up look of QComboBox
     for x in range(2, 23, 3):
         size = QSize()
         size.setHeight(10)
         separator = QStandardItem()
         separator.setSizeHint(size)
         view.model().insertRow(x, separator)
         view.model().item(x).setEnabled(False)
     self.combo_title_style.setFocusPolicy(Qt.NoFocus)
     self.combo_title_style.setMaxVisibleItems(view.model().rowCount())
     self.combo_title_style.setItemData(0, "test", QtCore.Qt.ToolTipRole)
     numKey = Qt.Key_1
     index = 0
     title_list = list(self.doc_props.dict_title_styles.keys())
     for key in range(0, 13, 2):
         shortcut = QShortcut(QKeySequence(Qt.CTRL + Qt.ALT + numKey), self)
         shortcut.activated.connect(
             partial(self.titleStyleHelper, title_list[key]))
         self.combo_title_style.setItemData(
             index, "Ctrl+Alt+" + str(numKey - Qt.Key_1 + 1),
             QtCore.Qt.ToolTipRole)
         index += 3
         numKey += 1
     shortcut = QShortcut(QKeySequence(Qt.CTRL + Qt.ALT + Qt.Key_0), self)
     shortcut.activated.connect(
         partial(self.titleStyleHelper,
                 self.document.doc_props.text_reset_title))
     self.combo_title_style.setItemData(index, "Ctrl+Alt+0",
                                        QtCore.Qt.ToolTipRole)
     self.combo_title_style.textActivated.connect(self.titleStyleHelper)
     return self.combo_title_style
コード例 #4
0
ファイル: __main__.py プロジェクト: VikingScientist/Geomaker
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)
コード例 #5
0
class QuickAccessWidget(QFrame):
    def __init__(self, parent):
        QFrame.__init__(self, parent)
        self.setFrameStyle(QFrame.Box | QFrame.Sunken)
        self.setStyleSheet("QListView {background: transparent; }")
        self.setLayout(QHBoxLayout())
        self.layout().setContentsMargins(0, 0, 0, 0)
        self.listView = QListView(self)
        self.layout().addWidget(self.listView)

        self.listView.setModel(self.window().quickAccessModel)
        self.listView.setMovement(QListView.Snap)
        self.listView.setFlow(QListView.LeftToRight)
        self.listView.setResizeMode(QListView.Adjust)
        gridSize = self.logicalDpiX() / 96 * 60
        self.listView.setGridSize(QSize(gridSize, gridSize))
        self.listView.setViewMode(QListView.IconMode)

        self.listView.activated.connect(self.listView.model().runShortcut)
コード例 #6
0
ファイル: Field_Area_Component.py プロジェクト: juranga/ntps
class Field_Area_Component():
    def __init__(self, proxy_server=Proxy_Server()):
        self.proxy_server = proxy_server
        self.edited_packet_list = []
        self.packet_idx = 0
        self.layer_idx = 0

    def install_widgets(self, parent=None):
        self.list = QListView(parent)
        self.list.setModel(self.proxy_server.intercept_queue.field_list_model)
        self.model = self.list.model()
        self.model.itemChanged.connect(self.on_edit)
        self.list.show()

    def set_selected_packet(self, pidx, lidx):
        self.packet_idx = pidx
        self.layer_idx = lidx

    def on_edit(self, item):

        if ":" not in item.text():
            print("ERROR: malformed field. Changes not saved.")
            print(
                "Please make sure field is in the form '<fieldName>:<value>'.")
            return

        newField = item.text().split(":")
        self.edited_packet_list = copy.deepcopy(
            self.proxy_server.intercept_queue.packet_list)

        layer = self.edited_packet_list[self.packet_idx].get_layer(
            self.layer_idx)
        fieldList = self.edited_packet_list[self.packet_idx].fields[layer]

        for k, v in fieldList.items():
            if (k == newField[0]):
                fieldList[k] = newField[1]
                self.edited_packet_list[
                    self.packet_idx].fields[layer] = fieldList
                break
コード例 #7
0
class _SpellCheckDialog(Dialog):
    def __init__(
        self,
        api: Api,
        main_window: QMainWindow,
        spell_checker: BaseSpellChecker,
    ) -> None:
        super().__init__(main_window)
        self._main_window = main_window
        self._api = api
        self._spell_checker = spell_checker
        self._lines_to_spellcheck = api.subs.selected_events

        self._mispelt_text_edit = QLineEdit(self)
        self._mispelt_text_edit.setReadOnly(True)
        self._replacement_text_edit = QLineEdit(self)
        self._suggestions_list_view = QListView(self)
        self._suggestions_list_view.setModel(QStandardItemModel())
        self._suggestions_list_view.clicked.connect(self._on_suggestion_click)

        box = QWidget(self)
        box_layout = QVBoxLayout(box)
        box_layout.setContentsMargins(0, 0, 0, 0)
        box_layout.addWidget(QLabel("Mispelt word:", self))
        box_layout.addWidget(self._mispelt_text_edit)
        box_layout.addWidget(QLabel("Replacement:", self))
        box_layout.addWidget(self._replacement_text_edit)
        box_layout.addWidget(QLabel("Suggestions:", self))
        box_layout.addWidget(self._suggestions_list_view)

        strip = QDialogButtonBox(self)
        strip.setOrientation(Qt.Orientation.Vertical)
        self.add_btn = strip.addButton("Add to dictionary", strip.ActionRole)
        self.ignore_btn = strip.addButton("Ignore", strip.ActionRole)
        self.ignore_all_btn = strip.addButton("Ignore all", strip.ActionRole)
        self.replace_btn = strip.addButton("Replace", strip.ActionRole)
        strip.addButton("Cancel", strip.RejectRole)
        strip.clicked.connect(self.action)
        strip.rejected.connect(self.reject)

        layout = QHBoxLayout(self)
        layout.setSpacing(24)
        layout.addWidget(box)
        layout.addWidget(strip)

        self.setWindowTitle("Spell checker")

    @async_slot(QAbstractButton)
    async def action(self, sender: QAbstractButton) -> None:
        if sender == self.replace_btn:
            await self._replace()
        elif sender == self.add_btn:
            await self._add_to_dictionary()
        elif sender == self.ignore_btn:
            await self._ignore()
        elif sender == self.ignore_all_btn:
            await self._ignore_all()

    @property
    def text_edit(self) -> QWidget:
        return cast(QWidget,
                    self._main_window.findChild(QWidget, "text-editor"))

    async def _replace(self) -> None:
        text = self.text_edit.toPlainText()
        text = (text[:self.text_edit.textCursor().selectionStart()] +
                self._replacement_text_edit.text() +
                text[self.text_edit.textCursor().selectionEnd():])
        self.text_edit.document().setPlainText(text)
        await self.next()

    async def _add_to_dictionary(self) -> None:
        self._spell_checker.add(self._mispelt_text_edit.text())
        await self.next()

    async def _ignore(self) -> None:
        await self.next()

    async def _ignore_all(self) -> None:
        self._spell_checker.add_to_session(self._mispelt_text_edit.text())
        await self.next()

    async def next(self) -> bool:
        ret = self._iter_to_next_mispelt_match()
        if ret is None:
            await show_notice("No more results.", self)
            self.reject()
            return False
        idx, start, end, word = ret
        self._focus_match(idx, start, end, word)
        return True

    def _iter_to_next_mispelt_match(
        self, ) -> Optional[tuple[int, int, int, str]]:
        cursor = self.text_edit.textCursor()
        while self._lines_to_spellcheck:
            line = self._lines_to_spellcheck[0]
            for start, end, word in spell_check_ass_line(
                    self._spell_checker, line.text.replace("\\N", "\n")):
                if (len(self._api.subs.selected_indexes) > 1
                        or line.index > self._api.subs.selected_indexes[0]
                        or start > cursor.selectionStart()
                        or cursor.selectionStart() == cursor.selectionEnd()):
                    return line.index, start, end, word
            self._lines_to_spellcheck.pop(0)
        return None

    def _focus_match(self, idx: int, start: int, end: int,
                     mispelt_word: str) -> None:
        self._api.subs.selected_indexes = [idx]

        cursor = self.text_edit.textCursor()
        cursor.setPosition(start)
        cursor.setPosition(end, QTextCursor.KeepAnchor)
        self.text_edit.setTextCursor(cursor)

        self._mispelt_text_edit.setText(mispelt_word)

        self._suggestions_list_view.model().clear()
        for suggestion in self._spell_checker.suggest(mispelt_word):
            item = QStandardItem(suggestion)
            item.setEditable(False)
            self._suggestions_list_view.model().appendRow(item)

    def _on_suggestion_click(self, index: QModelIndex) -> None:
        self._replacement_text_edit.setText(index.data())
コード例 #8
0
ファイル: fontInfo.py プロジェクト: pathumego/trufont
class OS2Tab(TabWidget):

    def __init__(self, font, parent=None):
        super().__init__(parent, name="OS/2")

        # OS2Group = QGroupBox("OS/2 table", self)
        # OS2Group.setFlat(True)
        OS2Layout = QGridLayout(self)

        usWidthClassLabel = QLabel("usWidthClass:", self)
        self.usWidthClassDrop = QComboBox(self)
        items = [
            "None", "Ultra-condensed", "Extra-condensed", "Condensed",
            "Semi-Condensed", "Medium (normal)", "Semi-expanded", "Expanded",
            "Extra-expanded", "Ultra-expanded"]
        self.usWidthClassDrop.insertItems(0, items)
        if font.info.openTypeOS2WidthClass is not None:
            self.usWidthClassDrop.setCurrentIndex(
                font.info.openTypeOS2WidthClass)

        fsSelectionLabel = QLabel("fsSelection:", self)
        fsSelection = font.info.openTypeOS2Selection
        self.fsSelectionList = QListView(self)
        items = [
            "1 UNDERSCORE", "2 NEGATIVE", "3 OUTLINED", "4 STRIKEOUT",
            "7 USE_TYPO_METRICS", "8 WWS", "9 OBLIQUE"]
        # http://stackoverflow.com/a/26613163
        model = QStandardItemModel(7, 1)
        for index, elem in enumerate(items):
            item = QStandardItem()
            item.setText(elem)
            item.setCheckable(True)
            bit = index + 1
            if fsSelection is not None and bit in fsSelection:
                # maybe default setting? if so, unneeded
                item.setCheckState(Qt.Checked)
            else:
                item.setCheckState(Qt.Unchecked)
            model.setItem(index, item)
        self.fsSelectionList.setModel(model)

        achVendorIDLabel = QLabel("achVendorID:", self)
        self.achVendorIDEdit = QLineEdit(font.info.openTypeOS2VendorID, self)
        self.achVendorIDEdit.setMaxLength(4)

        fsTypeLabel = QLabel("fsType:", self)
        fsType = font.info.openTypeOS2Type
        self.fsTypeDrop = QComboBox(self)
        items = [
            "No embedding restrictions", "Restricted embedding",
            "Preview and print embedding allowed",
            "Editable embedding allowed"]
        self.allowSubsettingBox = QCheckBox("Allow subsetting", self)
        self.allowBitmapEmbeddingBox = QCheckBox(
            "Allow only bitmap embedding", self)
        self.fsTypeDrop.currentIndexChanged[int].connect(
            self._updateFsTypeVisibility)
        self.fsTypeDrop.insertItems(0, items)
        if fsType is not None:
            for i in range(1, 4):
                if i in fsType:
                    self.fsTypeDrop.setCurrentIndex(i)
                    break
            self.allowSubsettingBox.setChecked(8 not in fsType)
            self.allowBitmapEmbeddingBox.setChecked(9 in fsType)

        # XXX: ulUnicodeRange

        # XXX: ulCodePageRange

        sTypoAscenderLabel = QLabel("sTypoAscender:", self)
        sTypoDescenderLabel = QLabel("sTypoDescender:", self)
        sTypoLineGapLabel = QLabel("sTypoLineGap:", self)
        usWeightClassLabel = QLabel("usWeightClass:", self)
        usWinAscentLabel = QLabel("usWinAscent:", self)
        usWinDescentLabel = QLabel("usWinDescent:", self)
        ySubscriptXSizeLabel = QLabel("ySubscriptXSize:", self)
        ySubscriptYSizeLabel = QLabel("ySubscriptYSize:", self)
        ySubscriptXOffsetLabel = QLabel("ySubscriptXOffset:", self)
        ySubscriptYOffsetLabel = QLabel("ySubscriptYOffset:", self)
        ySuperscriptXSizeLabel = QLabel("ySuperscriptXSize:", self)
        ySuperscriptYSizeLabel = QLabel("ySuperscriptYSize:", self)
        ySuperscriptXOffsetLabel = QLabel("ySuperscriptXOffset:", self)
        ySuperscriptYOffsetLabel = QLabel("ySuperscriptYOffset:", self)
        yStrikeoutSizeLabel = QLabel("yStrikeoutSize:", self)
        yStrikeoutPositionLabel = QLabel("yStrikeoutPosition:", self)
        self.loadPositiveInteger(
            font, "openTypeOS2WeightClass", "usWeightClass")
        self.loadInteger(font, "openTypeOS2TypoAscender", "sTypoAscender")
        self.loadInteger(font, "openTypeOS2TypoDescender", "sTypoDescender")
        self.loadInteger(font, "openTypeOS2TypoLineGap", "sTypoLineGap")
        self.loadPositiveInteger(font, "openTypeOS2WinAscent", "usWinAscent")
        self.loadPositiveInteger(font, "openTypeOS2WinDescent", "usWinDescent")
        self.loadInteger(font, "openTypeOS2SubscriptXSize", "ySubscriptXSize")
        self.loadInteger(font, "openTypeOS2SubscriptYSize", "ySubscriptYSize")
        self.loadInteger(
            font, "openTypeOS2SubscriptXOffset", "ySubscriptXOffset")
        self.loadInteger(
            font, "openTypeOS2SubscriptYOffset", "ySubscriptYOffset")
        self.loadInteger(
            font, "openTypeOS2SuperscriptXSize", "ySuperscriptXSize")
        self.loadInteger(
            font, "openTypeOS2SuperscriptYSize", "ySuperscriptYSize")
        self.loadInteger(
            font, "openTypeOS2SuperscriptXOffset", "ySuperscriptXOffset")
        self.loadInteger(
            font, "openTypeOS2SuperscriptYOffset", "ySuperscriptYOffset")
        self.loadInteger(font, "openTypeOS2StrikeoutSize", "yStrikeoutSize")
        self.loadInteger(
            font, "openTypeOS2StrikeoutPosition", "yStrikeoutPosition")

        # XXX: panose

        l = 0
        OS2Layout.addWidget(usWidthClassLabel, l, 0)
        OS2Layout.addWidget(self.usWidthClassDrop, l, 1, 1, 2)
        OS2Layout.addWidget(achVendorIDLabel, l, 3)
        OS2Layout.addWidget(self.achVendorIDEdit, l, 4, 1, 2)
        l += 1
        OS2Layout.addWidget(usWeightClassLabel, l, 0)
        OS2Layout.addWidget(self.usWeightClassEdit, l, 1, 1, 2)
        l += 1
        OS2Layout.addWidget(fsSelectionLabel, l, 0, 3, 1)
        OS2Layout.addWidget(self.fsSelectionList, l, 1, 3, 2)
        OS2Layout.addWidget(fsTypeLabel, l, 3, 3, 1)
        OS2Layout.addWidget(self.fsTypeDrop, l, 4, 1, 2)
        l += 1
        OS2Layout.addWidget(self.allowSubsettingBox, l, 4, 1, 2)
        l += 1
        OS2Layout.addWidget(self.allowBitmapEmbeddingBox, l, 4, 1, 2)
        l += 1
        OS2Layout.addWidget(sTypoAscenderLabel, l, 0)
        OS2Layout.addWidget(self.sTypoAscenderEdit, l, 1, 1, 2)
        OS2Layout.addWidget(usWinAscentLabel, l, 3)
        OS2Layout.addWidget(self.usWinAscentEdit, l, 4, 1, 2)
        l += 1
        OS2Layout.addWidget(sTypoDescenderLabel, l, 0)
        OS2Layout.addWidget(self.sTypoDescenderEdit, l, 1, 1, 2)
        OS2Layout.addWidget(usWinDescentLabel, l, 3)
        OS2Layout.addWidget(self.usWinDescentEdit, l, 4, 1, 2)
        l += 1
        OS2Layout.addWidget(sTypoLineGapLabel, l, 0)
        OS2Layout.addWidget(self.sTypoLineGapEdit, l, 1, 1, 2)
        l += 1
        OS2Layout.addWidget(ySubscriptXSizeLabel, l, 0)
        OS2Layout.addWidget(self.ySubscriptXSizeEdit, l, 1, 1, 2)
        OS2Layout.addWidget(ySubscriptXOffsetLabel, l, 3)
        OS2Layout.addWidget(self.ySubscriptXOffsetEdit, l, 4, 1, 2)
        l += 1
        OS2Layout.addWidget(ySubscriptYSizeLabel, l, 0)
        OS2Layout.addWidget(self.ySubscriptYSizeEdit, l, 1, 1, 2)
        OS2Layout.addWidget(ySubscriptYOffsetLabel, l, 3)
        OS2Layout.addWidget(self.ySubscriptYOffsetEdit, l, 4, 1, 2)
        l += 1
        OS2Layout.addWidget(ySuperscriptXSizeLabel, l, 0)
        OS2Layout.addWidget(self.ySuperscriptXSizeEdit, l, 1, 1, 2)
        OS2Layout.addWidget(ySuperscriptXOffsetLabel, l, 3)
        OS2Layout.addWidget(self.ySuperscriptXOffsetEdit, l, 4, 1, 2)
        l += 1
        OS2Layout.addWidget(ySuperscriptYSizeLabel, l, 0)
        OS2Layout.addWidget(self.ySuperscriptYSizeEdit, l, 1, 1, 2)
        OS2Layout.addWidget(ySuperscriptYOffsetLabel, l, 3)
        OS2Layout.addWidget(self.ySuperscriptYOffsetEdit, l, 4, 1, 2)
        l += 1
        OS2Layout.addWidget(yStrikeoutSizeLabel, l, 0)
        OS2Layout.addWidget(self.yStrikeoutSizeEdit, l, 1, 1, 2)
        OS2Layout.addWidget(yStrikeoutPositionLabel, l, 3)
        OS2Layout.addWidget(self.yStrikeoutPositionEdit, l, 4, 1, 2)
        # OS2Group.setLayout(OS2Layout)
        self.setLayout(OS2Layout)

    def _updateFsTypeVisibility(self, index):
        if index == 0:
            # TODO: maybe uncheck as well?
            self.allowSubsettingBox.setEnabled(False)
            self.allowBitmapEmbeddingBox.setEnabled(False)
        else:
            self.allowSubsettingBox.setEnabled(True)
            self.allowBitmapEmbeddingBox.setEnabled(True)

    def writeValues(self, font):
        self.writePositiveInteger(
            font, "usWeightClass", "openTypeOS2WeightClass")
        self.writeInteger(font, "sTypoAscender", "openTypeOS2TypoAscender")
        self.writeInteger(font, "sTypoDescender", "openTypeOS2TypoDescender")
        self.writeInteger(font, "sTypoLineGap", "openTypeOS2TypoLineGap")
        self.writePositiveInteger(font, "usWinAscent", "openTypeOS2WinAscent")
        self.writePositiveInteger(
            font, "usWinDescent", "openTypeOS2WinDescent")
        self.writeInteger(font, "ySubscriptXSize", "openTypeOS2SubscriptXSize")
        self.writeInteger(font, "ySubscriptYSize", "openTypeOS2SubscriptYSize")
        self.writeInteger(
            font, "ySubscriptXOffset", "openTypeOS2SubscriptXOffset")
        self.writeInteger(
            font, "ySubscriptYOffset", "openTypeOS2SubscriptYOffset")
        self.writeInteger(
            font, "ySuperscriptXSize", "openTypeOS2SuperscriptXSize")
        self.writeInteger(
            font, "ySuperscriptYSize", "openTypeOS2SuperscriptYSize")
        self.writeInteger(
            font, "ySuperscriptXOffset", "openTypeOS2SuperscriptXOffset")
        self.writeInteger(
            font, "ySuperscriptYOffset", "openTypeOS2SuperscriptYOffset")
        self.writeInteger(font, "yStrikeoutSize", "openTypeOS2StrikeoutSize")
        self.writeInteger(
            font, "yStrikeoutPosition", "openTypeOS2StrikeoutPosition")

        fsSelectionModel = self.fsSelectionList.model()
        fsSelection = []
        for i in range(7):
            item = fsSelectionModel.item(i)
            if item.checkState() == Qt.Checked:
                fsSelection.append(i)
        if len(fsSelection):
            font.info.openTypeOS2Selection = fsSelection
        else:
            # XXX: None or empty array? should distinct those cases
            font.info.openTypeOS2Selection = None

        fsTypeIndex = self.fsTypeDrop.currentIndex()
        fsType = []
        if fsTypeIndex > 0:
            fsType.append(fsTypeIndex)
            if not self.allowSubsettingBox.isChecked():
                fsType.append(8)
            if self.allowBitmapEmbeddingBox.isChecked():
                fsType.append(9)
        # TODO: provide a way to represent None w this?
        font.info.openTypeOS2Type = fsType

        # TODO: see if data needs to be padded to 4 chars.
        # I think that this is to be deferred to ufo2fdk(?)
        font.info.openTypeOS2VendorID = self.achVendorIDEdit.text()
コード例 #9
0
class ColorMapsDialog(object):
    
    def __init__(self,  title, message, items_selected, imageName):
        self.title = title
        self.message = message
        self.items_selected = items_selected #[s for s in items_selected.split(',')]
        self.imageName = imageName
        self.cmObj = ColorMaps()
        self.CM = self.cmObj.colorMaps
        
        form = QFormLayout()
        form.addRow(QLabel(message))
        self.listView = QListView()
        form.addRow(self.listView)
        font = QFont()
        font.setBold(True)
        font.setPointSize(8)
        self.listView.setFont(font)
        model = QStandardItemModel(self.listView)
        size = QSize(60,30)
        for item in self.CM:
            # create an item with a caption
            standardItem = QStandardItem(item)
            standardItem.setCheckable(True)
            if item in self.items_selected: standardItem.setCheckState(True)
            standardItem.setSizeHint(size)
            model.appendRow(standardItem)
        self.listView.setModel(model)
        
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(530, 447)
        Dialog.setWindowTitle(self.title)
        self.buttonBox = QDialogButtonBox(Dialog)
        self.buttonBox.setGeometry(QRect(10, 390, 511, 32))
        self.buttonBox.setOrientation(Qt.Horizontal)
        self.buttonBox.setStandardButtons(QDialogButtonBox.Cancel|QDialogButtonBox.Ok)
        self.buttonBox.setObjectName("buttonBox")
        self.horizontalLayoutWidget = QWidget(Dialog)
        self.horizontalLayoutWidget.setGeometry(QRect(9, 10, 511, 363))
        self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget")
        self.horizontalLayout = QHBoxLayout(self.horizontalLayoutWidget)
        self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.horizontalLayout.addWidget(self.listView)
        self.label = QLabel(self.horizontalLayoutWidget)
        self.label.setText("")
        self.label.setPixmap(QPixmap(self.imageName))
        self.label.setAlignment(Qt.AlignCenter)
        self.label.setObjectName("label")
        self.horizontalLayout.addWidget(self.label)

        self.retranslateUi(Dialog)
        self.buttonBox.accepted.connect(Dialog.accept)
        self.buttonBox.rejected.connect(Dialog.reject)
        QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        _translate = QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", self.title))
        
    def itemsSelected(self):
        selected = []
        model = self.listView.model()
        i = 0
        while model.item(i):
            if model.item(i).checkState():
                selected.append(model.item(i).text())
            i += 1
        return selected
コード例 #10
0
class ErrorVisualizeWidget(QWidget):
    def __init__(self, parent, mainwindow):
        super().__init__(parent)
        

        self.__widget_mainwindow = mainwindow
        self.__widget_matplotlib = ErrorVisualizeMatplotlibWidget(self)
        self.__current_layer = 0

        self.__widget_label_wrong_dimension = QLabel("", parent=self)

        self.__widget_label_layer = QLabel("<b>Layer</b>: ", parent=self)
        self.__widget_list_layer = QListView(self)
        self.__widget_list_layer.setModel(QStandardItemModel())
        self.__widget_list_layer.clicked.connect(self.set_layer)
        self.__widget_list_layer.selectionModel().selectionChanged.connect(self.set_layer)

        if not SDB_HAS_MATPLOTLIB:
            self.__widget_label_layer.setEnabled(False)
            self.__widget_list_layer.setEnabled(False)

        hbox_top = QHBoxLayout()
        hbox_top.addWidget(self.__widget_matplotlib)

        vbox_top = QVBoxLayout()
        vbox_top.addWidget(self.__widget_label_layer)
        vbox_top.addWidget(self.__widget_list_layer)
        hbox_top.addLayout(vbox_top)

        hbox_bottom = QHBoxLayout()
        hbox_bottom.addWidget(self.__widget_label_wrong_dimension)
        hbox_bottom.addStretch(1)

        vbox = QVBoxLayout()
        vbox.addLayout(hbox_top)
        vbox.addLayout(hbox_bottom)
        self.setLayout(vbox)

    def make_update(self, comparison_result):
        Logger.info("Updating ErrorVisualizeWidget")

        if not SDB_HAS_MATPLOTLIB:
            return

        self.__error_positions = comparison_result.get_error_positions()

        if self.__error_positions.ndim in (2, 3):
            self.__current_layer = 0
            self.__widget_matplotlib.draw_layer(self.__error_positions, self.__current_layer)

            self.__widget_list_layer.model().clear()
            if self.__error_positions.ndim == 3:
                self.__widget_label_layer.setEnabled(True)
                self.__widget_list_layer.setEnabled(True)

                for k in range(self.__error_positions.shape[2]):
                    item = QStandardItem("  %i" % k)

                    if any(self.__error_positions[:, :, k]):
                        item.setIcon(Icon("failure-small.png"))
                    else:
                        item.setIcon(Icon("success.png"))

                    item.setEditable(False)
                    self.__widget_list_layer.model().insertRow(k, item)
            else:
                self.__widget_label_layer.setEnabled(False)
                self.__widget_list_layer.setEnabled(False)

            self.__widget_label_wrong_dimension.setText("")
        else:
            self.__widget_matplotlib.draw_nothing()

            self.__widget_label_layer.setEnabled(False)
            self.__widget_list_layer.model().clear()
            self.__widget_list_layer.setEnabled(False)

            self.__widget_label_wrong_dimension.setText(
                "Visualization is only supported for 2 and 3-dimensional fields.")

    def set_layer(self, layer):
        if isinstance(layer, QItemSelection):
            layer = layer.indexes()[0]

        layer_idx = layer.row()

        self.__current_layer = layer_idx
        self.__widget_matplotlib.draw_layer(self.__error_positions, self.__current_layer)
コード例 #11
0
class Settings(QWidget):
    def __init__(self, main):
        # init
        QWidget.__init__(self)
        self.main = main
        self.lang = main.lang
        # setup window
        self.setWindowIcon(QIcon(SETTINGS))
        self.setWindowTitle(self.lang['settings_title'])
        self.resize(500, 460)
        # setup vars
        self._palette = QPalette()
        self._palette.setColor(QPalette.WindowText,
                               main._palette.color(QPalette.WindowText))
        # setup update label
        self.update_label = QLabel(self.lang['update_label'], self)
        self.update_label.setToolTip(self.lang['update_label_tt'])
        # setup update spinbox
        self.update_spinbox = QSpinBox(self)
        self.update_spinbox.setToolTip(self.lang['update_spinbox_tt'])
        self.update_spinbox.setMinimum(500)
        self.update_spinbox.setMaximum(86400000)
        self.update_spinbox.setValue(main._update)
        # setup round label
        self.round_label = QLabel(self.lang['round_label'], self)
        self.round_label.setToolTip(self.lang['round_label_tt'])
        # setup round spinbox
        self.round_spinbox = QSpinBox(self)
        self.round_spinbox.setToolTip(self.lang['round_spinbox_tt'])
        self.round_spinbox.setMinimum(1)
        self.round_spinbox.setMaximum(100)
        self.round_spinbox.setValue(main._round)
        # setup font size spinbox
        self.size_spinbox = QSpinBox()
        self.size_spinbox.setToolTip(self.lang['size_spinbox_tt'])
        self.size_spinbox.setMinimum(8)
        self.size_spinbox.setMaximum(80)
        self.size_spinbox.setValue(main._font.pointSize())
        # setup labels checkbox
        self.labels_checkbox = QCheckBox(self.lang['labels_checkbox'], self)
        self.labels_checkbox.setToolTip(self.lang['labels_checkbox_tt'])
        self.labels_checkbox.setChecked(main._labels)
        # setup pername checkbox
        self.pername_checkbox = QCheckBox(self.lang['pername_checkbox'], self)
        self.pername_checkbox.setToolTip(self.lang['pername_checkbox_tt'])
        self.pername_checkbox.setChecked(main._pername)
        # setup bar checkbox
        self.bar_checkbox = QCheckBox(self.lang['bar_checkbox'], self)
        self.bar_checkbox.setToolTip(self.lang['bar_checkbox_tt'])
        self.bar_checkbox.setChecked(main._bar)
        # setup text checkbox
        self.text_checkbox = QCheckBox(self.lang['text_checkbox'], self)
        self.text_checkbox.setToolTip(self.lang['text_checkbox_tt'])
        self.text_checkbox.setChecked(main._text)
        # setup srecv checkbox
        self.srecv_checkbox = QCheckBox(self.lang['srecv_checkbox'], self)
        self.srecv_checkbox.setToolTip(self.lang['srecv_checkbox_tt'])
        self.srecv_checkbox.setChecked(main._srecv)
        # setup ssent checkbox
        self.ssent_checkbox = QCheckBox(self.lang['ssent_checkbox'], self)
        self.ssent_checkbox.setToolTip(self.lang['ssent_checkbox_tt'])
        self.ssent_checkbox.setChecked(main._ssent)
        # setup trecv checkbox
        self.trecv_checkbox = QCheckBox(self.lang['trecv_checkbox'], self)
        self.trecv_checkbox.setToolTip(self.lang['trecv_checkbox_tt'])
        self.trecv_checkbox.setChecked(main._trecv)
        # setup tsent checkbox
        self.tsent_checkbox = QCheckBox(self.lang['tsent_checkbox'], self)
        self.tsent_checkbox.setToolTip(self.lang['tsent_checkbox_tt'])
        self.tsent_checkbox.setChecked(main._tsent)
        # setup precv checkbox
        self.precv_checkbox = QCheckBox(self.lang['precv_checkbox'], self)
        self.precv_checkbox.setToolTip(self.lang['precv_checkbox_tt'])
        self.precv_checkbox.setChecked(main._precv)
        # setup psent checkbox
        self.psent_checkbox = QCheckBox(self.lang['psent_checkbox'], self)
        self.psent_checkbox.setToolTip(self.lang['psent_checkbox_tt'])
        self.psent_checkbox.setChecked(main._psent)
        # setup errin checkbox
        self.errin_checkbox = QCheckBox(self.lang['errin_checkbox'], self)
        self.errin_checkbox.setToolTip(self.lang['errin_checkbox_tt'])
        self.errin_checkbox.setChecked(main._errin)
        # setup errout checkbox
        self.errout_checkbox = QCheckBox(self.lang['errout_checkbox'], self)
        self.errout_checkbox.setToolTip(self.lang['errout_checkbox_tt'])
        self.errout_checkbox.setChecked(main._errout)
        # setup dropin checkbox
        self.dropin_checkbox = QCheckBox(self.lang['dropin_checkbox'], self)
        self.dropin_checkbox.setToolTip(self.lang['dropin_checkbox_tt'])
        self.dropin_checkbox.setChecked(main._dropin)
        # setup dropout checkbox
        self.dropout_checkbox = QCheckBox(self.lang['dropout_checkbox'], self)
        self.dropout_checkbox.setToolTip(self.lang['dropout_checkbox_tt'])
        self.dropout_checkbox.setChecked(main._dropout)
        # setup connection checkbox
        self.con_checkbox = QCheckBox(self.lang['con_checkbox'], self)
        self.con_checkbox.setToolTip(self.lang['con_checkbox_tt'])
        self.con_checkbox.setChecked(main._con)
        # setup bold checkbox
        self.bold_checkbox = QCheckBox(self.lang['bold_checkbox'], self)
        self.bold_checkbox.setToolTip(self.lang['bold_checkbox_tt'])
        self.bold_checkbox.setChecked(main._font.bold())
        # setup kind cbox combobox
        self.kind_cbox = QComboBox(self)
        self.kind_cbox.setToolTip(self.lang['kind_cbox_tt'])
        self.kind_cbox.addItems(('inet', 'inet4', 'inet6', 'tcp', 'tcp4',
                                 'tcp6', 'udp', 'udp4', 'udp6', 'unix', 'all'))
        self.kind_cbox.setCurrentText(main._kind)
        # setup ifaces list view
        self.ifaces_list = QListView(self)
        self.ifaces_list.setToolTip(self.lang['ifaces_list_tt'])
        self.stats = psutil.net_if_stats()
        ifaces_model = QStandardItemModel(len(self.stats), 1)
        i = 0
        for name in self.stats:
            item = QStandardItem(name)
            item.setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsEnabled)
            if name in main._names:
                item.setData(Qt.Checked, Qt.CheckStateRole)
            else:
                item.setData(Qt.Unchecked, Qt.CheckStateRole)
            ifaces_model.setItem(i, 0, item)
            i += 1
        self.ifaces_list.setModel(ifaces_model)
        # setup color button
        self.color_button = QPushButton(self.lang['color_button'], self)
        self.color_button.setToolTip(self.lang['color_button_tt'])
        self.color_button.clicked.connect(self._color)
        # setup save button
        self.save_button = QPushButton(self.lang['save_button'], self)
        self.save_button.setToolTip(self.lang['save_button_tt'])
        self.save_button.clicked.connect(self._save)
        # setup cancel button
        self.cancel_button = QPushButton(self.lang['cancel_button'], self)
        self.cancel_button.setToolTip(self.lang['cancel_button_tt'])
        self.cancel_button.clicked.connect(self.close)
        # setup font settings h box layout
        self.h_box2 = QHBoxLayout()
        self.h_box2.addWidget(self.size_spinbox)
        self.h_box2.addWidget(self.bold_checkbox)
        # setup buttons h box layout
        self.h_box = QHBoxLayout()
        self.h_box.addWidget(self.save_button)
        self.h_box.addWidget(self.cancel_button)
        # setup layout
        self.grid = QGridLayout(self)
        self.grid.addWidget(self.update_label, 0, 0)
        self.grid.addWidget(self.update_spinbox, 0, 1)
        self.grid.addWidget(self.round_label, 1, 0)
        self.grid.addWidget(self.round_spinbox, 1, 1)
        self.grid.addWidget(self.labels_checkbox, 2, 0)
        self.grid.addWidget(self.pername_checkbox, 2, 1)
        self.grid.addWidget(self.bar_checkbox, 3, 0)
        self.grid.addWidget(self.text_checkbox, 3, 1)
        self.grid.addWidget(self.srecv_checkbox, 4, 0)
        self.grid.addWidget(self.ssent_checkbox, 4, 1)
        self.grid.addWidget(self.trecv_checkbox, 5, 0)
        self.grid.addWidget(self.tsent_checkbox, 5, 1)
        self.grid.addWidget(self.precv_checkbox, 6, 0)
        self.grid.addWidget(self.psent_checkbox, 6, 1)
        self.grid.addWidget(self.errin_checkbox, 7, 0)
        self.grid.addWidget(self.errout_checkbox, 7, 1)
        self.grid.addWidget(self.dropin_checkbox, 8, 0)
        self.grid.addWidget(self.dropout_checkbox, 8, 1)
        self.grid.addWidget(self.con_checkbox, 9, 0)
        self.grid.addWidget(self.kind_cbox, 10, 0)
        self.grid.addWidget(self.ifaces_list, 10, 1)
        self.grid.addWidget(self.color_button, 11, 0)
        self.grid.addLayout(self.h_box2, 11, 1)
        self.grid.addLayout(self.h_box, 12, 0, 1, 2)
        self.setLayout(self.grid)
        # show
        self.show()

    @try_except()
    def _color(self, checked):
        self._palette.setColor(
            QPalette.WindowText,
            QColorDialog.getColor(self._palette.color(QPalette.WindowText),
                                  self, self.lang['color_title']))

    @try_except()
    def _save(self, checked):
        self.main._update = self.update_spinbox.value()
        self.main._round = self.round_spinbox.value()
        self.main._labels = self.labels_checkbox.isChecked()
        self.main._pername = self.pername_checkbox.isChecked()
        self.main._bar = self.bar_checkbox.isChecked()
        self.main._text = self.text_checkbox.isChecked()
        self.main._srecv = self.srecv_checkbox.isChecked()
        self.main._ssent = self.ssent_checkbox.isChecked()
        self.main._trecv = self.trecv_checkbox.isChecked()
        self.main._tsent = self.tsent_checkbox.isChecked()
        self.main._precv = self.precv_checkbox.isChecked()
        self.main._psent = self.psent_checkbox.isChecked()
        self.main._errin = self.errin_checkbox.isChecked()
        self.main._errout = self.errout_checkbox.isChecked()
        self.main._dropin = self.dropin_checkbox.isChecked()
        self.main._dropout = self.dropout_checkbox.isChecked()
        self.main._con = self.con_checkbox.isChecked()
        self.main._kind = self.kind_cbox.currentText()
        self.main._palette = self._palette
        self.main._font.setPointSize(self.size_spinbox.value())
        self.main._font.setBold(self.bold_checkbox.isChecked())
        names = []
        i = 0
        for name in self.stats:
            ind = self.ifaces_list.model().index(i, 0)
            if self.ifaces_list.model().data(ind, Qt.CheckStateRole):
                names.append(name)
            i += 1
        self.main._names = names
        self.main.save_settings()
        self.main.timer.stop()
        self.main.timer.start(self.main._update)
        self.close()
コード例 #12
0
class OS2Tab(TabWidget):
    def __init__(self, font, parent=None):
        super().__init__(parent)
        self.name = self.tr("OS/2")

        # OS2Group = QGroupBox("OS/2 table", self)
        # OS2Group.setFlat(True)
        OS2Layout = QGridLayout(self)

        usWidthClassLabel = RLabel(self.tr("usWidthClass:"), self)
        self.usWidthClassDrop = QComboBox(self)
        items = [
            self.tr("None"),
            self.tr("Ultra-condensed"),
            self.tr("Extra-condensed"),
            self.tr("Condensed"),
            self.tr("Semi-Condensed"),
            self.tr("Medium (normal)"),
            self.tr("Semi-expanded"),
            self.tr("Expanded"),
            self.tr("Extra-expanded"),
            self.tr("Ultra-expanded")
        ]
        self.usWidthClassDrop.insertItems(0, items)
        if font.info.openTypeOS2WidthClass is not None:
            self.usWidthClassDrop.setCurrentIndex(
                font.info.openTypeOS2WidthClass)

        fsSelectionLabel = RLabel(self.tr("fsSelection:"), self)
        fsSelection = font.info.openTypeOS2Selection
        self.fsSelectionList = QListView(self)
        items = [
            "1 UNDERSCORE", "2 NEGATIVE", "3 OUTLINED", "4 STRIKEOUT",
            "7 USE_TYPO_METRICS", "8 WWS", "9 OBLIQUE"
        ]
        # http://stackoverflow.com/a/26613163
        model = QStandardItemModel(7, 1)
        for index, elem in enumerate(items):
            item = QStandardItem()
            item.setText(elem)
            item.setCheckable(True)
            bit = index + 1
            if fsSelection is not None and bit in fsSelection:
                # maybe default setting? if so, unneeded
                item.setCheckState(Qt.Checked)
            else:
                item.setCheckState(Qt.Unchecked)
            model.setItem(index, item)
        self.fsSelectionList.setModel(model)

        achVendorIDLabel = RLabel(self.tr("achVendorID:"), self)
        self.achVendorIDEdit = QLineEdit(font.info.openTypeOS2VendorID, self)
        self.achVendorIDEdit.setMaxLength(4)

        fsTypeLabel = RLabel(self.tr("fsType:"), self)
        fsType = font.info.openTypeOS2Type
        self.fsTypeDrop = QComboBox(self)
        items = [
            self.tr("No embedding restrictions"),
            self.tr("Restricted embedding"),
            self.tr("Preview and print embedding allowed"),
            self.tr("Editable embedding allowed")
        ]
        self.allowSubsettingBox = QCheckBox(self.tr("Allow subsetting"), self)
        self.allowBitmapEmbeddingBox = QCheckBox(
            self.tr("Allow only bitmap embedding"), self)
        self.fsTypeDrop.currentIndexChanged[int].connect(
            self._updateFsTypeVisibility)
        self.fsTypeDrop.insertItems(0, items)
        if fsType is not None:
            for i in range(1, 4):
                if i in fsType:
                    self.fsTypeDrop.setCurrentIndex(i)
                    break
            self.allowSubsettingBox.setChecked(8 not in fsType)
            self.allowBitmapEmbeddingBox.setChecked(9 in fsType)

        # XXX: ulUnicodeRange

        # XXX: ulCodePageRange

        sTypoAscenderLabel = RLabel(self.tr("sTypoAscender:"), self)
        sTypoDescenderLabel = RLabel(self.tr("sTypoDescender:"), self)
        sTypoLineGapLabel = RLabel(self.tr("sTypoLineGap:"), self)
        usWeightClassLabel = RLabel(self.tr("usWeightClass:"), self)
        usWinAscentLabel = RLabel(self.tr("usWinAscent:"), self)
        usWinDescentLabel = RLabel(self.tr("usWinDescent:"), self)
        ySubscriptXSizeLabel = RLabel(self.tr("ySubscriptXSize:"), self)
        ySubscriptYSizeLabel = RLabel(self.tr("ySubscriptYSize:"), self)
        ySubscriptXOffsetLabel = RLabel(self.tr("ySubscriptXOffset:"), self)
        ySubscriptYOffsetLabel = RLabel(self.tr("ySubscriptYOffset:"), self)
        ySuperscriptXSizeLabel = RLabel(self.tr("ySuperscriptXSize:"), self)
        ySuperscriptYSizeLabel = RLabel(self.tr("ySuperscriptYSize:"), self)
        ySuperscriptXOffsetLabel = RLabel(self.tr("ySuperscriptXOffset:"),
                                          self)
        ySuperscriptYOffsetLabel = RLabel(self.tr("ySuperscriptYOffset:"),
                                          self)
        yStrikeoutSizeLabel = RLabel(self.tr("yStrikeoutSize:"), self)
        yStrikeoutPositionLabel = RLabel(self.tr("yStrikeoutPosition:"), self)

        self.loadPositiveInteger(font, "openTypeOS2WeightClass",
                                 "usWeightClass")
        self.loadInteger(font, "openTypeOS2TypoAscender", "sTypoAscender")
        self.loadInteger(font, "openTypeOS2TypoDescender", "sTypoDescender")
        self.loadInteger(font, "openTypeOS2TypoLineGap", "sTypoLineGap")
        self.loadPositiveInteger(font, "openTypeOS2WinAscent", "usWinAscent")
        self.loadPositiveInteger(font, "openTypeOS2WinDescent", "usWinDescent")
        self.loadInteger(font, "openTypeOS2SubscriptXSize", "ySubscriptXSize")
        self.loadInteger(font, "openTypeOS2SubscriptYSize", "ySubscriptYSize")
        self.loadInteger(font, "openTypeOS2SubscriptXOffset",
                         "ySubscriptXOffset")
        self.loadInteger(font, "openTypeOS2SubscriptYOffset",
                         "ySubscriptYOffset")
        self.loadInteger(font, "openTypeOS2SuperscriptXSize",
                         "ySuperscriptXSize")
        self.loadInteger(font, "openTypeOS2SuperscriptYSize",
                         "ySuperscriptYSize")
        self.loadInteger(font, "openTypeOS2SuperscriptXOffset",
                         "ySuperscriptXOffset")
        self.loadInteger(font, "openTypeOS2SuperscriptYOffset",
                         "ySuperscriptYOffset")
        self.loadInteger(font, "openTypeOS2StrikeoutSize", "yStrikeoutSize")
        self.loadInteger(font, "openTypeOS2StrikeoutPosition",
                         "yStrikeoutPosition")

        # XXX: panose

        l = 0
        OS2Layout.addWidget(usWidthClassLabel, l, 0)
        OS2Layout.addWidget(self.usWidthClassDrop, l, 1, 1, 2)
        OS2Layout.addWidget(achVendorIDLabel, l, 3)
        OS2Layout.addWidget(self.achVendorIDEdit, l, 4, 1, 2)
        l += 1
        OS2Layout.addWidget(usWeightClassLabel, l, 0)
        OS2Layout.addWidget(self.usWeightClassEdit, l, 1, 1, 2)
        l += 1
        OS2Layout.addWidget(fsSelectionLabel, l, 0, 3, 1)
        OS2Layout.addWidget(self.fsSelectionList, l, 1, 3, 2)
        OS2Layout.addWidget(fsTypeLabel, l, 3, 3, 1)
        OS2Layout.addWidget(self.fsTypeDrop, l, 4, 1, 2)
        l += 1
        OS2Layout.addWidget(self.allowSubsettingBox, l, 4, 1, 2)
        l += 1
        OS2Layout.addWidget(self.allowBitmapEmbeddingBox, l, 4, 1, 2)
        l += 1
        OS2Layout.addWidget(sTypoAscenderLabel, l, 0)
        OS2Layout.addWidget(self.sTypoAscenderEdit, l, 1, 1, 2)
        OS2Layout.addWidget(usWinAscentLabel, l, 3)
        OS2Layout.addWidget(self.usWinAscentEdit, l, 4, 1, 2)
        l += 1
        OS2Layout.addWidget(sTypoDescenderLabel, l, 0)
        OS2Layout.addWidget(self.sTypoDescenderEdit, l, 1, 1, 2)
        OS2Layout.addWidget(usWinDescentLabel, l, 3)
        OS2Layout.addWidget(self.usWinDescentEdit, l, 4, 1, 2)
        l += 1
        OS2Layout.addWidget(sTypoLineGapLabel, l, 0)
        OS2Layout.addWidget(self.sTypoLineGapEdit, l, 1, 1, 2)
        l += 1
        OS2Layout.addWidget(ySubscriptXSizeLabel, l, 0)
        OS2Layout.addWidget(self.ySubscriptXSizeEdit, l, 1, 1, 2)
        OS2Layout.addWidget(ySubscriptXOffsetLabel, l, 3)
        OS2Layout.addWidget(self.ySubscriptXOffsetEdit, l, 4, 1, 2)
        l += 1
        OS2Layout.addWidget(ySubscriptYSizeLabel, l, 0)
        OS2Layout.addWidget(self.ySubscriptYSizeEdit, l, 1, 1, 2)
        OS2Layout.addWidget(ySubscriptYOffsetLabel, l, 3)
        OS2Layout.addWidget(self.ySubscriptYOffsetEdit, l, 4, 1, 2)
        l += 1
        OS2Layout.addWidget(ySuperscriptXSizeLabel, l, 0)
        OS2Layout.addWidget(self.ySuperscriptXSizeEdit, l, 1, 1, 2)
        OS2Layout.addWidget(ySuperscriptXOffsetLabel, l, 3)
        OS2Layout.addWidget(self.ySuperscriptXOffsetEdit, l, 4, 1, 2)
        l += 1
        OS2Layout.addWidget(ySuperscriptYSizeLabel, l, 0)
        OS2Layout.addWidget(self.ySuperscriptYSizeEdit, l, 1, 1, 2)
        OS2Layout.addWidget(ySuperscriptYOffsetLabel, l, 3)
        OS2Layout.addWidget(self.ySuperscriptYOffsetEdit, l, 4, 1, 2)
        l += 1
        OS2Layout.addWidget(yStrikeoutSizeLabel, l, 0)
        OS2Layout.addWidget(self.yStrikeoutSizeEdit, l, 1, 1, 2)
        OS2Layout.addWidget(yStrikeoutPositionLabel, l, 3)
        OS2Layout.addWidget(self.yStrikeoutPositionEdit, l, 4, 1, 2)
        # OS2Group.setLayout(OS2Layout)
        self.setLayout(OS2Layout)

    def _updateFsTypeVisibility(self, index):
        if index == 0:
            # TODO: maybe uncheck as well?
            self.allowSubsettingBox.setEnabled(False)
            self.allowBitmapEmbeddingBox.setEnabled(False)
        else:
            self.allowSubsettingBox.setEnabled(True)
            self.allowBitmapEmbeddingBox.setEnabled(True)

    def writeValues(self, font):
        self.writePositiveInteger(font, "usWeightClass",
                                  "openTypeOS2WeightClass")
        self.writeInteger(font, "sTypoAscender", "openTypeOS2TypoAscender")
        self.writeInteger(font, "sTypoDescender", "openTypeOS2TypoDescender")
        self.writeInteger(font, "sTypoLineGap", "openTypeOS2TypoLineGap")
        self.writePositiveInteger(font, "usWinAscent", "openTypeOS2WinAscent")
        self.writePositiveInteger(font, "usWinDescent",
                                  "openTypeOS2WinDescent")
        self.writeInteger(font, "ySubscriptXSize", "openTypeOS2SubscriptXSize")
        self.writeInteger(font, "ySubscriptYSize", "openTypeOS2SubscriptYSize")
        self.writeInteger(font, "ySubscriptXOffset",
                          "openTypeOS2SubscriptXOffset")
        self.writeInteger(font, "ySubscriptYOffset",
                          "openTypeOS2SubscriptYOffset")
        self.writeInteger(font, "ySuperscriptXSize",
                          "openTypeOS2SuperscriptXSize")
        self.writeInteger(font, "ySuperscriptYSize",
                          "openTypeOS2SuperscriptYSize")
        self.writeInteger(font, "ySuperscriptXOffset",
                          "openTypeOS2SuperscriptXOffset")
        self.writeInteger(font, "ySuperscriptYOffset",
                          "openTypeOS2SuperscriptYOffset")
        self.writeInteger(font, "yStrikeoutSize", "openTypeOS2StrikeoutSize")
        self.writeInteger(font, "yStrikeoutPosition",
                          "openTypeOS2StrikeoutPosition")

        fsSelectionModel = self.fsSelectionList.model()
        fsSelection = []
        for i in range(7):
            item = fsSelectionModel.item(i)
            if item.checkState() == Qt.Checked:
                fsSelection.append(i)
        if len(fsSelection):
            font.info.openTypeOS2Selection = fsSelection
        else:
            # XXX: None or empty array? should distinct those cases
            font.info.openTypeOS2Selection = None

        fsTypeIndex = self.fsTypeDrop.currentIndex()
        fsType = []
        if fsTypeIndex > 0:
            fsType.append(fsTypeIndex)
            if not self.allowSubsettingBox.isChecked():
                fsType.append(8)
            if self.allowBitmapEmbeddingBox.isChecked():
                fsType.append(9)
        # TODO: provide a way to represent None w this?
        font.info.openTypeOS2Type = fsType

        # TODO: see if data needs to be padded to 4 chars.
        # I think that this is to be deferred to ufo2fdk(?)
        font.info.openTypeOS2VendorID = self.achVendorIDEdit.text()
コード例 #13
0
ファイル: switch.py プロジェクト: deszczowy/hummingbird
class FolderSwitch(QWidget):
    def __init__(self, main_widget):

        super(FolderSwitch, self).__init__(main_widget)

        self.selected_folder = 0

        self.main = main_widget

        switchLayout = QVBoxLayout()
        switchLayout.setContentsMargins(20, 20, 20, 20)

        icon = QLabel()
        icon.setFixedWidth(80)

        myPixmap = QtGui.QPixmap(Directory().get_resource_dir() + 'icon.png')
        myScaledPixmap = myPixmap.scaled(icon.size(),
                                         QtCore.Qt.KeepAspectRatio)
        icon.setPixmap(myScaledPixmap)

        header = QLabel()
        header.setText("Select notebook:")

        self.folders = QListView()
        self.folders.setModel(Database().get_folder_model())
        self.folders.clicked[QModelIndex].connect(self.select_folder)

        buttons = QWidget()
        buttons_layout = QHBoxLayout()
        self.button_ok = QPushButton("OK")
        self.button_add = QPushButton("Add")
        self.button_cancel = QPushButton("Cancel")
        self.button_edit = QPushButton("Change name")
        buttons_layout.addWidget(self.button_add)
        buttons_layout.addWidget(self.button_edit)
        buttons_layout.addStretch()
        buttons_layout.addWidget(self.button_ok)
        buttons_layout.addWidget(self.button_cancel)
        buttons.setLayout(buttons_layout)

        self.button_cancel.clicked.connect(self.cancel)
        self.button_ok.clicked.connect(self.ok)
        self.button_add.clicked.connect(self.add)
        self.button_edit.clicked.connect(self.edit)

        # stack

        switchLayout.addWidget(icon)
        switchLayout.addWidget(header)
        switchLayout.addWidget(self.folders)
        switchLayout.addStretch()
        switchLayout.addWidget(buttons)

        main_widget.setLayout(switchLayout)
        main_widget.hide()

    def select_folder(self, index):
        item = self.folders.model().itemFromIndex(index)
        self.selected_folder = item.folder_id

    def cancel(self):
        self.main.hide()

    def ok(self):
        self.main.parent().load_folder(self.selected_folder)
        self.main.hide()

    def add(self):
        new_folder, ok = QInputDialog.getText(self, 'Hummingbird',
                                              'New notebook name:')
        if ok:
            db = Database()
            db.insert_folder(str(new_folder))
            self.folders.setModel(db.get_folder_model())

    def edit(self):
        new_name, ok = QInputDialog.getText(self, 'Hummingbird',
                                            'New notebook name:')
        if ok:
            db = Database()
            db.update_folder(self.selected_folder, str(new_name))
            self.folders.setModel(db.get_folder_model())
コード例 #14
0
class ToDoList(QWidget):
    def __init__(self, parent, component_def):
        super(ToDoList, self).__init__(parent)
        self.component = component_def
        self.layout = QVBoxLayout()
        self.list = QListView()
        self.list.setWordWrap(True)
        self.list.setVerticalScrollMode(QAbstractItemView.ScrollPerPixel)
        self.list.verticalScrollBar().setSingleStep(5)

        self.form = QVBoxLayout()
        self.buttons = QHBoxLayout()

        self.add = QPushButton("Add")
        self.add.clicked.connect(self.action_add)

        self.label = QLineEdit()
        self.label.setPlaceholderText("new task name")
        self.label.returnPressed.connect(self.add.click)

        self.priority = QComboBox()
        self.priority.insertItem(0, "Low")
        self.priority.insertItem(1, "Medium")
        self.priority.insertItem(2, "High")
        self.priority.insertItem(3, "Critical")
        self.priority.setCurrentIndex(1)

        self.stack()

    def stack(self):
        self.layout.addWidget(self.list)
        self.form.addWidget(self.label)
        self.buttons.addWidget(self.priority)
        self.buttons.addWidget(self.add)
        self.form.addLayout(self.buttons)
        self.layout.addLayout(self.form)
        self.setLayout(self.layout)

    def load(self, folder):
        model = Database().get_task_model(folder)
        self.list.setModel(model)
        #self.list.clicked[QModelIndex].connect(self.item_check)

    #def item_check(self, index):
    #    item = self.list.model().itemFromIndex(index)
    #    if item.checkState() == QtCore.Qt.Checked:

    def action_add(self):
        if self.label.text() != "":
            item = ToDoItem()
            item.label = self.label.text()
            item.date = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
            item.priority = Priority(self.priority.currentIndex())
            item.setSelectable(True)
            item.setEditable(False)
            item.setCheckable(True)
            idx = self.get_index_of_priority_to_insert(item.priority)
            self.list.model().insertRow(idx, item)
            self.label.setText("")

    def get_index_of_priority_to_insert(self, priority):
        p = int(priority)
        c = self.list.model().rowCount()

        # print("inserted priority = %d" % p)

        for idx in range(0, c):
            item = self.list.model().item(idx)
            if int(item.priority) <= p:
                return idx
        return c

    def save(self, folder):
        model = self.list.model()
        result = False

        for index in range(model.rowCount()):
            item = model.item(index)
            if item.id == 0:
                item.id = Database().insert_task(folder, item)
                result = True
            else:
                if item.checkState() == QtCore.Qt.Checked:
                    Database().check_task(item.id)
                    result = True

        self.tidy_up()

        return result

    def tidy_up(self):
        go_on = self.list.model().rowCount() > 0
        i = 0

        while go_on:
            if self.list.model().item(i).checkState() == QtCore.Qt.Checked:
                self.list.model().removeRow(i)
            else:
                i += 1
            go_on = i < self.list.model().rowCount()

    def focus(self):
        self.list.setFocus()
コード例 #15
0
class LocationCompleterView(QWidget):
    def __init__(self):
        super().__init__(None)
        self._view = None  # QListView
        self._delegate = None  # LocationCompleterDelegate
        self._searchEnginesLayout = None  # QHBoxLayout
        self._resizeHeight = -1
        self._resizeTimer = None  # QTimer
        self._forceResize = True

        self.setAttribute(Qt.WA_ShowWithoutActivating)
        self.setAttribute(Qt.WA_X11NetWmWindowTypeCombo)

        if gVar.app.platformName() == 'xcb':
            self.setWindowFlags(Qt.Window | Qt.FramelessWindowHint
                                | Qt.BypassWindowManagerHint)
        else:
            self.setWindowFlags(Qt.Popup)

        layout = QVBoxLayout(self)
        layout.setContentsMargins(0, 0, 0, 0)
        layout.setSpacing(0)

        self._view = QListView(self)
        layout.addWidget(self._view)

        self._view.setUniformItemSizes(True)
        self._view.setEditTriggers(QAbstractItemView.NoEditTriggers)
        self._view.setVerticalScrollMode(QAbstractItemView.ScrollPerPixel)
        self._view.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self._view.setSelectionBehavior(QAbstractItemView.SelectRows)
        self._view.setSelectionMode(QAbstractItemView.SingleSelection)

        self._view.setMouseTracking(True)
        gVar.app.installEventFilter(self)

        self._delegate = LocationCompleterDelegate(self)
        self._view.setItemDelegate(self._delegate)

        searchFrame = QFrame(self)
        searchFrame.setFrameStyle(QFrame.StyledPanel | QFrame.Raised)
        searchLayout = QHBoxLayout(searchFrame)
        searchLayout.setContentsMargins(10, 4, 4, 4)

        searchSettingsButton = ToolButton(self)
        searchSettingsButton.setIcon(IconProvider.settingsIcon())
        searchSettingsButton.setToolTip(_('Manage Search Engines'))
        searchSettingsButton.setAutoRaise(True)
        searchSettingsButton.setIconSize(QSize(16, 16))
        searchSettingsButton.clicked.connect(self.searchEnginesDialogRequested)

        searchLabel = QLabel(_('Search with:'))
        self._searchEnginesLayout = QHBoxLayout()

        self._setupSearchEngines()
        gVar.app.searchEnginesManager().enginesChanged.connect(
            self._setupSearchEngines)

        searchLayout.addWidget(searchLabel)
        searchLayout.addLayout(self._searchEnginesLayout)
        searchLayout.addStretch()
        searchLayout.addWidget(searchSettingsButton)

        layout.addWidget(searchFrame)

    def model(self):
        '''
        @return: QAbstractItemModel
        '''
        return self._view.model()

    def setModel(self, model):
        '''
        @param model QAbstractItemModel
        '''
        self._view.setModel(model)

    def selectionModel(self):
        '''
        @return: QItemSelectionModel
        '''
        return self._view.selectionModel()

    def currentIndex(self):
        '''
        @return: QModelIndex
        '''
        return self._view.currentIndex()

    def setCurrentIndex(self, index):
        '''
        @param index QModelIndex
        '''
        self._view.setCurrentIndex(index)

    def adjustSize(self):
        maxItemsCount = 12
        newHeight = self._view.sizeHintForRow(0) * min(maxItemsCount,
                                                       self.model().rowCount())

        if not self._resizeTimer:
            self._resizeTimer = QTimer(self)
            self._resizeTimer.setInterval(200)

            def func():
                if self._resizeHeight > 0:
                    self._view.setFixedHeight(self._resizeHeight)
                    self.setFixedHeight(self.sizeHint().height())
                self._resizeHeight = -1

            self._resizeTimer.timeout.connect(func)

        if not self._forceResize:
            if newHeight == self._resizeHeight:
                return
            elif newHeight == self._view.height():
                self._resizeHeight = -1
                return
            elif newHeight < self._view.height():
                self._resizeHeight = newHeight
                self._resizeTimer.start()
                return

        self._resizeHeight = -1
        self._forceResize = False
        self._view.setFixedHeight(newHeight)
        self.setFixedHeight(self.sizeHint().height())

    # override
    def eventFilter(self, obj, event):  # noqa C901
        '''
        @param obj QObject
        @param event QEvent
        @return: bool
        '''
        # Event filter based on QCompleter::eventFilter from qcompleter.cpp
        if obj == self or obj == self._view or not self.isVisible():
            return False

        evtType = event.type()
        if obj == self._view.viewport():
            if evtType == QEvent.MouseButtonRelease:
                # QMouseEvent
                e = event
                index = self._view.indexAt(e.pos())
                if not index.isValid():
                    return False

                # Qt::MouseButton
                button = e.button()
                # Qt::KeyboardModifiers
                modifiers = e.modifiers()

                if button == Qt.LeftButton and modifiers == Qt.NoModifier:
                    self.indexActivated.emit(index)
                    return True

                if button == Qt.MiddleButton or (button == Qt.LeftButton
                                                 and modifiers
                                                 == Qt.ControlModifier):
                    self.indexCtrlActivated.emit(index)
                    return True

                if button == Qt.LeftButton and modifiers == Qt.ShiftModifier:
                    self.indexShiftActivated.emit(index)
                    return True

            return False

        if evtType == QEvent.KeyPress:
            # QKeyEvent
            keyEvent = event
            evtKey = keyEvent.key()
            modifiers = keyEvent.modifiers()
            index = self._view.currentIndex()
            item = self.model().index(0, 0)
            if item.data(LocationCompleterModel.VisitSearchItemRole):
                visitSearchIndex = item
            else:
                visitSearchIndex = QModelIndex()

            if (evtKey == Qt.Key_Up or evtKey == Qt.Key_Down) and \
                    self._view.currentIndex() != index:
                self._view.setCurrentIndex(index)  # TODO: ?

            if evtKey in (Qt.Key_Return, Qt.Key_Enter):
                if index.isValid():
                    if modifiers == Qt.NoModifier or modifiers == Qt.KeypadModifier:
                        self.indexActivated.emit(index)
                        return True

                    if modifiers == Qt.ControlModifier:
                        self.indexCtrlActivated.emit(index)
                        return True

                    if modifiers == Qt.ShiftModifier:
                        self.indexShiftActivated.emit(index)
                        return True

            elif evtKey == Qt.Key_End:
                if modifiers & Qt.ControlModifier:
                    self._view.setCurrentIndex(self.model().index(
                        self.model().rowCount() - 1, 0))
                    return True
                else:
                    self.close()

            elif evtKey == Qt.Key_Home:
                if modifiers & Qt.ControlModifier:
                    self._view.setCurrentIndex(self.model().index(0, 0))
                    self._view.scrollToTop()
                    return True
                else:
                    self.close()

            elif evtKey == Qt.Key_Escape:
                self.close()
                return True

            elif evtKey == Qt.Key_F4:
                if modifiers == Qt.AltModifier:
                    self.close()
                    return False

            elif evtKey in (Qt.Key_Tab, Qt.Key_Backtab):
                if modifiers != Qt.NoModifier and modifiers != Qt.ShiftModifier:
                    return False
                isBack = evtKey == Qt.Key_Backtab
                if evtKey == Qt.Key_Tab and modifiers == Qt.ShiftModifier:
                    isBack = True
                ev = QKeyEvent(QKeyEvent.KeyPress, isBack and Qt.Key_Up
                               or Qt.Key_Down, Qt.NoModifier)
                QApplication.sendEvent(self.focusProxy(), ev)
                return True

            elif evtKey in (Qt.Key_Up, Qt.Key_PageUp):
                if modifiers != Qt.NoModifier:
                    return False
                step = evtKey == Qt.Key_PageUp and 5 or 1
                if not index.isValid() or index == visitSearchIndex:
                    rowCount = self.model().rowCount()
                    lastIndex = self.model().index(rowCount - 1, 0)
                    self._view.setCurrentIndex(lastIndex)
                elif index.row() == 0:
                    self._view.setCurrentIndex(QModelIndex())
                else:
                    row = max(0, index.row() - step)
                    self._view.setCurrentIndex(self.model().index(row, 0))
                return True

            elif evtKey in (Qt.Key_Down, Qt.Key_PageDown):
                if modifiers != Qt.NoModifier:
                    return False
                step = evtKey == Qt.Key_PageDown and 5 or 1
                if not index.isValid():
                    firstIndex = self.model().index(0, 0)
                    self._view.setCurrentIndex(firstIndex)
                elif index != visitSearchIndex and index.row(
                ) == self.model().rowCount() - 1:
                    self._view.setCurrentIndex(visitSearchIndex)
                    self._view.scrollToTop()
                else:
                    row = min(self.model().rowCount() - 1, index.row() + step)
                    self._view.setCurrentIndex(self.model().index(row, 0))
                return True

            elif evtKey == Qt.Key_Delete:
                if index != visitSearchIndex and self._view.viewport().rect(
                ).contains(self._view.visualRect(index)):
                    self.indexDeleteRequested.emit(index)
                    return True

            elif evtKey == Qt.Key_Shift:
                self._delegate.setForceVisitItem(True)
                self._view.viewport().update()

            # end of switch evtKey

            if self.focusProxy():
                self.focusProxy().event(keyEvent)

            return True

        elif evtType == QEvent.KeyRelease:
            if event.key() == Qt.Key_Shift:
                self._delegate.setForceVisitItem(False)
                self._view.viewport().update()
                return True

        elif evtType in (QEvent.Wheel, QEvent.MouseButtonPress):
            if not self.underMouse():
                self.close()
                return False

        elif evtType == QEvent.FocusOut:
            # QFocusEvent
            focusEvent = event
            reason = focusEvent.reason()
            if reason != Qt.PopupFocusReason and reason != Qt.MouseFocusReason:
                self.close()

        elif evtType in (QEvent.Move, QEvent.Resize):
            w = obj
            if isinstance(w, QWidget) and w.isWindow() and self.focusProxy(
            ) and w == self.focusProxy().window():
                self.close()

        # end of switch evtType
        return False

    # Q_SIGNALS
    closed = pyqtSignal()
    searchEnginesDialogRequested = pyqtSignal()
    loadRequested = pyqtSignal(LoadRequest)

    indexActivated = pyqtSignal(QModelIndex)
    indexCtrlActivated = pyqtSignal(QModelIndex)
    indexShiftActivated = pyqtSignal(QModelIndex)
    indexDeleteRequested = pyqtSignal(QModelIndex)

    # public Q_SLOTS:
    def close(self):
        self.hide()
        self._view.verticalScrollBar().setValue(0)
        self._delegate.setForceVisitItem(False)
        self._forceResize = True

        self.closed.emit()

    # private:
    def _setupSearchEngines(self):
        for idx in (range(self._searchEnginesLayout.count())):
            item = self._searchEnginesLayout.takeAt(0)
            item.deleteLater()

        engines = gVar.app.searchEnginesManager().allEngines()
        for engine in engines:
            button = ToolButton(self)
            button.setIcon(engine.icon)
            button.setToolTip(engine.name)
            button.setAutoRaise(True)
            button.setIconSize(QSize(16, 16))

            def func():
                text = self.model().index(0, 0).data(
                    LocationCompleterModel.SearchStringRole)
                self.loadRequested.emit(
                    gVar.app.searchEngineManager().searchResult(engine, text))

            button.clicked.connect(func)
            self._searchEnginesLayout.addWidget(button)
コード例 #16
0
ファイル: gui.py プロジェクト: wahlby-lab/FlaskTissUUmaps
class SelectPluginWindow(QDialog):
    def __init__(self, app, parent=None):
        try:
            super(SelectPluginWindow, self).__init__(parent=parent)
            self.app = app
            self.setWindowTitle("Select Plugins")
            form = QFormLayout(self)
            form.addRow(QLabel("Plugin site:"))
            self.textbox = QLineEdit(self)
            self.textbox.setText(
                "https://tissuumaps.github.io/TissUUmaps/plugins/")
            form.addRow(self.textbox)

            # Create a button in the window
            self.button = QPushButton('Get plugins from site', self)
            self.button.move(20, 80)
            form.addRow(self.button)

            # connect button to function on_click
            self.button.clicked.connect(self.getPlugins)
            form.addRow(QLabel("Available plugins:"))
            self.listView = QListView(self)
            form.addRow(self.listView)

            buttonBox = QDialogButtonBox(
                QDialogButtonBox.Ok | QDialogButtonBox.Cancel, Qt.Horizontal,
                self)
            form.addRow(buttonBox)
            buttonBox.accepted.connect(self.accept)
            buttonBox.rejected.connect(self.reject)

            self.getPlugins()
        except:
            import traceback
            print(traceback.format_exc())

    def getPlugins(self):
        self.url = self.textbox.text()
        try:
            response = urllib.request.urlopen(self.url + "pluginList.json")
            self.items = json.loads(response.read())
            for plugin in self.items:
                if plugin["py"].replace(".py",
                                        "") in self.app.config["PLUGINS"]:
                    plugin["installed"] = True
                else:
                    plugin["installed"] = False

            model = QStandardItemModel(self.listView)
            for item in self.items:
                # create an item with a caption
                standardItem = QStandardItem(item["name"])
                standardItem.setCheckState(
                    Qt.Checked if item["installed"] else Qt.Unchecked)
                if not item["installed"]:
                    standardItem.setCheckable(True)
                standardItem.setEditable(False)

                model.appendRow(standardItem)
            self.listView.setModel(model)
        except:
            import traceback
            try:
                QMessageBox.warning(self, "Error", traceback.format_exc())
            except:
                print(traceback.format_exc())

    def itemsSelected(self):
        selected = []
        model = self.listView.model()
        i = 0
        while model.item(i):
            if model.item(i).checkState():
                selected.append(self.items[i])
            i += 1
        return selected
コード例 #17
0
class AbstractSubItemListView(QFrame):
    """
    THIS IS AN ABSTRACT CLASS, DO NOT INSTANTIATE
    """

    def __init__(self, parent: QObject, image_cache: ImageCache):
        super().__init__(parent)

        self._image_cache = image_cache
        self._model = AbstractItemListModel(self, image_cache, True)

        self._item_delegate = ItemDelegate(self)

        self._list_view = QListView(self)
        self._list_view.setItemDelegate(self._item_delegate)
        self._list_view.setContextMenuPolicy(Qt.CustomContextMenu)

        self._layout_manager = QVBoxLayout(self)
        self._layout_ui()

        # Connect signals to slots
        self._list_view.customContextMenuRequested.connect(self._show_context_menu)

    def _layout_ui(self):
        self._list_view.setSpacing(22)
        self._layout_manager.addWidget(self._list_view)

    def model(self) -> AbstractItemListModel:
        return self._model

    def _add_item_to_playlist(self, index: QModelIndex):
        """
        Given an index in the list, allows the user to add the selected item to a playlist of their choice
        """
        selected_item = self._list_view.model().at(index.row())
        add_dialog = AddToPlaylistDialog(self, selected_item)

        if add_dialog.exec() == QDialog.Accepted:
            # Insertion playlist has been accepted
            selected_playlist_id: int = add_dialog.get_selection()

            if type(selected_item) is Episode:
                add_episode_to_playlist(cursor, connection, selected_item.media_id, selected_item.episode_number,
                                        selected_item.name, selected_playlist_id)
            elif type(selected_item) is Song:
                add_song_to_playlist(cursor, connection, selected_item.media_id, selected_item.name,
                                     selected_playlist_id)
            elif type(selected_item) is ComedySpecial:
                add_comedy_special_to_playlist(cursor, connection, selected_item.media_id, selected_playlist_id)
            else:
                print("Attempting to add unexpected type to playlist")
                exit(1)

    @QtCore.pyqtSlot(QPoint)
    def _show_context_menu(self, pos: QPoint):
        """
        Displays a context menu of user choices on a right-click

        :param pos: Location where user clicked on the screen
        """

        index = self._list_view.indexAt(pos)

        if index.row() != -1:  # Must be a valid index
            global_pos = self._list_view.mapToGlobal(pos)

            context_menu = QMenu(self)

            # User should have the ability to add to playlist
            add_action = QAction("Add to playlist")
            add_action.triggered.connect(lambda: self._add_item_to_playlist(index))

            context_menu.addAction(add_action)

            context_menu.exec(global_pos)
            del context_menu
コード例 #18
0
class DictView(QWidget):
    BTN_ADDWORD_TEXT = 'Add'
    BTN_RMWORD_TEXT  = 'Remove'
    

    def __init__(self, parent: QObject = None, model: WordListModel = None, **kwargs):
        super().__init__(parent, **kwargs)

        self.lhb_control = QHBoxLayout()
        self.layout = QVBoxLayout()

        self.b_addword = QPushButton(self.BTN_ADDWORD_TEXT)
        self.b_rmword  = QPushButton(self.BTN_RMWORD_TEXT)
        self.cmb_wordclass = QComboBox()
        
        for wc in WordClass:
            self.cmb_wordclass.addItem(wc.name)

        self.hsplitter = QSplitter(Qt.Horizontal)

        self.wordlistview = QListView()
        self.wordeditview = WordEditView()

        self.wordlsmdl = model

        self.wordlistview.activated.connect(self.wordeditview.handle_wordlistitem_activated)

        self.hsplitter.addWidget(self.wordlistview)
        self.hsplitter.addWidget(self.wordeditview)
        self.hsplitter.setSizes([PyDictAppView.DESKTOP_DEFAULT_WIDTH * 0.4, PyDictAppView.DESKTOP_DEFAULT_WIDTH * 0.6])

        self.lhb_control.addWidget(self.cmb_wordclass)
        self.lhb_control.addWidget(self.b_addword)
        self.lhb_control.addWidget(self.b_rmword)
        self.lhb_control.addStretch()

        self.layout.addLayout(self.lhb_control)
        self.layout.addWidget(self.hsplitter)
        self.setLayout(self.layout)

        self.b_addword.clicked.connect(self.handle_b_addword_clicked)
        self.b_rmword.clicked.connect(self.handle_b_rmword_clicked)


    @property
    def wordlsmdl(self) -> WordListModel:
        return self.wordlistview.model()

    @wordlsmdl.setter
    def wordlsmdl(self, value: WordListModel) -> None:
        assert (value is None) or isinstance(value, WordListModel), 'The wordlsmdl property of {} class shall have {} type.'\
               .format(self.__class__.__name__, WordListModel.__name__)
        self.wordlistview.setModel(value)
        self.wordeditview.wordlsmdl = value


    def handle_b_addword_clicked(self) -> None:
        wc = self.parse_wordclass()
        word_dialog = WordDialog(wc, self.wordlsmdl, self)
        word_dialog.show()
        word_dialog.exec()


    def handle_b_rmword_clicked(self) -> None:
        self.wordeditview.activate_wordview(None)
        sel_indexes = self.wordlistview.selectionModel().selectedIndexes()
        if sel_indexes is not None:
            for index in sel_indexes:
                guid = self.wordlsmdl.get_guid(index)
                event_wordremreq = EventWordRemoveRequest(guid)
                event_wordremreq.fire()


    def parse_wordclass(self) -> WordClass:
        wordclass_text = self.cmb_wordclass.currentText()
        if WordClass.__members__.get(wordclass_text) is None:
            return WordClass.NOUN
        else:
            return WordClass[wordclass_text]
コード例 #19
0
ファイル: decompiler_gui.py プロジェクト: xTVaser/jak-project
class ObjectFileView(QDialog):
    def __init__(self, name):
        super().__init__()
        self.setWindowTitle(name)
        with open(
                os.path.join(get_jak_path(), "decompiler_out",
                             "{}_asm.json".format(name))) as f:
            self.asm_data = json.loads(f.read())

        main_layout = QVBoxLayout()
        monospaced_font = get_monospaced_font()
        self.header_label = QLabel()

        main_layout.addWidget(self.header_label)

        function_splitter = QSplitter()
        function_splitter.setSizePolicy(
            QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding))

        self.function_list = QTreeView()
        self.function_list_model = QStandardItemModel()
        self.functions_by_name = dict()
        root = self.function_list_model.invisibleRootItem()
        seg_roots = []

        for i in range(3):
            seg_entry = QStandardItem(segment_id_to_name(i))
            seg_entry.setFont(monospaced_font)
            seg_entry.setEditable(False)
            root.appendRow(seg_entry)
            seg_roots.append(seg_entry)

        for f in self.asm_data["functions"]:
            function_entry = QStandardItem(f["name"])
            function_entry.setFont(monospaced_font)
            function_entry.setEditable(False)
            seg_roots[f["segment"]].appendRow(function_entry)
            self.functions_by_name[f["name"]] = f

        self.header_label.setText(
            "Object File {} Functions ({} total):".format(
                name, len(self.asm_data["functions"])))

        self.function_list.setModel(self.function_list_model)
        self.function_list.clicked.connect(self.display_function)
        function_splitter.addWidget(self.function_list)

        layout = QVBoxLayout()

        self.function_header_label = QLabel("No function selected")
        self.function_header_label.setFont(monospaced_font)
        self.header_label.setSizePolicy(
            QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum))
        layout.addWidget(self.function_header_label)

        self.op_asm_split_view = QSplitter()
        self.op_asm_split_view.setSizePolicy(
            QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding))

        self.basic_op_pane = QListView()
        self.basic_op_pane.clicked.connect(self.basic_op_clicked)
        #layout.addWidget(self.basic_op_pane)
        self.op_asm_split_view.addWidget(self.basic_op_pane)

        self.asm_pane = QListView()
        self.op_asm_split_view.addWidget(self.asm_pane)

        layout.addWidget(self.op_asm_split_view)

        self.asm_display = QPlainTextEdit()
        self.asm_display.setMaximumHeight(80)
        layout.addWidget(self.asm_display)

        self.warnings_label = QLabel()
        layout.addWidget(self.warnings_label)

        widget = QWidget()
        widget.setLayout(layout)
        function_splitter.addWidget(widget)
        main_layout.addWidget(function_splitter)

        # add it to the window!
        self.setLayout(main_layout)

    def display_function(self, item):
        name = item.data()
        monospaced_font = get_monospaced_font()
        func = self.functions_by_name[name]
        basic_op_model = QStandardItemModel()
        basic_op_root = basic_op_model.invisibleRootItem()
        asm_model = QStandardItemModel()
        asm_root = asm_model.invisibleRootItem()

        self.basic_id_to_asm = []
        self.current_function = name
        op_idx = 0
        basic_idx = 0
        for op in func["asm"]:
            if "label" in op:
                asm_item = QStandardItem(op["label"] + "\n    " + op["asm_op"])
            else:
                asm_item = QStandardItem("    " + op["asm_op"])
            asm_item.setFont(monospaced_font)
            asm_item.setEditable(False)
            asm_root.appendRow(asm_item)

            if "basic_op" in op:
                if "label" in op:
                    basic_item = QStandardItem(op["label"] + "\n    " +
                                               op["basic_op"])
                else:
                    basic_item = QStandardItem("    " + op["basic_op"])
                basic_item.setFont(monospaced_font)
                basic_item.setEditable(False)
                basic_op_root.appendRow(basic_item)
                self.basic_id_to_asm.append(op_idx)
                basic_idx = basic_idx + 1
            op_idx = op_idx + 1
        self.basic_id_to_asm.append(op_idx)
        self.basic_op_pane.setModel(basic_op_model)
        self.asm_pane.setModel(asm_model)
        self.warnings_label.setText(func["warnings"])
        self.asm_display.setPlainText("")
        self.function_header_label.setText(
            "{}, type: {}\nfunc: {} obj: {}".format(name, func["type"],
                                                    func["name"],
                                                    func["parent_object"]))

    def basic_op_clicked(self, item):
        text = ""
        added_reg = 0
        asm_idx = self.basic_id_to_asm[item.row()]

        asm_op = self.functions_by_name[self.current_function]["asm"][asm_idx]
        if "type_map" in asm_op:
            for reg, type_name in asm_op["type_map"].items():
                text += "{}: {} ".format(reg, type_name)
                added_reg += 1
                if added_reg >= 4:
                    text += "\n"
                    added_reg = 0
            text += "\n"

        for i in range(asm_idx, self.basic_id_to_asm[item.row() + 1]):
            text += self.functions_by_name[
                self.current_function]["asm"][i]["asm_op"] + "\n"
        op = self.functions_by_name[self.current_function]["asm"][asm_idx]
        if "referenced_string" in op:
            text += op["referenced_string"]
        self.asm_display.setPlainText(text)
        self.asm_display.setFont(get_monospaced_font())
        self.asm_pane.setCurrentIndex(self.asm_pane.model().index(asm_idx, 0))
コード例 #20
0
class PlaylistView(QFrame):
    """
    Horizontal Scroll Area containing playlists that can be selected
    """

    # Signals
    should_display_playlist = pyqtSignal(
        int)  # Display playlist given playlist_id

    def __init__(self, parent: QObject, image_cache: ImageCache):
        super().__init__(parent)

        self.__item_delegate = PlaylistDelegate(self)
        self.__model = PlaylistModel(self, image_cache)

        self.__horizontal_list = QListView(self)
        self.__horizontal_list.setModel(self.__model)
        self.__horizontal_list.setItemDelegate(self.__item_delegate)
        self.__horizontal_list.verticalScrollBar().setEnabled(False)
        self.__horizontal_list.setContextMenuPolicy(Qt.CustomContextMenu)

        self.__layout_manager = QVBoxLayout(self)
        self.__layout_ui()

        # Connect signals to slots
        self.__horizontal_list.doubleClicked.connect(
            self.__playlist_double_clicked)
        self.__horizontal_list.customContextMenuRequested.connect(
            self.__show_context_menu)

    def __layout_ui(self):
        # Set up horizontal list
        self.__horizontal_list.setFlow(QListView.LeftToRight)
        self.__horizontal_list.setMinimumHeight(235)
        self.__horizontal_list.setSpacing(20)
        self.__layout_manager.addWidget(self.__horizontal_list)

    def model(self) -> PlaylistModel:
        return self.__model

    @QtCore.pyqtSlot(QModelIndex)
    def __playlist_double_clicked(self, index: QModelIndex):
        """
        Slot that connects to the doubleClicked signal

        Should either display contents of the playlist or allow for playlist creation (index dependent)
        :index: Index that was clicked
        """
        should_create_playlist = (index.row() != self.__model.rowCount() - 1)
        if should_create_playlist:
            # Didn't click last index (create playlist), should display contents
            self.should_display_playlist.emit(
                self.__model.at(index.row()).playlist_id)
        else:
            self.__model.create_new_playlist()

    @QtCore.pyqtSlot(QModelIndex)
    def __handle_playlist_rename(self, index: QModelIndex):
        """
        Allows the user to rename the playlist at index
        """
        playlist = self.__model.at(index.row())
        rename_dialog = RenamePlaylistDialog(self, playlist)
        if rename_dialog.exec() == QDialog.Accepted:
            # Rename successfully requested
            new_playlist_name = rename_dialog.get_new_name()
            rename_playlist(cursor, connection, playlist.playlist_id,
                            new_playlist_name)
            self.relayout()

    @QtCore.pyqtSlot(QPoint)
    def __show_context_menu(self, pos: QPoint):
        """
        Displays a context menu of user choices on a right-click

        :param pos: Location where user clicked on the screen
        """

        index = self.__horizontal_list.indexAt(pos)

        if index.row() != -1 and index.row() != self.__model.rowCount(
        ) - 1:  # Must be a valid index and not create
            global_pos = self.__horizontal_list.mapToGlobal(pos)

            context_menu = QMenu(self)

            show_action = QAction("Show Playlist")
            show_action.triggered.connect(
                lambda: self.__playlist_double_clicked(index))

            rename_action = QAction("Rename Playlist")
            rename_action.triggered.connect(
                lambda: self.__handle_playlist_rename(index))

            del_action = QAction("Delete Playlist")
            del_action.triggered.connect(
                lambda: self.__horizontal_list.model().delete_playlist(index))

            context_menu.addAction(show_action)
            context_menu.addSeparator()
            context_menu.addAction(rename_action)
            context_menu.addAction(del_action)

            context_menu.exec(global_pos)
            del context_menu

    def relayout(self):
        """
        Refreshes the UI to reflect the state of the DB
        """
        playlists = get_all_user_playlists(cursor)
        self.__model.update_playlist(playlists)
コード例 #21
0
ファイル: main.py プロジェクト: viantirreau/DIQB-UC-HPLC
class Drop(QWidget):
    add_path_signal = pyqtSignal(str)
    add_drag_n_drop_path_signal = pyqtSignal(str)
    remove_path_signal = pyqtSignal(str)
    export_all_signal = pyqtSignal(tuple)

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

        # Window creation
        bg = self.palette()
        bg.setColor(QPalette.Window, Qt.white)
        self.setPalette(bg)
        self.setFixedSize(340, 450)
        self.setWindowTitle("HPLC a Excel")
        self.setAcceptDrops(True)

        # Button creation
        self.btn_load_files = QPushButton("Cargar archivos", self)
        self.btn_export = QPushButton("Exportar todos a Excel", self)
        self.btn_remove_checked = QPushButton("Descartar seleccionados", self)
        self.btn_config = QPushButton("", self)
        self.btn_config.setIcon(QIcon("ui/gear.png"))
        self.btn_config.setMaximumWidth(30)
        self.btn_config.setToolTip("Configuración (Ctrl + K)")
        self.btn_config.setShortcut(Qt.CTRL + Qt.Key_K)

        # Label creation
        self.copyright = QLabel("DIQB UC - Víctor Tirreau - 2018", self)
        self.copyright.setStyleSheet("color: #444444;")
        self.copyright.setAlignment(Qt.AlignCenter)

        # Button connection
        self.btn_load_files.clicked.connect(self.get_files)
        self.btn_remove_checked.clicked.connect(self.remove_checked)
        self.btn_export.clicked.connect(self.open_export_dialog)
        self.btn_config.clicked.connect(self.open_config_dialog)

        # Signal connection
        self.back = backend.PDFToExcel(self)
        self.add_path_signal.connect(self.back.add_paths)
        self.remove_path_signal.connect(self.back.remove_paths)
        self.add_drag_n_drop_path_signal.connect(
            self.back.add_paths_drag_n_drop)
        self.export_all_signal.connect(self.back.export_pdf_to_excel)

        # List
        self.list = QListView(self)
        self.model = QStandardItemModel(self.list)
        self.list.setModel(self.model)

        # Layout
        top_h_box = QHBoxLayout()
        top_h_box.addWidget(self.btn_load_files)
        top_h_box.addWidget(self.btn_config)
        lower_h_box = QHBoxLayout()
        lower_h_box.addWidget(self.btn_remove_checked)
        lower_h_box.addStretch(10)
        lower_h_box.addWidget(self.btn_export)
        v_box = QVBoxLayout()
        v_box.addLayout(top_h_box)
        v_box.addWidget(self.list)
        v_box.addLayout(lower_h_box)
        v_box.addWidget(self.copyright)
        h_box = QHBoxLayout()
        h_box.addLayout(v_box)
        self.setLayout(h_box)

        # Config
        self.include_od = False

    def dragEnterEvent(self, event):
        if event.mimeData().hasText():
            event.acceptProposedAction()
        else:
            event.ignore()

    dragMoveEvent = dragEnterEvent

    def dropEvent(self, event):
        files = event.mimeData().text()
        self.add_drag_n_drop_path_signal.emit(files)

    def get_files(self):
        files, _ = QFileDialog.getOpenFileNames(
            self,
            "Elegir uno o más archivos PDF",
            "",
            "Archivos PDF (*.pdf)")
        if files:
            for file in files:
                self.add_path_signal.emit(file)

    def remove_checked(self):
        model = self.list.model()
        to_be_removed = [model.item(i) for i in range(model.rowCount()) if
                         model.item(i).checkState() == Qt.Checked]
        for path in to_be_removed:
            self.remove_path_signal.emit(path.file_name)

    def add_path_to_list(self, path_str):
        model = self.list.model()
        item = CustomStandardItem(path_str)
        item.setCheckable(True)
        item.setToolTip("Aún no procesado")
        item.setEditable(False)
        model.appendRow(item)

    def drop_path_from_list(self, path_str):
        model = self.list.model()
        pos = 0
        while pos < model.rowCount():
            item = model.item(pos)
            if item.file_name == path_str:
                model.removeRow(pos)
                break
            pos += 1

    def open_export_dialog(self):
        path = QFileDialog.getExistingDirectory(self,
                                                "Elegir carpeta para guardar "
                                                "Excel's")
        self.export_all_signal.emit((path,self.include_od))

    def open_config_dialog(self):
        dialog = QDialog(None, Qt.WindowCloseButtonHint)
        dialog.setWindowTitle("Configuración")
        dialog.setModal(True)
        check = QCheckBox("Agregar columnas de rendimiento (OD y mg/g)", dialog)
        check.setChecked(self.include_od)
        v_box = QVBoxLayout()
        v_box.addWidget(check)
        cancel = QPushButton("Cancelar", dialog)
        cancel.setShortcut(QKeySequence(Qt.Key_Escape))
        accept = QPushButton("Aceptar", dialog)
        accept.setShortcut(QKeySequence(Qt.Key_Enter))
        accept.setFocusPolicy(Qt.TabFocus)
        accept.setDefault(True)
        h_box = QHBoxLayout()
        h_box.addWidget(cancel)
        h_box.addWidget(accept)
        v_box.addStretch(1)
        v_box.addLayout(h_box)
        dialog.setFixedSize(300, 100)
        dialog.setLayout(v_box)
        cancel.clicked.connect(dialog.reject)
        accept.clicked.connect(dialog.accept)
        dialog.accepted.connect(lambda: apply_changes(check.checkState()))

        def apply_changes(state):
            self.include_od = state

        dialog.exec_()

    @pyqtSlot(tuple)
    def change_color_finished(self, args):
        file_name, res = args
        model = self.list.model()
        pos = 0
        while pos < model.rowCount():
            item = model.item(pos)
            if item.file_name == file_name:
                if res == 0:
                    item.setBackground(QColor("#bfb"))

                    item.setToolTip(f"Procesado correcto - {file_name}")
                    text = item.file_name
                    text = text[:34] + "..." if len(text) > 37 else text
                    text = "OK   " + text.ljust(38)
                    item.setText(text)
                else:
                    item.setBackground(QColor(250, 150, 150))
                    if res == 1:
                        item.setToolTip(
                            f"ERROR: El archivo {file_name} no tiene "
                            f"estándares")
                        text = item.file_name
                        text = text[:17] + "..." if len(text) > 21 else text
                        text += "  no tiene estándares"
                        item.setText(text)
                    if res == 2:
                        item.setToolTip(
                            f"ERROR: El archivo {file_name} está abierto por"
                            f" otro programa")
                        text = item.file_name
                        text = text[:17] + "..." if len(text) > 21 else text
                        text += "  está en uso por otro programa"
                        item.setText(text)
                    if res == 3:
                        item.setToolTip(
                            f"ERROR: El archivo {file_name} dio un error "
                            f"desconocido")
                        text = item.file_name
                        text = text[:17] + "..." if len(text) > 21 else text
                        text += "  error desconocido"
                        item.setText(text)
                break
            pos += 1

    @pyqtSlot(tuple)
    def progress_started(self, args):
        file_name, progress = args
        model = self.list.model()
        pos = 0
        while pos < model.rowCount():
            item = model.item(pos)
            if item.file_name == file_name:
                item.set_progress(progress)
                item.setToolTip(f"Procesando {file_name}")
                text = item.file_name
                text = text[:25] + "..." if len(text) > 28 else text
                text += "  procesando"
                item.setText(text)
                break
            pos += 1

    def closeEvent(self, event):
        QThreadPool.globalInstance().waitForDone()
        print("Bye")
        event.accept()
コード例 #22
0
ファイル: location_view.py プロジェクト: picobyte/pyprinciple
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()
コード例 #23
0
class GMDir:
    EXT_WHITELIST = '.pdf'

    @property
    def path(self):
        return self._path

    @property
    def documents(self):
        return self._documents

    @property
    def name(self):
        return self._name

    @property
    def tab_index(self):
        return self._tab_index

    @property
    def closed(self):
        return self._closed

    @property
    def open_count(self):
        return self._open_count

    @property
    def unsaved_count(self):
        return self._unsaved_count

    def __init__(self, gm, path):
        assert isinstance(gm, GalleryMark)
        self._gm = gm
        self._path = path
        self._name = os.path.basename(path)
        self._documents = []
        self._open_count = 0
        self._unsaved_count = 0

        self._tab_index = None
        self._tab_widget = None

        self._listview = QListView()
        self._listview.setViewMode(QListView.ListMode)
        self._listview.setSelectionBehavior(QListView.SelectRows)
        self._listview.activated.connect(self.onListViewItemActivated)

        self._active_document = None

        self._closed = False
        self.refresh(init=True)

    def refresh(self, init=False):
        to_remove = []
        for doc in self._documents:
            if not os.path.exists(doc.path):
                to_remove.append(doc)

        for r in to_remove:
            self._documents.remove(r)

        for item in os.listdir(self._path):
            full_path = os.path.join(self._path, item)

            if os.path.isfile(full_path):
                if item.lower().endswith(self.EXT_WHITELIST):
                    if init:
                        self._documents.append(GMDoc(full_path))
                    else:
                        found = False
                        for doc in self._documents:
                            if doc.path == full_path:
                                found = True

                        if not found:
                            self.documents.append(GMDoc(full_path))

        if self._active_document is None and len(self._documents) > 0:
            self.setActiveDocument(self._documents[0])

        self.updateState()

        if self._tab_widget is not None:
            self._tab_widget.setTabText(self._tab_index, self.getTabName())

    def onListViewItemActivated(self, model_index):
        doc = model_index.data(Qt.UserRole)
        self._gm.openDocument(doc)
        self.updateState()

    def updateState(self):
        self._open_count = 0
        self._unsaved_count = 0

        model = QStandardItemModel()

        for doc in self._documents:
            item_text = doc.name
            changed = doc.changed()

            if changed:
                item_text = '{}*'.format(item_text)
                self._unsaved_count += 1

            if self._active_document is not None and doc == self._active_document:
                item_text = '> {}'.format(item_text)
                self._open_count += 1
            elif doc.is_open:
                item_text = '+ {}'.format(item_text)
                self._open_count += 1

            item = QStandardItem(item_text)
            item.setData(doc, Qt.UserRole)
            item.setEditable(False)
            model.appendRow(item)

        self._listview.setModel(model)

    def getDocumentByIndex(self, index):
        if 0 <= index < len(self._documents):
            mi = self._listview.model().index(index, 0)
            self._listview.setCurrentIndex(mi)
            return mi.data(Qt.UserRole)
        return None

    def setActiveDocument(self, doc):
        self._active_document = doc
        self.updateState()

    def getPreviousDocument(self):
        previous = None

        if self._active_document is not None:
            for i, doc in enumerate(self._documents):
                if doc == self._active_document:
                    pi = i - 1

                    if pi >= 0:
                        previous = self._documents[pi]

        return previous

    def getNextDocument(self):
        next = None

        if self._active_document is not None:
            for i, doc in enumerate(self._documents):
                if doc == self._active_document:
                    ni = i + 1

                    if ni < len(self._documents):
                        next = self._documents[ni]

        return next

    def getTabName(self):
        return '{} ({})'.format(self._name, len(self._documents))

    def setupTab(self, tab_widget):
        assert isinstance(tab_widget, QTabWidget)

        container = QWidget()
        layout = QVBoxLayout()

        self.updateState()

        layout.addWidget(self._listview)
        container.setLayout(layout)

        tab_widget.addTab(container, self.getTabName())
        self._tab_index = tab_widget.indexOf(container)
        self._tab_widget = tab_widget

    def close(self, active_doc=None):
        for doc in self._documents:
            if active_doc is not None and doc == active_doc:
                continue
            if doc.is_open:
                if not doc.close():
                    return False
        self._closed = True
        return True