summaryrefslogtreecommitdiffstats
path: root/src/sql
diff options
context:
space:
mode:
authorMark Brand <mabrand@mabrand.nl>2012-03-13 01:28:35 +0100
committerQt by Nokia <qt-info@nokia.com>2012-03-15 15:35:32 +0100
commit108748404beb607538ea965a21fa932d275eecdd (patch)
treee2d8f5b11ea3b2897d0dd2f61fcfdcbff10d4bdc /src/sql
parent3d7cec6577fa32fb6036b346db57c53e38ea2ffd (diff)
QSqlTableModel::setData(): no longer autosubmit for OnRowChange
The model can never do a good job of knowing when user moves to a new row in the view. Faking it by detecting when another row is changed was not a good solution because it cannot detect when the last edited row is left. Either the view should automatically submit when the user leaves a row or the application should provide a way to submit. This change made it possible to reuse the logic of flags() in setData(). Change-Id: I2550e5b113bceba1a852fc21203babeca07c5748 Reviewed-by: Honglei Zhang <honglei.zhang@nokia.com>
Diffstat (limited to 'src/sql')
-rw-r--r--src/sql/models/qsqltablemodel.cpp60
1 files changed, 31 insertions, 29 deletions
diff --git a/src/sql/models/qsqltablemodel.cpp b/src/sql/models/qsqltablemodel.cpp
index 0eb5447600..153c2e80f9 100644
--- a/src/sql/models/qsqltablemodel.cpp
+++ b/src/sql/models/qsqltablemodel.cpp
@@ -516,14 +516,12 @@ bool QSqlTableModel::isDirty(const QModelIndex &index) const
For edit strategy OnFieldChange, an index may receive a change
only if no other index has a cached change. Changes are
submitted immediately. However, rows that have not yet been
- inserted in the database may be freely changed and and are not
- submitted automatically.
+ inserted in the database may be freely changed and are not
+ submitted automatically. Submitted changes are not reverted upon
+ failure.
- For OnRowChange, the first change to a row will cause cached
- operations on other rows to be submitted. If submitting fails,
- the new change is rejected.
-
- Submitted changes are not reverted upon failure.
+ For OnRowChange, an index may receive a change only if no other
+ row has a cached change. Changes are not submitted automatically.
Returns true if the value could be set or false on error, for
example if \a index is out of bounds.
@@ -542,21 +540,9 @@ bool QSqlTableModel::setData(const QModelIndex &index, const QVariant &value, in
if (!index.isValid() || index.column() >= d->rec.count() || index.row() >= rowCount())
return false;
- if (d->cache.value(index.row()).op() == QSqlTableModelPrivate::Delete)
+ if (!(flags(index) & Qt::ItemIsEditable))
return false;
- if (d->strategy == OnFieldChange) {
- if (d->cache.value(index.row()).op() != QSqlTableModelPrivate::Insert
- && !isDirty(index) && isDirty())
- return false;
- }
- else if (d->strategy == OnRowChange) {
- if (d->cache.value(index.row()).submitted()) {
- if (!submit())
- return false;
- }
- }
-
QSqlTableModelPrivate::ModifiedRow &row = d->cache[index.row()];
if (row.op() == QSqlTableModelPrivate::None)
@@ -1249,16 +1235,32 @@ Qt::ItemFlags QSqlTableModel::flags(const QModelIndex &index) const
if (index.internalPointer() || index.column() < 0 || index.column() >= d->rec.count()
|| index.row() < 0)
return 0;
- if (d->rec.field(index.column()).isReadOnly())
- return Qt::ItemIsSelectable | Qt::ItemIsEnabled;
- if (d->cache.value(index.row()).op() == QSqlTableModelPrivate::Delete)
- return Qt::ItemIsSelectable | Qt::ItemIsEnabled;
- if (d->strategy == OnFieldChange
- && d->cache.value(index.row()).op() != QSqlTableModelPrivate::Insert
- && !isDirty(index) && isDirty())
- return Qt::ItemIsSelectable | Qt::ItemIsEnabled;
- return Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable;
+ bool editable = true;
+
+ if (d->rec.field(index.column()).isReadOnly()) {
+ editable = false;
+ }
+ else {
+ const QSqlTableModelPrivate::ModifiedRow mrow = d->cache.value(index.row());
+ if (mrow.op() == QSqlTableModelPrivate::Delete) {
+ editable = false;
+ }
+ else if (d->strategy == OnFieldChange) {
+ if (mrow.op() != QSqlTableModelPrivate::Insert)
+ if (!isDirty(index) && isDirty())
+ editable = false;
+ }
+ else if (d->strategy == OnRowChange) {
+ if (mrow.submitted() && isDirty())
+ editable = false;
+ }
+ }
+
+ if (!editable)
+ return Qt::ItemIsSelectable | Qt::ItemIsEnabled;
+ else
+ return Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable;
}
/*!