1
0
mirror of https://github.com/qTox/qTox.git synced 2024-03-22 14:00:36 +08:00

Merge branch 'upstream/master'

This commit is contained in:
marcel 2014-07-02 10:08:53 +02:00
commit 4d51469557
125 changed files with 4201 additions and 3234 deletions

View File

@ -11,16 +11,19 @@ However, it is not a fork.
- Group chats
- File transfers, with previewing of images
- Audio calls
- Video calls (EXPERIMENTAL, receiving video only, not sending)
- Video calls
- Tox DNS
<h2>Requirements</h2>
This client will run on Windows, Linux and Mac natively, but binairies are only be provided for Windows at the moment. <br/>
Linux and Mac users will have compile the source code themselves.
Linux and Mac users will have to compile the source code themselves.
<a href="https://jenkins.libtoxcore.so/job/tux3-toxgui-win32/lastSuccessfulBuild/artifact/toxgui-win32.zip">Windows download</a>
<a href="https://jenkins.libtoxcore.so/job/tux3-toxgui-win32/lastSuccessfulBuild/artifact/toxgui-win32.zip">Windows download</a><br/>
<a href="http://speedy.sh/XXtHa/toxgui">Linux download (1st July 2014 01:30 GMT)</a><br/>
Note that the Linux download has not been tested.
<h3>Screenshots</h3>
<h5>Note: The screenshots may not always be up to date, but they should give a good idea of the general look and features</h5>
<img src="http://i.imgur.com/eMxaxib.png"/>
<img src="http://i.imgur.com/mMUdr6u.png"/>
<img src="http://i.imgur.com/66ARBGC.png"/>

View File

@ -3,7 +3,7 @@
AudioBuffer::AudioBuffer() :
QIODevice(0)
{
open(QIODevice::ReadOnly);
open(QIODevice::ReadWrite);
}
AudioBuffer::~AudioBuffer()
@ -13,29 +13,56 @@ AudioBuffer::~AudioBuffer()
qint64 AudioBuffer::readData(char *data, qint64 len)
{
const qint64 total = qMin((qint64)buffer.size(), len);
memcpy(data, buffer.constData(), total);
buffer = buffer.mid(total);
qint64 total;
bufferMutex.lock();
try {
total = qMin((qint64)buffer.size(), len);
memcpy(data, buffer.constData(), total);
buffer = buffer.mid(total);
}
catch (...)
{
bufferMutex.unlock();
return 0;
}
bufferMutex.unlock();
return total;
}
qint64 AudioBuffer::writeData(const char* data, qint64 len)
{
buffer.append(data, len);
return 0;
bufferMutex.lock();
try {
buffer.append(data, len);
}
catch (...)
{
bufferMutex.unlock();
return 0;
}
bufferMutex.unlock();
return len;
}
qint64 AudioBuffer::bytesAvailable() const
{
return buffer.size() + QIODevice::bytesAvailable();
bufferMutex.lock();
long long size = buffer.size() + QIODevice::bytesAvailable();
bufferMutex.unlock();
return size;
}
qint64 AudioBuffer::bufferSize() const
{
return buffer.size();
bufferMutex.lock();
long long size = buffer.size();
bufferMutex.unlock();
return size;
}
void AudioBuffer::clear()
{
bufferMutex.lock();
buffer.clear();
bufferMutex.unlock();
}

View File

@ -3,6 +3,7 @@
#include <QIODevice>
#include <QByteArray>
#include <QMutex>
class AudioBuffer : public QIODevice
{
@ -19,6 +20,7 @@ public:
private:
QByteArray buffer;
mutable QMutex bufferMutex;
};
#endif // AUDIOBUFFER_H

139
core.cpp
View File

@ -34,8 +34,8 @@ QList<ToxFile> Core::fileSendQueue;
QList<ToxFile> Core::fileRecvQueue;
ToxCall Core::calls[TOXAV_MAX_CALLS];
Core::Core() :
tox(nullptr)
Core::Core(Camera* cam) :
tox(nullptr), camera(cam)
{
toxTimer = new QTimer(this);
toxTimer->setSingleShot(true);
@ -63,7 +63,13 @@ Core::~Core()
void Core::start()
{
tox = tox_new(1);
// IPv6 needed for LAN discovery, but can crash some weird routers. On by default, can be disabled in options.
bool enableIPv6 = Settings::getInstance().getEnableIPv6();
if (enableIPv6)
qDebug() << "Core starting with IPv6 enabled";
else
qWarning() << "Core starting with IPv6 disabled. LAN discovery may not work properly.";
tox = tox_new(enableIPv6);
if (tox == nullptr)
{
qCritical() << "Tox core failed to start";
@ -113,12 +119,6 @@ void Core::start()
emit friendAddressGenerated(CFriendAddress::toString(friendAddress));
CString cUsername(Settings::getInstance().getUsername());
tox_set_name(tox, cUsername.data(), cUsername.size());
CString cStatusMessage(Settings::getInstance().getStatusMessage());
tox_set_status_message(tox, cStatusMessage.data(), cStatusMessage.size());
bootstrapDht();
toxTimer->start(tox_do_interval(tox));
@ -126,6 +126,8 @@ void Core::start()
void Core::onBootstrapTimer()
{
if (!tox)
return;
if(!tox_isconnected(tox))
bootstrapDht();
}
@ -606,7 +608,7 @@ void Core::bootstrapDht()
if (tox_bootstrap_from_address(tox, dhtServer.address.toLatin1().data(),
0, qToBigEndian(dhtServer.port), CUserId(dhtServer.userId).data()) == 1)
qDebug() << QString("Core: Bootstraping from ")+dhtServer.name+QString(", addr ")+dhtServer.address.toLatin1().data()
+QString(", port ")+QString().setNum(qToBigEndian(dhtServer.port));
+QString(", port ")+QString().setNum(dhtServer.port);
else
qDebug() << "Core: Error bootstraping from "+dhtServer.name;
@ -672,6 +674,12 @@ void Core::loadConfiguration()
void Core::saveConfiguration()
{
if (!tox)
{
qWarning() << "Core::saveConfiguration: Tox not started, aborting!";
return;
}
QString path = Settings::getSettingsDirPath();
QDir directory(path);
@ -882,7 +890,7 @@ void Core::onAvInvite(int32_t call_index, void* core)
return;
}
int transType = toxav_get_peer_transmission_type(static_cast<Core*>(core)->toxav, call_index, friendId);
int transType = toxav_get_peer_transmission_type(static_cast<Core*>(core)->toxav, call_index, 0);
if (transType == TypeVideo)
{
qDebug() << QString("Core: AV invite from %1 with video").arg(friendId);
@ -904,7 +912,7 @@ void Core::onAvStart(int32_t call_index, void* core)
return;
}
int transType = toxav_get_peer_transmission_type(static_cast<Core*>(core)->toxav, call_index, friendId);
int transType = toxav_get_peer_transmission_type(static_cast<Core*>(core)->toxav, call_index, 0);
if (transType == TypeVideo)
{
qDebug() << QString("Core: AV start from %1 with video").arg(friendId);
@ -932,7 +940,7 @@ void Core::onAvCancel(int32_t call_index, void* core)
emit static_cast<Core*>(core)->avCancel(friendId, call_index);
}
void Core::onAvReject(int32_t call_index, void* core)
void Core::onAvReject(int32_t, void*)
{
qDebug() << "Core: AV reject";
}
@ -981,7 +989,7 @@ void Core::onAvStarting(int32_t call_index, void* core)
qWarning() << "Core: Received invalid AV starting";
return;
}
int transType = toxav_get_peer_transmission_type(static_cast<Core*>(core)->toxav, call_index, friendId);
int transType = toxav_get_peer_transmission_type(static_cast<Core*>(core)->toxav, call_index, 0);
if (transType == TypeVideo)
{
qDebug() << QString("Core: AV starting from %1 with video").arg(friendId);
@ -1011,7 +1019,7 @@ void Core::onAvEnding(int32_t call_index, void* core)
emit static_cast<Core*>(core)->avEnding(friendId, call_index);
}
void Core::onAvError(int32_t call_index, void* core)
void Core::onAvError(int32_t, void*)
{
qDebug() << "Core: AV error";
}
@ -1026,6 +1034,8 @@ void Core::onAvRequestTimeout(int32_t call_index, void* core)
}
qDebug() << QString("Core: AV request timeout with %1").arg(friendId);
cleanupCall(call_index);
emit static_cast<Core*>(core)->avRequestTimeout(friendId, call_index);
}
@ -1039,6 +1049,8 @@ void Core::onAvPeerTimeout(int32_t call_index, void* core)
}
qDebug() << QString("Core: AV peer timeout with %1").arg(friendId);
cleanupCall(call_index);
emit static_cast<Core*>(core)->avPeerTimeout(friendId, call_index);
}
@ -1050,7 +1062,7 @@ void Core::answerCall(int callId)
qWarning() << "Core: Received invalid AV answer peer ID";
return;
}
int transType = toxav_get_peer_transmission_type(toxav, callId, friendId);
int transType = toxav_get_peer_transmission_type(toxav, callId, 0);
if (transType == TypeVideo)
{
qDebug() << QString("Core: answering call %1 with video").arg(callId);
@ -1142,6 +1154,8 @@ void Core::prepareCall(int friendId, int callId, ToxAv* toxav, bool videoEnabled
}
// Go
calls[callId].active = true;
if (calls[callId].audioOutput != nullptr)
{
calls[callId].playAudioTimer.setInterval(5);
@ -1158,33 +1172,48 @@ void Core::prepareCall(int friendId, int callId, ToxAv* toxav, bool videoEnabled
calls[callId].sendAudioTimer.start();
}
calls[callId].playVideoTimer.setInterval(50);
calls[callId].playVideoTimer.setSingleShot(true);
connect(&calls[callId].playVideoTimer, &QTimer::timeout, [=](){
Widget::getInstance()->getCore()->playCallVideo(callId);});
calls[callId].playVideoTimer.start();
if (calls[callId].videoEnabled)
{
calls[callId].playVideoTimer.setInterval(50);
calls[callId].playVideoTimer.setSingleShot(true);
connect(&calls[callId].playVideoTimer, &QTimer::timeout, [=](){
Widget::getInstance()->getCore()->playCallVideo(callId);});
calls[callId].playVideoTimer.start();
calls[callId].active = true;
calls[callId].sendVideoTimer.setInterval(50);
calls[callId].sendVideoTimer.setSingleShot(true);
connect(&calls[callId].sendVideoTimer, &QTimer::timeout, [=](){
Widget::getInstance()->getCore()->sendCallVideo(callId);});
calls[callId].sendVideoTimer.start();
Widget::getInstance()->getCamera()->suscribe();
}
}
void Core::cleanupCall(int callId)
{
qDebug() << QString("Core: cleaning up call %1").arg(callId);
calls[callId].active = false;
disconnect(&calls[callId].playAudioTimer,0,0,0);
disconnect(&calls[callId].sendAudioTimer,0,0,0);
disconnect(&calls[callId].playVideoTimer,0,0,0);
disconnect(&calls[callId].sendVideoTimer,0,0,0);
calls[callId].playAudioTimer.stop();
calls[callId].sendAudioTimer.stop();
calls[callId].playVideoTimer.stop();
calls[callId].sendVideoTimer.stop();
if (calls[callId].audioOutput != nullptr)
{
delete calls[callId].audioOutput;
calls[callId].audioOutput = nullptr;
disconnect(&calls[callId].playAudioTimer,0,0,0);
}
if (calls[callId].audioInput != nullptr)
{
delete calls[callId].audioInput;
calls[callId].audioInput = nullptr;
disconnect(&calls[callId].sendAudioTimer,0,0,0);
}
disconnect(&calls[callId].playVideoTimer,0,0,0);
disconnect(&calls[callId].sendVideoTimer,0,0,0);
if (calls[callId].videoEnabled)
Widget::getInstance()->getCamera()->unsuscribe();
calls[callId].audioBuffer.clear();
}
@ -1208,13 +1237,12 @@ void Core::playCallAudio(int callId, ToxAv* toxav)
}
if (len == 0)
{
if (calls[callId].audioBuffer.bufferSize() >= framesize*2)
calls[callId].playAudioTimer.start();
calls[callId].playAudioTimer.start();
return;
}
//qDebug() << QString("Core: Received %1 bytes, %2 audio bytes free, %3 core buffer size")
// .arg(len*2).arg(calls[callId].audioOutput->bytesFree()).arg(calls[callId].audioBuffer.bufferSize());
calls[callId].audioBuffer.writeData((char*)buf, len*2);
calls[callId].audioBuffer.write((char*)buf, len*2);
int state = calls[callId].audioOutput->state();
if (state != QAudio::ActiveState)
{
@ -1226,7 +1254,6 @@ void Core::playCallAudio(int callId, ToxAv* toxav)
if (error != QAudio::NoError)
qWarning() << QString("Core::playCallAudio: Error: %1").arg(error);
calls[callId].playAudioTimer.start();
}
@ -1254,7 +1281,7 @@ void Core::sendCallAudio(int callId, ToxAv* toxav)
calls[callId].sendAudioTimer.start();
return;
}
calls[callId].sendAudioTimer.start(0);
calls[callId].sendAudioTimer.start();
}
else
calls[callId].sendAudioTimer.start();
@ -1268,7 +1295,13 @@ void Core::playCallVideo(int callId)
if(toxav_recv_video(toxav, callId, &image) == 0)
{
if (image)
{
emit videoFrameReceived(*image);
}
else
{
//qDebug() << "Core: Received null video frame\n";
}
}
else
qDebug() << "Core: Error receiving video frame\n";
@ -1276,19 +1309,32 @@ void Core::playCallVideo(int callId)
calls[callId].playVideoTimer.start();
}
void Core::sendVideoFrame(int callId, ToxAv* toxav, vpx_image img)
void Core::sendCallVideo(int callId)
{
uint8_t videobuf[TOXAV_VIDEO_WIDTH * TOXAV_VIDEO_HEIGHT * 4];
int result;
if((result = toxav_prepare_video_frame(toxav, callId, videobuf, sizeof(videobuf), &img)) < 0)
{
qDebug() << QString("Core: Error preparing video frame: %1").arg(result);
if (!calls[callId].active || !calls[callId].videoEnabled)
return;
}
if((result = toxav_send_video(toxav, callId, videobuf, result)) < 0)
qDebug() << QString("Core: Error sending video frame: %1").arg(result);
const int bufsize = TOXAV_MAX_VIDEO_WIDTH * TOXAV_MAX_VIDEO_HEIGHT * 4;
uint8_t videobuf[bufsize];
vpx_image frame = camera->getLastVPXImage();
if (frame.w && frame.h)
{
int result;
if((result = toxav_prepare_video_frame(toxav, callId, videobuf, bufsize, &frame)) < 0)
{
qDebug() << QString("Core: toxav_prepare_video_frame: error %1").arg(result);
calls[callId].sendVideoTimer.start();
return;
}
if((result = toxav_send_video(toxav, callId, (uint8_t*)videobuf, result)) < 0)
qDebug() << QString("Core: toxav_send_video error: %1").arg(result);
}
else
qDebug("Core::sendCallVideo: Invalid frame (bad camera ?)");
calls[callId].sendVideoTimer.start();
}
void Core::groupInviteFriend(int friendId, int groupId)
@ -1300,14 +1346,3 @@ void Core::createGroup()
{
emit emptyGroupCreated(tox_add_groupchat(tox));
}
void Core::dispatchVideoFrame(vpx_image img) const
{
for (int i=0; i<TOXAV_MAX_CALLS; i++)
{
if (calls[i].active && calls[i].videoEnabled)
{
sendVideoFrame(i, toxav, img);
}
}
}

14
core.h
View File

@ -17,7 +17,6 @@
#ifndef CORE_HPP
#define CORE_HPP
#include "status.h"
#include "audiobuffer.h"
#include <tox/tox.h>
@ -43,9 +42,15 @@
#define TOXAV_RINGING_TIME 15
// TODO: Put that in the settings
#define TOXAV_MAX_VIDEO_WIDTH 1600
#define TOXAV_MAX_VIDEO_HEIGHT 1200
#define TOXAV_VIDEO_WIDTH 640
#define TOXAV_VIDEO_HEIGHT 480
class Camera;
enum class Status : int {Online = 0, Away, Busy, Offline};
struct DhtServer
{
QString name;
@ -104,7 +109,7 @@ class Core : public QObject
{
Q_OBJECT
public:
explicit Core();
explicit Core(Camera* cam);
~Core();
int getGroupNumberPeers(int groupId) const;
@ -127,9 +132,9 @@ public slots:
void removeFriend(int friendId);
void removeGroup(int groupId);
void setStatus(Status status);
void setUsername(const QString& username);
void setStatusMessage(const QString& message);
void setStatus(Status status);
void sendMessage(int friendId, const QString& message);
void sendGroupMessage(int groupId, const QString& message);
@ -250,7 +255,7 @@ private:
static void playCallAudio(int callId, ToxAv* toxav);
static void sendCallAudio(int callId, ToxAv* toxav); // Blocking, start in a thread
void playCallVideo(int callId);
static void sendVideoFrame(int callId, ToxAv* toxav, vpx_image img);
void sendCallVideo(int callId);
void checkConnection();
void onBootstrapTimer();
@ -268,6 +273,7 @@ private:
Tox* tox;
ToxAv* toxav;
QTimer *toxTimer, *saveTimer, *fileTimer, *bootstrapTimer;
Camera* camera;
QList<DhtServer> dhtServerList;
int dhtServerId;
static QList<ToxFile> fileSendQueue, fileRecvQueue;

3
dialogs.ini Normal file
View File

@ -0,0 +1,3 @@
[General]
geometry=@Rect(147 345 604 375)
maximized=false

View File

@ -1,7 +1,6 @@
#include "friend.h"
#include "friendlist.h"
#include "widget/friendwidget.h"
#include "status.h"
Friend::Friend(int FriendId, QString UserId)
: friendId(FriendId), userId(UserId)

View File

@ -3,9 +3,8 @@
#include <QString>
#include "widget/form/chatform.h"
#include "status.h"
class FriendWidget;
struct FriendWidget;
struct Friend
{

View File

@ -4,7 +4,7 @@
#include <QString>
#include <QList>
class Friend;
struct Friend;
class FriendList
{

View File

@ -90,6 +90,7 @@ void Group::addPeer(int peerId, QString name)
void Group::removePeer(int peerId)
{
peers.remove(peerId);
nPeers--;
widget->onUserListChanged();
chatForm->onUserListChanged();
}

View File

@ -7,7 +7,7 @@
#define RETRY_PEER_INFO_INTERVAL 500
class Friend;
struct Friend;
class GroupWidget;
class GroupChatForm;

View File

Before

Width:  |  Height:  |  Size: 164 B

After

Width:  |  Height:  |  Size: 164 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 172 B

View File

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, 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="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="7.145px" height="6.187px" viewBox="0 0 7.145 6.187" enable-background="new 0 0 7.145 6.187" xml:space="preserve">
<polygon fill="#636365" points="7.145,0 3.572,6.187 0,0 "/>
</svg>

Before

Width:  |  Height:  |  Size: 549 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 249 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 152 B

View File

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, 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="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="7.145px" height="6.187px" viewBox="0 0 7.145 6.187" enable-background="new 0 0 7.145 6.187" xml:space="preserve">
<polygon fill="#FFFFFF" points="7.145,0 3.572,6.187 0,0 "/>
</svg>

Before

Width:  |  Height:  |  Size: 549 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 214 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 274 B

View File

@ -1,38 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, 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="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="13.736px" height="13.708px" viewBox="0 0 13.736 13.708" enable-background="new 0 0 13.736 13.708" xml:space="preserve">
<g>
<path fill="#FFFFFF" d="M13.629,2.874c-0.062-0.255-0.149-0.494-0.256-0.716c-0.188-0.388-0.438-0.719-0.718-0.992
c-0.21-0.206-0.438-0.382-0.672-0.527c-0.353-0.221-0.72-0.377-1.078-0.481c-0.179-0.053-0.355-0.091-0.528-0.118
C10.204,0.014,10.036,0,9.872,0C9.446,0,9.068,0.061,8.744,0.156C8.501,0.228,8.29,0.317,8.107,0.413
C7.835,0.558,7.632,0.713,7.49,0.84C7.396,0.926,7.33,0.996,7.291,1.043L1.279,6.974L1.278,6.977
C1.12,7.134,0.962,7.315,0.812,7.523C0.587,7.834,0.383,8.206,0.235,8.636C0.089,9.066,0,9.556,0,10.099
c0.001,0.216,0.028,0.432,0.079,0.645c0.088,0.371,0.246,0.734,0.461,1.075c0.161,0.256,0.354,0.5,0.578,0.724
c0.336,0.336,0.743,0.626,1.211,0.834c0.233,0.104,0.482,0.187,0.743,0.244c0.262,0.057,0.536,0.088,0.82,0.088
c0.27,0,0.529-0.042,0.774-0.108c0.214-0.06,0.418-0.138,0.609-0.229c0.338-0.16,0.642-0.357,0.914-0.562
c0.406-0.306,0.738-0.629,0.976-0.878c0.235-0.25,0.374-0.426,0.384-0.439L6.44,10.622l0,0l0.51,0.399l-0.51-0.4l0.453,0.356
l-0.452-0.356H6.44l0,0v0.001l0,0c-0.002,0.004-0.093,0.116-0.246,0.282c-0.116,0.126-0.269,0.281-0.447,0.441
c-0.133,0.121-0.28,0.245-0.437,0.358c-0.233,0.175-0.485,0.328-0.73,0.433c-0.123,0.054-0.243,0.094-0.359,0.121
c-0.115,0.027-0.225,0.04-0.328,0.04c-0.185,0-0.36-0.021-0.527-0.058c-0.293-0.063-0.561-0.182-0.803-0.336
c-0.181-0.115-0.346-0.253-0.49-0.403c-0.217-0.227-0.387-0.481-0.499-0.73c-0.056-0.125-0.098-0.246-0.124-0.36
S1.41,10.19,1.41,10.099c0-0.26,0.028-0.493,0.075-0.705C1.557,9.077,1.671,8.806,1.81,8.571c0.138-0.234,0.302-0.433,0.466-0.597
l6.065-5.986l0.023-0.03c0.009-0.01,0.042-0.048,0.104-0.1c0.096-0.08,0.252-0.191,0.48-0.282C9.063,1.53,9.195,1.489,9.348,1.459
s0.326-0.048,0.524-0.048c0.1,0,0.219,0.01,0.348,0.032c0.226,0.038,0.48,0.116,0.727,0.232c0.186,0.089,0.366,0.198,0.53,0.329
c0.124,0.097,0.238,0.207,0.34,0.327c0.152,0.182,0.277,0.388,0.366,0.629c0.09,0.241,0.143,0.518,0.144,0.848
c0,0.151-0.02,0.297-0.053,0.436c-0.053,0.21-0.139,0.407-0.248,0.59s-0.241,0.348-0.376,0.486l-0.001,0.002L8.609,8.496
C8.604,8.5,8.586,8.519,8.553,8.542C8.501,8.579,8.418,8.63,8.306,8.671C8.194,8.712,8.052,8.744,7.869,8.744
c-0.051,0-0.098-0.006-0.141-0.016c-0.075-0.017-0.14-0.047-0.202-0.09c-0.046-0.03-0.089-0.071-0.13-0.118
C7.336,8.449,7.284,8.359,7.248,8.257C7.213,8.155,7.192,8.043,7.192,7.926c0-0.111,0.021-0.216,0.055-0.314
c0.024-0.075,0.058-0.145,0.094-0.207C7.396,7.31,7.455,7.231,7.498,7.183C7.52,7.156,7.537,7.14,7.546,7.13
C7.55,7.127,7.553,7.125,7.554,7.123l0.008-0.008l2.355-2.326L8.925,3.786L6.593,6.09c-0.025,0.024-0.072,0.07-0.13,0.134
c-0.115,0.128-0.278,0.334-0.42,0.618C5.973,6.983,5.907,7.146,5.86,7.328C5.813,7.51,5.781,7.711,5.781,7.926
c0.001,0.281,0.05,0.557,0.143,0.814c0.069,0.193,0.164,0.376,0.282,0.545c0.09,0.126,0.193,0.243,0.31,0.349
c0.176,0.158,0.38,0.289,0.609,0.381c0.229,0.091,0.482,0.141,0.744,0.141c0.273,0,0.521-0.04,0.735-0.1
c0.161-0.045,0.304-0.103,0.427-0.162C9.217,9.803,9.359,9.704,9.46,9.623c0.09-0.07,0.146-0.128,0.174-0.156l3.03-3.166
c0.268-0.277,0.53-0.623,0.732-1.041c0.101-0.209,0.186-0.436,0.245-0.679c0.061-0.242,0.095-0.503,0.095-0.772
C13.736,3.479,13.699,3.167,13.629,2.874z M8.362,1.96L8.362,1.96L8.362,1.96L8.362,1.96z"/>
<polygon fill="#FFFFFF" points="12.666,6.299 12.664,6.301 12.664,6.301 "/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 432 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 307 B

View File

@ -1,10 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, 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="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="21.222px" height="19.66px" viewBox="0 0 21.222 19.66" enable-background="new 0 0 21.222 19.66" xml:space="preserve">
<path fill="#FFFFFF" d="M16.656,0.009c0,0-0.501-0.112-0.723,0.473l-1.782,4.204c0,0-0.334,0.611,0.167,1.196l1.28,1.67
c0,0,0.473,0.446,0.111,0.975c-0.362,0.528-2.255,4.036-7.154,6.235c0,0-0.611,0.417-1.056-0.195
c-0.446-0.612-1.811-2.839-2.674-2.365l-4.509,2.115c0,0-0.39,0.027-0.306,0.835C0.095,15.958-0.017,19.66,5.3,19.66
c6.348,0,15.922-9.061,15.922-14.809c0,0,0-4.843-2.979-4.843H16.656z"/>
</svg>

Before

Width:  |  Height:  |  Size: 890 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 510 B

View File

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, 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="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="12.608px" height="10.029px" viewBox="0 0 12.608 10.029" enable-background="new 0 0 12.608 10.029" xml:space="preserve">
<polygon fill="#FFFFFF" points="4.24,6.707 1.661,4.127 0,5.789 4.24,10.029 4.241,10.029 5.902,8.369 12.608,1.662 10.946,0 "/>
</svg>

Before

Width:  |  Height:  |  Size: 621 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 220 B

View File

@ -1,10 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, 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="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="10.664px" height="11.333px" viewBox="0 0 10.664 11.333" enable-background="new 0 0 10.664 11.333" xml:space="preserve">
<path fill="#FFFFFF" d="M5.332,11.333C2.387,11.332,0.002,8.947,0,6.001h1.582C1.582,7.041,2,7.972,2.68,8.654
c0.682,0.68,1.613,1.098,2.652,1.098s1.973-0.418,2.654-1.098c0.68-0.682,1.098-1.613,1.098-2.652h1.58
C10.664,8.947,8.277,11.332,5.332,11.333z M3.75,1.5c0,0.826-0.672,1.5-1.5,1.5s-1.5-0.674-1.5-1.5c0-0.83,0.672-1.5,1.5-1.5
S3.75,0.669,3.75,1.5z M9.75,1.5c0,0.826-0.672,1.5-1.5,1.5s-1.5-0.674-1.5-1.5c0-0.83,0.672-1.5,1.5-1.5S9.75,0.669,9.75,1.5z"/>
</svg>

Before

Width:  |  Height:  |  Size: 953 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 323 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 178 B

View File

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, 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="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="10.086px" height="10.087px" viewBox="0 0 10.086 10.087" enable-background="new 0 0 10.086 10.087" xml:space="preserve">
<polygon fill="#FFFFFF" points="10.086,1.692 8.395,0 5.043,3.351 1.693,0.001 0,1.693 3.35,5.043 0,8.394 1.693,10.086
5.043,6.736 8.395,10.087 10.086,8.394 6.734,5.043 "/>
</svg>

Before

Width:  |  Height:  |  Size: 668 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 265 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 142 B

View File

@ -1,10 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, 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="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="8.4px" height="9.4px" viewBox="0 0 8.4 9.4" enable-background="new 0 0 8.4 9.4" xml:space="preserve">
<g>
<rect y="0.002" fill="#FFFFFF" width="2.395" height="9.398"/>
<rect x="6.007" fill="#FFFFFF" width="2.395" height="9.4"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 610 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 129 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 327 B

View File

@ -1,10 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, 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="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="19.509px" height="23.089px" viewBox="0 0 19.509 23.089" enable-background="new 0 0 19.509 23.089" xml:space="preserve">
<path fill="#FFFFFF" d="M3.663,2.025C2.146,3.105,0.95,4.664,0.417,6.458c-0.68,2.182-0.537,4.631,0.494,6.682
c1.055,2.143,3.014,3.775,5.248,4.58c1.865,0.723,3.939,0.826,5.881,0.365c-0.232,1.795-1.008,3.461-1.922,5.004
c2.865-1.863,5.223-4.416,7.145-7.227c1.414-2.119,2.354-4.643,2.236-7.219c-0.104-2.264-1.211-4.419-2.852-5.96
c-1.777-1.665-4.189-2.613-6.619-2.677C7.757-0.078,5.485,0.677,3.663,2.025z"/>
</svg>

Before

Width:  |  Height:  |  Size: 902 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 533 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 248 B

View File

@ -1,10 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, 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="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="22.625px" height="14.396px" viewBox="0 0 22.625 14.396" enable-background="new 0 0 22.625 14.396" xml:space="preserve">
<g>
<path fill="#FFFFFF" d="M8.845,2c0-1.1,0.9-2,2-2h9.78c1.1,0,2,0.9,2,2v10.396c0,1.1-0.9,2-2,2h-9.78c-1.1,0-2-0.9-2-2V2z"/>
<polygon fill="#FFFFFF" points="0,12.916 7.509,8.581 7.509,5.814 0,1.48 "/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 705 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 382 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 183 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 267 B

View File

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, 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="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="15.884px" height="15.883px" viewBox="0 0 15.884 15.883" enable-background="new 0 0 15.884 15.883" xml:space="preserve">
<polygon fill="#FFFFFF" points="9.563,6.319 9.563,0 6.321,0 6.321,6.321 0,6.321 0,9.563 6.321,9.563 6.321,15.883 9.563,15.883
9.563,9.563 15.884,9.563 15.884,6.319 "/>
</svg>

Before

Width:  |  Height:  |  Size: 665 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 192 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 314 B

View File

@ -1,20 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, 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="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="15.402px" height="15.918px" viewBox="0 0 15.402 15.918" enable-background="new 0 0 15.402 15.918" xml:space="preserve">
<g>
<path fill="#FFFFFF" d="M9.429,11.411c4.71,1.681,3.195,4.507,3.195,4.507H2.666c0,0-0.773-3.161,3.465-4.507
C6.131,11.411,7.813,12.823,9.429,11.411z"/>
<path fill="#FFFFFF" d="M4.92,6.682c0,0,0.27,3.938,2.793,3.938s2.826-3.668,2.826-3.668s0.101-3.194-2.826-3.194
S4.92,6.682,4.92,6.682z"/>
<path fill="#FFFFFF" d="M3.359,7.276c-0.005-0.092-0.016-0.52,0.093-1.082c-0.521-0.1-0.841-0.336-0.841-0.336
c-3.15,1.045-2.569,3.23-2.569,3.23h3.651C3.428,8.178,3.368,7.413,3.361,7.313L3.359,7.276z"/>
<path fill="#FFFFFF" d="M12.1,7.522v0.041l-0.004,0.04c-0.035,0.427-0.127,0.944-0.29,1.485h3.554c0,0,0.583-2.186-2.567-3.23
c0,0-0.319,0.234-0.835,0.335C12.111,6.877,12.104,7.414,12.1,7.522z"/>
<path fill="#FFFFFF" d="M5.904,2.525C5.923,2.403,5.93,2.328,5.93,2.328S6.002,0,3.88,0S1.855,2.131,1.855,2.131
s0.18,2.606,1.781,2.85c0.176-0.513,0.461-1.063,0.922-1.545C4.859,3.121,5.297,2.774,5.904,2.525z"/>
<path fill="#FFFFFF" d="M11.758,4.99c1.664-0.17,1.869-2.662,1.869-2.662S13.699,0,11.576,0C9.455,0,9.553,2.131,9.553,2.131
s0.013,0.183,0.061,0.454c0.519,0.238,0.905,0.548,1.18,0.832C11.262,3.901,11.564,4.459,11.758,4.99z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 503 B

View File

@ -1,19 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, 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="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="15.615px" height="15.616px" viewBox="0 0 15.615 15.616" enable-background="new 0 0 15.615 15.616" xml:space="preserve">
<path fill="#FFFFFF" d="M15.615,7.034c0-0.197-0.163-0.358-0.358-0.358h-0.66c-0.199,0-0.407-0.154-0.462-0.345l-0.896-2.092
c-0.095-0.171-0.064-0.425,0.075-0.567l0.446-0.445c0.14-0.14,0.14-0.367,0-0.507l-1.073-1.074c-0.139-0.14-0.367-0.14-0.51,0
L11.694,2.13c-0.142,0.142-0.399,0.18-0.574,0.09L9.3,1.49c-0.19-0.053-0.348-0.259-0.348-0.458V0.357C8.952,0.162,8.791,0,8.596,0
h-1.52C6.879,0,6.717,0.162,6.717,0.357v0.675c0,0.199-0.156,0.406-0.344,0.465L4.263,2.4c-0.17,0.099-0.422,0.066-0.563-0.072
L3.225,1.854c-0.138-0.139-0.367-0.139-0.506,0L1.645,2.929c-0.141,0.14-0.141,0.367,0,0.507l0.515,0.519
c0.143,0.14,0.181,0.396,0.089,0.57L1.531,6.33C1.478,6.521,1.272,6.676,1.073,6.676H0.357C0.16,6.676,0,6.837,0,7.034v1.519
c0,0.198,0.16,0.36,0.357,0.36h0.716c0.199,0,0.407,0.154,0.464,0.344l0.882,2.076c0.101,0.171,0.065,0.425-0.072,0.564L1.853,12.39
c-0.139,0.14-0.139,0.367,0,0.507l1.076,1.074c0.14,0.14,0.368,0.14,0.505,0l0.528-0.525c0.141-0.14,0.394-0.177,0.57-0.083
l1.841,0.734c0.188,0.055,0.344,0.262,0.344,0.458v0.702c0,0.198,0.162,0.359,0.359,0.359h1.52c0.195,0,0.356-0.161,0.356-0.359
v-0.702c0-0.196,0.156-0.403,0.348-0.461l2.059-0.874c0.172-0.097,0.422-0.063,0.564,0.075l0.465,0.468
c0.139,0.139,0.368,0.139,0.507,0l1.076-1.076c0.139-0.139,0.139-0.368,0-0.506l-0.497-0.495c-0.137-0.14-0.176-0.396-0.082-0.57
l0.746-1.857c0.052-0.19,0.26-0.345,0.459-0.347h0.66c0.195,0,0.358-0.161,0.358-0.358V7.034z M7.808,10.36
c-1.411,0-2.552-1.143-2.552-2.553s1.141-2.552,2.552-2.552c1.409,0,2.554,1.142,2.554,2.552S9.217,10.36,7.808,10.36z"/>
</svg>

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 474 B

View File

@ -1,18 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, 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="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="15.604px" height="15.604px" viewBox="0 0 15.604 15.604" enable-background="new 0 0 15.604 15.604" xml:space="preserve">
<g>
<path fill="#FFFFFF" d="M6.303,15.588c-0.104-0.018-0.24-0.057-0.317-0.15s-0.149-0.301-0.119-0.604L6.482,8.78
c0.023-0.23,0.115-0.492,0.297-0.461c0.133,0.023,0.34,0.164,0.552,0.375l1.4,1.4l4.144-4.145c0.076-0.076,0.191-0.105,0.321-0.084
c0.131,0.023,0.263,0.096,0.37,0.203l1.828,1.828c0.223,0.223,0.277,0.533,0.117,0.691l-4.143,4.143l1.4,1.4
c0.293,0.293,0.387,0.508,0.377,0.602s-0.138,0.215-0.463,0.248l-6.055,0.615C6.513,15.608,6.402,15.606,6.303,15.588L6.303,15.588
z"/>
<path fill="#FFFFFF" d="M9.303,0.015c0.102,0.018,0.24,0.057,0.316,0.15C9.696,0.259,9.77,0.467,9.738,0.77L9.122,6.825
C9.1,7.055,9.006,7.315,8.825,7.284C8.691,7.26,8.484,7.122,8.273,6.911l-1.4-1.4L2.729,9.655C2.652,9.731,2.539,9.76,2.408,9.737
C2.277,9.715,2.146,9.645,2.037,9.536L0.209,7.708c-0.223-0.223-0.275-0.533-0.117-0.693l4.143-4.143l-1.4-1.4
c-0.292-0.291-0.385-0.505-0.375-0.6c0.01-0.094,0.137-0.215,0.462-0.247l6.056-0.617C9.092-0.005,9.201-0.002,9.303,0.015
L9.303,0.015z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 433 B

View File

Before

Width:  |  Height:  |  Size: 790 B

After

Width:  |  Height:  |  Size: 790 B

View File

Before

Width:  |  Height:  |  Size: 744 B

After

Width:  |  Height:  |  Size: 744 B

View File

Before

Width:  |  Height:  |  Size: 512 B

After

Width:  |  Height:  |  Size: 512 B

BIN
img/group_dark.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 671 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 361 KiB

View File

Before

Width:  |  Height:  |  Size: 291 B

After

Width:  |  Height:  |  Size: 291 B

View File

@ -1,36 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, 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="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="10.057px" height="10.055px" viewBox="0 0 10.057 10.055" enable-background="new 0 0 10.057 10.055" xml:space="preserve">
<path fill="#C94F4F" d="M5.029,0C2.252,0,0,2.25,0,5.027s2.252,5.027,5.029,5.027c2.775,0,5.027-2.25,5.027-5.027S7.805,0,5.029,0z
M5.029,8.641c-1.996,0-3.613-1.617-3.613-3.613c0-1.033,0.434-1.967,1.131-2.625C2.549,2.4,2.553,2.396,2.555,2.395
c0.033-0.031,0.066-0.061,0.098-0.09c0.008-0.004,0.014-0.01,0.02-0.016C2.705,2.262,2.736,2.234,2.77,2.207
c0.006-0.004,0.014-0.01,0.02-0.014C2.93,2.082,3.08,1.98,3.238,1.891C3.25,1.883,3.264,1.875,3.277,1.867
C3.307,1.85,3.336,1.834,3.367,1.82c0.018-0.012,0.037-0.02,0.055-0.029C3.449,1.777,3.479,1.762,3.508,1.75
C3.529,1.74,3.549,1.73,3.57,1.721c0.027-0.012,0.057-0.023,0.084-0.035c0.023-0.01,0.047-0.02,0.07-0.027
c0.027-0.012,0.055-0.021,0.08-0.031c0.029-0.01,0.057-0.02,0.086-0.029c0.035-0.012,0.07-0.023,0.105-0.033
c0.039-0.012,0.078-0.023,0.115-0.033c0.023-0.006,0.047-0.01,0.068-0.016C4.213,1.508,4.244,1.5,4.275,1.494
c0.023-0.006,0.049-0.012,0.072-0.016c0.031-0.006,0.064-0.012,0.096-0.016c0.023-0.004,0.049-0.01,0.072-0.012
c0.033-0.004,0.066-0.01,0.1-0.014c0.023-0.002,0.047-0.004,0.068-0.006c0.037-0.006,0.076-0.008,0.113-0.01
C4.816,1.42,4.836,1.42,4.855,1.418c0.057-0.002,0.113-0.004,0.17-0.004c0,0,0.002,0,0.004,0l0,0l0,0
c0.059,0,0.115,0.002,0.174,0.004C5.221,1.42,5.238,1.42,5.256,1.422c0.041,0.002,0.08,0.004,0.121,0.01
c0.02,0.002,0.039,0.004,0.061,0.006c0.037,0.004,0.074,0.01,0.109,0.014c0.021,0.002,0.043,0.008,0.063,0.01
c0.037,0.006,0.074,0.014,0.109,0.02c0.02,0.004,0.039,0.008,0.059,0.012C5.818,1.5,5.857,1.51,5.896,1.52
c0.016,0.004,0.029,0.008,0.045,0.01c0.055,0.016,0.107,0.029,0.162,0.047c0,0,0,0.002,0.002,0.002
C6.158,1.594,6.209,1.611,6.26,1.629c0.016,0.008,0.031,0.014,0.047,0.018C6.344,1.66,6.379,1.676,6.414,1.689
c0.018,0.008,0.037,0.016,0.055,0.023c0.033,0.016,0.064,0.029,0.096,0.045c0.02,0.008,0.039,0.016,0.059,0.027
c0.029,0.014,0.061,0.029,0.092,0.047C6.732,1.84,6.75,1.85,6.77,1.859c0.031,0.018,0.063,0.037,0.096,0.057
C6.881,1.924,6.895,1.934,6.91,1.941C6.957,1.971,7,1.998,7.045,2.027c0.014,0.01,0.027,0.02,0.039,0.029
C7.115,2.078,7.146,2.1,7.176,2.123c0.02,0.014,0.039,0.027,0.057,0.043c0.023,0.018,0.047,0.035,0.07,0.053
c0.021,0.018,0.041,0.035,0.061,0.053s0.041,0.033,0.063,0.051c0.02,0.02,0.039,0.037,0.061,0.057
c0.018,0.018,0.037,0.035,0.055,0.053c0.021,0.02,0.041,0.039,0.061,0.061C7.619,2.51,7.635,2.527,7.652,2.543
c0.02,0.023,0.041,0.043,0.061,0.066c0.004,0.004,0.006,0.006,0.01,0.01c0.053,0.059,0.102,0.119,0.152,0.184
c0.01,0.014,0.021,0.027,0.033,0.041c0.02,0.027,0.039,0.055,0.059,0.082C7.979,2.941,7.99,2.957,8,2.973
C8.02,3,8.039,3.029,8.057,3.057c0.01,0.016,0.021,0.031,0.031,0.049c0.018,0.027,0.037,0.057,0.055,0.088
C8.15,3.207,8.158,3.223,8.166,3.236c0.02,0.033,0.037,0.064,0.055,0.098c0.006,0.01,0.01,0.02,0.016,0.029
C8.297,3.48,8.352,3.602,8.4,3.727c0.004,0.008,0.006,0.018,0.01,0.025c0.014,0.037,0.027,0.074,0.039,0.111
c0.006,0.014,0.01,0.029,0.016,0.043c0.01,0.035,0.021,0.072,0.031,0.107c0.006,0.016,0.01,0.031,0.014,0.047
c0.01,0.037,0.02,0.072,0.029,0.109c0.002,0.004,0.002,0.01,0.004,0.016l0,0c0.064,0.27,0.1,0.551,0.1,0.842
C8.643,7.023,7.023,8.641,5.029,8.641z"/>
</svg>

Before

Width:  |  Height:  |  Size: 3.5 KiB

View File

@ -1,40 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, 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="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="16.814px" height="16.816px" viewBox="0 0 16.814 16.816" enable-background="new 0 0 16.814 16.816" xml:space="preserve">
<path fill="#C94F4F" d="M8.408,3.381c-2.777,0-5.029,2.25-5.029,5.027s2.252,5.027,5.029,5.027c2.775,0,5.027-2.25,5.027-5.027
S11.184,3.381,8.408,3.381z M8.408,12.021c-1.996,0-3.613-1.617-3.613-3.613c0-1.033,0.434-1.967,1.131-2.625
c0.002-0.002,0.006-0.006,0.008-0.008C5.967,5.744,6,5.715,6.031,5.686c0.008-0.004,0.014-0.01,0.02-0.016
c0.033-0.027,0.064-0.055,0.098-0.082c0.006-0.004,0.014-0.01,0.02-0.014c0.141-0.111,0.291-0.213,0.449-0.303
c0.012-0.008,0.025-0.016,0.039-0.023c0.029-0.018,0.059-0.033,0.09-0.047c0.018-0.012,0.037-0.02,0.055-0.029
c0.027-0.014,0.057-0.029,0.086-0.041c0.021-0.01,0.041-0.02,0.063-0.029C6.977,5.09,7.006,5.078,7.033,5.066
c0.023-0.01,0.047-0.02,0.07-0.027c0.027-0.012,0.055-0.021,0.08-0.031c0.029-0.01,0.057-0.02,0.086-0.029
c0.035-0.012,0.07-0.023,0.105-0.033C7.414,4.934,7.453,4.922,7.49,4.912c0.023-0.006,0.047-0.01,0.068-0.016
c0.033-0.008,0.064-0.016,0.096-0.021c0.023-0.006,0.049-0.012,0.072-0.016c0.031-0.006,0.064-0.012,0.096-0.016
c0.023-0.004,0.049-0.01,0.072-0.012c0.033-0.004,0.066-0.01,0.1-0.014c0.023-0.002,0.047-0.004,0.068-0.006
C8.1,4.807,8.139,4.805,8.176,4.803c0.02-0.002,0.039-0.002,0.059-0.004c0.057-0.002,0.113-0.004,0.17-0.004c0,0,0.002,0,0.004,0
l0,0l0,0c0.059,0,0.115,0.002,0.174,0.004C8.6,4.801,8.617,4.801,8.635,4.803c0.041,0.002,0.08,0.004,0.121,0.01
c0.02,0.002,0.039,0.004,0.061,0.006c0.037,0.004,0.074,0.01,0.109,0.014c0.021,0.002,0.043,0.008,0.063,0.01
c0.037,0.006,0.074,0.014,0.109,0.02c0.02,0.004,0.039,0.008,0.059,0.012C9.197,4.881,9.236,4.891,9.275,4.9
C9.291,4.904,9.305,4.908,9.32,4.91c0.055,0.016,0.107,0.029,0.162,0.047c0,0,0,0.002,0.002,0.002
C9.537,4.975,9.588,4.992,9.639,5.01C9.654,5.018,9.67,5.023,9.686,5.027C9.723,5.041,9.758,5.057,9.793,5.07
C9.811,5.078,9.83,5.086,9.848,5.094c0.033,0.016,0.064,0.029,0.096,0.045c0.02,0.008,0.039,0.016,0.059,0.027
c0.029,0.014,0.061,0.029,0.092,0.047c0.018,0.008,0.035,0.018,0.055,0.027c0.031,0.018,0.063,0.037,0.096,0.057
c0.016,0.008,0.029,0.018,0.045,0.025c0.047,0.029,0.09,0.057,0.135,0.086c0.014,0.01,0.027,0.02,0.039,0.029
c0.031,0.021,0.063,0.043,0.092,0.066c0.02,0.014,0.039,0.027,0.057,0.043c0.023,0.018,0.047,0.035,0.07,0.053
c0.021,0.018,0.041,0.035,0.061,0.053s0.041,0.033,0.063,0.051c0.02,0.02,0.039,0.037,0.061,0.057
c0.018,0.018,0.037,0.035,0.055,0.053c0.021,0.02,0.041,0.039,0.061,0.061c0.018,0.018,0.033,0.035,0.051,0.051
c0.02,0.023,0.041,0.043,0.061,0.066c0.004,0.004,0.006,0.006,0.01,0.01c0.053,0.059,0.102,0.119,0.152,0.184
c0.01,0.014,0.021,0.027,0.033,0.041c0.02,0.027,0.039,0.055,0.059,0.082c0.012,0.016,0.023,0.031,0.033,0.047
c0.02,0.027,0.039,0.057,0.057,0.084c0.01,0.016,0.021,0.031,0.031,0.049c0.018,0.027,0.037,0.057,0.055,0.088
c0.008,0.014,0.016,0.029,0.023,0.043c0.02,0.033,0.037,0.064,0.055,0.098c0.006,0.01,0.01,0.02,0.016,0.029
c0.061,0.117,0.115,0.238,0.164,0.363c0.004,0.008,0.006,0.018,0.01,0.025c0.014,0.037,0.027,0.074,0.039,0.111
c0.006,0.014,0.01,0.029,0.016,0.043c0.01,0.035,0.021,0.072,0.031,0.107c0.006,0.016,0.01,0.031,0.014,0.047
c0.01,0.037,0.02,0.072,0.029,0.109c0.002,0.004,0.002,0.01,0.004,0.016l0,0c0.064,0.27,0.1,0.551,0.1,0.842
C12.021,10.404,10.402,12.021,8.408,12.021z"/>
<path fill="#C94F4F" d="M8.408,0C3.765,0.001,0,3.766,0,8.408c0,4.644,3.765,8.407,8.408,8.408c4.644-0.001,8.405-3.766,8.406-8.408
C16.813,3.766,13.052,0.001,8.408,0z M13.292,13.293c-1.253,1.251-2.975,2.023-4.884,2.023s-3.632-0.772-4.885-2.023
C2.272,12.04,1.5,10.317,1.5,8.408c0-1.909,0.772-3.632,2.023-4.884C4.776,2.272,6.499,1.501,8.408,1.5
c1.909,0.001,3.631,0.772,4.884,2.023c1.251,1.253,2.022,2.976,2.022,4.885S14.543,12.04,13.292,13.293z"/>
</svg>

Before

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 852 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 807 B

View File

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, 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="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="10.059px" height="10.055px" viewBox="0 0 10.059 10.055" enable-background="new 0 0 10.059 10.055" xml:space="preserve">
<path fill="#CEBF43" d="M5.029,0C2.252,0,0,2.25,0,5.027s2.252,5.027,5.029,5.027s5.029-2.25,5.029-5.027S7.807,0,5.029,0z
M1.416,5.027c0-1.996,1.617-3.613,3.613-3.613s3.613,1.617,3.613,3.613H1.416z"/>
</svg>

Before

Width:  |  Height:  |  Size: 696 B

View File

@ -1,14 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, 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="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="16.814px" height="16.817px" viewBox="0 0 16.814 16.817" enable-background="new 0 0 16.814 16.817" xml:space="preserve">
<g>
<path fill="#CEBF43" d="M8.441,3.475c-2.777,0-5.029,2.25-5.029,5.028c0,2.777,2.252,5.027,5.029,5.027s5.029-2.25,5.029-5.027
C13.47,5.725,11.218,3.475,8.441,3.475z M4.828,8.502c0-1.997,1.617-3.614,3.613-3.614s3.613,1.617,3.613,3.614H4.828z"/>
<path fill="#CEBF43" d="M15.314,8.409c0,1.909-0.771,3.632-2.022,4.885c-1.253,1.251-2.975,2.023-4.884,2.023
s-3.632-0.772-4.884-2.023C2.272,12.041,1.5,10.318,1.5,8.409c0-1.91,0.772-3.632,2.024-4.885C4.776,2.272,6.499,1.5,8.408,1.5
c1.909,0,3.631,0.772,4.884,2.024C14.542,4.776,15.314,6.499,15.314,8.409h1.5C16.813,3.765,13.051,0,8.408,0
C3.764,0,0,3.765,0,8.409c0,4.644,3.764,8.407,8.408,8.408c4.644-0.001,8.405-3.766,8.406-8.408H15.314z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 825 B

View File

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, 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="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="10px" height="10px" viewBox="0 0 10 10" enable-background="new 0 0 10 10" xml:space="preserve">
<path fill="#6FC062" d="M10,5c0,2.761-2.24,5-5,5c-2.762,0-5-2.239-5-5s2.238-5,5-5C7.759,0,10,2.239,10,5"/>
</svg>

Before

Width:  |  Height:  |  Size: 578 B

View File

@ -1,14 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, 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="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="16.814px" height="16.816px" viewBox="0 0 16.814 16.816" enable-background="new 0 0 16.814 16.816" xml:space="preserve">
<g>
<path fill="#6FC062" d="M13.408,8.408c0,2.761-2.24,5-5,5c-2.762,0-5-2.239-5-5c0-2.761,2.238-5,5-5
C11.168,3.408,13.408,5.646,13.408,8.408"/>
<path fill="#6FC062" d="M15.314,8.408c0,1.909-0.771,3.632-2.022,4.885c-1.253,1.251-2.975,2.023-4.884,2.023
s-3.632-0.772-4.884-2.023C2.272,12.04,1.5,10.317,1.5,8.408c0-1.91,0.772-3.632,2.023-4.884C4.776,2.272,6.499,1.5,8.408,1.5
c1.909,0,3.631,0.772,4.884,2.023C14.543,4.776,15.314,6.498,15.314,8.408h1.5C16.813,3.764,13.052,0,8.408,0
C3.765,0,0,3.764,0,8.408c0,4.644,3.765,8.407,8.408,8.408c4.644-0.001,8.405-3.766,8.406-8.408H15.314z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 766 B

View File

Before

Width:  |  Height:  |  Size: 288 B

After

Width:  |  Height:  |  Size: 288 B

View File

@ -24,9 +24,10 @@ int main(int argc, char *argv[])
/** TODO
* ">using a dedicated tool to maintain a TODO list" edition
*
* QRC FILES DO YOU EVEN INTO THEM ? Fix it soon for packaging and Urras.
* Most cameras use YUYV, implement YUYV -> YUV240
* Sending large files (~380MB) "restarts" after ~10MB. Goes back to 0%, consumes twice as much ram (reloads the file?)
* => Don't load the whole file at once, load small chunks (25MB?) when needed, then free them and load the next
* Notifications/ringing when a call is received
* Sort the friend list by status, online first then busy then offline
* Don't do anything if a friend is disconnected, don't print to the chat
* Changing online/away/busy/offline by clicking the bubble
@ -36,7 +37,6 @@ int main(int argc, char *argv[])
* Show the picture's size between name and size after transfer completion if it's a pic
* Adjust all status icons to match the mockup, including scooting the friendslist ones to the left and making the user one the same size
* Sidepanel (friendlist) should be resizeable
* The online/offline/away status at the top (our) is way too big i think (follow the mockup/uTox)
* An extra side panel for groupchats, like Venom does (?)
*
* In the file transfer widget:

93
res.qrc
View File

@ -5,4 +5,97 @@
<qresource prefix="/font">
<file alias="DejaVuSans.ttf">res/DejaVuSans.ttf</file>
</qresource>
<qresource prefix="/">
<file>audio/notification.wav</file>
<file>img/icon.png</file>
<file>img/contact.png</file>
<file>img/contact_dark.png</file>
<file>img/group.png</file>
<file>img/status/dot_away.png</file>
<file>img/status/dot_away_2x.png</file>
<file>img/status/dot_away_notification.png</file>
<file>img/status/dot_groupchat.png</file>
<file>img/status/dot_groupchat_newmessages.png</file>
<file>img/status/dot_groupchat_notification.png</file>
<file>img/status/dot_idle.png</file>
<file>img/status/dot_idle_2x.png</file>
<file>img/status/dot_idle_notification.png</file>
<file>img/status/dot_online.png</file>
<file>img/status/dot_online_2x.png</file>
<file>img/status/dot_online_notification.png</file>
<file>img/add.png</file>
<file>img/settings.png</file>
<file>img/transfer.png</file>
<file>ui/acceptFileButton/default.png</file>
<file>ui/acceptFileButton/hover.png</file>
<file>ui/acceptFileButton/pressed.png</file>
<file>ui/acceptFileButton/style.css</file>
<file>ui/callButton/callButton.css</file>
<file>ui/callButton/callButton.png</file>
<file>ui/callButton/callButtonDisabled.png</file>
<file>ui/callButton/callButtonHover.png</file>
<file>ui/callButton/callButtonPressed.png</file>
<file>ui/callButton/callButtonRed.png</file>
<file>ui/callButton/callButtonRedHover.png</file>
<file>ui/callButton/callButtonRedPressed.png</file>
<file>ui/callButton/callButtonYellow.png</file>
<file>ui/callButton/callButtonYellowHover.png</file>
<file>ui/callButton/callButtonYellowPressed.png</file>
<file>ui/chatArea/chatArea.css</file>
<file>ui/chatArea/scrollBarDownArrow.png</file>
<file>ui/chatArea/scrollBarDownArrowHover.png</file>
<file>ui/chatArea/scrollBarDownArrowPressed.png</file>
<file>ui/chatArea/scrollBarHandle.png</file>
<file>ui/chatArea/scrollBarUpArrow.png</file>
<file>ui/chatArea/scrollBarUpArrowHover.png</file>
<file>ui/chatArea/scrollBarUpArrowPressed.png</file>
<file>ui/emoteButton/emoteButton.css</file>
<file>ui/emoteButton/emoteButton.png</file>
<file>ui/emoteButton/emoteButtonHover.png</file>
<file>ui/emoteButton/emoteButtonPressed.png</file>
<file>ui/fileButton/fileButton.css</file>
<file>ui/fileButton/fileButton.png</file>
<file>ui/fileButton/fileButtonHover.png</file>
<file>ui/fileButton/fileButtonPressed.png</file>
<file>ui/msgEdit/msgEdit.css</file>
<file>ui/pauseFileButton/default.png</file>
<file>ui/pauseFileButton/hover.png</file>
<file>ui/pauseFileButton/pressed.png</file>
<file>ui/pauseFileButton/style.css</file>
<file>ui/sendButton/sendButton.css</file>
<file>ui/sendButton/sendButton.png</file>
<file>ui/sendButton/sendButtonHover.png</file>
<file>ui/sendButton/sendButtonPressed.png</file>
<file>ui/stopFileButton/default.png</file>
<file>ui/stopFileButton/hover.png</file>
<file>ui/stopFileButton/pressed.png</file>
<file>ui/stopFileButton/style.css</file>
<file>ui/videoButton/videoButton.css</file>
<file>ui/videoButton/videoButton.png</file>
<file>ui/videoButton/videoButtonDisabled.png</file>
<file>ui/videoButton/videoButtonHover.png</file>
<file>ui/videoButton/videoButtonPressed.png</file>
<file>ui/videoButton/videoButtonRed.png</file>
<file>ui/videoButton/videoButtonRedHover.png</file>
<file>ui/videoButton/videoButtonRedPressed.png</file>
<file>ui/videoButton/videoButtonYellow.png</file>
<file>ui/videoButton/videoButtonYellowHover.png</file>
<file>ui/videoButton/videoButtonYellowPressed.png</file>
<file>img/group_dark.png</file>
<file>ui/window/applicationIcon.png</file>
<file>ui/window/closeButton.png</file>
<file>ui/window/closeButtonHover.png</file>
<file>ui/window/closeButtonPressed.png</file>
<file>ui/window/maximizeButton.png</file>
<file>ui/window/maximizeButtonHover.png</file>
<file>ui/window/maximizeButtonPressed.png</file>
<file>ui/window/minimizeButton.png</file>
<file>ui/window/minimizeButtonHover.png</file>
<file>ui/window/minimizeButtonPressed.png</file>
<file>ui/window/restoreButton.png</file>
<file>ui/window/restoreButtonHover.png</file>
<file>ui/window/restoreButtonPressed.png</file>
<file>ui/friendList/friendList.css</file>
<file>ui/window/window.css</file>
</qresource>
</RCC>

View File

@ -83,6 +83,7 @@ void Settings::load()
s.beginGroup("General");
username = s.value("username", "My name").toString();
statusMessage = s.value("statusMessage", "My status").toString();
enableIPv6 = s.value("enableIPv6", true).toBool();
s.endGroup();
s.beginGroup("Widgets");
@ -142,6 +143,7 @@ void Settings::save()
s.beginGroup("General");
s.setValue("username", username);
s.setValue("statusMessage", statusMessage);
s.setValue("enableIPv6", enableIPv6);
s.endGroup();
s.beginGroup("Widgets");
@ -209,6 +211,16 @@ void Settings::setStatusMessage(const QString& newMessage)
statusMessage = newMessage;
}
bool Settings::getEnableIPv6() const
{
return enableIPv6;
}
void Settings::setEnableIPv6(bool newValue)
{
enableIPv6 = newValue;
}
bool Settings::getEnableLogging() const
{
return enableLogging;

View File

@ -49,6 +49,9 @@ public:
QString getStatusMessage() const;
void setStatusMessage(const QString& newMessage);
bool getEnableIPv6() const;
void setEnableIPv6(bool newValue);
bool getEnableLogging() const;
void setEnableLogging(bool newValue);
@ -130,6 +133,8 @@ private:
QString username;
QString statusMessage;
bool enableIPv6;
bool enableLogging;
bool encryptLogs;

View File

@ -1,35 +0,0 @@
/*
Copyright (C) 2013 by Maxim Biro <nurupo.contributions@gmail.com>
This file is part of Tox Qt GUI.
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 COPYING file for more details.
*/
#include "status.h"
const QList<StatusHelper::Info> StatusHelper::info =
{
{"Online", ":/icons/status_online.png"},
{"Away", ":/icons/status_away.png"},
{"Busy", ":/icons/status_busy.png"},
{"Offline", ":/icons/status_offline.png"}
};
StatusHelper::Info StatusHelper::getInfo(int status)
{
return info.at(status);
}
StatusHelper::Info StatusHelper::getInfo(Status status)
{
return StatusHelper::getInfo(static_cast<int>(status));
}

View File

@ -1,45 +0,0 @@
/*
Copyright (C) 2013 by Maxim Biro <nurupo.contributions@gmail.com>
This file is part of Tox Qt GUI.
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 COPYING file for more details.
*/
#ifndef STATUS_HPP
#define STATUS_HPP
#include <QObject>
enum class Status : int {Online = 0, Away, Busy, Offline};
class StatusHelper
{
public:
static const int MAX_STATUS = static_cast<int>(Status::Offline);
struct Info {
QString name;
QString iconPath;
};
static Info getInfo(int status);
static Info getInfo(Status status);
private:
const static QList<Info> info;
};
Q_DECLARE_METATYPE(Status)
#endif // STATUS_HPP

View File

@ -29,7 +29,6 @@ HEADERS += widget/form/addfriendform.h \
group.h \
grouplist.h \
settings.h \
status.h \
core.h \
friendlist.h \
cdata.h \
@ -49,6 +48,20 @@ RESOURCES += \
LIBS += -ltoxcore -ltoxav -lsodium -lvpx
#### Static linux build
#LIBS += -Wl,-Bstatic -ltoxcore -ltoxav -lsodium -lvpx -lopus -lgstaudiodecoder -lgstcamerabin -lgstmediacapture \
# -lgstmediaplayer -lqgsttools_p -lgstaudio-0.10 -lgstinterfaces-0.10 -lgstvideo-0.10 -lgstpbutils-0.10 \
# -lgstapp-0.10 -lgstbase-0.10 -lgstreamer-0.10 -lgobject-2.0 -lgmodule-2.0 -lxml2 \
# -lqtaudio_alsa -lasound -lqtmultimedia_m3u \
# -lqtaccessiblewidgets -lqconnmanbearer -lqgenericbearer -lqnmbearer \
# -lqxcb -lX11-xcb -lXi -lxcb-render-util -lxcb-glx -lxcb-render -ldbus-1 \
# -lxcb -lxcb-image -lxcb-icccm -lxcb-sync -lxcb-xfixes -lxcb-shm -lxcb-randr -lxcb-shape \
# -lxcb-keysyms -lxcb-xkb -lfontconfig -lfreetype -lXrender -lXext -lX11 \
# -lmtdev -lqdds -lqicns -lqico -lqjp2 -lqmng -lqtga -lqtiff -lqwbmp -lqwebp \
# -lpng -lz -licui18n -licuuc -licudata -lm -ldl -lgthread-2.0 \
# -pthread -lglib-2.0 -lrt -lGL -lpthread -Wl,-Bdynamic
#QMAKE_CXXFLAGS += -Os -flto -static-libstdc++ -static-libgcc
SOURCES += \
widget/form/addfriendform.cpp \
widget/form/chatform.cpp \
@ -71,7 +84,6 @@ SOURCES += \
grouplist.cpp \
main.cpp \
settings.cpp \
status.cpp \
cdata.cpp \
cstring.cpp \
audiobuffer.cpp \

View File

@ -1,7 +1,7 @@
QPushButton
{
background-color: transparent;
background-image: url("ui/acceptFileButton/default.png");
background-image: url(":/ui/acceptFileButton/default.png");
background-repeat: none;
border: none;
width: 24px;
@ -9,12 +9,12 @@ QPushButton
}
QPushButton:hover
{
background-image: url("ui/acceptFileButton/hover.png");
background-image: url(":/ui/acceptFileButton/hover.png");
}
QPushButton:pressed
{
background-image: url("ui/acceptFileButton/pressed.png");
background-image: url(":/ui/acceptFileButton/pressed.png");
}
QPushButton:focus {

View File

@ -1,7 +1,7 @@
QPushButton#green
{
background-color: transparent;
background-image: url("ui/callButton/callButton.png");
background-image: url(":/ui/callButton/callButton.png");
background-repeat: none;
border: none;
width: 50px;
@ -10,18 +10,18 @@ QPushButton#green
QPushButton#green:hover
{
background-image: url("ui/callButton/callButtonHover.png");
background-image: url(":/ui/callButton/callButtonHover.png");
}
QPushButton#green:pressed
{
background-image: url("ui/callButton/callButtonPressed.png");
background-image: url(":/ui/callButton/callButtonPressed.png");
}
QPushButton#red
{
background-color: transparent;
background-image: url("ui/callButton/callButtonRed.png");
background-image: url(":/ui/callButton/callButtonRed.png");
background-repeat: none;
border: none;
width: 50px;
@ -29,18 +29,18 @@ QPushButton#red
}
QPushButton#red:hover
{
background-image: url("ui/callButton/callButtonRedHover.png");
background-image: url(":/ui/callButton/callButtonRedHover.png");
}
QPushButton#red:pressed
{
background-image: url("ui/callButton/callButtonRedPressed.png");
background-image: url(":/ui/callButton/callButtonRedPressed.png");
}
QPushButton#yellow
{
background-color: transparent;
background-image: url("ui/callButton/callButtonYellow.png");
background-image: url(":/ui/callButton/callButtonYellow.png");
background-repeat: none;
border: none;
width: 50px;
@ -48,18 +48,18 @@ QPushButton#yellow
}
QPushButton#yellow:hover
{
background-image: url("ui/callButton/callButtonYellowHover.png");
background-image: url(":/ui/callButton/callButtonYellowHover.png");
}
QPushButton#yellow:pressed
{
background-image: url("ui/callButton/callButtonYellowPressed.png");
background-image: url(":/ui/callButton/callButtonYellowPressed.png");
}
QPushButton#grey
{
background-color: transparent;
background-image: url("ui/callButton/callButtonDisabled.png");
background-image: url(":/ui/callButton/callButtonDisabled.png");
background-repeat: none;
border: none;
width: 50px;

Binary file not shown.

View File

@ -1,21 +1,24 @@
QScrollArea {
background: transparent;
border: 0 0 0 0;
background: white;
border: 0 0 0 0 ;
}
QScrollArea > QWidget > QWidget {
background: transparent;
background: white;
}
QScrollBar:vertical {
background: white;
width: 10px;
margin: 12px 0 12px 0;
background: transparent;
width: 12px;
margin-top: 2px;
margin-bottom: 2px;
}
QScrollBar::handle:vertical {
background: #d1d1d1;
min-height: 20px;
border-radius: 3px;
margin-left: 2px;
}
QScrollBar::handle:vertical:hover {
@ -27,36 +30,19 @@ QScrollBar::handle:vertical:pressed {
}
QScrollBar::add-line:vertical {
background: url("ui/chatArea/scrollBarDownArrow.png") center;
height: 10px;
background: url(":ui/chatArea/scrollBarDownArrow.png") center;
height: 0px;
subcontrol-position: bottom;
subcontrol-origin: margin;
}
QScrollBar::add-line:vertical:hover {
background: url("ui/chatArea/scrollBarDownArrowHover.png") center;
}
QScrollBar::add-line:vertical:pressed {
background: url("ui/chatArea/scrollBarDownArrowPressed.png") center;
}
QScrollBar::sub-line:vertical {
background: url("ui/chatArea/scrollBarUpArrow.png") center;
height: 10px;
background: url(":ui/chatArea/scrollBarUpArrow.png") center;
height: 0px;
subcontrol-position: top;
subcontrol-origin: margin;
}
QScrollBar::sub-line:vertical:hover {
background: url("ui/chatArea/scrollBarUpArrowHover.png") center;
}
QScrollBar::sub-line:vertical:pressed {
background: url("ui/chatArea/scrollBarUpArrowPressed.png") center;
}
QScrollBar:QScrollBar::down-arrow:vertical {
width: 10;
height: 10px;
@ -77,12 +63,13 @@ QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical {
QScrollBar:horizontal {
background: white;
height: 10px;
margin: 0 12px 0 12px;
margin: 0 2px 0 2px;
}
QScrollBar::handle:horizontal {
background: #d1d1d1;
min-width: 20px;
border-radius: 2px;
}
QScrollBar::handle:horizontal:hover {
@ -94,36 +81,19 @@ QScrollBar::handle:horizontal:pressed {
}
QScrollBar::add-line:horizontal {
background: url("ui/chatArea/scrollBarRightArrow.png") center;
width: 10px;
background: url(":ui/chatArea/scrollBarRightArrow.png") center;
width: 0px;
subcontrol-position: right;
subcontrol-origin: margin;
}
QScrollBar::add-line:horizontal:hover {
background: url("ui/chatArea/scrollBarRightArrowHover.png") center;
}
QScrollBar::add-line:horizontal:pressed {
background: url("ui/chatArea/scrollBarRightArrowPressed.png") center;
}
QScrollBar::sub-line:horizontal {
background: url("ui/chatArea/scrollBarLeftArrow.png") center;
width: 10px;
background: url(":ui/chatArea/scrollBarLeftArrow.png") center;
width: 0px;
subcontrol-position: left;
subcontrol-origin: margin;
}
QScrollBar::sub-line:horizontal:hover {
background: url("ui/chatArea/scrollBarLeftArrowHover.png") center;
}
QScrollBar::sub-line:horizontal:pressed {
background: url("ui/chatArea/scrollBarLeftArrowPressed.png") center;
}
QScrollBar:QScrollBar::down-arrow:horizontal {
width: 10;
height: 10px;

Binary file not shown.

View File

@ -1,7 +1,7 @@
QPushButton
{
background-color: transparent;
background-image: url("ui/emoteButton/emoteButton.png");
background-image: url(":/ui/emoteButton/emoteButton.png");
background-repeat: none;
border: none;
width: 24px;
@ -9,12 +9,12 @@ QPushButton
}
QPushButton:hover
{
background-image: url("ui/emoteButton/emoteButtonHover.png");
background-image: url(":/ui/emoteButton/emoteButtonHover.png");
}
QPushButton:pressed
{
background-image: url("ui/emoteButton/emoteButtonPressed.png");
background-image: url(":/ui/emoteButton/emoteButtonPressed.png");
}
QPushButton:focus {

Binary file not shown.

View File

@ -1,7 +1,7 @@
QPushButton
{
background-color: transparent;
background-image: url("ui/fileButton/fileButton.png");
background-image: url(":/ui/fileButton/fileButton.png");
background-repeat: none;
border: none;
width: 24px;
@ -9,12 +9,12 @@ QPushButton
}
QPushButton:hover
{
background-image: url("ui/fileButton/fileButtonHover.png");
background-image: url(":/ui/fileButton/fileButtonHover.png");
}
QPushButton:pressed
{
background-image: url("ui/fileButton/fileButtonPressed.png");
background-image: url(":/ui/fileButton/fileButtonPressed.png");
}
QPushButton:focus {

Binary file not shown.

View File

@ -0,0 +1,34 @@
QScrollArea {
background: #414141!important;
}
QScrollBar:vertical {
background: #414141!important;
width: 14px!important;
margin-top: 2px!important;
margin-bottom: 2px!important;
}
QScrollBar:handle:vertical {
background: #1c1c1c!important;
min-height: 20px!important;
border-radius: 3px!important;
margin-left: 3px!important;
margin-right: 1px!important;
}
QScrollBar:handle:vertical:hover {
background: #2d2d2d!important;
}
QScrollBar:handle:vertical:pressed {
background: #171717!important;
}
QScrollBar:add-line:vertical {height: 0px!important;subcontrol-position: bottom!important;subcontrol-origin: margin!important;}
QScrollBar:sub-line:vertical {height: 0px!important;subcontrol-position: top!important;subcontrol-origin: margin!important;}
QScrollBar:add-page:vertical, QScrollBar::sub-page:vertical {
background: none!important;
}

View File

@ -1,7 +1,7 @@
QPushButton
{
background-color: transparent;
background-image: url("ui/pauseFileButton/default.png");
background-image: url(":/ui/pauseFileButton/default.png");
background-repeat: none;
border: none;
width: 24px;
@ -9,12 +9,12 @@ QPushButton
}
QPushButton:hover
{
background-image: url("ui/pauseFileButton/hover.png");
background-image: url(":/ui/pauseFileButton/hover.png");
}
QPushButton:pressed
{
background-image: url("ui/pauseFileButton/pressed.png");
background-image: url(":/ui/pauseFileButton/pressed.png");
}
QPushButton:focus {

View File

@ -1,7 +1,7 @@
QPushButton
{
background-color: transparent;
background-image: url("ui/sendButton/sendButton.png");
background-image: url(":/ui/sendButton/sendButton.png");
background-repeat: none;
border: none;
width: 50px;
@ -9,12 +9,12 @@ QPushButton
}
QPushButton:hover
{
background-image: url("ui/sendButton/sendButtonHover.png");
background-image: url(":/ui/sendButton/sendButtonHover.png");
}
QPushButton:pressed
{
background-image: url("ui/sendButton/sendButtonPressed.png");
background-image: url(":/ui/sendButton/sendButtonPressed.png");
}
QPushButton:focus {

Binary file not shown.

View File

@ -1,7 +1,7 @@
QPushButton
{
background-color: transparent;
background-image: url("ui/stopFileButton/default.png");
background-image: url(":/ui/stopFileButton/default.png");
background-repeat: none;
border: none;
width: 24px;
@ -9,12 +9,12 @@ QPushButton
}
QPushButton:hover
{
background-image: url("ui/stopFileButton/hover.png");
background-image: url(":/ui/stopFileButton/hover.png");
}
QPushButton:pressed
{
background-image: url("ui/stopFileButton/pressed.png");
background-image: url(":/ui/stopFileButton/pressed.png");
}
QPushButton:focus {

View File

@ -1,7 +1,7 @@
QPushButton#green
{
background-color: transparent;
background-image: url("ui/videoButton/videoButton.png");
background-image: url(":/ui/videoButton/videoButton.png");
background-repeat: none;
border: none;
width: 50px;
@ -10,18 +10,18 @@ QPushButton#green
QPushButton#green:hover
{
background-image: url("ui/videoButton/videoButtonHover.png");
background-image: url(":/ui/videoButton/videoButtonHover.png");
}
QPushButton#green:pressed
{
background-image: url("ui/videoButton/videoButtonPressed.png");
background-image: url(":/ui/videoButton/videoButtonPressed.png");
}
QPushButton#red
{
background-color: transparent;
background-image: url("ui/videoButton/videoButtonRed.png");
background-image: url(":/ui/videoButton/videoButtonRed.png");
background-repeat: none;
border: none;
width: 50px;
@ -29,18 +29,18 @@ QPushButton#red
}
QPushButton#red:hover
{
background-image: url("ui/videoButton/videoButtonRedHover.png");
background-image: url(":/ui/videoButton/videoButtonRedHover.png");
}
QPushButton#red:pressed
{
background-image: url("ui/videoButton/videoButtonRedPressed.png");
background-image: url(":/ui/videoButton/videoButtonRedPressed.png");
}
QPushButton#yellow
{
background-color: transparent;
background-image: url("ui/videoButton/videoButtonYellow.png");
background-image: url(":/ui/videoButton/videoButtonYellow.png");
background-repeat: none;
border: none;
width: 50px;
@ -48,18 +48,18 @@ QPushButton#yellow
}
QPushButton#yellow:hover
{
background-image: url("ui/videoButton/videoButtonYellowHover.png");
background-image: url(":/ui/videoButton/videoButtonYellowHover.png");
}
QPushButton#yellow:pressed
{
background-image: url("ui/videoButton/videoButtonYellowPressed.png");
background-image: url(":/ui/videoButton/videoButtonYellowPressed.png");
}
QPushButton#grey
{
background-color: transparent;
background-image: url("ui/videoButton/videoButtonDisabled.png");
background-image: url(":/ui/videoButton/videoButtonDisabled.png");
background-repeat: none;
border: none;
width: 50px;

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
ui/window/closeButton.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 385 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 370 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 372 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 401 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 401 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 402 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 371 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 371 B

Some files were not shown because too many files have changed in this diff Show More