summaryrefslogtreecommitdiff
path: root/src/controls/Private
diff options
context:
space:
mode:
Diffstat (limited to 'src/controls/Private')
-rw-r--r--src/controls/Private/ScrollViewHelper.qml10
-rw-r--r--src/controls/Private/TreeViewItemDelegateLoader.qml2
-rw-r--r--src/controls/Private/qquickrangemodel.cpp33
-rw-r--r--src/controls/Private/qquickrangemodel_p.h7
-rw-r--r--src/controls/Private/qquickrangemodel_p_p.h3
-rw-r--r--src/controls/Private/qquickstyleitem.cpp2
-rw-r--r--src/controls/Private/qquicktreemodeladaptor.cpp51
-rw-r--r--src/controls/Private/qquicktreemodeladaptor_p.h5
8 files changed, 100 insertions, 13 deletions
diff --git a/src/controls/Private/ScrollViewHelper.qml b/src/controls/Private/ScrollViewHelper.qml
index 066bc6cd..810de91d 100644
--- a/src/controls/Private/ScrollViewHelper.qml
+++ b/src/controls/Private/ScrollViewHelper.qml
@@ -134,6 +134,11 @@ Item {
anchors.right: cornerFill.left
anchors.leftMargin: leftMargin
anchors.bottomMargin: bottomMargin
+ onScrollAmountChanged: {
+ if (flickableItem && (flickableItem.atXBeginning || flickableItem.atXEnd)) {
+ value = flickableItem.contentX - flickableItem.originX
+ }
+ }
onValueChanged: {
if (!blockUpdates) {
flickableItem.contentX = value + flickableItem.originX
@@ -183,6 +188,11 @@ Item {
anchors.top: parent.top
anchors.topMargin: __scrollBarTopMargin + topMargin
anchors.rightMargin: rightMargin
+ onScrollAmountChanged: {
+ if (flickableItem && (flickableItem.atYBeginning || flickableItem.atYEnd)) {
+ value = flickableItem.contentY - flickableItem.originY
+ }
+ }
onValueChanged: {
if (flickableItem && !blockUpdates && enabled) {
flickableItem.contentY = value + flickableItem.originY
diff --git a/src/controls/Private/TreeViewItemDelegateLoader.qml b/src/controls/Private/TreeViewItemDelegateLoader.qml
index 4f8b26f6..e19215ed 100644
--- a/src/controls/Private/TreeViewItemDelegateLoader.qml
+++ b/src/controls/Private/TreeViewItemDelegateLoader.qml
@@ -81,7 +81,7 @@ TableViewItemDelegateLoader {
readonly property color textColor: __rowItem ? __rowItem.itemTextColor : "black"
readonly property string role: __column ? __column.role : ""
readonly property var value: model && model.hasOwnProperty(role) ? model[role] : ""
- readonly property var index: __treeModel.mapRowToModelIndex(row)
+ readonly property var index: model ? model["_q_TreeView_ModelIndex"] : __treeModel.index(-1,-1,null)
readonly property int depth: model && column === 0 ? model["_q_TreeView_ItemDepth"] : 0
readonly property bool hasChildren: model ? model["_q_TreeView_HasChildren"] : false
readonly property bool hasSibling: model ? model["_q_TreeView_HasSibling"] : false
diff --git a/src/controls/Private/qquickrangemodel.cpp b/src/controls/Private/qquickrangemodel.cpp
index d881e3c8..ca393c83 100644
--- a/src/controls/Private/qquickrangemodel.cpp
+++ b/src/controls/Private/qquickrangemodel.cpp
@@ -72,6 +72,9 @@ void QQuickRangeModel1Private::init()
posatmin = 0;
posatmax = 0;
inverted = false;
+ isComplete = false;
+ positionChanged = false;
+ valueChanged = false;
}
/*!
@@ -158,10 +161,16 @@ void QQuickRangeModel1Private::emitValueAndPositionIfChanged(const qreal oldValu
// unchanged. This will be the case when operating with values outside range:
const qreal newValue = q->value();
const qreal newPosition = q->position();
- if (!qFuzzyCompare(newValue, oldValue))
- emit q->valueChanged(newValue);
- if (!qFuzzyCompare(newPosition, oldPosition))
- emit q->positionChanged(newPosition);
+
+ if (isComplete) {
+ if (!qFuzzyCompare(newValue, oldValue))
+ emit q->valueChanged(newValue);
+ if (!qFuzzyCompare(newPosition, oldPosition))
+ emit q->positionChanged(newPosition);
+ } else {
+ positionChanged |= qFuzzyCompare(oldPosition, newPosition);
+ valueChanged |= !qFuzzyCompare(oldValue, newValue);
+ }
}
/*!
@@ -349,6 +358,22 @@ qreal QQuickRangeModel1::positionForValue(qreal value) const
return d->publicPosition(unconstrainedPosition);
}
+void QQuickRangeModel1::classBegin()
+{
+}
+
+void QQuickRangeModel1::componentComplete()
+{
+ Q_D(QQuickRangeModel1);
+ d->isComplete = true;
+ emit minimumChanged(minimum());
+ emit maximumChanged(maximum());
+ if (d->valueChanged)
+ emit valueChanged(value());
+ if (d->positionChanged)
+ emit positionChanged(position());
+}
+
/*!
\property QQuickRangeModel1::position
\brief the current position of the model
diff --git a/src/controls/Private/qquickrangemodel_p.h b/src/controls/Private/qquickrangemodel_p.h
index 0c93bed3..e5796725 100644
--- a/src/controls/Private/qquickrangemodel_p.h
+++ b/src/controls/Private/qquickrangemodel_p.h
@@ -47,7 +47,7 @@ QT_BEGIN_NAMESPACE
class QQuickRangeModel1Private;
-class QQuickRangeModel1 : public QObject
+class QQuickRangeModel1 : public QObject, public QQmlParserStatus
{
Q_OBJECT
Q_PROPERTY(qreal value READ value WRITE setValue NOTIFY valueChanged USER true)
@@ -59,6 +59,8 @@ class QQuickRangeModel1 : public QObject
Q_PROPERTY(qreal positionAtMaximum READ positionAtMaximum WRITE setPositionAtMaximum NOTIFY positionAtMaximumChanged)
Q_PROPERTY(bool inverted READ inverted WRITE setInverted NOTIFY invertedChanged)
+ Q_INTERFACES(QQmlParserStatus)
+
public:
QQuickRangeModel1(QObject *parent = 0);
virtual ~QQuickRangeModel1();
@@ -90,6 +92,9 @@ public:
Q_INVOKABLE qreal valueForPosition(qreal position) const;
Q_INVOKABLE qreal positionForValue(qreal value) const;
+ void classBegin();
+ void componentComplete();
+
public Q_SLOTS:
void toMinimum();
void toMaximum();
diff --git a/src/controls/Private/qquickrangemodel_p_p.h b/src/controls/Private/qquickrangemodel_p_p.h
index 5c56814e..ab0627d3 100644
--- a/src/controls/Private/qquickrangemodel_p_p.h
+++ b/src/controls/Private/qquickrangemodel_p_p.h
@@ -70,6 +70,9 @@ public:
uint inverted : 1;
QQuickRangeModel1 *q_ptr;
+ bool isComplete;
+ bool positionChanged;
+ bool valueChanged;
inline qreal effectivePosAtMin() const {
return inverted ? posatmax : posatmin;
diff --git a/src/controls/Private/qquickstyleitem.cpp b/src/controls/Private/qquickstyleitem.cpp
index 3fe68230..1d79d634 100644
--- a/src/controls/Private/qquickstyleitem.cpp
+++ b/src/controls/Private/qquickstyleitem.cpp
@@ -70,7 +70,7 @@ static inline HIRect qt_hirectForQRect(const QRect &convertRect, const QRect &re
returned if it can't be obtained. It is the caller's responsibility to
CGContextRelease the context when finished using it.
- \warning This function is only available on Mac OS X.
+ \warning This function is only available on \macos.
\warning This function is duplicated in qmacstyle_mac.mm
*/
CGContextRef qt_mac_cg_context(const QPaintDevice *pdev)
diff --git a/src/controls/Private/qquicktreemodeladaptor.cpp b/src/controls/Private/qquicktreemodeladaptor.cpp
index 9c0dd71c..26db62a3 100644
--- a/src/controls/Private/qquicktreemodeladaptor.cpp
+++ b/src/controls/Private/qquicktreemodeladaptor.cpp
@@ -156,6 +156,7 @@ QHash<int, QByteArray> QQuickTreeModelAdaptor1::roleNames() const
modelRoleNames.insert(ExpandedRole, "_q_TreeView_ItemExpanded");
modelRoleNames.insert(HasChildrenRole, "_q_TreeView_HasChildren");
modelRoleNames.insert(HasSiblingRole, "_q_TreeView_HasSibling");
+ modelRoleNames.insert(ModelIndexRole, "_q_TreeView_ModelIndex");
return modelRoleNames;
}
@@ -180,6 +181,8 @@ QVariant QQuickTreeModelAdaptor1::data(const QModelIndex &index, int role) const
return !(modelIndex.flags() & Qt::ItemNeverHasChildren) && m_model->hasChildren(modelIndex);
case HasSiblingRole:
return modelIndex.row() != m_model->rowCount(modelIndex.parent()) - 1;
+ case ModelIndexRole:
+ return modelIndex;
default:
return m_model->data(modelIndex, role);
}
@@ -195,6 +198,7 @@ bool QQuickTreeModelAdaptor1::setData(const QModelIndex &index, const QVariant &
case ExpandedRole:
case HasChildrenRole:
case HasSiblingRole:
+ case ModelIndexRole:
return false;
default: {
const QModelIndex &pmi = mapToModel(index);
@@ -719,8 +723,11 @@ void QQuickTreeModelAdaptor1::modelRowsAboutToBeMoved(const QModelIndex & source
destIndex = itemIndex(m_model->index(destinationRow, 0, destinationParent));
}
- beginMoveRows(QModelIndex(), startIndex, endIndex, QModelIndex(), destIndex);
int totalMovedCount = endIndex - startIndex + 1;
+
+ const bool visibleRowsMoved = startIndex != destIndex &&
+ beginMoveRows(QModelIndex(), startIndex, endIndex, QModelIndex(), destIndex);
+
const QList<TreeItem> &buffer = m_items.mid(startIndex, totalMovedCount);
int bufferCopyOffset;
if (destIndex > endIndex) {
@@ -729,6 +736,7 @@ void QQuickTreeModelAdaptor1::modelRowsAboutToBeMoved(const QModelIndex & source
}
bufferCopyOffset = destIndex - totalMovedCount;
} else {
+ // NOTE: we will not enter this loop if startIndex == destIndex
for (int i = startIndex - 1; i >= destIndex; i--) {
m_items.swap(i, i + totalMovedCount); // Fast move from 1st to 2nd position
}
@@ -739,14 +747,49 @@ void QQuickTreeModelAdaptor1::modelRowsAboutToBeMoved(const QModelIndex & source
item.depth += depthDifference;
m_items.replace(bufferCopyOffset + i, item);
}
- endMoveRows();
+
+ if (visibleRowsMoved)
+ endMoveRows();
+
+ if (depthDifference != 0) {
+ const QModelIndex &topLeft = index(bufferCopyOffset, 0, QModelIndex());
+ const QModelIndex &bottomRight = index(bufferCopyOffset + totalMovedCount - 1, 0, QModelIndex());
+ const QVector<int> changedRole(1, DepthRole);
+ emit dataChanged(topLeft, bottomRight, changedRole);
+ }
}
}
void QQuickTreeModelAdaptor1::modelRowsMoved(const QModelIndex & sourceParent, int sourceStart, int sourceEnd, const QModelIndex & destinationParent, int destinationRow)
{
- if (!childrenVisible(sourceParent) && childrenVisible(destinationParent))
- modelRowsInserted(destinationParent, destinationRow, destinationRow + sourceEnd - sourceStart);
+ if (childrenVisible(destinationParent)) {
+ if (!childrenVisible(sourceParent))
+ modelRowsInserted(destinationParent, destinationRow, destinationRow + sourceEnd - sourceStart);
+ else {
+ int destIndex = -1;
+ if (destinationRow == m_model->rowCount(destinationParent)) {
+ const QModelIndex &emi = m_model->index(destinationRow - 1, 0, destinationParent);
+ destIndex = lastChildIndex(emi) + 1;
+ } else {
+ destIndex = itemIndex(m_model->index(destinationRow, 0, destinationParent));
+ }
+
+ const QModelIndex &emi = m_model->index(destinationRow + sourceEnd - sourceStart, 0, destinationParent);
+ int endIndex = -1;
+ if (isExpanded(emi)) {
+ int rowCount = m_model->rowCount(emi);
+ if (rowCount > 0)
+ endIndex = lastChildIndex(m_model->index(rowCount - 1, 0, emi));
+ }
+ if (endIndex == -1)
+ endIndex = itemIndex(emi);
+
+ const QModelIndex &topLeft = index(destIndex, 0, QModelIndex());
+ const QModelIndex &bottomRight = index(endIndex, 0, QModelIndex());
+ const QVector<int> changedRole(1, ModelIndexRole);
+ emit dataChanged(topLeft, bottomRight, changedRole);
+ }
+ }
ASSERT_CONSISTENCY();
}
diff --git a/src/controls/Private/qquicktreemodeladaptor_p.h b/src/controls/Private/qquicktreemodeladaptor_p.h
index ddad96cb..e7192314 100644
--- a/src/controls/Private/qquicktreemodeladaptor_p.h
+++ b/src/controls/Private/qquicktreemodeladaptor_p.h
@@ -77,10 +77,11 @@ public:
void resetRootIndex();
enum {
- DepthRole = Qt::UserRole - 4,
+ DepthRole = Qt::UserRole - 5,
ExpandedRole,
HasChildrenRole,
- HasSiblingRole
+ HasSiblingRole,
+ ModelIndexRole
};
QHash<int, QByteArray> roleNames() const;