1
/***************************************************************************
2
* Copyright (C) 2012-2014 by Savoir-Faire Linux *
3
* Author : Emmanuel Lepage Valle <emmanuel.lepage@savoirfairelinux.com >*
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 3 of the License, or *
8
* (at your option) any later version. *
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. *
15
* You should have received a copy of the GNU General Public License *
16
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
17
**************************************************************************/
18
#include "overlaytoolbar.h"
21
#include <QtGui/QPaintEvent>
22
#include <QtGui/QPainter>
23
#include <QtGui/QBrush>
25
#include <QtGui/QScrollBar>
26
#include <QtSvg/QSvgRenderer>
27
#include <QtGui/QHBoxLayout>
28
#include <QtGui/QStyle>
29
#include <KDebug> //TODO remove
32
#include <KStandardDirs>
37
#include "extendedaction.h"
38
#include <klib/tipmanager.h>
41
ObserverToolButton::ObserverToolButton(QWidget* parent) : QToolButton(parent)
43
QPalette pal = palette();
44
pal.setColor(QPalette::Background,Qt::transparent);
45
pal.setColor(QPalette::Button ,Qt::transparent);
46
pal.setColor(QPalette::ButtonText,"#dddddd");
51
OverlayToolbar::OverlayToolbar(QWidget* parent) : QWidget(parent),m_pRightRender(nullptr),
52
m_pLeftRender(nullptr),m_pForcedParent(nullptr),m_IconSize(-1)
54
QPalette pal = palette();
55
pal.setColor(QPalette::Background,Qt::transparent);
56
pal.setColor(QPalette::Button ,Qt::transparent);
58
setAutoFillBackground(false);
59
m_pRightRender = new QSvgRenderer( KStandardDirs::locate("data","sflphone-client-kde/overlay_right_corner.svg") );
60
m_pLeftRender = new QSvgRenderer( KStandardDirs::locate("data","sflphone-client-kde/overlay_left_corner.svg" ) );
62
setMinimumSize(100,56);
64
parent->installEventFilter(this);
68
m_pLayout = new QHBoxLayout(this);
71
OverlayToolbar::~OverlayToolbar()
73
delete m_pRightRender;
78
void OverlayToolbar::paintEvent(QPaintEvent* event)
81
QPainter customPainter(this);
82
customPainter.setRenderHint(QPainter::Antialiasing);
83
QBrush b = customPainter.brush();
85
b.setColor(Qt::black);
86
//Use the current style pixel metrics to do as well as possible to guess the right shape
87
int margin = style()->pixelMetric(QStyle::PM_FocusFrameHMargin);
88
customPainter.setOpacity( 0.5 );
89
customPainter.setBrush ( Qt::black );
90
customPainter.setPen ( Qt::NoPen );
91
customPainter.drawRect ( QRect(margin,10,width()-2*margin,height()-10-2*margin - margin) );
92
customPainter.drawPie ( QRect(width()-8-margin,height()-10,8,8),270*16,90*16 );
93
customPainter.drawPie ( QRect(margin,height()-10,8,8),180*16,90*16 );
94
customPainter.drawRect ( QRect(4+margin,height()-4-margin,width()-8-2*margin,4) );
96
m_pLeftRender->render (&customPainter,QRect( margin,0,10,10) );
97
m_pRightRender->render (&customPainter,QRect( width()-10-margin,0,10,10) );
100
///Create a toolbar button
101
ObserverToolButton* OverlayToolbar::createButton(ExtendedAction* action)
103
ObserverToolButton* b = new ObserverToolButton(this);
104
b->setAutoFillBackground(false);
105
b->setToolButtonStyle( Qt::ToolButtonTextUnderIcon );
106
b->setIconSize(QSize(28,28));
107
b->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
108
b->setText(action->text());
110
b->setStyleSheet("margin-bottom:0px;margin-top:7px;font-weight:bold;padding-top:5px;");
111
b->setIcon(action->altIcon());
112
connect(action,SIGNAL(textChanged(QString)),b,SLOT(setNewText(QString)));
113
connect(b,SIGNAL(clicked()),action,SLOT(trigger()));
117
///Hide or show the toolbar and select visible actions
118
void OverlayToolbar::updateState()
123
void OverlayToolbar::hideEvent(QHideEvent *)
125
const QWidget* p = m_pForcedParent?m_pForcedParent:parentWidget();
126
if (p && p->property("tipManager").isValid()) {
127
TipManager* manager = qvariant_cast<TipManager*>(p->property("tipManager"));
129
manager->setBottomMargin(0);
131
emit visibilityChanged(false);
134
void OverlayToolbar::showEvent(QShowEvent *)
136
const QWidget* p = m_pForcedParent?m_pForcedParent:parentWidget();
137
if (p && p->property("tipManager").isValid()) {
138
TipManager* manager = qvariant_cast<TipManager*>(p->property("tipManager"));
140
manager->setBottomMargin(53);
142
emit visibilityChanged(true);
145
void OverlayToolbar::resizeToolbar()
147
const QWidget* p = m_pForcedParent?m_pForcedParent:parentWidget();
150
int vOffset(0),wOffset(0);
151
//If the parent has scrollbar, take this into account
152
if (p->inherits("QAbstractScrollArea")) {
153
const QAbstractScrollArea* scrl = static_cast< const QAbstractScrollArea*>(p);
154
if (scrl && scrl->horizontalScrollBar()->isVisible())
155
vOffset += scrl->horizontalScrollBar()->height();
156
if (scrl && scrl->verticalScrollBar()->isVisible())
157
wOffset += scrl->verticalScrollBar()->width();
159
resize(p->width()-wOffset,72);
160
move(0,p->height()-72-vOffset);
164
bool OverlayToolbar::eventFilter(QObject *obj, QEvent *event)
166
if (event->type() == QEvent::Resize) {
169
// standard event processing
170
return QObject::eventFilter(obj, event);
173
void OverlayToolbar::setForcedParent(QWidget* parent)
175
m_pForcedParent = parent;
176
if (m_pForcedParent) {
177
m_pForcedParent->installEventFilter(this);
182
void OverlayToolbar::setIconSize(int size)
185
QMutableHashIterator<int,ObserverToolButton*> iter(m_hButtons);
186
while (iter.hasNext())
187
iter.value()->setIconSize(QSize(m_IconSize,m_IconSize));
191
void OverlayToolbar::addAction(ExtendedAction* action, int key)
193
int k = key==-1?m_hButtons.size()+1:key;
194
while(m_hButtons[k]) k++;
195
ObserverToolButton* btn = createButton( action);
197
btn->setIconSize(QSize(m_IconSize,m_IconSize));
199
m_hButtons[key] = btn;
200
m_pLayout->addWidget( btn );
203
ObserverToolButton* OverlayToolbar::actionButton(int key)
205
return m_hButtons[key];