Skip to content

Commit 06dd478

Browse files
authored
Merge branch 'qe3' into 1049-status-dns-u-závodníka-co-nakonec-běžel
2 parents ea0a78a + 5d681b2 commit 06dd478

File tree

20 files changed

+209
-153
lines changed

20 files changed

+209
-153
lines changed

libqf/libqfgui/src/dialogs/dialog.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,9 @@ void Dialog::done(int result)
113113
if(dw) {
114114
ok = dw->acceptDialogDone(result);
115115
}
116-
if(ok)
116+
if(ok) {
117117
Super::done(result);
118+
}
118119
/*
119120
QVariant ok = true;
120121
QMetaObject::invokeMethod(this, "doneRequest_qml",

libqf/libqfgui/src/model/sqltablemodel.cpp

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -451,9 +451,26 @@ void SqlTableModel::revertRow(int row_no)
451451
Super::revertRow(row_no);
452452
}
453453

454+
QString SqlTableModel::reloadRowQuery(const QVariant &record_id)
455+
{
456+
qf::core::sql::QueryBuilder qb = m_queryBuilder;
457+
if(qb.isEmpty()) {
458+
qfWarning() << "Empty queryBuilder";
459+
return {};
460+
}
461+
auto sql_id_str = qMetaTypeId<QString>() == record_id.userType()? '\'' + record_id.toString() + '\'': QString::number(record_id.toInt());
462+
qb.where(idColumnName() + "=" + sql_id_str);
463+
qfs::QueryBuilder::BuildOptions opts;
464+
opts.setConnectionName(connectionName());
465+
QString query_str = qb.toString(opts);
466+
query_str = replaceQueryParameters(query_str);
467+
return query_str;
468+
}
469+
454470
int SqlTableModel::reloadRow(int row_no)
455471
{
456472
qfLogFuncFrame() << "row:" << row_no << "row count:" << rowCount();
473+
#ifdef NO_RELOAD_ROW_QUERY
457474
qf::core::sql::QueryBuilder qb = m_queryBuilder;
458475
if(qb.isEmpty()) {
459476
qfWarning() << "Empty queryBuilder";
@@ -462,9 +479,9 @@ int SqlTableModel::reloadRow(int row_no)
462479
qfu::TableRow &row_ref = m_table.rowRef(row_no);
463480
qf::core::sql::Connection sql_conn = sqlConnection();
464481
QSqlDriver *sqldrv = sql_conn.driver();
465-
Q_FOREACH(QString table_id, tableIds(m_table.fields())) {
482+
for (const auto &table_id : tableIds(m_table.fields())) {
466483
qfDebug() << "\ttableid:" << table_id;
467-
Q_FOREACH(QString fld_name, sql_conn.primaryIndexFieldNames(table_id)) {
484+
for (const auto &fld_name : sql_conn.primaryIndexFieldNames(table_id)) {
468485
QString full_fld_name = table_id + '.' + fld_name;
469486
int fld_ix = m_table.fields().fieldIndex(full_fld_name);
470487
if(fld_ix < 0) {
@@ -492,12 +509,18 @@ int SqlTableModel::reloadRow(int row_no)
492509
if(!isIncludeJoinedTablesIdsToReloadRowQuery())
493510
break;
494511
}
495-
qfs::Query q = qfs::Query(sql_conn);
496512
qfs::QueryBuilder::BuildOptions opts;
497513
opts.setConnectionName(connectionName());
498514
QString query_str = qb.toString(opts);
499515
query_str = replaceQueryParameters(query_str);
516+
#else
517+
qfu::TableRow &row_ref = m_table.rowRef(row_no);
518+
auto id = row_ref.value(idColumnName());
519+
auto query_str = reloadRowQuery(id);
520+
qf::core::sql::Connection sql_conn = sqlConnection();
521+
#endif
500522
qfDebug() << "\t reload row query:" << query_str;
523+
qfs::Query q = qfs::Query(sql_conn);
501524
bool ok = q.exec(query_str);
502525
QF_ASSERT(ok == true,
503526
QString("SQL Error: %1\n%2").arg(q.lastError().text()).arg(query_str),

libqf/libqfgui/src/model/sqltablemodel.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ class QFGUI_DECL_EXPORT SqlTableModel : public TableModel
5050
void revertRow(int row_no) Q_DECL_OVERRIDE;
5151
int reloadRow(int row_no) Q_DECL_OVERRIDE;
5252
int reloadInserts(const QString &id_column_name) Q_DECL_OVERRIDE;
53+
QString reloadRowQuery(const QVariant &record_id);
5354
public:
5455
void setQueryBuilder(const qf::core::sql::QueryBuilder &qb, bool clear_columns = false);
5556
const qf::core::sql::QueryBuilder& queryBuilder() const;

libqf/libqfgui/src/model/tablemodel.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ class QFGUI_DECL_EXPORT TableModel : public QAbstractTableModel
2020
{
2121
Q_OBJECT
2222
Q_PROPERTY(bool nullReportedAsString READ isNullReportedAsString WRITE setNullReportedAsString NOTIFY nullReportedAsStringChanged)
23+
24+
QF_PROPERTY_IMPL2(QString, i, I, dColumnName, QStringLiteral("id"))
2325
public:
2426
explicit TableModel(QObject *parent = nullptr);
2527
private:

libqf/libqfgui/src/tableview.cpp

Lines changed: 69 additions & 111 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include <qf/core/collator.h>
2525
#include <qf/core/assert.h>
2626
#include <qf/core/exception.h>
27+
#include <qf/core/sql/query.h>
2728
#include <qf/gui/model/sqltablemodel.h>
2829
#include <qf/gui/model/tablemodel.h>
2930
#include <qf/core/utils/treetable.h>
@@ -413,7 +414,7 @@ void TableView::cloneRow()
413414
cloneRowInline();
414415
}
415416
else {
416-
QVariant id = selectedRow().value(idColumnName());
417+
QVariant id = selectedRow().value(tableModel()->idColumnName());
417418
qfDebug() << "\t emit editRowInExternalEditor(ModeCopy)";
418419
emit editRowInExternalEditor(id, ModeCopy);
419420
emit editSelectedRowsInExternalEditor(ModeCopy);
@@ -431,7 +432,7 @@ void TableView::removeSelectedRows()
431432
else {
432433
QList<int> sel_rows = selectedRowsIndexes();
433434
if(sel_rows.count() == 1) {
434-
QVariant id = tableRow(sel_rows.value(0)).value(idColumnName());
435+
QVariant id = tableRow(sel_rows.value(0)).value(tableModel()->idColumnName());
435436
if(id.isValid())
436437
emit editRowInExternalEditor(id, ModeDelete);
437438
}
@@ -584,14 +585,15 @@ void TableView::paste()
584585
int origin_view_row = origin_ix.row();
585586
bool insert_rows = w->isInsert();
586587
int dest_row = toTableModelRowNo(origin_view_row);
587-
for(int src_row=0; src_row<src_tm->rowCount(); src_row++) {
588+
for(int src_row = 0; src_row < src_tm->rowCount(); src_row++) {
588589
if(insert_rows) {
589590
qfDebug() << "insert row:" << dest_row << "model row count:" << dest_tm->rowCount();
590591
dest_tm->insertRow(++dest_row);
591592
}
592593
else {
593-
if((origin_view_row + src_row) >= dest_tm->rowCount())
594+
if((origin_view_row + src_row) >= dest_tm->rowCount()) {
594595
break;
596+
}
595597
dest_row = toTableModelRowNo(origin_view_row + src_row);
596598
}
597599
int dest_col = origin_ix.column();
@@ -1118,122 +1120,78 @@ QList<int> TableView::selectedColumnsIndexes() const
11181120
return ret;
11191121
}
11201122

1121-
void TableView::rowExternallySaved(const QVariant &id, int mode)
1122-
{
1123-
qfLogFuncFrame() << "id:" << id.toString() << "mode:" << mode;
1124-
qfm::TableModel *tmd = tableModel();
1125-
if(tmd) {
1126-
if(mode == ModeInsert || mode == ModeCopy) {
1127-
/// ModeInsert or ModeCopy
1128-
qfDebug() << "\t ModeInsert or ModeCopy";
1129-
//qfDebug() << "\tri:" << ri;
1130-
//qfDebug() << "\tmodel->rowCount():" << ri;
1131-
QModelIndex curr_ix = currentIndex();
1132-
int ri = curr_ix.row() + 1;
1133-
if(ri >= 0 && ri < model()->rowCount())
1134-
ri = toTableModelRowNo(ri);
1135-
else
1136-
ri = tmd->rowCount();
1137-
ri = std::min(ri, tmd->rowCount());
1138-
qfDebug() << "\tri:" << ri;
1139-
if(ri < 0) {
1140-
qfWarning() << "Invalid row number:" << ri;
1141-
ri = 0;
1142-
}
1143-
tmd->insertRow(ri);
1144-
tmd->setValue(ri, idColumnName(), id);
1145-
//qfu::TableRow &row_ref = tmd->table().rowRef(ri);
1146-
//row_ref.setValue(idColumnName(), id);
1147-
//row_ref.setInsert(false);
1148-
int reloaded_row_cnt = tmd->reloadRow(ri);
1149-
if(reloaded_row_cnt == 0) {
1150-
//inserted row cannot be reloaded, it can happen if it doesn't meet WHERE contition of query
1151-
// remove just inserted row from table
1152-
qfWarning() << "Inserted/Copied row id:" << id.toString() << "cannot be reloaded, it will be deleted in table.";
1153-
tmd->qfm::TableModel::removeRowNoOverload(ri, !qf::core::Exception::Throw);
1154-
return;
1155-
}
1156-
if(reloaded_row_cnt != 1) {
1157-
qfWarning() << "Inserted/Copied row id:" << id.toString() << "reloaded in" << reloaded_row_cnt << "instances.";
1158-
return;
1159-
}
1160-
if(curr_ix.isValid()) {
1161-
updateRow(curr_ix.row());
1162-
setCurrentIndex(curr_ix.sibling(ri, curr_ix.column()));
1123+
void TableView::rowExternallySaved(const QVariant &id)
1124+
{
1125+
qfLogFuncFrame() << "id:" << id.toString();
1126+
auto table_model = qobject_cast<qf::gui::model::SqlTableModel*>(tableModel());
1127+
if (!table_model) {
1128+
qfWarning() << "Not SqlTableModel.";
1129+
return;
1130+
}
1131+
if(table_model) {
1132+
std::optional<int> row_with_id_index;
1133+
for(int ri = 0; ri < table_model->rowCount(); ri++) {
1134+
auto v = table_model->value(ri, tableModel()->idColumnName());
1135+
//qfDebug() << "\t row" << ri << "id:" << v.toString();
1136+
if(v == id) {
1137+
row_with_id_index = ri;
1138+
break;
11631139
}
1164-
else {
1165-
setCurrentIndex(model()->index(ri, 0, QModelIndex()));
1140+
}
1141+
auto query_str = table_model->reloadRowQuery(id);
1142+
if (query_str.isEmpty()) {
1143+
return;
1144+
}
1145+
qf::core::sql::Query q;
1146+
bool ok = q.exec(query_str);
1147+
if (!ok) {
1148+
qfInfo() << "Query:" << query_str;
1149+
qfWarning() << "SQL error:" << q.lastErrorText();
1150+
return;
1151+
}
1152+
int row_cnt = 0;
1153+
while (q.next()) {
1154+
row_cnt++;
1155+
}
1156+
if (row_cnt > 1) {
1157+
qfWarning() << "More rows returned for id:" << id;
1158+
return;
1159+
}
1160+
auto row_exists_in_db = row_cnt == 1;
1161+
1162+
auto curr_col = currentIndex().column();
1163+
auto curr_row = std::max(0, toTableModelRowNo(currentIndex().row()));
1164+
QModelIndex new_ix;
1165+
if (row_with_id_index && row_exists_in_db) {
1166+
// edit
1167+
table_model->reloadRow(row_with_id_index.value());
1168+
}
1169+
else if (!row_with_id_index && row_exists_in_db) {
1170+
// insert
1171+
table_model->insertRow(curr_row);
1172+
table_model->setValue(curr_row, tableModel()->idColumnName(), id);
1173+
table_model->reloadRow(curr_row);
1174+
new_ix = table_model->index(curr_row, curr_col >= 0? curr_col: 0);
1175+
setCurrentIndex(m_proxyModel->mapFromSource(new_ix));
1176+
}
1177+
else if (row_with_id_index && !row_exists_in_db) {
1178+
// delete
1179+
table_model->qfm::TableModel::removeRowNoOverload(row_with_id_index.value(), !qf::core::Exception::Throw);
1180+
auto row = currentIndex().row();
1181+
if (row >= model()->rowCount()) {
1182+
row = model()->rowCount() - 1;
11661183
}
1167-
updateRow(currentIndex().row());
1184+
setCurrentIndex(model()->index(row, curr_col));
11681185
}
11691186
else {
1170-
/// find row with id
1171-
/// start with currentRow, because id value is most probabbly here
1172-
int ri = currentIndex().row();
1173-
if(ri >= 0) {
1174-
QVariant v = tmd->value(ri, idColumnName());
1175-
//qfDebug() << "\t found id:" << v.toString();
1176-
if(v != id)
1177-
ri = -1;
1178-
}
1179-
if(ri < 0) for(ri=0; ri<tmd->rowCount(); ri++) {
1180-
QVariant v = tmd->value(ri, idColumnName());
1181-
//qfDebug() << "\t row" << ri << "id:" << v.toString();
1182-
if(v == id) {
1183-
break;
1184-
}
1185-
}
1186-
if((ri < 0 || ri >= tmd->rowCount()) && currentIndex().row() >= 0) {
1187-
// this can happen if ID column value is changed
1188-
// reload current row to do the best
1189-
ri = currentIndex().row();
1190-
// set ID value to the new one
1191-
tmd->setValue(ri, idColumnName(), id);
1192-
tmd->setDirty(ri, idColumnName(), false);
1193-
}
1194-
if(ri >= 0 && ri < tmd->rowCount()) {
1195-
if(mode == ModeEdit || mode == ModeView) {
1196-
int reloaded_row_cnt = tmd->reloadRow(ri);
1197-
if(reloaded_row_cnt != 1) {
1198-
qfWarning() << "Edited row index:" << ri << "id:" << id.toString() << "reloaded in" << reloaded_row_cnt << "instances.";
1199-
}
1200-
updateRow(currentIndex().row());
1201-
}
1202-
else if(mode == ModeDelete) {
1203-
int reloaded_row_cnt = tmd->reloadRow(ri);
1204-
if(reloaded_row_cnt > 0) {
1205-
qfWarning() << "Deleted row id:" << id.toString() << "still exists.";
1206-
}
1207-
else {
1208-
tmd->qfm::TableModel::removeRowNoOverload(ri, !qf::core::Exception::Throw);
1209-
if(ri >= tmd->rowCount())
1210-
ri = tmd->rowCount() - 1;
1211-
QModelIndex ix = currentIndex();
1212-
if(ri >= 0) {
1213-
ix = tmd->index(ri, (ix.column() >= 0)? ix.column(): 0);
1214-
//qfInfo() << "ix row:" << ix.row() << "col:" << ix.column();
1215-
setCurrentIndex(ix);
1216-
}
1217-
}
1218-
}
1219-
}
1187+
// nor in table neither in database
12201188
}
12211189
}
12221190
else {
12231191
qfError() << "Feature not defined for this model type:" << model();
12241192
}
12251193
}
1226-
/*
1227-
qf::core::utils::Table::SortDef TableView::seekSortDefinition() const
1228-
{
1229-
qfLogFuncFrame();
1230-
qf::core::utils::Table::SortDef ret;
1231-
if(tableModel()) {
1232-
ret = tableModel()->table().tableProperties().sortDefinition().value(0);
1233-
}
1234-
return ret;
1235-
}
1236-
*/
1194+
12371195
int TableView::seekColumn() const
12381196
{
12391197
int ret = -1;
@@ -2249,7 +2207,7 @@ bool TableView::edit(const QModelIndex& index, EditTrigger trigger, QEvent* even
22492207
if(trigger == QTableView::DoubleClicked || trigger == QTableView::EditKeyPressed) {
22502208
if(!read_only) {
22512209
emit editCellRequest(index);
2252-
QVariant id = selectedRow().value(idColumnName());
2210+
QVariant id = selectedRow().value(tableModel()->idColumnName());
22532211
if(id.isValid()) {
22542212
emit editRowInExternalEditor(id, ModeEdit);
22552213
}

libqf/libqfgui/src/tableview.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ class QFGUI_DECL_EXPORT TableView : public QTableView, public framework::IPersis
2828
Q_PROPERTY(qf::gui::model::TableModel* model READ tableModel WRITE setTableModel)
2929
Q_PROPERTY(RowEditorMode rowEditorMode READ rowEditorMode WRITE setRowEditorMode NOTIFY rowEditorModeChanged)
3030
Q_PROPERTY(InlineEditSaveStrategy inlineEditSaveStrategy READ inlineEditSaveStrategy WRITE setInlineEditSaveStrategy NOTIFY inlineEditSaveStrategyChanged)
31-
Q_PROPERTY(QString idColumnName READ idColumnName WRITE setIdColumnName)
3231
Q_PROPERTY(bool showExceptionDialog READ isShowExceptionDialog WRITE setShowExceptionDialog NOTIFY showExceptionDialogChanged)
3332
Q_PROPERTY(bool readOnly READ isReadOnly WRITE setReadOnly NOTIFY readOnlyChanged)
3433
private:
@@ -61,7 +60,6 @@ class QFGUI_DECL_EXPORT TableView : public QTableView, public framework::IPersis
6160

6261
QF_PROPERTY_IMPL2(InlineEditSaveStrategy, i, I, nlineEditSaveStrategy, OnEditedValueCommit)
6362
QF_PROPERTY_IMPL2(RowEditorMode, r, R, owEditorMode, EditRowsInline)
64-
QF_PROPERTY_IMPL2(QString, i, I, dColumnName, QStringLiteral("id"))
6563
QF_PROPERTY_BOOL_IMPL2(s, S, howExceptionDialog, true)
6664
//QF_PROPERTY_BOOL_IMPL(r, R, eadOnly)
6765

@@ -141,7 +139,7 @@ class QFGUI_DECL_EXPORT TableView : public QTableView, public framework::IPersis
141139
Q_SIGNAL void editCellRequest(const QModelIndex &table_view_index);
142140
Q_SIGNAL void editRowInExternalEditor(const QVariant &id, int mode);
143141
Q_SIGNAL void editSelectedRowsInExternalEditor(int mode);
144-
Q_SLOT virtual void rowExternallySaved(const QVariant &id, int mode);
142+
Q_SLOT virtual void rowExternallySaved(const QVariant &id);
145143

146144
Q_SIGNAL void filterDialogRequest();
147145
Q_SLOT void filterByString(const QString &s);

libquickevent/libquickeventgui/src/og/sqltablemodel.cpp

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,15 +84,24 @@ QVariant SqlTableModel::editValueToRaw(int column_index, const QVariant &val) co
8484
#endif
8585
}
8686
else if(type == qMetaTypeId<core::si::SiId>()) {
87-
auto id = (int)val.value<core::si::SiId>();
88-
if(id == 0)
87+
int siid = 0;
88+
if (val.userType() == qMetaTypeId<QString>()) {
89+
siid = val.toString().toInt();
90+
}
91+
else if (val.userType() == qMetaTypeId<core::si::SiId>()) {
92+
siid = (int)val.value<core::si::SiId>();
93+
}
94+
else {
95+
siid = val.toInt();
96+
}
97+
if(siid == 0)
8998
#if QT_VERSION_MAJOR >= 6
9099
ret = QVariant(QMetaType(QMetaType::Int));
91100
#else
92101
ret = QVariant(QVariant::Int);
93102
#endif
94103
else
95-
ret = id;
104+
ret = siid;
96105
}
97106
//qfInfo() << val << ret;
98107
return ret;

quickevent/app/quickevent/plugins/Classes/src/classestableview.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ void ClassesTableView::removeSelectedRows()
4040
try {
4141
qf::core::sql::Transaction transaction;
4242
for(int i : selectedRowsIndexes()) {
43-
int class_id = tableRow(i).value(idColumnName()).toInt();
43+
int class_id = tableRow(i).value(tableModel()->idColumnName()).toInt();
4444
getPlugin<ClassesPlugin>()->dropClass(class_id);
4545
}
4646
transaction.commit();

0 commit comments

Comments
 (0)