changeset 146:22257add3152

add customsortfiltermodel example
author mandel
date Fri, 12 Jun 2009 22:20:37 +0000
parents 7648ee2e023b
children 4b423949c893
files examples/itemviews/CMakeLists.txt examples/itemviews/customsortfiltermodel/CMakeLists.txt examples/itemviews/customsortfiltermodel/build.bat examples/itemviews/customsortfiltermodel/build.sh examples/itemviews/customsortfiltermodel/main.d examples/itemviews/customsortfiltermodel/mysortfilterproxymodel.d examples/itemviews/customsortfiltermodel/window.d
diffstat 7 files changed, 420 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/examples/itemviews/CMakeLists.txt	Wed Jun 10 18:34:48 2009 +0000
+++ b/examples/itemviews/CMakeLists.txt	Fri Jun 12 22:20:37 2009 +0000
@@ -1,1 +1,2 @@
- add_subdirectory(dirview)
\ No newline at end of file
+ add_subdirectory(dirview)
+add_subdirectory(customsortfiltermodel)
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/itemviews/customsortfiltermodel/CMakeLists.txt	Fri Jun 12 22:20:37 2009 +0000
@@ -0,0 +1,1 @@
+build_example(mysortfilterproxymodel main.d window.d mysortfilterproxymodel.d)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/itemviews/customsortfiltermodel/build.bat	Fri Jun 12 22:20:37 2009 +0000
@@ -0,0 +1,1 @@
+dmd main.d window.d mysortfilterproxymodel.d libqtdcore.lib libqtdgui.lib -I../../../
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/itemviews/customsortfiltermodel/build.sh	Fri Jun 12 22:20:37 2009 +0000
@@ -0,0 +1,3 @@
+#! /bin/bash
+
+ldc main.d mysortfilterproxymodel.d window.d -I../../../ -I../../../qt/d1 -L-L../../../lib -L-lqtdgui -L-lqtdcore -L-lQtCore -L-lQtGui -ofmysortfilterproxymodel
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/itemviews/customsortfiltermodel/main.d	Fri Jun 12 22:20:37 2009 +0000
@@ -0,0 +1,99 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** 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.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+module main;
+
+
+import qt.core.QAbstractItemModel;
+import qt.core.QDateTime;
+import qt.gui.QStandardItemModel;
+
+import window;
+
+
+void addMail(QAbstractItemModel model, string subject, string sender, QDateTime date)
+{
+	model.insertRow(0);
+	model.setData(model.index(0, 0), new QVariant(subject));
+	model.setData(model.index(0, 1), new QVariant(sender));
+	model.setData(model.index(0, 2), new QVariant(date));
+}
+
+QAbstractItemModel createMailModel(QObject parent)
+{
+	QStandardItemModel model = new QStandardItemModel(0, 3, parent);
+
+	model.setHeaderData(0, Qt.Horizontal, new QVariant(tr("Subject")));
+	model.setHeaderData(1, Qt.Horizontal, new QVariant(tr("Sender")));
+	model.setHeaderData(2, Qt.Horizontal, new QVariant(tr("Date")));
+
+	addMail(model, "Happy New Year!", "Grace K. <grace@software-inc.com>",
+		new QDateTime(new QDate(2006, 12, 31), new QTime(17, 03)));
+	addMail(model, "Radically new concept", "Grace K. <grace@software-inc.com>",
+		new QDateTime(new QDate(2006, 12, 22), new QTime(9, 44)));
+	addMail(model, "Accounts", "pascale@nospam.com",
+		new QDateTime(new QDate(2006, 12, 31), new QTime(12, 50)));
+	addMail(model, "Expenses", "Joe Bloggs <joe@bloggs.com>",
+		new QDateTime(new QDate(2006, 12, 25), new QTime(11, 39)));
+	addMail(model, "Re: Expenses", "Andy <andy@nospam.com>",
+		new QDateTime(new QDate(2007, 01, 02), new QTime(16, 05)));
+	addMail(model, "Re: Accounts", "Joe Bloggs <joe@bloggs.com>",
+		new QDateTime(new QDate(2007, 01, 03), new QTime(14, 18)));
+	addMail(model, "Re: Accounts", "Andy <andy@nospam.com>",
+		new QDateTime(new QDate(2007, 01, 03), new QTime(14, 26)));
+	addMail(model, "Sports", "Linda Smith <linda.smith@nospam.com>",
+		new QDateTime(new QDate(2007, 01, 05), new QTime(11, 33)));
+	addMail(model, "AW: Sports", "Rolf Newschweinstein <rolfn@nospam.com>",
+		new QDateTime(new QDate(2007, 01, 05), new QTime(12, 00)));
+	addMail(model, "RE: Sports", "Petra Schmidt <petras@nospam.com>",
+		new QDateTime(new QDate(2007, 01, 05), new QTime(12, 01)));
+
+	return model;
+}
+
+
+int main(string[] args)
+{
+	scope app = new QApplication(args);
+	scope window = new Window;
+	window.setSourceModel(createMailModel(window));
+	window.show();
+	return app.exec();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/itemviews/customsortfiltermodel/mysortfilterproxymodel.d	Fri Jun 12 22:20:37 2009 +0000
@@ -0,0 +1,133 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** 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.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+module mysortfilterproxymodel;
+
+
+import qt.core.QDate;
+import qt.core.QVariant;
+import qt.core.QDateTime;
+import qt.gui.QSortFilterProxyModel;
+
+
+class MySortFilterProxyModel : public QSortFilterProxyModel
+{
+public:
+
+	this(QObject parent = null)
+	{
+		super(parent);
+		minDate = new QDate();
+		maxDate = new QDate();
+	}
+
+	QDate filterMinimumDate()
+	{
+		return minDate;
+	}
+	
+	void setFilterMinimumDate(QDate date)
+	{
+		minDate = date;
+		invalidateFilter();
+	}
+
+	QDate filterMaximumDate()
+	{
+		return maxDate;
+	}
+	
+	void setFilterMaximumDate(QDate date)
+	{
+		maxDate = date;
+		invalidateFilter();
+	}
+
+protected:
+
+	bool filterAcceptsRow(int sourceRow, QModelIndex sourceParent)
+	{
+		QModelIndex index0 = sourceModel().index(sourceRow, 0, sourceParent);
+		QModelIndex index1 = sourceModel().index(sourceRow, 1, sourceParent);
+		QModelIndex index2 = sourceModel().index(sourceRow, 2, sourceParent);
+
+		static bool contains(char[] str, QRegExp rx)
+		{
+			return (rx.indexIn(str, 0) != -1);
+		}
+		
+		return (contains(sourceModel().data(index0).toString(), filterRegExp())
+			|| contains(sourceModel().data(index1).toString(), filterRegExp()))
+			&& dateInRange(sourceModel().data(index2).toDate());
+	}
+
+
+	bool lessThan(QModelIndex left, QModelIndex right)
+	{
+		QVariant leftData = sourceModel().data(left);
+		QVariant rightData = sourceModel().data(right);
+
+		if (leftData.canConvert!(QDateTime)) {
+			return leftData.toDateTime() < rightData.toDateTime();
+		} else {
+			QRegExp emailPattern = new QRegExp("([\\w\\.]*@[\\w\\.]*)");
+
+			string leftString = leftData.toString();
+			if(left.column() == 1 && emailPattern.indexIn(leftString) != -1)
+				leftString = emailPattern.cap(1);
+
+			string rightString = rightData.toString();
+			if(right.column() == 1 && emailPattern.indexIn(rightString) != -1)
+				rightString = emailPattern.cap(1);
+
+			return leftString < rightString;
+		}
+	}
+
+private:
+
+	bool dateInRange(QDate date)
+	{
+		return (!minDate.isValid() || date > minDate) && (!maxDate.isValid() || date < maxDate);
+	}
+
+	QDate minDate;
+	QDate maxDate;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/itemviews/customsortfiltermodel/window.d	Fri Jun 12 22:20:37 2009 +0000
@@ -0,0 +1,181 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** 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.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+module window;
+
+
+import qt.core.QAbstractItemModel;
+import qt.gui.QWidget;
+import qt.gui.QCheckBox;
+import qt.gui.QComboBox;
+import qt.gui.QDateEdit;
+import qt.gui.QGroupBox;
+import qt.gui.QLabel;
+import qt.gui.QLineEdit;
+import qt.gui.QTreeView;
+import qt.gui.QHBoxLayout;
+import qt.gui.QVBoxLayout;
+import qt.gui.QGridLayout;
+
+import mysortfilterproxymodel;
+
+
+class Window : public QWidget
+{
+public:
+
+	this()
+	{
+		proxyModel = new MySortFilterProxyModel(this);
+		proxyModel.setDynamicSortFilter(true);
+
+		sourceView = new QTreeView;
+		sourceView.setRootIsDecorated(false);
+		sourceView.setAlternatingRowColors(true);
+
+		QHBoxLayout sourceLayout = new QHBoxLayout;
+
+		sourceLayout.addWidget(sourceView);
+		sourceGroupBox = new QGroupBox(tr("Original Model"));
+		sourceGroupBox.setLayout(sourceLayout);
+
+		filterCaseSensitivityCheckBox = new QCheckBox(tr("Case sensitive filter"));
+		filterCaseSensitivityCheckBox.setChecked(true);
+
+		filterPatternLineEdit = new QLineEdit;
+		filterPatternLineEdit.setText("Grace|Sports");
+
+		filterPatternLabel = new QLabel(tr("&Filter pattern:"));
+		filterPatternLabel.setBuddy(filterPatternLineEdit);
+
+		filterSyntaxComboBox = new QComboBox;
+		filterSyntaxComboBox.addItem(tr("Regular expression"), new QVariant(cast(ulong) QRegExp.RegExp));
+		filterSyntaxComboBox.addItem(tr("Wildcard"), new QVariant(cast(ulong) QRegExp.Wildcard));
+		filterSyntaxComboBox.addItem(tr("Fixed string"), new QVariant(cast(ulong) QRegExp.FixedString));
+
+		fromDateEdit = new QDateEdit;
+		fromDateEdit.setDate(new QDate(1970, 01, 01));
+		fromLabel = new QLabel(tr("F&rom:"));
+		fromLabel.setBuddy(fromDateEdit);
+
+		toDateEdit = new QDateEdit;
+		toDateEdit.setDate(new QDate(2099, 12, 31));
+		toLabel = new QLabel(tr("&To:"));
+		toLabel.setBuddy(toDateEdit);
+
+		filterPatternLineEdit.textChanged.connect(&this.textFilterChanged);
+		filterSyntaxComboBox.currentIndexChanged.connect(&this.textFilterChanged);
+		filterCaseSensitivityCheckBox.toggled.connect(&this.textFilterChanged);
+		fromDateEdit.dateChanged.connect(&this.dateFilterChanged);
+		toDateEdit.dateChanged.connect(&this.dateFilterChanged);
+
+		proxyView = new QTreeView;
+		proxyView.setRootIsDecorated(false);
+		proxyView.setAlternatingRowColors(true);
+		proxyView.setModel(proxyModel);
+		proxyView.setSortingEnabled(true);
+		proxyView.sortByColumn(1, Qt.AscendingOrder);
+
+		QGridLayout proxyLayout = new QGridLayout;
+		proxyLayout.addWidget(proxyView, 0, 0, 1, 3);
+		proxyLayout.addWidget(filterPatternLabel, 1, 0);
+		proxyLayout.addWidget(filterPatternLineEdit, 1, 1);
+		proxyLayout.addWidget(filterSyntaxComboBox, 1, 2);
+		proxyLayout.addWidget(filterCaseSensitivityCheckBox, 2, 0, 1, 3);
+		proxyLayout.addWidget(fromLabel, 3, 0);
+		proxyLayout.addWidget(fromDateEdit, 3, 1, 1, 2);
+		proxyLayout.addWidget(toLabel, 4, 0);
+		proxyLayout.addWidget(toDateEdit, 4, 1, 1, 2);
+
+		proxyGroupBox = new QGroupBox(tr("Sorted/Filtered Model"));
+		proxyGroupBox.setLayout(proxyLayout);
+
+		QVBoxLayout mainLayout = new QVBoxLayout;
+		mainLayout.addWidget(sourceGroupBox);
+		mainLayout.addWidget(proxyGroupBox);
+		setLayout(mainLayout);
+
+		setWindowTitle(tr("Custom Sort/Filter Model"));
+		resize(500, 450);
+	}
+
+	void setSourceModel(QAbstractItemModel model)
+	{
+		proxyModel.setSourceModel(model);
+		sourceView.setModel(model);
+	}
+
+private:
+
+	void textFilterChanged()
+	{
+		QRegExp.PatternSyntax syntax = cast(QRegExp.PatternSyntax) filterSyntaxComboBox.itemData(
+			filterSyntaxComboBox.currentIndex()).toInt();
+		Qt.CaseSensitivity caseSensitivity =
+		filterCaseSensitivityCheckBox.isChecked() ? Qt.CaseSensitive
+					       : Qt.CaseInsensitive;
+
+		auto regExp = new QRegExp(filterPatternLineEdit.text(), caseSensitivity, syntax);
+		proxyModel.setFilterRegExp(regExp);
+	}
+
+	void dateFilterChanged()
+	{
+		proxyModel.setFilterMinimumDate(fromDateEdit.date());
+		proxyModel.setFilterMaximumDate(toDateEdit.date());
+	}
+
+private:
+
+	MySortFilterProxyModel proxyModel;
+
+	QGroupBox sourceGroupBox;
+	QGroupBox proxyGroupBox;
+	QTreeView sourceView;
+	QTreeView proxyView;
+	QCheckBox filterCaseSensitivityCheckBox;
+	QLabel filterPatternLabel;
+	QLabel fromLabel;
+	QLabel toLabel;
+	QLineEdit filterPatternLineEdit;
+	QComboBox filterSyntaxComboBox;
+	QDateEdit fromDateEdit;
+	QDateEdit toDateEdit;
+}