2010-02-16 19:07:59 +02:00
|
|
|
/**************************************************************************
|
|
|
|
|
**
|
|
|
|
|
** This file is part of Qt Creator
|
|
|
|
|
**
|
2010-03-05 11:25:49 +01:00
|
|
|
** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
|
2010-02-16 19:07:59 +02:00
|
|
|
**
|
|
|
|
|
** Contact: Nokia Corporation (qt-info@nokia.com)
|
|
|
|
|
**
|
|
|
|
|
** Commercial Usage
|
|
|
|
|
**
|
|
|
|
|
** Licensees holding valid Qt Commercial licenses may use this file in
|
|
|
|
|
** accordance with the Qt Commercial License Agreement provided with the
|
|
|
|
|
** Software or, alternatively, in accordance with the terms contained in
|
|
|
|
|
** a written agreement between you and Nokia.
|
|
|
|
|
**
|
|
|
|
|
** GNU Lesser General Public License Usage
|
|
|
|
|
**
|
|
|
|
|
** Alternatively, this file may be used under the terms of the GNU Lesser
|
|
|
|
|
** General Public License version 2.1 as published by the Free Software
|
|
|
|
|
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
|
|
|
** packaging of this file. Please review the following information to
|
|
|
|
|
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
|
|
|
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
|
|
|
**
|
|
|
|
|
** If you are unsure which license is appropriate for your use, please
|
|
|
|
|
** contact the sales department at http://qt.nokia.com/contact.
|
|
|
|
|
**
|
|
|
|
|
**************************************************************************/
|
|
|
|
|
|
2010-02-16 17:24:18 +02:00
|
|
|
import Qt 4.6
|
|
|
|
|
|
2010-03-10 12:45:49 +02:00
|
|
|
/* The view displaying the item grid.
|
|
|
|
|
|
|
|
|
|
The following Qml context properties have to be set:
|
|
|
|
|
- listmodel itemLibraryModel
|
|
|
|
|
- int itemLibraryIconWidth
|
|
|
|
|
- int itemLibraryIconHeight
|
|
|
|
|
|
|
|
|
|
itemLibraryModel has to have the following structure:
|
|
|
|
|
|
|
|
|
|
ListModel {
|
|
|
|
|
ListElement {
|
|
|
|
|
int sectionLibId
|
|
|
|
|
string sectionName
|
|
|
|
|
list sectionEntries: [
|
|
|
|
|
ListElement {
|
|
|
|
|
int itemLibId
|
|
|
|
|
string itemName
|
|
|
|
|
pixmap itemPixmap
|
|
|
|
|
},
|
|
|
|
|
...
|
|
|
|
|
]
|
|
|
|
|
}
|
|
|
|
|
...
|
|
|
|
|
}
|
|
|
|
|
*/
|
|
|
|
|
|
2010-02-16 17:24:18 +02:00
|
|
|
Rectangle {
|
|
|
|
|
id: itemsView
|
|
|
|
|
|
2010-02-25 09:45:00 +02:00
|
|
|
// public
|
2010-03-10 12:45:49 +02:00
|
|
|
|
|
|
|
|
function resetView() {
|
|
|
|
|
expandAllEntries()
|
|
|
|
|
scrollbar.reset()
|
2010-02-16 17:24:18 +02:00
|
|
|
}
|
|
|
|
|
|
2010-02-25 09:45:00 +02:00
|
|
|
signal itemSelected(int itemLibId)
|
|
|
|
|
signal itemDragged(int itemLibId)
|
|
|
|
|
|
|
|
|
|
signal stopDragAndDrop
|
|
|
|
|
|
|
|
|
|
// internal
|
2010-03-10 12:45:49 +02:00
|
|
|
|
2010-02-25 09:45:00 +02:00
|
|
|
signal expandAllEntries
|
|
|
|
|
|
|
|
|
|
ItemsViewStyle { id: style }
|
2010-02-16 17:24:18 +02:00
|
|
|
|
|
|
|
|
color: style.backgroundColor
|
|
|
|
|
|
|
|
|
|
/* workaround: without this, a completed drag and drop operation would
|
|
|
|
|
result in the drag being continued when QmlView re-gains
|
|
|
|
|
focus */
|
2010-03-05 10:19:38 +01:00
|
|
|
MouseArea {
|
2010-02-16 17:24:18 +02:00
|
|
|
anchors.fill: parent
|
|
|
|
|
hoverEnabled: true
|
2010-03-10 12:45:49 +02:00
|
|
|
onEntered: {
|
|
|
|
|
if (!pressed)
|
|
|
|
|
stopDragAndDrop()
|
|
|
|
|
}
|
2010-02-16 17:24:18 +02:00
|
|
|
}
|
|
|
|
|
|
2010-03-10 12:45:49 +02:00
|
|
|
signal selectionUpdated(int itemSectionIndex)
|
|
|
|
|
|
|
|
|
|
property int selectedItemLibId: -1
|
|
|
|
|
property int selectionSectionLibId: -1
|
|
|
|
|
|
|
|
|
|
function setSelection(itemLibId) {
|
|
|
|
|
selectedItemLibId = itemLibId
|
|
|
|
|
selectionSectionLibId = itemLibraryModel.getSectionLibId(itemLibId)
|
|
|
|
|
selectionUpdated(itemLibraryModel.getItemSectionIndex(itemLibId))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function unsetSelection() {
|
|
|
|
|
selectedItemLibId = -1
|
|
|
|
|
selectionSectionLibId = -1
|
|
|
|
|
selectionUpdated(-1)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Connections {
|
|
|
|
|
target: itemLibraryModel
|
|
|
|
|
onVisibilityChanged: {
|
|
|
|
|
if (itemLibraryModel.isItemVisible(selectedItemLibId))
|
|
|
|
|
setSelection(selectedItemLibId)
|
|
|
|
|
else
|
|
|
|
|
unsetSelection()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* the following 3 properties are calculated here for performance
|
|
|
|
|
reasons and then passed to the section views */
|
|
|
|
|
property int entriesPerRow: Math.max(1, Math.floor((itemsFlickable.width - 2) / style.cellWidth))
|
|
|
|
|
property int cellWidth: Math.floor((itemsFlickable.width - 2) / entriesPerRow)
|
|
|
|
|
property int cellHeight: style.cellHeight
|
|
|
|
|
|
2010-02-16 17:24:18 +02:00
|
|
|
Component {
|
|
|
|
|
id: sectionDelegate
|
|
|
|
|
|
|
|
|
|
SectionView {
|
|
|
|
|
id: section
|
|
|
|
|
|
|
|
|
|
entriesPerRow: itemsView.entriesPerRow
|
|
|
|
|
cellWidth: itemsView.cellWidth
|
|
|
|
|
cellHeight: itemsView.cellHeight
|
|
|
|
|
|
|
|
|
|
width: itemsFlickable.width
|
|
|
|
|
itemHighlight: selector
|
|
|
|
|
|
2010-03-10 12:45:49 +02:00
|
|
|
property bool containsSelection: (selectionSectionLibId == sectionLibId)
|
|
|
|
|
|
|
|
|
|
onItemSelected: {
|
|
|
|
|
itemsView.setSelection(itemLibId)
|
|
|
|
|
itemsView.itemSelected(itemLibId)
|
|
|
|
|
}
|
|
|
|
|
onItemDragged: {
|
|
|
|
|
section.itemSelected(itemLibId)
|
|
|
|
|
itemsView.itemDragged(itemLibId)
|
|
|
|
|
}
|
2010-02-16 17:24:18 +02:00
|
|
|
|
2010-03-01 11:37:21 +01:00
|
|
|
Connections {
|
|
|
|
|
target: itemsView
|
2010-03-10 12:45:49 +02:00
|
|
|
onExpandAllEntries: section.expand()
|
|
|
|
|
onSelectionUpdated: {
|
|
|
|
|
if (containsSelection) {
|
|
|
|
|
section.setSelection(itemSectionIndex)
|
|
|
|
|
section.focusSelection(itemsFlickable)
|
|
|
|
|
} else
|
|
|
|
|
section.unsetSelection()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Component {
|
|
|
|
|
id: selector
|
|
|
|
|
|
|
|
|
|
Selector {
|
|
|
|
|
x: containsSelection? section.currentItem.x:0
|
|
|
|
|
y: containsSelection? section.currentItem.y:0
|
|
|
|
|
width: itemsView.cellWidth
|
|
|
|
|
height: itemsView.cellHeight
|
|
|
|
|
|
|
|
|
|
visible: containsSelection
|
|
|
|
|
}
|
|
|
|
|
}
|
2010-02-16 17:24:18 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Flickable {
|
|
|
|
|
id: itemsFlickable
|
|
|
|
|
|
|
|
|
|
anchors.top: parent.top
|
2010-03-10 12:45:49 +02:00
|
|
|
anchors.topMargin: 3
|
2010-02-16 17:24:18 +02:00
|
|
|
anchors.bottom: parent.bottom
|
|
|
|
|
anchors.left: parent.left
|
|
|
|
|
anchors.right: scrollbar.left
|
2010-03-10 12:45:49 +02:00
|
|
|
overShoot: false
|
2010-02-16 17:24:18 +02:00
|
|
|
|
|
|
|
|
interactive: false
|
2010-03-01 11:37:21 +01:00
|
|
|
contentHeight: col.height
|
2010-02-16 17:24:18 +02:00
|
|
|
|
2010-03-10 12:45:49 +02:00
|
|
|
/* Limit the content position. Without this, resizing would get the
|
|
|
|
|
content position out of scope regarding the scrollbar. */
|
|
|
|
|
function limitContentPos() {
|
|
|
|
|
if (contentY < 0)
|
|
|
|
|
contentY = 0;
|
|
|
|
|
else {
|
|
|
|
|
var maxContentY = Math.max(0, contentHeight - height)
|
|
|
|
|
if (contentY > maxContentY)
|
|
|
|
|
contentY = maxContentY;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
onHeightChanged: limitContentPos()
|
|
|
|
|
onContentHeightChanged: limitContentPos()
|
|
|
|
|
|
2010-02-16 17:24:18 +02:00
|
|
|
Column {
|
|
|
|
|
id: col
|
|
|
|
|
|
|
|
|
|
Repeater {
|
2010-03-10 12:45:49 +02:00
|
|
|
model: itemLibraryModel // to be set in Qml context
|
2010-02-16 17:24:18 +02:00
|
|
|
delegate: sectionDelegate
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Scrollbar {
|
|
|
|
|
id: scrollbar
|
|
|
|
|
|
|
|
|
|
anchors.top: parent.top
|
2010-02-18 23:57:13 +02:00
|
|
|
anchors.topMargin: 2
|
2010-02-16 17:24:18 +02:00
|
|
|
anchors.bottom: parent.bottom
|
2010-02-18 23:57:13 +02:00
|
|
|
anchors.bottomMargin: 2
|
2010-02-16 17:24:18 +02:00
|
|
|
anchors.left: parent.right
|
|
|
|
|
anchors.leftMargin: -10
|
|
|
|
|
anchors.right: parent.right
|
|
|
|
|
|
2010-02-24 19:07:31 +02:00
|
|
|
flickable: itemsFlickable
|
2010-02-16 17:24:18 +02:00
|
|
|
}
|
|
|
|
|
}
|