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

Merge pull request #2 from tux3/master

Rebase on upstream
This commit is contained in:
F1ynn 2014-07-04 12:27:57 -07:00
commit e402a0abb1
42 changed files with 971 additions and 214 deletions

1
.gitignore vendored
View File

@ -1 +1,2 @@
*.pro.user*
libs

View File

@ -13,6 +13,7 @@ However, it is not a fork.
- Audio calls
- Video calls
- Tox DNS
- Translations in various languages
<h2>Requirements</h2>
@ -21,9 +22,77 @@ 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><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.
Note that the Linux download has not been tested and is not kept up to date.
<h3>Screenshots</h3>
<h5>Note: The screenshots may not always be up to date, but they should give a good idea of the general look and features</h5>
<img src="http://i.imgur.com/mMUdr6u.png"/>
<img src="http://i.imgur.com/66ARBGC.png"/>
<h3>Compiling</h3>
Compiling toxgui requires Qt 5.2 with the Qt Multimedia module and a C++11 compatible compiler.
It also requires the toxcore and toxav libraries.
To compile, first clone or download the toxgui repository and open a terminal in the toxgui folder.
Then run the script bootstrap.sh (for Linux and Mac) or bootsrap.bat (for Windows) to download an up-to-date toxcore.
And finally run the commands "qmake" and "make" to start building toxgui.
<h3>OSX Install Guide</h3>
<strong>This guide is intended for people who wish to use an existing or new ProjectTox-Core installation separate to the bundled installation with toxgui, if you do not wish to use a separate installation you can skip to the section titled 'Final Steps'.</strong>
Installation on OSX, isn't quite straight forward, here is a quick guide on how to install;
The first thing you need to do is install ProjectTox-Core with a/v support. Refer to the INSTALL guide in the ProjectTox-Core github repo.
Next you need to download QtTools (http://qt-project.org/downloads), at the time of writing this is at version 5.3.0.
Make sure you deselect all the unnecessary components from the 5.3 checkbox (iOS/Android libs) otherwise you will end up with a very large download.
Once that is installed you will most likely need to set the path for qmake. To do this, open up terminal and paste in the following;
```bash
export PATH=/location/to/qmake/binary:$PATH
```
For myself, the qmake binary was located in /Users/mouseym/Qt/5.3/clang_64/bin/.
Once this is installed, do the following;
```bash
git clone https://github.com/tux3/toxgui
cd toxgui
qmake
```
Do not run make, as we need further modifications to toxgui.
Open up the Makefile in a text editor (TextEdit/TextWrangler, etc).
You will need to modify the Makefile to point to your toxcore libs/includes.
The first change you will need to make is to point the Makefile towards the tox libs installed on your system. (Generally this is /usr/local/libs/).
Look for the line in the Makefile which references /toxgui/lib/libs/ and replace with the above).
The second change to Makefile is to add the location of the includes (On my system these were placed in /usr/local/include/tox/).
To do this, search for the INCLUDES line and add the following to the end;
```bash
-I/usr/local/include/tox/
```
Save the Makefile.
<h5>Final Steps</h5>
The final step is to run
```bash
make
```
in the toxgui directory, or if you are using the bundled tox core installation, you can use
```bash
./bootstrap.sh
```
Assuming all went well you should now have a toxgui.app file within the directory. Double click and it should open!

4
bootstrap.bat Normal file
View File

@ -0,0 +1,4 @@
@mkdir %~dp0libs
%~dp0tools\wget --no-check-certificate http://jenkins.libtoxcore.so/job/libtoxcore-win32-i686/lastSuccessfulBuild/artifact/libtoxcore-win32-i686.zip -O %~dp0libs\libtoxcore-latest.zip
%~dp0tools\unzip -o %~dp0libs\libtoxcore-latest.zip -d %~dp0libs\
@del %~dp0libs\libtoxcore-latest.zip

29
bootstrap.sh Executable file
View File

@ -0,0 +1,29 @@
#!/bin/bash
# directory where the script is located
SCRIPT_NAME=$(readlink -f $0)
SCRIPT_DIR=`dirname $SCRIPT_NAME`
# create libs dir if necessary
mkdir -p ${SCRIPT_DIR}/libs
# maybe an earlier run of this script failed
# thus we should remove the libtoxcore-latest dir
# if exists, otherwise cloning the git repo may fail
rm -rf ${SCRIPT_DIR}/libs/libtoxcore-latest
# clone current master of libtoxcore
git clone https://github.com/irungentoo/toxcore.git ${SCRIPT_DIR}/libs/libtoxcore-latest
# compile and install libtoxcore
pushd ${SCRIPT_DIR}/libs/libtoxcore-latest
./autogen.sh
./configure --prefix=${SCRIPT_DIR}/libs/
make -j2
make install
popd
# remove clone dir
rm -rf ${SCRIPT_DIR}/libs/libtoxcore-latest

View File

@ -137,12 +137,12 @@ void Core::onFriendRequest(Tox*/* tox*/, const uint8_t* cUserId, const uint8_t*
emit static_cast<Core*>(core)->friendRequestReceived(CUserId::toString(cUserId), CString::toString(cMessage, cMessageSize));
}
void Core::onFriendMessage(Tox*/* tox*/, int friendId, uint8_t* cMessage, uint16_t cMessageSize, void* core)
void Core::onFriendMessage(Tox*/* tox*/, int friendId, const uint8_t* cMessage, uint16_t cMessageSize, void* core)
{
emit static_cast<Core*>(core)->friendMessageReceived(friendId, CString::toString(cMessage, cMessageSize));
}
void Core::onFriendNameChange(Tox*/* tox*/, int friendId, uint8_t* cName, uint16_t cNameSize, void* core)
void Core::onFriendNameChange(Tox*/* tox*/, int friendId, const uint8_t* cName, uint16_t cNameSize, void* core)
{
emit static_cast<Core*>(core)->friendUsernameChanged(friendId, CString::toString(cName, cNameSize));
}
@ -152,7 +152,7 @@ void Core::onFriendTypingChange(Tox*/* tox*/, int friendId, uint8_t isTyping, vo
emit static_cast<Core*>(core)->friendTypingChanged(friendId, isTyping ? true : false);
}
void Core::onStatusMessageChanged(Tox*/* tox*/, int friendId, uint8_t* cMessage, uint16_t cMessageSize, void* core)
void Core::onStatusMessageChanged(Tox*/* tox*/, int friendId, const uint8_t* cMessage, uint16_t cMessageSize, void* core)
{
emit static_cast<Core*>(core)->friendStatusMessageChanged(friendId, CString::toString(cMessage, cMessageSize));
}
@ -186,18 +186,18 @@ void Core::onConnectionStatusChanged(Tox*/* tox*/, int friendId, uint8_t status,
}
}
void Core::onAction(Tox*/* tox*/, int friendId, uint8_t *cMessage, uint16_t cMessageSize, void *core)
void Core::onAction(Tox*/* tox*/, int friendId, const uint8_t *cMessage, uint16_t cMessageSize, void *core)
{
emit static_cast<Core*>(core)->actionReceived(friendId, CString::toString(cMessage, cMessageSize));
}
void Core::onGroupInvite(Tox*, int friendnumber, uint8_t *group_public_key, void *core)
void Core::onGroupInvite(Tox*, int friendnumber, const uint8_t *group_public_key, void *core)
{
qDebug() << QString("Core: Group invite by %1").arg(friendnumber);
emit static_cast<Core*>(core)->groupInviteReceived(friendnumber, group_public_key);
}
void Core::onGroupMessage(Tox*, int groupnumber, int friendgroupnumber, uint8_t * message, uint16_t length, void *core)
void Core::onGroupMessage(Tox*, int groupnumber, int friendgroupnumber, const uint8_t * message, uint16_t length, void *core)
{
emit static_cast<Core*>(core)->groupMessageReceived(groupnumber, friendgroupnumber, CString::toString(message, length));
}
@ -209,7 +209,7 @@ void Core::onGroupNamelistChange(Tox*, int groupnumber, int peernumber, uint8_t
}
void Core::onFileSendRequestCallback(Tox*, int32_t friendnumber, uint8_t filenumber, uint64_t filesize,
uint8_t *filename, uint16_t filename_length, void *core)
const uint8_t *filename, uint16_t filename_length, void *core)
{
qDebug() << QString("Core: Received file request %1 with friend %2").arg(filenumber).arg(friendnumber);
@ -218,7 +218,7 @@ void Core::onFileSendRequestCallback(Tox*, int32_t friendnumber, uint8_t filenum
emit static_cast<Core*>(core)->fileReceiveRequested(fileRecvQueue.last());
}
void Core::onFileControlCallback(Tox*, int32_t friendnumber, uint8_t receive_send, uint8_t filenumber,
uint8_t control_type, uint8_t*, uint16_t, void *core)
uint8_t control_type, const uint8_t*, uint16_t, void *core)
{
ToxFile* file{nullptr};
if (receive_send == 1)
@ -287,7 +287,7 @@ void Core::onFileControlCallback(Tox*, int32_t friendnumber, uint8_t receive_sen
}
}
void Core::onFileDataCallback(Tox*, int32_t friendnumber, uint8_t filenumber, uint8_t *data, uint16_t length, void *core)
void Core::onFileDataCallback(Tox*, int32_t friendnumber, uint8_t filenumber, const uint8_t *data, uint16_t length, void *core)
{
ToxFile* file{nullptr};
for (ToxFile& f : fileRecvQueue)
@ -798,7 +798,7 @@ QList<QString> Core::getGroupPeerNames(int groupId) const
return names;
}
int Core::joinGroupchat(int32_t friendnumber, uint8_t* friend_group_public_key) const
int Core::joinGroupchat(int32_t friendnumber, const uint8_t* friend_group_public_key) const
{
qDebug() << QString("Trying to join groupchat invite by friend %1").arg(friendnumber);
return tox_join_groupchat(tox, friendnumber, friend_group_public_key);

24
core.h
View File

@ -115,7 +115,7 @@ public:
int getGroupNumberPeers(int groupId) const;
QString getGroupPeerName(int groupId, int peerId) const;
QList<QString> getGroupPeerNames(int groupId) const;
int joinGroupchat(int32_t friendnumber, uint8_t* friend_group_public_key) const;
int joinGroupchat(int32_t friendnumber, const uint8_t* friend_group_public_key) const;
void quitGroupChat(int groupId) const;
void dispatchVideoFrame(vpx_image img) const;
@ -180,7 +180,7 @@ signals:
void friendLastSeenChanged(int friendId, const QDateTime& dateTime);
void emptyGroupCreated(int groupnumber);
void groupInviteReceived(int friendnumber, uint8_t *group_public_key);
void groupInviteReceived(int friendnumber, const uint8_t *group_public_key);
void groupMessageReceived(int groupnumber, int friendgroupnumber, const QString& message);
void groupNamelistChanged(int groupnumber, int peernumber, uint8_t change);
@ -224,21 +224,21 @@ signals:
private:
static void onFriendRequest(Tox* tox, const uint8_t* cUserId, const uint8_t* cMessage, uint16_t cMessageSize, void* core);
static void onFriendMessage(Tox* tox, int friendId, uint8_t* cMessage, uint16_t cMessageSize, void* core);
static void onFriendNameChange(Tox* tox, int friendId, uint8_t* cName, uint16_t cNameSize, void* core);
static void onFriendMessage(Tox* tox, int friendId, const uint8_t* cMessage, uint16_t cMessageSize, void* core);
static void onFriendNameChange(Tox* tox, int friendId, const uint8_t* cName, uint16_t cNameSize, void* core);
static void onFriendTypingChange(Tox* tox, int friendId, uint8_t isTyping, void* core);
static void onStatusMessageChanged(Tox* tox, int friendId, uint8_t* cMessage, uint16_t cMessageSize, void* core);
static void onStatusMessageChanged(Tox* tox, int friendId, const uint8_t* cMessage, uint16_t cMessageSize, void* core);
static void onUserStatusChanged(Tox* tox, int friendId, uint8_t userstatus, void* core);
static void onConnectionStatusChanged(Tox* tox, int friendId, uint8_t status, void* core);
static void onAction(Tox* tox, int friendId, uint8_t* cMessage, uint16_t cMessageSize, void* core);
static void onGroupInvite(Tox *tox, int friendnumber, uint8_t *group_public_key, void *userdata);
static void onGroupMessage(Tox *tox, int groupnumber, int friendgroupnumber, uint8_t * message, uint16_t length, void *userdata);
static void onAction(Tox* tox, int friendId, const uint8_t* cMessage, uint16_t cMessageSize, void* core);
static void onGroupInvite(Tox *tox, int friendnumber, const uint8_t *group_public_key, void *userdata);
static void onGroupMessage(Tox *tox, int groupnumber, int friendgroupnumber, const uint8_t * message, uint16_t length, void *userdata);
static void onGroupNamelistChange(Tox *tox, int groupnumber, int peernumber, uint8_t change, void *userdata);
static void onFileSendRequestCallback(Tox *tox, int32_t friendnumber, uint8_t filenumber, uint64_t filesize,
uint8_t *filename, uint16_t filename_length, void *userdata);
const uint8_t *filename, uint16_t filename_length, void *userdata);
static void onFileControlCallback(Tox *tox, int32_t friendnumber, uint8_t receive_send, uint8_t filenumber,
uint8_t control_type, uint8_t *data, uint16_t length, void *core);
static void onFileDataCallback(Tox *tox, int32_t friendnumber, uint8_t filenumber, uint8_t *data, uint16_t length, void *userdata);
uint8_t control_type, const uint8_t *data, uint16_t length, void *core);
static void onFileDataCallback(Tox *tox, int32_t friendnumber, uint8_t filenumber, const uint8_t *data, uint16_t length, void *userdata);
static void onAvInvite(int32_t call_index, void* toxav);
static void onAvStart(int32_t call_index, void* toxav);
@ -273,7 +273,7 @@ private:
private:
Tox* tox;
ToxAv* toxav;
QTimer *toxTimer, *saveTimer, *fileTimer, *bootstrapTimer;
QTimer *toxTimer, *fileTimer, *bootstrapTimer; //, *saveTimer;
Camera* camera;
QList<DhtServer> dhtServerList;
int dhtServerId;

BIN
img/status/dot_busy.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 308 B

BIN
img/status/dot_busy_2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 947 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 791 B

View File

@ -1,6 +1,8 @@
#include "widget/widget.h"
#include "settings.h"
#include <QApplication>
#include <QFontDatabase>
#include <QTranslator>
int main(int argc, char *argv[])
{
@ -8,7 +10,19 @@ int main(int argc, char *argv[])
a.setApplicationName("Toxgui");
a.setOrganizationName("Tox");
// install Unicode 6.1 supporting font
// Load translations
QTranslator translator;
if (Settings::getInstance().getUseTranslations())
{
QString locale = QLocale::system().name().section('_', 0, 0);
if (translator.load(locale,":translations/"))
qDebug() << "Loaded translation "+locale;
else
qDebug() << "Error loading translation "+locale;
a.installTranslator(&translator);
}
// Install Unicode 6.1 supporting font
QFontDatabase::addApplicationFont("://DejaVuSans.ttf");
Widget* w = Widget::getInstance();

View File

@ -97,5 +97,10 @@
<file>ui/window/restoreButtonPressed.png</file>
<file>ui/friendList/friendList.css</file>
<file>ui/window/window.css</file>
<file>img/status/dot_busy.png</file>
<file>img/status/dot_busy_2x.png</file>
<file>img/status/dot_busy_notification.png</file>
<file>translations/fr.qm</file>
<file>translations/ru.qm</file>
</qresource>
</RCC>

View File

@ -72,18 +72,11 @@ void Settings::load()
s.endArray();
s.endGroup();
//NOTE: uncomment when logging will be implemented
/*
s.beginGroup("Logging");
enableLogging = s.value("enableLogging", false).toBool();
encryptLogs = s.value("encryptLogs", true).toBool();
s.endGroup();
*/
s.beginGroup("General");
username = s.value("username", "My name").toString();
statusMessage = s.value("statusMessage", "My status").toString();
enableIPv6 = s.value("enableIPv6", true).toBool();
useTranslations = s.value("useTranslations", true).toBool();
s.endGroup();
s.beginGroup("Widgets");
@ -132,18 +125,11 @@ void Settings::save()
s.endArray();
s.endGroup();
//NOTE: uncomment when logging will be implemented
/*
s.beginGroup("Logging");
s.setValue("storeLogs", enableLogging);
s.setValue("encryptLogs", encryptLogs);
s.endGroup();
*/
s.beginGroup("General");
s.setValue("username", username);
s.setValue("statusMessage", statusMessage);
s.setValue("enableIPv6", enableIPv6);
s.setValue("useTranslations",useTranslations);
s.endGroup();
s.beginGroup("Widgets");
@ -221,6 +207,16 @@ void Settings::setEnableIPv6(bool newValue)
enableIPv6 = newValue;
}
bool Settings::getUseTranslations() const
{
return useTranslations;
}
void Settings::setUseTranslations(bool newValue)
{
useTranslations = newValue;
}
bool Settings::getEnableLogging() const
{
return enableLogging;

View File

@ -52,6 +52,9 @@ public:
bool getEnableIPv6() const;
void setEnableIPv6(bool newValue);
bool getUseTranslations() const;
void setUseTranslations(bool newValue);
bool getEnableLogging() const;
void setEnableLogging(bool newValue);
@ -134,6 +137,7 @@ private:
QString statusMessage;
bool enableIPv6;
bool useTranslations;
bool enableLogging;
bool encryptLogs;

BIN
tools/libeay32.dll Normal file

Binary file not shown.

BIN
tools/libiconv2.dll Normal file

Binary file not shown.

BIN
tools/libintl3.dll Normal file

Binary file not shown.

BIN
tools/libssl32.dll Normal file

Binary file not shown.

BIN
tools/unzip.exe Normal file

Binary file not shown.

BIN
tools/wget.exe Normal file

Binary file not shown.

View File

@ -5,11 +5,41 @@
#-------------------------------------------------
QT += core gui multimedia multimediawidgets
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = toxgui
TEMPLATE = app
FORMS += widget.ui
CONFIG += c++11
TRANSLATIONS = translations/fr.ts \
translations/ru.ts
RESOURCES += res.qrc
target.path = /usr/local/bin
INSTALLS += target
INCLUDEPATH += libs/include
win32 {
LIBS += $$PWD/libs/lib/libtoxav.a $$PWD/libs/lib/libopus.a $$PWD/libs/lib/libvpx.a $$PWD/libs/lib/libtoxcore.a -lws2_32 $$PWD/libs/lib/libsodium.a
} else {
LIBS += -L$$PWD/libs/lib/ -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
HEADERS += widget/form/addfriendform.h \
widget/form/chatform.h \
@ -37,30 +67,8 @@ HEADERS += widget/form/addfriendform.h \
widget/selfcamview.h \
widget/videosurface.h \
widget/camera.h \
widget/netcamview.h
FORMS += widget.ui
CONFIG += c++11
RESOURCES += \
res.qrc
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
widget/netcamview.h \
widget/tool/clickablelabel.h
SOURCES += \
widget/form/addfriendform.cpp \
@ -90,50 +98,5 @@ SOURCES += \
widget/selfcamview.cpp \
widget/videosurface.cpp \
widget/camera.cpp \
widget/netcamview.cpp
### EXAMPLE BUILD SETTINGS FOR WINDOWS
#win32: LIBS += -L$$PWD/../../../../Downloads/libtoxcore-win32-i686/lib/ -ltoxcore
#INCLUDEPATH += $$PWD/../../../../Downloads/libtoxcore-win32-i686/include
#DEPENDPATH += $$PWD/../../../../Downloads/libtoxcore-win32-i686/include
#win32:!win32-g++: PRE_TARGETDEPS += $$PWD/../../../../Downloads/libtoxcore-win32-i686/lib/toxcore.lib
#else:win32-g++: PRE_TARGETDEPS += $$PWD/../../../../Downloads/libtoxcore-win32-i686/lib/libtoxcore.a
#win32: LIBS += -L$$PWD/../../../../Downloads/libtoxcore-win32-i686/lib/ -ltoxav
#INCLUDEPATH += $$PWD/../../../../Downloads/libtoxcore-win32-i686/include
#DEPENDPATH += $$PWD/../../../../Downloads/libtoxcore-win32-i686/include
#win32:!win32-g++: PRE_TARGETDEPS += $$PWD/../../../../Downloads/libtoxcore-win32-i686/lib/toxav.lib
#else:win32-g++: PRE_TARGETDEPS += $$PWD/../../../../Downloads/libtoxcore-win32-i686/lib/libtoxav.a
#win32: LIBS += -L$$PWD/../../../../Downloads/libtoxcore-win32-i686/lib/ -lvpx
#INCLUDEPATH += $$PWD/../../../../Downloads/libtoxcore-win32-i686/include
#DEPENDPATH += $$PWD/../../../../Downloads/libtoxcore-win32-i686/include
#win32:!win32-g++: PRE_TARGETDEPS += $$PWD/../../../../Downloads/libtoxcore-win32-i686/lib/vpx.lib
#else:win32-g++: PRE_TARGETDEPS += $$PWD/../../../../Downloads/libtoxcore-win32-i686/lib/libvpx.a
#win32: LIBS += -L$$PWD/../../../../Downloads/libtoxcore-win32-i686/lib/ -lopus
#INCLUDEPATH += $$PWD/../../../../Downloads/libtoxcore-win32-i686/include
#DEPENDPATH += $$PWD/../../../../Downloads/libtoxcore-win32-i686/include
#win32:!win32-g++: PRE_TARGETDEPS += $$PWD/../../../../Downloads/libtoxcore-win32-i686/lib/opus.lib
#else:win32-g++: PRE_TARGETDEPS += $$PWD/../../../../Downloads/libtoxcore-win32-i686/lib/libopus.a
#win32: LIBS += -lws2_32
#win32: LIBS += -L$$PWD/../../../../Downloads/libtoxcore-win32-i686/lib/ -lsodium
#INCLUDEPATH += $$PWD/../../../../Downloads/libtoxcore-win32-i686/include
#DEPENDPATH += $$PWD/../../../../Downloads/libtoxcore-win32-i686/include
#win32:!win32-g++: PRE_TARGETDEPS += $$PWD/../../../../Downloads/libtoxcore-win32-i686/lib/sodium.lib
#else:win32-g++: PRE_TARGETDEPS += $$PWD/../../../../Downloads/libtoxcore-win32-i686/lib/libsodium.a
widget/netcamview.cpp \
widget/tool/clickablelabel.cpp

BIN
translations/fr.qm Normal file

Binary file not shown.

306
translations/fr.ts Normal file
View File

@ -0,0 +1,306 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.0" language="fr_FR">
<context>
<name>AddFriendForm</name>
<message>
<location filename="../widget/form/addfriendform.cpp" line="15"/>
<source>Add Friends</source>
<translation>Ajouter des amis</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="18"/>
<source>Tox ID</source>
<comment>Tox ID of the person you&apos;re sending a friend request to</comment>
<translation>ID Tox</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="19"/>
<source>Message</source>
<comment>The message you send in friend requests</comment>
<translation>Message</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="20"/>
<source>Send friend request</source>
<translation>Envoyer la demande d&apos;ami</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="67"/>
<source>Tox me maybe?</source>
<comment>Default message in friend requests if the field is left blank. Write something appropriate!</comment>
<translation>Je souhaiterais vous ajouter à mes contacts</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="75"/>
<source>Please fill in a valid Tox ID</source>
<comment>Tox ID of the friend you&apos;re sending a friend request to</comment>
<translation>Merci de remplir un ID Tox valide</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="90"/>
<source>Error while looking up DNS</source>
<comment>The DNS gives the Tox ID associated to toxme.se addresses</comment>
<translation>Erreur en consultant le serveur DNS</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="96"/>
<source>Unexpected number of text records</source>
<comment>Error with the DNS</comment>
<translation>Nombre d&apos;entrées texte innatendu</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="102"/>
<source>Unexpected number of values in text record</source>
<comment>Error with the DNS</comment>
<translation>Nombre d&apos;entrées numériques dans l&apos;entrée texte innatendu</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="109"/>
<source>The DNS lookup does not contain any Tox ID</source>
<comment>Error with the DNS</comment>
<translation>La réponse DNS ne contient aucun ID Tox</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="115"/>
<location filename="../widget/form/addfriendform.cpp" line="121"/>
<source>The DNS lookup does not contain a valid Tox ID</source>
<comment>Error with the DNS</comment>
<translation>La réponse DNS ne contient pas d&apos;ID Tox valide</translation>
</message>
</context>
<context>
<name>Camera</name>
<message>
<location filename="../widget/camera.cpp" line="145"/>
<source>Camera eror</source>
<translation>Erreur de caméra</translation>
</message>
<message>
<location filename="../widget/camera.cpp" line="146"/>
<source>Camera format %1 not supported, can&apos;t use the camera</source>
<translation>Format %1 de la caméra non supporté, impossible de l&apos;utiliser</translation>
</message>
</context>
<context>
<name>ChatForm</name>
<message>
<location filename="../widget/form/chatform.cpp" line="261"/>
<source>Send a file</source>
<translation>Envoyer un fichier</translation>
</message>
<message>
<location filename="../widget/form/chatform.cpp" line="586"/>
<location filename="../widget/form/chatform.cpp" line="592"/>
<source>Save chat log</source>
<translation>Sauvegarder l&apos;historique de conversation</translation>
</message>
</context>
<context>
<name>CopyableElideLabel</name>
<message>
<location filename="../widget/tool/copyableelidelabel.cpp" line="29"/>
<source>Copy</source>
<translation>Copier</translation>
</message>
</context>
<context>
<name>FileTransfertWidget</name>
<message>
<location filename="../widget/filetransfertwidget.cpp" line="231"/>
<source>Save a file</source>
<comment>Title of the file saving dialog</comment>
<translation>Sauvegarder un fichier</translation>
</message>
</context>
<context>
<name>FriendRequestDialog</name>
<message>
<location filename="../widget/tool/friendrequestdialog.cpp" line="30"/>
<source>Friend request</source>
<comment>Title of the window to aceept/deny a friend request</comment>
<translation>Demande d&apos;ami</translation>
</message>
<message>
<location filename="../widget/tool/friendrequestdialog.cpp" line="32"/>
<source>Someone wants to make friends with you</source>
<translation>Quelqu&apos;un veut devenir votre ami</translation>
</message>
<message>
<location filename="../widget/tool/friendrequestdialog.cpp" line="33"/>
<source>User ID:</source>
<translation>ID utilisateur:</translation>
</message>
<message>
<location filename="../widget/tool/friendrequestdialog.cpp" line="37"/>
<source>Friend request message:</source>
<translation>Message de demande d&apos;ami:</translation>
</message>
<message>
<location filename="../widget/tool/friendrequestdialog.cpp" line="44"/>
<source>Accept</source>
<comment>Accept a friend request</comment>
<translation>Accepter</translation>
</message>
<message>
<location filename="../widget/tool/friendrequestdialog.cpp" line="45"/>
<source>Reject</source>
<comment>Reject a friend request</comment>
<translation>Rejeter</translation>
</message>
</context>
<context>
<name>FriendWidget</name>
<message>
<location filename="../widget/friendwidget.cpp" line="65"/>
<source>Copy friend ID</source>
<comment>Menu to copy the Tox ID of that friend</comment>
<translation>Copier l&apos;ID ami</translation>
</message>
<message>
<location filename="../widget/friendwidget.cpp" line="66"/>
<source>Invite in group</source>
<comment>Menu to invite a friend in a groupchat</comment>
<translation>Inviter dans un groupe</translation>
</message>
<message>
<location filename="../widget/friendwidget.cpp" line="76"/>
<source>Remove friend</source>
<comment>Menu to remove the friend from our friendlist</comment>
<translation>Supprimer ami</translation>
</message>
</context>
<context>
<name>GroupChatForm</name>
<message>
<location filename="../widget/form/groupchatform.cpp" line="32"/>
<source>%1 users in chat</source>
<comment>Number of users in chat</comment>
<translation>%1 personnes</translation>
</message>
<message>
<location filename="../widget/form/groupchatform.cpp" line="155"/>
<source>&lt;Unknown&gt;</source>
<translation>&lt;Inconnu&gt;</translation>
</message>
<message>
<location filename="../widget/form/groupchatform.cpp" line="220"/>
<source>%1 users in chat</source>
<translation>%1 personnes</translation>
</message>
<message>
<location filename="../widget/form/groupchatform.cpp" line="239"/>
<source>Save chat log</source>
<translation>Sauvegarder l&apos;historique de conversation</translation>
</message>
</context>
<context>
<name>GroupWidget</name>
<message>
<location filename="../widget/groupwidget.cpp" line="38"/>
<location filename="../widget/groupwidget.cpp" line="126"/>
<source>%1 users in chat</source>
<translation>%1 personnes</translation>
</message>
<message>
<location filename="../widget/groupwidget.cpp" line="40"/>
<location filename="../widget/groupwidget.cpp" line="128"/>
<source>0 users in chat</source>
<translation>0 personnes</translation>
</message>
<message>
<location filename="../widget/groupwidget.cpp" line="68"/>
<source>Quit group</source>
<comment>Menu to quit a groupchat</comment>
<translation>Quitter le groupe</translation>
</message>
</context>
<context>
<name>SelfCamView</name>
<message>
<location filename="../widget/selfcamview.cpp" line="16"/>
<source>Tox video test</source>
<comment>Title of the window to test the video/webcam</comment>
<translation>Test vidéo Tox</translation>
</message>
</context>
<context>
<name>SettingsForm</name>
<message>
<location filename="../widget/form/settingsform.cpp" line="13"/>
<source>User Settings</source>
<comment>&quot;Headline&quot; of the window</comment>
<translation>Configuration</translation>
</message>
<message>
<location filename="../widget/form/settingsform.cpp" line="16"/>
<source>Name</source>
<comment>Username/nick</comment>
<translation>Nom</translation>
</message>
<message>
<location filename="../widget/form/settingsform.cpp" line="17"/>
<source>Status</source>
<comment>Status message</comment>
<translation>Status</translation>
</message>
<message>
<location filename="../widget/form/settingsform.cpp" line="22"/>
<source>Test video</source>
<comment>Text on a button to test the video/webcam</comment>
<translation>Tester la vidéo</translation>
</message>
<message>
<location filename="../widget/form/settingsform.cpp" line="23"/>
<source>Enable IPv6 (recommended)</source>
<comment>Text on a checkbox to enable IPv6</comment>
<translation>Activer IPv6 (recommandé)</translation>
</message>
</context>
<context>
<name>Widget</name>
<message>
<location filename="../widget.ui" line="20"/>
<source>Tox</source>
<translation>Tox</translation>
</message>
<message>
<location filename="../widget.ui" line="1593"/>
<source>Your name</source>
<translation>Votre nom</translation>
</message>
<message>
<location filename="../widget.ui" line="1675"/>
<source>Your status</source>
<translation>Votre status</translation>
</message>
<message>
<location filename="../widget.ui" line="2811"/>
<source>Close</source>
<translation>Fermer</translation>
</message>
<message>
<location filename="../widget.ui" line="2814"/>
<source>Ctrl+Q</source>
<translation>Ctrl+Q</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="1112"/>
<source>Online</source>
<comment>Button to set your status to &apos;Online&apos;</comment>
<translation>Connecté</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="1113"/>
<source>Away</source>
<comment>Button to set your status to &apos;Away&apos;</comment>
<translation>Indisponnible</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="1114"/>
<source>Busy</source>
<comment>Button to set your status to &apos;Busy&apos;</comment>
<translation>Occupé</translation>
</message>
</context>
</TS>

BIN
translations/ru.qm Normal file

Binary file not shown.

311
translations/ru.ts Normal file
View File

@ -0,0 +1,311 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="ru_RU">
<context>
<name>AddFriendForm</name>
<message>
<location filename="../widget/form/addfriendform.cpp" line="15"/>
<source>Add Friends</source>
<translation>Добавление друзей</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="18"/>
<source>Tox ID</source>
<comment>Tox ID of the person you&apos;re sending a friend request to</comment>
<translation>Tox ID</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="19"/>
<source>Message</source>
<comment>The message you send in friend requests</comment>
<translation>Сообщение</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="20"/>
<source>Send friend request</source>
<translatorcomment>Мне не нравится, но другого не придумал, и фейсбук использует это</translatorcomment>
<translation>Отправить запрос на добавление в друзья</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="67"/>
<source>Tox me maybe?</source>
<comment>Default message in friend requests if the field is left blank. Write something appropriate!</comment>
<translatorcomment>Вот таким нехитрым и незамысловатым образом решаются сложные переводчиские проблемы</translatorcomment>
<translation>Добавь меня, а?</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="75"/>
<source>Please fill in a valid Tox ID</source>
<comment>Tox ID of the friend you&apos;re sending a friend request to</comment>
<translation>Пожалуйста, введите корректный Tox ID</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="92"/>
<source>Error while looking up DNS</source>
<comment>The DNS gives the Tox ID associated to toxme.se addresses</comment>
<translation>Ошибка при просмотре DNS</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="98"/>
<source>Unexpected number of text records</source>
<comment>Error with the DNS</comment>
<translation>Непредвиденное количество текстовых записей</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="104"/>
<source>Unexpected number of values in text record</source>
<comment>Error with the DNS</comment>
<translation>Непредвиденное количество значений в текстовой записи</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="111"/>
<source>The DNS lookup does not contain any Tox ID</source>
<comment>Error with the DNS</comment>
<translation>В ответе DNS ни одного Tox ID</translation>
</message>
<message>
<location filename="../widget/form/addfriendform.cpp" line="117"/>
<location filename="../widget/form/addfriendform.cpp" line="123"/>
<source>The DNS lookup does not contain a valid Tox ID</source>
<comment>Error with the DNS</comment>
<translation>Ответ DNS не содержит корректных Tox ID</translation>
</message>
</context>
<context>
<name>Camera</name>
<message>
<location filename="../widget/camera.cpp" line="145"/>
<source>Camera eror</source>
<translation>Ошибка камеры</translation>
</message>
<message>
<location filename="../widget/camera.cpp" line="146"/>
<source>Camera format %1 not supported, can&apos;t use the camera</source>
<translation>Формат камеры %1 не поддерживается, невозможно использовать камеру</translation>
</message>
</context>
<context>
<name>ChatForm</name>
<message>
<location filename="../widget/form/chatform.cpp" line="261"/>
<source>Send a file</source>
<translation type="unfinished">Отправить файл</translation>
</message>
<message>
<location filename="../widget/form/chatform.cpp" line="586"/>
<location filename="../widget/form/chatform.cpp" line="592"/>
<source>Save chat log</source>
<translation>Сохранить лог чата</translation>
</message>
</context>
<context>
<name>CopyableElideLabel</name>
<message>
<location filename="../widget/tool/copyableelidelabel.cpp" line="29"/>
<source>Copy</source>
<translation>Копировать</translation>
</message>
</context>
<context>
<name>FileTransfertWidget</name>
<message>
<location filename="../widget/filetransfertwidget.cpp" line="233"/>
<source>Save a file</source>
<comment>Title of the file saving dialog</comment>
<translation>Сохранить файл</translation>
</message>
</context>
<context>
<name>FriendRequestDialog</name>
<message>
<location filename="../widget/tool/friendrequestdialog.cpp" line="30"/>
<source>Friend request</source>
<comment>Title of the window to aceept/deny a friend request</comment>
<translatorcomment>Мне не нравится, но другого не придумал, и фейсбук использует это</translatorcomment>
<translation>Запрос на добавление в друзья</translation>
</message>
<message>
<location filename="../widget/tool/friendrequestdialog.cpp" line="32"/>
<source>Someone wants to make friends with you</source>
<translatorcomment>«Подружиться», вероятно, недостаточно вежливо</translatorcomment>
<translation>Кто-то хочет добавить вас в друзья</translation>
</message>
<message>
<location filename="../widget/tool/friendrequestdialog.cpp" line="33"/>
<source>User ID:</source>
<translation>ID пользователя:</translation>
</message>
<message>
<location filename="../widget/tool/friendrequestdialog.cpp" line="37"/>
<source>Friend request message:</source>
<translation>Текст запроса:</translation>
</message>
<message>
<location filename="../widget/tool/friendrequestdialog.cpp" line="44"/>
<source>Accept</source>
<comment>Accept a friend request</comment>
<translation>Принять</translation>
</message>
<message>
<location filename="../widget/tool/friendrequestdialog.cpp" line="45"/>
<source>Reject</source>
<comment>Reject a friend request</comment>
<translation>Отклонить</translation>
</message>
</context>
<context>
<name>FriendWidget</name>
<message>
<location filename="../widget/friendwidget.cpp" line="71"/>
<source>Copy friend ID</source>
<comment>Menu to copy the Tox ID of that friend</comment>
<translation>Копировать ID друга</translation>
</message>
<message>
<location filename="../widget/friendwidget.cpp" line="72"/>
<source>Invite in group</source>
<comment>Menu to invite a friend in a groupchat</comment>
<translation>Пригласить в группу</translation>
</message>
<message>
<location filename="../widget/friendwidget.cpp" line="82"/>
<source>Remove friend</source>
<comment>Menu to remove the friend from our friendlist</comment>
<translation>Удалить друга</translation>
</message>
</context>
<context>
<name>GroupChatForm</name>
<message>
<location filename="../widget/form/groupchatform.cpp" line="32"/>
<source>%1 users in chat</source>
<comment>Number of users in chat</comment>
<translation>%1 пользователей в чате</translation>
</message>
<message>
<location filename="../widget/form/groupchatform.cpp" line="155"/>
<source>&lt;Unknown&gt;</source>
<translation>&lt;Неизвестно&gt;</translation>
</message>
<message>
<location filename="../widget/form/groupchatform.cpp" line="220"/>
<source>%1 users in chat</source>
<translation>%1 пользователей в чате</translation>
</message>
<message>
<location filename="../widget/form/groupchatform.cpp" line="239"/>
<source>Save chat log</source>
<translation>Сохранить лог чата</translation>
</message>
</context>
<context>
<name>GroupWidget</name>
<message>
<location filename="../widget/groupwidget.cpp" line="73"/>
<source>Quit group</source>
<comment>Menu to quit a groupchat</comment>
<translation>Покинуть группу</translation>
</message>
<message>
<location filename="../widget/groupwidget.cpp" line="38"/>
<location filename="../widget/groupwidget.cpp" line="128"/>
<source>%1 users in chat</source>
<translation>%1 пользователей в чате</translation>
</message>
<message>
<location filename="../widget/groupwidget.cpp" line="40"/>
<location filename="../widget/groupwidget.cpp" line="130"/>
<source>0 users in chat</source>
<translation>Ни одного пользователя в чате</translation>
</message>
</context>
<context>
<name>SelfCamView</name>
<message>
<location filename="../widget/selfcamview.cpp" line="16"/>
<source>Tox video test</source>
<comment>Title of the window to test the video/webcam</comment>
<translation>Проверка видео</translation>
</message>
</context>
<context>
<name>SettingsForm</name>
<message>
<location filename="../widget/form/settingsform.cpp" line="13"/>
<source>User Settings</source>
<comment>&quot;Headline&quot; of the window</comment>
<translation>Пользовательские настройки</translation>
</message>
<message>
<location filename="../widget/form/settingsform.cpp" line="16"/>
<source>Name</source>
<comment>Username/nick</comment>
<translation>Имя</translation>
</message>
<message>
<location filename="../widget/form/settingsform.cpp" line="17"/>
<source>Status</source>
<comment>Status message</comment>
<translation>Статус</translation>
</message>
<message>
<location filename="../widget/form/settingsform.cpp" line="22"/>
<source>Test video</source>
<comment>Text on a button to test the video/webcam</comment>
<translation>Проверить видео</translation>
</message>
<message>
<location filename="../widget/form/settingsform.cpp" line="23"/>
<source>Enable IPv6 (recommended)</source>
<comment>Text on a checkbox to enable IPv6</comment>
<translation>Включить IPv6 (рекомендуется)</translation>
</message>
</context>
<context>
<name>Widget</name>
<message>
<location filename="../widget.ui" line="26"/>
<source>Tox</source>
<translation>Tox</translation>
</message>
<message>
<location filename="../widget.ui" line="1683"/>
<source>Your name</source>
<translation>Ваше имя</translation>
</message>
<message>
<location filename="../widget.ui" line="1759"/>
<source>Your status</source>
<translation>Ваш статус</translation>
</message>
<message>
<location filename="../widget.ui" line="3005"/>
<source>Close</source>
<translation>Закрыть</translation>
</message>
<message>
<location filename="../widget.ui" line="3008"/>
<source>Ctrl+Q</source>
<translation>Ctrl+Q</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="1149"/>
<source>Online</source>
<comment>Button to set your status to &apos;Online&apos;</comment>
<translation>В сети</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="1150"/>
<source>Away</source>
<comment>Button to set your status to &apos;Away&apos;</comment>
<translatorcomment>Вероятно, это не столь долгое путешествие</translatorcomment>
<translation>Отошёл</translation>
</message>
<message>
<location filename="../widget/widget.cpp" line="1151"/>
<source>Busy</source>
<comment>Button to set your status to &apos;Busy&apos;</comment>
<translation>Занят</translation>
</message>
</context>
</TS>

View File

@ -781,16 +781,7 @@
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<property name="margin">
<number>0</number>
</property>
<item>
@ -1788,7 +1779,7 @@
</spacer>
</item>
<item>
<widget class="QLabel" name="statImg">
<widget class="ClickableLabel" name="statImg">
<property name="minimumSize">
<size>
<width>40</width>
@ -1808,7 +1799,7 @@
<string/>
</property>
<property name="pixmap">
<pixmap>../../c/toxgui/img/status/dot_away_2x.png</pixmap>
<pixmap resource="res.qrc">:/img/status/dot_away_2x.png</pixmap>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
@ -1821,10 +1812,6 @@
</layout>
</item>
</layout>
<zorder>profilePicture</zorder>
<zorder>statImg</zorder>
<zorder>nameLabel</zorder>
<zorder>statusLabel</zorder>
</widget>
</item>
<item>
@ -1858,7 +1845,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>225</width>
<width>258</width>
<height>199</height>
</rect>
</property>
@ -2304,16 +2291,7 @@
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<property name="margin">
<number>0</number>
</property>
<item>
@ -2914,16 +2892,7 @@
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<property name="margin">
<number>0</number>
</property>
<item>
@ -3047,6 +3016,11 @@
<extends>QLabel</extends>
<header>widget/tool/editablelabelwidget.h</header>
</customwidget>
<customwidget>
<class>ClickableLabel</class>
<extends>QLabel</extends>
<header>widget/tool/clickablelabel.h</header>
</customwidget>
</customwidgets>
<resources>
<include location="res.qrc"/>

View File

@ -142,8 +142,8 @@ bool Camera::isFormatSupported(const QVideoSurfaceFormat& format) const
}
else
{
QMessageBox::warning(0, "Camera eror",
QString("Camera format %1 not supported, can't use the camera")
QMessageBox::warning(0, tr("Camera eror"),
tr("Camera format %1 not supported, can't use the camera")
.arg(format.pixelFormat()));
return false;
}

View File

@ -1,6 +1,7 @@
#include "filetransfertwidget.h"
#include "widget.h"
#include "core.h"
#include "math.h"
#include <QFileDialog>
#include <QPixmap>
@ -229,7 +230,7 @@ void FileTransfertWidget::rejectRecvRequest()
void FileTransfertWidget::acceptRecvRequest()
{
QString path = QFileDialog::getSaveFileName(0,"Save a file",QDir::currentPath()+'/'+filename->text());
QString path = QFileDialog::getSaveFileName(0,tr("Save a file","Title of the file saving dialog"),QDir::currentPath()+'/'+filename->text());
if (path.isEmpty())
return;

View File

@ -12,12 +12,12 @@ AddFriendForm::AddFriendForm() : dns(this)
main = new QWidget(), head = new QWidget();
QFont bold;
bold.setBold(true);
headLabel.setText("Add Friends");
headLabel.setText(tr("Add Friends"));
headLabel.setFont(bold);
toxIdLabel.setText("Tox ID");
messageLabel.setText("Message");
sendButton.setText("Send friend request");
toxIdLabel.setText(tr("Tox ID","Tox ID of the person you're sending a friend request to"));
messageLabel.setText(tr("Message","The message you send in friend requests"));
sendButton.setText(tr("Send friend request"));
main->setLayout(&layout);
layout.addWidget(&toxIdLabel);
@ -64,7 +64,7 @@ void AddFriendForm::showWarning(const QString &message) const
QString AddFriendForm::getMessage() const
{
const QString msg = message.toPlainText();
return !msg.isEmpty() ? msg : "Tox me maybe?";
return !msg.isEmpty() ? msg : tr("Tox me maybe?","Default message in friend requests if the field is left blank. Write something appropriate!");
}
void AddFriendForm::onSendTriggered()
@ -72,7 +72,7 @@ void AddFriendForm::onSendTriggered()
QString id = toxId.text().trimmed();
if (id.isEmpty()) {
showWarning("Please fill in a valid Tox ID");
showWarning(tr("Please fill in a valid Tox ID","Tox ID of the friend you're sending a friend request to"));
} else if (isToxId(id)) {
emit friendRequested(id, getMessage());
this->toxId.setText("");
@ -89,38 +89,38 @@ void AddFriendForm::handleDnsLookup()
const QString idKeyWord("id=");
if (dns.error() != QDnsLookup::NoError) {
showWarning("Error while looking up DNS");
showWarning(tr("Error while looking up DNS","The DNS gives the Tox ID associated to toxme.se addresses"));
return;
}
const QList<QDnsTextRecord> textRecords = dns.textRecords();
if (textRecords.length() != 1) {
showWarning("Unexpected number of text records");
showWarning(tr("Unexpected number of text records", "Error with the DNS"));
return;
}
const QList<QByteArray> textRecordValues = textRecords.first().values();
if (textRecordValues.length() != 1) {
showWarning("Unexpected number of values in text record");
showWarning(tr("Unexpected number of values in text record", "Error with the DNS"));
return;
}
const QString entry(textRecordValues.first());
int idx = entry.indexOf(idKeyWord);
if (idx < 0) {
showWarning("The DNS lookup does not contain any Tox ID");
showWarning(tr("The DNS lookup does not contain any Tox ID", "Error with the DNS"));
return;
}
idx += idKeyWord.length();
if (entry.length() < idx + static_cast<int>(TOX_ID_SIZE)) {
showWarning("The DNS lookup does not contain a valid Tox ID");
showWarning(tr("The DNS lookup does not contain a valid Tox ID", "Error with the DNS"));
return;
}
const QString friendAdress = entry.mid(idx, TOX_ID_SIZE);
if (!isToxId(friendAdress)) {
showWarning("The DNS lookup does not contain a valid Tox ID");
showWarning(tr("The DNS lookup does not contain a valid Tox ID", "Error with the DNS"));
return;
}

View File

@ -258,7 +258,7 @@ void ChatForm::addMessage(QLabel* author, QLabel* message, QLabel* date)
void ChatForm::onAttachClicked()
{
QString path = QFileDialog::getOpenFileName(0,"Send a file");
QString path = QFileDialog::getOpenFileName(0,tr("Send a file"));
if (path.isEmpty())
return;
@ -583,13 +583,13 @@ void ChatForm::onChatContextMenuRequested(QPoint pos)
QWidget* sender = (QWidget*)QObject::sender();
pos = sender->mapToGlobal(pos);
QMenu menu;
menu.addAction("Save chat log", this, SLOT(onSaveLogClicked()));
menu.addAction(tr("Save chat log"), this, SLOT(onSaveLogClicked()));
menu.exec(pos);
}
void ChatForm::onSaveLogClicked()
{
QString path = QFileDialog::getSaveFileName(0,"Save chat log");
QString path = QFileDialog::getSaveFileName(0,tr("Save chat log"));
if (path.isEmpty())
return;

View File

@ -29,7 +29,7 @@ GroupChatForm::GroupChatForm(Group* chatGroup)
name->setText(group->widget->name.text());
name->setFont(bold);
nusers->setFont(small);
nusers->setText(QString("%1 users in chat").arg(group->peers.size()));
nusers->setText(GroupChatForm::tr("%1 users in chat","Number of users in chat").arg(group->peers.size()));
avatar->setPixmap(QPixmap(":/img/group.png"));
QString names;
for (QString& s : group->peers)
@ -152,7 +152,7 @@ void GroupChatForm::addGroupMessage(QString message, int peerId)
if (group->peers.contains(peerId))
msgAuthor = new QLabel(group->peers[peerId]);
else
msgAuthor = new QLabel("<Unknown>");
msgAuthor = new QLabel(tr("<Unknown>"));
QLabel *msgText = new QLabel(message);
QLabel *msgDate = new QLabel(QTime::currentTime().toString("hh:mm"));
@ -217,7 +217,7 @@ void GroupChatForm::onSliderRangeChanged()
void GroupChatForm::onUserListChanged()
{
nusers->setText(QString("%1 users in chat").arg(group->nPeers));
nusers->setText(tr("%1 users in chat").arg(group->nPeers));
QString names;
for (QString& s : group->peers)
names.append(s+", ");
@ -236,7 +236,7 @@ void GroupChatForm::onChatContextMenuRequested(QPoint pos)
void GroupChatForm::onSaveLogClicked()
{
QString path = QFileDialog::getSaveFileName(0,"Save chat log");
QString path = QFileDialog::getSaveFileName(0,tr("Save chat log"));
if (path.isEmpty())
return;

View File

@ -2,6 +2,8 @@
#include "widget/widget.h"
#include "settings.h"
#include <QFont>
#include <QClipboard>
#include <QApplication>
SettingsForm::SettingsForm()
: QObject()
@ -9,19 +11,25 @@ SettingsForm::SettingsForm()
main = new QWidget(), head = new QWidget();
QFont bold, small;
bold.setBold(true);
small.setPixelSize(7);
headLabel.setText("User Settings");
small.setPixelSize(13);
headLabel.setText(tr("User Settings","\"Headline\" of the window"));
headLabel.setFont(bold);
nameLabel.setText("Name");
statusTextLabel.setText("Status");
idLabel.setText("Tox ID");
nameLabel.setText(tr("Name","Username/nick"));
statusTextLabel.setText(tr("Status","Status message"));
idLabel.setText("Tox ID (click here to copy)");
id.setFont(small);
id.setTextInteractionFlags(Qt::TextSelectableByMouse);
id.setReadOnly(true);
id.setFrameStyle(QFrame::NoFrame);
id.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
id.setFixedHeight(id.document()->size().height());
videoTest.setText("Test video");
enableIPv6.setText("Enable IPv6 (recommended)");
videoTest.setText(tr("Test video","Text on a button to test the video/webcam"));
enableIPv6.setText(tr("Enable IPv6 (recommended)","Text on a checkbox to enable IPv6"));
enableIPv6.setChecked(Settings::getInstance().getEnableIPv6());
useTranslations.setText(tr("Use translations","Text on a checkbox to enable translations"));
useTranslations.setChecked(Settings::getInstance().getUseTranslations());
main->setLayout(&layout);
layout.addWidget(&nameLabel);
@ -32,6 +40,7 @@ SettingsForm::SettingsForm()
layout.addWidget(&id);
layout.addWidget(&videoTest);
layout.addWidget(&enableIPv6);
layout.addWidget(&useTranslations);
layout.addStretch();
head->setLayout(&headLayout);
@ -39,6 +48,7 @@ SettingsForm::SettingsForm()
connect(&videoTest, SIGNAL(clicked()), this, SLOT(onTestVideoClicked()));
connect(&enableIPv6, SIGNAL(stateChanged(int)), this, SLOT(onEnableIPv6Updated()));
connect(&idLabel, SIGNAL(clicked()), this, SLOT(copyIdClicked()));
}
SettingsForm::~SettingsForm()
@ -69,3 +79,14 @@ void SettingsForm::onEnableIPv6Updated()
{
Settings::getInstance().setEnableIPv6(enableIPv6.isChecked());
}
void SettingsForm::copyIdClicked()
{
id.selectAll();;
QApplication::clipboard()->setText(id.toPlainText());
}
void SettingsForm::onUseTranslationUpdated()
{
Settings::getInstance().setUseTranslations(useTranslations.isChecked());
}

View File

@ -8,6 +8,9 @@
#include <QObject>
#include <QSpacerItem>
#include <QCheckBox>
#include <QPushButton>
#include <QTextEdit>
#include "widget/tool/clickablelabel.h"
#include "ui_widget.h"
#include "widget/selfcamview.h"
@ -26,11 +29,15 @@ public slots:
private slots:
void onTestVideoClicked();
void onEnableIPv6Updated();
void onUseTranslationUpdated();
void copyIdClicked();
private:
QLabel headLabel, nameLabel, statusTextLabel, idLabel, id;
QLabel headLabel, nameLabel, statusTextLabel;
QTextEdit id;
ClickableLabel idLabel;
QPushButton videoTest;
QCheckBox enableIPv6;
QCheckBox enableIPv6, useTranslations;
QVBoxLayout layout, headLayout;
QWidget *main, *head;

View File

@ -68,8 +68,8 @@ void FriendWidget::contextMenuEvent(QContextMenuEvent * event)
{
QPoint pos = event->globalPos();
QMenu menu;
menu.addAction("Copy friend ID");
QMenu* inviteMenu = menu.addMenu("Invite in group");
QAction* copyId = menu.addAction(tr("Copy friend ID","Menu to copy the Tox ID of that friend"));
QMenu* inviteMenu = menu.addMenu(tr("Invite in group","Menu to invite a friend in a groupchat"));
QMap<QAction*, Group*> groupActions;
for (Group* group : GroupList::groupList)
{
@ -79,17 +79,17 @@ void FriendWidget::contextMenuEvent(QContextMenuEvent * event)
if (groupActions.isEmpty())
inviteMenu->setEnabled(false);
menu.addSeparator();
menu.addAction("Remove friend");
QAction* removeFriendAction = menu.addAction(tr("Remove friend", "Menu to remove the friend from our friendlist"));
QAction* selectedItem = menu.exec(pos);
if (selectedItem)
{
if (selectedItem->text() == "Copy friend ID")
if (selectedItem == copyId)
{
emit copyFriendIdToClipboard(friendId);
return;
}
else if (selectedItem->text() == "Remove friend")
else if (selectedItem == removeFriendAction)
{
hide();
emit removeFriend(friendId);

View File

@ -35,9 +35,9 @@ GroupWidget::GroupWidget(int GroupId, QString Name)
this->setPalette(pal3);
Group* g = GroupList::findGroup(groupId);
if (g)
nusers.setText(QString("%1 users in chat").arg(g->peers.size()));
nusers.setText(GroupWidget::tr("%1 users in chat").arg(g->peers.size()));
else
nusers.setText("0 users in chat");
nusers.setText(GroupWidget::tr("0 users in chat"));
textLayout.addStretch();
textLayout.addWidget(&name);
@ -70,19 +70,16 @@ void GroupWidget::contextMenuEvent(QContextMenuEvent * event)
{
QPoint pos = event->globalPos();
QMenu menu;
menu.addAction("Quit group");
QAction* quitGroup = menu.addAction(tr("Quit group","Menu to quit a groupchat"));
QAction* selectedItem = menu.exec(pos);
if (selectedItem)
{
if (selectedItem->text() == "Quit group")
if (selectedItem == quitGroup)
{
hide();
emit removeGroup(groupId);
return;
}
}
}
void GroupWidget::mousePressEvent(QMouseEvent *event)
{
@ -128,9 +125,9 @@ void GroupWidget::onUserListChanged()
{
Group* g = GroupList::findGroup(groupId);
if (g)
nusers.setText(QString("%1 users in chat").arg(g->nPeers));
nusers.setText(tr("%1 users in chat").arg(g->nPeers));
else
nusers.setText("0 users in chat");
nusers.setText(tr("0 users in chat"));
}
void GroupWidget::setAsActiveChatroom()

View File

@ -13,7 +13,7 @@ SelfCamView::SelfCamView(Camera* Cam, QWidget* parent)
mainLayout{new QHBoxLayout()}, cam(Cam)
{
setLayout(mainLayout);
setWindowTitle("Tox video test");
setWindowTitle(SelfCamView::tr("Tox video test","Title of the window to test the video/webcam"));
setMinimumSize(320,240);
updateDisplayTimer.setInterval(5);

View File

@ -0,0 +1,11 @@
#include "clickablelabel.h"
ClickableLabel::ClickableLabel(QWidget *parent) :
QLabel(parent)
{
}
void ClickableLabel::mousePressEvent(QMouseEvent*)
{
emit clicked();
}

View File

@ -0,0 +1,20 @@
#ifndef CLICKABLELABEL_H
#define CLICKABLELABEL_H
#include <QLabel>
class ClickableLabel : public QLabel
{
Q_OBJECT
public:
explicit ClickableLabel(QWidget *parent = 0);
signals:
void clicked();
protected:
void mousePressEvent ( QMouseEvent * event );
};
#endif // CLICKABLELABEL_H

View File

@ -26,7 +26,7 @@ CopyableElideLabel::CopyableElideLabel(QWidget* parent) :
setContextMenuPolicy(Qt::CustomContextMenu);
connect(this, &CopyableElideLabel::customContextMenuRequested, this, &CopyableElideLabel::showContextMenu);
actionCopy = new QAction(tr("Copy"), this);
actionCopy = new QAction(CopyableElideLabel::tr("Copy"), this);
connect(actionCopy, &QAction::triggered, [this]() {
QApplication::clipboard()->setText(text());
});

View File

@ -21,6 +21,7 @@
class CopyableElideLabel : public ElideLabel
{
Q_OBJECT
public:
explicit CopyableElideLabel(QWidget* parent = 0);

View File

@ -27,22 +27,22 @@ FriendRequestDialog::FriendRequestDialog(QWidget *parent, const QString &userId,
QDialog(parent)
{
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
setWindowTitle("Friend request");
setWindowTitle(tr("Friend request","Title of the window to aceept/deny a friend request"));
QLabel *friendsLabel = new QLabel("Someone wants to make friends with you.", this);
QLabel *userIdLabel = new QLabel("User ID:", this);
QLabel *friendsLabel = new QLabel(tr("Someone wants to make friends with you"), this);
QLabel *userIdLabel = new QLabel(tr("User ID:"), this);
QLineEdit *userIdEdit = new QLineEdit(userId, this);
userIdEdit->setCursorPosition(0);
userIdEdit->setReadOnly(true);
QLabel *messageLabel = new QLabel("Friend request message:", this);
QLabel *messageLabel = new QLabel(tr("Friend request message:"), this);
QPlainTextEdit *messageEdit = new QPlainTextEdit(message, this);
messageEdit->setReadOnly(true);
QDialogButtonBox *buttonBox = new QDialogButtonBox(Qt::Horizontal, this);
buttonBox->addButton("Accept", QDialogButtonBox::AcceptRole);
buttonBox->addButton("Reject", QDialogButtonBox::RejectRole);
buttonBox->addButton(tr("Accept","Accept a friend request"), QDialogButtonBox::AcceptRole);
buttonBox->addButton(tr("Reject","Reject a friend request"), QDialogButtonBox::RejectRole);
connect(buttonBox, &QDialogButtonBox::accepted, this, &FriendRequestDialog::accept);
connect(buttonBox, &QDialogButtonBox::rejected, this, &FriendRequestDialog::reject);

View File

@ -160,7 +160,6 @@ Widget::Widget(QWidget *parent) :
ui->pbMin->setMouseTracking(true);
ui->pbMax->setMouseTracking(true);
ui->pbClose->setMouseTracking(true);
ui->statusHead->setAttribute(Qt::WA_TransparentForMouseEvents);
ui->statusHead->setMouseTracking(true);
QList<int> currentSizes = ui->centralWidget->sizes();
@ -214,6 +213,7 @@ Widget::Widget(QWidget *parent) :
connect(ui->settingsButton, SIGNAL(clicked()), this, SLOT(onSettingsClicked()));
connect(ui->nameLabel, SIGNAL(textChanged(QString,QString)), this, SLOT(onUsernameChanged(QString,QString)));
connect(ui->statusLabel, SIGNAL(textChanged(QString,QString)), this, SLOT(onStatusMessageChanged(QString,QString)));
connect(ui->statImg, SIGNAL(clicked()), this, SLOT(onStatusImgClicked()));
connect(&settingsForm.name, SIGNAL(textChanged(QString)), this, SLOT(onUsernameChanged(QString)));
connect(&settingsForm.statusText, SIGNAL(textChanged(QString)), this, SLOT(onStatusMessageChanged(QString)));
connect(&friendForm, SIGNAL(friendRequested(QString,QString)), this, SIGNAL(friendRequested(QString,QString)));
@ -258,7 +258,7 @@ Widget* Widget::getInstance()
//Super ugly hack to enable resizable friend widgets
//There should be a way to set them to resize automagicly, but I can't seem to find it.
void Widget::splitterMoved(int pos, int index)
void Widget::splitterMoved(int, int)
{
updateFriendListWidth();
}
@ -307,8 +307,10 @@ void Widget::onStatusSet(Status status)
{
if (status == Status::Online)
ui->statImg->setPixmap(QPixmap(":img/status/dot_online_2x.png"));
else if (status == Status::Busy || status == Status::Away)
else if (status == Status::Away)
ui->statImg->setPixmap(QPixmap(":img/status/dot_idle_2x.png"));
else if (status == Status::Busy)
ui->statImg->setPixmap(QPixmap(":img/status/dot_busy_2x.png"));
else if (status == Status::Offline)
ui->statImg->setPixmap(QPixmap(":img/status/dot_away_2x.png"));
}
@ -540,10 +542,14 @@ void Widget::updateFriendStatusLights(int friendId)
f->widget->statusPic.setPixmap(QPixmap(":img/status/dot_online.png"));
else if (status == Status::Online && f->hasNewMessages == 1)
f->widget->statusPic.setPixmap(QPixmap(":img/status/dot_online_notification.png"));
else if ((status == Status::Busy || status == Status::Away) && f->hasNewMessages == 0)
else if (status == Status::Away && f->hasNewMessages == 0)
f->widget->statusPic.setPixmap(QPixmap(":img/status/dot_idle.png"));
else if ((status == Status::Busy || status == Status::Away) && f->hasNewMessages == 1)
else if (status == Status::Away && f->hasNewMessages == 1)
f->widget->statusPic.setPixmap(QPixmap(":img/status/dot_idle_notification.png"));
else if (status == Status::Busy && f->hasNewMessages == 0)
f->widget->statusPic.setPixmap(QPixmap(":img/status/dot_busy.png"));
else if (status == Status::Busy && f->hasNewMessages == 1)
f->widget->statusPic.setPixmap(QPixmap(":img/status/dot_busy_notification.png"));
else if (status == Status::Offline && f->hasNewMessages == 0)
f->widget->statusPic.setPixmap(QPixmap(":img/status/dot_away.png"));
else if (status == Status::Offline && f->hasNewMessages == 1)
@ -587,7 +593,7 @@ void Widget::copyFriendIdToClipboard(int friendId)
}
}
void Widget::onGroupInviteReceived(int32_t friendId, uint8_t* publicKey)
void Widget::onGroupInviteReceived(int32_t friendId, const uint8_t* publicKey)
{
int groupId = core->joinGroupchat(friendId, publicKey);
if (groupId == -1)
@ -1137,3 +1143,19 @@ void Widget::minimizeBtnClicked()
}
}
void Widget::onStatusImgClicked()
{
QMenu menu;
QAction* online = menu.addAction(tr("Online","Button to set your status to 'Online'"));
QAction* away = menu.addAction(tr("Away","Button to set your status to 'Away'"));
QAction* busy = menu.addAction(tr("Busy","Button to set your status to 'Busy'"));
QPoint pos = QCursor::pos();
QAction* selectedItem = menu.exec(pos);
if (selectedItem == online)
core->setStatus(Status::Online);
else if (selectedItem == away)
core->setStatus(Status::Away);
else if (selectedItem == busy)
core->setStatus(Status::Busy);
}

View File

@ -85,13 +85,14 @@ private slots:
void onFriendMessageReceived(int friendId, const QString& message);
void onFriendRequestReceived(const QString& userId, const QString& message);
void onEmptyGroupCreated(int groupId);
void onGroupInviteReceived(int32_t friendId, uint8_t *publicKey);
void onGroupInviteReceived(int32_t friendId, const uint8_t *publicKey);
void onGroupMessageReceived(int groupnumber, int friendgroupnumber, const QString& message);
void onGroupNamelistChanged(int groupnumber, int peernumber, uint8_t change);
void onGroupWidgetClicked(GroupWidget* widget);
void removeFriend(int friendId);
void copyFriendIdToClipboard(int friendId);
void removeGroup(int groupId);
void onStatusImgClicked();
void splitterMoved(int pos, int index);
protected slots: