~ubuntu-branches/ubuntu/wily/sflphone/wily

« back to all changes in this revision

Viewing changes to kde/src/widgets/overlaytoolbar.cpp

  • Committer: Package Import Robot
  • Author(s): Mark Purcell
  • Date: 2014-01-28 18:23:36 UTC
  • mfrom: (1.1.11)
  • mto: This revision was merged to the branch mainline in revision 24.
  • Revision ID: package-import@ubuntu.com-20140128182336-3xenud1kbnwmf3mz
* New upstream release 
  - Fixes "New Upstream Release" (Closes: #735846)
  - Fixes "Ringtone does not stop" (Closes: #727164)
  - Fixes "[sflphone-kde] crash on startup" (Closes: #718178)
  - Fixes "sflphone GUI crashes when call is hung up" (Closes: #736583)
* Build-Depends: ensure GnuTLS 2.6
  - libucommon-dev (>= 6.0.7-1.1), libccrtp-dev (>= 2.0.6-3)
  - Fixes "FTBFS Build-Depends libgnutls{26,28}-dev" (Closes: #722040)
* Fix "boost 1.49 is going away" unversioned Build-Depends: (Closes: #736746)
* Add Build-Depends: libsndfile-dev, nepomuk-core-dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/***************************************************************************
 
2
 *   Copyright (C) 2012-2014 by Savoir-Faire Linux                         *
 
3
 *   Author : Emmanuel Lepage Valle <emmanuel.lepage@savoirfairelinux.com >*
 
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 3 of the License, or     *
 
8
 *   (at your option) any later version.                                   *
 
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, see <http://www.gnu.org/licenses/>. *
 
17
 **************************************************************************/
 
18
#include "overlaytoolbar.h"
 
19
 
 
20
//Qt
 
21
#include <QtGui/QPaintEvent>
 
22
#include <QtGui/QPainter>
 
23
#include <QtGui/QBrush>
 
24
#include <QtGui/QPen>
 
25
#include <QtGui/QScrollBar>
 
26
#include <QtSvg/QSvgRenderer>
 
27
#include <QtGui/QHBoxLayout>
 
28
#include <QtGui/QStyle>
 
29
#include <KDebug> //TODO remove
 
30
 
 
31
//KDE
 
32
#include <KStandardDirs>
 
33
#include <KIcon>
 
34
 
 
35
//SFLPhone
 
36
#include "sflphone.h"
 
37
#include "extendedaction.h"
 
38
#include <klib/tipmanager.h>
 
39
 
 
40
///Button constructor
 
41
ObserverToolButton::ObserverToolButton(QWidget* parent) : QToolButton(parent)
 
42
{
 
43
   QPalette pal = palette();
 
44
   pal.setColor(QPalette::Background,Qt::transparent);
 
45
   pal.setColor(QPalette::Button    ,Qt::transparent);
 
46
   pal.setColor(QPalette::ButtonText,"#dddddd");
 
47
   setPalette(pal);
 
48
}
 
49
 
 
50
///Constructor
 
51
OverlayToolbar::OverlayToolbar(QWidget* parent) : QWidget(parent),m_pRightRender(nullptr),
 
52
   m_pLeftRender(nullptr),m_pForcedParent(nullptr),m_IconSize(-1)
 
53
{
 
54
   QPalette pal = palette();
 
55
   pal.setColor(QPalette::Background,Qt::transparent);
 
56
   pal.setColor(QPalette::Button    ,Qt::transparent);
 
57
   setPalette(pal);
 
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" ) );
 
61
 
 
62
   setMinimumSize(100,56);
 
63
   if (parent)
 
64
      parent->installEventFilter(this);
 
65
   setVisible(false);
 
66
   hideEvent(nullptr);
 
67
 
 
68
   m_pLayout = new QHBoxLayout(this);
 
69
} //OverlayToolbar
 
70
 
 
71
OverlayToolbar::~OverlayToolbar()
 
72
{
 
73
   delete m_pRightRender;
 
74
   delete m_pLeftRender;
 
75
}
 
76
 
 
77
///Repaint event
 
78
void OverlayToolbar::paintEvent(QPaintEvent* event)
 
79
{
 
80
   Q_UNUSED(event);
 
81
   QPainter customPainter(this);
 
82
   customPainter.setRenderHint(QPainter::Antialiasing);
 
83
   QBrush b = customPainter.brush();
 
84
 
 
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)          );
 
95
 
 
96
   m_pLeftRender->render   (&customPainter,QRect( margin,0,10,10)                            );
 
97
   m_pRightRender->render  (&customPainter,QRect( width()-10-margin,0,10,10)                 );
 
98
} //paintEvent
 
99
 
 
100
///Create a toolbar button
 
101
ObserverToolButton* OverlayToolbar::createButton(ExtendedAction* action)
 
102
{
 
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());
 
109
   b->setShortcut(0);
 
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()));
 
114
   return b;
 
115
} //createButton
 
116
 
 
117
///Hide or show the toolbar and select visible actions
 
118
void OverlayToolbar::updateState()
 
119
{
 
120
   
 
121
} //updateState
 
122
 
 
123
void OverlayToolbar::hideEvent(QHideEvent *)
 
124
{
 
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"));
 
128
      if (manager)
 
129
         manager->setBottomMargin(0);
 
130
   }
 
131
   emit visibilityChanged(false);
 
132
}
 
133
 
 
134
void OverlayToolbar::showEvent(QShowEvent *)
 
135
{
 
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"));
 
139
      if (manager)
 
140
         manager->setBottomMargin(53);
 
141
   }
 
142
   emit visibilityChanged(true);
 
143
}
 
144
 
 
145
void OverlayToolbar::resizeToolbar()
 
146
{
 
147
   const QWidget* p = m_pForcedParent?m_pForcedParent:parentWidget();
 
148
 
 
149
   if (p) {
 
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();
 
158
      }
 
159
      resize(p->width()-wOffset,72);
 
160
      move(0,p->height()-72-vOffset);
 
161
   }
 
162
}
 
163
 
 
164
bool OverlayToolbar::eventFilter(QObject *obj, QEvent *event)
 
165
{
 
166
   if (event->type() == QEvent::Resize) {
 
167
      resizeToolbar();
 
168
   }
 
169
   // standard event processing
 
170
   return QObject::eventFilter(obj, event);
 
171
}
 
172
 
 
173
void OverlayToolbar::setForcedParent(QWidget* parent)
 
174
{
 
175
   m_pForcedParent = parent;
 
176
   if (m_pForcedParent) {
 
177
      m_pForcedParent->installEventFilter(this);
 
178
      resizeToolbar();
 
179
   }
 
180
}
 
181
 
 
182
void OverlayToolbar::setIconSize(int size)
 
183
{
 
184
   m_IconSize = size;
 
185
   QMutableHashIterator<int,ObserverToolButton*> iter(m_hButtons);
 
186
   while (iter.hasNext())
 
187
      iter.value()->setIconSize(QSize(m_IconSize,m_IconSize));
 
188
}
 
189
 
 
190
 
 
191
void OverlayToolbar::addAction(ExtendedAction* action, int key)
 
192
{
 
193
   int k = key==-1?m_hButtons.size()+1:key;
 
194
   while(m_hButtons[k]) k++;
 
195
   ObserverToolButton* btn = createButton( action);
 
196
   if (m_IconSize>0) {
 
197
      btn->setIconSize(QSize(m_IconSize,m_IconSize));
 
198
   }
 
199
   m_hButtons[key] = btn;
 
200
   m_pLayout->addWidget( btn );
 
201
}
 
202
 
 
203
ObserverToolButton* OverlayToolbar::actionButton(int key)
 
204
{
 
205
   return m_hButtons[key];
 
206
}