File: defaultvalue.py

package info (click to toggle)
setools 4.6.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 3,600 kB
  • sloc: python: 24,485; makefile: 14
file content (95 lines) | stat: -rw-r--r-- 3,192 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# SPDX-License-Identifier: LGPL-2.1-only
from contextlib import suppress
import typing

from PyQt6 import QtWidgets
import setools

from .combobox import ComboBoxWidget

__all__ = ("DefaultValues",)


class DefaultValues(ComboBoxWidget):

    """Criteria selection widget presenting possible default_* values."""

    def __init__(self, title: str, query: setools.PolicyQuery, value_attrname: str,
                 range_attrname: str, /, *, enable_any: bool = True,
                 parent: QtWidgets.QWidget | None = None) -> None:

        super().__init__(title, query, value_attrname, enable_any=enable_any, parent=parent)

        for e_val in setools.DefaultValue:
            self.criteria.addItem(e_val.name, e_val)

        #
        # Add default range value combo box
        #
        self.range_attrname: typing.Final[str] = range_attrname
        self.criteria_range = QtWidgets.QComboBox(self)
        self.criteria_range.setEditable(False)
        self.criteria_range.setSizePolicy(QtWidgets.QSizePolicy(
            QtWidgets.QSizePolicy.Policy.Minimum,
            QtWidgets.QSizePolicy.Policy.Fixed))
        self.criteria_range.currentIndexChanged.connect(self._apply_range)
        self.top_layout.insertWidget(1, self.criteria_range)

        if enable_any:
            self.criteria_range.addItem("[Any]", None)

        for e_rng in setools.DefaultRangeValue:
            self.criteria_range.addItem(e_rng.name, e_rng)

    def _apply_range(self, idx: int) -> None:
        """Update the query based on the combo box."""
        value = self.criteria_range.itemText(idx)
        if value:
            # get enum value from combo box
            value = self.criteria_range.itemData(idx)

        self.log.debug(f"Setting {self.range_attrname} to {value!r}")
        setattr(self.query, self.range_attrname, value)

    #
    # Workspace methods
    #

    def save(self, settings: dict) -> None:
        super().save(settings)
        settings[self.range_attrname] = self.criteria_range.currentText()

    def load(self, settings: dict) -> None:
        with suppress(AttributeError, KeyError):
            idx = self.criteria_range.findText(settings[self.range_attrname])
            self.criteria_range.setCurrentIndex(idx)
        super().load(settings)


if __name__ == '__main__':
    import sys
    import logging
    import warnings

    logging.basicConfig(level=logging.DEBUG,
                        format='%(asctime)s|%(levelname)s|%(name)s|%(message)s')
    warnings.simplefilter("default")

    p = setools.SELinuxPolicy()
    q1 = setools.DefaultQuery(p)

    app = QtWidgets.QApplication(sys.argv)
    mw = QtWidgets.QMainWindow()
    window = QtWidgets.QWidget(mw)
    layout = QtWidgets.QHBoxLayout(window)
    widget1 = DefaultValues("Test default values", q1, "default", "default_range", parent=window)
    layout.addWidget(widget1)
    window.setToolTip("test tooltip")
    window.setWhatsThis("test what's this")
    mw.setCentralWidget(window)
    mw.resize(window.size())
    whatsthis = QtWidgets.QWhatsThis.createAction(mw)
    mw.menuBar().addAction(whatsthis)  # type: ignore[union-attr]
    mw.show()
    rc = app.exec()
    sys.exit(rc)