Module soitool.soi_workspace_widget

Includes functionality to edit and view a single SOI.

Meant for use inside of tabs in our program.

Expand source code
"""Includes functionality to edit and view a single SOI.

Meant for use inside of tabs in our program.

"""
from PySide2.QtWidgets import (
    QWidget,
    QHBoxLayout,
    QVBoxLayout,
    QPushButton,
    QLabel,
    QDialog,
)
from PySide2 import QtCore
from soitool.enumerates import ModuleType
from soitool.soi import SOI, ModuleNameTaken
from soitool.module_list import ModuleList
from soitool.inline_editable_soi_view import (
    InlineEditableSOIView,
    try_reorganize,
)
from soitool.setup_settings import Setup
from soitool.new_module_dialog import NewModuleDialog
from soitool.dialog_wrappers import exec_warning_dialog
from soitool.modules.module_code_phrase import (
    CodePhraseModule,
    NoMoreAvailableCategories,
)
from soitool.modules.module_predefined_codes import PredefinedCodesModule

# List of SOI-modules that require a database as parameter
DATABASE_MODULES = [PredefinedCodesModule, CodePhraseModule]


class SOIWorkspaceWidget(QWidget):
    """Contains the working area for a single SOI.

    Creates a new SOI by default, but can receive an existing SOI through
    it's init parameter 'soi'.
    The parameter 'database' is passed to instantiate specific modules.

    The widget is used inside tabs in our application, and contains a sidebar
    with a module list along with a view of the SOI.
    """

    def __init__(self, database, soi=None):
        super().__init__()

        self.database = database

        if soi is None:
            self.soi = SOI()
        else:
            self.soi = soi

        self.popup = Setup(self.soi)

        self.layout_wrapper = QHBoxLayout()
        self.layout_sidebar = QVBoxLayout()

        # All widgets
        self.button_new_module = QPushButton("Ny modul")
        self.button_new_module.setShortcut("Ctrl+m")
        self.button_new_module.setStatusTip("Legg til en ny modul")
        self.button_setup = QPushButton("Oppsett")
        self.button_setup.setShortcut("Ctrl+i")
        self.button_setup.setStatusTip("Endre oppsett på SOI")
        self.button_reorganize = QPushButton("Reorganiser moduler")
        self.button_reorganize.setShortcut("Ctrl+space")
        self.button_reorganize.setStatusTip("Reorganiser moduler")

        self.list_modules = ModuleList(ModuleType.MAIN_MODULE, self.soi)
        self.list_attachments = ModuleList(
            ModuleType.ATTACHMENT_MODULE, self.soi
        )

        self.view = InlineEditableSOIView(self.soi)
        self.widget_sidebar = QWidget()
        self.widget_sidebar.setFixedWidth(200)
        self.popup.setWindowTitle("Oppsett")

        # Build layouts
        self.layout_sidebar.addWidget(QLabel("Moduler:"))
        self.layout_sidebar.addWidget(self.list_modules, 5)
        self.layout_sidebar.addWidget(QLabel("Vedlegg:"))
        self.layout_sidebar.addWidget(self.list_attachments, 1)
        self.layout_sidebar.addWidget(self.button_new_module)
        self.layout_sidebar.addWidget(self.button_setup)
        self.layout_sidebar.addWidget(self.button_reorganize)
        self.widget_sidebar.setLayout(self.layout_sidebar)
        self.layout_wrapper.addWidget(self.widget_sidebar)
        self.layout_wrapper.addWidget(self.view)

        self.setLayout(self.layout_wrapper)

        self.button_setup.clicked.connect(self.open_setup)
        self.button_new_module.clicked.connect(self.new_module)
        self.button_reorganize.clicked.connect(
            lambda: try_reorganize(self.soi)
        )

    def open_setup(self):
        """Open setup_settings."""
        self.popup.resize(300, 300)
        self.popup.setWindowFlag(QtCore.Qt.WindowContextHelpButtonHint, False)
        self.popup.get_from_soi()
        self.popup.exec()

    def new_module(self):
        """Add new module to SOI using new_module dialog.

        Raises
        ------
        Exception
            If unknown QDialog.DialogCode returned from NewModuleDialog.
        """
        new_module_dialog = NewModuleDialog()
        new_module_dialog.resize(350, 350)
        new_module_dialog.setWindowFlag(
            QtCore.Qt.WindowContextHelpButtonHint, False
        )
        dialogcode = new_module_dialog.exec()

        if dialogcode == QDialog.DialogCode.Accepted:

            # Fetch user's choices from the dialog
            chosen_module = new_module_dialog.list_module_choices.currentItem()
            module_choice = chosen_module.text()
            module_name = new_module_dialog.line_edit_name.text()
            module_widget_implementation = chosen_module.widget_implementation
            is_attachment = new_module_dialog.checkbox_attachment.isChecked()

            # No module name means the user expects one to be generated
            # Autogenerated name is not meant to be pretty, it's just meant
            # to be unique
            if not module_name:
                module_name = "{} {}".format(
                    module_choice,
                    str(len(self.soi.modules) + len(self.soi.attachments) + 1),
                )

            try:
                if module_widget_implementation in DATABASE_MODULES:
                    module = module_widget_implementation(
                        database=self.database
                    )
                else:
                    module = module_widget_implementation()
                self.soi.add_module(
                    module_name, module, is_attachment,
                )
            except ModuleNameTaken:
                exec_warning_dialog(
                    text="Modulen ble ikke lagt til.",
                    informative_text="Navnet du valgte er allerede i "
                    "bruk. Modulnavn må være unike. Velg et unikt "
                    "modulnavn, eller la programmet lage et navn "
                    "automatisk.",
                )
            except NoMoreAvailableCategories:
                exec_warning_dialog(
                    text="Modulen ble ikke lagt til.",
                    informative_text="Den valgte modulen krever en unik "
                    "kategori av ord for å lage koder, og det er dessverre "
                    "tomt for kategorier. Fjern andre moduler som bruker "
                    "kategori-ord eller legg til flere kategorier i "
                    "databasen.",
                )
        elif dialogcode == QDialog.DialogCode.Rejected:
            pass
        else:
            raise Exception(
                f"Unknown QDialog.DialogCode returned from "
                "NewModuleDialog: '{dialogcode}'"
            )

Classes

class SOIWorkspaceWidget (database, soi=None)

Contains the working area for a single SOI.

Creates a new SOI by default, but can receive an existing SOI through it's init parameter 'soi'. The parameter 'database' is passed to instantiate specific modules.

The widget is used inside tabs in our application, and contains a sidebar with a module list along with a view of the SOI.

Expand source code
class SOIWorkspaceWidget(QWidget):
    """Contains the working area for a single SOI.

    Creates a new SOI by default, but can receive an existing SOI through
    it's init parameter 'soi'.
    The parameter 'database' is passed to instantiate specific modules.

    The widget is used inside tabs in our application, and contains a sidebar
    with a module list along with a view of the SOI.
    """

    def __init__(self, database, soi=None):
        super().__init__()

        self.database = database

        if soi is None:
            self.soi = SOI()
        else:
            self.soi = soi

        self.popup = Setup(self.soi)

        self.layout_wrapper = QHBoxLayout()
        self.layout_sidebar = QVBoxLayout()

        # All widgets
        self.button_new_module = QPushButton("Ny modul")
        self.button_new_module.setShortcut("Ctrl+m")
        self.button_new_module.setStatusTip("Legg til en ny modul")
        self.button_setup = QPushButton("Oppsett")
        self.button_setup.setShortcut("Ctrl+i")
        self.button_setup.setStatusTip("Endre oppsett på SOI")
        self.button_reorganize = QPushButton("Reorganiser moduler")
        self.button_reorganize.setShortcut("Ctrl+space")
        self.button_reorganize.setStatusTip("Reorganiser moduler")

        self.list_modules = ModuleList(ModuleType.MAIN_MODULE, self.soi)
        self.list_attachments = ModuleList(
            ModuleType.ATTACHMENT_MODULE, self.soi
        )

        self.view = InlineEditableSOIView(self.soi)
        self.widget_sidebar = QWidget()
        self.widget_sidebar.setFixedWidth(200)
        self.popup.setWindowTitle("Oppsett")

        # Build layouts
        self.layout_sidebar.addWidget(QLabel("Moduler:"))
        self.layout_sidebar.addWidget(self.list_modules, 5)
        self.layout_sidebar.addWidget(QLabel("Vedlegg:"))
        self.layout_sidebar.addWidget(self.list_attachments, 1)
        self.layout_sidebar.addWidget(self.button_new_module)
        self.layout_sidebar.addWidget(self.button_setup)
        self.layout_sidebar.addWidget(self.button_reorganize)
        self.widget_sidebar.setLayout(self.layout_sidebar)
        self.layout_wrapper.addWidget(self.widget_sidebar)
        self.layout_wrapper.addWidget(self.view)

        self.setLayout(self.layout_wrapper)

        self.button_setup.clicked.connect(self.open_setup)
        self.button_new_module.clicked.connect(self.new_module)
        self.button_reorganize.clicked.connect(
            lambda: try_reorganize(self.soi)
        )

    def open_setup(self):
        """Open setup_settings."""
        self.popup.resize(300, 300)
        self.popup.setWindowFlag(QtCore.Qt.WindowContextHelpButtonHint, False)
        self.popup.get_from_soi()
        self.popup.exec()

    def new_module(self):
        """Add new module to SOI using new_module dialog.

        Raises
        ------
        Exception
            If unknown QDialog.DialogCode returned from NewModuleDialog.
        """
        new_module_dialog = NewModuleDialog()
        new_module_dialog.resize(350, 350)
        new_module_dialog.setWindowFlag(
            QtCore.Qt.WindowContextHelpButtonHint, False
        )
        dialogcode = new_module_dialog.exec()

        if dialogcode == QDialog.DialogCode.Accepted:

            # Fetch user's choices from the dialog
            chosen_module = new_module_dialog.list_module_choices.currentItem()
            module_choice = chosen_module.text()
            module_name = new_module_dialog.line_edit_name.text()
            module_widget_implementation = chosen_module.widget_implementation
            is_attachment = new_module_dialog.checkbox_attachment.isChecked()

            # No module name means the user expects one to be generated
            # Autogenerated name is not meant to be pretty, it's just meant
            # to be unique
            if not module_name:
                module_name = "{} {}".format(
                    module_choice,
                    str(len(self.soi.modules) + len(self.soi.attachments) + 1),
                )

            try:
                if module_widget_implementation in DATABASE_MODULES:
                    module = module_widget_implementation(
                        database=self.database
                    )
                else:
                    module = module_widget_implementation()
                self.soi.add_module(
                    module_name, module, is_attachment,
                )
            except ModuleNameTaken:
                exec_warning_dialog(
                    text="Modulen ble ikke lagt til.",
                    informative_text="Navnet du valgte er allerede i "
                    "bruk. Modulnavn må være unike. Velg et unikt "
                    "modulnavn, eller la programmet lage et navn "
                    "automatisk.",
                )
            except NoMoreAvailableCategories:
                exec_warning_dialog(
                    text="Modulen ble ikke lagt til.",
                    informative_text="Den valgte modulen krever en unik "
                    "kategori av ord for å lage koder, og det er dessverre "
                    "tomt for kategorier. Fjern andre moduler som bruker "
                    "kategori-ord eller legg til flere kategorier i "
                    "databasen.",
                )
        elif dialogcode == QDialog.DialogCode.Rejected:
            pass
        else:
            raise Exception(
                f"Unknown QDialog.DialogCode returned from "
                "NewModuleDialog: '{dialogcode}'"
            )

Ancestors

  • PySide2.QtWidgets.QWidget
  • PySide2.QtCore.QObject
  • PySide2.QtGui.QPaintDevice
  • Shiboken.Object

Class variables

var staticMetaObject

Methods

def new_module(self)

Add new module to SOI using new_module dialog.

Raises

Exception
If unknown QDialog.DialogCode returned from NewModuleDialog.
Expand source code
def new_module(self):
    """Add new module to SOI using new_module dialog.

    Raises
    ------
    Exception
        If unknown QDialog.DialogCode returned from NewModuleDialog.
    """
    new_module_dialog = NewModuleDialog()
    new_module_dialog.resize(350, 350)
    new_module_dialog.setWindowFlag(
        QtCore.Qt.WindowContextHelpButtonHint, False
    )
    dialogcode = new_module_dialog.exec()

    if dialogcode == QDialog.DialogCode.Accepted:

        # Fetch user's choices from the dialog
        chosen_module = new_module_dialog.list_module_choices.currentItem()
        module_choice = chosen_module.text()
        module_name = new_module_dialog.line_edit_name.text()
        module_widget_implementation = chosen_module.widget_implementation
        is_attachment = new_module_dialog.checkbox_attachment.isChecked()

        # No module name means the user expects one to be generated
        # Autogenerated name is not meant to be pretty, it's just meant
        # to be unique
        if not module_name:
            module_name = "{} {}".format(
                module_choice,
                str(len(self.soi.modules) + len(self.soi.attachments) + 1),
            )

        try:
            if module_widget_implementation in DATABASE_MODULES:
                module = module_widget_implementation(
                    database=self.database
                )
            else:
                module = module_widget_implementation()
            self.soi.add_module(
                module_name, module, is_attachment,
            )
        except ModuleNameTaken:
            exec_warning_dialog(
                text="Modulen ble ikke lagt til.",
                informative_text="Navnet du valgte er allerede i "
                "bruk. Modulnavn må være unike. Velg et unikt "
                "modulnavn, eller la programmet lage et navn "
                "automatisk.",
            )
        except NoMoreAvailableCategories:
            exec_warning_dialog(
                text="Modulen ble ikke lagt til.",
                informative_text="Den valgte modulen krever en unik "
                "kategori av ord for å lage koder, og det er dessverre "
                "tomt for kategorier. Fjern andre moduler som bruker "
                "kategori-ord eller legg til flere kategorier i "
                "databasen.",
            )
    elif dialogcode == QDialog.DialogCode.Rejected:
        pass
    else:
        raise Exception(
            f"Unknown QDialog.DialogCode returned from "
            "NewModuleDialog: '{dialogcode}'"
        )
def open_setup(self)

Open setup_settings.

Expand source code
def open_setup(self):
    """Open setup_settings."""
    self.popup.resize(300, 300)
    self.popup.setWindowFlag(QtCore.Qt.WindowContextHelpButtonHint, False)
    self.popup.get_from_soi()
    self.popup.exec()