Source

Target

Commits (20)
Showing with 465 additions and 416 deletions
...@@ -4,7 +4,6 @@ ...@@ -4,7 +4,6 @@
/examples/quick/controls/basiclayouts/basiclayouts /examples/quick/controls/basiclayouts/basiclayouts
/examples/quick/controls/calendar/calendar /examples/quick/controls/calendar/calendar
/examples/quick/controls/gallery/gallery /examples/quick/controls/gallery/gallery
/examples/quick/controls/splitview/splitview
/examples/quick/controls/styles/styles /examples/quick/controls/styles/styles
/examples/quick/controls/tableview/tableview /examples/quick/controls/tableview/tableview
/examples/quick/controls/touch/touch /examples/quick/controls/touch/touch
...@@ -111,7 +110,8 @@ qtc-debugging-helper ...@@ -111,7 +110,8 @@ qtc-debugging-helper
# linux shared libraries # linux shared libraries
*.so* *.so*
# windows shared libraries # windows binaries
*.exe
*.dll *.dll
# osx shared libraries # osx shared libraries
......
...@@ -2,7 +2,6 @@ TEMPLATE = subdirs ...@@ -2,7 +2,6 @@ TEMPLATE = subdirs
SUBDIRS += \ SUBDIRS += \
gallery \ gallery \
splitview \
tableview \ tableview \
touch \ touch \
basiclayouts \ basiclayouts \
......
import QmlProject 1.1
Project {
mainFile: "main.qml"
/* Include .qml, .js, and image files from current directory and subdirectories */
QmlFiles {
directory: "."
}
JavaScriptFiles {
directory: "."
}
ImageFiles {
directory: "."
}
}
examples/quick/controls/tableview/images/header.png

356 Bytes

examples/quick/controls/tableview/images/selectedrow.png

303 Bytes

examples/quick/controls/tableview/images/sort-up.png

205 Bytes

/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal ** Contact: http://www.qt-project.org/legal
** **
** This file is part of the Qt Quick Controls module of the Qt Toolkit. ** This file is part of the Qt Quick Controls module of the Qt Toolkit.
...@@ -38,385 +38,150 @@ ...@@ -38,385 +38,150 @@
** **
****************************************************************************/ ****************************************************************************/
import QtQuick 2.2 import QtQuick 2.2
import QtQuick.Window 2.1 import QtQuick.Layouts 1.1
import QtQuick.Controls 1.2 import QtQuick.Controls 1.2
import QtQuick.XmlListModel 2.0 import org.qtproject.example 1.0
Window { ApplicationWindow {
id: window
visible: true visible: true
width: 538 + frame.margins * 2 title: "Table View Example"
height: 360 + frame.margins * 2
ToolBar {
id: toolbar
width: parent.width
ListModel { toolBar: ToolBar {
id: delegatemenu TextField {
ListElement { text: "Shiny delegate" } id: searchBox
ListElement { text: "Scale selected" }
ListElement { text: "Editable items" }
}
ComboBox { placeholderText: "Search..."
id: delegateChooser inputMethodHints: Qt.ImhNoPredictiveText
enabled: frame.currentIndex === 3 ? 1 : 0
model: delegatemenu
width: 150
anchors.left: parent.left
anchors.leftMargin: 8
anchors.verticalCenter: parent.verticalCenter
}
CheckBox { width: window.width / 5 * 2
id: enabledCheck
text: "Enabled"
checked: true
anchors.right: parent.right anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
} }
} }
SystemPalette {id: syspal} TableView {
color: syspal.window id: tableView
XmlListModel {
id: flickerModel
source: "http://api.flickr.com/services/feeds/photos_public.gne?format=rss2&tags=" + "Qt"
query: "/rss/channel/item"
namespaceDeclarations: "declare namespace media=\"http://search.yahoo.com/mrss/\";"
XmlRole { name: "title"; query: "title/string()" }
XmlRole { name: "imagesource"; query: "media:thumbnail/@url/string()" }
XmlRole { name: "credit"; query: "media:credit/string()" }
}
ListModel {
id: nestedModel
ListElement{content: ListElement { description: "Core" ; color:"#ffaacc"}}
ListElement{content: ListElement { description: "Second" ; color:"#ffccaa"}}
ListElement{content: ListElement { description: "Third" ; color:"#ffffaa"}}
}
ListModel { frameVisible: false
id: largeModel sortIndicatorVisible: true
Component.onCompleted: {
for (var i=0 ; i< 500 ; ++i)
largeModel.append({"name":"Person "+i , "age": Math.round(Math.random()*100), "gender": Math.random()>0.5 ? "Male" : "Female"})
}
}
Column { anchors.fill: parent
anchors.top: toolbar.bottom
anchors.right: parent.right
anchors.left: parent.left
anchors.bottom: parent.bottom
anchors.margins: 8
TabView { Layout.minimumWidth: 400
id:frame Layout.minimumHeight: 240
focus:true Layout.preferredWidth: 600
enabled: enabledCheck.checked Layout.preferredHeight: 400
property int margins: Qt.platform.os === "osx" ? 16 : 0 TableViewColumn {
id: titleColumn
title: "Title"
role: "title"
movable: false
resizable: false
width: tableView.viewport.width - authorColumn.width
}
height: parent.height - 34 TableViewColumn {
anchors.right: parent.right id: authorColumn
anchors.left: parent.left title: "Author"
anchors.margins: margins role: "author"
movable: false
resizable: false
width: tableView.viewport.width / 3
}
Tab { model: SortFilterProxyModel {
title: "XmlListModel" id: proxyModel
source: sourceModel.count > 0 ? sourceModel : null
TableView { sortOrder: tableView.sortIndicatorOrder
model: flickerModel sortCaseSensitivity: Qt.CaseInsensitive
anchors.fill: parent sortRole: sourceModel.count > 0 ? tableView.getColumn(tableView.sortIndicatorColumn).role : ""
anchors.margins: 12
TableViewColumn { filterString: "*" + searchBox.text + "*"
role: "title" filterSyntax: SortFilterProxyModel.Wildcard
title: "Title" filterCaseSensitivity: Qt.CaseInsensitive
width: 120 }
}
TableViewColumn {
role: "credit"
title: "Credit"
width: 120
}
TableViewColumn {
role: "imagesource"
title: "Image source"
width: 200
visible: true
}
frameVisible: frameCheckbox.checked ListModel {
headerVisible: headerCheckbox.checked id: sourceModel
sortIndicatorVisible: sortableCheckbox.checked ListElement {
alternatingRowColors: alternateCheckbox.checked title: "Moby-Dick"
} author: "Herman Melville"
} }
Tab { ListElement {
title: "Multivalue" title: "The Adventures of Tom Sawyer"
author: "Mark Twain"
TableView {
model: nestedModel
anchors.fill: parent
anchors.margins: 12
TableViewColumn {
role: "content"
title: "Text and Color"
width: 220
}
itemDelegate: Item {
Rectangle{
color: styleData.value.get(0).color
anchors.top:parent.top
anchors.right:parent.right
anchors.bottom:parent.bottom
anchors.margins: 4
width:32
border.color:"#666"
}
Text {
width: parent.width
anchors.margins: 4
anchors.left: parent.left
anchors.verticalCenter: parent.verticalCenter
elide: styleData.elideMode
text: styleData.value.get(0).description
color: styleData.textColor
}
}
frameVisible: frameCheckbox.checked
headerVisible: headerCheckbox.checked
sortIndicatorVisible: sortableCheckbox.checked
alternatingRowColors: alternateCheckbox.checked
}
} }
Tab { ListElement {
title: "Generated" title: "Cat’s Cradle"
author: "Kurt Vonnegut"
TableView {
model: largeModel
anchors.margins: 12
anchors.fill: parent
TableViewColumn {
role: "name"
title: "Name"
width: 120
}
TableViewColumn {
role: "age"
title: "Age"
width: 120
}
TableViewColumn {
role: "gender"
title: "Gender"
width: 120
}
frameVisible: frameCheckbox.checked
headerVisible: headerCheckbox.checked
sortIndicatorVisible: sortableCheckbox.checked
alternatingRowColors: alternateCheckbox.checked
}
} }
ListElement {
Tab { title: "Farenheit 451"
title: "Delegates" author: "Ray Bradbury"
Item {
anchors.fill: parent
Component {
id: delegate1
Item {
clip: true
Text {
width: parent.width
anchors.margins: 4
anchors.left: parent.left
anchors.verticalCenter: parent.verticalCenter
elide: styleData.elideMode
text: styleData.value !== undefined ? styleData.value : ""
color: styleData.textColor
}
}
}
Component {
id: delegate2
Text {
width: parent.width
anchors.margins: 4
anchors.left: parent.left
anchors.verticalCenter: parent.verticalCenter
elide: styleData.elideMode
text: styleData.value !== undefined ? styleData.value : ""
color: styleData.textColor
}
}
Component {
id: editableDelegate
Item {
Text {
width: parent.width
anchors.margins: 4
anchors.left: parent.left
anchors.verticalCenter: parent.verticalCenter
elide: styleData.elideMode
text: styleData.value !== undefined ? styleData.value : ""
color: styleData.textColor
visible: !styleData.selected
}
Loader { // Initialize text editor lazily to improve performance
id: loaderEditor
anchors.fill: parent
anchors.margins: 4
Connections {
target: loaderEditor.item
onAccepted: {
if (typeof styleData.value === 'number')
largeModel.setProperty(styleData.row, styleData.role, Number(parseFloat(loaderEditor.item.text).toFixed(0)))
else
largeModel.setProperty(styleData.row, styleData.role, loaderEditor.item.text)
}
}
sourceComponent: styleData.selected ? editor : null
Component {
id: editor
TextInput {
id: textinput
color: styleData.textColor
text: styleData.value
MouseArea {
id: mouseArea
anchors.fill: parent
hoverEnabled: true
onClicked: textinput.forceActiveFocus()
}
}
}
}
}
}
TableView {
id: delegatesView
model: largeModel
anchors.margins: 12
anchors.fill:parent
frameVisible: frameCheckbox.checked
headerVisible: headerCheckbox.checked
sortIndicatorVisible: sortableCheckbox.checked
alternatingRowColors: alternateCheckbox.checked
TableViewColumn {
role: "name"
title: "Name"
width: 120
}
TableViewColumn {
role: "age"
title: "Age"
width: 120
}
TableViewColumn {
role: "gender"
title: "Gender"
width: 120
}
headerDelegate: BorderImage{
source: "images/header.png"
border{left:2;right:2;top:2;bottom:2}
Text {
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
anchors.right: indicator.visible ? indicator.left : parent.right
anchors.margins: 6
text: styleData.value
elide: Text.ElideRight
color:"#333"
}
// Sort indicator
Image {
id: indicator
anchors.verticalCenter: parent.verticalCenter
anchors.right: parent.right
anchors.rightMargin: 6
source: "images/sort-up.png"
visible: delegatesView.sortIndicatorVisible &&
styleData.column === delegatesView.sortIndicatorColumn
rotation: delegatesView.sortIndicatorOrder === Qt.AscendingOrder ? 180 : 0
Behavior on rotation { NumberAnimation { } }
}
}
rowDelegate: Rectangle {
height: (delegateChooser.currentIndex == 1 && styleData.selected) ? 30 : 20
Behavior on height{ NumberAnimation{} }
color: styleData.selected ? "#448" : (styleData.alternate? "#eee" : "#fff")
BorderImage{
id: selected
anchors.fill: parent
source: "images/selectedrow.png"
visible: styleData.selected
border{left:2; right:2; top:2; bottom:2}
SequentialAnimation {
running: true; loops: Animation.Infinite
NumberAnimation { target:selected; property: "opacity"; to: 1.0; duration: 900}
NumberAnimation { target:selected; property: "opacity"; to: 0.5; duration: 900}
}
}
}
itemDelegate: {
if (delegateChooser.currentIndex == 2)
return editableDelegate;
else
return delegate1;
}
}
}
} }
} ListElement {
Row{ title: "It"
x: 12 author: "Stephen King"
height: 34 }
CheckBox{ ListElement {
id: alternateCheckbox title: "On the Road"
checked: true author: "Jack Kerouac"
text: "Alternate" }
anchors.verticalCenter: parent.verticalCenter ListElement {
title: "Of Mice and Men"
author: "John Steinbeck"
}
ListElement {
title: "Do Androids Dream of Electric Sheep?"
author: "Philip K. Dick"
}
ListElement {
title: "Uncle Tom’s Cabin"
author: "Harriet Beecher Stowe"
}
ListElement {
title: "The Call of the Wild"
author: "Jack London"
}
ListElement {
title: "The Old Man and the Sea"
author: "Ernest Hemingway"
}
ListElement {
title: "A Streetcar Named Desire"
author: "Tennessee Williams"
}
ListElement {
title: "Catch-22"
author: "Joseph Heller"
}
ListElement {
title: "One Flew Over the Cuckoo’s Nest"
author: "Ken Kesey"
}
ListElement {
title: "The Murders in the Rue Morgue"
author: "Edgar Allan Poe"
}
ListElement {
title: "Breakfast at Tiffany’s"
author: "Truman Capote"
} }
CheckBox{ ListElement {
id: sortableCheckbox title: "Death of a Salesman"
checked: false author: "Arthur Miller"
text: "Sort indicator"
anchors.verticalCenter: parent.verticalCenter
} }
CheckBox{ ListElement {
id: frameCheckbox title: "Post Office"
checked: true author: "Charles Bukowski"
text: "Frame"
anchors.verticalCenter: parent.verticalCenter
} }
CheckBox{ ListElement {
id: headerCheckbox title: "Herbert West—Reanimator"
checked: true author: "H. P. Lovecraft"
text: "Headers"
anchors.verticalCenter: parent.verticalCenter
} }
} }
} }
......
<!DOCTYPE RCC><RCC version="1.0">
<qresource prefix="/">
<file>main.qml</file>
<file>images/selectedrow.png</file>
<file>images/header.png</file>
<file>images/sort-up.png</file>
</qresource>
</RCC>
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal ** Contact: http://www.qt-project.org/legal
** **
** This file is part of the Qt Quick Controls module of the Qt Toolkit. ** This file is part of the Qt Quick Controls module of the Qt Toolkit.
...@@ -39,11 +39,21 @@ ...@@ -39,11 +39,21 @@
****************************************************************************/ ****************************************************************************/
#include "qtquickcontrolsapplication.h" #include "qtquickcontrolsapplication.h"
#include <QtQml/QQmlApplicationEngine> #include "sortfilterproxymodel.h"
#include <QtQml/qqmlapplicationengine.h>
#include <QtGui/qsurfaceformat.h>
#include <QtQml/qqml.h>
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
QtQuickControlsApplication app(argc, argv); QtQuickControlsApplication app(argc, argv);
if (QCoreApplication::arguments().contains(QLatin1String("--coreprofile"))) {
QSurfaceFormat fmt;
fmt.setVersion(4, 4);
fmt.setProfile(QSurfaceFormat::CoreProfile);
QSurfaceFormat::setDefaultFormat(fmt);
}
qmlRegisterType<SortFilterProxyModel>("org.qtproject.example", 1, 0, "SortFilterProxyModel");
QQmlApplicationEngine engine(QUrl("qrc:/main.qml")); QQmlApplicationEngine engine(QUrl("qrc:/main.qml"));
return app.exec(); return app.exec();
} }
/****************************************************************************
**
** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
** This file is part of the Qt Quick Controls module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** You may use this file under the terms of the BSD license as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names
** of its contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include "sortfilterproxymodel.h"
#include <QtDebug>
#include <QtQml>
SortFilterProxyModel::SortFilterProxyModel(QObject *parent) : QSortFilterProxyModel(parent), m_complete(false)
{
connect(this, SIGNAL(rowsInserted(QModelIndex,int,int)), this, SIGNAL(countChanged()));
connect(this, SIGNAL(rowsRemoved(QModelIndex,int,int)), this, SIGNAL(countChanged()));
}
int SortFilterProxyModel::count() const
{
return rowCount();
}
QObject *SortFilterProxyModel::source() const
{
return sourceModel();
}
void SortFilterProxyModel::setSource(QObject *source)
{
setSourceModel(qobject_cast<QAbstractItemModel *>(source));
}
QByteArray SortFilterProxyModel::sortRole() const
{
return m_sortRole;
}
void SortFilterProxyModel::setSortRole(const QByteArray &role)
{
if (m_sortRole != role) {
m_sortRole = role;
if (m_complete)
QSortFilterProxyModel::setSortRole(roleKey(role));
}
}
void SortFilterProxyModel::setSortOrder(Qt::SortOrder order)
{
QSortFilterProxyModel::sort(0, order);
}
QByteArray SortFilterProxyModel::filterRole() const
{
return m_filterRole;
}
void SortFilterProxyModel::setFilterRole(const QByteArray &role)
{
if (m_filterRole != role) {
m_filterRole = role;
if (m_complete)
QSortFilterProxyModel::setFilterRole(roleKey(role));
}
}
QString SortFilterProxyModel::filterString() const
{
return filterRegExp().pattern();
}
void SortFilterProxyModel::setFilterString(const QString &filter)
{
setFilterRegExp(QRegExp(filter, filterCaseSensitivity(), static_cast<QRegExp::PatternSyntax>(filterSyntax())));
}
SortFilterProxyModel::FilterSyntax SortFilterProxyModel::filterSyntax() const
{
return static_cast<FilterSyntax>(filterRegExp().patternSyntax());
}
void SortFilterProxyModel::setFilterSyntax(SortFilterProxyModel::FilterSyntax syntax)
{
setFilterRegExp(QRegExp(filterString(), filterCaseSensitivity(), static_cast<QRegExp::PatternSyntax>(syntax)));
}
QJSValue SortFilterProxyModel::get(int idx) const
{
QJSEngine *engine = qmlEngine(this);
QJSValue value = engine->newObject();
if (idx >= 0 && idx < count()) {
QHash<int, QByteArray> roles = roleNames();
QHashIterator<int, QByteArray> it(roles);
while (it.hasNext()) {
it.next();
value.setProperty(QString::fromUtf8(it.value()), data(index(idx, 0), it.key()).toString());
}
}
return value;
}
void SortFilterProxyModel::classBegin()
{
}
void SortFilterProxyModel::componentComplete()
{
m_complete = true;
if (!m_sortRole.isEmpty())
QSortFilterProxyModel::setSortRole(roleKey(m_sortRole));
if (!m_filterRole.isEmpty())
QSortFilterProxyModel::setFilterRole(roleKey(m_filterRole));
}
int SortFilterProxyModel::roleKey(const QByteArray &role) const
{
QHash<int, QByteArray> roles = roleNames();
QHashIterator<int, QByteArray> it(roles);
while (it.hasNext()) {
it.next();
if (it.value() == role)
return it.key();
}
return -1;
}
QHash<int, QByteArray> SortFilterProxyModel::roleNames() const
{
if (QAbstractItemModel *source = sourceModel())
return source->roleNames();
return QHash<int, QByteArray>();
}
bool SortFilterProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const
{
QRegExp rx = filterRegExp();
if (rx.isEmpty())
return true;
QAbstractItemModel *model = sourceModel();
if (filterRole().isEmpty()) {
QHash<int, QByteArray> roles = roleNames();
QHashIterator<int, QByteArray> it(roles);
while (it.hasNext()) {
it.next();
QModelIndex sourceIndex = model->index(sourceRow, 0, sourceParent);
QString key = model->data(sourceIndex, it.key()).toString();
if (key.contains(rx))
return true;
}
return false;
}
QModelIndex sourceIndex = model->index(sourceRow, 0, sourceParent);
if (!sourceIndex.isValid())
return true;
QString key = model->data(sourceIndex, roleKey(filterRole())).toString();
return key.contains(rx);
}
/****************************************************************************
**
** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
** This file is part of the Qt Quick Controls module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** You may use this file under the terms of the BSD license as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names
** of its contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef SORTFILTERPROXYMODEL_H
#define SORTFILTERPROXYMODEL_H
#include <QtCore/qsortfilterproxymodel.h>
#include <QtQml/qqmlparserstatus.h>
#include <QtQml/qjsvalue.h>
class SortFilterProxyModel : public QSortFilterProxyModel, public QQmlParserStatus
{
Q_OBJECT
Q_INTERFACES(QQmlParserStatus)
Q_PROPERTY(int count READ count NOTIFY countChanged)
Q_PROPERTY(QObject *source READ source WRITE setSource)
Q_PROPERTY(QByteArray sortRole READ sortRole WRITE setSortRole)
Q_PROPERTY(Qt::SortOrder sortOrder READ sortOrder WRITE setSortOrder)
Q_PROPERTY(QByteArray filterRole READ filterRole WRITE setFilterRole)
Q_PROPERTY(QString filterString READ filterString WRITE setFilterString)
Q_PROPERTY(FilterSyntax filterSyntax READ filterSyntax WRITE setFilterSyntax)
Q_ENUMS(FilterSyntax)
public:
explicit SortFilterProxyModel(QObject *parent = 0);
QObject *source() const;
void setSource(QObject *source);
QByteArray sortRole() const;
void setSortRole(const QByteArray &role);
void setSortOrder(Qt::SortOrder order);
QByteArray filterRole() const;
void setFilterRole(const QByteArray &role);
QString filterString() const;
void setFilterString(const QString &filter);
enum FilterSyntax {
RegExp,
Wildcard,
FixedString
};
FilterSyntax filterSyntax() const;
void setFilterSyntax(FilterSyntax syntax);
int count() const;
Q_INVOKABLE QJSValue get(int index) const;
void classBegin();
void componentComplete();
signals:
void countChanged();
protected:
int roleKey(const QByteArray &role) const;
QHash<int, QByteArray> roleNames() const;
bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const;
private:
bool m_complete;
QByteArray m_sortRole;
QByteArray m_filterRole;
};
#endif // SORTFILTERPROXYMODEL_H
INCLUDEPATH += $$PWD
HEADERS += \
$$PWD/sortfilterproxymodel.h
SOURCES += \ SOURCES += \
$$PWD/main.cpp $$PWD/main.cpp \
$$PWD/sortfilterproxymodel.cpp
QT += qml quick TEMPLATE = app
TARGET = tableview TARGET = tableview
!no_desktop: QT += widgets
include(src/src.pri) RESOURCES += \
include(../shared/shared.pri) tableview.qrc
OTHER_FILES += \ OTHER_FILES += \
main.qml main.qml
RESOURCES += \ include(src/src.pri)
resources.qrc include(../shared/shared.pri)
import QmlProject 1.1
Project {
mainFile: "main.qml"
/* Include .qml, .js, and image files from current directory and subdirectories */
QmlFiles {
directory: "."
}
JavaScriptFiles {
directory: "."
}
ImageFiles {
directory: "."
}
}
...@@ -75,7 +75,7 @@ Loader { ...@@ -75,7 +75,7 @@ Loader {
MouseArea { MouseArea {
id: mouse id: mouse
anchors.fill: item anchors.fill: item
enabled: handle.active enabled: item && item.visible
preventStealing: true preventStealing: true
property real pressX property real pressX
property point offset property point offset
......
...@@ -54,7 +54,7 @@ TextInput { ...@@ -54,7 +54,7 @@ TextInput {
property alias editMenu: editMenu property alias editMenu: editMenu
cursorDelegate: __style && __style.__cursorDelegate ? __style.__cursorDelegate : null cursorDelegate: __style && __style.__cursorDelegate ? __style.__cursorDelegate : null
selectByMouse: control.selectByMouse && (!cursorHandle.delegate || !selectionHandle.delegate) selectByMouse: control.selectByMouse && (!Settings.isMobile || !cursorHandle.delegate || !selectionHandle.delegate)
// force re-evaluation when selection moves: // force re-evaluation when selection moves:
// - cursorRectangle changes => content scrolled // - cursorRectangle changes => content scrolled
...@@ -137,7 +137,7 @@ TextInput { ...@@ -137,7 +137,7 @@ TextInput {
editor: input editor: input
parent: control parent: control
control: input.control control: input.control
active: control.selectByMouse active: control.selectByMouse && Settings.isMobile
maximum: cursorHandle.position - 1 maximum: cursorHandle.position - 1
property var mappedPos: parent.mapFromItem(editor, editor.selectionRectangle.x, editor.selectionRectangle.y) property var mappedPos: parent.mapFromItem(editor, editor.selectionRectangle.x, editor.selectionRectangle.y)
...@@ -163,14 +163,14 @@ TextInput { ...@@ -163,14 +163,14 @@ TextInput {
editor: input editor: input
parent: control parent: control
control: input.control control: input.control
active: control.selectByMouse active: control.selectByMouse && Settings.isMobile
minimum: input.hasSelection ? selectionHandle.position + 1 : -1 minimum: input.hasSelection ? selectionHandle.position + 1 : -1
property var mappedPos: parent.mapFromItem(editor, editor.cursorRectangle.x, editor.cursorRectangle.y) property var mappedPos: parent.mapFromItem(editor, editor.cursorRectangle.x, editor.cursorRectangle.y)
x: mappedPos.x x: mappedPos.x
y: mappedPos.y y: mappedPos.y
visible: pressed || (input.hasSelection && handleX + handleWidth >= -1 && handleX <= control.width + 1) visible: pressed || ((input.cursorVisible || input.hasSelection) && handleX + handleWidth >= -1 && handleX <= control.width + 1)
onPositionChanged: { onPositionChanged: {
if (!input.blockRecursion) { if (!input.blockRecursion) {
......
...@@ -354,6 +354,8 @@ void QQuickStyleItem::initStyleOption() ...@@ -354,6 +354,8 @@ void QQuickStyleItem::initStyleOption()
opt->features = QStyleOptionViewItem::HasDisplay; opt->features = QStyleOptionViewItem::HasDisplay;
opt->text = text(); opt->text = text();
opt->textElideMode = Qt::ElideRight; opt->textElideMode = Qt::ElideRight;
opt->displayAlignment = Qt::AlignLeft | Qt::AlignVCenter;
opt->decorationAlignment = Qt::AlignCenter;
resolvePalette(); resolvePalette();
needsResolvePalette = false; needsResolvePalette = false;
QPalette pal = m_styleoption->palette; QPalette pal = m_styleoption->palette;
......
...@@ -167,6 +167,8 @@ Control { ...@@ -167,6 +167,8 @@ Control {
\l stepSize property. \l stepSize property.
The default value is \c false. The default value is \c false.
\note This property may be ignored on some platforms when using the native style (e.g. Android).
*/ */
property bool tickmarksEnabled: false property bool tickmarksEnabled: false
...@@ -237,28 +239,28 @@ Control { ...@@ -237,28 +239,28 @@ Control {
return Math.max(range.positionAtMinimum, Math.min(range.positionAtMaximum, val)) return Math.max(range.positionAtMinimum, Math.min(range.positionAtMaximum, val))
} }
function updateHandlePosition(mouse) { function updateHandlePosition(mouse, force) {
var pos, overThreshold var pos, overThreshold
if (__horizontal) { if (__horizontal) {
pos = clamp (mouse.x + clickOffset - fakeHandle.width/2) pos = clamp (mouse.x + clickOffset - fakeHandle.width/2)
overThreshold = Math.abs(mouse.x - pressX) >= Settings.dragThreshold overThreshold = Math.abs(mouse.x - pressX) >= Settings.dragThreshold
if (overThreshold) if (overThreshold)
preventStealing = true preventStealing = true
if (overThreshold || !Settings.hasTouchScreen) if (overThreshold || force)
fakeHandle.x = pos fakeHandle.x = pos
} else if (!__horizontal) { } else if (!__horizontal) {
pos = clamp (mouse.y + clickOffset- fakeHandle.height/2) pos = clamp (mouse.y + clickOffset- fakeHandle.height/2)
overThreshold = Math.abs(mouse.y - pressY) >= Settings.dragThreshold overThreshold = Math.abs(mouse.y - pressY) >= Settings.dragThreshold
if (overThreshold) if (overThreshold)
preventStealing = true preventStealing = true
if (overThreshold || !Settings.hasTouchScreen) if (overThreshold || force)
fakeHandle.y = pos fakeHandle.y = pos
} }
} }
onPositionChanged: { onPositionChanged: {
if (pressed) if (pressed)
updateHandlePosition(mouse) updateHandlePosition(mouse, preventStealing)
var point = mouseArea.mapToItem(fakeHandle, mouse.x, mouse.y) var point = mouseArea.mapToItem(fakeHandle, mouse.x, mouse.y)
handleHovered = fakeHandle.contains(Qt.point(point.x, point.y)) handleHovered = fakeHandle.contains(Qt.point(point.x, point.y))
...@@ -274,10 +276,11 @@ Control { ...@@ -274,10 +276,11 @@ Control {
} }
pressX = mouse.x pressX = mouse.x
pressY = mouse.y pressY = mouse.y
updateHandlePosition(mouse) updateHandlePosition(mouse, !Settings.hasTouchScreen)
} }
onReleased: { onReleased: {
updateHandlePosition(mouse, Settings.hasTouchScreen)
// If we don't update while dragging, this is the only // If we don't update while dragging, this is the only
// moment that the range is updated. // moment that the range is updated.
if (!slider.updateValueWhileDragging) if (!slider.updateValueWhileDragging)
......
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
** $QT_END_LICENSE$ ** $QT_END_LICENSE$
** **
****************************************************************************/ ****************************************************************************/
import QtQuick 2.2 import QtQuick 2.4
import QtQuick.Window 2.2 import QtQuick.Window 2.2
import QtQuick.Controls 1.2 import QtQuick.Controls 1.2
import QtQuick.Controls.Private 1.0 import QtQuick.Controls.Private 1.0
...@@ -70,7 +70,7 @@ Style { ...@@ -70,7 +70,7 @@ Style {
readonly property real minWidth: styleDef.View_minWidth || 0 readonly property real minWidth: styleDef.View_minWidth || 0
readonly property real minHeight: styleDef.View_minHeight || 0 readonly property real minHeight: styleDef.View_minHeight || 0
readonly property real labelWidth: label.implicitWidth + paddingStart + paddingEnd readonly property real labelWidth: Math.max(label.implicitWidth, metrics.width) + paddingStart + paddingEnd
readonly property real labelHeight: label.implicitHeight + bg.padding.top + bg.padding.bottom readonly property real labelHeight: label.implicitHeight + bg.padding.top + bg.padding.bottom
implicitWidth: Math.max(minWidth, Math.max(bg.implicitWidth, labelWidth)) implicitWidth: Math.max(minWidth, Math.max(bg.implicitWidth, labelWidth))
...@@ -85,6 +85,11 @@ Style { ...@@ -85,6 +85,11 @@ Style {
styleDef: panel.styleDef.View_background styleDef: panel.styleDef.View_background
} }
TextMetrics {
id: metrics
text: "12345678901234567890"
}
LabelStyle { LabelStyle {
id: label id: label
text: control.currentText text: control.currentText
......