Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion libqf/libqfgui/src/dialogs/dialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -113,8 +113,9 @@ void Dialog::done(int result)
if(dw) {
ok = dw->acceptDialogDone(result);
}
if(ok)
if(ok) {
Super::done(result);
}
/*
QVariant ok = true;
QMetaObject::invokeMethod(this, "doneRequest_qml",
Expand Down
29 changes: 26 additions & 3 deletions libqf/libqfgui/src/model/sqltablemodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -451,9 +451,26 @@ void SqlTableModel::revertRow(int row_no)
Super::revertRow(row_no);
}

QString SqlTableModel::reloadRowQuery(const QVariant &record_id)
{
qf::core::sql::QueryBuilder qb = m_queryBuilder;
if(qb.isEmpty()) {
qfWarning() << "Empty queryBuilder";
return {};
}
auto sql_id_str = qMetaTypeId<QString>() == record_id.userType()? '\'' + record_id.toString() + '\'': QString::number(record_id.toInt());
qb.where(idColumnName() + "=" + sql_id_str);
qfs::QueryBuilder::BuildOptions opts;
opts.setConnectionName(connectionName());
QString query_str = qb.toString(opts);
query_str = replaceQueryParameters(query_str);
return query_str;
}

int SqlTableModel::reloadRow(int row_no)
{
qfLogFuncFrame() << "row:" << row_no << "row count:" << rowCount();
#ifdef NO_RELOAD_ROW_QUERY
qf::core::sql::QueryBuilder qb = m_queryBuilder;
if(qb.isEmpty()) {
qfWarning() << "Empty queryBuilder";
Expand All @@ -462,9 +479,9 @@ int SqlTableModel::reloadRow(int row_no)
qfu::TableRow &row_ref = m_table.rowRef(row_no);
qf::core::sql::Connection sql_conn = sqlConnection();
QSqlDriver *sqldrv = sql_conn.driver();
Q_FOREACH(QString table_id, tableIds(m_table.fields())) {
for (const auto &table_id : tableIds(m_table.fields())) {
qfDebug() << "\ttableid:" << table_id;
Q_FOREACH(QString fld_name, sql_conn.primaryIndexFieldNames(table_id)) {
for (const auto &fld_name : sql_conn.primaryIndexFieldNames(table_id)) {
QString full_fld_name = table_id + '.' + fld_name;
int fld_ix = m_table.fields().fieldIndex(full_fld_name);
if(fld_ix < 0) {
Expand Down Expand Up @@ -492,12 +509,18 @@ int SqlTableModel::reloadRow(int row_no)
if(!isIncludeJoinedTablesIdsToReloadRowQuery())
break;
}
qfs::Query q = qfs::Query(sql_conn);
qfs::QueryBuilder::BuildOptions opts;
opts.setConnectionName(connectionName());
QString query_str = qb.toString(opts);
query_str = replaceQueryParameters(query_str);
#else
qfu::TableRow &row_ref = m_table.rowRef(row_no);
auto id = row_ref.value(idColumnName());
auto query_str = reloadRowQuery(id);
qf::core::sql::Connection sql_conn = sqlConnection();
#endif
qfDebug() << "\t reload row query:" << query_str;
qfs::Query q = qfs::Query(sql_conn);
bool ok = q.exec(query_str);
QF_ASSERT(ok == true,
QString("SQL Error: %1\n%2").arg(q.lastError().text()).arg(query_str),
Expand Down
1 change: 1 addition & 0 deletions libqf/libqfgui/src/model/sqltablemodel.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ class QFGUI_DECL_EXPORT SqlTableModel : public TableModel
void revertRow(int row_no) Q_DECL_OVERRIDE;
int reloadRow(int row_no) Q_DECL_OVERRIDE;
int reloadInserts(const QString &id_column_name) Q_DECL_OVERRIDE;
QString reloadRowQuery(const QVariant &record_id);
public:
void setQueryBuilder(const qf::core::sql::QueryBuilder &qb, bool clear_columns = false);
const qf::core::sql::QueryBuilder& queryBuilder() const;
Expand Down
2 changes: 2 additions & 0 deletions libqf/libqfgui/src/model/tablemodel.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ class QFGUI_DECL_EXPORT TableModel : public QAbstractTableModel
{
Q_OBJECT
Q_PROPERTY(bool nullReportedAsString READ isNullReportedAsString WRITE setNullReportedAsString NOTIFY nullReportedAsStringChanged)

QF_PROPERTY_IMPL2(QString, i, I, dColumnName, QStringLiteral("id"))
public:
explicit TableModel(QObject *parent = nullptr);
private:
Expand Down
180 changes: 69 additions & 111 deletions libqf/libqfgui/src/tableview.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#include <qf/core/collator.h>
#include <qf/core/assert.h>
#include <qf/core/exception.h>
#include <qf/core/sql/query.h>
#include <qf/gui/model/sqltablemodel.h>
#include <qf/gui/model/tablemodel.h>
#include <qf/core/utils/treetable.h>
Expand Down Expand Up @@ -413,7 +414,7 @@ void TableView::cloneRow()
cloneRowInline();
}
else {
QVariant id = selectedRow().value(idColumnName());
QVariant id = selectedRow().value(tableModel()->idColumnName());
qfDebug() << "\t emit editRowInExternalEditor(ModeCopy)";
emit editRowInExternalEditor(id, ModeCopy);
emit editSelectedRowsInExternalEditor(ModeCopy);
Expand All @@ -431,7 +432,7 @@ void TableView::removeSelectedRows()
else {
QList<int> sel_rows = selectedRowsIndexes();
if(sel_rows.count() == 1) {
QVariant id = tableRow(sel_rows.value(0)).value(idColumnName());
QVariant id = tableRow(sel_rows.value(0)).value(tableModel()->idColumnName());
if(id.isValid())
emit editRowInExternalEditor(id, ModeDelete);
}
Expand Down Expand Up @@ -584,14 +585,15 @@ void TableView::paste()
int origin_view_row = origin_ix.row();
bool insert_rows = w->isInsert();
int dest_row = toTableModelRowNo(origin_view_row);
for(int src_row=0; src_row<src_tm->rowCount(); src_row++) {
for(int src_row = 0; src_row < src_tm->rowCount(); src_row++) {
if(insert_rows) {
qfDebug() << "insert row:" << dest_row << "model row count:" << dest_tm->rowCount();
dest_tm->insertRow(++dest_row);
}
else {
if((origin_view_row + src_row) >= dest_tm->rowCount())
if((origin_view_row + src_row) >= dest_tm->rowCount()) {
break;
}
dest_row = toTableModelRowNo(origin_view_row + src_row);
}
int dest_col = origin_ix.column();
Expand Down Expand Up @@ -1118,122 +1120,78 @@ QList<int> TableView::selectedColumnsIndexes() const
return ret;
}

void TableView::rowExternallySaved(const QVariant &id, int mode)
{
qfLogFuncFrame() << "id:" << id.toString() << "mode:" << mode;
qfm::TableModel *tmd = tableModel();
if(tmd) {
if(mode == ModeInsert || mode == ModeCopy) {
/// ModeInsert or ModeCopy
qfDebug() << "\t ModeInsert or ModeCopy";
//qfDebug() << "\tri:" << ri;
//qfDebug() << "\tmodel->rowCount():" << ri;
QModelIndex curr_ix = currentIndex();
int ri = curr_ix.row() + 1;
if(ri >= 0 && ri < model()->rowCount())
ri = toTableModelRowNo(ri);
else
ri = tmd->rowCount();
ri = std::min(ri, tmd->rowCount());
qfDebug() << "\tri:" << ri;
if(ri < 0) {
qfWarning() << "Invalid row number:" << ri;
ri = 0;
}
tmd->insertRow(ri);
tmd->setValue(ri, idColumnName(), id);
//qfu::TableRow &row_ref = tmd->table().rowRef(ri);
//row_ref.setValue(idColumnName(), id);
//row_ref.setInsert(false);
int reloaded_row_cnt = tmd->reloadRow(ri);
if(reloaded_row_cnt == 0) {
//inserted row cannot be reloaded, it can happen if it doesn't meet WHERE contition of query
// remove just inserted row from table
qfWarning() << "Inserted/Copied row id:" << id.toString() << "cannot be reloaded, it will be deleted in table.";
tmd->qfm::TableModel::removeRowNoOverload(ri, !qf::core::Exception::Throw);
return;
}
if(reloaded_row_cnt != 1) {
qfWarning() << "Inserted/Copied row id:" << id.toString() << "reloaded in" << reloaded_row_cnt << "instances.";
return;
}
if(curr_ix.isValid()) {
updateRow(curr_ix.row());
setCurrentIndex(curr_ix.sibling(ri, curr_ix.column()));
void TableView::rowExternallySaved(const QVariant &id)
{
qfLogFuncFrame() << "id:" << id.toString();
auto table_model = qobject_cast<qf::gui::model::SqlTableModel*>(tableModel());
if (!table_model) {
qfWarning() << "Not SqlTableModel.";
return;
}
if(table_model) {
std::optional<int> row_with_id_index;
for(int ri = 0; ri < table_model->rowCount(); ri++) {
auto v = table_model->value(ri, tableModel()->idColumnName());
//qfDebug() << "\t row" << ri << "id:" << v.toString();
if(v == id) {
row_with_id_index = ri;
break;
}
else {
setCurrentIndex(model()->index(ri, 0, QModelIndex()));
}
auto query_str = table_model->reloadRowQuery(id);
if (query_str.isEmpty()) {
return;
}
qf::core::sql::Query q;
bool ok = q.exec(query_str);
if (!ok) {
qfInfo() << "Query:" << query_str;
qfWarning() << "SQL error:" << q.lastErrorText();
return;
}
int row_cnt = 0;
while (q.next()) {
row_cnt++;
}
if (row_cnt > 1) {
qfWarning() << "More rows returned for id:" << id;
return;
}
auto row_exists_in_db = row_cnt == 1;

auto curr_col = currentIndex().column();
auto curr_row = std::max(0, toTableModelRowNo(currentIndex().row()));
QModelIndex new_ix;
if (row_with_id_index && row_exists_in_db) {
// edit
table_model->reloadRow(row_with_id_index.value());
}
else if (!row_with_id_index && row_exists_in_db) {
// insert
table_model->insertRow(curr_row);
table_model->setValue(curr_row, tableModel()->idColumnName(), id);
table_model->reloadRow(curr_row);
new_ix = table_model->index(curr_row, curr_col >= 0? curr_col: 0);
setCurrentIndex(m_proxyModel->mapFromSource(new_ix));
}
else if (row_with_id_index && !row_exists_in_db) {
// delete
table_model->qfm::TableModel::removeRowNoOverload(row_with_id_index.value(), !qf::core::Exception::Throw);
auto row = currentIndex().row();
if (row >= model()->rowCount()) {
row = model()->rowCount() - 1;
}
updateRow(currentIndex().row());
setCurrentIndex(model()->index(row, curr_col));
}
else {
/// find row with id
/// start with currentRow, because id value is most probabbly here
int ri = currentIndex().row();
if(ri >= 0) {
QVariant v = tmd->value(ri, idColumnName());
//qfDebug() << "\t found id:" << v.toString();
if(v != id)
ri = -1;
}
if(ri < 0) for(ri=0; ri<tmd->rowCount(); ri++) {
QVariant v = tmd->value(ri, idColumnName());
//qfDebug() << "\t row" << ri << "id:" << v.toString();
if(v == id) {
break;
}
}
if((ri < 0 || ri >= tmd->rowCount()) && currentIndex().row() >= 0) {
// this can happen if ID column value is changed
// reload current row to do the best
ri = currentIndex().row();
// set ID value to the new one
tmd->setValue(ri, idColumnName(), id);
tmd->setDirty(ri, idColumnName(), false);
}
if(ri >= 0 && ri < tmd->rowCount()) {
if(mode == ModeEdit || mode == ModeView) {
int reloaded_row_cnt = tmd->reloadRow(ri);
if(reloaded_row_cnt != 1) {
qfWarning() << "Edited row index:" << ri << "id:" << id.toString() << "reloaded in" << reloaded_row_cnt << "instances.";
}
updateRow(currentIndex().row());
}
else if(mode == ModeDelete) {
int reloaded_row_cnt = tmd->reloadRow(ri);
if(reloaded_row_cnt > 0) {
qfWarning() << "Deleted row id:" << id.toString() << "still exists.";
}
else {
tmd->qfm::TableModel::removeRowNoOverload(ri, !qf::core::Exception::Throw);
if(ri >= tmd->rowCount())
ri = tmd->rowCount() - 1;
QModelIndex ix = currentIndex();
if(ri >= 0) {
ix = tmd->index(ri, (ix.column() >= 0)? ix.column(): 0);
//qfInfo() << "ix row:" << ix.row() << "col:" << ix.column();
setCurrentIndex(ix);
}
}
}
}
// nor in table neither in database
}
}
else {
qfError() << "Feature not defined for this model type:" << model();
}
}
/*
qf::core::utils::Table::SortDef TableView::seekSortDefinition() const
{
qfLogFuncFrame();
qf::core::utils::Table::SortDef ret;
if(tableModel()) {
ret = tableModel()->table().tableProperties().sortDefinition().value(0);
}
return ret;
}
*/

int TableView::seekColumn() const
{
int ret = -1;
Expand Down Expand Up @@ -2249,7 +2207,7 @@ bool TableView::edit(const QModelIndex& index, EditTrigger trigger, QEvent* even
if(trigger == QTableView::DoubleClicked || trigger == QTableView::EditKeyPressed) {
if(!read_only) {
emit editCellRequest(index);
QVariant id = selectedRow().value(idColumnName());
QVariant id = selectedRow().value(tableModel()->idColumnName());
if(id.isValid()) {
emit editRowInExternalEditor(id, ModeEdit);
}
Expand Down
4 changes: 1 addition & 3 deletions libqf/libqfgui/src/tableview.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ class QFGUI_DECL_EXPORT TableView : public QTableView, public framework::IPersis
Q_PROPERTY(qf::gui::model::TableModel* model READ tableModel WRITE setTableModel)
Q_PROPERTY(RowEditorMode rowEditorMode READ rowEditorMode WRITE setRowEditorMode NOTIFY rowEditorModeChanged)
Q_PROPERTY(InlineEditSaveStrategy inlineEditSaveStrategy READ inlineEditSaveStrategy WRITE setInlineEditSaveStrategy NOTIFY inlineEditSaveStrategyChanged)
Q_PROPERTY(QString idColumnName READ idColumnName WRITE setIdColumnName)
Q_PROPERTY(bool showExceptionDialog READ isShowExceptionDialog WRITE setShowExceptionDialog NOTIFY showExceptionDialogChanged)
Q_PROPERTY(bool readOnly READ isReadOnly WRITE setReadOnly NOTIFY readOnlyChanged)
private:
Expand Down Expand Up @@ -61,7 +60,6 @@ class QFGUI_DECL_EXPORT TableView : public QTableView, public framework::IPersis

QF_PROPERTY_IMPL2(InlineEditSaveStrategy, i, I, nlineEditSaveStrategy, OnEditedValueCommit)
QF_PROPERTY_IMPL2(RowEditorMode, r, R, owEditorMode, EditRowsInline)
QF_PROPERTY_IMPL2(QString, i, I, dColumnName, QStringLiteral("id"))
QF_PROPERTY_BOOL_IMPL2(s, S, howExceptionDialog, true)
//QF_PROPERTY_BOOL_IMPL(r, R, eadOnly)

Expand Down Expand Up @@ -141,7 +139,7 @@ class QFGUI_DECL_EXPORT TableView : public QTableView, public framework::IPersis
Q_SIGNAL void editCellRequest(const QModelIndex &table_view_index);
Q_SIGNAL void editRowInExternalEditor(const QVariant &id, int mode);
Q_SIGNAL void editSelectedRowsInExternalEditor(int mode);
Q_SLOT virtual void rowExternallySaved(const QVariant &id, int mode);
Q_SLOT virtual void rowExternallySaved(const QVariant &id);

Q_SIGNAL void filterDialogRequest();
Q_SLOT void filterByString(const QString &s);
Expand Down
15 changes: 12 additions & 3 deletions libquickevent/libquickeventgui/src/og/sqltablemodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -84,15 +84,24 @@ QVariant SqlTableModel::editValueToRaw(int column_index, const QVariant &val) co
#endif
}
else if(type == qMetaTypeId<core::si::SiId>()) {
auto id = (int)val.value<core::si::SiId>();
if(id == 0)
int siid = 0;
if (val.userType() == qMetaTypeId<QString>()) {
siid = val.toString().toInt();
}
else if (val.userType() == qMetaTypeId<core::si::SiId>()) {
siid = (int)val.value<core::si::SiId>();
}
else {
siid = val.toInt();
}
if(siid == 0)
#if QT_VERSION_MAJOR >= 6
ret = QVariant(QMetaType(QMetaType::Int));
#else
ret = QVariant(QVariant::Int);
#endif
else
ret = id;
ret = siid;
}
//qfInfo() << val << ret;
return ret;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ void ClassesTableView::removeSelectedRows()
try {
qf::core::sql::Transaction transaction;
for(int i : selectedRowsIndexes()) {
int class_id = tableRow(i).value(idColumnName()).toInt();
int class_id = tableRow(i).value(tableModel()->idColumnName()).toInt();
getPlugin<ClassesPlugin>()->dropClass(class_id);
}
transaction.commit();
Expand Down
Loading