Merge branch 'upstream/master'
11
README.md
|
@ -11,16 +11,19 @@ However, it is not a fork.
|
||||||
- Group chats
|
- Group chats
|
||||||
- File transfers, with previewing of images
|
- File transfers, with previewing of images
|
||||||
- Audio calls
|
- Audio calls
|
||||||
- Video calls (EXPERIMENTAL, receiving video only, not sending)
|
- Video calls
|
||||||
|
- Tox DNS
|
||||||
|
|
||||||
<h2>Requirements</h2>
|
<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/>
|
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>
|
<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>
|
<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"/>
|
<img src="http://i.imgur.com/66ARBGC.png"/>
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
AudioBuffer::AudioBuffer() :
|
AudioBuffer::AudioBuffer() :
|
||||||
QIODevice(0)
|
QIODevice(0)
|
||||||
{
|
{
|
||||||
open(QIODevice::ReadOnly);
|
open(QIODevice::ReadWrite);
|
||||||
}
|
}
|
||||||
|
|
||||||
AudioBuffer::~AudioBuffer()
|
AudioBuffer::~AudioBuffer()
|
||||||
|
@ -13,29 +13,56 @@ AudioBuffer::~AudioBuffer()
|
||||||
|
|
||||||
qint64 AudioBuffer::readData(char *data, qint64 len)
|
qint64 AudioBuffer::readData(char *data, qint64 len)
|
||||||
{
|
{
|
||||||
const qint64 total = qMin((qint64)buffer.size(), len);
|
qint64 total;
|
||||||
memcpy(data, buffer.constData(), total);
|
bufferMutex.lock();
|
||||||
buffer = buffer.mid(total);
|
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;
|
return total;
|
||||||
}
|
}
|
||||||
|
|
||||||
qint64 AudioBuffer::writeData(const char* data, qint64 len)
|
qint64 AudioBuffer::writeData(const char* data, qint64 len)
|
||||||
{
|
{
|
||||||
buffer.append(data, len);
|
bufferMutex.lock();
|
||||||
return 0;
|
try {
|
||||||
|
buffer.append(data, len);
|
||||||
|
}
|
||||||
|
catch (...)
|
||||||
|
{
|
||||||
|
bufferMutex.unlock();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
bufferMutex.unlock();
|
||||||
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
qint64 AudioBuffer::bytesAvailable() const
|
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
|
qint64 AudioBuffer::bufferSize() const
|
||||||
{
|
{
|
||||||
return buffer.size();
|
bufferMutex.lock();
|
||||||
|
long long size = buffer.size();
|
||||||
|
bufferMutex.unlock();
|
||||||
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AudioBuffer::clear()
|
void AudioBuffer::clear()
|
||||||
{
|
{
|
||||||
|
bufferMutex.lock();
|
||||||
buffer.clear();
|
buffer.clear();
|
||||||
|
bufferMutex.unlock();
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
#include <QIODevice>
|
#include <QIODevice>
|
||||||
#include <QByteArray>
|
#include <QByteArray>
|
||||||
|
#include <QMutex>
|
||||||
|
|
||||||
class AudioBuffer : public QIODevice
|
class AudioBuffer : public QIODevice
|
||||||
{
|
{
|
||||||
|
@ -19,6 +20,7 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QByteArray buffer;
|
QByteArray buffer;
|
||||||
|
mutable QMutex bufferMutex;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // AUDIOBUFFER_H
|
#endif // AUDIOBUFFER_H
|
||||||
|
|
139
core.cpp
|
@ -34,8 +34,8 @@ QList<ToxFile> Core::fileSendQueue;
|
||||||
QList<ToxFile> Core::fileRecvQueue;
|
QList<ToxFile> Core::fileRecvQueue;
|
||||||
ToxCall Core::calls[TOXAV_MAX_CALLS];
|
ToxCall Core::calls[TOXAV_MAX_CALLS];
|
||||||
|
|
||||||
Core::Core() :
|
Core::Core(Camera* cam) :
|
||||||
tox(nullptr)
|
tox(nullptr), camera(cam)
|
||||||
{
|
{
|
||||||
toxTimer = new QTimer(this);
|
toxTimer = new QTimer(this);
|
||||||
toxTimer->setSingleShot(true);
|
toxTimer->setSingleShot(true);
|
||||||
|
@ -63,7 +63,13 @@ Core::~Core()
|
||||||
|
|
||||||
void Core::start()
|
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)
|
if (tox == nullptr)
|
||||||
{
|
{
|
||||||
qCritical() << "Tox core failed to start";
|
qCritical() << "Tox core failed to start";
|
||||||
|
@ -113,12 +119,6 @@ void Core::start()
|
||||||
|
|
||||||
emit friendAddressGenerated(CFriendAddress::toString(friendAddress));
|
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();
|
bootstrapDht();
|
||||||
|
|
||||||
toxTimer->start(tox_do_interval(tox));
|
toxTimer->start(tox_do_interval(tox));
|
||||||
|
@ -126,6 +126,8 @@ void Core::start()
|
||||||
|
|
||||||
void Core::onBootstrapTimer()
|
void Core::onBootstrapTimer()
|
||||||
{
|
{
|
||||||
|
if (!tox)
|
||||||
|
return;
|
||||||
if(!tox_isconnected(tox))
|
if(!tox_isconnected(tox))
|
||||||
bootstrapDht();
|
bootstrapDht();
|
||||||
}
|
}
|
||||||
|
@ -606,7 +608,7 @@ void Core::bootstrapDht()
|
||||||
if (tox_bootstrap_from_address(tox, dhtServer.address.toLatin1().data(),
|
if (tox_bootstrap_from_address(tox, dhtServer.address.toLatin1().data(),
|
||||||
0, qToBigEndian(dhtServer.port), CUserId(dhtServer.userId).data()) == 1)
|
0, qToBigEndian(dhtServer.port), CUserId(dhtServer.userId).data()) == 1)
|
||||||
qDebug() << QString("Core: Bootstraping from ")+dhtServer.name+QString(", addr ")+dhtServer.address.toLatin1().data()
|
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
|
else
|
||||||
qDebug() << "Core: Error bootstraping from "+dhtServer.name;
|
qDebug() << "Core: Error bootstraping from "+dhtServer.name;
|
||||||
|
|
||||||
|
@ -672,6 +674,12 @@ void Core::loadConfiguration()
|
||||||
|
|
||||||
void Core::saveConfiguration()
|
void Core::saveConfiguration()
|
||||||
{
|
{
|
||||||
|
if (!tox)
|
||||||
|
{
|
||||||
|
qWarning() << "Core::saveConfiguration: Tox not started, aborting!";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
QString path = Settings::getSettingsDirPath();
|
QString path = Settings::getSettingsDirPath();
|
||||||
|
|
||||||
QDir directory(path);
|
QDir directory(path);
|
||||||
|
@ -882,7 +890,7 @@ void Core::onAvInvite(int32_t call_index, void* core)
|
||||||
return;
|
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)
|
if (transType == TypeVideo)
|
||||||
{
|
{
|
||||||
qDebug() << QString("Core: AV invite from %1 with video").arg(friendId);
|
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;
|
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)
|
if (transType == TypeVideo)
|
||||||
{
|
{
|
||||||
qDebug() << QString("Core: AV start from %1 with video").arg(friendId);
|
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);
|
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";
|
qDebug() << "Core: AV reject";
|
||||||
}
|
}
|
||||||
|
@ -981,7 +989,7 @@ void Core::onAvStarting(int32_t call_index, void* core)
|
||||||
qWarning() << "Core: Received invalid AV starting";
|
qWarning() << "Core: Received invalid AV starting";
|
||||||
return;
|
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)
|
if (transType == TypeVideo)
|
||||||
{
|
{
|
||||||
qDebug() << QString("Core: AV starting from %1 with video").arg(friendId);
|
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);
|
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";
|
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);
|
qDebug() << QString("Core: AV request timeout with %1").arg(friendId);
|
||||||
|
|
||||||
|
cleanupCall(call_index);
|
||||||
|
|
||||||
emit static_cast<Core*>(core)->avRequestTimeout(friendId, 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);
|
qDebug() << QString("Core: AV peer timeout with %1").arg(friendId);
|
||||||
|
|
||||||
|
cleanupCall(call_index);
|
||||||
|
|
||||||
emit static_cast<Core*>(core)->avPeerTimeout(friendId, 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";
|
qWarning() << "Core: Received invalid AV answer peer ID";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
int transType = toxav_get_peer_transmission_type(toxav, callId, friendId);
|
int transType = toxav_get_peer_transmission_type(toxav, callId, 0);
|
||||||
if (transType == TypeVideo)
|
if (transType == TypeVideo)
|
||||||
{
|
{
|
||||||
qDebug() << QString("Core: answering call %1 with video").arg(callId);
|
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
|
// Go
|
||||||
|
calls[callId].active = true;
|
||||||
|
|
||||||
if (calls[callId].audioOutput != nullptr)
|
if (calls[callId].audioOutput != nullptr)
|
||||||
{
|
{
|
||||||
calls[callId].playAudioTimer.setInterval(5);
|
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].sendAudioTimer.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
calls[callId].playVideoTimer.setInterval(50);
|
if (calls[callId].videoEnabled)
|
||||||
calls[callId].playVideoTimer.setSingleShot(true);
|
{
|
||||||
connect(&calls[callId].playVideoTimer, &QTimer::timeout, [=](){
|
calls[callId].playVideoTimer.setInterval(50);
|
||||||
Widget::getInstance()->getCore()->playCallVideo(callId);});
|
calls[callId].playVideoTimer.setSingleShot(true);
|
||||||
calls[callId].playVideoTimer.start();
|
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)
|
void Core::cleanupCall(int callId)
|
||||||
{
|
{
|
||||||
qDebug() << QString("Core: cleaning up call %1").arg(callId);
|
qDebug() << QString("Core: cleaning up call %1").arg(callId);
|
||||||
calls[callId].active = false;
|
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)
|
if (calls[callId].audioOutput != nullptr)
|
||||||
{
|
{
|
||||||
delete calls[callId].audioOutput;
|
delete calls[callId].audioOutput;
|
||||||
calls[callId].audioOutput = nullptr;
|
calls[callId].audioOutput = nullptr;
|
||||||
disconnect(&calls[callId].playAudioTimer,0,0,0);
|
|
||||||
}
|
}
|
||||||
if (calls[callId].audioInput != nullptr)
|
if (calls[callId].audioInput != nullptr)
|
||||||
{
|
{
|
||||||
delete calls[callId].audioInput;
|
delete calls[callId].audioInput;
|
||||||
calls[callId].audioInput = nullptr;
|
calls[callId].audioInput = nullptr;
|
||||||
disconnect(&calls[callId].sendAudioTimer,0,0,0);
|
|
||||||
}
|
}
|
||||||
disconnect(&calls[callId].playVideoTimer,0,0,0);
|
if (calls[callId].videoEnabled)
|
||||||
disconnect(&calls[callId].sendVideoTimer,0,0,0);
|
Widget::getInstance()->getCamera()->unsuscribe();
|
||||||
calls[callId].audioBuffer.clear();
|
calls[callId].audioBuffer.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1208,13 +1237,12 @@ void Core::playCallAudio(int callId, ToxAv* toxav)
|
||||||
}
|
}
|
||||||
if (len == 0)
|
if (len == 0)
|
||||||
{
|
{
|
||||||
if (calls[callId].audioBuffer.bufferSize() >= framesize*2)
|
calls[callId].playAudioTimer.start();
|
||||||
calls[callId].playAudioTimer.start();
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
//qDebug() << QString("Core: Received %1 bytes, %2 audio bytes free, %3 core buffer size")
|
//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());
|
// .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();
|
int state = calls[callId].audioOutput->state();
|
||||||
if (state != QAudio::ActiveState)
|
if (state != QAudio::ActiveState)
|
||||||
{
|
{
|
||||||
|
@ -1226,7 +1254,6 @@ void Core::playCallAudio(int callId, ToxAv* toxav)
|
||||||
if (error != QAudio::NoError)
|
if (error != QAudio::NoError)
|
||||||
qWarning() << QString("Core::playCallAudio: Error: %1").arg(error);
|
qWarning() << QString("Core::playCallAudio: Error: %1").arg(error);
|
||||||
|
|
||||||
|
|
||||||
calls[callId].playAudioTimer.start();
|
calls[callId].playAudioTimer.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1254,7 +1281,7 @@ void Core::sendCallAudio(int callId, ToxAv* toxav)
|
||||||
calls[callId].sendAudioTimer.start();
|
calls[callId].sendAudioTimer.start();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
calls[callId].sendAudioTimer.start(0);
|
calls[callId].sendAudioTimer.start();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
calls[callId].sendAudioTimer.start();
|
calls[callId].sendAudioTimer.start();
|
||||||
|
@ -1268,7 +1295,13 @@ void Core::playCallVideo(int callId)
|
||||||
if(toxav_recv_video(toxav, callId, &image) == 0)
|
if(toxav_recv_video(toxav, callId, &image) == 0)
|
||||||
{
|
{
|
||||||
if (image)
|
if (image)
|
||||||
|
{
|
||||||
emit videoFrameReceived(*image);
|
emit videoFrameReceived(*image);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//qDebug() << "Core: Received null video frame\n";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
qDebug() << "Core: Error receiving video frame\n";
|
qDebug() << "Core: Error receiving video frame\n";
|
||||||
|
@ -1276,19 +1309,32 @@ void Core::playCallVideo(int callId)
|
||||||
calls[callId].playVideoTimer.start();
|
calls[callId].playVideoTimer.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Core::sendCallVideo(int callId)
|
||||||
void Core::sendVideoFrame(int callId, ToxAv* toxav, vpx_image img)
|
|
||||||
{
|
{
|
||||||
uint8_t videobuf[TOXAV_VIDEO_WIDTH * TOXAV_VIDEO_HEIGHT * 4];
|
if (!calls[callId].active || !calls[callId].videoEnabled)
|
||||||
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);
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
if((result = toxav_send_video(toxav, callId, videobuf, result)) < 0)
|
const int bufsize = TOXAV_MAX_VIDEO_WIDTH * TOXAV_MAX_VIDEO_HEIGHT * 4;
|
||||||
qDebug() << QString("Core: Error sending video frame: %1").arg(result);
|
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)
|
void Core::groupInviteFriend(int friendId, int groupId)
|
||||||
|
@ -1300,14 +1346,3 @@ void Core::createGroup()
|
||||||
{
|
{
|
||||||
emit emptyGroupCreated(tox_add_groupchat(tox));
|
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
|
@ -17,7 +17,6 @@
|
||||||
#ifndef CORE_HPP
|
#ifndef CORE_HPP
|
||||||
#define CORE_HPP
|
#define CORE_HPP
|
||||||
|
|
||||||
#include "status.h"
|
|
||||||
#include "audiobuffer.h"
|
#include "audiobuffer.h"
|
||||||
|
|
||||||
#include <tox/tox.h>
|
#include <tox/tox.h>
|
||||||
|
@ -43,9 +42,15 @@
|
||||||
#define TOXAV_RINGING_TIME 15
|
#define TOXAV_RINGING_TIME 15
|
||||||
|
|
||||||
// TODO: Put that in the settings
|
// 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_WIDTH 640
|
||||||
#define TOXAV_VIDEO_HEIGHT 480
|
#define TOXAV_VIDEO_HEIGHT 480
|
||||||
|
|
||||||
|
class Camera;
|
||||||
|
|
||||||
|
enum class Status : int {Online = 0, Away, Busy, Offline};
|
||||||
|
|
||||||
struct DhtServer
|
struct DhtServer
|
||||||
{
|
{
|
||||||
QString name;
|
QString name;
|
||||||
|
@ -104,7 +109,7 @@ class Core : public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
explicit Core();
|
explicit Core(Camera* cam);
|
||||||
~Core();
|
~Core();
|
||||||
|
|
||||||
int getGroupNumberPeers(int groupId) const;
|
int getGroupNumberPeers(int groupId) const;
|
||||||
|
@ -127,9 +132,9 @@ public slots:
|
||||||
void removeFriend(int friendId);
|
void removeFriend(int friendId);
|
||||||
void removeGroup(int groupId);
|
void removeGroup(int groupId);
|
||||||
|
|
||||||
|
void setStatus(Status status);
|
||||||
void setUsername(const QString& username);
|
void setUsername(const QString& username);
|
||||||
void setStatusMessage(const QString& message);
|
void setStatusMessage(const QString& message);
|
||||||
void setStatus(Status status);
|
|
||||||
|
|
||||||
void sendMessage(int friendId, const QString& message);
|
void sendMessage(int friendId, const QString& message);
|
||||||
void sendGroupMessage(int groupId, const QString& message);
|
void sendGroupMessage(int groupId, const QString& message);
|
||||||
|
@ -250,7 +255,7 @@ private:
|
||||||
static void playCallAudio(int callId, ToxAv* toxav);
|
static void playCallAudio(int callId, ToxAv* toxav);
|
||||||
static void sendCallAudio(int callId, ToxAv* toxav); // Blocking, start in a thread
|
static void sendCallAudio(int callId, ToxAv* toxav); // Blocking, start in a thread
|
||||||
void playCallVideo(int callId);
|
void playCallVideo(int callId);
|
||||||
static void sendVideoFrame(int callId, ToxAv* toxav, vpx_image img);
|
void sendCallVideo(int callId);
|
||||||
|
|
||||||
void checkConnection();
|
void checkConnection();
|
||||||
void onBootstrapTimer();
|
void onBootstrapTimer();
|
||||||
|
@ -268,6 +273,7 @@ private:
|
||||||
Tox* tox;
|
Tox* tox;
|
||||||
ToxAv* toxav;
|
ToxAv* toxav;
|
||||||
QTimer *toxTimer, *saveTimer, *fileTimer, *bootstrapTimer;
|
QTimer *toxTimer, *saveTimer, *fileTimer, *bootstrapTimer;
|
||||||
|
Camera* camera;
|
||||||
QList<DhtServer> dhtServerList;
|
QList<DhtServer> dhtServerList;
|
||||||
int dhtServerId;
|
int dhtServerId;
|
||||||
static QList<ToxFile> fileSendQueue, fileRecvQueue;
|
static QList<ToxFile> fileSendQueue, fileRecvQueue;
|
||||||
|
|
3
dialogs.ini
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
[General]
|
||||||
|
geometry=@Rect(147 345 604 375)
|
||||||
|
maximized=false
|
|
@ -1,7 +1,6 @@
|
||||||
#include "friend.h"
|
#include "friend.h"
|
||||||
#include "friendlist.h"
|
#include "friendlist.h"
|
||||||
#include "widget/friendwidget.h"
|
#include "widget/friendwidget.h"
|
||||||
#include "status.h"
|
|
||||||
|
|
||||||
Friend::Friend(int FriendId, QString UserId)
|
Friend::Friend(int FriendId, QString UserId)
|
||||||
: friendId(FriendId), userId(UserId)
|
: friendId(FriendId), userId(UserId)
|
||||||
|
|
3
friend.h
|
@ -3,9 +3,8 @@
|
||||||
|
|
||||||
#include <QString>
|
#include <QString>
|
||||||
#include "widget/form/chatform.h"
|
#include "widget/form/chatform.h"
|
||||||
#include "status.h"
|
|
||||||
|
|
||||||
class FriendWidget;
|
struct FriendWidget;
|
||||||
|
|
||||||
struct Friend
|
struct Friend
|
||||||
{
|
{
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
#include <QString>
|
#include <QString>
|
||||||
#include <QList>
|
#include <QList>
|
||||||
|
|
||||||
class Friend;
|
struct Friend;
|
||||||
|
|
||||||
class FriendList
|
class FriendList
|
||||||
{
|
{
|
||||||
|
|
|
@ -90,6 +90,7 @@ void Group::addPeer(int peerId, QString name)
|
||||||
void Group::removePeer(int peerId)
|
void Group::removePeer(int peerId)
|
||||||
{
|
{
|
||||||
peers.remove(peerId);
|
peers.remove(peerId);
|
||||||
|
nPeers--;
|
||||||
widget->onUserListChanged();
|
widget->onUserListChanged();
|
||||||
chatForm->onUserListChanged();
|
chatForm->onUserListChanged();
|
||||||
}
|
}
|
||||||
|
|
2
group.h
|
@ -7,7 +7,7 @@
|
||||||
|
|
||||||
#define RETRY_PEER_INFO_INTERVAL 500
|
#define RETRY_PEER_INFO_INTERVAL 500
|
||||||
|
|
||||||
class Friend;
|
struct Friend;
|
||||||
class GroupWidget;
|
class GroupWidget;
|
||||||
class GroupChatForm;
|
class GroupChatForm;
|
||||||
|
|
||||||
|
|
Before Width: | Height: | Size: 164 B After Width: | Height: | Size: 164 B |
Before Width: | Height: | Size: 172 B |
|
@ -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 |
Before Width: | Height: | Size: 249 B |
Before Width: | Height: | Size: 152 B |
|
@ -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 |
Before Width: | Height: | Size: 214 B |
Before Width: | Height: | Size: 274 B |
|
@ -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 |
Before Width: | Height: | Size: 432 B |
Before Width: | Height: | Size: 307 B |
|
@ -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 |
Before Width: | Height: | Size: 510 B |
|
@ -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 |
Before Width: | Height: | Size: 220 B |
|
@ -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 |
Before Width: | Height: | Size: 323 B |
Before Width: | Height: | Size: 178 B |
|
@ -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 |
Before Width: | Height: | Size: 265 B |
Before Width: | Height: | Size: 142 B |
|
@ -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 |
Before Width: | Height: | Size: 129 B |
Before Width: | Height: | Size: 327 B |
|
@ -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 |
Before Width: | Height: | Size: 533 B |
Before Width: | Height: | Size: 248 B |
|
@ -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 |
Before Width: | Height: | Size: 382 B |
Before Width: | Height: | Size: 183 B |
Before Width: | Height: | Size: 267 B |
|
@ -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 |
Before Width: | Height: | Size: 192 B |
Before Width: | Height: | Size: 314 B |
|
@ -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 |
Before Width: | Height: | Size: 503 B |
|
@ -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 |
Before Width: | Height: | Size: 474 B |
|
@ -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 |
Before Width: | Height: | Size: 433 B |
Before Width: | Height: | Size: 790 B After Width: | Height: | Size: 790 B |
Before Width: | Height: | Size: 744 B After Width: | Height: | Size: 744 B |
Before Width: | Height: | Size: 512 B After Width: | Height: | Size: 512 B |
BIN
img/group_dark.png
Normal file
After Width: | Height: | Size: 671 B |
BIN
img/icon.ico
Before Width: | Height: | Size: 361 KiB |
Before Width: | Height: | Size: 291 B After Width: | Height: | Size: 291 B |
|
@ -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 |
|
@ -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 |
Before Width: | Height: | Size: 852 B |
Before Width: | Height: | Size: 807 B |
|
@ -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 |
|
@ -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 |
Before Width: | Height: | Size: 825 B |
|
@ -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 |
|
@ -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 |
Before Width: | Height: | Size: 766 B |
Before Width: | Height: | Size: 288 B After Width: | Height: | Size: 288 B |
4
main.cpp
|
@ -24,9 +24,10 @@ int main(int argc, char *argv[])
|
||||||
/** TODO
|
/** TODO
|
||||||
* ">using a dedicated tool to maintain a TODO list" edition
|
* ">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?)
|
* 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
|
* => 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
|
* 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
|
* Don't do anything if a friend is disconnected, don't print to the chat
|
||||||
* Changing online/away/busy/offline by clicking the bubble
|
* 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
|
* 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
|
* 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
|
* 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 (?)
|
* An extra side panel for groupchats, like Venom does (?)
|
||||||
*
|
*
|
||||||
* In the file transfer widget:
|
* In the file transfer widget:
|
||||||
|
|
93
res.qrc
|
@ -5,4 +5,97 @@
|
||||||
<qresource prefix="/font">
|
<qresource prefix="/font">
|
||||||
<file alias="DejaVuSans.ttf">res/DejaVuSans.ttf</file>
|
<file alias="DejaVuSans.ttf">res/DejaVuSans.ttf</file>
|
||||||
</qresource>
|
</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>
|
</RCC>
|
||||||
|
|
12
settings.cpp
|
@ -83,6 +83,7 @@ void Settings::load()
|
||||||
s.beginGroup("General");
|
s.beginGroup("General");
|
||||||
username = s.value("username", "My name").toString();
|
username = s.value("username", "My name").toString();
|
||||||
statusMessage = s.value("statusMessage", "My status").toString();
|
statusMessage = s.value("statusMessage", "My status").toString();
|
||||||
|
enableIPv6 = s.value("enableIPv6", true).toBool();
|
||||||
s.endGroup();
|
s.endGroup();
|
||||||
|
|
||||||
s.beginGroup("Widgets");
|
s.beginGroup("Widgets");
|
||||||
|
@ -142,6 +143,7 @@ void Settings::save()
|
||||||
s.beginGroup("General");
|
s.beginGroup("General");
|
||||||
s.setValue("username", username);
|
s.setValue("username", username);
|
||||||
s.setValue("statusMessage", statusMessage);
|
s.setValue("statusMessage", statusMessage);
|
||||||
|
s.setValue("enableIPv6", enableIPv6);
|
||||||
s.endGroup();
|
s.endGroup();
|
||||||
|
|
||||||
s.beginGroup("Widgets");
|
s.beginGroup("Widgets");
|
||||||
|
@ -209,6 +211,16 @@ void Settings::setStatusMessage(const QString& newMessage)
|
||||||
statusMessage = newMessage;
|
statusMessage = newMessage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Settings::getEnableIPv6() const
|
||||||
|
{
|
||||||
|
return enableIPv6;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Settings::setEnableIPv6(bool newValue)
|
||||||
|
{
|
||||||
|
enableIPv6 = newValue;
|
||||||
|
}
|
||||||
|
|
||||||
bool Settings::getEnableLogging() const
|
bool Settings::getEnableLogging() const
|
||||||
{
|
{
|
||||||
return enableLogging;
|
return enableLogging;
|
||||||
|
|
|
@ -49,6 +49,9 @@ public:
|
||||||
QString getStatusMessage() const;
|
QString getStatusMessage() const;
|
||||||
void setStatusMessage(const QString& newMessage);
|
void setStatusMessage(const QString& newMessage);
|
||||||
|
|
||||||
|
bool getEnableIPv6() const;
|
||||||
|
void setEnableIPv6(bool newValue);
|
||||||
|
|
||||||
bool getEnableLogging() const;
|
bool getEnableLogging() const;
|
||||||
void setEnableLogging(bool newValue);
|
void setEnableLogging(bool newValue);
|
||||||
|
|
||||||
|
@ -130,6 +133,8 @@ private:
|
||||||
QString username;
|
QString username;
|
||||||
QString statusMessage;
|
QString statusMessage;
|
||||||
|
|
||||||
|
bool enableIPv6;
|
||||||
|
|
||||||
bool enableLogging;
|
bool enableLogging;
|
||||||
bool encryptLogs;
|
bool encryptLogs;
|
||||||
|
|
||||||
|
|
35
status.cpp
|
@ -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));
|
|
||||||
}
|
|
45
status.h
|
@ -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
|
|
16
toxgui.pro
|
@ -29,7 +29,6 @@ HEADERS += widget/form/addfriendform.h \
|
||||||
group.h \
|
group.h \
|
||||||
grouplist.h \
|
grouplist.h \
|
||||||
settings.h \
|
settings.h \
|
||||||
status.h \
|
|
||||||
core.h \
|
core.h \
|
||||||
friendlist.h \
|
friendlist.h \
|
||||||
cdata.h \
|
cdata.h \
|
||||||
|
@ -49,6 +48,20 @@ RESOURCES += \
|
||||||
|
|
||||||
LIBS += -ltoxcore -ltoxav -lsodium -lvpx
|
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 += \
|
SOURCES += \
|
||||||
widget/form/addfriendform.cpp \
|
widget/form/addfriendform.cpp \
|
||||||
widget/form/chatform.cpp \
|
widget/form/chatform.cpp \
|
||||||
|
@ -71,7 +84,6 @@ SOURCES += \
|
||||||
grouplist.cpp \
|
grouplist.cpp \
|
||||||
main.cpp \
|
main.cpp \
|
||||||
settings.cpp \
|
settings.cpp \
|
||||||
status.cpp \
|
|
||||||
cdata.cpp \
|
cdata.cpp \
|
||||||
cstring.cpp \
|
cstring.cpp \
|
||||||
audiobuffer.cpp \
|
audiobuffer.cpp \
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
QPushButton
|
QPushButton
|
||||||
{
|
{
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
background-image: url("ui/acceptFileButton/default.png");
|
background-image: url(":/ui/acceptFileButton/default.png");
|
||||||
background-repeat: none;
|
background-repeat: none;
|
||||||
border: none;
|
border: none;
|
||||||
width: 24px;
|
width: 24px;
|
||||||
|
@ -9,12 +9,12 @@ QPushButton
|
||||||
}
|
}
|
||||||
QPushButton:hover
|
QPushButton:hover
|
||||||
{
|
{
|
||||||
background-image: url("ui/acceptFileButton/hover.png");
|
background-image: url(":/ui/acceptFileButton/hover.png");
|
||||||
}
|
}
|
||||||
|
|
||||||
QPushButton:pressed
|
QPushButton:pressed
|
||||||
{
|
{
|
||||||
background-image: url("ui/acceptFileButton/pressed.png");
|
background-image: url(":/ui/acceptFileButton/pressed.png");
|
||||||
}
|
}
|
||||||
|
|
||||||
QPushButton:focus {
|
QPushButton:focus {
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
QPushButton#green
|
QPushButton#green
|
||||||
{
|
{
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
background-image: url("ui/callButton/callButton.png");
|
background-image: url(":/ui/callButton/callButton.png");
|
||||||
background-repeat: none;
|
background-repeat: none;
|
||||||
border: none;
|
border: none;
|
||||||
width: 50px;
|
width: 50px;
|
||||||
|
@ -10,18 +10,18 @@ QPushButton#green
|
||||||
|
|
||||||
QPushButton#green:hover
|
QPushButton#green:hover
|
||||||
{
|
{
|
||||||
background-image: url("ui/callButton/callButtonHover.png");
|
background-image: url(":/ui/callButton/callButtonHover.png");
|
||||||
}
|
}
|
||||||
|
|
||||||
QPushButton#green:pressed
|
QPushButton#green:pressed
|
||||||
{
|
{
|
||||||
background-image: url("ui/callButton/callButtonPressed.png");
|
background-image: url(":/ui/callButton/callButtonPressed.png");
|
||||||
}
|
}
|
||||||
|
|
||||||
QPushButton#red
|
QPushButton#red
|
||||||
{
|
{
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
background-image: url("ui/callButton/callButtonRed.png");
|
background-image: url(":/ui/callButton/callButtonRed.png");
|
||||||
background-repeat: none;
|
background-repeat: none;
|
||||||
border: none;
|
border: none;
|
||||||
width: 50px;
|
width: 50px;
|
||||||
|
@ -29,18 +29,18 @@ QPushButton#red
|
||||||
}
|
}
|
||||||
QPushButton#red:hover
|
QPushButton#red:hover
|
||||||
{
|
{
|
||||||
background-image: url("ui/callButton/callButtonRedHover.png");
|
background-image: url(":/ui/callButton/callButtonRedHover.png");
|
||||||
}
|
}
|
||||||
|
|
||||||
QPushButton#red:pressed
|
QPushButton#red:pressed
|
||||||
{
|
{
|
||||||
background-image: url("ui/callButton/callButtonRedPressed.png");
|
background-image: url(":/ui/callButton/callButtonRedPressed.png");
|
||||||
}
|
}
|
||||||
|
|
||||||
QPushButton#yellow
|
QPushButton#yellow
|
||||||
{
|
{
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
background-image: url("ui/callButton/callButtonYellow.png");
|
background-image: url(":/ui/callButton/callButtonYellow.png");
|
||||||
background-repeat: none;
|
background-repeat: none;
|
||||||
border: none;
|
border: none;
|
||||||
width: 50px;
|
width: 50px;
|
||||||
|
@ -48,18 +48,18 @@ QPushButton#yellow
|
||||||
}
|
}
|
||||||
QPushButton#yellow:hover
|
QPushButton#yellow:hover
|
||||||
{
|
{
|
||||||
background-image: url("ui/callButton/callButtonYellowHover.png");
|
background-image: url(":/ui/callButton/callButtonYellowHover.png");
|
||||||
}
|
}
|
||||||
|
|
||||||
QPushButton#yellow:pressed
|
QPushButton#yellow:pressed
|
||||||
{
|
{
|
||||||
background-image: url("ui/callButton/callButtonYellowPressed.png");
|
background-image: url(":/ui/callButton/callButtonYellowPressed.png");
|
||||||
}
|
}
|
||||||
|
|
||||||
QPushButton#grey
|
QPushButton#grey
|
||||||
{
|
{
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
background-image: url("ui/callButton/callButtonDisabled.png");
|
background-image: url(":/ui/callButton/callButtonDisabled.png");
|
||||||
background-repeat: none;
|
background-repeat: none;
|
||||||
border: none;
|
border: none;
|
||||||
width: 50px;
|
width: 50px;
|
||||||
|
|
|
@ -1,21 +1,24 @@
|
||||||
QScrollArea {
|
QScrollArea {
|
||||||
background: transparent;
|
background: white;
|
||||||
border: 0 0 0 0;
|
border: 0 0 0 0 ;
|
||||||
}
|
}
|
||||||
|
|
||||||
QScrollArea > QWidget > QWidget {
|
QScrollArea > QWidget > QWidget {
|
||||||
background: transparent;
|
background: white;
|
||||||
}
|
}
|
||||||
|
|
||||||
QScrollBar:vertical {
|
QScrollBar:vertical {
|
||||||
background: white;
|
background: transparent;
|
||||||
width: 10px;
|
width: 12px;
|
||||||
margin: 12px 0 12px 0;
|
margin-top: 2px;
|
||||||
|
margin-bottom: 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
QScrollBar::handle:vertical {
|
QScrollBar::handle:vertical {
|
||||||
background: #d1d1d1;
|
background: #d1d1d1;
|
||||||
min-height: 20px;
|
min-height: 20px;
|
||||||
|
border-radius: 3px;
|
||||||
|
margin-left: 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
QScrollBar::handle:vertical:hover {
|
QScrollBar::handle:vertical:hover {
|
||||||
|
@ -27,36 +30,19 @@ QScrollBar::handle:vertical:pressed {
|
||||||
}
|
}
|
||||||
|
|
||||||
QScrollBar::add-line:vertical {
|
QScrollBar::add-line:vertical {
|
||||||
background: url("ui/chatArea/scrollBarDownArrow.png") center;
|
background: url(":ui/chatArea/scrollBarDownArrow.png") center;
|
||||||
height: 10px;
|
height: 0px;
|
||||||
subcontrol-position: bottom;
|
subcontrol-position: bottom;
|
||||||
subcontrol-origin: margin;
|
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 {
|
QScrollBar::sub-line:vertical {
|
||||||
background: url("ui/chatArea/scrollBarUpArrow.png") center;
|
background: url(":ui/chatArea/scrollBarUpArrow.png") center;
|
||||||
height: 10px;
|
height: 0px;
|
||||||
subcontrol-position: top;
|
subcontrol-position: top;
|
||||||
subcontrol-origin: margin;
|
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 {
|
QScrollBar:QScrollBar::down-arrow:vertical {
|
||||||
width: 10;
|
width: 10;
|
||||||
height: 10px;
|
height: 10px;
|
||||||
|
@ -77,12 +63,13 @@ QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical {
|
||||||
QScrollBar:horizontal {
|
QScrollBar:horizontal {
|
||||||
background: white;
|
background: white;
|
||||||
height: 10px;
|
height: 10px;
|
||||||
margin: 0 12px 0 12px;
|
margin: 0 2px 0 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
QScrollBar::handle:horizontal {
|
QScrollBar::handle:horizontal {
|
||||||
background: #d1d1d1;
|
background: #d1d1d1;
|
||||||
min-width: 20px;
|
min-width: 20px;
|
||||||
|
border-radius: 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
QScrollBar::handle:horizontal:hover {
|
QScrollBar::handle:horizontal:hover {
|
||||||
|
@ -94,36 +81,19 @@ QScrollBar::handle:horizontal:pressed {
|
||||||
}
|
}
|
||||||
|
|
||||||
QScrollBar::add-line:horizontal {
|
QScrollBar::add-line:horizontal {
|
||||||
background: url("ui/chatArea/scrollBarRightArrow.png") center;
|
background: url(":ui/chatArea/scrollBarRightArrow.png") center;
|
||||||
width: 10px;
|
width: 0px;
|
||||||
subcontrol-position: right;
|
subcontrol-position: right;
|
||||||
subcontrol-origin: margin;
|
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 {
|
QScrollBar::sub-line:horizontal {
|
||||||
background: url("ui/chatArea/scrollBarLeftArrow.png") center;
|
background: url(":ui/chatArea/scrollBarLeftArrow.png") center;
|
||||||
width: 10px;
|
width: 0px;
|
||||||
subcontrol-position: left;
|
subcontrol-position: left;
|
||||||
subcontrol-origin: margin;
|
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 {
|
QScrollBar:QScrollBar::down-arrow:horizontal {
|
||||||
width: 10;
|
width: 10;
|
||||||
height: 10px;
|
height: 10px;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
QPushButton
|
QPushButton
|
||||||
{
|
{
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
background-image: url("ui/emoteButton/emoteButton.png");
|
background-image: url(":/ui/emoteButton/emoteButton.png");
|
||||||
background-repeat: none;
|
background-repeat: none;
|
||||||
border: none;
|
border: none;
|
||||||
width: 24px;
|
width: 24px;
|
||||||
|
@ -9,12 +9,12 @@ QPushButton
|
||||||
}
|
}
|
||||||
QPushButton:hover
|
QPushButton:hover
|
||||||
{
|
{
|
||||||
background-image: url("ui/emoteButton/emoteButtonHover.png");
|
background-image: url(":/ui/emoteButton/emoteButtonHover.png");
|
||||||
}
|
}
|
||||||
|
|
||||||
QPushButton:pressed
|
QPushButton:pressed
|
||||||
{
|
{
|
||||||
background-image: url("ui/emoteButton/emoteButtonPressed.png");
|
background-image: url(":/ui/emoteButton/emoteButtonPressed.png");
|
||||||
}
|
}
|
||||||
|
|
||||||
QPushButton:focus {
|
QPushButton:focus {
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
QPushButton
|
QPushButton
|
||||||
{
|
{
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
background-image: url("ui/fileButton/fileButton.png");
|
background-image: url(":/ui/fileButton/fileButton.png");
|
||||||
background-repeat: none;
|
background-repeat: none;
|
||||||
border: none;
|
border: none;
|
||||||
width: 24px;
|
width: 24px;
|
||||||
|
@ -9,12 +9,12 @@ QPushButton
|
||||||
}
|
}
|
||||||
QPushButton:hover
|
QPushButton:hover
|
||||||
{
|
{
|
||||||
background-image: url("ui/fileButton/fileButtonHover.png");
|
background-image: url(":/ui/fileButton/fileButtonHover.png");
|
||||||
}
|
}
|
||||||
|
|
||||||
QPushButton:pressed
|
QPushButton:pressed
|
||||||
{
|
{
|
||||||
background-image: url("ui/fileButton/fileButtonPressed.png");
|
background-image: url(":/ui/fileButton/fileButtonPressed.png");
|
||||||
}
|
}
|
||||||
|
|
||||||
QPushButton:focus {
|
QPushButton:focus {
|
||||||
|
|
34
ui/friendList/friendList.css
Normal 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;
|
||||||
|
}
|
|
@ -1,7 +1,7 @@
|
||||||
QPushButton
|
QPushButton
|
||||||
{
|
{
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
background-image: url("ui/pauseFileButton/default.png");
|
background-image: url(":/ui/pauseFileButton/default.png");
|
||||||
background-repeat: none;
|
background-repeat: none;
|
||||||
border: none;
|
border: none;
|
||||||
width: 24px;
|
width: 24px;
|
||||||
|
@ -9,12 +9,12 @@ QPushButton
|
||||||
}
|
}
|
||||||
QPushButton:hover
|
QPushButton:hover
|
||||||
{
|
{
|
||||||
background-image: url("ui/pauseFileButton/hover.png");
|
background-image: url(":/ui/pauseFileButton/hover.png");
|
||||||
}
|
}
|
||||||
|
|
||||||
QPushButton:pressed
|
QPushButton:pressed
|
||||||
{
|
{
|
||||||
background-image: url("ui/pauseFileButton/pressed.png");
|
background-image: url(":/ui/pauseFileButton/pressed.png");
|
||||||
}
|
}
|
||||||
|
|
||||||
QPushButton:focus {
|
QPushButton:focus {
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
QPushButton
|
QPushButton
|
||||||
{
|
{
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
background-image: url("ui/sendButton/sendButton.png");
|
background-image: url(":/ui/sendButton/sendButton.png");
|
||||||
background-repeat: none;
|
background-repeat: none;
|
||||||
border: none;
|
border: none;
|
||||||
width: 50px;
|
width: 50px;
|
||||||
|
@ -9,12 +9,12 @@ QPushButton
|
||||||
}
|
}
|
||||||
QPushButton:hover
|
QPushButton:hover
|
||||||
{
|
{
|
||||||
background-image: url("ui/sendButton/sendButtonHover.png");
|
background-image: url(":/ui/sendButton/sendButtonHover.png");
|
||||||
}
|
}
|
||||||
|
|
||||||
QPushButton:pressed
|
QPushButton:pressed
|
||||||
{
|
{
|
||||||
background-image: url("ui/sendButton/sendButtonPressed.png");
|
background-image: url(":/ui/sendButton/sendButtonPressed.png");
|
||||||
}
|
}
|
||||||
|
|
||||||
QPushButton:focus {
|
QPushButton:focus {
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
QPushButton
|
QPushButton
|
||||||
{
|
{
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
background-image: url("ui/stopFileButton/default.png");
|
background-image: url(":/ui/stopFileButton/default.png");
|
||||||
background-repeat: none;
|
background-repeat: none;
|
||||||
border: none;
|
border: none;
|
||||||
width: 24px;
|
width: 24px;
|
||||||
|
@ -9,12 +9,12 @@ QPushButton
|
||||||
}
|
}
|
||||||
QPushButton:hover
|
QPushButton:hover
|
||||||
{
|
{
|
||||||
background-image: url("ui/stopFileButton/hover.png");
|
background-image: url(":/ui/stopFileButton/hover.png");
|
||||||
}
|
}
|
||||||
|
|
||||||
QPushButton:pressed
|
QPushButton:pressed
|
||||||
{
|
{
|
||||||
background-image: url("ui/stopFileButton/pressed.png");
|
background-image: url(":/ui/stopFileButton/pressed.png");
|
||||||
}
|
}
|
||||||
|
|
||||||
QPushButton:focus {
|
QPushButton:focus {
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
QPushButton#green
|
QPushButton#green
|
||||||
{
|
{
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
background-image: url("ui/videoButton/videoButton.png");
|
background-image: url(":/ui/videoButton/videoButton.png");
|
||||||
background-repeat: none;
|
background-repeat: none;
|
||||||
border: none;
|
border: none;
|
||||||
width: 50px;
|
width: 50px;
|
||||||
|
@ -10,18 +10,18 @@ QPushButton#green
|
||||||
|
|
||||||
QPushButton#green:hover
|
QPushButton#green:hover
|
||||||
{
|
{
|
||||||
background-image: url("ui/videoButton/videoButtonHover.png");
|
background-image: url(":/ui/videoButton/videoButtonHover.png");
|
||||||
}
|
}
|
||||||
|
|
||||||
QPushButton#green:pressed
|
QPushButton#green:pressed
|
||||||
{
|
{
|
||||||
background-image: url("ui/videoButton/videoButtonPressed.png");
|
background-image: url(":/ui/videoButton/videoButtonPressed.png");
|
||||||
}
|
}
|
||||||
|
|
||||||
QPushButton#red
|
QPushButton#red
|
||||||
{
|
{
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
background-image: url("ui/videoButton/videoButtonRed.png");
|
background-image: url(":/ui/videoButton/videoButtonRed.png");
|
||||||
background-repeat: none;
|
background-repeat: none;
|
||||||
border: none;
|
border: none;
|
||||||
width: 50px;
|
width: 50px;
|
||||||
|
@ -29,18 +29,18 @@ QPushButton#red
|
||||||
}
|
}
|
||||||
QPushButton#red:hover
|
QPushButton#red:hover
|
||||||
{
|
{
|
||||||
background-image: url("ui/videoButton/videoButtonRedHover.png");
|
background-image: url(":/ui/videoButton/videoButtonRedHover.png");
|
||||||
}
|
}
|
||||||
|
|
||||||
QPushButton#red:pressed
|
QPushButton#red:pressed
|
||||||
{
|
{
|
||||||
background-image: url("ui/videoButton/videoButtonRedPressed.png");
|
background-image: url(":/ui/videoButton/videoButtonRedPressed.png");
|
||||||
}
|
}
|
||||||
|
|
||||||
QPushButton#yellow
|
QPushButton#yellow
|
||||||
{
|
{
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
background-image: url("ui/videoButton/videoButtonYellow.png");
|
background-image: url(":/ui/videoButton/videoButtonYellow.png");
|
||||||
background-repeat: none;
|
background-repeat: none;
|
||||||
border: none;
|
border: none;
|
||||||
width: 50px;
|
width: 50px;
|
||||||
|
@ -48,18 +48,18 @@ QPushButton#yellow
|
||||||
}
|
}
|
||||||
QPushButton#yellow:hover
|
QPushButton#yellow:hover
|
||||||
{
|
{
|
||||||
background-image: url("ui/videoButton/videoButtonYellowHover.png");
|
background-image: url(":/ui/videoButton/videoButtonYellowHover.png");
|
||||||
}
|
}
|
||||||
|
|
||||||
QPushButton#yellow:pressed
|
QPushButton#yellow:pressed
|
||||||
{
|
{
|
||||||
background-image: url("ui/videoButton/videoButtonYellowPressed.png");
|
background-image: url(":/ui/videoButton/videoButtonYellowPressed.png");
|
||||||
}
|
}
|
||||||
|
|
||||||
QPushButton#grey
|
QPushButton#grey
|
||||||
{
|
{
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
background-image: url("ui/videoButton/videoButtonDisabled.png");
|
background-image: url(":/ui/videoButton/videoButtonDisabled.png");
|
||||||
background-repeat: none;
|
background-repeat: none;
|
||||||
border: none;
|
border: none;
|
||||||
width: 50px;
|
width: 50px;
|
||||||
|
|
BIN
ui/window/applicationIcon.png
Normal file
After Width: | Height: | Size: 1.9 KiB |
BIN
ui/window/closeButton.png
Normal file
After Width: | Height: | Size: 385 B |
BIN
ui/window/closeButtonHover.png
Normal file
After Width: | Height: | Size: 370 B |
BIN
ui/window/closeButtonPressed.png
Normal file
After Width: | Height: | Size: 372 B |
BIN
ui/window/maximizeButton.png
Normal file
After Width: | Height: | Size: 401 B |
BIN
ui/window/maximizeButtonHover.png
Normal file
After Width: | Height: | Size: 401 B |
BIN
ui/window/maximizeButtonPressed.png
Normal file
After Width: | Height: | Size: 402 B |
BIN
ui/window/minimizeButton.png
Normal file
After Width: | Height: | Size: 371 B |
BIN
ui/window/minimizeButtonHover.png
Normal file
After Width: | Height: | Size: 371 B |