Font of the Inputline is now configurable. Closing BR #121.
[quassel.git] / src / qtui / topicbutton.cpp
1 /***************************************************************************
2  *   Copyright (C) 2005/06 by the Quassel Project                          *
3  *   devel@quassel-irc.org                                                 *
4  *                                                                         *
5  *   This program is free software; you can redistribute it and/or modify  *
6  *   it under the terms of the GNU General Public License as published by  *
7  *   the Free Software Foundation; either version 2 of the License, or     *
8  *   (at your option) version 3.                                           *
9  *                                                                         *
10  *   This program 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         *
13  *   GNU General Public License for more details.                          *
14  *                                                                         *
15  *   You should have received a copy of the GNU General Public License     *
16  *   along with this program; if not, write to the                         *
17  *   Free Software Foundation, Inc.,                                       *
18  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
19  ***************************************************************************/
20
21 #include "topicbutton.h"
22
23
24 #include <QDebug>
25
26 #include <QApplication>
27 #include <QPainter>
28 #include <QHBoxLayout>
29 #include <QFont>
30 #include <QFontMetrics>
31
32 #include "qtui.h"
33 #include "message.h"
34
35 TopicButton::TopicButton(QWidget *parent)
36   : QAbstractButton(parent)
37 {
38   setFixedHeight(QFontMetrics(qApp->font()).height());
39   setToolTip("Click to edit!");
40 }
41
42 void TopicButton::paintEvent(QPaintEvent *event) {
43   Q_UNUSED(event);
44
45   QPainter painter(this);
46   painter.setBackgroundMode(Qt::OpaqueMode);
47
48   QRect drawRect = rect();
49   QRect brect;
50   QString textPart;
51   foreach(QTextLayout::FormatRange fr, styledText.formats) {
52     textPart = styledText.text.mid(fr.start, fr.length);
53     painter.setFont(fr.format.font());
54     painter.setPen(QPen(fr.format.foreground(), 0));
55     painter.setBackground(fr.format.background());
56     painter.drawText(drawRect, Qt::AlignLeft|Qt::TextSingleLine, textPart, &brect);
57     drawRect.setLeft(brect.right());
58   }
59 }
60
61 void TopicButton::setAndStyleText(const QString &text) {
62   if(QAbstractButton::text() == text)
63     return;
64
65   setText(text); // this triggers a repaint event
66
67   styledText = QtUi::style()->styleString(Message::mircToInternal(text));
68   int height = 1;
69   foreach(QTextLayout::FormatRange fr, styledText.formats) {
70     height = qMax(height, QFontMetrics(fr.format.font()).height());
71   }
72
73   // ensure the button is editable (height != 1) if there is no text to show
74   if(text.isEmpty())
75     height = QFontMetrics(qApp->font()).height();
76   
77   setFixedHeight(height);
78 }
79