~ubuntu-branches/ubuntu/wily/tupi/wily-proposed

« back to all changes in this revision

Viewing changes to src/framework/tgui/kcollapsiblewidget.cpp

  • Committer: Package Import Robot
  • Author(s): Dmitry Smirnov
  • Date: 2013-05-13 09:53:35 UTC
  • mfrom: (8.1.1 experimental)
  • Revision ID: package-import@ubuntu.com-20130513095335-3iqdvt9ne07ia25v
Tags: 0.2+git01-1
* Upload to unstable.
* Removed unnecessary versioned Build-Depends.
* Removed obsolete "DM-Upload-Allowed".
* Added Vcs links to collab-maint.
* Standards updated to version 3.9.4.
* Corrected "libavutil51"-->"libavutil-dev" in Build-Depends.
* Updated debian/watch (corrected URL, removed comments).
* Updated get-orig-source (can work from any directory).
* Updated my email address; bumped copyright years.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/***************************************************************************
2
 
 *   Project TUPI: Magia 2D                                                *
3
 
 *   Project Contact: info@maefloresta.com                                 *
4
 
 *   Project Website: http://www.maefloresta.com                           *
5
 
 *   Project Leader: Gustav Gonzalez <info@maefloresta.com>                *
6
 
 *                                                                         *
7
 
 *   Developers:                                                           *
8
 
 *   2010:                                                                 *
9
 
 *    Gustavo Gonzalez / xtingray                                          *
10
 
 *                                                                         *
11
 
 *   KTooN's versions:                                                     * 
12
 
 *                                                                         *
13
 
 *   2006:                                                                 *
14
 
 *    David Cuadrado                                                       *
15
 
 *    Jorge Cuadrado                                                       *
16
 
 *   2003:                                                                 *
17
 
 *    Fernado Roldan                                                       *
18
 
 *    Simena Dinas                                                         *
19
 
 *                                                                         *
20
 
 *   Copyright (C) 2010 Gustav Gonzalez - http://www.maefloresta.com       *
21
 
 *   License:                                                              *
22
 
 *   This program is free software; you can redistribute it and/or modify  *
23
 
 *   it under the terms of the GNU General Public License as published by  *
24
 
 *   the Free Software Foundation; either version 3 of the License, or     *
25
 
 *   (at your option) any later version.                                   *
26
 
 *                                                                         *
27
 
 *   This program is distributed in the hope that it will be useful,       *
28
 
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
29
 
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
30
 
 *   GNU General Public License for more details.                          *
31
 
 *                                                                         *
32
 
 *   You should have received a copy of the GNU General Public License     *
33
 
 *   along with this program.  If not, see <http://www.gnu.org/licenses/>. *
34
 
 ***************************************************************************/
35
 
 
36
 
#include <QTextDocument>
37
 
#include <QMimeData>
38
 
#include <QPainter>
39
 
#include <QMouseEvent>
40
 
#include <QDragEnterEvent>
41
 
#include <QVBoxLayout>
42
 
#include <QApplication>
43
 
#include <QGridLayout>
44
 
#include <QPushButton>
45
 
#include <QPainterPath>
46
 
#include <QStyleOption>
47
 
#include <QGroupBox>
48
 
#include <QFontMetrics>
49
 
 
50
 
#include "kcollapsiblewidget.h"
51
 
#include "tdebug.h"
52
 
 
53
 
/******************************************************************
54
 
 * Helper classes
55
 
 *****************************************************************/
56
 
 
57
 
class CollapsibleMimeData : public QMimeData
58
 
{
59
 
    public:
60
 
        CollapsibleMimeData();
61
 
        ~CollapsibleMimeData();
62
 
        
63
 
        void setCollapsibleWidget(KCollapsibleWidget *w);
64
 
        KCollapsibleWidget *collapsibleWidget() const;
65
 
        
66
 
    private:
67
 
        KCollapsibleWidget *m_cw;
68
 
};
69
 
 
70
 
CollapsibleMimeData::CollapsibleMimeData() : QMimeData(), m_cw(0)
71
 
{
72
 
}
73
 
 
74
 
CollapsibleMimeData::~CollapsibleMimeData()
75
 
{
76
 
}
77
 
 
78
 
void CollapsibleMimeData::setCollapsibleWidget(KCollapsibleWidget *w)
79
 
{
80
 
    m_cw = w;
81
 
}
82
 
 
83
 
KCollapsibleWidget *CollapsibleMimeData::collapsibleWidget() const
84
 
{
85
 
    return m_cw;
86
 
}
87
 
 
88
 
KClickableLabel::KClickableLabel(QWidget* parent)
89
 
    : QWidget( parent ), m_isEnter(false), m_isDragging(false), m_checked(false)
90
 
{
91
 
    setMouseTracking(false);
92
 
    
93
 
    m_text = new QTextDocument(this);
94
 
}
95
 
 
96
 
KClickableLabel::~KClickableLabel()
97
 
{
98
 
}
99
 
 
100
 
QSize KClickableLabel::sizeHint() const
101
 
{
102
 
    return m_text->size().toSize();
103
 
}
104
 
 
105
 
void KClickableLabel::setText(const QString &text)
106
 
{
107
 
    m_text->setHtml(text);
108
 
}
109
 
 
110
 
QString KClickableLabel::text() const
111
 
{
112
 
    return m_text->toPlainText();
113
 
}
114
 
 
115
 
void KClickableLabel::setChecked(bool c)
116
 
{
117
 
    m_checked = c;
118
 
}
119
 
 
120
 
bool KClickableLabel::isChecked() const
121
 
{
122
 
    return m_checked;
123
 
}
124
 
 
125
 
void KClickableLabel::mousePressEvent(QMouseEvent *e)
126
 
{
127
 
    m_isDragging = false;
128
 
    
129
 
    m_position = e->pos();
130
 
    QWidget::mousePressEvent(e);
131
 
}
132
 
 
133
 
void KClickableLabel::mouseReleaseEvent(QMouseEvent *e)
134
 
{
135
 
    if (! m_isDragging) {
136
 
        m_checked = !m_checked;
137
 
        emit clicked();
138
 
    }
139
 
}
140
 
 
141
 
void KClickableLabel::mouseMoveEvent(QMouseEvent* e)
142
 
{
143
 
    QWidget::mouseMoveEvent(e);
144
 
 
145
 
    if ((e->pos() - m_position).manhattanLength() <  QApplication::startDragDistance())
146
 
        return;
147
 
    
148
 
    QDrag *drag = new QDrag(this);
149
 
    CollapsibleMimeData *mimeData = new CollapsibleMimeData;
150
 
    KCollapsibleWidget *parent = dynamic_cast<KCollapsibleWidget *>(parentWidget());
151
 
    
152
 
    if (! parent) 
153
 
        return;
154
 
 
155
 
    QWidget *inner = parent->innerWidget();
156
 
 
157
 
    if (! inner) 
158
 
        return;
159
 
    
160
 
    mimeData->setCollapsibleWidget(parent);
161
 
    
162
 
    QPixmap wpx = QPixmap::grabWidget(parent);
163
 
    QPainter p(&wpx);
164
 
    
165
 
    p.drawRoundRect(wpx.rect(), 10, 10);
166
 
    
167
 
    drag->setPixmap(wpx);
168
 
    drag->setMimeData(mimeData);
169
 
    
170
 
    m_isDragging = true;
171
 
}
172
 
 
173
 
void KClickableLabel::paintEvent(QPaintEvent *e)
174
 
{
175
 
    QPainter painter(this);
176
 
 
177
 
    if (m_isEnter) {
178
 
        painter.save();
179
 
        
180
 
        QRect r = rect();
181
 
    
182
 
        double h = r.height();
183
 
        double h2 = r.height() / 2.0;
184
 
        QPainterPath path;
185
 
        path.addRect(r.x() + h2, r.y() + 0, r.width() - h2 * 2, r.height());
186
 
        path.addEllipse(r.x(), r.y(), h, h);
187
 
        path.addEllipse(r.x() + r.width() - h, r.y(), h, h);
188
 
        path.setFillRule(Qt::WindingFill);
189
 
        painter.setPen(Qt::NoPen);
190
 
        painter.setBrush( palette().brush(QPalette::Highlight) );
191
 
        painter.setRenderHint(QPainter::Antialiasing);
192
 
        painter.drawPath(path);
193
 
        
194
 
        painter.restore();
195
 
    }
196
 
    
197
 
    QRect r = rect();
198
 
    r.setX((int) (r.x() + m_text->textWidth())/2);
199
 
    
200
 
    m_text->drawContents(&painter, r);
201
 
    
202
 
    painter.end();
203
 
    QWidget::paintEvent(e);
204
 
}
205
 
 
206
 
void KClickableLabel::enterEvent(QEvent * e)
207
 
{
208
 
    m_isEnter = true;
209
 
    update();
210
 
    QWidget::enterEvent(e);
211
 
}
212
 
 
213
 
void KClickableLabel::leaveEvent(QEvent *e)
214
 
{
215
 
    m_isEnter = false;
216
 
    update();
217
 
    QWidget::leaveEvent(e);
218
 
}
219
 
 
220
 
/******************************************************************
221
 
 * Private classes
222
 
 *****************************************************************/
223
 
 
224
 
class KCollapsibleWidget::Private
225
 
{
226
 
    public:
227
 
        QGridLayout    *cwlayout;
228
 
        QWidget        *innerWidget;
229
 
        KClickableLabel *label;
230
 
};
231
 
 
232
 
class KSettingsContainer::Private
233
 
{
234
 
    public:
235
 
        QVBoxLayout *layout;
236
 
        QList<KCollapsibleWidget *> collapsibles;
237
 
};
238
 
 
239
 
/******************************************************************
240
 
 * Implementation
241
 
 *****************************************************************/
242
 
 
243
 
KSettingsContainer::KSettingsContainer(QWidget *parent)
244
 
    : QScrollArea(parent), k(new KSettingsContainer::Private)
245
 
{
246
 
    QWidget *w = new QWidget;
247
 
    QVBoxLayout *helperLay = new QVBoxLayout(w);
248
 
    k->layout = new QVBoxLayout;
249
 
    helperLay->addLayout(k->layout);
250
 
    helperLay->addStretch(2);
251
 
    setWidget(w);
252
 
    setWidgetResizable(true);
253
 
    
254
 
    setAcceptDrops(true);
255
 
}
256
 
 
257
 
KSettingsContainer::~KSettingsContainer()
258
 
{
259
 
    delete k;
260
 
}
261
 
 
262
 
KCollapsibleWidget* KSettingsContainer::insertWidget(QWidget *w, const QString& name)
263
 
{
264
 
    if (w && w->layout()) {
265
 
        QLayout *lay = w->layout();
266
 
        lay->setMargin(2);
267
 
        lay->setSpacing(0);
268
 
    }
269
 
 
270
 
    KCollapsibleWidget *cw = new KCollapsibleWidget(name);
271
 
    
272
 
    k->layout->addWidget(cw);
273
 
    cw->setInnerWidget(w);
274
 
    
275
 
    k->collapsibles << cw;
276
 
    
277
 
    cw->show();
278
 
    
279
 
    return cw;
280
 
}
281
 
 
282
 
void KSettingsContainer::removeWidget(QWidget *w)
283
 
{
284
 
    foreach (KCollapsibleWidget *cw, k->collapsibles) {
285
 
             if (cw->innerWidget() == w) {
286
 
                 k->collapsibles.removeAll(cw );
287
 
                 k->layout->removeWidget(cw);
288
 
            
289
 
                 break;
290
 
             }
291
 
    }
292
 
}
293
 
 
294
 
void KSettingsContainer::dragEnterEvent(QDragEnterEvent * event)
295
 
{
296
 
    setFocus();
297
 
    
298
 
    if (dynamic_cast<const CollapsibleMimeData *>(event->mimeData())) {
299
 
        if (event->source() == this) {
300
 
            event->setDropAction(Qt::MoveAction);
301
 
            event->accept();
302
 
        } else {
303
 
            event->acceptProposedAction();
304
 
        }
305
 
    } else {
306
 
        event->ignore();
307
 
    }
308
 
}
309
 
 
310
 
void KSettingsContainer::dragMoveEvent(QDragMoveEvent* event)
311
 
{
312
 
    if (dynamic_cast<const CollapsibleMimeData *>(event->mimeData()))
313
 
        event->acceptProposedAction();
314
 
    else
315
 
        event->ignore();
316
 
}
317
 
 
318
 
void KSettingsContainer::dropEvent(QDropEvent* event)
319
 
{
320
 
    if (const CollapsibleMimeData *mimeData = dynamic_cast<const CollapsibleMimeData *>(event->mimeData())) {
321
 
        k->layout->removeWidget( mimeData->collapsibleWidget());
322
 
        
323
 
        QWidget *child = childAt(event->pos());
324
 
        
325
 
        if (child) {
326
 
            if (KCollapsibleWidget *prev = dynamic_cast< KCollapsibleWidget *>(child)) {
327
 
                k->layout->insertWidget( k->layout->indexOf(prev)+1, mimeData->collapsibleWidget());
328
 
            } else if (KCollapsibleWidget *prev = dynamic_cast< KCollapsibleWidget *>(child->parentWidget())) {
329
 
                k->layout->insertWidget( k->layout->indexOf(prev)+1, mimeData->collapsibleWidget());
330
 
            } else {
331
 
                k->layout->addWidget(mimeData->collapsibleWidget());
332
 
            }
333
 
        } else {
334
 
            k->layout->addWidget(mimeData->collapsibleWidget());
335
 
        }
336
 
        
337
 
        if (event->source() == this) {
338
 
            event->setDropAction(Qt::MoveAction);
339
 
            event->accept();
340
 
        } else {
341
 
            event->acceptProposedAction();
342
 
        }
343
 
    } else {
344
 
        event->ignore();
345
 
    }
346
 
}
347
 
 
348
 
KCollapsibleWidget::KCollapsibleWidget(QWidget *parent)
349
 
    : QWidget(parent), k(new KCollapsibleWidget::Private)
350
 
{
351
 
    init();
352
 
}
353
 
 
354
 
KCollapsibleWidget::KCollapsibleWidget(const QString& caption, QWidget *parent)
355
 
    : QWidget(parent), k(new KCollapsibleWidget::Private)
356
 
{
357
 
    init();
358
 
    setCaption(caption);
359
 
}
360
 
 
361
 
void KCollapsibleWidget::init()
362
 
{
363
 
    k->innerWidget = 0;
364
 
    k->cwlayout = new QGridLayout(this);
365
 
    k->cwlayout->setMargin(0);
366
 
    
367
 
    k->label = new KClickableLabel;
368
 
    k->label->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred);
369
 
    
370
 
    k->cwlayout->addWidget(k->label, 1, 1);
371
 
    
372
 
    connect(k->label, SIGNAL(clicked()), this, SLOT(toggleExpanded()));
373
 
    
374
 
    setExpanded(false);
375
 
    setEnabled(false);
376
 
}
377
 
 
378
 
KCollapsibleWidget::~KCollapsibleWidget()
379
 
{
380
 
    delete k;
381
 
}
382
 
 
383
 
QWidget* KCollapsibleWidget::innerWidget() const
384
 
{
385
 
    return k->innerWidget;
386
 
}
387
 
 
388
 
void KCollapsibleWidget::setInnerWidget(QWidget *w)
389
 
{
390
 
    if (!w) 
391
 
        return;
392
 
    
393
 
    QGroupBox *container = new QGroupBox(this);
394
 
    w->setParent(container);
395
 
    
396
 
    QVBoxLayout *containerLayout = new QVBoxLayout(container);
397
 
    k->innerWidget = w;
398
 
    
399
 
    containerLayout->addWidget(w);
400
 
 
401
 
    k->cwlayout->addWidget(container, 2, 1);
402
 
    k->cwlayout->setRowStretch(2, 1);
403
 
    
404
 
    setEnabled(true);
405
 
    setExpanded(isExpanded());
406
 
}
407
 
 
408
 
void KCollapsibleWidget::setCaption(const QString& caption)
409
 
{
410
 
    k->label->setText(QString("<b>%1</b>").arg(caption));
411
 
}
412
 
 
413
 
QString KCollapsibleWidget::caption() const
414
 
{
415
 
    return k->label->text();
416
 
}
417
 
 
418
 
void KCollapsibleWidget::setExpanded(bool expanded)
419
 
{
420
 
    if (k->innerWidget) {
421
 
 
422
 
        setUpdatesEnabled(false);
423
 
 
424
 
        k->innerWidget->parentWidget()->setVisible(expanded);
425
 
        k->innerWidget->setVisible(expanded);
426
 
        k->label->setChecked(expanded);
427
 
        
428
 
        setUpdatesEnabled(true);
429
 
    }
430
 
}
431
 
 
432
 
bool KCollapsibleWidget::isExpanded() const
433
 
{
434
 
    return k->label->isChecked();
435
 
}
436
 
 
437
 
void KCollapsibleWidget::toggleExpanded()
438
 
{
439
 
    setExpanded(k->label->isChecked());
440
 
}