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

kopete/libkopete

  • sources
  • kde-4.12
  • kdenetwork
  • kopete
  • libkopete
  • ui
collapsiblewidget.cpp
Go to the documentation of this file.
1 /*
2  This file is part of the KDE libraries
3  Copyright (C) 2005 Daniel Molkentin <molkentin@kde.org>
4 
5  This library is free software; you can redistribute it and/or
6  modify it under the terms of the GNU Library General Public
7  License version 2 as published by the Free Software Foundation.
8 
9  This library 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 GNU
12  Library General Public License for more details.
13 
14  You should have received a copy of the GNU Library General Public License
15  along with this library; see the file COPYING.LIB. If not, write to
16  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  Boston, MA 02110-1301, USA.
18 */
19 
20 #include <QtGui>
21 #include <QTimeLine>
22 #include <collapsiblewidget.h>
23 
24 /******************************************************************
25  * Helper classes
26  *****************************************************************/
27 
28 ClickableLabel::ClickableLabel( QWidget* parent )
29  : QLabel( parent )
30 {
31 }
32 
33 ClickableLabel::~ClickableLabel()
34 {
35 }
36 
37 void ClickableLabel::mouseReleaseEvent( QMouseEvent *e )
38 {
39  Q_UNUSED( e );
40  emit clicked();
41 }
42 
43 ArrowButton::ArrowButton( QWidget *parent )
44 : QAbstractButton( parent )
45 {
46 }
47 
48 
49 ArrowButton::~ArrowButton()
50 {
51 }
52 
53 void ArrowButton::paintEvent( QPaintEvent *event )
54 {
55  Q_UNUSED( event );
56  QPainter p( this );
57  QStyleOption opt;
58  int h = sizeHint().height();
59  opt.rect = QRect(0,( height()- h )/2, h, h);
60  opt.palette = palette();
61  opt.state = QStyle::State_Children;
62  if (isChecked())
63  opt.state |= QStyle::State_Open;
64 
65  style()->drawPrimitive(QStyle::PE_IndicatorBranch, &opt, &p);
66  p.end();
67 }
68 
69 
70 /******************************************************************
71  * Private classes
72  *****************************************************************/
73 
74 class CollapsibleWidget::Private
75 {
76  public:
77  QGridLayout *gridLayout;
78  QWidget *innerWidget;
79  ClickableLabel *label;
80  ArrowButton *colButton;
81  QTimeLine *timeline;
82  QWidget *expander;
83  QVBoxLayout *expanderLayout;
84 };
85 
86 class SettingsContainer::Private
87 {
88  public:
89  QVBoxLayout *layout;
90 };
91 
92 /******************************************************************
93  * Implementation
94  *****************************************************************/
95 
96 SettingsContainer::SettingsContainer(QWidget *parent)
97  : QScrollArea( parent ), d(new SettingsContainer::Private)
98 {
99  QWidget *w = new QWidget;
100  QVBoxLayout *helperLay = new QVBoxLayout(w);
101  d->layout = new QVBoxLayout;
102  helperLay->addLayout( d->layout );
103  helperLay->addStretch(1);
104  setWidget(w);
105  setWidgetResizable(true);
106 }
107 
108 SettingsContainer::~SettingsContainer()
109 {
110  delete d;
111 }
112 
113 CollapsibleWidget* SettingsContainer::insertWidget( QWidget *w, const QString& name )
114 {
115  if (w && w->layout()) {
116  QLayout *lay = w->layout();
117  lay->setMargin(2);
118  lay->setSpacing(0);
119  }
120 
121  CollapsibleWidget *cw = new CollapsibleWidget( name );
122  d->layout->addWidget( cw );
123  cw->setInnerWidget( w );
124  return cw;
125 }
126 
127 CollapsibleWidget::CollapsibleWidget(QWidget *parent)
128  : QWidget(parent), d(new CollapsibleWidget::Private)
129 {
130  init();
131 }
132 CollapsibleWidget::CollapsibleWidget(const QString& caption, QWidget *parent)
133  : QWidget(parent), d(new CollapsibleWidget::Private)
134 {
135  init();
136  setCaption(caption);
137 }
138 
139 void CollapsibleWidget::init()
140 {
141  d->expander = 0;
142  d->expanderLayout = 0;
143  d->timeline = new QTimeLine( 150, this );
144  d->timeline->setCurveShape( QTimeLine::EaseInOutCurve );
145  connect( d->timeline, SIGNAL(valueChanged(qreal)),
146  this, SLOT(animateCollapse(qreal)) );
147 
148  d->innerWidget = 0;
149  d->gridLayout = new QGridLayout( this );
150  d->gridLayout->setMargin(0);
151 
152  d->colButton = new ArrowButton;
153  d->colButton->setCheckable(true);
154 
155  d->label = new ClickableLabel;
156  d->label->setSizePolicy(QSizePolicy::MinimumExpanding,
157  QSizePolicy::Preferred);
158 
159  d->gridLayout->addWidget(d->colButton, 1, 1);
160  d->gridLayout->addWidget(d->label, 1, 2);
161 
162 
163  connect(d->label, SIGNAL(clicked()),
164  d->colButton, SLOT(click()));
165 
166  connect(d->colButton, SIGNAL(toggled(bool)),
167  SLOT(setExpanded(bool)));
168 
169  setExpanded(false);
170  setEnabled(false);
171 }
172 
173 CollapsibleWidget::~CollapsibleWidget()
174 {
175  delete d;
176 }
177 
178 QWidget* CollapsibleWidget::innerWidget() const
179 {
180  return d->innerWidget;
181 }
182 
183 //#define SIMPLE
184 
185 void CollapsibleWidget::setInnerWidget(QWidget *w)
186 {
187  if (!w) {
188  return;
189  }
190 
191  //bool first = d->innerWidget == 0;
192  d->innerWidget = w;
193 
194 #ifdef SIMPLE
195  if ( !isExpanded() ) {
196  d->innerWidget->hide();
197  }
198  d->gridLayout->addWidget( d->innerWidget, 2, 2 );
199  d->gridLayout->setRowStretch( 2, 1 );
200 #else
201  if ( !d->expander ) {
202  d->expander = new QWidget( this );
203  d->expander->setSizePolicy(QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Minimum));
204  d->gridLayout->addWidget( d->expander, 2, 2 );
205  d->gridLayout->setRowStretch( 2, 1 );
206  d->expanderLayout = new QVBoxLayout( d->expander );
207  d->expanderLayout->setMargin( 0 );
208  d->expanderLayout->setSpacing( 0 );
209  d->expander->setFixedHeight( 0 );
210  }
211 
212  d->innerWidget->setParent( d->expander );
213  d->innerWidget->show();
214  d->expanderLayout->addWidget( d->innerWidget );
215 #endif
216 
217  setEnabled( true );
218 
219  if ( isExpanded() ) {
220  setExpanded( true );
221  }
222 }
223 
224 void CollapsibleWidget::setCaption(const QString& caption)
225 {
226  d->label->setText(QString("<b>%1</b>").arg(caption));
227 }
228 
229 QString CollapsibleWidget::caption() const
230 {
231  return d->label->text();
232 }
233 
234 
235 void CollapsibleWidget::setExpanded(bool expanded)
236 {
237  if ( !d->innerWidget ) {
238  return;
239  }
240 
241 #ifdef SIMPLE
242  if ( !expanded ) {
243  d->innerWidget->setVisible( false );
244  }
245 #else
246  if ( expanded ) {
247  d->expander->setVisible( true );
248  }
249  d->innerWidget->setVisible( expanded );
250 #endif
251  d->colButton->setChecked( expanded );
252  d->timeline->setDirection( expanded ? QTimeLine::Forward
253  : QTimeLine::Backward );
254  d->timeline->start();
255 }
256 
257 void CollapsibleWidget::animateCollapse( qreal showAmount )
258 {
259  int pixels = d->innerWidget->sizeHint().height() * showAmount;
260  d->gridLayout->setRowMinimumHeight( 2, pixels );
261 
262 #ifdef SIMPLE
263  d->gridLayout->setRowMinimumHeight( 2, pixels );
264 
265  if ( showAmount == 1 ) {
266  d->innerWidget->setVisible( true );
267  }
268 #else
269  d->expander->setFixedHeight( pixels );
270  if (parentWidget() && parentWidget()->layout())
271  parentWidget()->layout()->update();
272 #endif
273 }
274 
275 bool CollapsibleWidget::isExpanded() const
276 {
277  return d->colButton->isChecked();
278 }
279 
280 
281 #include "collapsiblewidget.moc"
QAbstractButton
ArrowButton::paintEvent
void paintEvent(QPaintEvent *)
Definition: collapsiblewidget.cpp:53
CollapsibleWidget::caption
QString caption() const
Definition: collapsiblewidget.cpp:229
SettingsContainer::insertWidget
CollapsibleWidget * insertWidget(QWidget *w, const QString &name)
Definition: collapsiblewidget.cpp:113
QWidget
CollapsibleWidget
A widget that has a caption and a collapsible widget.
Definition: collapsiblewidget.h:65
QScrollArea
CollapsibleWidget::setCaption
void setCaption(const QString &caption)
Definition: collapsiblewidget.cpp:224
ClickableLabel::~ClickableLabel
~ClickableLabel()
Definition: collapsiblewidget.cpp:33
CollapsibleWidget::setExpanded
void setExpanded(bool collapsed)
Definition: collapsiblewidget.cpp:235
ArrowButton
Definition: collapsiblewidget.h:47
ClickableLabel
Definition: collapsiblewidget.h:34
CollapsibleWidget::innerWidget
QWidget * innerWidget() const
Definition: collapsiblewidget.cpp:178
collapsiblewidget.h
CollapsibleWidget::~CollapsibleWidget
~CollapsibleWidget()
Definition: collapsiblewidget.cpp:173
ArrowButton::~ArrowButton
~ArrowButton()
Definition: collapsiblewidget.cpp:49
ClickableLabel::ClickableLabel
ClickableLabel(QWidget *parent=0)
Definition: collapsiblewidget.cpp:28
CollapsibleWidget::CollapsibleWidget
CollapsibleWidget(QWidget *parent=0)
Definition: collapsiblewidget.cpp:127
ClickableLabel::mouseReleaseEvent
void mouseReleaseEvent(QMouseEvent *e)
Definition: collapsiblewidget.cpp:37
SettingsContainer
A scrollable container that contains groups of settings, usually in the form of CollapsibleWidgets.
Definition: collapsiblewidget.h:104
ArrowButton::sizeHint
QSize sizeHint() const
Definition: collapsiblewidget.h:53
SettingsContainer::SettingsContainer
SettingsContainer(QWidget *parent=0)
Definition: collapsiblewidget.cpp:96
QLabel
CollapsibleWidget::setInnerWidget
void setInnerWidget(QWidget *w)
Definition: collapsiblewidget.cpp:185
CollapsibleWidget::isExpanded
bool isExpanded() const
Definition: collapsiblewidget.cpp:275
ArrowButton::ArrowButton
ArrowButton(QWidget *parent=0)
Definition: collapsiblewidget.cpp:43
ClickableLabel::clicked
void clicked()
CollapsibleWidget::init
void init()
Definition: collapsiblewidget.cpp:139
SettingsContainer::~SettingsContainer
~SettingsContainer()
Definition: collapsiblewidget.cpp:108
name
const char * name
Definition: kopeteonlinestatus.cpp:104
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:53:50 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kopete/libkopete

Skip menu "kopete/libkopete"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdenetwork API Reference

Skip menu "kdenetwork API Reference"
  • kget
  • kopete
  •   kopete
  •   libkopete
  • krdc
  • krfb

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