Drag and Drop within a GridView: Difference between revisions

From Qt Wiki
Jump to navigation Jump to search
(Decode HTML entity names)
(Decode HTML entity numbers)
Line 13: Line 13:
  '''WidgetModel.qml'''<br /><code>import QtQuick 1.0<br />ListModel {<br /> ListElement { icon: "Images/widget1.png"; gridId: 0}<br /> ListElement { icon: "Images/widget2.png"; gridId: 1}<br /> ListElement { icon: "Images/widget3.png"; gridId: 2}<br /> ListElement { icon: "Images/widget4.png"; gridId: 3}<br /> ListElement { icon: "Images/widget5.png"; gridId: 4}<br /> ListElement { icon: "Images/widget6.png"; gridId: 5}<br /> ListElement { icon: "Images/widget7.png"; gridId: 6}<br /> ListElement { icon: "Images/widget8.png"; gridId: 7}<br /> ListElement { icon: "Images/widget9.png"; gridId: 8}<br />}</code>
  '''WidgetModel.qml'''<br /><code>import QtQuick 1.0<br />ListModel {<br /> ListElement { icon: "Images/widget1.png"; gridId: 0}<br /> ListElement { icon: "Images/widget2.png"; gridId: 1}<br /> ListElement { icon: "Images/widget3.png"; gridId: 2}<br /> ListElement { icon: "Images/widget4.png"; gridId: 3}<br /> ListElement { icon: "Images/widget5.png"; gridId: 4}<br /> ListElement { icon: "Images/widget6.png"; gridId: 5}<br /> ListElement { icon: "Images/widget7.png"; gridId: 6}<br /> ListElement { icon: "Images/widget8.png"; gridId: 7}<br /> ListElement { icon: "Images/widget9.png"; gridId: 8}<br />}</code>


  '''IconItem.qml'''<br /><code>import QtQuick 1.0<br />Component {<br /> Item {<br />  id: main<br />  width: grid.cellWidth; height: grid.cellHeight<br />  Image {<br />  id: item; parent: loc<br /> x: main.x + 5; y: main.y + 5<br /> width: main.width - 10; height: main.height - 10;<br /> fillMode: Image.PreserveAspectFit; smooth: true<br /> source: icon<br /> Rectangle {<br /> anchors.fill: parent;<br /> border.color: "#326487"; border.width: 6<br /> color: "transparent"; radius: 5<br /> visible: item.state  "active"&#125;<br />Behavior on x &#123; enabled: item.state != "active"; NumberAnimation &#123; duration: 400; easing.type: Easing.OutBack &#125;<br /> &#125;<br />Behavior on y &#123; enabled: item.state != "active"; NumberAnimation &#123; duration: 400; easing.type: Easing.OutBack &#125;<br /> &#125;<br />SequentialAnimation on rotation &#123;NumberAnimation &#123; to:  2; duration: 60 &#125;<br />NumberAnimation &#123; to: -2; duration: 120 &#125;<br />NumberAnimation &#123; to:  0; duration: 60 &#125;<br />running: loc.currentId != -1 && item.state != "active"loops: Animation.Infinite; alwaysRunToEnd: true&#125;<br />states: State &#123;name: "active"; when: loc.currentId  gridId<br /> PropertyChanges { target: item; x: loc.mouseX - width/2; y: loc.mouseY - height/2; scale: 0.5; z: 10 }<br /> }<br /> transitions: Transition { NumberAnimation { property: "scale"; duration: 200} }<br /> }<br /> }<br />}</code>
  '''IconItem.qml'''<br /><code>import QtQuick 1.0<br />Component {<br /> Item {<br />  id: main<br />  width: grid.cellWidth; height: grid.cellHeight<br />  Image {<br />  id: item; parent: loc<br /> x: main.x + 5; y: main.y + 5<br /> width: main.width - 10; height: main.height - 10;<br /> fillMode: Image.PreserveAspectFit; smooth: true<br /> source: icon<br /> Rectangle {<br /> anchors.fill: parent;<br /> border.color: "#326487"; border.width: 6<br /> color: "transparent"; radius: 5<br /> visible: item.state  "active"}<br />Behavior on x { enabled: item.state != "active"; NumberAnimation { duration: 400; easing.type: Easing.OutBack }<br /> }<br />Behavior on y { enabled: item.state != "active"; NumberAnimation { duration: 400; easing.type: Easing.OutBack }<br /> }<br />SequentialAnimation on rotation {NumberAnimation { to:  2; duration: 60 }<br />NumberAnimation { to: -2; duration: 120 }<br />NumberAnimation { to:  0; duration: 60 }<br />running: loc.currentId != -1 && item.state != "active"loops: Animation.Infinite; alwaysRunToEnd: true}<br />states: State {name: "active"; when: loc.currentId  gridId<br /> PropertyChanges { target: item; x: loc.mouseX - width/2; y: loc.mouseY - height/2; scale: 0.5; z: 10 }<br /> }<br /> transitions: Transition { NumberAnimation { property: "scale"; duration: 200} }<br /> }<br /> }<br />}</code>


  '''Main.qml'''<br /><code>import QtQuick 1.0<br />Rectangle {<br /> width: 640; height: 480<br /> color: "#222222"<br /> GridView {<br />  id: grid<br />  interactive: false<br />  anchors {<br />  topMargin: 60; bottomMargin: 60<br />  leftMargin: 140; rightMargin: 140<br />  fill: parent<br /> }<br /> cellWidth: 120; cellHeight: 120;<br /> model: WidgetModel { id: icons }<br /> delegate: IconItem { }<br /> MouseArea {<br /> property int currentId: –1 // Original position in model<br /> property int newIndex // Current Position in model<br /> property int index: grid.indexAt(mouseX, mouseY) // Item underneath cursor<br /> id: loc<br /> anchors.fill: parent<br /> onPressAndHold: currentId = icons.get(newIndex = index).gridId<br /> onReleased: currentId = –1<br /> onMousePositionChanged:<br /> if (loc.currentId [[Image:= -1 && index |= -1 && index ]]= –1 && index != newIndex)<br /> icons.move(newIndex, newIndex = index, 1)<br /> }<br /> }<br />}</code>
  '''Main.qml'''<br /><code>import QtQuick 1.0<br />Rectangle {<br /> width: 640; height: 480<br /> color: "#222222"<br /> GridView {<br />  id: grid<br />  interactive: false<br />  anchors {<br />  topMargin: 60; bottomMargin: 60<br />  leftMargin: 140; rightMargin: 140<br />  fill: parent<br /> }<br /> cellWidth: 120; cellHeight: 120;<br /> model: WidgetModel { id: icons }<br /> delegate: IconItem { }<br /> MouseArea {<br /> property int currentId: –1 // Original position in model<br /> property int newIndex // Current Position in model<br /> property int index: grid.indexAt(mouseX, mouseY) // Item underneath cursor<br /> id: loc<br /> anchors.fill: parent<br /> onPressAndHold: currentId = icons.get(newIndex = index).gridId<br /> onReleased: currentId = –1<br /> onMousePositionChanged:<br /> if (loc.currentId [[Image:= -1 && index |= -1 && index ]]= –1 && index != newIndex)<br /> icons.move(newIndex, newIndex = index, 1)<br /> }<br /> }<br />}</code>

Revision as of 15:46, 13 March 2015

This article may require cleanup to meet the Qt Wiki's quality standards. Reason: Auto-imported from ExpressionEngine.
Please improve this article if you can. Remove the {{cleanup}} tag and add this page to Updated pages list after it's clean.





English | 日本語 | Български

This wiki entry is created in response to a few forum threads (links at bottom) asking for this method. Feel free to contribute to this article with explanations or code.

Drag and Drop within a GridView

This example will demonstrate the iOS style ("video here":http://www.youtube.com/watch?v=qnXoGnUU6uI ) of dragging and dropping ListModel elements within a GridView.

There are three files in this example. One for the model (WidgetModel.qml), one for the delegate (IconItem.qml) and one for the GridView (Main.qml).

WidgetModel.qml

import QtQuick 1.0<br />ListModel {<br /> ListElement { icon: "Images/widget1.png"; gridId: 0}<br /> ListElement { icon: "Images/widget2.png"; gridId: 1}<br /> ListElement { icon: "Images/widget3.png"; gridId: 2}<br /> ListElement { icon: "Images/widget4.png"; gridId: 3}<br /> ListElement { icon: "Images/widget5.png"; gridId: 4}<br /> ListElement { icon: "Images/widget6.png"; gridId: 5}<br /> ListElement { icon: "Images/widget7.png"; gridId: 6}<br /> ListElement { icon: "Images/widget8.png"; gridId: 7}<br /> ListElement { icon: "Images/widget9.png"; gridId: 8}<br />}

IconItem.qml

import QtQuick 1.0<br />Component {<br /> Item {<br />  id: main<br />  width: grid.cellWidth; height: grid.cellHeight<br />  Image {<br />   id: item; parent: loc<br /> x: main.x + 5; y: main.y + 5<br /> width: main.width - 10; height: main.height - 10;<br /> fillMode: Image.PreserveAspectFit; smooth: true<br /> source: icon<br /> Rectangle {<br /> anchors.fill: parent;<br /> border.color: "#326487"; border.width: 6<br /> color: "transparent"; radius: 5<br /> visible: item.state  "active"}<br />Behavior on x { enabled: item.state != "active"; NumberAnimation { duration: 400; easing.type: Easing.OutBack }<br /> }<br />Behavior on y { enabled: item.state != "active"; NumberAnimation { duration: 400; easing.type: Easing.OutBack }<br /> }<br />SequentialAnimation on rotation {NumberAnimation { to:  2; duration: 60 }<br />NumberAnimation { to: -2; duration: 120 }<br />NumberAnimation { to:  0; duration: 60 }<br />running: loc.currentId != -1 && item.state != "active"loops: Animation.Infinite; alwaysRunToEnd: true}<br />states: State {name: "active"; when: loc.currentId  gridId<br /> PropertyChanges { target: item; x: loc.mouseX - width/2; y: loc.mouseY - height/2; scale: 0.5; z: 10 }<br /> }<br /> transitions: Transition { NumberAnimation { property: "scale"; duration: 200} }<br /> }<br /> }<br />}

Main.qml

import QtQuick 1.0<br />Rectangle {<br /> width: 640; height: 480<br /> color: "#222222"<br /> GridView {<br />  id: grid<br />  interactive: false<br />  anchors {<br />  topMargin: 60; bottomMargin: 60<br />  leftMargin: 140; rightMargin: 140<br />  fill: parent<br /> }<br /> cellWidth: 120; cellHeight: 120;<br /> model: WidgetModel { id: icons }<br /> delegate: IconItem { }<br /> MouseArea {<br /> property int currentId: 1 // Original position in model<br /> property int newIndex // Current Position in model<br /> property int index: grid.indexAt(mouseX, mouseY) // Item underneath cursor<br /> id: loc<br /> anchors.fill: parent<br /> onPressAndHold: currentId = icons.get(newIndex = index).gridId<br /> onReleased: currentId = –1<br /> onMousePositionChanged:<br /> if (loc.currentId [[Image:= -1 && index |= -1 && index ]]= –1 && index != newIndex)<br /> icons.move(newIndex, newIndex = index, 1)<br /> }<br /> }<br />}

Video
[YouTubeID:4tt5hQYS4Fo]

Relevant forum threads:
"iOS Style Rearrange of Icons":http://developer.qt.nokia.com/forums/viewthread/2327/