Beispiel #1
0
    def __init__(self, suggestion='', input_valid_callback = None):

        self.input_valid_callback = input_valid_callback

        self.menu = QMenu()

        self.lb = QWidgetAction(None)

        self.widget = QWidget(None)
        self.layout = QHBoxLayout()
        self.button = QPushButton()
        self.button.setText("Ok")
        self.le = QLineEdit()

        self.layout.addWidget(self.le)
        self.layout.addWidget(self.button)
        self.widget.setLayout(self.layout)

        self.button.pressed.connect(self.done)

        self.le.textEdited.connect(self.check_input)
        self.eventFilter = EnterKeyPressFilter()
        self.eventFilter.callback = self.done
        self.le.installEventFilter(self.eventFilter)

        self.lb.setDefaultWidget(self.widget)

        self.menu.addAction(self.lb)

        self.le.setText(suggestion)
        self.le.setFocus()
        self.le.selectAll()

        self.result = None
class TabularViewFilterMenu(FilterMenuBase):
    """Filter menu to use together with FilterWidget in TabularViewMixin."""

    filterChanged = Signal(str, set, bool)

    def __init__(self, parent, identifier, data_to_value, show_empty=True):
        """
        Args:
            parent (SpineDBEditor)
            identifier (int): index identifier
            data_to_value (method): a method to translate item data to a value for display role
        """
        super().__init__(parent)
        self.identifier = identifier
        self._filter = DataToValueFilterWidget(self, data_to_value, show_empty=show_empty)
        self._filter_action = QWidgetAction(parent)
        self._filter_action.setDefaultWidget(self._filter)
        self.addAction(self._filter_action)
        self.anchor = parent
        self.connect_signals()

    def emit_filter_changed(self, valid_values):
        self.filterChanged.emit(self.identifier, valid_values, self._filter.has_filter())

    def event(self, event):
        if event.type() == QEvent.Show and self.anchor is not None:
            if self.anchor.area == "rows":
                pos = self.anchor.mapToGlobal(QPoint(0, 0)) + QPoint(0, self.anchor.height())
            elif self.anchor.area == "columns":
                pos = self.anchor.mapToGlobal(QPoint(0, 0)) + QPoint(self.anchor.width(), 0)
            self.move(pos)
        return super().event(event)
Beispiel #3
0
class TabularViewFilterMenu(FilterMenuBase):
    """Filter menu to use together with FilterWidget in TabularViewMixin."""

    filterChanged = Signal(object, set, bool)

    def __init__(self, parent, identifier, item_type, show_empty=True):
        """
        Args:
            parent (TabularViewMixin)
            identifier (int): index identifier
            item_type (str): either "object" or "parameter definition"
        """
        super().__init__(parent)
        self.identifier = identifier
        self._filter = TabularViewFilterWidget(parent, item_type, show_empty=show_empty)
        self._filter_action = QWidgetAction(parent)
        self._filter_action.setDefaultWidget(self._filter)
        self.addAction(self._filter_action)
        self.anchor = parent
        self.connect_signals()

    def emit_filter_changed(self, valid_values):
        self.filterChanged.emit(self.identifier, valid_values, self._filter.has_filter())

    def event(self, event):
        if event.type() == QEvent.Show and self.anchor is not None:
            if self.anchor.area == "rows":
                pos = self.anchor.mapToGlobal(QPoint(0, 0)) + QPoint(0, self.anchor.height())
            elif self.anchor.area == "columns":
                pos = self.anchor.mapToGlobal(QPoint(0, 0)) + QPoint(self.anchor.width(), 0)
            self.move(pos)
        return super().event(event)
Beispiel #4
0
    def addServerAction(self, text, function, args=[], kwargs={}):
        action = QWidgetAction(self)
        aButton = QPushButton(text)
        aButton.clicked.connect(lambda: function(*args, **kwargs))

        action.setDefaultWidget(aButton)
        self.ServerActions.addAction(action)
Beispiel #5
0
class TextInput():

    def __init__(self, suggestion='', input_valid_callback = None):

        self.input_valid_callback = input_valid_callback

        self.menu = QMenu()

        self.lb = QWidgetAction(None)

        self.widget = QWidget(None)
        self.layout = QHBoxLayout()
        self.button = QPushButton()
        self.button.setText("Ok")
        self.le = QLineEdit()

        self.layout.addWidget(self.le)
        self.layout.addWidget(self.button)
        self.widget.setLayout(self.layout)

        self.button.pressed.connect(self.done)

        self.le.textEdited.connect(self.check_input)
        self.eventFilter = EnterKeyPressFilter()
        self.eventFilter.callback = self.done
        self.le.installEventFilter(self.eventFilter)

        self.lb.setDefaultWidget(self.widget)

        self.menu.addAction(self.lb)

        self.le.setText(suggestion)
        self.le.setFocus()
        self.le.selectAll()

        self.result = None

    def show(self, pos):
        self.menu.exec_(pos)
        return self.result

    def done(self):
        self.result = self.le.text()
        self.menu.close()

    def check_input(self):
        if self.input_valid_callback is not None:
            result = self.input_valid_callback(self.le.text())
            if result:
                self.le.setStyleSheet('')
            else:
                self.le.setStyleSheet('background: pink')



        return None
Beispiel #6
0
 def __init__(self, parent, show_empty=True):
     """
     Args:
         parent (SpineDBEditor)
     """
     super().__init__(parent)
     self._filter = SimpleFilterWidget(self, show_empty=show_empty)
     self._filter_action = QWidgetAction(parent)
     self._filter_action.setDefaultWidget(self._filter)
     self.addAction(self._filter_action)
     self.connect_signals()
Beispiel #7
0
 def __init__(self, parent, identifier, item_type, show_empty=True):
     """
     Args:
         parent (TabularViewMixin)
         identifier (int): index identifier
         item_type (str): either "object" or "parameter definition"
     """
     super().__init__(parent)
     self.identifier = identifier
     self._filter = TabularViewFilterWidget(parent, item_type, show_empty=show_empty)
     self._filter_action = QWidgetAction(parent)
     self._filter_action.setDefaultWidget(self._filter)
     self.addAction(self._filter_action)
     self.anchor = parent
     self.connect_signals()
Beispiel #8
0
    def __init__(self, parent=None):
        super().__init__(parent)
        self._remove_filter = QAction('Remove filters', None)
        self._filter = FilterWidget()
        self._filter_action = QWidgetAction(parent)
        self._filter_action.setDefaultWidget(self._filter)
        self.addAction(self._remove_filter)
        self.addAction(self._filter_action)

        # add connections
        self.aboutToHide.connect(self._cancel_filter)
        self.aboutToShow.connect(self._check_filter)
        self._remove_filter.triggered.connect(self._clear_filter)
        self._filter.okPressed.connect(self._change_filter)
        self._filter.cancelPressed.connect(self.hide)
Beispiel #9
0
    def __init__(self, text=""):
        QWidgetAction.__init__(self, None)

        self.widget = QWidget(None)
        self.layout = QHBoxLayout()
        self.slider = QSlider()
        self.slider.setOrientation(Qt.Horizontal)
        self.label = QLabel()
        self.label.setText(text)

        self.layout.addWidget(self.label)
        self.layout.addWidget(self.slider)
        self.widget.setLayout(self.layout)

        self.setDefaultWidget(self.widget)
 def __init__(self, parent, identifier, data_to_value, show_empty=True):
     """
     Args:
         parent (SpineDBEditor)
         identifier (int): index identifier
         data_to_value (method): a method to translate item data to a value for display role
     """
     super().__init__(parent)
     self.identifier = identifier
     self._filter = DataToValueFilterWidget(self, data_to_value, show_empty=show_empty)
     self._filter_action = QWidgetAction(parent)
     self._filter_action.setDefaultWidget(self._filter)
     self.addAction(self._filter_action)
     self.anchor = parent
     self.connect_signals()
Beispiel #11
0
 def onDataViewContextMenu(self, pos):
     if not self.group_id:
         return
     index = self.DataView.indexAt(pos)
     menu_title = QWidgetAction(self.DataView)
     title_lbl = QLabel()
     title_lbl.setText(g_tr('ReferenceDataDialog', "Change type to:"))
     menu_title.setDefaultWidget(title_lbl)
     contextMenu = QMenu(self.DataView)
     contextMenu.addAction(menu_title)
     contextMenu.addSeparator()
     combo_model = self.GroupCombo.model()
     for i in range(self.GroupCombo.count()):
         type_id = combo_model.data(combo_model.index(i, combo_model.fieldIndex(self.group_fkey_field)))
         contextMenu.addAction(self.GroupCombo.itemText(i), partial(self.updateItemType, index, type_id))
     contextMenu.popup(self.DataView.viewport().mapToGlobal(pos))
Beispiel #12
0
class FilterMenu(QMenu):
    """Filter menu to use together with FilterWidget in TabularViewForm."""
    filterChanged = Signal(object, set, bool)

    def __init__(self, parent=None):
        super().__init__(parent)
        self._remove_filter = QAction('Remove filters', None)
        self._filter = FilterWidget()
        self._filter_action = QWidgetAction(parent)
        self._filter_action.setDefaultWidget(self._filter)
        self.addAction(self._remove_filter)
        self.addAction(self._filter_action)

        # add connections
        self.aboutToHide.connect(self._cancel_filter)
        self.aboutToShow.connect(self._check_filter)
        self._remove_filter.triggered.connect(self._clear_filter)
        self._filter.okPressed.connect(self._change_filter)
        self._filter.cancelPressed.connect(self.hide)

    def add_items_to_filter_list(self, items):
        self._filter._filter_model.add_item(items)
        self._filter.save_state()

    def remove_items_from_filter_list(self, items):
        self._filter._filter_model.remove_items(items)
        self._filter.save_state()

    def set_filter_list(self, data):
        self._filter.set_filter_list(data)

    def _clear_filter(self):
        self._filter.clear_filter()
        self._change_filter()

    def _check_filter(self):
        self._remove_filter.setEnabled(self._filter.has_filter())

    def _cancel_filter(self):
        self._filter._cancel_filter()

    def _change_filter(self):
        valid_values = set(self._filter._filter_state)
        if self._filter._filter_empty_state:
            valid_values.add(None)
        self.filterChanged.emit(self, valid_values, self._filter.has_filter())
        self.hide()
Beispiel #13
0
class SimpleFilterMenu(FilterMenuBase):

    filterChanged = Signal(set)

    def __init__(self, parent, show_empty=True):
        """
        Args:
            parent (SpineDBEditor)
        """
        super().__init__(parent)
        self._filter = SimpleFilterWidget(self, show_empty=show_empty)
        self._filter_action = QWidgetAction(parent)
        self._filter_action.setDefaultWidget(self._filter)
        self.addAction(self._filter_action)
        self.connect_signals()

    def emit_filter_changed(self, valid_values):
        self.filterChanged.emit(valid_values)
 def __init__(self, parent, source_model, field, show_empty=True):
     """
     Args:
         parent (SpineDBEditor)
         source_model (CompoundParameterModel): a model to lazily get data from
         field (str): the field name
     """
     super().__init__(parent)
     self._source_model = source_model
     self._field = field
     self._filter = LazyFilterWidget(self, source_model, show_empty=show_empty)
     self._filter_action = QWidgetAction(parent)
     self._filter_action.setDefaultWidget(self._filter)
     self.addAction(self._filter_action)
     self._menu_data = dict()  # Maps value to set of (db map, entity_class id, item id)
     self._inv_menu_data = dict()  # Maps tuple (db map, entity_class id, item id) to value
     self.connect_signals()
     self.aboutToShow.connect(self._filter.set_model)
     self._source_model.refreshed.connect(self._handle_source_model_refreshed)
Beispiel #15
0
    def context_menu(self):
        """Add context menu triggered by right click

        The two purpose is to delete the column
        and change tile color
        """

        menu = QMenu(self)

        for color_name in TILE_STYLE:
            label = QLabel(color_name, self)

            label.setStyleSheet(MENU_STYLE[color_name])
            action = QWidgetAction(self)
            action.setDefaultWidget(label)
            action.triggered.connect(
                partial(self.color_change, color=color_name))
            menu.addAction(action)

        return menu
    def create_menu(self):
        self.menu = QMenu(self)
        # Enable theme, uncomment:
        self.menu.setStyleSheet(appStyle)
        self.menu.setCursor(QtCore.Qt.PointingHandCursor)
        tt1 = self.menu.addAction('Tooltip 1')
        tt1.setToolTip('t1')
        tt2 = self.menu.addAction('Tooltip 2')
        tt2.setToolTip('t2')
        tt3 = self.menu.addAction('Tooltip 3')
        tt3.setWhatsThis('setWhatsThis')
        tt3.setIconText('q')
        tt3.iconText()

        # custom style label
        text = QLabel("Label with custom text", self)
        text.setProperty('class', 'singlestyle')
        styleItem = QWidgetAction(self)
        styleItem.setDefaultWidget(text)
        styleItem.setProperty('class', 'singlestyle')
        tt4 = self.menu.addAction(styleItem)
        # tt4.setProperty('class', 'singlestyle')

        # tt4.Priority
        # tt4.setStyleSheet("QLabel { color: rgb(50, 50, 50); font-size: 11px; background-color: rgba(188, 188, 188, 50); border: 1px solid rgba(188, 188, 188, 250); }")
        self.menu.setToolTipsVisible(True)
        # self.menu.setIcon
        # self.menu.setwha(True)
        # self.menu.hovered.connect(lambda tt1= tt1, tt1())
        # self.menu.keyPressEvent(self.keyPressEvent)
        # pos = tt3.
        self.menu.installEventFilter(self)
        # widgetRect = self.menu.mapToGlobal()
        p = (0, 0)
        # print(self.menu.mapToGlobal(0,0))
        widgetRect = self.geometry()

        print(widgetRect)
        # tt2.hovered.connect(lambda tt2=self.tt2, tt2.tooltip())
        tt3.hovered.connect(lambda pos=[self], parent=self.menu, index=2: self.
                            show_toolTip(pos, parent, index))
class ParameterViewFilterMenu(FilterMenuBase):

    filterChanged = Signal(str, dict)

    def __init__(self, parent, source_model, field, show_empty=True):
        """
        Args:
            parent (SpineDBEditor)
            source_model (CompoundParameterModel): a model to lazily get data from
            field (str): the field name
        """
        super().__init__(parent)
        self._source_model = source_model
        self._field = field
        self._filter = LazyFilterWidget(self,
                                        source_model,
                                        show_empty=show_empty)
        self._filter_action = QWidgetAction(parent)
        self._filter_action.setDefaultWidget(self._filter)
        self.addAction(self._filter_action)
        self._menu_data = dict(
        )  # Maps value to set of (db map, entity_class id, item id)
        self._inv_menu_data = dict(
        )  # Maps tuple (db map, entity_class id, item id) to value
        self.connect_signals()
        self.aboutToShow.connect(self._filter.set_model)
        self._source_model.refreshed.connect(
            self._handle_source_model_refreshed)

    @Slot()
    def _handle_source_model_refreshed(self):
        """Updates the menu to only present values that are actually shown in the source model."""
        accepted_identifiers = {(m.db_map, m.entity_class_id, m.item_id(i))
                                for m, i in self._source_model._row_map}
        accepted_values = {
            value
            for value, identifiers in self._menu_data.items()
            if identifiers.intersection(accepted_identifiers)
        }
        self.set_filter_accepted_values(accepted_values)

    def set_filter_accepted_values(self, accepted_values):
        self._filter._filter_model.set_base_filter(
            lambda x: x in accepted_values)

    def set_filter_rejected_values(self, rejected_values):
        self._filter._filter_model.set_base_filter(
            lambda x: x not in rejected_values)

    def _get_value_to_remove(self, action, db_map, db_item):
        if action not in ("remove", "update"):
            return None
        entity_class_id = db_item.get(self._source_model.entity_class_id_key)
        item_id = db_item["id"]
        identifier = (db_map, entity_class_id, item_id)
        old_value = self._inv_menu_data.pop(identifier, None)
        if old_value is None:
            return None
        old_items = self._menu_data[old_value]
        old_items.remove(identifier)
        if not old_items:
            del self._menu_data[old_value]
            return old_value

    def _get_value_to_add(self, action, db_map, db_item):
        if action not in ("add", "update"):
            return None
        entity_class_id = db_item.get(self._source_model.entity_class_id_key)
        item_id = db_item["id"]
        identifier = (db_map, entity_class_id, item_id)
        value = db_map.codename if self._field == "database" else db_item[
            self._field]
        self._inv_menu_data[identifier] = value
        if value not in self._menu_data:
            self._menu_data[value] = {identifier}
            return value
        self._menu_data[value].add(identifier)

    def modify_menu_data(self, action, db_map, db_items):
        """Modifies data in the menu.

        Args:
            action (str): either 'add', 'remove', or 'update'
            db_map (DiffDatabaseMapping)
            db_items (list(dict))
        """
        values_to_add = list()
        values_to_remove = list()
        for db_item in db_items:
            to_remove = self._get_value_to_remove(action, db_map, db_item)
            to_add = self._get_value_to_add(action, db_map, db_item)
            if to_remove is not None:
                values_to_remove.append(to_remove)
            if to_add is not None:
                values_to_add.append(to_add)
        if values_to_remove:
            self.remove_items_from_filter_list(values_to_remove)
        if values_to_add:
            self.add_items_to_filter_list(values_to_add)

    def _build_auto_filter(self, valid_values):
        """
        Builds the auto filter given valid values.

        Args:
            valid_values (Sequence): Values accepted by the filter.

        Returns:
            dict: mapping db_map, to entity_class_id, to set of accepted parameter_value/definition ids
        """
        if not self._filter.has_filter():
            return {}  # All-pass
        if not valid_values:
            return None  # You shall not pass
        auto_filter = {}
        for value in valid_values:
            for db_map, entity_class_id, item_id in self._menu_data[value]:
                auto_filter.setdefault(db_map,
                                       {}).setdefault(entity_class_id,
                                                      set()).add(item_id)
        return auto_filter

    def emit_filter_changed(self, valid_values):
        """
        Builds auto filter and emits signal.

        Args:
            valid_values (Sequence): Values accepted by the filter.
        """
        auto_filter = self._build_auto_filter(valid_values)
        self.filterChanged.emit(self._field, auto_filter)
Beispiel #18
0
    def item_clicked(self, item):
        context_menu = QMenu(self)

        browser_item = QWidgetAction(context_menu)
        browser_item.setText("Open exploit-db")
        browser_item.setIcon(QIcon("assets/spider.png"))
        context_menu.addAction(browser_item)

        remove_item = QWidgetAction(context_menu)
        remove_item.setText("Remove Line")
        remove_item.setIcon(QIcon("assets/delete.png"))
        context_menu.addAction(remove_item)

        close_item = QWidgetAction(context_menu)
        close_item.setText("Close")
        close_item.setIcon(QIcon("assets/close.png"))
        context_menu.addAction(close_item)

        action = context_menu.exec_(QCursor.pos())

        if action == browser_item:
            if os.getuid() == 0:
                os.setuid(1000)

            if item.column():
                webbrowser.open(
                    "https://www.exploit-db.com/search?q=" + item.data(),
                    "--no-sandbox")
            else:
                webbrowser.open(
                    "https://www.exploit-db.com/search?q=" +
                    self.table.item(item.row(), 1).text(),
                    "--no-sandbox",
                )
        elif action == remove_item:
            self.remove_item(item.row())
Beispiel #19
0
        self.slider.setMinimum(val)

    def setMax(self, val):
        self.slider.setMaximum(val)


if __name__ == "__main__":
    app = QApplication()
    menu = QMenu()
    demo = MenuSlider("Demo slider")
    demo.setMin(-1)

    def cb(value):
        print(value)
        # print(demo.value())
        # demo.label.setText(str(demo.value()))

    demo.connectvalueChanged(cb)

    menu.addAction("test")
    menu.addAction(demo)

    # Insert a custom widget into the menu

    lb = QWidgetAction(None)
    lbl = QLabel('Static text')
    lb.setDefaultWidget(lbl)

    menu.addAction(lb)

    menu.exec_()
Beispiel #20
0
    def set_menu(self):
        # Exit QWidgetAction
        exit_item = QWidgetAction(self.about_menu)
        exit_item.setText("Exit")
        exit_item.setShortcut(QKeySequence.Quit)
        exit_item.setIcon(QIcon("assets/exit.png"))
        exit_item.triggered.connect(self.exit_app)

        self.file_menu.addAction(exit_item)

        # About QWidgetAction
        about_item = QWidgetAction(self.about_menu)
        about_item.setText("About")
        about_item.setShortcut(QKeySequence.FindNext)
        about_item.setIcon(QIcon("assets/gitlab.png"))
        about_item.triggered.connect(self.open_about_box)

        self.about_menu.addAction(about_item)
class MainWindow(QMainWindow, QWidget):
    def __init__(self):
        super().__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.sql = None
        self.filter = [[
            "Файлы баз данных (*.db *.sdb *.sqlite *.db3 *.s3db *.sqlite3 *.sl3 *.db2 *.s2db *.sqlite2 "
            "*.sl2)"
        ], ["Все файлы (*)"]]
        self.action_widgets = []
        self.filename = None

        self.action_4 = QAction("Выход")
        icon_000 = QIcon('ico/exit_closethesession_close_6317.ico')
        self.action_4.setIcon(icon_000)
        self.ui.menuFile.addAction(self.action_4)
        self.action_4.triggered.connect(self.exit)
        self.ui.action.triggered.connect(self.openFile)
        self.ui.action_2.triggered.connect(self.newFile)
        self.ui.action_3.triggered.connect(self.saveFile)
        self.action_widgets.append(self.ui.action_3)

        self.ui.menuFile.setTitle('Файл')
        toolbar = QToolBar()
        self.addToolBar(Qt.TopToolBarArea, toolbar)
        toolbar.setMovable(False)

        self.open_new_file = QWidgetAction(self.ui.menubar)
        icon01 = QIcon('ico/catalog_open.ico')
        self.open_new_file.setIcon(icon01)
        self.open_new_file.setToolTip('Открыть каталог')
        toolbar.addAction(self.open_new_file)
        self.open_new_file.triggered.connect(self.openFile)

        self.create_catalog = QWidgetAction(self.ui.menubar)
        icon03 = QIcon('ico/new-file_40454.ico')
        self.create_catalog.setIcon(icon03)
        self.create_catalog.setToolTip('Создать каталог')
        toolbar.addAction(self.create_catalog)
        self.create_catalog.triggered.connect(self.newFile)

        self.save_file = QWidgetAction(self.ui.menubar)
        icon02 = QIcon('ico/save_14949.ico')
        self.save_file.setIcon(icon02)
        self.save_file.setToolTip('Сохранить изменения')
        toolbar.addAction(self.save_file)
        self.save_file.triggered.connect(self.saveFile)
        self.action_widgets.append(self.save_file)

        self.search = QWidgetAction(self.ui.menubar)
        icon1 = QIcon('ico/android-search_icon-icons.com_50501.ico')
        self.search.setIcon(icon1)
        self.search.setToolTip('Найти запись')
        toolbar.addAction(self.search)
        self.search.triggered.connect(self.bookSearch)
        self.action_widgets.append(self.search)

        self.add_table_row = QWidgetAction(self.ui.menubar)
        icon2 = QIcon('ico/add-book_icon-icons.com_71795.ico')
        self.add_table_row.setIcon(icon2)
        self.add_table_row.setToolTip('Добавить запись')
        toolbar.addAction(self.add_table_row)
        self.add_table_row.triggered.connect(self.addRecord)
        self.action_widgets.append(self.add_table_row)

        self.del_table_row = QWidgetAction(self.ui.menubar)
        icon3 = QIcon('ico/open-book-with-minus-sign_icon-icons.com_70432.ico')
        self.del_table_row.setIcon(icon3)
        self.del_table_row.setToolTip('Удалить запись')
        toolbar.addAction(self.del_table_row)
        self.del_table_row.triggered.connect(self.removeRecord)
        self.action_widgets.append(self.del_table_row)

        self.clean_catalog = QWidgetAction(self.ui.menubar)
        icon4 = QIcon('ico/delete_4219.ico')
        self.clean_catalog.setIcon(icon4)
        self.clean_catalog.setToolTip('Очистить каталог')
        toolbar.addAction(self.clean_catalog)
        self.clean_catalog.triggered.connect(self.cleanCatalog)
        self.action_widgets.append(self.clean_catalog)

        self.undo_action = QWidgetAction(
            self.ui.menubar
        )  # TODO: Не отменяет добавление, удаление и очистку записей
        icon5 = QIcon('ico/undolinear_106178.ico')
        self.undo_action.setIcon(icon5)
        self.undo_action.setToolTip('Отмена действия')
        toolbar.addAction(self.undo_action)
        self.undo_action.triggered.connect(self.undoAction)
        self.action_widgets.append(self.undo_action)

        self.refresh_catalog = QWidgetAction(self.ui.menubar)
        icon6 = QIcon('ico/vcsupdaterequired_93493.ico')
        self.refresh_catalog.setIcon(icon6)
        self.refresh_catalog.setToolTip('Обновить')
        toolbar.addAction(self.refresh_catalog)
        self.refresh_catalog.triggered.connect(self.refresh)
        self.action_widgets.append(self.refresh_catalog)

        self.close_catalog = QWidgetAction(self.ui.menubar)
        icon7 = QIcon('ico/action_exit_close_remove_13915.ico')
        self.close_catalog.setIcon(icon7)
        self.close_catalog.setToolTip('Закрыть каталог')
        toolbar.addAction(self.close_catalog)
        self.close_catalog.triggered.connect(self.catalogClose)
        self.action_widgets.append(self.close_catalog)

        self.actionwidgetsOff()

    @classmethod
    def empty_widget(cls):
        """
        Метод для создания пустого Виджета
        :return: empty_widget
        """
        empty_widget = QWidget()
        return empty_widget

    def actionwidgetsOn(self):
        """
        Метод для активации Action-виджетов
        :return: None
        """
        for i in self.action_widgets:
            i.setEnabled(True)

    def actionwidgetsOff(self):
        """
        Метод для деактивации Action-виджетов
        :return: None
        """
        for i in self.action_widgets:
            i.setEnabled(False)

    def confirmAction(self):
        """
        Метод для подтверждения выбранного действия
        :return: str(result)
        """
        result = QMessageBox.question(
            None,
            "Подтверждение выбора",
            "Вы действительно хотите вьполнить действие?",
            buttons=QMessageBox.Yes | QMessageBox.No,
            defaultButton=QMessageBox.Yes)
        return str(result)

    @Slot()
    def openFile(self):
        """
        Слот для подключения каталога
        :return: None
        """
        dialog = QFileDialog.getOpenFileName(
            caption="Открыть каталог",
            dir=str(os.path.abspath("main.py")),
            filter=f"{self.filter[0]};;{self.filter[1]}",
            selectedFilter=f"{self.filter[0]}")
        if len(str(dialog[0])) != 0:
            if str(dialog[0]).split(".")[1] not in ('db', 'sdb', 'sqlite',
                                                    'db3', 's3db', 'sqlite3',
                                                    'sl3', 'db2', 's2db',
                                                    'sqlite2', 'sl2'):
                QMessageBox.information(None,
                                        "Предупреждение",
                                        "Данный тип файлов не поддерживается",
                                        buttons=QMessageBox.Ok,
                                        defaultButton=QMessageBox.Ok)
            else:
                self.filename = str(dialog[0])
                self.sql = SQLite(self.filename)
                widget = self.sql.on()
                self.setCentralWidget(widget)
                self.resize(widget.width(), widget.height())
                self.actionwidgetsOn()

    @Slot()
    def newFile(self):
        """
        Слот для создания нового каталога
        :return: None
        """
        dialog = QFileDialog.getSaveFileName(
            caption="Создать каталог",
            dir=str(os.path.abspath("main.py")),
            filter=f"Data base(*.db);;{self.filter[1]}",
            selectedFilter=f"Data base(*.db)")
        if len(str(dialog[0])) == 0:
            QMessageBox.information(None,
                                    "Предупреждение",
                                    "Введите название файла",
                                    buttons=QMessageBox.Ok,
                                    defaultButton=QMessageBox.Ok)
        else:
            conn = sqlite3.connect(str(dialog[0]))
            cursor = conn.cursor()
            cursor.execute(
                """CREATE TABLE books (Название_книги text, Автор  text, Год_выпуска text, Жанр text, Статус text)"""
            )
            conn.commit()
            conn.close()
            self.filename = str(dialog[0])
            self.sql = SQLite(self.filename)
            widget = self.sql.on()
            self.setCentralWidget(widget)
            self.resize(widget.width(), widget.height())
            self.actionwidgetsOn()

    @staticmethod
    def lower_func(string: str):
        return string.lower()

    @Slot()
    def bookSearch(self):  # TODO: не работает поиск, если не совпадает регистр
        """
        Слот для поиска информации в каталоге
        :return: None
        """
        valid = False
        tip_text = None
        while not valid:
            s, ok = QInputDialog.getText(None,
                                         "Окно поиска",
                                         "Найти",
                                         text=tip_text)
            tip_text = s
            if ok:
                # self.sql.conn.create_function("mylower", 1, MainWindow.lower_func)
                # s = s.lower()
                self.sql.model.setFilter(f"Название_книги LIKE '%{s}%' "
                                         f"OR Автор LIKE '%{s}%' "
                                         f"OR Год_выпуска LIKE '%{s}%' "
                                         f"OR Жанр LIKE '%{s}%' "
                                         f"OR Статус LIKE '%{s}%'")
                self.sql.model.select()
            else:
                self.refresh()
                valid = True

    @Slot()
    def addRecord(self):
        """
        Слот для добавления записи в каталог
        :return: None
        """
        self.sql.model.insertRow(self.sql.model.rowCount())
        self.sql.model.submitAll()

    @Slot()
    def removeRecord(self):
        """
        Слот для удаления записи из каталога
        :return: None
        """
        result = self.confirmAction()
        if result.split(".")[-1] == "Yes":
            if not self.sql.tableView.selectedIndexes():
                QMessageBox.information(None,
                                        "Предупреждение",
                                        "Выберите запись для удаления",
                                        buttons=QMessageBox.Ok,
                                        defaultButton=QMessageBox.Ok)
            else:
                self.sql.model.removeRow(
                    self.sql.tableView.currentIndex().row())
                self.sql.model.submitAll()
                self.sql.model.select()

    @Slot()
    def catalogClose(self):
        """
        Слот для закрытия каталога
        :return: None
        """
        result = self.confirmAction()
        if result.split(".")[-1] == "Yes":
            self.sql.db.close()
            self.setCentralWidget(MainWindow.empty_widget())
            self.actionwidgetsOff()

    @Slot()
    def undoAction(self):
        """
        Слот для отмены выполненных изменений
        :return: None
        """
        self.sql.model.revertAll()

    @Slot()
    def refresh(self):
        """
        Слот для обновления вывода на экран содержимого каталога
        :return: None
        """
        self.sql.model.submitAll()
        self.sql.db.close()
        self.sql = SQLite(self.filename)
        widget = self.sql.on()
        self.setCentralWidget(widget)
        self.resize(widget.width(), widget.height())

    @Slot()
    def cleanCatalog(self):
        """
        Слот для очистки каталога от записей
        :return: None
        """
        datas = None
        result = self.confirmAction()
        if result.split(".")[-1] == "Yes":
            for i in range(self.sql.model.rowCount() - 1, -1, -1):
                datas = self.sql.model.removeRow(i)
        self.sql.model.submitAll()
        self.sql.model.select()
        if datas is True:
            QMessageBox.information(None,
                                    "Информационное сообщение",
                                    "Каталог успешно очищен",
                                    buttons=QMessageBox.Ok,
                                    defaultButton=QMessageBox.Ok)

    @Slot()
    def saveFile(self):
        """
        Слот для сохранения изменений в каталоге
        :return: None
        """
        self.sql.model.submitAll()

    @Slot()
    def exit(self):
        QApplication.quit()
Beispiel #22
0
 def __init__(self, parent):
     """Initialize class."""
     super().__init__(parent)
     self.auto_filter = dict()
     # Layout
     self.all_item_model = AutoFilterMenuAllItemModel(self)
     self.value_item_model = AutoFilterMenuValueItemModel(self)
     self.text_filter = QLineEdit(self)
     self.text_filter.setPlaceholderText("Search...")
     self.text_filter.setClearButtonEnabled(True)
     self.all_item_view = AutoFilterMenuView(self)
     self.value_item_view = AutoFilterMenuView(self)
     self.all_item_view.setModel(self.all_item_model)
     self.value_item_view.setModel(self.value_item_model)
     text_filter_action = QWidgetAction(self)
     text_filter_action.setDefaultWidget(self.text_filter)
     all_item_view_action = QWidgetAction(self)
     all_item_view_action.setDefaultWidget(self.all_item_view)
     value_item_view_action = QWidgetAction(self)
     value_item_view_action.setDefaultWidget(self.value_item_view)
     self.addAction(text_filter_action)
     self.addAction(all_item_view_action)
     self.addAction(value_item_view_action)
     ok_action = self.addAction("Ok")
     self.text_filter.textEdited.connect(self.value_item_model.set_filter_reg_exp)
     ok_action.triggered.connect(self._handle_ok_action_triggered)
     self.all_item_model.checked_state_changed.connect(self.value_item_model.set_all_items_checked_state)
     self.value_item_model.all_checked_state_changed.connect(self.all_item_model.set_checked_state)
     self.aboutToShow.connect(self._fix_geometry)
    def __init__(self):
        super().__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.sql = None
        self.filter = [[
            "Файлы баз данных (*.db *.sdb *.sqlite *.db3 *.s3db *.sqlite3 *.sl3 *.db2 *.s2db *.sqlite2 "
            "*.sl2)"
        ], ["Все файлы (*)"]]
        self.action_widgets = []
        self.filename = None

        self.action_4 = QAction("Выход")
        icon_000 = QIcon('ico/exit_closethesession_close_6317.ico')
        self.action_4.setIcon(icon_000)
        self.ui.menuFile.addAction(self.action_4)
        self.action_4.triggered.connect(self.exit)
        self.ui.action.triggered.connect(self.openFile)
        self.ui.action_2.triggered.connect(self.newFile)
        self.ui.action_3.triggered.connect(self.saveFile)
        self.action_widgets.append(self.ui.action_3)

        self.ui.menuFile.setTitle('Файл')
        toolbar = QToolBar()
        self.addToolBar(Qt.TopToolBarArea, toolbar)
        toolbar.setMovable(False)

        self.open_new_file = QWidgetAction(self.ui.menubar)
        icon01 = QIcon('ico/catalog_open.ico')
        self.open_new_file.setIcon(icon01)
        self.open_new_file.setToolTip('Открыть каталог')
        toolbar.addAction(self.open_new_file)
        self.open_new_file.triggered.connect(self.openFile)

        self.create_catalog = QWidgetAction(self.ui.menubar)
        icon03 = QIcon('ico/new-file_40454.ico')
        self.create_catalog.setIcon(icon03)
        self.create_catalog.setToolTip('Создать каталог')
        toolbar.addAction(self.create_catalog)
        self.create_catalog.triggered.connect(self.newFile)

        self.save_file = QWidgetAction(self.ui.menubar)
        icon02 = QIcon('ico/save_14949.ico')
        self.save_file.setIcon(icon02)
        self.save_file.setToolTip('Сохранить изменения')
        toolbar.addAction(self.save_file)
        self.save_file.triggered.connect(self.saveFile)
        self.action_widgets.append(self.save_file)

        self.search = QWidgetAction(self.ui.menubar)
        icon1 = QIcon('ico/android-search_icon-icons.com_50501.ico')
        self.search.setIcon(icon1)
        self.search.setToolTip('Найти запись')
        toolbar.addAction(self.search)
        self.search.triggered.connect(self.bookSearch)
        self.action_widgets.append(self.search)

        self.add_table_row = QWidgetAction(self.ui.menubar)
        icon2 = QIcon('ico/add-book_icon-icons.com_71795.ico')
        self.add_table_row.setIcon(icon2)
        self.add_table_row.setToolTip('Добавить запись')
        toolbar.addAction(self.add_table_row)
        self.add_table_row.triggered.connect(self.addRecord)
        self.action_widgets.append(self.add_table_row)

        self.del_table_row = QWidgetAction(self.ui.menubar)
        icon3 = QIcon('ico/open-book-with-minus-sign_icon-icons.com_70432.ico')
        self.del_table_row.setIcon(icon3)
        self.del_table_row.setToolTip('Удалить запись')
        toolbar.addAction(self.del_table_row)
        self.del_table_row.triggered.connect(self.removeRecord)
        self.action_widgets.append(self.del_table_row)

        self.clean_catalog = QWidgetAction(self.ui.menubar)
        icon4 = QIcon('ico/delete_4219.ico')
        self.clean_catalog.setIcon(icon4)
        self.clean_catalog.setToolTip('Очистить каталог')
        toolbar.addAction(self.clean_catalog)
        self.clean_catalog.triggered.connect(self.cleanCatalog)
        self.action_widgets.append(self.clean_catalog)

        self.undo_action = QWidgetAction(
            self.ui.menubar
        )  # TODO: Не отменяет добавление, удаление и очистку записей
        icon5 = QIcon('ico/undolinear_106178.ico')
        self.undo_action.setIcon(icon5)
        self.undo_action.setToolTip('Отмена действия')
        toolbar.addAction(self.undo_action)
        self.undo_action.triggered.connect(self.undoAction)
        self.action_widgets.append(self.undo_action)

        self.refresh_catalog = QWidgetAction(self.ui.menubar)
        icon6 = QIcon('ico/vcsupdaterequired_93493.ico')
        self.refresh_catalog.setIcon(icon6)
        self.refresh_catalog.setToolTip('Обновить')
        toolbar.addAction(self.refresh_catalog)
        self.refresh_catalog.triggered.connect(self.refresh)
        self.action_widgets.append(self.refresh_catalog)

        self.close_catalog = QWidgetAction(self.ui.menubar)
        icon7 = QIcon('ico/action_exit_close_remove_13915.ico')
        self.close_catalog.setIcon(icon7)
        self.close_catalog.setToolTip('Закрыть каталог')
        toolbar.addAction(self.close_catalog)
        self.close_catalog.triggered.connect(self.catalogClose)
        self.action_widgets.append(self.close_catalog)

        self.actionwidgetsOff()
    def item_clicked(self, item):
        context_menu = QMenu(self)

        browser_item = QWidgetAction(context_menu)
        browser_item.setText("Open in Browser")
        browser_item.setIcon(QIcon("assets/browser.png"))
        context_menu.addAction(browser_item)

        remove_item = QWidgetAction(context_menu)
        remove_item.setText("Remove Line")
        remove_item.setIcon(QIcon("assets/delete.png"))
        context_menu.addAction(remove_item)

        close_item = QWidgetAction(context_menu)
        close_item.setText("Close")
        close_item.setIcon(QIcon("assets/close.png"))
        context_menu.addAction(close_item)

        action = context_menu.exec_(QCursor.pos())

        if action == browser_item:
            if os.getuid() == 0:
                os.setuid(1000)

            if item.column():
                webbrowser.open(item.data())
            else:
                webbrowser.open(self.table.item(item.row(), 1).text())
        elif action == remove_item:
            self.remove_item(item.row())