From 81623b162d1672901d9c8ec863a3aef12c664ed6 Mon Sep 17 00:00:00 2001 From: "Anders H. Rebner" <anderhre@stud.ntnu.no> Date: Sat, 14 Mar 2020 20:04:55 +0100 Subject: [PATCH] #42 Kodebok vises med sorteringsmulighet og #43 kan redigeres --- soitool/codebook.py | 63 +++++++++++++++++++----------------------- soitool/main_window.py | 35 +++++++++++++++-------- 2 files changed, 52 insertions(+), 46 deletions(-) diff --git a/soitool/codebook.py b/soitool/codebook.py index aa6bf80..dad7019 100644 --- a/soitool/codebook.py +++ b/soitool/codebook.py @@ -32,36 +32,36 @@ class CodeBookTableView(QTableView): if not db.open(): raise RuntimeError('Could not open database.') + # Enable sorting and sort by column 'Word' + self.setSortingEnabled(True) + #self.sortByColumn(0, Qt.AscendingOrder) + #self.new_row() + self.verticalHeader().hide() + # Create and set model: model = CodeBookTableModel() self.setModel(model) self.setEditTriggers(self.DoubleClicked) - # Enable sorting and sort by column 'Word' - self.setSortingEnabled(True) - self.sortByColumn(0, Qt.AscendingOrder) - self.new_row() + self.set_horizontal_header_text() # Set style of horizontal header header = self.horizontalHeader() - header.sectionClicked.connect(self.new_row) + # header.sectionClicked.connect(self.new_row) header.setFont(CODEBOOK_HEADER_FONT) header.setStyleSheet(CODEBOOK_HEADER_BACKGROUND_CSS) - # Set norwegian names in horizontal header - self.model().setHeaderData(0, Qt.Horizontal, "Ord/Uttrykk") - self.model().setHeaderData(1, Qt.Horizontal, "Kategori") - self.model().setHeaderData(2, Qt.Horizontal, "Type") - self.model().setHeaderData(3, Qt.Horizontal, "Kode") - self.setFixedWidth(600) self.resizeColumnsToContents() - def new_row(self): - """...""" - self.model().insertRow(self.model().rowCount()) + def set_horizontal_header_text(self): + """Set Norwegian names in horizontal header.""" + self.model().setHeaderData(0, Qt.Horizontal, "Ord/Uttrykk") + self.model().setHeaderData(1, Qt.Horizontal, "Kategori") + self.model().setHeaderData(2, Qt.Horizontal, "Type") + self.model().setHeaderData(3, Qt.Horizontal, "Kode") def close_db_connection(self): """Close database-connection.""" @@ -69,24 +69,23 @@ class CodeBookTableView(QTableView): QSqlDatabase.removeDatabase(CONNAME) def dataChanged(self, top_left, top_right, roles): - """Add new row to view when user writes top row to database. + """Resize column-width to contents when data changes. All parameters are sent to super. """ super().dataChanged(top_left, top_right, roles) - # Insert unique code and fetch/select new data (HVIS MAN MÃ…) - # db = Database() - # word_inserted = self.model().itemData(top_left)[0] - # db.insert_code(word_inserted) - # self.model().select() - self.resizeColumnsToContents() - # If top row (=> a new record was inserted to db), insert new top row - # if self.currentIndex().row() == 0: - if self.currentIndex().row() == self.model().rowCount() - 1: - self.new_row() + def setModel(self, model): + """Resize column-width to contents when a model is set. + + Parameter is sent to super.""" + #super().selectionModel() + super().setModel(model) + if model is not None: + self.set_horizontal_header_text() + self.resizeColumnsToContents() class CodeBookTableModel(QSqlTableModel): @@ -106,6 +105,7 @@ class CodeBookTableModel(QSqlTableModel): super().__init__(None, QSqlDatabase.database(CONNAME)) self.setEditStrategy(QSqlTableModel.OnFieldChange) self.setTable('CodeBook') + self.setSort(0, Qt.AscendingOrder) self.select() def flags(self, index): @@ -113,7 +113,6 @@ class CodeBookTableModel(QSqlTableModel): Set items in columns Word, Category & Type editable. Disable items in column Code, these are not editable. - Only item in last row, column Word (Primary key) is editable. Parameters ---------- @@ -127,16 +126,12 @@ class CodeBookTableModel(QSqlTableModel): """ flags = super().flags(index) - # Disable all items in last row except in column Word - if index.row() == self.rowCount() - 1 and index.column() != 0: + # Disable items in column 'Code' + if index.column() == 3: flags ^= Qt.ItemIsEnabled + # Enable editing on items in columns 'Word', 'Category' and 'Type' else: - # Disable items in column 'Code' - if index.column() == 3: - flags ^= Qt.ItemIsEnabled - # Enable editing on items in columns 'Word', 'Category' and 'Type' - else: - flags |= Qt.ItemIsEditable + flags |= Qt.ItemIsEditable return flags diff --git a/soitool/main_window.py b/soitool/main_window.py index d355ee5..61681d9 100644 --- a/soitool/main_window.py +++ b/soitool/main_window.py @@ -7,9 +7,10 @@ import sys import os from enum import Enum from PySide2.QtWidgets import QTabWidget, QWidget, QMainWindow, \ - QApplication, QHBoxLayout, QAction + QApplication, QHBoxLayout, QVBoxLayout, QAction from PySide2.QtGui import QIcon from soitool.codebook import CodeBookTableView +from soitool.codebook_row_adder import CodebookRowAdder from soitool.soi_workspace_widget import SOIWorkspaceWidget @@ -108,24 +109,34 @@ class MainWindow(QMainWindow): self.setWindowIcon(QIcon(filepath)) def open_codebook_tab(self): - """Open and selects tab containing CodeBookTableView. + """Open tab containing CodeBookTableView and CodebookRowAdder. - Select codebook-tab if it is already open. + Select codebook-tab if it is already open, + create and select codebook-tab if not open. """ - # Loop through tabs for existing codebook-tab: + # Loop through tabs to look for existing codebook-tab: for i in range(self.tabs.count()): if self.tabs.tabText(i) == "Kodebok": self.tabs.setCurrentIndex(i) break - # No existing codebook-tab, add tab + # Codebook-tab does not exist, create, add and select tab else: - widget = QWidget() - layout = QHBoxLayout() - tab = CodeBookTableView() - layout.addWidget(tab, stretch=0) - widget.setLayout(layout) - self.tabs.addTab(widget, 'Kodebok') - self.tabs.setCurrentWidget(widget) + # Create widgets + tab = QWidget() + view = CodeBookTableView() + row_adder = CodebookRowAdder(view) + + # Add widgets to layouts + vbox = QVBoxLayout() + vbox.addWidget(row_adder) + vbox.addWidget(view) + hbox = QHBoxLayout() + hbox.addLayout(vbox) + + # Set layout, add tab and select tab + tab.setLayout(hbox) + self.tabs.addTab(tab, 'Kodebok') + self.tabs.setCurrentWidget(tab) if __name__ == "__main__": -- GitLab