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

GroupingDesktop

  • sources
  • kde-4.14
  • workspace
  • kdeplasma-addons
  • containments
  • groupingdesktop
  • lib
  • groupexplorer
groupicon.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2009 by Ana CecĂ­lia Martins <anaceciliamb@gmail.com>
3  * Copyright (C) 2010 by Chani Armitage <chani@kde.org>
4  * Copyright 2010 by Giulio Camuffo <giuliocamuffo@gmail.com>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU Library/Lesser General Public License
8  * version 2, or (at your option) any later version, as published by the
9  * Free Software Foundation
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details
15  *
16  * You should have received a copy of the GNU Library/Lesser General Public
17  * License along with this program; if not, write to the
18  * Free Software Foundation, Inc.,
19  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20  */
21 
22 #include "groupicon.h"
23 
24 #include <QApplication>
25 #include <QCursor>
26 #include <QFontMetrics>
27 #include <QGraphicsSceneMouseEvent>
28 #include <QStyleOptionGraphicsItem>
29 #include <QPainter>
30 
31 #include <KIconLoader>
32 #include <KIcon>
33 #include <KGlobalSettings>
34 
35 #include <Plasma/FrameSvg>
36 #include <Plasma/Theme>
37 #include <Plasma/PaintUtils>
38 #include <QWidget>
39 
40 #include "abstractgroup.h"
41 
42 GroupIcon::GroupIcon(const QString &name)
43  : QGraphicsWidget(0),
44  m_background(new Plasma::FrameSvg(this)),
45  m_id(name),
46  m_iconHeight(DEFAULT_ICON_SIZE)
47 {
48  setCacheMode(DeviceCoordinateCache);
49  setAcceptHoverEvents(true);
50  m_background->setImagePath("widgets/background");
51 
52  GroupInfo gi = AbstractGroup::groupInfo(name);
53  m_name = gi.prettyName();
54  m_icon = KIcon(gi.icon());
55  setCursor(Qt::OpenHandCursor);
56 }
57 
58 GroupIcon::~GroupIcon()
59 {
60 }
61 
62 void GroupIcon::resizeEvent(QGraphicsSceneResizeEvent *)
63 {
64  m_background->resizeFrame(size());
65  qreal l, t, r, b;
66  m_background->getMargins(l, t, r, b);
67  setContentsMargins(l, t, r, b);
68 }
69 
70 QSizeF GroupIcon::sizeHint(Qt::SizeHint which, const QSizeF &constraint) const
71 {
72  if (which == Qt::MinimumSize || which == Qt::PreferredSize) {
73  qreal l, t, r, b;
74  getContentsMargins(&l, &t, &r, &b);
75  QFontMetrics fm(font());
76  const int minHeight = m_iconHeight + 2 + fm.height();
77  QSizeF s(qMax(m_iconHeight, fm.width(m_name)) + l + r, minHeight + t + b);
78  return s;
79  }
80 
81  return QGraphicsWidget::sizeHint(which, constraint);
82 }
83 
84 
85 void GroupIcon::setIconSize(int height)
86 {
87  m_iconHeight = height;
88  updateGeometry();
89  update();
90 }
91 
92 void GroupIcon::hoverEnterEvent(QGraphicsSceneHoverEvent *)
93 {
94  emit hoverEnter(this);
95 }
96 
97 void GroupIcon::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
98 {
99  if (event->button() != Qt::LeftButton &&
100  (event->pos() - event->buttonDownPos(Qt::LeftButton)).toPoint().manhattanLength() > QApplication::startDragDistance()) {
101  event->accept();
102  QMimeData *data = new QMimeData();
103  if (data) {
104  data->setData(AbstractGroup::mimeType(), m_id.toAscii());
105  if (!data->formats().isEmpty()) {
106  QDrag *drag = new QDrag(event->widget());
107  QPixmap p = m_icon.pixmap(QSize(KIconLoader::SizeLarge, KIconLoader::SizeLarge));
108  drag->setPixmap(p);
109 
110  drag->setMimeData(data);
111  drag->exec(); // krazy:exclude=crashy
112 
113  setCursor(Qt::OpenHandCursor);
114  } else {
115  delete data;
116  }
117  }
118  }
119 }
120 
121 void GroupIcon::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
122 {
123  Q_UNUSED(event)
124  if (isDraggable()) {
125  setCursor(Qt::OpenHandCursor);
126  }
127 }
128 
129 void GroupIcon::mousePressEvent(QGraphicsSceneMouseEvent *event)
130 {
131  Q_UNUSED(event)
132  if (isDraggable()) {
133  setCursor(Qt::ClosedHandCursor);
134  }
135 }
136 
137 bool GroupIcon::isDraggable() const
138 {
139  return cursor().shape() == Qt::OpenHandCursor ||
140  cursor().shape() == Qt::ClosedHandCursor;
141 }
142 
143 void GroupIcon::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
144 {
145  Q_UNUSED(option)
146  Q_UNUSED(widget)
147 
148  m_background->paintFrame(painter, option->rect, option->rect);
149  const QRectF rect = contentsRect();
150  const int width = rect.width();
151  const int height = rect.height();
152 
153  QRectF textRect(rect.x(), rect.y(), width, height - m_iconHeight - 2);
154  QRect iconRect(rect.x() + qMax(0, (width / 2) - (m_iconHeight / 2)), textRect.bottom() + 2, m_iconHeight, m_iconHeight);
155  //QRectF textRect(rect.x(), iconRect.bottom() + 2, width, height - iconRect.height() - 2);
156 
157  painter->setPen(Plasma::Theme::defaultTheme()->color(Plasma::Theme::TextColor));
158  painter->setFont(font());
159 
160  int flags = Qt::AlignTop;// | Qt::TextWordWrap;
161  QFontMetrics fm(font());
162  if (fm.width(m_name) < textRect.width()) {
163  flags |= Qt::AlignCenter;
164  }
165 
166  if (!m_name.isEmpty() && qGray(painter->pen().color().rgb()) < 192) {
167  const QRectF haloRect = fm.boundingRect(textRect.toAlignedRect(), flags, m_name);
168  Plasma::PaintUtils::drawHalo(painter, haloRect);
169  }
170 
171  painter->drawPixmap(iconRect, m_icon.pixmap(QSize(m_iconHeight, m_iconHeight)));
172  painter->drawText(textRect, flags, m_name);
173 }
174 
175 #include "groupicon.moc"
QGraphicsWidget::updateGeometry
virtual void updateGeometry()
QWidget
GroupInfo::icon
QString icon() const
Definition: groupinfo.cpp:82
QDrag::setMimeData
void setMimeData(QMimeData *data)
QGraphicsWidget::getContentsMargins
virtual void getContentsMargins(qreal *left, qreal *top, qreal *right, qreal *bottom) const
QRectF::x
qreal x() const
QRectF::y
qreal y() const
QDrag::setPixmap
void setPixmap(const QPixmap &pixmap)
QGraphicsWidget::sizeHint
virtual QSizeF sizeHint(Qt::SizeHint which, const QSizeF &constraint) const
QGraphicsItem::setAcceptHoverEvents
void setAcceptHoverEvents(bool enabled)
GroupIcon::hoverEnterEvent
void hoverEnterEvent(QGraphicsSceneHoverEvent *event)
Definition: groupicon.cpp:92
GroupIcon::resizeEvent
void resizeEvent(QGraphicsSceneResizeEvent *event)
Definition: groupicon.cpp:62
QFontMetrics
QGraphicsSceneEvent::widget
QWidget * widget() const
abstractgroup.h
GroupIcon::setIconSize
void setIconSize(int height)
Definition: groupicon.cpp:85
GroupIcon::sizeHint
QSizeF sizeHint(Qt::SizeHint which, const QSizeF &constraint) const
Definition: groupicon.cpp:70
QMimeData
QGraphicsItem::update
void update(const QRectF &rect)
QGraphicsWidget::setContentsMargins
void setContentsMargins(qreal left, qreal top, qreal right, qreal bottom)
QGraphicsWidget::size
QSizeF size() const
QGraphicsItem::setCursor
void setCursor(const QCursor &cursor)
QDrag::exec
Qt::DropAction exec(QFlags< Qt::DropAction > supportedActions)
AbstractGroup::groupInfo
static GroupInfo groupInfo(const QString &name)
Definition: abstractgroup.cpp:855
QGraphicsWidget::font
QFont font() const
QPen::color
QColor color() const
QRect
QFontMetrics::boundingRect
QRect boundingRect(QChar ch) const
QPainter::setFont
void setFont(const QFont &font)
GroupIcon::isDraggable
bool isDraggable() const
Definition: groupicon.cpp:137
QGraphicsItem::cursor
QCursor cursor() const
QColor::rgb
QRgb rgb() const
QPainter::setPen
void setPen(const QColor &color)
QGraphicsSceneMouseEvent
QPainter::drawPixmap
void drawPixmap(const QRectF &target, const QPixmap &pixmap, const QRectF &source)
QList::isEmpty
bool isEmpty() const
QPainter
QDrag
QString::isEmpty
bool isEmpty() const
GroupIcon::hoverEnter
void hoverEnter(GroupIcon *icon)
QPainter::drawText
void drawText(const QPointF &position, const QString &text)
QGraphicsWidget
QGraphicsSceneMouseEvent::button
Qt::MouseButton button() const
QString
GroupIcon::mousePressEvent
void mousePressEvent(QGraphicsSceneMouseEvent *event)
Definition: groupicon.cpp:129
QGraphicsItem::flags
GraphicsItemFlags flags() const
GroupIcon::mouseMoveEvent
void mouseMoveEvent(QGraphicsSceneMouseEvent *event)
Definition: groupicon.cpp:97
QGraphicsSceneResizeEvent
GroupIcon::mouseReleaseEvent
void mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
Definition: groupicon.cpp:121
QGraphicsSceneHoverEvent
GroupIcon::GroupIcon
GroupIcon(const QString &name)
Definition: groupicon.cpp:42
QPixmap
GroupInfo::prettyName
QString prettyName() const
Definition: groupinfo.cpp:72
groupicon.h
QSize
QFontMetrics::width
int width(const QString &text, int len) const
AbstractGroup::mimeType
static QString mimeType()
Definition: abstractgroup.cpp:834
QGraphicsItem::data
QVariant data(int key) const
QRectF::width
qreal width() const
QGraphicsItem::setCacheMode
void setCacheMode(CacheMode mode, const QSize &logicalCacheSize)
QSizeF
QRectF
QGraphicsWidget::rect
QRectF rect() const
QFontMetrics::height
int height() const
QMimeData::formats
virtual QStringList formats() const
QStyleOptionGraphicsItem
QRectF::height
qreal height() const
GroupIcon::paint
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget=0)
Definition: groupicon.cpp:143
QGraphicsLayoutItem::contentsRect
QRectF contentsRect() const
QMimeData::setData
void setData(const QString &mimeType, const QByteArray &data)
GroupInfo
Definition: groupinfo.h:30
QPainter::pen
const QPen & pen() const
QString::toAscii
QByteArray toAscii() const
GroupIcon::~GroupIcon
~GroupIcon()
Definition: groupicon.cpp:58
QApplication::startDragDistance
int startDragDistance()
QCursor::shape
Qt::CursorShape shape() const
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:42:57 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

GroupingDesktop

Skip menu "GroupingDesktop"
  • Main Page
  • Namespace List
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

workspace API Reference

Skip menu "workspace API Reference"
  • kdeplasma-addons
  •       GroupingDesktop
  •     liblancelot

Search



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