Skip to content
Snippets Groups Projects
Commit ddae0df7 authored by Lan Dam's avatar Lan Dam
Browse files

db_config_dialog.py: add_row():modify to accept nextline in description,...

db_config_dialog.py: add_row():modify to accept nextline in description, return text for next field checking, set placeholdertext as hint for ValueColors; check changes before clicking on 'CLOSE'
parent aed8579d
No related branches found
No related tags found
1 merge request!70DB config dialogs
from PySide2 import QtWidgets, QtGui, QtCore
from typing import Set, Dict
from sohstationviewer.database.process_db import execute_db
......@@ -73,6 +74,10 @@ class UiDBInfoDialog(QtWidgets.QWidget):
self.col_name = col_name
self.table_name = table_name
self.check_fk = check_fk
"""
changes_by_rowid: dict of changes by row ids
"""
self.changes_by_rowid: Dict[int, Set[int]] = {}
super(UiDBInfoDialog, self).__init__()
# =========================== pre-define ============================
"""
......@@ -103,7 +108,8 @@ class UiDBInfoDialog(QtWidgets.QWidget):
main_layout.addWidget(QtWidgets.QLabel(instruction))
def add_widget(self, data_list, row_idx, col_idx, foreign_key=False,
choices=None, range_values=None, field_name=''):
choices=None, range_values=None, field_name='',
place_holder_text='') -> str:
"""
Add a cell widget at a given row and column in the data_table_widget.
......@@ -122,6 +128,9 @@ class UiDBInfoDialog(QtWidgets.QWidget):
:param field_name: name of the column in database. If field_name=
'convertFactor', add validator to limit precision to 6 decimal
points
:param place_holder_text: the text displayed in QTextEdit as a hint
for user
:return text: value of the current field in string
"""
if data_list is None:
text = str(row_idx) # row number
......@@ -131,7 +140,16 @@ class UiDBInfoDialog(QtWidgets.QWidget):
if data_list is None:
widget = QtWidgets.QPushButton(text)
elif choices is None and range_values is None:
widget = QtWidgets.QLineEdit(text)
if field_name == 'description':
widget = QtWidgets.QTextEdit()
height = 12
for line in text.split('\n'):
widget.append(line)
height += 16
widget.setFixedHeight(height)
else:
widget = QtWidgets.QLineEdit(text)
widget.setPlaceholderText(place_holder_text)
if field_name == 'convertFactor':
# precision=6
validator = QtGui.QDoubleValidator(0.0, 5.0, 6)
......@@ -175,6 +193,9 @@ class UiDBInfoDialog(QtWidgets.QWidget):
lambda changed_text:
self.cell_input_change(changed_text, row_idx, col_idx))
self.data_table_widget.setCellWidget(row_idx, col_idx, widget)
if field_name == 'description':
self.data_table_widget.resizeRowToContents(row_idx)
return text
@QtCore.Slot()
def row_number_clicked(self, widget):
......@@ -217,10 +238,26 @@ class UiDBInfoDialog(QtWidgets.QWidget):
self.close_btn = QtWidgets.QPushButton(self, text='CLOSE')
self.close_btn.setFixedWidth(300)
self.close_btn.clicked.connect(self.close)
self.close_btn.clicked.connect(self.on_close)
h_layout.addWidget(self.close_btn)
return h_layout
def on_close(self):
if len(self.changes_by_rowid) != 0:
msg = ("Some changes may have been created on the table.\n"
"Please click on Cancel to go back save those changes to "
"database.\n"
"OR click on Continue to close the dialog.")
msgbox = QtWidgets.QMessageBox()
msgbox.setWindowTitle('Do you want to continue?')
msgbox.setText(msg)
msgbox.addButton(QtWidgets.QMessageBox.Cancel)
msgbox.addButton('Continue', QtWidgets.QMessageBox.YesRole)
result = msgbox.exec_()
if result == QtWidgets.QMessageBox.Cancel:
return
self.close()
def create_data_table_widget(self):
"""
Create self.data_table_widget based on self.total_col, self.column
......@@ -304,6 +341,17 @@ class UiDBInfoDialog(QtWidgets.QWidget):
changed = True
cell_widget = self.data_table_widget.cellWidget(row_idx, col_idx)
set_widget_color(cell_widget, changed=changed)
else:
changed = True
if changed:
if row_idx not in self.changes_by_rowid:
self.changes_by_rowid[row_idx] = set()
self.changes_by_rowid[row_idx].add(col_idx - 1) # skip order col
else:
try:
self.changes_by_rowid[row_idx].remove(col_idx - 1)
except KeyError:
pass
def check_data_foreign_key(self, val):
"""
......@@ -394,6 +442,11 @@ class UiDBInfoDialog(QtWidgets.QWidget):
row_count = self.data_table_widget.rowCount()
for i in range(row_count):
widget_idx = i - (row_count - self.data_table_widget.rowCount())
if widget_idx != i and i in self.changes_by_rowid:
# row id may not be consistent with widget_idx due to
# row row removed or inserted.
self.changes_by_rowid.remove(i)
self.changes_by_rowid.add(widget_idx)
list_idx = (i - self.remove_count
+ self.insert_count - self.skip_count)
try:
......@@ -405,6 +458,11 @@ class UiDBInfoDialog(QtWidgets.QWidget):
reset = self.update_data(row_inputs, widget_idx, list_idx)
if reset > -1:
self.reset_row_inputs(reset, widget_idx, list_idx)
try:
if len(self.changes_by_rowid[widget_idx]) == 0:
del self.changes_by_rowid[widget_idx]
except KeyError:
pass
def update_data(self, row, widget_idx, list_idx, insert_sql, update_sql,
del_sql_add=None):
......@@ -444,6 +502,7 @@ class UiDBInfoDialog(QtWidgets.QWidget):
)
cell_widget.setText(org_row[0])
row[0] = org_row[0]
self.changes_by_rowid[widget_idx].remove(0)
self.update_data(row, widget_idx, list_idx)
else:
sql = (f"DELETE FROM {self.table_name} "
......@@ -451,6 +510,7 @@ class UiDBInfoDialog(QtWidgets.QWidget):
if del_sql_add is not None:
sql += sql
execute_db(sql)
del self.changes_by_rowid[widget_idx]
self.data_list.remove(org_row)
self.remove_row(widget_idx)
self.remove_count += 1
......@@ -470,6 +530,7 @@ class UiDBInfoDialog(QtWidgets.QWidget):
1)
cell_widget.setText(org_row[0])
row[0] = org_row[0]
self.changes_by_rowid[widget_idx].remove(0)
self.update_data(row, widget_idx, list_idx)
else:
msg = (f"Row {widget_idx}: {org_row} has "
......@@ -483,6 +544,7 @@ class UiDBInfoDialog(QtWidgets.QWidget):
else:
execute_db(update_sql % org_row[0])
self.data_list[list_idx] = row
del self.changes_by_rowid[widget_idx]
return 0
if row[0] == "":
......@@ -490,6 +552,7 @@ class UiDBInfoDialog(QtWidgets.QWidget):
f"It will be removed.")
QtWidgets.QMessageBox.information(self, "Error", msg)
self.remove_row(widget_idx)
del self.changes_by_rowid[widget_idx]
return -1
blank_required_columns = [self.required_columns[i]
for i in self.required_columns.keys()
......@@ -507,8 +570,10 @@ class UiDBInfoDialog(QtWidgets.QWidget):
f"Row {widget_idx} will be removed.")
QtWidgets.QMessageBox.information(self, "Error", msg)
self.remove_row(widget_idx)
del self.changes_by_rowid[widget_idx]
return -1
execute_db(insert_sql)
self.data_list.append(row)
self.insert_count += 1
del self.changes_by_rowid[widget_idx]
return 0
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment