Commit 97a21b4d authored by Nicolas Jager's avatar Nicolas Jager Committed by Edric Milaret

Refurbishing of the MS Windows client UI

Tuleap: #148
Change-Id: Iadcad55172a857941eca0e8160f35dff2eabff5a
parent e36688f4
......@@ -57,7 +57,13 @@ SOURCES += main.cpp\
contactmethodpicker.cpp \
globalsystemtray.cpp \
smartlistdelegate.cpp \
callutilsdialog.cpp
callutilsdialog.cpp \
combar.cpp \
idlabel.cpp \
smartlist.cpp \
mainwindowtoolbar.cpp \
ringcontactlineedit.cpp \
smartlistscrollbar.cpp
HEADERS += mainwindow.h \
callwidget.h \
......@@ -85,7 +91,13 @@ HEADERS += mainwindow.h \
settingskey.h \
globalsystemtray.h \
smartlistdelegate.h \
callutilsdialog.h
callutilsdialog.h \
combar.h \
idlabel.h \
smartlist.h \
mainwindowtoolbar.h \
ringcontactlineedit.h \
smartlistscrollbar.h
FORMS += mainwindow.ui \
callwidget.ui \
......@@ -99,7 +111,8 @@ FORMS += mainwindow.ui \
videooverlay.ui \
contactpicker.ui \
contactmethodpicker.ui \
callutilsdialog.ui
callutilsdialog.ui \
combar.ui
win32: LIBS += -lole32 -luuid -lshlwapi
......
......@@ -38,7 +38,6 @@
#include "media/textrecording.h"
#include "recentmodel.h"
#include "wizarddialog.h"
#include "windowscontactbackend.h"
#include "contactpicker.h"
......@@ -48,13 +47,35 @@
#include "contactdelegate.h"
#include "smartlistdelegate.h"
CallWidget::CallWidget(QWidget *parent) :
CallWidget::CallWidget(QWidget* parent) :
NavWidget(END ,parent),
ui(new Ui::CallWidget),
menu_(new QMenu())
{
setMouseTracking(true);
ui->setupUi(this);
// TODO : add this in style sheet forms
QPalette palette;
palette.setColor(QPalette::WindowText, QColor(255,255,255));
ui->callerIdLabel->setPalette(palette);
QPalette palette2;
palette2.setColor(QPalette::WindowText, QColor(141,141,141));
ui->wantToTalkLabel->setPalette(palette2);
ui->outboundCallLabel->setPalette(palette2);
ui->cancelCallLabel->setPalette(palette2);
ui->acceptLabel->setPalette(palette2);
ui->refuseLabel->setPalette(palette2);
QFont font = ui->callerIdLabel->font();
font.setPointSize(20);
ui->callerIdLabel->setFont(font);
// end of TODO : add this in style sheet forms
ui->callInvite->setVisible(false);
setActualCall(nullptr);
......@@ -63,12 +84,6 @@ CallWidget::CallWidget(QWidget *parent) :
connect(ui->videoWidget, SIGNAL(setChatVisibility(bool)),
ui->instantMessagingWidget, SLOT(setVisible(bool)));
ui->spinnerWidget->hide();
spinner_ = new QMovie(":/images/spinner.gif");
if (spinner_->isValid()) {
ui->spinnerLabel->setMovie(spinner_);
}
QPixmap logo(":/images/logo-ring-standard-coul.png");
ui->ringLogo->setPixmap(logo.scaledToHeight(100, Qt::SmoothTransformation));
ui->ringLogo->setAlignment(Qt::AlignHCenter);
......@@ -93,9 +108,11 @@ CallWidget::CallWidget(QWidget *parent) :
SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
this,
SLOT(smartListSelectionChanged(QItemSelection,QItemSelection)));
connect(ui->smartList, &QTreeView::entered, this, &CallWidget::on_entered);
smartListDelegate_ = new SmartListDelegate();
ui->smartList->setItemDelegate(smartListDelegate_);
ui->smartList->setHeaderHidden(true);
ui->smartList->setSmartListItemDelegate(smartListDelegate_);
PersonModel::instance().
addCollection<WindowsContactBackend>(LoadOptions::FORCE_ENABLED);
......@@ -158,7 +175,6 @@ CallWidget::CallWidget(QWidget *parent) :
CallWidget::~CallWidget()
{
delete ui;
delete spinner_;
delete menu_;
delete contactDelegate_;
}
......@@ -182,7 +198,7 @@ CallWidget::findRingAccount(QModelIndex idx1, QModelIndex idx2, QVector<int> vec
return;
}
}
if (not found){
if (not found) {
ui->ringIdLabel->setText(tr("NO RING ACCOUNT FOUND"));
}
}
......@@ -215,15 +231,17 @@ CallWidget::findRingAccount()
}
void
CallWidget::callIncoming(Call *call)
CallWidget::callIncoming(Call* call)
{
ui->outboundCall->hide();
if (!QApplication::activeWindow()) {
GlobalSystemTray::instance().showMessage("Ring", "Call incoming from " + call->formattedName());
QApplication::alert(this, 5000);
}
if (!call->account()->isAutoAnswer()) {
ui->callLabel->setText(QString(tr("Call from %1", "%1 is the name of the caller"))
ui->callerIdLabel->setText(QString(tr("%1", "%1 is the name of the caller"))
.arg(call->formattedName()));
ui->stackedWidget->setCurrentWidget(ui->callInvitePage);
ui->callInvite->setVisible(true);
......@@ -257,7 +275,6 @@ CallWidget::addedCall(Call* call, Call* parent)
{
Q_UNUSED(parent);
if (call->direction() == Call::Direction::OUTGOING) {
displaySpinner(true);
setActualCall(call);
ui->stackedWidget->setCurrentWidget(ui->callInvitePage);
}
......@@ -277,7 +294,6 @@ CallWidget::callStateChanged(Call* call, Call::State previousState)
setActualCall(nullptr);
ui->instantMessagingWidget->setMediaText(nullptr);
ui->stackedWidget->setCurrentWidget(ui->welcomePage);
displaySpinner(false);
//TODO : Link this so that recentModel get selected correctly
// auto onHoldCall = callModel_->getActiveCalls().first();
// if (onHoldCall != nullptr && onHoldCall->state() == Call::State::HOLD) {
......@@ -285,7 +301,6 @@ CallWidget::callStateChanged(Call* call, Call::State previousState)
// onHoldCall->performAction(Call::Action::HOLD);
// }
} else if (call->state() == Call::State::CURRENT) {
displaySpinner(false);
ui->instantMessagingWidget->setMediaText(actualCall_);
ui->stackedWidget->setCurrentWidget(ui->videoPage);
}
......@@ -294,11 +309,10 @@ CallWidget::callStateChanged(Call* call, Call::State previousState)
void
CallWidget::atExit()
{
}
void
CallWidget::on_contactView_doubleClicked(const QModelIndex &index)
CallWidget::on_contactView_doubleClicked(const QModelIndex& index)
{
if (not index.isValid())
return;
......@@ -328,7 +342,7 @@ CallWidget::on_contactView_doubleClicked(const QModelIndex &index)
}
void
CallWidget::on_historyList_doubleClicked(const QModelIndex &index)
CallWidget::on_historyList_doubleClicked(const QModelIndex& index)
{
if (not index.isValid())
return;
......@@ -350,14 +364,6 @@ CallWidget::setActualCall(Call* value)
ui->videoWidget->pushRenderer(value);
}
void
CallWidget::displaySpinner(bool display)
{
display ? ui->spinnerWidget->show() : ui->spinnerWidget->hide();
if (ui->spinnerLabel->movie())
display ? ui->spinnerLabel->movie()->start() : ui->spinnerLabel->movie()->stop();
}
void
CallWidget::on_cancelButton_clicked()
{
......@@ -366,7 +372,7 @@ CallWidget::on_cancelButton_clicked()
}
void
CallWidget::on_smartList_doubleClicked(const QModelIndex &index)
CallWidget::on_smartList_doubleClicked(const QModelIndex& index)
{
auto realIndex = RecentModel::instance().peopleProxy()->mapToSource(index);
if (RecentModel::instance().hasActiveCall(realIndex))
......@@ -387,7 +393,7 @@ CallWidget::on_smartList_doubleClicked(const QModelIndex &index)
}
void
CallWidget::smartListSelectionChanged(const QItemSelection &newSel, const QItemSelection &oldSel) {
CallWidget::smartListSelectionChanged(const QItemSelection& newSel, const QItemSelection& oldSel) {
Q_UNUSED(oldSel)
......@@ -411,17 +417,11 @@ CallWidget::smartListSelectionChanged(const QItemSelection &newSel, const QItemS
void
CallWidget::placeCall()
{
if (ui->searchEdit->text().isEmpty())
if (ui->ringContactLineEdit->text().isEmpty())
return;
Call* c = CallModel::instance().dialingCall(PhoneDirectoryModel::instance().getNumber(ui->searchEdit->text()));
Call* c = CallModel::instance().dialingCall(PhoneDirectoryModel::instance().getNumber(ui->ringContactLineEdit->text()));
c->performAction(Call::Action::ACCEPT);
ui->searchEdit->clear();
}
void
CallWidget::on_searchEdit_returnPressed()
{
placeCall();
ui->ringContactLineEdit->clear();
}
void
......@@ -433,15 +433,32 @@ CallWidget::on_settingsButton_clicked()
void
CallWidget::on_contactButton_clicked(bool checked)
{
if (checked)
ui->historicButton->setChecked(false);
ui->mainTabMenu->setCurrentIndex(checked ? 1 : 0);
}
void
CallWidget::on_historicButton_clicked(bool checked)
{
if (checked)
ui->contactButton->setChecked(false);
ui->mainTabMenu->setCurrentIndex(checked ? 2 : 0);
}
void
CallWidget::on_ringContactLineEdit_returnPressed()
{
placeCall();
}
void
CallWidget::on_btnCall_clicked()
{
placeCall();
}
void
CallWidget::on_btnvideo_clicked()
{
if (not highLightedIndex_.isValid())
return;
on_smartList_doubleClicked(highLightedIndex_);
}
......@@ -47,47 +47,52 @@ class CallWidget : public NavWidget
Q_OBJECT
public:
explicit CallWidget(QWidget *parent = 0);
explicit CallWidget(QWidget* parent = 0);
~CallWidget();
void atExit();
//UI SLOTS
public slots:
void on_contactButton_clicked(bool checked);
void on_settingsButton_clicked();
void on_historicButton_clicked(bool checked);
void on_ringContactLineEdit_returnPressed();
void on_btnCall_clicked();
void on_btnvideo_clicked();
inline void on_entered(const QModelIndex& i){highLightedIndex_ = i;};
//UI SLOTS
private slots:
void on_acceptButton_clicked();
void on_refuseButton_clicked();
void on_contactView_doubleClicked(const QModelIndex &index);
void on_contactView_doubleClicked(const QModelIndex& index);
void on_cancelButton_clicked();
void on_smartList_doubleClicked(const QModelIndex &index);
void on_searchEdit_returnPressed();
void on_settingsButton_clicked();
void on_historyList_doubleClicked(const QModelIndex &index);
void on_contactButton_clicked(bool checked);
void on_historicButton_clicked(bool checked);
void on_smartList_doubleClicked(const QModelIndex& index);
void on_historyList_doubleClicked(const QModelIndex& index);
private slots:
void callIncoming(Call *call);
void addedCall(Call *call, Call *parent);
void callStateChanged(Call *call, Call::State previousState);
void callIncoming(Call* call);
void addedCall(Call* call, Call* parent);
void callStateChanged(Call* call, Call::State previousState);
void findRingAccount(QModelIndex idx1, QModelIndex idx2, QVector<int> vec);
void smartListSelectionChanged(const QItemSelection &newSel, const QItemSelection &oldSel);
void smartListSelectionChanged(const QItemSelection& newSel, const QItemSelection& oldSel);
private:
Ui::CallWidget *ui;
Ui::CallWidget* ui;
Call* actualCall_;
Video::Renderer* videoRenderer_;
CallModel* callModel_;
int outputVolume_;
int inputVolume_;
QMenu *menu_;
QMovie *spinner_;
ContactDelegate *contactDelegate_;
HistoryDelegate *historyDelegate_;
QMenu* menu_;
ContactDelegate* contactDelegate_;
HistoryDelegate* historyDelegate_;
SmartListDelegate* smartListDelegate_;
QModelIndex highLightedIndex_;
private:
void findRingAccount();
void setActualCall(Call *value);
void displaySpinner(bool display);
void setActualCall(Call* value);
void placeCall();
};
This diff is collapsed.
/***************************************************************************
* Copyright (C) 2015 by Savoir-faire Linux *
* Author: Jäger Nicolas <nicolas.jager@savoirfairelinux.com> *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 3 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
**************************************************************************/
#include "combar.h"
#include "ui_combar.h"
ComBar::ComBar(QWidget* parent) :
QWidget(parent),
ui(new Ui::ComBar)
{
ui->setupUi(this);
// [jn] these buttons are for further uses
ui->btnchat->hide();
ui->btncontactinfo->hide();
}
ComBar::~ComBar()
{
delete ui;
}
void
ComBar::moveToRow(const QRect& rect)
{
move(rect.right() - width(),
rect.bottom() - height() - (rect.height()/4));
}
/***************************************************************************
* Copyright (C) 2015 by Savoir-faire Linux *
* Author: Jäger Nicolas <nicolas.jager@savoirfairelinux.com> *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 3 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
**************************************************************************/
#pragma once
#include <QWidget>
namespace Ui {
class ComBar;
}
class ComBar : public QWidget
{
Q_OBJECT
public:
explicit ComBar(QWidget* parent = 0);
~ComBar();
public slots:
void moveToRow(const QRect& rect);
private:
Ui::ComBar* ui;
};
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>ComBar</class>
<widget class="QWidget" name="ComBar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>116</width>
<height>37</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>116</width>
<height>37</height>
</size>
</property>
<property name="windowTitle">
<string/>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>7</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>7</number>
</property>
<item>
<widget class="QPushButton" name="btnvideo">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>30</width>
<height>30</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>30</width>
<height>30</height>
</size>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btnchat">
<property name="minimumSize">
<size>
<width>30</width>
<height>30</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>30</width>
<height>30</height>
</size>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btncontactinfo">
<property name="minimumSize">
<size>
<width>30</width>
<height>30</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>30</width>
<height>30</height>
</size>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
</layout>
</widget>
<resources>
<include location="ressources.qrc"/>
</resources>
<connections/>
</ui>
/***************************************************************************
* Copyright (C) 2015 by Savoir-faire Linux *
* Author: Jäger Nicolas <nicolas.jager@savoirfairelinux.com> *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 3 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
**************************************************************************/
#include <QClipboard>
#include <QtWidgets/QApplication>
#include "idlabel.h"
IdLabel::IdLabel(QWidget* parent) : QLabel(parent)
{
}
IdLabel::~IdLabel()
{
}
void
IdLabel::mouseDoubleClickEvent(QMouseEvent* event)
{
Q_UNUSED(event);
QApplication::clipboard()->setText(this->text());
}
/***************************************************************************
* Copyright (C) 2015 by Savoir-faire Linux *
* Author: Jäger Nicolas <nicolas.jager@savoirfairelinux.com> *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 3 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
**************************************************************************/
#pragma once
#include <QLabel>
class IdLabel : public QLabel
{
Q_OBJECT
public:
explicit IdLabel(QWidget* parent = 0);
~IdLabel();
protected:
void mouseDoubleClickEvent(QMouseEvent* event);
};
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 16.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="Calque_1"
x="0px"
y="0px"
width="30px"
height="30px"
viewBox="0 0 30 30"
enable-background="new 0 0 30 30"
xml:space="preserve"
inkscape:version="0.91 r13725"
sodipodi:docname="btn-info.svg"><metadata
id="metadata4147"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
id="defs4145" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1522"
inkscape:window-height="996"
id="namedview4143"
showgrid="false"
inkscape:zoom="10.111627"
inkscape:cx="15.869691"
inkscape:cy="11.778532"
inkscape:window-x="0"
inkscape:window-y="4"
inkscape:window-maximized="1"
inkscape:current-layer="Calque_1" /><path
d="m 28.759824,15 c 0,7.599092 -6.160732,13.759824 -13.759824,13.759824 l 0,0 C 7.4009076,28.759824 1.2401756,22.599092 1.2401756,15 l 0,0 C 1.2401756,7.4009076 7.4009076,1.2401756 15,1.2401756 l 0,0 c 7.599092,0 13.759824,6.160732 13.759824,13.7598244 l 0,0 z"
id="path4137"
style="fill:#e9e9e9;fill-opacity:0;stroke:#f2f2f2;stroke-width:2.109;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
inkscape:connector-curvature="0" /><text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:27.5px;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#f2f2f2;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="11.168149"
y="24.889782"
id="text4149"
sodipodi:linespacing="0%"><tspan
sodipodi:role="line"
id="tspan4151"
x="11.168149"
y="24.889782"
style="font-size:27.5px;line-height:0%;fill:#f2f2f2;fill-opacity:1">i</tspan></text>
</svg>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="64px" height="64px" viewBox="0 0 64 64" enable-background="new 0 0 64 64" xml:space="preserve">
<path fill="#4CAF50" d="M64,32c0,17.673-14.327,32-32,32l0,0C14.327,64,0,49.673,0,32l0,0C0,14.327,14.327,0,32,0l0,0
C49.673,0,64,14.327,64,32L64,32z"/>
<g>
<path fill="#FFFFFF" d="M45.715,39.948c0,0.351-0.066,0.809-0.196,1.374c-0.131,0.563-0.267,1.011-0.409,1.334
c-0.272,0.649-1.063,1.338-2.376,2.065c-1.222,0.663-2.428,0.993-3.624,0.993c-0.35,0-0.689-0.022-1.022-0.068
c-0.33-0.045-0.704-0.126-1.12-0.244c-0.415-0.117-0.723-0.21-0.926-0.282c-0.199-0.07-0.562-0.204-1.08-0.398
s-0.837-0.312-0.954-0.352c-1.273-0.455-2.409-0.994-3.41-1.616c-1.662-1.026-3.379-2.425-5.152-4.198
c-1.772-1.772-3.172-3.489-4.198-5.153c-0.623-1-1.163-2.136-1.617-3.408c-0.039-0.118-0.155-0.436-0.35-0.955
c-0.195-0.52-0.328-0.88-0.4-1.082c-0.071-0.201-0.165-0.509-0.282-0.926c-0.117-0.415-0.198-0.789-0.244-1.12
c-0.045-0.331-0.068-0.672-0.068-1.023c0-1.195,0.331-2.402,0.994-3.623c0.727-1.312,1.415-2.104,2.064-2.377
c0.325-0.142,0.77-0.279,1.335-0.409c0.565-0.13,1.022-0.195,1.373-0.195c0.182,0,0.318,0.02,0.409,0.058
c0.234,0.079,0.578,0.572,1.033,1.481c0.143,0.247,0.338,0.597,0.584,1.051c0.247,0.455,0.474,0.867,0.682,1.237
c0.208,0.371,0.409,0.718,0.604,1.043c0.039,0.052,0.153,0.214,0.341,0.487c0.188,0.273,0.328,0.503,0.419,0.692
c0.09,0.188,0.136,0.373,0.136,0.554c0,0.261-0.186,0.585-0.555,0.974c-0.371,0.39-0.773,0.747-1.208,1.072
s-0.837,0.669-1.208,1.033s-0.556,0.662-0.556,0.896c0,0.117,0.032,0.263,0.098,0.438c0.065,0.175,0.12,0.308,0.166,0.399
c0.045,0.091,0.137,0.247,0.273,0.468c0.137,0.221,0.211,0.344,0.224,0.371c0.986,1.779,2.116,3.305,3.39,4.579
c1.272,1.272,2.798,2.402,4.578,3.389c0.026,0.014,0.148,0.088,0.369,0.225c0.222,0.137,0.376,0.228,0.468,0.272
c0.091,0.046,0.226,0.1,0.4,0.166c0.176,0.063,0.32,0.097,0.438,0.097c0.234,0,0.534-0.187,0.897-0.556
c0.361-0.37,0.707-0.772,1.03-1.207c0.325-0.436,0.683-0.838,1.072-1.209c0.389-0.369,0.714-0.556,0.974-0.556
c0.182,0,0.368,0.049,0.557,0.137c0.188,0.091,0.418,0.231,0.691,0.419c0.273,0.188,0.434,0.302,0.485,0.341
c0.324,0.194,0.674,0.397,1.043,0.604c0.371,0.209,0.781,0.437,1.238,0.682c0.454,0.248,0.804,0.442,1.052,0.586
c0.909,0.453,1.403,0.799,1.479,1.032C45.694,39.63,45.715,39.767,45.715,39.948z"/>
</g>
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 16.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="Calque_1"