Make a branch to make krunner Good Enough For Aaron™.
[kdebase/uwolfer.git] / workspace / libs / plasma / appletbrowser / kcategorizeditemsview.cpp
blobbf744348a3442fc98950462a1bcd3e113f8be9e0
1 /*
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"
23 #include <KIcon>
24 #include <KDebug>
25 #include <KAction>
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),
33 m_viewWidth(0)
35 setupUi(this);
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);
70 addAction(find);
73 KCategorizedItemsView::~KCategorizedItemsView()
75 delete m_modelFilterItems;
76 delete m_delegate;
79 void KCategorizedItemsView::resizeEvent ( QResizeEvent * event )
81 updateColumnsWidth();
83 QWidget::resizeEvent(event);
86 bool KCategorizedItemsView::event ( QEvent * event )
88 switch (event->type()) {
89 case QEvent::PolishRequest:
90 case QEvent::Polish:
91 updateColumnsWidth(true);
92 break;
93 default:
94 break;
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();
144 if (force) {
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() {
158 m_emblems.clear();
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);
175 return items;
178 #include "kcategorizeditemsview_p.moc"