• Skip to content
  • Skip to link menu
  • KDE API Reference
  • KDE Home
  • Contact Us
 

Nepomuk-Core

  • KTp
  • Widgets
contact-grid-widget.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2011 David Edmundson <kde@davidedmundson.co.uk>
3  * Copyright (C) 2012 Daniele E. Domenichelli <daniele.domenichelli@gmail.com>
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2.1 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18  */
19 
20 
21 #include "contact-grid-widget.h"
22 
23 #include <KDE/KIcon>
24 #include <KDE/KLineEdit>
25 #include <KDE/KDebug>
26 
27 #include <QtGui/QApplication>
28 #include <QtGui/QTextOption>
29 #include <QtGui/QPainter>
30 #include <QtGui/QVBoxLayout>
31 #include <QtGui/QListView>
32 
33 #include "types.h"
34 #include <KTp/Models/contacts-list-model.h>
35 #include <KTp/Models/contacts-filter-model.h>
36 
37 namespace KTp {
38 
39 class ContactGridDelegate : public QAbstractItemDelegate
40 {
41  Q_OBJECT
42  Q_DISABLE_COPY(ContactGridDelegate)
43 
44 public:
45  ContactGridDelegate(QObject *parent);
46  virtual ~ContactGridDelegate();
47 
48  virtual void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
49  virtual QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const;
50 
51 private:
52  class Private;
53  Private * const d;
54 
55 }; // class ContactGridDelegate
56 
57 } // namespace KTp
58 
59 
60 class KTp::ContactGridDelegate::Private
61 {
62 public:
63  Private(KTp::ContactGridDelegate *parent)
64  : q(parent)
65  {
66  }
67 
68  ~Private()
69  {
70  }
71 
72  KTp::ContactGridDelegate *q;
73 };
74 
75 KTp::ContactGridDelegate::ContactGridDelegate(QObject *parent)
76  : QAbstractItemDelegate(parent),
77  d(new KTp::ContactGridDelegate::Private(this))
78 {
79 }
80 
81 KTp::ContactGridDelegate::~ContactGridDelegate()
82 {
83  delete d;
84 }
85 
86 void KTp::ContactGridDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
87 {
88  QStyle *style = QApplication::style();
89  int textHeight = option.fontMetrics.height() * 2;
90 
91  style->drawPrimitive(QStyle::PE_PanelItemViewItem, &option, painter);
92 
93  QRect avatarRect = option.rect.adjusted(0, 0, 0, -textHeight);
94  QRect textRect = option.rect.adjusted(0, option.rect.height() - textHeight, 0, -3);
95 
96  QPixmap avatar;
97  avatar.load(index.data(KTp::ContactAvatarPathRole).toString());
98  if (avatar.isNull()) {
99  avatar = KIcon(QLatin1String("im-user-online")).pixmap(option.decorationSize);
100  } else if (avatar.width() > option.decorationSize.width() || avatar.height() > option.decorationSize.height()) {
101  //resize larger avatars if required
102  avatar = avatar.scaled(option.decorationSize, Qt::KeepAspectRatio);
103  //draw leaving paddings on smaller (or non square) avatars
104  }
105  style->drawItemPixmap(painter, avatarRect, Qt::AlignCenter, avatar);
106 
107 
108  QTextOption textOption;
109  textOption.setAlignment(Qt::AlignCenter);
110  textOption.setWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere);
111  painter->drawText(textRect, index.data().toString(), textOption);
112 
113 }
114 
115 QSize KTp::ContactGridDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
116 {
117  Q_UNUSED(index);
118  int textHeight = option.fontMetrics.height() * 2;
119  return QSize(option.decorationSize.width() + 4, option.decorationSize.height() + textHeight + 3);
120 }
121 
122 // -----------------------------------------------------------------------------
123 
124 class KTp::ContactGridWidget::Private
125 {
126 public:
127  Private(KTp::ContactGridWidget *parent)
128  : q(parent),
129  layout(new QVBoxLayout(parent)),
130  contactGridView(new QListView(parent)),
131  contactFilterLineEdit(new KLineEdit(parent)),
132  contactsModel(0),
133  filterModel(0)
134  {
135  }
136 
137  ~Private()
138  {
139  }
140 
141  void _k_onSelectionChanged(QItemSelection,QItemSelection);
142 
143  KTp::ContactGridWidget *q;
144  QVBoxLayout *layout;
145  QListView *contactGridView;
146  KLineEdit *contactFilterLineEdit;
147  KTp::ContactsListModel *contactsModel;
148  KTp::ContactsFilterModel *filterModel;
149 };
150 
151 void KTp::ContactGridWidget::Private::_k_onSelectionChanged(QItemSelection newSelection, QItemSelection oldSelection)
152 {
153  Q_UNUSED(oldSelection)
154  kDebug() << newSelection << oldSelection;
155 
156  if (newSelection.isEmpty()) {
157  Q_EMIT q->selectionChanged(Tp::AccountPtr(), Tp::ContactPtr());
158  return;
159  }
160 
161  Q_EMIT q->selectionChanged(q->selectedAccount(), q->selectedContact());
162 }
163 
164 // -----------------------------------------------------------------------------
165 
166 KTp::ContactGridWidget::ContactGridWidget(KTp::ContactsListModel* model, QWidget *parent)
167  : QWidget(parent),
168  d(new Private(this))
169 {
170  d->filterModel = new KTp::ContactsFilterModel(this);
171 
172  d->contactsModel = model;
173  d->filterModel->setSourceModel(d->contactsModel);
174 
175  d->contactGridView->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
176  d->contactGridView->setResizeMode(QListView::Adjust);
177  d->contactGridView->setSpacing(5);
178  d->contactGridView->setViewMode(QListView::IconMode);
179  d->contactGridView->setIconSize(QSize(80, 80));
180 
181  d->contactFilterLineEdit->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
182  d->contactFilterLineEdit->setClearButtonShown(true);
183 
184  d->layout->setMargin(0);
185  d->layout->addWidget(d->contactGridView);
186  d->layout->addWidget(d->contactFilterLineEdit);
187  setLayout(d->layout);
188 
189  d->contactGridView->setModel(d->filterModel);
190  d->contactGridView->setItemDelegate(new ContactGridDelegate(d->contactGridView));
191 
192  connect(d->contactGridView->selectionModel(),
193  SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
194  SLOT(_k_onSelectionChanged(QItemSelection,QItemSelection)));
195 
196  connect(d->contactFilterLineEdit,
197  SIGNAL(textChanged(QString)),
198  d->filterModel,
199  SLOT(setDisplayNameFilterString(QString)));
200 }
201 
202 KTp::ContactGridWidget::~ContactGridWidget()
203 {
204  delete d;
205 }
206 
207 QString KTp::ContactGridWidget::displayNameFilter() const
208 {
209  return d->contactFilterLineEdit->text();
210 }
211 
212 void KTp::ContactGridWidget::clearDisplayNameFilter()
213 {
214  setDisplayNameFilter(QString());
215 }
216 
217 void KTp::ContactGridWidget::setDisplayNameFilter(const QString& displayNameFilter)
218 {
219  if (displayNameFilter != d->contactFilterLineEdit->text()) {
220  d->contactFilterLineEdit->setText(displayNameFilter);
221  Q_EMIT displayNameFilterChanged(displayNameFilter);
222  }
223 }
224 
225 QSize KTp::ContactGridWidget::iconSize() const
226 {
227  return d->contactGridView->iconSize();
228 }
229 
230 void KTp::ContactGridWidget::setIconSize(const QSize& iconSize)
231 {
232  kDebug();
233  if (iconSize != d->contactGridView->iconSize()) {
234  d->contactGridView->setIconSize(iconSize);
235  Q_EMIT iconSizeChanged(iconSize);
236  }
237 }
238 
239 bool KTp::ContactGridWidget::hasSelection() const
240 {
241  return d->contactGridView->selectionModel()->hasSelection();
242 }
243 
244 Tp::AccountPtr KTp::ContactGridWidget::selectedAccount() const
245 {
246  return d->contactGridView->currentIndex().data(KTp::AccountRole).value<Tp::AccountPtr>();
247 }
248 
249 Tp::ContactPtr KTp::ContactGridWidget::selectedContact() const
250 {
251  return d->contactGridView->currentIndex().data(KTp::ContactRole).value<KTp::ContactPtr>();
252 }
253 
254 KTp::ContactsFilterModel* KTp::ContactGridWidget::filter() const
255 {
256  return d->filterModel;
257 }
258 
259 KLineEdit* KTp::ContactGridWidget::contactFilterLineEdit() const
260 {
261  return d->contactFilterLineEdit;
262 }
263 
264 #include "contact-grid-widget.moc"
265 #include "moc_contact-grid-widget.cpp"
This file is part of the KDE documentation.
Documentation copyright © 1996-2013 The KDE developers.
Generated on Fri Mar 22 2013 10:58:52 by doxygen 1.8.1.2 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

ktp-common-internals API Reference

Skip menu "ktp-common-internals API Reference"
Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal