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