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()