2 * Copyright (C) 2007 Ivan Cukic <ivan.cukic+kde@gmail.com>
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU Library/Lesser General Public License
6 * version 2, or (at your option) any later version, as published by the
7 * Free Software Foundation
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details
14 * You should have received a copy of the GNU Library/Lesser General Public
15 * License along with this program; if not, write to the
16 * Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20 #include "kcategorizeditemsview_p.h"
21 #include "kcategorizeditemsviewdelegate_p.h"
26 #include <KStandardAction>
28 #define UNIVERSAL_PADDING 6
30 KCategorizedItemsView::KCategorizedItemsView(QWidget
* parent
, Qt::WindowFlags f
)
31 : QWidget(parent
, f
), m_modelCategories(NULL
), m_modelFilters(NULL
),
32 m_modelItems(NULL
), m_modelFilterItems(NULL
), m_delegate(NULL
),
36 itemsView
->m_view
= this;
38 textSearch
->setClickMessage(i18n("Enter search phrase here"));
40 textSearch
->setFocus();
42 connect(textSearch
, SIGNAL(textChanged(QString
)),
43 this, SLOT(searchTermChanged(QString
)));
44 connect(comboFilters
, SIGNAL(currentIndexChanged(int)),
45 this, SLOT(filterChanged(int)));
47 connect (itemsView
, SIGNAL(activated(const QModelIndex
&)),
48 this, SIGNAL(activated(const QModelIndex
&)));
50 connect (itemsView
, SIGNAL(clicked(const QModelIndex
&)),
51 this, SIGNAL(clicked(const QModelIndex
&)));
52 connect (itemsView
, SIGNAL(entered(const QModelIndex
&)),
53 this, SIGNAL(entered(const QModelIndex
&)));
54 connect (itemsView
, SIGNAL(pressed(const QModelIndex
&)),
55 this, SIGNAL(pressed(const QModelIndex
&)));
57 itemsView
->header()->setVisible(false);
59 itemsView
->setItemDelegate(m_delegate
= new KCategorizedItemsViewDelegate(this));
60 //itemsView->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
62 connect (m_delegate
, SIGNAL(destroyApplets(const QString
)),
63 parent
, SLOT(destroyApplets(const QString
)));
65 comboFilters
->setItemDelegate(new KCategorizedItemsViewFilterDelegate(this));
67 itemsView
->viewport()->setAttribute(Qt::WA_Hover
);
69 QAction
* find
= KStandardAction::find(textSearch
, SLOT(setFocus()), this);
73 KCategorizedItemsView::~KCategorizedItemsView()
75 delete m_modelFilterItems
;
79 void KCategorizedItemsView::resizeEvent ( QResizeEvent
* event
)
83 QWidget::resizeEvent(event
);
86 bool KCategorizedItemsView::event ( QEvent
* event
)
88 switch (event
->type()) {
89 case QEvent::PolishRequest
:
91 updateColumnsWidth(true);
97 return QWidget::event(event
);
100 void KCategorizedItemsView::setFilterModel(QStandardItemModel
* model
)
102 comboFilters
->setModel(model
);
103 m_modelFilters
= model
;
106 void KCategorizedItemsView::setItemModel(QStandardItemModel
* model
)
108 if (!m_modelFilterItems
) {
109 m_modelFilterItems
= new DefaultItemFilterProxyModel(this);
112 m_modelItems
= model
;
113 m_modelFilterItems
->setSourceModel(m_modelItems
);
114 m_modelFilterItems
->setSortCaseSensitivity(Qt::CaseInsensitive
);
115 m_modelFilterItems
->sort(0);
117 itemsView
->setModel(m_modelFilterItems
);
119 if (m_modelFilterItems
->rowCount()) {
120 itemsView
->verticalScrollBar()->setSingleStep(itemsView
->sizeHintForRow(0));
124 void KCategorizedItemsView::searchTermChanged(const QString
& text
)
126 kDebug() << "EVENT\n" << text
;
127 if (m_modelFilterItems
) {
128 m_modelFilterItems
->setSearch(text
);
132 void KCategorizedItemsView::filterChanged(int index
)
134 if (m_modelFilterItems
) {
135 QVariant data
= m_modelFilters
->item(index
)->data();
136 m_modelFilterItems
->setFilter(qVariantValue
<KCategorizedItemsViewModels::Filter
>(data
));
140 void KCategorizedItemsView::updateColumnsWidth(bool force
)
142 m_viewWidth
= itemsView
->viewport()->width();
145 m_viewWidth
-= style()->pixelMetric(QStyle::PM_ScrollBarExtent
) + UNIVERSAL_PADDING
;
148 itemsView
->setColumnWidth(0, m_delegate
->columnWidth(0, m_viewWidth
));
149 itemsView
->setColumnWidth(1, m_delegate
->columnWidth(1, m_viewWidth
));
150 itemsView
->setColumnWidth(2, m_delegate
->columnWidth(2, m_viewWidth
));
153 void KCategorizedItemsView::addEmblem(const QString
& title
, QIcon
* icon
, const Filter
& filter
) {
154 m_emblems
[title
] = QPair
<Filter
, QIcon
*>(filter
, icon
);
157 void KCategorizedItemsView::clearEmblems() {
161 AbstractItem
* KCategorizedItemsView::getItemByProxyIndex(const QModelIndex
& index
) const {
162 return (AbstractItem
*) m_modelItems
->itemFromIndex(
163 m_modelFilterItems
->mapToSource(index
)
168 QList
< AbstractItem
* > KCategorizedItemsView::selectedItems() const {
169 QList
< AbstractItem
* > items
;
170 foreach (QModelIndex index
, itemsView
->selectionModel()->selectedIndexes()) {
171 if (index
.column() == 0) {
172 items
<< getItemByProxyIndex(index
);
178 #include "kcategorizeditemsview_p.moc"