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

Merge branch 'master' into friend_list

Conflicts:
	src/widget/form/settings/generalform.cpp
This commit is contained in:
zero-one 2015-03-23 02:34:12 -07:00
commit de8eb5293c
172 changed files with 2638 additions and 1018 deletions

View File

@ -15,7 +15,7 @@
| OpenCV | >= 2.4.9 | core, highgui, imgproc |
| OpenAL Soft | >= 1.16.0 | |
| filter_audio | most recent | |
| qrencode | >= 3.0.3 | |
<a name="linux" />
##Linux
@ -59,22 +59,22 @@ git clone https://github.com/tux3/qTox.git qTox
The following steps assumes that you cloned the repository at "/home/user/qTox". If you decided to choose another location, replace corresponding parts.
###GCC, Qt, OpenCV and OpanAL Soft
###GCC, Qt, OpenCV, OpanAL Soft and QRCode
Arch Linux:
```bash
sudo pacman -S --needed base-devel qt5 opencv openal libxss
sudo pacman -S --needed base-devel qt5 opencv openal libxss qrencode
```
Debian / Ubuntu:
```bash
sudo apt-get install build-essential qt5-qmake qt5-default qttools5-dev-tools libqt5opengl5-dev libqt5svg5-dev libopenal-dev libopencv-dev libxss-dev
sudo apt-get install build-essential qt5-qmake qt5-default qttools5-dev-tools libqt5opengl5-dev libqt5svg5-dev libopenal-dev libopencv-dev libxss-dev qrencode libqrencode-dev
```
Fedora:
```bash
yum groupinstall "Development Tools"
yum install qt-devel qt-doc qt-creator qt5-qtsvg opencv-devel openal-soft-devel libXScrnSaver-devel
yum install qt-devel qt-doc qt-creator qt5-qtsvg opencv-devel openal-soft-devel libXScrnSaver-devel qrencode-devel
```
Slackware:
@ -87,6 +87,8 @@ http://slackbuilds.org/repository/14.1/libraries/qt5/
http://slackbuilds.org/repository/14.1/libraries/opencv/
http://slackbuilds.org/slackbuilds/14.1/graphics/qrencode/
###Tox Core
@ -94,7 +96,7 @@ First of all install the dependencies of Tox Core.
Arch Linux:
```bash
sudo pacman -S --needed opus vpx
sudo pacman -S --needed opus libvpx
```
Debian / Ubuntu:
@ -123,7 +125,7 @@ make
sudo make install
```
After all the dependencies are thus reeady to go, compiling should be as simple as
After all the dependencies are installed, compiling should be as simple as:
```bash
qmake
make
@ -219,6 +221,11 @@ Download the MinGW installer for Windows from [sourceforge.net](http://sourcefor
Make sure to install MSYS (a set of Unix tools for Windows).
The following steps assume that MinGW is installed at "C:\MinGW". If you decided to choose another location, replace corresponding parts.
###qrencode
Download the qrencode from http://fukuchi.org/works/qrencode/ or direct from https://code.google.com/p/qrencode-win32/source/checkout ,
build project "..\qrencode-win32\vc8\qrcodelib\", you must copy files from release in: "qrcodelib.dll" to \qTox\libs\bin\qrcodelib.dll";
"qrencode.h" to \qTox\libs\include\qrencode.h"; "qrcodelib.lib" to "\qTox\libs\lib\qrencode.lib" with rename!!!
###Setting up Path
Add MinGW/MSYS/CMake binaries to the system path to make them globally accessible.
@ -230,7 +237,7 @@ The very first semicolon must only be added if it is missing. CMake may be added
###Cloning the Repository
Clone the repository (https://github.com/tux3/qTox.git) with your preferred Git client. [SmartGit](http://www.syntevo.com/smartgit/) is very nice for this task.
Clone the repository (https://github.com/tux3/qTox.git) with your preferred Git client. [SmartGit](http://www.syntevo.com/smartgit/) is very nice for this task (you may need to add the path to the git.exe system variable Path).
The following steps assume that you cloned the repository at "C:\qTox". If you decided to choose another location, replace corresponding parts.
### Getting dependencies

Binary file not shown.

Before

Width:  |  Height:  |  Size: 164 B

8
img/add.svg Normal file
View File

@ -0,0 +1,8 @@
<?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>

After

Width:  |  Height:  |  Size: 665 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

123
img/avatar_mask.svg Normal file
View File

@ -0,0 +1,123 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.1"
width="244"
height="244"
id="svg2">
<defs
id="defs4">
<linearGradient
id="linearGradient3769">
<stop
id="stop3771"
style="stop-color:#ff4d4d;stop-opacity:1"
offset="0" />
<stop
id="stop3773"
style="stop-color:#ff4d4d;stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
x1="84.852814"
y1="163.69287"
x2="84.347733"
y2="208.64465"
id="linearGradient3775"
xlink:href="#linearGradient3769"
gradientUnits="userSpaceOnUse" />
<filter
color-interpolation-filters="sRGB"
id="filter3851">
<feGaussianBlur
id="feGaussianBlur3853"
result="result6"
stdDeviation="3"
in="SourceGraphic" />
<feColorMatrix
id="feColorMatrix3855"
values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 "
result="result7"
in="SourceGraphic" />
<feComposite
in2="result7"
operator="in"
in="result6"
result="fbSourceGraphic"
id="feComposite3857" />
<feColorMatrix
result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
id="feColorMatrix3859" />
<feGaussianBlur
id="feGaussianBlur3861"
result="result6"
stdDeviation="3"
in="fbSourceGraphic" />
<feColorMatrix
id="feColorMatrix3863"
values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 "
result="result7"
in="fbSourceGraphic" />
<feComposite
in2="result7"
operator="in"
in="result6"
result="fbSourceGraphic"
id="feComposite3865" />
<feColorMatrix
result="fbSourceGraphicAlpha"
in="fbSourceGraphic"
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
id="feColorMatrix3867" />
<feGaussianBlur
id="feGaussianBlur3869"
result="result6"
stdDeviation="3"
in="fbSourceGraphic" />
<feColorMatrix
id="feColorMatrix3871"
values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 "
result="result7"
in="fbSourceGraphic" />
<feComposite
in2="result7"
operator="in"
in="result6"
id="feComposite3873" />
</filter>
</defs>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
transform="matrix(0.97644164,0,0,0.97644164,4.1582729,-786.52368)"
id="layer1">
<rect
width="230.81985"
height="230.81985"
ry="32.879269"
x="2.6929855"
y="808.15778"
transform="matrix(1.0255288,0,0,1.0437637,0.52050693,-34.357803)"
id="rect2985-3"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3851)" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

10
img/contact.svg Normal file
View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.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"
viewBox="0 0 40 40" enable-background="new 0 0 40 40" xml:space="preserve">
<g>
<path fill="#FFFFFF" d="M25.8,24.5C42,30.3,36.8,40,36.8,40H2.6c0,0-2.7-10.9,11.9-15.5C14.5,24.5,20.3,29.4,25.8,24.5z"/>
<path fill="#FFFFFF" d="M10.3,10.1c0,0,0.9,13.5,9.6,13.5c8.7,0,9.7-12.6,9.7-12.6S30,0,19.9,0C9.9,0,10.3,10.1,10.3,10.1z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 698 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

10
img/contact_dark.svg Normal file
View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.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"
viewBox="0 0 40 40" enable-background="new 0 0 40 40" xml:space="preserve">
<g>
<path fill="#414141" d="M25.8,24.5C42,30.3,36.8,40,36.8,40H2.6c0,0-2.7-10.9,11.9-15.5C14.5,24.5,20.3,29.4,25.8,24.5z"/>
<path fill="#414141" d="M10.3,10.1c0,0,0.9,13.5,9.6,13.5c8.7,0,9.7-12.6,9.7-12.6S30,0,19.9,0C9.9,0,10.3,10.1,10.3,10.1z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 698 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

20
img/group.svg Normal file
View File

@ -0,0 +1,20 @@
<?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>

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 512 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 454 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

20
img/group_dark.svg Normal file
View File

@ -0,0 +1,20 @@
<?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="#414141" 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="#414141" 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="#414141" 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="#414141" 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="#414141" 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="#414141" 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>

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 291 B

19
img/settings.svg Normal file
View File

@ -0,0 +1,19 @@
<?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>

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 280 B

12
img/status/dot_away.svg Normal file
View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.1.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"
viewBox="0 0 10 10" enable-background="new 0 0 10 10" xml:space="preserve">
<g>
<g>
<path fill="#CDBE41" d="M5,1.5c1.9,0,3.5,1.6,3.5,3.5h-7C1.5,3.1,3.1,1.5,5,1.5 M5,0C2.2,0,0,2.2,0,5s2.2,5,5,5c2.8,0,5-2.2,5-5
S7.8,0,5,0z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 609 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 375 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 448 B

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.1.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"
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
<g>
<g>
<path fill="#CDBE41" d="M8,4.5c1.9,0,3.5,1.6,3.5,3.5h-7C4.5,6.1,6.1,4.5,8,4.5 M8,3C5.2,3,3,5.2,3,8s2.2,5,5,5c2.8,0,5-2.2,5-5
S10.8,3,8,3z"/>
</g>
</g>
<g>
<path fill="#CDBE41" d="M8,1.5c3.6,0,6.5,2.9,6.5,6.5s-2.9,6.5-6.5,6.5S1.5,11.6,1.5,8S4.4,1.5,8,1.5 M8,0C3.6,0,0,3.6,0,8
s3.6,8,8,8s8-3.6,8-8S12.4,0,8,0z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 778 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 292 B

8
img/status/dot_busy.svg Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.1.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"
viewBox="0 0 10 10" enable-background="new 0 0 10 10" xml:space="preserve">
<path fill="#C94F50" d="M8.5,1.5c-2-2-5.1-2-7.1,0s-2,5.1,0,7.1s5.1,2,7.1,0S10.5,3.4,8.5,1.5z M2.5,2.5c1.2-1.2,3-1.3,4.4-0.5
L2.1,6.9C1.2,5.5,1.3,3.7,2.5,2.5z M3.1,7.9l4.8-4.8c0.9,1.4,0.7,3.2-0.5,4.4S4.5,8.8,3.1,7.9z"/>
</svg>

After

Width:  |  Height:  |  Size: 664 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 363 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 446 B

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.1.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"
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
<path fill="#C94F50" d="M11.5,4.5c-2-2-5.1-2-7.1,0s-2,5.1,0,7.1s5.1,2,7.1,0S13.5,6.4,11.5,4.5z M5.5,5.5c1.2-1.2,3-1.3,4.4-0.5
L5.1,9.9C4.2,8.5,4.3,6.7,5.5,5.5z M6.1,10.9l4.8-4.8c0.9,1.4,0.7,3.2-0.5,4.4S7.5,11.8,6.1,10.9z"/>
<g>
<path fill="#C94F50" d="M8,1.5c3.6,0,6.5,2.9,6.5,6.5s-2.9,6.5-6.5,6.5S1.5,11.6,1.5,8S4.4,1.5,8,1.5 M8,0C3.6,0,0,3.6,0,8
s3.6,8,8,8s8-3.6,8-8S12.4,0,8,0z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 837 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 362 B

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.1.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"
viewBox="0 0 10 10" enable-background="new 0 0 10 10" xml:space="preserve">
<circle fill="#82d5d5" cx="5" cy="5" r="5"/>
</svg>

After

Width:  |  Height:  |  Size: 489 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 808 B

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.1.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"
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
<circle fill="#82d5d5" cx="8" cy="8" r="5"/>
<g>
<path fill="#82d5d5" d="M8,1.5c3.6,0,6.5,2.9,6.5,6.5s-2.9,6.5-6.5,6.5S1.5,11.6,1.5,8S4.4,1.5,8,1.5 M8,0C3.6,0,0,3.6,0,8
s3.6,8,8,8s8-3.6,8-8S12.4,0,8,0z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 657 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 829 B

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.1.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"
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
<circle fill="#82d5d5" cx="8" cy="8" r="5"/>
<g>
<path fill="#e0dda3" d="M8,1.5c3.6,0,6.5,2.9,6.5,6.5s-2.9,6.5-6.5,6.5S1.5,11.6,1.5,8S4.4,1.5,8,1.5 M8,0C3.6,0,0,3.6,0,8
s3.6,8,8,8s8-3.6,8-8S12.4,0,8,0z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 657 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 287 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 351 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 447 B

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.1.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"
viewBox="0 0 10 10" enable-background="new 0 0 10 10" xml:space="preserve">
<path fill="#FFFFFF" d="M5,0C2.2,0,0,2.2,0,5c0,2.8,2.2,5,5,5s5-2.2,5-5S7.8,0,5,0z M1.5,5c0-1.7,1.2-3.1,2.8-3.4v6.8
C2.7,8.1,1.5,6.7,1.5,5z M5.7,8.4V1.6C7.3,1.9,8.5,3.3,8.5,5S7.3,8.1,5.7,8.4z"/>
</svg>

After

Width:  |  Height:  |  Size: 639 B

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.1.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"
viewBox="0 0 10 10" enable-background="new 0 0 10 10" xml:space="preserve">
<g>
<path fill="#C94F50" d="M5,1.5c1.9,0,3.5,1.6,3.5,3.5S6.9,8.5,5,8.5C3.1,8.5,1.5,6.9,1.5,5S3.1,1.5,5,1.5 M5,0C2.2,0,0,2.2,0,5
s2.2,5,5,5c2.8,0,5-2.2,5-5S7.8,0,5,0z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 621 B

View File

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.1.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"
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
<g>
<path fill="#C94F50" d="M8,4.5c1.9,0,3.5,1.6,3.5,3.5S9.9,11.5,8,11.5c-1.9,0-3.5-1.6-3.5-3.5S6.1,4.5,8,4.5 M8,3C5.2,3,3,5.2,3,8
s2.2,5,5,5c2.8,0,5-2.2,5-5S10.8,3,8,3z"/>
</g>
<g>
<path fill="#C94F50" d="M8,1.5c3.6,0,6.5,2.9,6.5,6.5s-2.9,6.5-6.5,6.5S1.5,11.6,1.5,8S4.4,1.5,8,1.5 M8,0C3.6,0,0,3.6,0,8
s3.6,8,8,8s8-3.6,8-8S12.4,0,8,0z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 793 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 252 B

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.1.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"
viewBox="0 0 10 10" enable-background="new 0 0 10 10" xml:space="preserve">
<circle fill="#6FC062" cx="5" cy="5" r="5"/>
</svg>

After

Width:  |  Height:  |  Size: 489 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 278 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 412 B

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.1.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"
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
<circle fill="#6FC062" cx="8" cy="8" r="5"/>
<g>
<path fill="#6FC062" d="M8,1.5c3.6,0,6.5,2.9,6.5,6.5s-2.9,6.5-6.5,6.5S1.5,11.6,1.5,8S4.4,1.5,8,1.5 M8,0C3.6,0,0,3.6,0,8
s3.6,8,8,8s8-3.6,8-8S12.4,0,8,0z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 657 B

View File

@ -1,22 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.1.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"
viewBox="0 0 16.1 16" enable-background="new 0 0 16.1 16" xml:space="preserve">
<path fill="#252325" d="M8,0C6.1,0,4.2,1.3,4.2,3.9v1.9h-1c-1.1,0-1.8,0.8-1.8,1.9v6.5c0,1.1,0.7,1.9,1.9,1.9l9.6,0
c1.1,0,1.9-0.8,1.9-1.9V7.6c0-1.1-0.8-1.9-1.9-1.9h-0.9l0-1.9C11.9,1.3,10,0,8,0z M8,1.6c1.3,0,2.2,1,2.2,2.2C10.3,5,9.8,6.2,8,6.9
c0.3-0.5,0.4-0.7,0.5-1.2C6.7,5.9,5.8,4.9,5.8,3.8S6.7,1.6,8,1.6z"/>
<g>
<path fill="#C94F50" d="M8,7.7c-1.8,0-3.3,1.5-3.3,3.3c0,1.8,1.5,3.3,3.3,3.3c1.8,0,3.3-1.5,3.3-3.3C11.3,9.2,9.8,7.7,8,7.7z
M8,13.4c-1.3,0-2.4-1.1-2.4-2.4c0-0.7,0.3-1.3,0.7-1.7c0,0,0,0,0,0c0,0,0,0,0.1-0.1c0,0,0,0,0,0c0,0,0,0,0.1-0.1c0,0,0,0,0,0
C6.6,9.1,6.7,9,6.8,8.9c0,0,0,0,0,0c0,0,0,0,0.1,0c0,0,0,0,0,0c0,0,0,0,0.1,0c0,0,0,0,0,0c0,0,0,0,0.1,0c0,0,0,0,0,0c0,0,0,0,0.1,0
c0,0,0,0,0.1,0c0,0,0,0,0.1,0c0,0,0.1,0,0.1,0c0,0,0,0,0,0c0,0,0,0,0.1,0c0,0,0,0,0,0c0,0,0,0,0.1,0c0,0,0,0,0,0c0,0,0,0,0.1,0
c0,0,0,0,0,0c0,0,0.1,0,0.1,0c0,0,0,0,0,0c0,0,0.1,0,0.1,0c0,0,0,0,0,0l0,0l0,0c0,0,0.1,0,0.1,0c0,0,0,0,0,0c0,0,0.1,0,0.1,0
c0,0,0,0,0,0c0,0,0,0,0.1,0c0,0,0,0,0,0c0,0,0,0,0.1,0c0,0,0,0,0,0c0,0,0.1,0,0.1,0c0,0,0,0,0,0c0,0,0.1,0,0.1,0c0,0,0,0,0,0
c0,0,0.1,0,0.1,0c0,0,0,0,0,0c0,0,0,0,0.1,0c0,0,0,0,0,0c0,0,0,0,0.1,0c0,0,0,0,0,0c0,0,0,0,0.1,0c0,0,0,0,0,0c0,0,0,0,0.1,0
c0,0,0,0,0,0c0,0,0.1,0,0.1,0.1c0,0,0,0,0,0c0,0,0,0,0.1,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0.1,0.1,0.1,0.1c0,0,0,0,0,0c0,0,0,0,0,0.1c0,0,0,0,0,0
c0,0,0,0,0,0.1c0,0,0,0,0,0c0,0,0,0,0,0.1c0,0,0,0,0,0c0,0,0,0,0,0.1c0,0,0,0,0,0c0,0.1,0.1,0.2,0.1,0.2c0,0,0,0,0,0c0,0,0,0,0,0.1
c0,0,0,0,0,0c0,0,0,0,0,0.1c0,0,0,0,0,0c0,0,0,0,0,0.1c0,0,0,0,0,0l0,0c0,0.2,0.1,0.4,0.1,0.6C10.4,12.3,9.3,13.4,8,13.4z"/>
</g>
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
width="100%"
height="100%"
viewBox="0 0 16.1 16"
id="Layer_1"
xml:space="preserve"><metadata
id="metadata13"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs11" /><path
d="M 8,0 C 6.1,0 4.2,1.3 4.2,3.9 v 1.9 h -1 C 2.1,5.8 1.4,6.6 1.4,7.7 v 6.5 c 0,1.1 0.7,1.9 1.9,1.9 l 9.6,0 c 1.1,0 1.9,-0.8 1.9,-1.9 V 7.6 C 14.8,6.5 14,5.7 12.9,5.7 H 12 L 12,3.8 C 11.9,1.3 10,0 8,0 z m 0,1.6 c 1.3,0 2.2,1 2.2,2.2 C 10.3,5 9.8,6.2 8,6.9 8.3,6.4 8.4,6.2 8.5,5.7 6.7,5.9 5.8,4.9 5.8,3.8 5.8,2.7 6.7,1.6 8,1.6 z"
id="path3"
style="fill:#252325" /><g
transform="translate(19.990072,1.0868021)"
id="g3027"><path
d="m -11.983551,6.6340045 c -1.815987,0 -3.28125,1.4652629 -3.28125,3.28125 0,1.8159875 1.465263,3.2812505 3.28125,3.2812505 1.815987,0 3.3124995,-1.465263 3.3124995,-3.2812505 0,-1.8159871 -1.4965125,-3.28125 -3.3124995,-3.28125 z m 0,0.90625 c 1.319867,0 2.4062495,1.0551331 2.4062495,2.375 0,1.3198675 -1.0863825,2.3750005 -2.4062495,2.3750005 -1.319867,0 -2.375,-1.055133 -2.375,-2.3750005 0,-1.3198669 1.055133,-2.375 2.375,-2.375 z"
id="path3000"
style="fill:#c94f50;fill-opacity:1" /></g></svg>

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 288 B

18
img/transfer.svg Normal file
View File

@ -0,0 +1,18 @@
<?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>

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -134,7 +134,7 @@ win32 {
LIBS += -L$$PWD/libs/lib -ltoxav -ltoxcore -ltoxencryptsave -ltoxdns -lsodium -lvpx -lpthread
LIBS += -L$$PWD/libs/lib -lopencv_core249 -lopencv_highgui249 -lopencv_imgproc249 -lOpenAL32 -lopus
LIBS += -lopengl32 -lole32 -loleaut32 -luuid -lvfw32 -lws2_32 -liphlpapi -lz
LIBS += -lqrencode
contains(DEFINES, QTOX_FILTER_AUDIO) {
contains(STATICPKG, YES) {
LIBS += -Wl,-Bstatic -lfilteraudio
@ -149,6 +149,7 @@ win32 {
QMAKE_INFO_PLIST = osx/info.plist
QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.7
LIBS += -L$$PWD/libs/lib/ -ltoxcore -ltoxav -ltoxencryptsave -ltoxdns -lsodium -lvpx -lopus -framework OpenAL -lopencv_core -lopencv_highgui -mmacosx-version-min=10.7
LIBS += -lqrencode
contains(DEFINES, QTOX_PLATFORM_EXT) { LIBS += -framework IOKit -framework CoreFoundation }
contains(DEFINES, QTOX_FILTER_AUDIO) { LIBS += -lfilteraudio }
} else {
@ -165,8 +166,10 @@ win32 {
LIBS += -L$$PWD/libs/lib/ -lopus -lvpx -lopenal -Wl,-Bstatic -ltoxcore -ltoxav -ltoxencryptsave -ltoxdns -lsodium -lopencv_highgui -lopencv_imgproc -lopencv_core -lz -Wl,-Bdynamic
LIBS += -Wl,-Bstatic -ljpeg -ltiff -lpng -ljasper -lIlmImf -lIlmThread -lIex -ldc1394 -lraw1394 -lHalf -lz -llzma -ljbig
LIBS += -Wl,-Bdynamic -lv4l1 -lv4l2 -lavformat -lavcodec -lavutil -lswscale -lusb-1.0
LIBS += -lqrencode
} else {
LIBS += -L$$PWD/libs/lib/ -ltoxcore -ltoxav -ltoxencryptsave -ltoxdns -lvpx -lsodium -lopenal -lopencv_core -lopencv_highgui -lopencv_imgproc
LIBS += -lqrencode
}
contains(DEFINES, QTOX_PLATFORM_EXT) {
@ -182,7 +185,7 @@ win32 {
}
contains(JENKINS, YES) {
LIBS = ./libs/lib/libtoxav.a ./libs/lib/libvpx.a ./libs/lib/libopus.a ./libs/lib/libtoxdns.a ./libs/lib/libtoxencryptsave.a ./libs/lib/libtoxcore.a ./libs/lib/libopenal.a ./libs/lib/libsodium.a ./libs/lib/libfilteraudio.a /usr/lib/libopencv_core.so /usr/lib/libopencv_highgui.so /usr/lib/libopencv_imgproc.so -lX11 -lXss
LIBS = ./libs/lib/libtoxav.a ./libs/lib/libvpx.a ./libs/lib/libopus.a ./libs/lib/libtoxdns.a ./libs/lib/libtoxencryptsave.a ./libs/lib/libtoxcore.a ./libs/lib/libopenal.a ./libs/lib/libsodium.a ./libs/lib/libfilteraudio.a /usr/lib/libopencv_core.so /usr/lib/libopencv_highgui.so /usr/lib/libopencv_imgproc.so -lX11 -lXss -lqrencode
contains(ENABLE_SYSTRAY_UNITY_BACKEND, YES) {
LIBS += -lgobject-2.0 -lappindicator -lgtk-x11-2.0
}
@ -424,7 +427,8 @@ SOURCES += \
src/video/netvideosource.cpp \
src/video/videoframe.cpp \
src/widget/gui.cpp \
src/toxme.cpp
src/toxme.cpp \
src/misc/qrwidget.cpp
HEADERS += \
src/audio.h \
@ -445,4 +449,5 @@ HEADERS += \
src/video/videoframe.h \
src/video/videosource.h \
src/widget/gui.h \
src/toxme.h
src/toxme.h \
src/misc/qrwidget.h

118
res.qrc
View File

@ -8,35 +8,29 @@
<qresource prefix="/">
<file>audio/notification.pcm</file>
<file>audio/ToxicIncomingCall.pcm</file>
<file>img/add.png</file>
<file>img/avatar_mask.png</file>
<file>img/contact.png</file>
<file>img/contact_dark.png</file>
<file>img/group.png</file>
<file>img/group_2x.png</file>
<file>img/group_button.png</file>
<file>img/group_dark.png</file>
<file>img/icon.png</file>
<file>img/settings.png</file>
<file>img/add.svg</file>
<file>img/avatar_mask.svg</file>
<file>img/contact.svg</file>
<file>img/contact_dark.svg</file>
<file>img/group.svg</file>
<file>img/group_dark.svg</file>
<file>img/icons/qtox.svg</file>
<file>img/settings.svg</file>
<file>img/settings/av.png</file>
<file>img/settings/general.png</file>
<file>img/settings/identity.png</file>
<file>img/settings/privacy.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_busy.png</file>
<file>img/status/dot_busy_2x.png</file>
<file>img/status/dot_busy_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/status/dot_away.svg</file>
<file>img/status/dot_away_notification.svg</file>
<file>img/status/dot_busy.svg</file>
<file>img/status/dot_busy_notification.svg</file>
<file>img/status/dot_groupchat.svg</file>
<file>img/status/dot_groupchat_newmessages.svg</file>
<file>img/status/dot_groupchat_notification.svg</file>
<file>img/status/dot_offline.svg</file>
<file>img/status/dot_offline_notification.svg</file>
<file>img/status/dot_online.svg</file>
<file>img/status/dot_online_notification.svg</file>
<file>img/taskbar/dark/taskbar_online.svg</file>
<file>img/taskbar/dark/taskbar_away.svg</file>
<file>img/taskbar/dark/taskbar_busy.svg</file>
@ -47,7 +41,7 @@
<file>img/taskbar/light/taskbar_busy.svg</file>
<file>img/taskbar/light/taskbar_offline.svg</file>
<file>img/taskbar/light/taskbar_event.svg</file>
<file>img/transfer.png</file>
<file>img/transfer.svg</file>
<file>translations/bg.qm</file>
<file>translations/de.qm</file>
<file>translations/es.qm</file>
@ -67,45 +61,25 @@
<file>translations/sv.qm</file>
<file>translations/uk.qm</file>
<file>translations/zh.qm</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/fileTransferWidget/fileDone.svg</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/callButton/callButton.svg</file>
<file>ui/chatArea/chatArea.css</file>
<file>ui/chatArea/chatHead.css</file>
<file>ui/chatArea/innerStyle.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/chatArea/scrollBarUpArrow.svg</file>
<file>ui/chatArea/scrollBarDownArrow.svg</file>
<file>ui/chatArea/scrollBarLeftArrow.svg</file>
<file>ui/chatArea/scrollBarRightArrow.svg</file>
<file>ui/chatroomWidgets/genericChatroomWidget.css</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/emoticonWidget/dot_page.png</file>
<file>ui/emoticonWidget/dot_page_current.png</file>
<file>ui/emoticonWidget/dot_page_hover.png</file>
<file>ui/emoteButton/emoteButton.svg</file>
<file>ui/emoticonWidget/dot_page.svg</file>
<file>ui/emoticonWidget/dot_page_current.svg</file>
<file>ui/emoticonWidget/dot_page_hover.svg</file>
<file>ui/emoticonWidget/emoticonWidget.css</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/fileButton/fileButtonDisabled.png</file>
<file>ui/fileButton/fileButton.svg</file>
<file>ui/fileTransferWidget/fileTransferWidget.css</file>
<file>ui/friendList/friendList.css</file>
<file>ui/micButton/micButton.css</file>
@ -114,38 +88,18 @@
<file>ui/micButton/micButtonHover.png</file>
<file>ui/micButton/micButtonPressed.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/sendButton/sendButton.svg</file>
<file>ui/settings/mainContent.css</file>
<file>ui/settings/mainHead.css</file>
<file>ui/statusButton/menu_indicator.png</file>
<file>ui/statusButton/statusButton.css</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/statusButton/menu_indicator.svg</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>ui/videoButton/videoButton.svg</file>
<file>ui/volButton/volButton.png</file>
<file>ui/volButton/volButtonHover.png</file>
<file>ui/volButton/volButtonPressed.png</file>
<file>ui/volButton/volButton.css</file>
<file>ui/window/applicationIcon.png</file>
<file>ui/window/statusPanel.css</file>
<file>ui/window/window.css</file>
<file>ui/chatArea/info.svg</file>
@ -159,8 +113,8 @@
<file>ui/fileTransferInstance/arrow_white.svg</file>
<file>ui/fileTransferInstance/browse.svg</file>
<file>ui/fileTransferInstance/filetransferWidget.css</file>
<file>ui/acceptCall/acceptCall.png</file>
<file>ui/rejectCall/rejectCall.png</file>
<file>ui/acceptCall/acceptCall.svg</file>
<file>ui/rejectCall/rejectCall.svg</file>
<file>ui/volButton/volButtonDisabled.png</file>
</qresource>
</RCC>

View File

@ -2,12 +2,12 @@
if which apt-get; then
sudo apt-get install build-essential qt5-qmake qt5-default libopenal-dev libopencv-dev \
libtool autotools-dev automake checkinstall check libopus-dev libvpx-dev qttools5-dev-tools qtchooser libxss-dev libqt5svg5*
libtool autotools-dev automake checkinstall check libopus-dev libvpx-dev qttools5-dev-tools qtchooser libxss-dev libqt5svg5* libqrencode-dev
elif which pacman; then
sudo pacman -S --needed base-devel qt5 opencv openal opus libvpx libxss qt5-svg
sudo pacman -S --needed base-devel qt5 opencv openal opus libvpx libxss qt5-svg qrencode
elif which yum; then
sudo yum groupinstall "Development Tools"
sudo yum install qt-devel qt-doc qt-creator opencv-devel openal-soft-devel libtool autoconf automake check check-devel libXScrnSaver-devel qt5-qtsvg
sudo yum install qt-devel qt-doc qt-creator opencv-devel openal-soft-devel libtool autoconf automake check check-devel libXScrnSaver-devel qt5-qtsvg qrencode
else
echo "Unknown package manager, attempting to compile anyways"
fi

View File

@ -456,11 +456,22 @@ void ChatLog::startResizeWorker()
workerAnchorLine = visibleLines.first();
}
// switch to busy scene displaying the busy notification if there is a lot
// of text to be resized
int txt = 0;
for (ChatLine::Ptr line : lines)
{
if (txt > 500000)
break;
for (ChatLineContent* content : line->content)
txt += content->getText().size();
}
if (txt > 500000)
setScene(busyScene);
workerLastIndex = 0;
workerTimer->start();
// switch to busy scene displaying the busy notification
setScene(busyScene);
verticalScrollBar()->hide();
}

View File

@ -123,7 +123,7 @@ ChatMessage::Ptr ChatMessage::createBusyNotification()
ChatMessage::Ptr msg = ChatMessage::Ptr(new ChatMessage);
// TODO: Bigger font
msg->addColumn(new Text(QObject::tr("Busy..."), Style::getFont(Style::ExtraBig), false, ""), ColumnFormat(1.0, ColumnFormat::VariableSize, ColumnFormat::Center));
msg->addColumn(new Text(QObject::tr("Resizing"), Style::getFont(Style::ExtraBig), false, ""), ColumnFormat(1.0, ColumnFormat::VariableSize, ColumnFormat::Center));
return msg;
}

View File

@ -17,6 +17,7 @@
#include "filetransferwidget.h"
#include "ui_filetransferwidget.h"
#include "src/nexus.h"
#include "src/core.h"
#include "src/misc/style.h"
#include "src/widget/widget.h"
@ -113,7 +114,7 @@ void FileTransferWidget::autoAcceptTransfer(const QString &path)
//Do not automatically accept the file-transfer if the path is not writable.
//The user can still accept it manually.
if(isFilePathWritable(filepath))
if (Nexus::isFilePathWritable(filepath))
Core::getInstance()->acceptFileRecvRequest(fileInfo.friendId, fileInfo.fileNum, filepath);
else
qDebug() << "Warning: Cannot write to " << filepath;
@ -125,7 +126,7 @@ void FileTransferWidget::acceptTransfer(const QString &filepath)
return;
//test if writable
if(!isFilePathWritable(filepath))
if(!Nexus::isFilePathWritable(filepath))
{
QMessageBox::warning(0,
tr("Location not writable","Title of permissions popup"),
@ -164,14 +165,6 @@ void FileTransferWidget::setButtonColor(const QColor &c)
}
}
bool FileTransferWidget::isFilePathWritable(const QString &filepath) const
{
QFile tmp(filepath);
bool writable = tmp.open(QIODevice::WriteOnly);
tmp.remove();
return writable;
}
bool FileTransferWidget::drawButtonAreaNeeded() const
{
return (ui->bottomButton->isVisible() || ui->topButton->isVisible()) &&

View File

@ -57,7 +57,6 @@ protected:
void setBackgroundColor(const QColor& c, bool whiteFont);
void setButtonColor(const QColor& c);
bool isFilePathWritable(const QString& filepath) const;
bool drawButtonAreaNeeded() const;
virtual void paintEvent(QPaintEvent*);

View File

@ -257,6 +257,9 @@ void Core::start()
}
else // new ID
{
QString id = getSelfId().toString();
if (!id.isEmpty())
emit idSet(id);
setStatusMessage(tr("Toxing on qTox")); // this also solves the not updating issue
setUsername(tr("qTox User"));
}
@ -1307,7 +1310,7 @@ void Core::switchConfiguration(const QString& profile)
toxTimer->stop();
deadifyTox();
emit selfAvatarChanged(QPixmap(":/img/contact_dark.png"));
emit selfAvatarChanged(QPixmap(":/img/contact_dark.svg"));
emit blockingClearContacts(); // we need this to block, but signals are required for thread safety
if (profile.isEmpty())

View File

@ -150,7 +150,7 @@ void IPC::registerEventHandler(const QString &name, IPCEventHandler handler)
eventHandlers[name] = handler;
}
bool IPC::isEventProcessed(time_t time)
bool IPC::isEventAccepted(time_t time)
{
bool result = false;
if (globalMemory.lock())
@ -161,32 +161,6 @@ bool IPC::isEventProcessed(time_t time)
for (uint32_t i = 0; i < EVENT_QUEUE_SIZE; i++)
{
if (mem->events[i].posted == time && mem->events[i].processed)
{
result = true;
break;
}
}
}
globalMemory.unlock();
}
else
{
qWarning() << "IPC: isEventProcessed failed to lock, returning false";
}
return result;
}
bool IPC::isEventAccepted(time_t time)
{
bool result = false;
if (globalMemory.lock())
{
// if (difftime(global()->lastProcessed, time) > 0)
{
IPCMemory* mem = global();
for (uint32_t i = 0; i < EVENT_QUEUE_SIZE; i++)
{
if (mem->events[i].posted == time)
{
result = mem->events[i].accepted;
break;
@ -202,11 +176,11 @@ bool IPC::isEventAccepted(time_t time)
return result;
}
bool IPC::waitUntilProcessed(time_t postTime, int32_t timeout/*=-1*/)
bool IPC::waitUntilAccepted(time_t postTime, int32_t timeout/*=-1*/)
{
bool result = false;
time_t start = time(0);
while (!(result = isEventProcessed(postTime)))
while (!(result = isEventAccepted(postTime)))
{
qApp->processEvents();
if (timeout > 0 && difftime(time(0), start) >= timeout)
@ -232,10 +206,7 @@ IPC::IPCEvent *IPC::fetchEvent()
if (evt->posted && !evt->processed && evt->sender != getpid())
{
if (evt->dest == Settings::getInstance().getCurrentProfileId() || (evt->dest == 0 && isCurrentOwner()))
{
evt->processed = time(0);
return evt;
}
}
}
return 0;
@ -291,9 +262,19 @@ void IPC::processEvents()
auto it = eventHandlers.find(name);
if (it != eventHandlers.end())
{
evt->accepted = runEventHandler(it.value(), evt->data);
qDebug() << "IPC: Processing event: " << name << ":" << evt->posted << "=" << evt->accepted;
evt->accepted = runEventHandler(it.value(), evt->data);
if (evt->dest == 0)
{
// Global events should be processed only by instance that accepted event. Otherwise global
// event would be consumed by very first instance that gets to check it.
if (evt->accepted)
evt->processed = time(0);
}
else
evt->processed = time(0);
}
}
globalMemory.unlock();

View File

@ -73,9 +73,8 @@ public:
time_t postEvent(const QString& name, const QByteArray &data=QByteArray(), uint32_t dest=0);
bool isCurrentOwner();
void registerEventHandler(const QString& name, IPCEventHandler handler);
bool isEventProcessed(time_t time);
bool isEventAccepted(time_t time);
bool waitUntilProcessed(time_t time, int32_t timeout=-1);
bool waitUntilAccepted(time_t time, int32_t timeout=-1);
protected slots:
void processEvents();

View File

@ -227,7 +227,7 @@ int main(int argc, char *argv[])
else
{
time_t event = ipc.postEvent("uri", firstParam.toUtf8());
ipc.waitUntilProcessed(event);
ipc.waitUntilAccepted(event);
// If someone else processed it, we're done here, no need to actually start qTox
if (!ipc.isCurrentOwner())
return EXIT_SUCCESS;
@ -242,7 +242,7 @@ int main(int argc, char *argv[])
else
{
time_t event = ipc.postEvent("save", firstParam.toUtf8());
ipc.waitUntilProcessed(event);
ipc.waitUntilAccepted(event);
// If someone else processed it, we're done here, no need to actually start qTox
if (!ipc.isCurrentOwner())
return EXIT_SUCCESS;
@ -260,7 +260,7 @@ int main(int argc, char *argv[])
if (parser.isSet("p"))
dest = Settings::getInstance().getCurrentProfileId();
time_t event = ipc.postEvent("activate", QByteArray(), dest);
if (ipc.waitUntilProcessed(event, 2) && ipc.isEventAccepted(event))
if (ipc.waitUntilAccepted(event, 2))
{
if (!ipc.isCurrentOwner())
return EXIT_SUCCESS;

View File

@ -21,7 +21,7 @@
</property>
<property name="windowIcon">
<iconset resource="../res.qrc">
<normaloff>:/img/icon.png</normaloff>:/img/icon.png</iconset>
<normaloff>:/img/icons/qtox.svg</normaloff>:/img/icons/qtox.svg</iconset>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QVBoxLayout" name="verticalLayout_4">
@ -983,10 +983,6 @@ QSplitter:handle{
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="../res.qrc">
<normaloff>:/img/status/dot_away_2x.png</normaloff>:/img/status/dot_away_2x.png</iconset>
</property>
<property name="iconSize">
<size>
<width>10</width>
@ -1109,7 +1105,13 @@ QSplitter:handle{
</property>
<property name="icon">
<iconset resource="../res.qrc">
<normaloff>:/img/add.png</normaloff>:/img/add.png</iconset>
<normaloff>:/img/add.svg</normaloff>:/img/add.svg</iconset>
</property>
<property name="iconSize">
<size>
<width>15</width>
<height>15</height>
</size>
</property>
<property name="checkable">
<bool>false</bool>
@ -1144,7 +1146,13 @@ QSplitter:handle{
</property>
<property name="icon">
<iconset resource="../res.qrc">
<normaloff>:/img/group_button.png</normaloff>:/img/group_button.png</iconset>
<normaloff>:/img/group.svg</normaloff>:/img/group.svg</iconset>
</property>
<property name="iconSize">
<size>
<width>15</width>
<height>15</height>
</size>
</property>
<property name="flat">
<bool>true</bool>
@ -1176,7 +1184,13 @@ QSplitter:handle{
</property>
<property name="icon">
<iconset resource="../res.qrc">
<normaloff>:/img/transfer.png</normaloff>:/img/transfer.png</iconset>
<normaloff>:/img/transfer.svg</normaloff>:/img/transfer.svg</iconset>
</property>
<property name="iconSize">
<size>
<width>15</width>
<height>15</height>
</size>
</property>
<property name="flat">
<bool>true</bool>
@ -1208,7 +1222,13 @@ QSplitter:handle{
</property>
<property name="icon">
<iconset resource="../res.qrc">
<normaloff>:/img/settings.png</normaloff>:/img/settings.png</iconset>
<normaloff>:/img/settings.svg</normaloff>:/img/settings.svg</iconset>
</property>
<property name="iconSize">
<size>
<width>15</width>
<height>15</height>
</size>
</property>
<property name="flat">
<bool>true</bool>

97
src/misc/qrwidget.cpp Normal file
View File

@ -0,0 +1,97 @@
#include "qrwidget.h"
#include <QPainter>
#include <QDebug>
#include <QBuffer>
#include <QImage>
#include <qrencode.h>
#ifdef Q_OS_WIN32
#include <errno.h>
#else
#include <sys/errno.h>
#endif
QRWidget::QRWidget(QWidget *parent) : QWidget(parent), data("0")
//Note: The encoding fails with empty string so I just default to something else.
//Use the setQRData() call to change this.
{
//size of the qimage might be problematic in the future, but it works for me
size.setWidth(480);
size.setHeight(480);
image = new QImage(size, QImage::Format_RGB32);
}
void QRWidget::setQRData(const QString& data)
{
this->data = data;
paintImage();
}
QImage* QRWidget::getImage()
{
return image;
}
/**
* @brief QRWidget::saveImage
* @param path Full path to the file with extension.
* @return indicate if saving was successful.
*/
bool QRWidget::saveImage(QString path)
{
return image->save(path, 0, 75); //0 - image format same as file extension, 75-quality, png file is ~6.3kb
}
//http://stackoverflow.com/questions/21400254/how-to-draw-a-qr-code-with-qt-in-native-c-c
void QRWidget::paintImage()
{
QPainter painter(image);
//NOTE: I have hardcoded some parameters here that would make more sense as variables.
// ECLEVEL_M is much faster recognizable by barcodescanner any any other type
// https://fukuchi.org/works/qrencode/manual/qrencode_8h.html#a4cebc3c670efe1b8866b14c42737fc8f
// any mode other than QR_MODE_8 or QR_MODE_KANJI results in EINVAL. First 1 is version, second is case sensitivity
QRcode* qr = QRcode_encodeString(data.toStdString().c_str(), 1, QR_ECLEVEL_M, QR_MODE_8, 1);
if (qr != nullptr)
{
QColor fg("black");
QColor bg("white");
painter.setBrush(bg);
painter.setPen(Qt::NoPen);
painter.drawRect(0, 0, size.width(), size.height());
painter.setBrush(fg);
const int s = qr->width > 0 ? qr->width : 1;
const double w = width();
const double h = height();
const double aspect = w / h;
const double scale = ((aspect > 1.0) ? h : w) / s;
for (int y = 0; y < s; y++)
{
const int yy = y * s;
for (int x = 0; x < s; x++)
{
const int xx = yy + x;
const unsigned char b = qr->data[xx];
if (b & 0x01)
{
const double rx1 = x * scale,
ry1 = y * scale;
QRectF r(rx1, ry1, scale, scale);
painter.drawRects(&r, 1);
}
}
}
QRcode_free(qr);
painter.save();
}
else
{
QColor error("red");
painter.setBrush(error);
painter.drawRect(0, 0, width(), height());
qDebug() << "QR FAIL: " << strerror(errno);
}
qr = nullptr;
}

25
src/misc/qrwidget.h Normal file
View File

@ -0,0 +1,25 @@
#ifndef QRWIDGET_H
#define QRWIDGET_H
// https://stackoverflow.com/questions/21400254/how-to-draw-a-qr-code-with-qt-in-native-c-c
#include <QWidget>
class QRWidget : public QWidget
{
Q_OBJECT
public:
explicit QRWidget(QWidget *parent = 0);
void setQRData(const QString& data);
QImage* getImage();
bool saveImage(QString path);
private:
QString data;
void paintImage();
QImage* image;
QSize size;
};
#endif // QRWIDGET_H

View File

@ -25,6 +25,8 @@
#include <QWidget>
#include <QStyle>
#include <QFontInfo>
#include <QSvgRenderer>
#include <QPainter>
// helper functions
QFont appFont(int pixelSize, int weight)
@ -201,3 +203,13 @@ void Style::applyTheme()
{
GUI::reloadTheme();
}
QPixmap Style::scaleSvgImage(const QString& path, uint32_t width, uint32_t height)
{
QSvgRenderer render(path);
QPixmap pixmap(width, height);
pixmap.fill(QColor(0, 0, 0, 0));
QPainter painter(&pixmap);
render.render(&painter, pixmap.rect());
return pixmap;
}

View File

@ -63,6 +63,7 @@ public:
static void setThemeColor(int color);
static void setThemeColor(QColor color); ///< Pass an invalid QColor to reset to defaults
static void applyTheme(); ///< Reloads some CCS
static QPixmap scaleSvgImage(const QString& path, uint32_t width, uint32_t height);
static QStringList themeColorNames;
static QList<QColor> themeColorColors;

View File

@ -169,3 +169,11 @@ QString Nexus::getSupportedImageFilter()
res += QString("*.%1 ").arg(QString(type));
return tr("Images (%1)", "filetype filter").arg(res.left(res.size()-1));
}
bool Nexus::isFilePathWritable(const QString& filepath)
{
QFile tmp(filepath);
bool writable = tmp.open(QIODevice::WriteOnly);
tmp.remove();
return writable;
}

View File

@ -23,6 +23,7 @@ public:
static AndroidGUI* getAndroidGUI(); ///< Will return 0 if not started
static Widget* getDesktopGUI(); ///< Will return 0 if not started
static QString getSupportedImageFilter();
static bool isFilePathWritable(const QString& filepath); // WARNING: Tests by brute force, i.e. removes the file in question
private:
explicit Nexus(QObject *parent = 0);

View File

@ -146,7 +146,21 @@ void CameraWorker::subscribe()
if (!cam.isOpened())
{
queue.clear();
cam.open(camIndex);
bool bSuccess = false;
try
{
bSuccess = cam.open(camIndex);
}
catch( cv::Exception& e )
{
qDebug() << "CameraWorker:" << "OpenCV exception caught: " << e.what();
}
if(!bSuccess)
{
qDebug() << "CameraWorker: Could not open camera";
}
applyProps(); // restore props
}
}
@ -166,7 +180,20 @@ void CameraWorker::doWork()
if (!cam.isOpened())
return;
if (!cam.read(frame))
bool bSuccess = false;
try
{
bSuccess = cam.read(frame);
}
catch( cv::Exception& e )
{
qDebug() << "CameraWorker:" << "OpenCV exception caught: " << e.what();;
this->clock->stop(); // prevent log spamming
qDebug() << "CameraWorker: stopped clock";
}
if (!bSuccess)
{
qDebug() << "CameraWorker: Cannot read frame";
return;

View File

@ -34,8 +34,8 @@ CallConfirmWidget::CallConfirmWidget(const QWidget *Anchor) :
reject->setFlat(true);
accept->setStyleSheet("QPushButton{border:none;}");
reject->setStyleSheet("QPushButton{border:none;}");
accept->setIcon(QIcon(":/ui/acceptCall/acceptCall.png"));
reject->setIcon(QIcon(":/ui/rejectCall/rejectCall.png"));
accept->setIcon(QIcon(":/ui/acceptCall/acceptCall.svg"));
reject->setIcon(QIcon(":/ui/rejectCall/rejectCall.svg"));
accept->setIconSize(accept->size());
reject->setIconSize(reject->size());

View File

@ -50,6 +50,7 @@ AddFriendForm::AddFriendForm()
head->setLayout(&headLayout);
headLayout.addWidget(&headLabel);
connect(&toxId,&QLineEdit::returnPressed, this, &AddFriendForm::onSendTriggered);
connect(&sendButton, SIGNAL(clicked()), this, SLOT(onSendTriggered()));
connect(Nexus::getCore(), &Core::usernameSet, this, &AddFriendForm::onUsernameSet);
}

View File

@ -51,7 +51,7 @@ ChatForm::ChatForm(Friend* chatFriend)
{
nameLabel->setText(f->getDisplayedName());
avatar->setPixmap(QPixmap(":/img/contact_dark.png"), Qt::transparent);
avatar->setPixmap(QPixmap(":/img/contact_dark.svg"), Qt::transparent);
statusMessageLabel = new CroppingLabel();
statusMessageLabel->setObjectName("statusLabel");
@ -792,7 +792,7 @@ void ChatForm::onAvatarRemoved(int FriendId)
if (FriendId != f->getFriendID())
return;
avatar->setPixmap(QPixmap(":/img/contact_dark.png"), Qt::transparent);
avatar->setPixmap(QPixmap(":/img/contact_dark.svg"), Qt::transparent);
}
void ChatForm::loadHistory(QDateTime since, bool processUndelivered)

View File

@ -20,6 +20,7 @@
#include <QFileInfo>
#include <QUrl>
#include <QDebug>
#include <QPainter>
FilesForm::FilesForm()
: QObject()
@ -60,14 +61,14 @@ void FilesForm::show(Ui::MainWindow& ui)
void FilesForm::onFileDownloadComplete(const QString& path)
{
ListWidgetItem* tmp = new ListWidgetItem(QIcon(":/ui/acceptFileButton/default.png"), QFileInfo(path).fileName());
ListWidgetItem* tmp = new ListWidgetItem(QIcon(":/ui/fileTransferWidget/fileDone.svg"), QFileInfo(path).fileName());
tmp->path = path;
recvd->addItem(tmp);
}
void FilesForm::onFileUploadComplete(const QString& path)
{
ListWidgetItem* tmp = new ListWidgetItem(QIcon(":/ui/acceptFileButton/default.png"), QFileInfo(path).fileName());
ListWidgetItem* tmp = new ListWidgetItem(QIcon(":/ui/fileTransferWidget/fileDone.svg"), QFileInfo(path).fileName());
tmp->path = path;
sent->addItem(tmp);
}

View File

@ -51,7 +51,7 @@ GenericChatForm::GenericChatForm(QWidget *parent)
nameLabel->setEditable(true);
nameLabel->setTextFormat(Qt::PlainText);
avatar = new MaskablePixmapWidget(this, QSize(40,40), ":/img/avatar_mask.png");
avatar = new MaskablePixmapWidget(this, QSize(40,40), ":/img/avatar_mask.svg");
QHBoxLayout *mainFootLayout = new QHBoxLayout(),
*headLayout = new QHBoxLayout();

View File

@ -58,7 +58,7 @@ GroupChatForm::GroupChatForm(Group* chatGroup)
nusersLabel->setText(GroupChatForm::tr("%1 users in chat","Number of users in chat").arg(group->getPeersCount()));
nusersLabel->setObjectName("statusLabel");
avatar->setPixmap(QPixmap(":/img/group_dark.png"), Qt::transparent);
avatar->setPixmap(Style::scaleSvgImage(":/img/group_dark.svg", avatar->width(), avatar->height()), Qt::transparent);
msgEdit->setObjectName("group");

View File

@ -36,7 +36,6 @@
#include <QFileDialog>
#include <QBuffer>
void ProfileForm::refreshProfiles()
{
bodyUI->profiles->clear();
@ -76,11 +75,16 @@ ProfileForm::ProfileForm(QWidget *parent) :
toxId->setReadOnly(true);
toxId->setFrame(false);
toxId->setFont(Style::getFont(Style::Small));
bodyUI->toxGroup->layout()->addWidget(toxId);
toxId->setToolTip(bodyUI->toxId->toolTip());
profilePicture = new MaskablePixmapWidget(this, QSize(64, 64), ":/img/avatar_mask.png");
profilePicture->setPixmap(QPixmap(":/img/contact_dark.png"));
QVBoxLayout *toxIdGroup = qobject_cast<QVBoxLayout*>(bodyUI->toxGroup->layout());
toxIdGroup->replaceWidget(bodyUI->toxId, toxId);
bodyUI->toxId->hide();
bodyUI->qrLabel->setWordWrap(true);
profilePicture = new MaskablePixmapWidget(this, QSize(64, 64), ":/img/avatar_mask.svg");
profilePicture->setPixmap(QPixmap(":/img/contact_dark.svg"));
profilePicture->setClickable(true);
connect(profilePicture, SIGNAL(clicked()), this, SLOT(onAvatarClicked()));
QHBoxLayout *publicGrouplayout = qobject_cast<QHBoxLayout*>(bodyUI->publicGroup->layout());
@ -90,7 +94,7 @@ ProfileForm::ProfileForm(QWidget *parent) :
timer.setInterval(750);
timer.setSingleShot(true);
connect(&timer, &QTimer::timeout, this, [=]() {bodyUI->toxIdLabel->setText(bodyUI->toxIdLabel->text().replace("", "")); hasCheck = false;});
connect(bodyUI->toxIdLabel, SIGNAL(clicked()), this, SLOT(copyIdClicked()));
connect(toxId, SIGNAL(clicked()), this, SLOT(copyIdClicked()));
connect(core, &Core::idSet, this, &ProfileForm::setToxId);
@ -116,6 +120,12 @@ ProfileForm::ProfileForm(QWidget *parent) :
connect(core, &Core::usernameSet, this, [=](const QString& val) { bodyUI->userName->setText(val); });
connect(core, &Core::statusMessageSet, this, [=](const QString& val) { bodyUI->statusMessage->setText(val); });
for (QComboBox* cb : findChildren<QComboBox*>())
{
cb->installEventFilter(this);
cb->setFocusPolicy(Qt::StrongFocus);
}
}
ProfileForm::~ProfileForm()
@ -169,6 +179,10 @@ void ProfileForm::setToxId(const QString& id)
{
toxId->setText(id);
toxId->setCursorPosition(0);
qr = new QRWidget();
qr->setQRData("tox:"+id);
bodyUI->qrCode->setPixmap(QPixmap::fromImage(qr->getImage()->scaledToWidth(150)));
}
void ProfileForm::onAvatarClicked()
@ -183,14 +197,14 @@ void ProfileForm::onAvatarClicked()
file.open(QIODevice::ReadOnly);
if (!file.isOpen())
{
QMessageBox::critical(this, tr("Error"), tr("Unable to open this file"));
GUI::showError(tr("Error"), tr("Unable to open this file"));
return;
}
QPixmap pic;
if (!pic.loadFromData(file.readAll()))
{
QMessageBox::critical(this, tr("Error"), tr("Unable to read this image"));
GUI::showError(tr("Error"), tr("Unable to read this image"));
return;
}
@ -211,7 +225,7 @@ void ProfileForm::onAvatarClicked()
if (bytes.size() >= TOX_AVATAR_MAX_DATA_LENGTH)
{
QMessageBox::critical(this, tr("Error"), tr("This image is too big"));
GUI::showError(tr("Error"), tr("This image is too big"));
return;
}
@ -223,7 +237,7 @@ void ProfileForm::onLoadClicked()
if (bodyUI->profiles->currentText() != Settings::getInstance().getCurrentProfile())
{
if (Core::getInstance()->anyActiveCalls())
QMessageBox::warning(this, tr("Call active", "popup title"),
GUI::showWarning(tr("Call active", "popup title"),
tr("You can't switch profiles while a call is active!", "popup text"));
else
emit Widget::getInstance()->changeProfile(bodyUI->profiles->currentText());
@ -263,24 +277,17 @@ void ProfileForm::onExportClicked()
{
QString current = bodyUI->profiles->currentText() + Core::TOX_EXT;
QString path = QFileDialog::getSaveFileName(0, tr("Export profile", "save dialog title"),
QDir::home().filePath(current),
QDir::home().filePath(current),
tr("Tox save file (*.tox)", "save dialog filter"));
if (!path.isEmpty())
{
bool success;
if (QFile::exists(path))
if (!Nexus::isFilePathWritable(path))
{
// should we popup a warning?
success = QFile::remove(path);
if (!success)
{
QMessageBox::warning(this, tr("Failed to remove file"), tr("The file you chose to overwrite could not be removed first."));
return;
}
GUI::showWarning(tr("Location not writable","Title of permissions popup"), tr("You do not have permission to write that location. Choose another, or cancel the save dialog.", "text of permissions popup"));
return;
}
success = QFile::copy(QDir(Settings::getSettingsDirPath()).filePath(current), path);
if (!success)
QMessageBox::warning(this, tr("Failed to copy file"), tr("The file you chose could not be written to."));
if (!QFile::copy(QDir(Settings::getSettingsDirPath()).filePath(current), path))
GUI::showWarning(tr("Failed to copy file"), tr("The file you chose could not be written to."));
}
}
@ -288,10 +295,10 @@ void ProfileForm::onDeleteClicked()
{
if (Settings::getInstance().getCurrentProfile() == bodyUI->profiles->currentText())
{
QMessageBox::warning(this, tr("Profile currently loaded","current profile deletion warning title"), tr("This profile is currently in use. Please load a different profile before deleting this one.","current profile deletion warning text"));
GUI::showWarning(tr("Profile currently loaded","current profile deletion warning title"), tr("This profile is currently in use. Please load a different profile before deleting this one.","current profile deletion warning text"));
}
else
{
{
if (GUI::askQuestion(tr("Deletion imminent!","deletion confirmation title"),
tr("Are you sure you want to delete this profile?","deletion confirmation text")))
{
@ -323,9 +330,8 @@ void ProfileForm::onImportClicked()
if (info.suffix() != "tox")
{
QMessageBox::warning(this,
tr("Ignoring non-Tox file", "popup title"),
tr("Warning: you've chosen a file that is not a Tox save file; ignoring.", "popup text"));
GUI::showWarning(tr("Ignoring non-Tox file", "popup title"),
tr("Warning: you've chosen a file that is not a Tox save file; ignoring.", "popup text"));
return;
}
@ -369,3 +375,37 @@ void ProfileForm::showEvent(QShowEvent *event)
refreshProfiles();
QWidget::showEvent(event);
}
void ProfileForm::on_copyQr_clicked()
{
QApplication::clipboard()->setImage(*qr->getImage());
}
void ProfileForm::on_saveQr_clicked()
{
QString current = bodyUI->profiles->currentText() + ".png";
QString path = QFileDialog::getSaveFileName(0, tr("Save", "save qr image"),
QDir::home().filePath(current),
tr("Save QrCode (*.png)", "save dialog filter"));
if (!path.isEmpty())
{
if (!Nexus::isFilePathWritable(path))
{
GUI::showWarning(tr("Location not writable","Title of permissions popup"), tr("You do not have permission to write that location. Choose another, or cancel the save dialog.", "text of permissions popup"));
return;
}
if (!qr->saveImage(path))
GUI::showWarning(tr("Failed to copy file"), tr("The file you chose could not be written to."));
}
}
bool ProfileForm::eventFilter(QObject *o, QEvent *e)
{
if ((e->type() == QEvent::Wheel) &&
(qobject_cast<QComboBox*>(o) || qobject_cast<QAbstractSpinBox*>(o) ))
{
e->ignore();
return true;
}
return QWidget::eventFilter(o, e);
}

View File

@ -22,6 +22,7 @@
#include <QTimer>
#include <QVBoxLayout>
#include "src/core.h"
#include "src/misc/qrwidget.h"
class CroppingLabel;
class Core;
@ -36,7 +37,7 @@ class ClickableTE : public QLineEdit
{
Q_OBJECT
public:
signals:
void clicked();
protected:
@ -73,9 +74,13 @@ private slots:
void onNewClicked();
void disableSwitching();
void enableSwitching();
void on_copyQr_clicked();
void on_saveQr_clicked();
protected:
virtual void showEvent(QShowEvent *);
bool eventFilter(QObject *o, QEvent *e);
private:
void refreshProfiles();
@ -85,6 +90,7 @@ private:
Core* core;
QTimer timer;
bool hasCheck = false;
QRWidget *qr;
ClickableTE* toxId;
};

View File

@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>439</width>
<height>472</height>
<width>442</width>
<height>659</height>
</rect>
</property>
<property name="windowTitle">
@ -39,8 +39,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>419</width>
<height>452</height>
<width>422</width>
<height>639</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_4" stretch="0,0,1">
@ -82,21 +82,72 @@
</item>
<item alignment="Qt::AlignTop">
<widget class="QGroupBox" name="toxGroup">
<property name="toolTip">
<string comment="Tox ID tooltip">This bunch of characters tells other Tox clients how to contact you.
Share it with your friends to communicate.</string>
</property>
<property name="title">
<string>Tox ID</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="CroppingLabel" name="toxIdLabel">
<property name="toolTip">
<string comment="Tox ID tooltip">This bunch of characters tells other Tox clients how to contact you.
Share it with your friends to communicate.</string>
</property>
<property name="text">
<string>Your Tox ID (click to copy)</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="toxId">
<property name="toolTip">
<string comment="Tox ID tooltip">This bunch of characters tells other Tox clients how to contact you.
Share it with your friends to communicate.</string>
</property>
</widget>
</item>
<item>
<widget class="QFrame" name="verticalFrame">
<layout class="QHBoxLayout" name="qrGroup">
<item>
<widget class="QLabel" name="qrCode">
<property name="text">
<string>QRCODE</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QFrame" name="horizontalFrame">
<layout class="QVBoxLayout" name="qrButtons">
<item alignment="Qt::AlignTop">
<widget class="QLabel" name="qrLabel">
<property name="text">
<string>This QR code contains your Tox ID. You may share this with your friends as well.</string>
</property>
</widget>
</item>
<item alignment="Qt::AlignVCenter">
<widget class="QPushButton" name="saveQr">
<property name="text">
<string>Save image</string>
</property>
</widget>
</item>
<item alignment="Qt::AlignVCenter">
<widget class="QPushButton" name="copyQr">
<property name="text">
<string>Copy image</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</item>
@ -212,7 +263,7 @@ Profile does not contain your history.</string>
<customwidget>
<class>CroppingLabel</class>
<extends>QLabel</extends>
<header>src/widget/croppinglabel.h</header>
<header location="global">src/widget/croppinglabel.h</header>
</customwidget>
</customwidgets>
<resources/>

View File

@ -42,6 +42,12 @@ AdvancedForm::AdvancedForm() :
connect(bodyUI->cbMakeToxPortable, &QCheckBox::stateChanged, this, &AdvancedForm::onMakeToxPortableUpdated);
connect(bodyUI->syncTypeComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(onDbSyncTypeUpdated()));
connect(bodyUI->resetButton, SIGNAL(clicked()), this, SLOT(resetToDefault()));
for (QComboBox* cb : findChildren<QComboBox*>())
{
cb->installEventFilter(this);
cb->setFocusPolicy(Qt::StrongFocus);
}
}
AdvancedForm::~AdvancedForm()
@ -67,3 +73,14 @@ void AdvancedForm::resetToDefault()
bodyUI->syncTypeComboBox->setCurrentIndex(index);
onDbSyncTypeUpdated();
}
bool AdvancedForm::eventFilter(QObject *o, QEvent *e)
{
if ((e->type() == QEvent::Wheel) &&
(qobject_cast<QComboBox*>(o) || qobject_cast<QAbstractSpinBox*>(o) ))
{
e->ignore();
return true;
}
return QWidget::eventFilter(o, e);
}

View File

@ -31,6 +31,9 @@ class AdvancedForm : public GenericForm
public:
AdvancedForm();
virtual ~AdvancedForm();
protected:
bool eventFilter(QObject *o, QEvent *e);
private slots:
void onMakeToxPortableUpdated();

View File

@ -52,6 +52,12 @@ AVForm::AVForm() :
connect(bodyUI->filterAudio, SIGNAL(toggled(bool)), this, SLOT(onFilterAudioToggled(bool)));
connect(bodyUI->rescanButton, &QPushButton::clicked, this, [=](){getAudioInDevices(); getAudioOutDevices();});
bodyUI->playbackSlider->setValue(100);
for (QComboBox* cb : findChildren<QComboBox*>())
{
cb->installEventFilter(this);
cb->setFocusPolicy(Qt::StrongFocus);
}
}
AVForm::~AVForm()
@ -268,3 +274,14 @@ void AVForm::on_playbackSlider_valueChanged(int value)
{
Audio::getInstance().outputVolume = value / 100.0;
}
bool AVForm::eventFilter(QObject *o, QEvent *e)
{
if ((e->type() == QEvent::Wheel) &&
(qobject_cast<QComboBox*>(o) || qobject_cast<QAbstractSpinBox*>(o) ))
{
e->ignore();
return true;
}
return QWidget::eventFilter(o, e);
}

View File

@ -63,12 +63,12 @@ private slots:
virtual void showEvent(QShowEvent*);
void on_HueSlider_valueChanged(int value);
void on_BrightnessSlider_valueChanged(int value);
void on_SaturationSlider_valueChanged(int value);
void on_ContrastSlider_valueChanged(int value);
protected:
bool eventFilter(QObject *o, QEvent *e);
private:
Ui::AVSettings *bodyUI;

View File

@ -27,6 +27,7 @@
#include <QTime>
#include <QFileDialog>
#include <QStandardPaths>
#include <QDebug>
#include "src/autoupdate.h"
@ -158,12 +159,14 @@ GeneralForm::GeneralForm(SettingsWidget *myParent) :
// scrolling event won't be transmitted to comboboxes or qspinboxes when scrolling
// you can scroll through general settings without accidentially chaning theme/skin/icons etc.
// @see GeneralForm::eventFilter(QObject *o, QEvent *e) at the bottom of this file for more
Q_FOREACH(QComboBox *cb, findChildren<QComboBox*>() ) {
for (QComboBox* cb : findChildren<QComboBox*>())
{
cb->installEventFilter(this);
cb->setFocusPolicy(Qt::StrongFocus);
}
Q_FOREACH(QSpinBox *sp, findChildren<QSpinBox*>() ) {
for (QSpinBox* sp : findChildren<QSpinBox*>())
{
sp->installEventFilter(this);
sp->setFocusPolicy(Qt::WheelFocus);
}
@ -331,6 +334,12 @@ void GeneralForm::onReconnectClicked()
void GeneralForm::reloadSmiles()
{
QList<QStringList> emoticons = SmileyPack::getInstance().getEmoticons();
if (emoticons.isEmpty())
{ // sometimes there are no emoticons available, don't crash in this case
qDebug() << "GeneralForm::reloadSmilies: No emoticons found";
return;
}
QStringList smiles;
for (int i = 0; i < emoticons.size(); i++)
smiles.push_front(emoticons.at(i).first());
@ -341,8 +350,8 @@ void GeneralForm::reloadSmiles()
bodyUI->smile3->setPixmap(SmileyPack::getInstance().getAsIcon(smiles[2]).pixmap(size));
bodyUI->smile4->setPixmap(SmileyPack::getInstance().getAsIcon(smiles[3]).pixmap(size));
bodyUI->smile5->setPixmap(SmileyPack::getInstance().getAsIcon(smiles[4]).pixmap(size));
bodyUI->smile1->setToolTip(smiles[0]);
bodyUI->smile1->setToolTip(smiles[0]);
bodyUI->smile2->setToolTip(smiles[1]);
bodyUI->smile3->setToolTip(smiles[2]);
bodyUI->smile4->setToolTip(smiles[3]);

View File

@ -80,9 +80,9 @@ bool PrivacyForm::setChatLogsPassword()
body += "\n\n" + tr("It appears you have an unused encrypted chat history; if the password matches, it will be added to your current history.");
if (core->isPasswordSet(Core::ptMain))
dialog = new SetPasswordDialog(body, tr("Use data file password", "pushbutton text"), this);
dialog = new SetPasswordDialog(body, tr("Use data file password", "pushbutton text"), 0);
else
dialog = new SetPasswordDialog(body, QString(), this);
dialog = new SetPasswordDialog(body, QString(), 0);
do {
int r = dialog->exec();
@ -203,9 +203,9 @@ bool PrivacyForm::setToxPassword()
SetPasswordDialog* dialog;
QString body = tr("Please set your new data file password.");
if (core->isPasswordSet(Core::ptHistory))
dialog = new SetPasswordDialog(body, tr("Use chat history password", "pushbutton text"), this);
dialog = new SetPasswordDialog(body, tr("Use chat history password", "pushbutton text"), 0);
else
dialog = new SetPasswordDialog(body, QString(), this);
dialog = new SetPasswordDialog(body, QString(), 0);
if (int r = dialog->exec())
{

View File

@ -42,8 +42,9 @@ FriendWidget::FriendWidget(int FriendId, QString id)
, isDefaultAvatar{true}
, historyLoaded{false}
{
avatar->setPixmap(QPixmap(":img/contact.png"), Qt::transparent);
statusPic.setPixmap(QPixmap(":img/status/dot_away.png"));
avatar->setPixmap(QPixmap(":img/contact.svg"), Qt::transparent);
statusPic.setPixmap(QPixmap(":img/status/dot_offline.svg"));
statusPic.setMargin(3);
nameLabel->setText(id);
nameLabel->setTextFormat(Qt::PlainText);
statusMessageLabel->setTextFormat(Qt::PlainText);
@ -128,7 +129,7 @@ void FriendWidget::setAsActiveChatroom()
setActive(true);
if (isDefaultAvatar)
avatar->setPixmap(QPixmap(":img/contact_dark.png"), Qt::transparent);
avatar->setPixmap(QPixmap(":img/contact_dark.svg"), Qt::transparent);
if(!historyLoaded)
{
@ -146,7 +147,7 @@ void FriendWidget::setAsInactiveChatroom()
setActive(false);
if (isDefaultAvatar)
avatar->setPixmap(QPixmap(":img/contact.png"), Qt::transparent);
avatar->setPixmap(QPixmap(":img/contact.svg"), Qt::transparent);
}
void FriendWidget::updateStatusLight()
@ -155,21 +156,26 @@ void FriendWidget::updateStatusLight()
Status status = f->getStatus();
if (status == Status::Online && f->getEventFlag() == 0)
statusPic.setPixmap(QPixmap(":img/status/dot_online.png"));
statusPic.setPixmap(QPixmap(":img/status/dot_online.svg"));
else if (status == Status::Online && f->getEventFlag() == 1)
statusPic.setPixmap(QPixmap(":img/status/dot_online_notification.png"));
statusPic.setPixmap(QPixmap(":img/status/dot_online_notification.svg"));
else if (status == Status::Away && f->getEventFlag() == 0)
statusPic.setPixmap(QPixmap(":img/status/dot_idle.png"));
statusPic.setPixmap(QPixmap(":img/status/dot_away.svg"));
else if (status == Status::Away && f->getEventFlag() == 1)
statusPic.setPixmap(QPixmap(":img/status/dot_idle_notification.png"));
statusPic.setPixmap(QPixmap(":img/status/dot_away_notification.svg"));
else if (status == Status::Busy && f->getEventFlag() == 0)
statusPic.setPixmap(QPixmap(":img/status/dot_busy.png"));
statusPic.setPixmap(QPixmap(":img/status/dot_busy.svg"));
else if (status == Status::Busy && f->getEventFlag() == 1)
statusPic.setPixmap(QPixmap(":img/status/dot_busy_notification.png"));
statusPic.setPixmap(QPixmap(":img/status/dot_busy_notification.svg"));
else if (status == Status::Offline && f->getEventFlag() == 0)
statusPic.setPixmap(QPixmap(":img/status/dot_away.png"));
statusPic.setPixmap(QPixmap(":img/status/dot_offline.svg"));
else if (status == Status::Offline && f->getEventFlag() == 1)
statusPic.setPixmap(QPixmap(":img/status/dot_away_notification.png"));
statusPic.setPixmap(QPixmap(":img/status/dot_offline_notification.svg"));
if (!f->getEventFlag())
statusPic.setMargin(3);
else
statusPic.setMargin(0);
}
void FriendWidget::setChatForm(Ui::MainWindow &ui)
@ -202,9 +208,9 @@ void FriendWidget::onAvatarRemoved(int FriendId)
isDefaultAvatar = true;
if (isActive())
avatar->setPixmap(QPixmap(":img/contact_dark.png"), Qt::transparent);
avatar->setPixmap(QPixmap(":img/contact_dark.svg"), Qt::transparent);
else
avatar->setPixmap(QPixmap(":img/contact.png"), Qt::transparent);
avatar->setPixmap(QPixmap(":img/contact.svg"), Qt::transparent);
}
void FriendWidget::mousePressEvent(QMouseEvent *ev)

View File

@ -30,11 +30,11 @@ GenericChatroomWidget::GenericChatroomWidget(QWidget *parent)
// avatar
if (property("compact").toBool())
{
avatar = new MaskablePixmapWidget(this, QSize(20,20), ":/img/avatar_mask.png");
avatar = new MaskablePixmapWidget(this, QSize(20,20), ":/img/avatar_mask.svg");
}
else
{
avatar = new MaskablePixmapWidget(this, QSize(40,40), ":/img/avatar_mask.png");
avatar = new MaskablePixmapWidget(this, QSize(40,40), ":/img/avatar_mask.svg");
}
// status text

View File

@ -31,11 +31,13 @@
#include "ui_mainwindow.h"
GroupWidget::GroupWidget(int GroupId, QString Name)
: groupId{GroupId}
{
avatar->setPixmap(QPixmap(":img/group.png"), Qt::transparent);
statusPic.setPixmap(QPixmap(":img/status/dot_online.png"));
avatar->setPixmap(Style::scaleSvgImage(":img/group.svg", avatar->width(), avatar->height()), Qt::transparent);
statusPic.setPixmap(QPixmap(":img/status/dot_online.svg"));
statusPic.setMargin(3);
nameLabel->setText(Name);
Group* g = GroupList::findGroup(groupId);
@ -92,13 +94,13 @@ void GroupWidget::onUserListChanged()
void GroupWidget::setAsActiveChatroom()
{
setActive(true);
avatar->setPixmap(QPixmap(":img/group_dark.png"), Qt::transparent);
avatar->setPixmap(Style::scaleSvgImage(":img/group_dark.svg", avatar->width(), avatar->height()), Qt::transparent);
}
void GroupWidget::setAsInactiveChatroom()
{
setActive(false);
avatar->setPixmap(QPixmap(":img/group.png"), Qt::transparent);
avatar->setPixmap(Style::scaleSvgImage(":img/group.svg", avatar->width(), avatar->height()), Qt::transparent);
}
void GroupWidget::updateStatusLight()
@ -106,9 +108,15 @@ void GroupWidget::updateStatusLight()
Group *g = GroupList::findGroup(groupId);
if (!g->getEventFlag())
statusPic.setPixmap(QPixmap(":img/status/dot_online.png"));
{
statusPic.setPixmap(QPixmap(":img/status/dot_online.svg"));
statusPic.setMargin(3);
}
else
statusPic.setPixmap(QPixmap(":img/status/dot_online_notification.png"));
{
statusPic.setPixmap(QPixmap(":img/status/dot_online_notification.svg"));
statusPic.setMargin(0);
}
}
void GroupWidget::setChatForm(Ui::MainWindow &ui)

View File

@ -78,7 +78,7 @@ void MaskablePixmapWidget::setPixmap(const QPixmap &pmap, QColor background)
if (!pmap.isNull())
{
unscaled = pmap;
pixmap = pmap.scaled(width(), height(), Qt::KeepAspectRatioByExpanding, Qt::SmoothTransformation);
pixmap = pmap.scaled(width() - 2, height() - 2, Qt::KeepAspectRatioByExpanding, Qt::SmoothTransformation);
backgroundColor = background;
manualColor = true;
update();
@ -90,7 +90,7 @@ void MaskablePixmapWidget::setPixmap(const QPixmap &pmap)
if (!pmap.isNull())
{
unscaled = pmap;
pixmap = pmap.scaled(width(), height(), Qt::KeepAspectRatioByExpanding, Qt::SmoothTransformation);
pixmap = pmap.scaled(width() - 2, height() - 2, Qt::KeepAspectRatioByExpanding, Qt::SmoothTransformation);
autopickBackground();
update();
}
@ -113,7 +113,7 @@ void MaskablePixmapWidget::setSize(QSize size)
if (!unscaled.isNull())
{
pixmap = unscaled.scaled(width(), height(), Qt::KeepAspectRatioByExpanding, Qt::SmoothTransformation);
pixmap = unscaled.scaled(width() - 2, height() - 2, Qt::KeepAspectRatioByExpanding, Qt::SmoothTransformation);
if (!manualColor)
autopickBackground();
update();

View File

@ -84,6 +84,7 @@ Widget::Widget(QWidget *parent)
eventFlag(false),
eventIcon(false)
{
installEventFilter(this);
translator = new QTranslator;
setTranslation();
}
@ -103,13 +104,13 @@ void Widget::init()
ui->mainSplitter->restoreState(Settings::getInstance().getSplitterState());
statusOnline = new QAction(tr("Online", "Button to set your status to 'Online'"), this);
statusOnline->setIcon(QIcon(":img/status/dot_online.png"));
statusOnline->setIcon(getStatusIcon(Status::Online, 10, 10));
connect(statusOnline, SIGNAL(triggered()), this, SLOT(setStatusOnline()));
statusAway = new QAction(tr("Away", "Button to set your status to 'Away'"), this);
statusAway->setIcon(QIcon(":img/status/dot_idle.png"));
statusAway->setIcon(getStatusIcon(Status::Away, 10, 10));
connect(statusAway, SIGNAL(triggered()), this, SLOT(setStatusAway()));
statusBusy = new QAction(tr("Busy", "Button to set your status to 'Busy'"), this);
statusBusy->setIcon(QIcon(":img/status/dot_busy.png"));
statusBusy->setIcon(getStatusIcon(Status::Busy, 10, 10));
connect(statusBusy, SIGNAL(triggered()), this, SLOT(setStatusBusy()));
ui->statusbar->hide();
@ -118,8 +119,8 @@ void Widget::init()
layout()->setContentsMargins(0, 0, 0, 0);
ui->friendList->setStyleSheet(Style::resolve(Style::getStylesheet(":ui/friendList/friendList.css")));
profilePicture = new MaskablePixmapWidget(this, QSize(40, 40), ":/img/avatar_mask.png");
profilePicture->setPixmap(QPixmap(":/img/contact_dark.png"));
profilePicture = new MaskablePixmapWidget(this, QSize(40, 40), ":/img/avatar_mask.svg");
profilePicture->setPixmap(QPixmap(":/img/contact_dark.svg"));
profilePicture->setClickable(true);
ui->myProfile->insertWidget(0, profilePicture);
ui->myProfile->insertSpacing(1, 7);
@ -161,8 +162,7 @@ void Widget::init()
ui->mainSplitter->setStretchFactor(0,0);
ui->mainSplitter->setStretchFactor(1,1);
ui->statusButton->setProperty("status", "offline");
Style::repolish(ui->statusButton);
onStatusSet(Status::Offline);
// Disable some widgets until we're connected to the DHT
ui->statusButton->setEnabled(false);
@ -224,8 +224,28 @@ void Widget::setTranslation()
QCoreApplication::installTranslator(translator);
}
bool Widget::eventFilter(QObject *obj, QEvent *event)
{
if(event->type() == QEvent::WindowStateChange && obj != NULL)
{
QWindowStateChangeEvent * ce = static_cast<QWindowStateChangeEvent*>(event);
if (windowState() & Qt::WindowMinimized)
{
if (ce->oldState() & Qt::WindowMaximized)
wasMaximized = true;
else
wasMaximized = false;
}
}
event->accept();
return false;
}
void Widget::updateIcons()
{
if (!icon)
return;
QString status;
if (eventIcon)
status = "event";
@ -335,16 +355,7 @@ void Widget::onConnected()
void Widget::onDisconnected()
{
QString stat = ui->statusButton->property("status").toString();
if (stat == "online")
beforeDisconnect = Status::Online;
else if (stat == "busy")
beforeDisconnect = Status::Busy;
else if (stat == "away")
beforeDisconnect = Status::Away;
else
beforeDisconnect = Status::Offline;
beforeDisconnect = getStatusFromString(ui->statusButton->property("status").toString());
ui->statusButton->setEnabled(false);
emit statusSet(Status::Offline);
}
@ -370,27 +381,8 @@ void Widget::onBadProxyCore()
void Widget::onStatusSet(Status status)
{
//We have to use stylesheets here, there's no way to
//prevent the button icon from moving when pressed otherwise
switch (status)
{
case Status::Online:
ui->statusButton->setProperty("status" ,"online");
ui->statusButton->setIcon(QIcon(":img/status/dot_online_2x.png"));
break;
case Status::Away:
ui->statusButton->setProperty("status" ,"away");
ui->statusButton->setIcon(QIcon(":img/status/dot_idle_2x.png"));
break;
case Status::Busy:
ui->statusButton->setProperty("status" ,"busy");
ui->statusButton->setIcon(QIcon(":img/status/dot_busy_2x.png"));
break;
case Status::Offline:
ui->statusButton->setProperty("status" ,"offline");
ui->statusButton->setIcon(QIcon(":img/status/dot_away_2x.png"));
break;
}
ui->statusButton->setProperty("status", getStatusTitle(status));
ui->statusButton->setIcon(getStatusIcon(status, 10, 10));
updateIcons();
}
@ -460,23 +452,37 @@ void Widget::onIconClick(QSystemTrayIcon::ActivationReason reason)
{
show();
activateWindow();
if (wasMaximized)
showMaximized();
else
showNormal();
}
else if (isMinimized())
{
forceShow();
activateWindow();
if (wasMaximized)
showMaximized();
else
showNormal();
}
else
{
hide();
wasMaximized = isMaximized();
if (Settings::getInstance().getMinimizeToTray())
hide();
else
showMinimized();
}
break;
}
case QSystemTrayIcon::DoubleClick:
forceShow();
break;
case QSystemTrayIcon::MiddleClick:
hide();
wasMaximized = isMaximized();
if (Settings::getInstance().getMinimizeToTray())
hide();
else
showMinimized();
break;
case QSystemTrayIcon::Unknown:
if (isHidden())
@ -732,6 +738,8 @@ void Widget::newMessageAlert(GenericChatroomWidget* chat)
bool inactiveWindow = isMinimized() || !isActiveWindow();
if (!inactiveWindow && activeChatroomWidget != nullptr && chat == activeChatroomWidget)
return;
if (ui->statusButton->property("status").toString() == "busy")
return;
QApplication::alert(this);
@ -760,6 +768,8 @@ void Widget::newMessageAlert(GenericChatroomWidget* chat)
void Widget::playRingtone()
{
if (ui->statusButton->property("status").toString() == "busy")
return;
QApplication::alert(this);
static QFile sndFile1(":audio/ToxicIncomingCall.pcm"); // for whatever reason this plays slower/downshifted from what any other program plays the file as... but whatever
@ -1207,3 +1217,62 @@ void Widget::previousContact()
{
qDebug() << "previous contact";
}
QString Widget::getStatusIconPath(Status status)
{
switch (status)
{
case Status::Online:
return ":img/status/dot_online.svg";
case Status::Away:
return ":img/status/dot_away.svg";
case Status::Busy:
return ":img/status/dot_busy.svg";
case Status::Offline:
default:
return ":img/status/dot_offline.svg";
}
}
inline QIcon Widget::getStatusIcon(Status status, uint32_t w/*=0*/, uint32_t h/*=0*/)
{
if (w > 0 && h > 0)
return getStatusIconPixmap(status, w, h);
else
return QIcon(getStatusIconPath(status));
}
QPixmap Widget::getStatusIconPixmap(Status status, uint32_t w, uint32_t h)
{
QPixmap pix(w, h);
pix.load(getStatusIconPath(status));
return pix;
}
QString Widget::getStatusTitle(Status status)
{
switch (status)
{
case Status::Online:
return "online";
case Status::Away:
return "away";
case Status::Busy:
return "busy";
case Status::Offline:
default:
return "offline";
}
}
Status Widget::getStatusFromString(QString status)
{
if (status == "online")
return Status::Online;
else if (status == "busy")
return Status::Busy;
else if (status == "away")
return Status::Away;
else
return Status::Offline;
}

View File

@ -51,6 +51,9 @@ class Widget : public QMainWindow
{
Q_OBJECT
protected:
bool eventFilter(QObject *obj, QEvent *event);
public:
explicit Widget(QWidget *parent = 0);
void init();
@ -76,6 +79,11 @@ public:
void reloadHistory();
void reloadTheme();
static QString getStatusIconPath(Status status);
static inline QIcon getStatusIcon(Status status, uint32_t w=0, uint32_t h=0);
static QPixmap getStatusIconPixmap(Status status, uint32_t w, uint32_t h);
static QString getStatusTitle(Status status);
static Status getStatusFromString(QString status);
public slots:
void onSettingsClicked();
@ -176,6 +184,7 @@ private:
QRegExp nameMention, sanitizedNameMention;
bool eventFlag;
bool eventIcon;
bool wasMaximized = false;
};
bool toxActivateEventHandler(const QByteArray& data);

344
translations/it.ts vendored
View File

@ -9,7 +9,7 @@
<translation>Audio/Video</translation>
</message>
<message>
<location filename="../src/widget/form/settings/avform.cpp" line="77"/>
<location filename="../src/widget/form/settings/avform.cpp" line="83"/>
<source>Initializing Camera...</source>
<translation>Inizializzazione Webcam...</translation>
</message>
@ -138,40 +138,40 @@ qualità video elevate, questo può causare problemi con le chiamate video.</tra
<translation>Invia richiesta d&apos;amicizia</translation>
</message>
<message>
<location filename="../src/widget/form/addfriendform.cpp" line="79"/>
<location filename="../src/widget/form/addfriendform.cpp" line="80"/>
<source>%1 here! Tox me maybe?</source>
<comment>Default message in friend requests if the field is left blank. Write something appropriate!</comment>
<translation>Ciao, sono %1.
Permettimi di aggiungerti alla mia lista contatti.</translation>
</message>
<message>
<location filename="../src/widget/form/addfriendform.cpp" line="87"/>
<location filename="../src/widget/form/addfriendform.cpp" line="88"/>
<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>Inserisci un Tox ID valido</translation>
</message>
<message>
<location filename="../src/widget/form/addfriendform.cpp" line="87"/>
<location filename="../src/widget/form/addfriendform.cpp" line="90"/>
<location filename="../src/widget/form/addfriendform.cpp" line="108"/>
<location filename="../src/widget/form/addfriendform.cpp" line="88"/>
<location filename="../src/widget/form/addfriendform.cpp" line="91"/>
<location filename="../src/widget/form/addfriendform.cpp" line="109"/>
<source>Couldn&apos;t add friend</source>
<translation>Impossibile aggiungere il contatto</translation>
</message>
<message>
<location filename="../src/widget/form/addfriendform.cpp" line="90"/>
<location filename="../src/widget/form/addfriendform.cpp" line="91"/>
<source>You can&apos;t add yourself as a friend!</source>
<comment>When trying to add your own Tox ID as friend</comment>
<translation>Non puoi aggiungere te stesso come contatto!</translation>
</message>
<message>
<location filename="../src/widget/form/addfriendform.cpp" line="98"/>
<location filename="../src/widget/form/addfriendform.cpp" line="99"/>
<source>qTox needs to use the Tox DNS, but can&apos;t do it through a proxy.
Ignore the proxy and connect to the Internet directly?</source>
<translation>qTox deve usare Tox DNS, ma non può farlo attraverso un proxy.
Ignorare le impostazioni del proxy e connettersi direttamente alla rete Tox?</translation>
</message>
<message>
<location filename="../src/widget/form/addfriendform.cpp" line="108"/>
<location filename="../src/widget/form/addfriendform.cpp" line="109"/>
<source>This Tox ID does not exist</source>
<comment>DNS error</comment>
<translation>Questo Tox ID non esiste</translation>
@ -441,7 +441,7 @@ Ignorare le impostazioni del proxy e connettersi direttamente alla rete Tox?</tr
<translation>Seleziona tutto</translation>
</message>
<message>
<location filename="../src/chatlog/chatlog.cpp" line="501"/>
<location filename="../src/chatlog/chatlog.cpp" line="512"/>
<source>pending</source>
<translation>in attesa</translation>
</message>
@ -598,37 +598,37 @@ Per questo motivo sarà disabilitata.</translation>
<translation>[anteprima]</translation>
</message>
<message>
<location filename="../src/chatlog/content/filetransferwidget.cpp" line="86"/>
<location filename="../src/chatlog/content/filetransferwidget.cpp" line="87"/>
<source>Waiting to send...</source>
<comment>file transfer widget</comment>
<translation>In attesa di inviare...</translation>
</message>
<message>
<location filename="../src/chatlog/content/filetransferwidget.cpp" line="89"/>
<location filename="../src/chatlog/content/filetransferwidget.cpp" line="90"/>
<source>Accept to receive this file</source>
<comment>file transfer widget</comment>
<translation>Accetta la ricezione di questo file</translation>
</message>
<message>
<location filename="../src/chatlog/content/filetransferwidget.cpp" line="131"/>
<location filename="../src/chatlog/content/filetransferwidget.cpp" line="132"/>
<source>Location not writable</source>
<comment>Title of permissions popup</comment>
<translation>Errore</translation>
</message>
<message>
<location filename="../src/chatlog/content/filetransferwidget.cpp" line="132"/>
<location filename="../src/chatlog/content/filetransferwidget.cpp" line="133"/>
<source>You do not have permission to write that location. Choose another, or cancel the save dialog.</source>
<comment>text of permissions popup</comment>
<translation>Non hai sufficienti permessi per scrivere in questa locazione. Scegli un&apos;altra posizione, o annulla il salvataggio.</translation>
</message>
<message>
<location filename="../src/chatlog/content/filetransferwidget.cpp" line="304"/>
<location filename="../src/chatlog/content/filetransferwidget.cpp" line="297"/>
<source>paused</source>
<comment>file transfer widget</comment>
<translation>in pausa</translation>
</message>
<message>
<location filename="../src/chatlog/content/filetransferwidget.cpp" line="427"/>
<location filename="../src/chatlog/content/filetransferwidget.cpp" line="420"/>
<source>Save a file</source>
<comment>Title of the file saving dialog</comment>
<translation>Salva file</translation>
@ -637,18 +637,18 @@ Per questo motivo sarà disabilitata.</translation>
<context>
<name>FilesForm</name>
<message>
<location filename="../src/widget/form/filesform.cpp" line="30"/>
<location filename="../src/widget/form/filesform.cpp" line="31"/>
<source>Transfered Files</source>
<comment>&quot;Headline&quot; of the window</comment>
<translation>Files Trasferiti</translation>
</message>
<message>
<location filename="../src/widget/form/filesform.cpp" line="38"/>
<location filename="../src/widget/form/filesform.cpp" line="39"/>
<source>Downloads</source>
<translation>Files Ricevuti</translation>
</message>
<message>
<location filename="../src/widget/form/filesform.cpp" line="39"/>
<location filename="../src/widget/form/filesform.cpp" line="40"/>
<source>Uploads</source>
<translation>Files Inviati</translation>
</message>
@ -742,17 +742,17 @@ Soprannome:</translation>
<context>
<name>GUI</name>
<message>
<location filename="../src/widget/gui.cpp" line="247"/>
<location filename="../src/widget/gui.cpp" line="281"/>
<source>Enter your password</source>
<translation>Inserisci password</translation>
</message>
<message>
<location filename="../src/widget/gui.cpp" line="249"/>
<location filename="../src/widget/gui.cpp" line="283"/>
<source>Decrypt</source>
<translation>Decripta</translation>
</message>
<message>
<location filename="../src/widget/gui.cpp" line="291"/>
<location filename="../src/widget/gui.cpp" line="325"/>
<source>You must enter a non-empty password:</source>
<translation>Devi inserire una password non vuota:</translation>
</message>
@ -765,25 +765,25 @@ Soprannome:</translation>
<translation>Generale</translation>
</message>
<message>
<location filename="../src/widget/form/settings/generalform.cpp" line="86"/>
<location filename="../src/widget/form/settings/generalform.cpp" line="92"/>
<location filename="../src/widget/form/settings/generalform.cpp" line="88"/>
<location filename="../src/widget/form/settings/generalform.cpp" line="93"/>
<source>None</source>
<translation>Nessuno</translation>
</message>
<message>
<location filename="../src/widget/form/settings/generalform.cpp" line="250"/>
<location filename="../src/widget/form/settings/generalform.cpp" line="268"/>
<source>Choose an auto accept directory</source>
<comment>popup title</comment>
<translation>Scegli dove salvare i files accettati automaticamente</translation>
</message>
<message>
<location filename="../src/widget/form/settings/generalform.cpp" line="307"/>
<location filename="../src/widget/form/settings/generalform.cpp" line="326"/>
<source>Call active</source>
<comment>popup title</comment>
<translation>Chiamata in corso</translation>
</message>
<message>
<location filename="../src/widget/form/settings/generalform.cpp" line="308"/>
<location filename="../src/widget/form/settings/generalform.cpp" line="327"/>
<source>You can&apos;t disconnect while a call is active!</source>
<comment>popup text</comment>
<translation>Non puoi disconnetterti mentre c&apos;è una chiamata in corso!</translation>
@ -1159,34 +1159,35 @@ will be sent to them when they will appear online to you.</source>
<translation>%1 utenti in chat</translation>
</message>
<message>
<location filename="../src/widget/form/groupchatform.cpp" line="194"/>
<location filename="../src/widget/form/groupchatform.cpp" line="240"/>
<location filename="../src/widget/form/groupchatform.cpp" line="210"/>
<location filename="../src/widget/form/groupchatform.cpp" line="256"/>
<source>Mute microphone</source>
<translation>Disattiva microfono</translation>
</message>
<message>
<location filename="../src/widget/form/groupchatform.cpp" line="200"/>
<location filename="../src/widget/form/groupchatform.cpp" line="216"/>
<source>Unmute microphone</source>
<translation>Attiva microfono</translation>
</message>
<message>
<location filename="../src/widget/form/groupchatform.cpp" line="215"/>
<location filename="../src/widget/form/groupchatform.cpp" line="243"/>
<location filename="../src/widget/form/groupchatform.cpp" line="231"/>
<location filename="../src/widget/form/groupchatform.cpp" line="259"/>
<source>Mute call</source>
<translation>Disattiva audio</translation>
</message>
<message>
<location filename="../src/widget/form/groupchatform.cpp" line="221"/>
<location filename="../src/widget/form/groupchatform.cpp" line="237"/>
<source>Unmute call</source>
<translation>Attiva audio</translation>
</message>
<message>
<location filename="../src/widget/form/groupchatform.cpp" line="237"/>
<location filename="../src/widget/form/groupchatform.cpp" line="253"/>
<source>End audio call</source>
<translation>Termina chiamata</translation>
</message>
<message>
<location filename="../src/widget/form/groupchatform.cpp" line="253"/>
<location filename="../src/widget/form/groupchatform.cpp" line="162"/>
<location filename="../src/widget/form/groupchatform.cpp" line="269"/>
<source>Start audio call</source>
<translation>Avvia chiamata</translation>
</message>
@ -1194,35 +1195,35 @@ will be sent to them when they will appear online to you.</source>
<context>
<name>GroupWidget</name>
<message>
<location filename="../src/widget/groupwidget.cpp" line="43"/>
<location filename="../src/widget/groupwidget.cpp" line="81"/>
<location filename="../src/widget/groupwidget.cpp" line="44"/>
<location filename="../src/widget/groupwidget.cpp" line="88"/>
<source>%1 users in chat</source>
<translation>%1 utenti in chat</translation>
</message>
<message>
<location filename="../src/widget/groupwidget.cpp" line="45"/>
<location filename="../src/widget/groupwidget.cpp" line="83"/>
<location filename="../src/widget/groupwidget.cpp" line="46"/>
<location filename="../src/widget/groupwidget.cpp" line="90"/>
<source>0 users in chat</source>
<translation>0 utenti in chat</translation>
</message>
<message>
<location filename="../src/widget/groupwidget.cpp" line="55"/>
<location filename="../src/widget/groupwidget.cpp" line="56"/>
<source>Quit group</source>
<comment>Menu to quit a groupchat</comment>
<translation>Esci dal gruppo</translation>
</message>
<message>
<location filename="../src/widget/groupwidget.cpp" line="54"/>
<location filename="../src/widget/groupwidget.cpp" line="55"/>
<source>Set title...</source>
<translation>Imposta nome gruppo...</translation>
</message>
<message>
<location filename="../src/widget/groupwidget.cpp" line="67"/>
<location filename="../src/widget/groupwidget.cpp" line="68"/>
<source>Group title</source>
<translation>Nome gruppo</translation>
</message>
<message>
<location filename="../src/widget/groupwidget.cpp" line="67"/>
<location filename="../src/widget/groupwidget.cpp" line="68"/>
<source>You can also set this by clicking the chat form name.
Title:</source>
<translation>Per impostare un nome puoi anche cliccare sul gruppo direttamente dalla chat.
@ -1247,12 +1248,13 @@ Nome gruppo:</translation>
<translation>Stato</translation>
</message>
<message>
<location filename="../src/widget/form/profileform.ui" line="90"/>
<location filename="../src/widget/form/profileform.ui" line="86"/>
<source>Tox ID</source>
<translation>Tox ID</translation>
</message>
<message>
<location filename="../src/widget/form/profileform.ui" line="86"/>
<location filename="../src/widget/form/profileform.ui" line="92"/>
<location filename="../src/widget/form/profileform.ui" line="103"/>
<source>This bunch of characters tells other Tox clients how to contact you.
Share it with your friends to communicate.</source>
<comment>Tox ID tooltip</comment>
@ -1262,56 +1264,77 @@ Condivilo con chi vuoi comunicare.</translation>
<message>
<location filename="../src/widget/form/profileform.ui" line="96"/>
<source>Your Tox ID (click to copy)</source>
<translation>(clicca qui per copiare)</translation>
<translation>Il tuo Tox ID (clicca per copiare)</translation>
</message>
<message>
<location filename="../src/widget/form/profileform.ui" line="106"/>
<location filename="../src/widget/form/profileform.ui" line="114"/>
<source>QRCODE</source>
<translation>QRCODE</translation>
</message>
<message>
<location filename="../src/widget/form/profileform.ui" line="127"/>
<source>This QR code contains your Tox ID. You may share this with your friends as well.</source>
<translation>Questo codice QR contiene il tuo Tox ID.
Puoi condividere questo codice QR al posto del tuo Tox ID.</translation>
</message>
<message>
<location filename="../src/widget/form/profileform.ui" line="134"/>
<source>Save image</source>
<translation>Salva immagine</translation>
</message>
<message>
<location filename="../src/widget/form/profileform.ui" line="141"/>
<source>Copy image</source>
<translation>Copia immagine</translation>
</message>
<message>
<location filename="../src/widget/form/profileform.ui" line="157"/>
<source>Profiles</source>
<translation>Gestione Profili</translation>
</message>
<message>
<location filename="../src/widget/form/profileform.ui" line="114"/>
<location filename="../src/widget/form/profileform.ui" line="165"/>
<source>Available profiles:</source>
<translation>Profili disponibili:</translation>
</message>
<message>
<location filename="../src/widget/form/profileform.ui" line="127"/>
<location filename="../src/widget/form/profileform.ui" line="178"/>
<source>Currently selected profile.</source>
<comment>toolTip for currently set profile</comment>
<translation>Profilo corrente.</translation>
</message>
<message>
<location filename="../src/widget/form/profileform.ui" line="138"/>
<location filename="../src/widget/form/profileform.ui" line="189"/>
<source>Load selected profile and switch to it.</source>
<comment>tooltip for loading profile button</comment>
<translation>Carica il profilo selezionato.</translation>
</message>
<message>
<location filename="../src/widget/form/profileform.ui" line="141"/>
<location filename="../src/widget/form/profileform.ui" line="192"/>
<source>Load</source>
<comment>load profile button</comment>
<translation>Carica</translation>
</message>
<message>
<location filename="../src/widget/form/profileform.ui" line="151"/>
<location filename="../src/widget/form/profileform.ui" line="202"/>
<source>Rename</source>
<comment>rename profile button</comment>
<translation>Rinomina</translation>
</message>
<message>
<location filename="../src/widget/form/profileform.ui" line="148"/>
<location filename="../src/widget/form/profileform.ui" line="199"/>
<source>Rename selected profile.</source>
<comment>tooltip for renaming profile button</comment>
<translation>Rinomina il profilo selezionato.</translation>
</message>
<message>
<location filename="../src/widget/form/profileform.ui" line="162"/>
<location filename="../src/widget/form/profileform.ui" line="213"/>
<source>Export</source>
<comment>export profile button</comment>
<translation>Esporta</translation>
</message>
<message>
<location filename="../src/widget/form/profileform.ui" line="158"/>
<location filename="../src/widget/form/profileform.ui" line="209"/>
<source>Allows you to export your Tox profile to a file.
Profile does not contain your history.</source>
<comment>tooltip for profile exporting button</comment>
@ -1319,37 +1342,37 @@ Profile does not contain your history.</source>
I profili non contengono la cronologia messaggi.</translation>
</message>
<message>
<location filename="../src/widget/form/profileform.ui" line="169"/>
<location filename="../src/widget/form/profileform.ui" line="220"/>
<source>Delete selected profile.</source>
<comment>delete profile button tooltip</comment>
<translation>Elimina il profilo selezionato.</translation>
</message>
<message>
<location filename="../src/widget/form/profileform.ui" line="172"/>
<location filename="../src/widget/form/profileform.ui" line="223"/>
<source>Delete</source>
<comment>delete profile button</comment>
<translation>Elimina</translation>
</message>
<message>
<location filename="../src/widget/form/profileform.ui" line="186"/>
<location filename="../src/widget/form/profileform.ui" line="237"/>
<source>Import a profile</source>
<comment>import profile button</comment>
<translation>Importa profilo</translation>
</message>
<message>
<location filename="../src/widget/form/profileform.ui" line="183"/>
<location filename="../src/widget/form/profileform.ui" line="234"/>
<source>Import Tox profile from a .tox file.</source>
<comment>tooltip for importing profile button</comment>
<translation>Importa un profilo da un file &quot;.tox&quot;.</translation>
</message>
<message>
<location filename="../src/widget/form/profileform.ui" line="193"/>
<location filename="../src/widget/form/profileform.ui" line="244"/>
<source>Create new Tox ID and switch to it.</source>
<comment>tooltip for creating new Tox ID button</comment>
<translation>Crea un nuovo profilo (Tox ID) e iniza subito ad usarlo.</translation>
</message>
<message>
<location filename="../src/widget/form/profileform.ui" line="196"/>
<location filename="../src/widget/form/profileform.ui" line="247"/>
<source>New Tox ID</source>
<comment>new profile button</comment>
<translation>Nuovo profilo</translation>
@ -1381,27 +1404,27 @@ I profili non contengono la cronologia messaggi.</translation>
<translation>Toxing on qTox</translation>
</message>
<message>
<location filename="../src/mainwindow.ui" line="1099"/>
<location filename="../src/mainwindow.ui" line="1095"/>
<source>Add friends</source>
<translation>Aggiungi contatto</translation>
</message>
<message>
<location filename="../src/mainwindow.ui" line="1137"/>
<location filename="../src/mainwindow.ui" line="1139"/>
<source>Create a group chat</source>
<translation>Crea un gruppo</translation>
</message>
<message>
<location filename="../src/mainwindow.ui" line="1172"/>
<location filename="../src/mainwindow.ui" line="1180"/>
<source>View completed file transfers</source>
<translation>Visualizza i trasferimenti completati</translation>
</message>
<message>
<location filename="../src/mainwindow.ui" line="1204"/>
<location filename="../src/mainwindow.ui" line="1218"/>
<source>Change your settings</source>
<translation>Cambia le impostazioni</translation>
</message>
<message>
<location filename="../src/mainwindow.ui" line="1792"/>
<location filename="../src/mainwindow.ui" line="1812"/>
<source>Close</source>
<translation>Chiudi</translation>
</message>
@ -1469,14 +1492,31 @@ I profili non contengono la cronologia messaggi.</translation>
<location filename="../src/widget/form/settings/privacyform.cpp" line="117"/>
<source>There is currently an unused encrypted chat history, but the password you just entered doesn&apos;t match.
If you don&apos;t care about the old history, you may click Ok to delete it and use the password you just entered.
Otherwise, hit cancel to try again.</source>
If you don&apos;t care about the old history, you may delete it and use the password you just entered.
Otherwise, hit Cancel to try again.</source>
<comment>This happens when enabling encryption after previously &quot;Disabling History&quot;</comment>
<translation>C&apos;è una cronologia chat criptata non in uso, ma la password che hai inserito non corrisponde.
Se non ti interessa della cronologia precedente, puoi scegliere &quot;Ok&quot; per eliminarla ed usare la password che hai appena inserito.
Se non ti interessa della cronologia precedente, puoi scegliere &quot;Elimina&quot; per eliminarla ed usare la password che hai appena inserito.
Scegli &quot;Annulla&quot; per riprovare.</translation>
</message>
<message>
<location filename="../src/widget/form/settings/privacyform.cpp" line="117"/>
<location filename="../src/widget/form/settings/privacyform.cpp" line="118"/>
<location filename="../src/widget/form/settings/privacyform.cpp" line="150"/>
<location filename="../src/widget/form/settings/privacyform.cpp" line="170"/>
<source>Delete</source>
<translation>Elimina</translation>
</message>
<message>
<location filename="../src/widget/form/settings/privacyform.cpp" line="117"/>
<location filename="../src/widget/form/settings/privacyform.cpp" line="118"/>
<location filename="../src/widget/form/settings/privacyform.cpp" line="151"/>
<location filename="../src/widget/form/settings/privacyform.cpp" line="171"/>
<location filename="../src/widget/form/settings/privacyform.cpp" line="251"/>
<source>Cancel</source>
<translation>Annulla</translation>
</message>
<message>
<location filename="../src/widget/form/settings/privacyform.cpp" line="118"/>
<source>Are you absolutely sure you want to lose the unused encrypted chat history?</source>
@ -1484,43 +1524,49 @@ Scegli &quot;Annulla&quot; per riprovare.</translation>
<translation>Sei sicuro di voler eliminare la cronologia chat criptata non in uso?</translation>
</message>
<message>
<location filename="../src/widget/form/settings/privacyform.cpp" line="147"/>
<location filename="../src/widget/form/settings/privacyform.cpp" line="164"/>
<location filename="../src/widget/form/settings/privacyform.cpp" line="146"/>
<location filename="../src/widget/form/settings/privacyform.cpp" line="167"/>
<source>Old encrypted chat history</source>
<comment>title</comment>
<translation>Vecchia cronologia chat</translation>
</message>
<message>
<location filename="../src/widget/form/settings/privacyform.cpp" line="148"/>
<location filename="../src/widget/form/settings/privacyform.cpp" line="147"/>
<source>Would you like to decrypt your chat history?
Otherwise it will be deleted.</source>
<translation>Vuoi decriptare la tua cronologia chat?
Altrimenti sarà eliminata.</translation>
</message>
<message>
<location filename="../src/widget/form/settings/privacyform.cpp" line="165"/>
<location filename="../src/widget/form/settings/privacyform.cpp" line="149"/>
<location filename="../src/widget/form/settings/privacyform.cpp" line="251"/>
<source>Decrypt</source>
<translation>Decripta</translation>
</message>
<message>
<location filename="../src/widget/form/settings/privacyform.cpp" line="168"/>
<source>Are you sure you want to lose your entire chat history?</source>
<translation>Sei sicuro di voler perdere tutta la cronologia chat?</translation>
</message>
<message>
<location filename="../src/widget/form/settings/privacyform.cpp" line="197"/>
<location filename="../src/widget/form/settings/privacyform.cpp" line="204"/>
<source>Please set your new data file password.</source>
<translation>Inserisci la nuova password per il file dati.</translation>
</message>
<message>
<location filename="../src/widget/form/settings/privacyform.cpp" line="199"/>
<location filename="../src/widget/form/settings/privacyform.cpp" line="206"/>
<source>Use chat history password</source>
<comment>pushbutton text</comment>
<translation>Usa la password della cronologia chat</translation>
</message>
<message>
<location filename="../src/widget/form/settings/privacyform.cpp" line="242"/>
<location filename="../src/widget/form/settings/privacyform.cpp" line="249"/>
<source>Decrypt your data file</source>
<comment>title</comment>
<translation>Decripta il tuo file dati</translation>
</message>
<message>
<location filename="../src/widget/form/settings/privacyform.cpp" line="242"/>
<location filename="../src/widget/form/settings/privacyform.cpp" line="250"/>
<source>Would you like to decrypt your data file?</source>
<translation>Vuoi decriptare il tuo file dati?</translation>
</message>
@ -1603,155 +1649,173 @@ ma i nuovi contatti dovranno conoscere il tuo nuovo Tox ID per aggiungerti.</tra
<context>
<name>ProfileForm</name>
<message>
<location filename="../src/widget/form/profileform.cpp" line="71"/>
<location filename="../src/widget/form/profileform.cpp" line="70"/>
<source>User Profile</source>
<translation>Profilo Utente</translation>
</message>
<message>
<location filename="../src/widget/form/profileform.cpp" line="177"/>
<location filename="../src/widget/form/profileform.cpp" line="191"/>
<source>Choose a profile picture</source>
<translation>Scegli un&apos;immagine per il profilo</translation>
</message>
<message>
<location filename="../src/widget/form/profileform.cpp" line="186"/>
<location filename="../src/widget/form/profileform.cpp" line="193"/>
<location filename="../src/widget/form/profileform.cpp" line="214"/>
<location filename="../src/widget/form/profileform.cpp" line="200"/>
<location filename="../src/widget/form/profileform.cpp" line="207"/>
<location filename="../src/widget/form/profileform.cpp" line="228"/>
<source>Error</source>
<translation>Errore</translation>
</message>
<message>
<location filename="../src/widget/form/profileform.cpp" line="186"/>
<location filename="../src/widget/form/profileform.cpp" line="200"/>
<source>Unable to open this file</source>
<translation>Impossibile aprire il file</translation>
</message>
<message>
<location filename="../src/widget/form/profileform.cpp" line="193"/>
<location filename="../src/widget/form/profileform.cpp" line="207"/>
<source>Unable to read this image</source>
<translation>Impossibile leggere l&apos;immagine</translation>
</message>
<message>
<location filename="../src/widget/form/profileform.cpp" line="214"/>
<location filename="../src/widget/form/profileform.cpp" line="228"/>
<source>This image is too big</source>
<translation>L&apos;immagine è troppo grande</translation>
</message>
<message>
<location filename="../src/widget/form/profileform.cpp" line="226"/>
<location filename="../src/widget/form/profileform.cpp" line="240"/>
<source>Call active</source>
<comment>popup title</comment>
<translation>Chiamata in corso</translation>
</message>
<message>
<location filename="../src/widget/form/profileform.cpp" line="227"/>
<location filename="../src/widget/form/profileform.cpp" line="241"/>
<source>You can&apos;t switch profiles while a call is active!</source>
<comment>popup text</comment>
<translation>Non puoi cambiare profilo durante una chiamata!</translation>
</message>
<message>
<location filename="../src/widget/form/profileform.cpp" line="237"/>
<location filename="../src/widget/form/profileform.cpp" line="251"/>
<source>Rename &quot;%1&quot;</source>
<comment>renaming a profile</comment>
<translation>Rinomina &quot;%1&quot;</translation>
</message>
<message>
<location filename="../src/widget/form/profileform.cpp" line="245"/>
<location filename="../src/widget/form/profileform.cpp" line="259"/>
<source>Profile already exists</source>
<comment>rename confirm title</comment>
<translation>Profilo già esistente</translation>
</message>
<message>
<location filename="../src/widget/form/profileform.cpp" line="246"/>
<location filename="../src/widget/form/profileform.cpp" line="260"/>
<source>A profile named &quot;%1&quot; already exists. Do you want to erase it?</source>
<comment>rename confirm text</comment>
<translation>Un profilo chiamato &quot;%1&quot; esiste già. Vuoi sovrascriverlo?</translation>
</message>
<message>
<location filename="../src/widget/form/profileform.cpp" line="265"/>
<location filename="../src/widget/form/profileform.cpp" line="279"/>
<source>Export profile</source>
<comment>save dialog title</comment>
<translation>Esporta profilo</translation>
</message>
<message>
<location filename="../src/widget/form/profileform.cpp" line="267"/>
<location filename="../src/widget/form/profileform.cpp" line="281"/>
<source>Tox save file (*.tox)</source>
<comment>save dialog filter</comment>
<translation>Tox save file (*.tox)</translation>
</message>
<message>
<location filename="../src/widget/form/profileform.cpp" line="277"/>
<source>Failed to remove file</source>
<translation>Impossibile rimuovere il file</translation>
<location filename="../src/widget/form/profileform.cpp" line="286"/>
<location filename="../src/widget/form/profileform.cpp" line="394"/>
<source>Location not writable</source>
<comment>Title of permissions popup</comment>
<translation>Errore</translation>
</message>
<message>
<location filename="../src/widget/form/profileform.cpp" line="277"/>
<source>The file you chose to overwrite could not be removed first.</source>
<translation>Il file che hai scelto di sovrascrivere non può essere prima rimosso.</translation>
<location filename="../src/widget/form/profileform.cpp" line="286"/>
<location filename="../src/widget/form/profileform.cpp" line="394"/>
<source>You do not have permission to write that location. Choose another, or cancel the save dialog.</source>
<comment>text of permissions popup</comment>
<translation>Non hai sufficienti permessi per scrivere in questa locazione. Scegli un&apos;altra posizione, o annulla il salvataggio.</translation>
</message>
<message>
<location filename="../src/widget/form/profileform.cpp" line="283"/>
<location filename="../src/widget/form/profileform.cpp" line="387"/>
<source>Save</source>
<comment>save qr image</comment>
<translation>Salva</translation>
</message>
<message>
<location filename="../src/widget/form/profileform.cpp" line="389"/>
<source>Save QrCode (*.png)</source>
<comment>save dialog filter</comment>
<translation>Salva Codice QR (*.png)</translation>
</message>
<message>
<location filename="../src/widget/form/profileform.cpp" line="290"/>
<location filename="../src/widget/form/profileform.cpp" line="398"/>
<source>Failed to copy file</source>
<translation>Impossibile copiare il file</translation>
</message>
<message>
<location filename="../src/widget/form/profileform.cpp" line="283"/>
<location filename="../src/widget/form/profileform.cpp" line="290"/>
<location filename="../src/widget/form/profileform.cpp" line="398"/>
<source>The file you chose could not be written to.</source>
<translation>Il file che hai scelto non può essere copiato.</translation>
</message>
<message>
<location filename="../src/widget/form/profileform.cpp" line="291"/>
<location filename="../src/widget/form/profileform.cpp" line="298"/>
<source>Profile currently loaded</source>
<comment>current profile deletion warning title</comment>
<translation>Profilo attualmente in uso</translation>
</message>
<message>
<location filename="../src/widget/form/profileform.cpp" line="291"/>
<location filename="../src/widget/form/profileform.cpp" line="298"/>
<source>This profile is currently in use. Please load a different profile before deleting this one.</source>
<comment>current profile deletion warning text</comment>
<translation>Questo profilo è attualmente in uso. Per favore carica un profilo differente prima di eliminare questo.</translation>
</message>
<message>
<location filename="../src/widget/form/profileform.cpp" line="295"/>
<location filename="../src/widget/form/profileform.cpp" line="302"/>
<source>Deletion imminent!</source>
<comment>deletion confirmation title</comment>
<translation>Eliminazione imminente!</translation>
</message>
<message>
<location filename="../src/widget/form/profileform.cpp" line="296"/>
<location filename="../src/widget/form/profileform.cpp" line="303"/>
<source>Are you sure you want to delete this profile?</source>
<comment>deletion confirmation text</comment>
<translation>Sei sicuro di voler eliminare questo profilo?</translation>
</message>
<message>
<location filename="../src/widget/form/profileform.cpp" line="315"/>
<location filename="../src/widget/form/profileform.cpp" line="322"/>
<source>Import profile</source>
<comment>import dialog title</comment>
<translation>Importa profilo</translation>
</message>
<message>
<location filename="../src/widget/form/profileform.cpp" line="317"/>
<location filename="../src/widget/form/profileform.cpp" line="324"/>
<source>Tox save file (*.tox)</source>
<comment>import dialog filter</comment>
<translation>Tox save file (*.tox)</translation>
</message>
<message>
<location filename="../src/widget/form/profileform.cpp" line="327"/>
<location filename="../src/widget/form/profileform.cpp" line="333"/>
<source>Ignoring non-Tox file</source>
<comment>popup title</comment>
<translation>File ignorato</translation>
</message>
<message>
<location filename="../src/widget/form/profileform.cpp" line="328"/>
<location filename="../src/widget/form/profileform.cpp" line="334"/>
<source>Warning: you&apos;ve chosen a file that is not a Tox save file; ignoring.</source>
<comment>popup text</comment>
<translation>Attenzione: hai scelto un file che non contiente un profilo Tox.\nQuesto file verrà ignorato.</translation>
</message>
<message>
<location filename="../src/widget/form/profileform.cpp" line="334"/>
<location filename="../src/widget/form/profileform.cpp" line="340"/>
<source>Profile already exists</source>
<comment>import confirm title</comment>
<translation>Profilo già esistente</translation>
</message>
<message>
<location filename="../src/widget/form/profileform.cpp" line="335"/>
<location filename="../src/widget/form/profileform.cpp" line="341"/>
<source>A profile named &quot;%1&quot; already exists. Do you want to erase it?</source>
<comment>import confirm text</comment>
<translation>Un profilo chiamato &quot;%1&quot; esiste già. Vuoi sovrascriverlo?</translation>
@ -1822,27 +1886,27 @@ Verrà installata al riavvio del programma.</translation>
<translation>profilo</translation>
</message>
<message>
<location filename="../src/misc/style.cpp" line="69"/>
<location filename="../src/misc/style.cpp" line="71"/>
<source>Default</source>
<translation>Default</translation>
</message>
<message>
<location filename="../src/misc/style.cpp" line="69"/>
<location filename="../src/misc/style.cpp" line="71"/>
<source>Blue</source>
<translation>Blu</translation>
</message>
<message>
<location filename="../src/misc/style.cpp" line="69"/>
<location filename="../src/misc/style.cpp" line="71"/>
<source>Olive</source>
<translation>Oliva</translation>
</message>
<message>
<location filename="../src/misc/style.cpp" line="69"/>
<location filename="../src/misc/style.cpp" line="71"/>
<source>Red</source>
<translation>Rosso</translation>
</message>
<message>
<location filename="../src/misc/style.cpp" line="69"/>
<location filename="../src/misc/style.cpp" line="71"/>
<source>Violet</source>
<translation>Viola</translation>
</message>
@ -1851,11 +1915,6 @@ Verrà installata al riavvio del programma.</translation>
<source>Incoming call...</source>
<translation>Chiamata in arrivo...</translation>
</message>
<message>
<location filename="../src/chatlog/chatmessage.cpp" line="126"/>
<source>Busy...</source>
<translation>Occupato...</translation>
</message>
<message>
<location filename="../src/widget/toxuri.cpp" line="72"/>
<source>%1 here! Tox me maybe?</source>
@ -1863,6 +1922,11 @@ Verrà installata al riavvio del programma.</translation>
<translation>Ciao, sono %1.
Permettimi di aggiungerti alla mia lista contatti.</translation>
</message>
<message>
<location filename="../src/chatlog/chatmessage.cpp" line="126"/>
<source>Resizing</source>
<translation>Ridimensiona</translation>
</message>
</context>
<context>
<name>SetPasswordDialog</name>
@ -2009,7 +2073,7 @@ Se non sei sicuro, scegli &quot;No&quot;, così le informazioni inviate al serve
<context>
<name>Widget</name>
<message>
<location filename="../src/widget/widget.cpp" line="1051"/>
<location filename="../src/widget/widget.cpp" line="1031"/>
<source>&amp;Quit</source>
<translation>&amp;Esci</translation>
</message>
@ -2032,108 +2096,108 @@ Se non sei sicuro, scegli &quot;No&quot;, così le informazioni inviate al serve
<translation>Occupato</translation>
</message>
<message>
<location filename="../src/widget/widget.cpp" line="354"/>
<location filename="../src/widget/widget.cpp" line="347"/>
<source>Toxcore failed to start, the application will terminate after you close this message.</source>
<translation>Impossibile avviare Toxcore.\nqTox terminerà dopo che avrai chiuso questo messaggio.</translation>
</message>
<message>
<location filename="../src/widget/widget.cpp" line="363"/>
<location filename="../src/widget/widget.cpp" line="356"/>
<source>toxcore failed to start with your proxy settings. qTox cannot run; please modify your settings and restart.</source>
<comment>popup text</comment>
<translation>Impossibile avviare Toxcore con le tue impostazione proxy.\nqTox non può funzionare correttamente, per favore modifica le impostazioni e riavvia il programma.</translation>
</message>
<message>
<location filename="../src/widget/widget.cpp" line="414"/>
<location filename="../src/widget/widget.cpp" line="388"/>
<source>Add friend</source>
<translation>Aggiungi contatto</translation>
</message>
<message>
<location filename="../src/widget/widget.cpp" line="426"/>
<location filename="../src/widget/widget.cpp" line="401"/>
<source>File transfers</source>
<translation>Files trasferiti</translation>
</message>
<message>
<location filename="../src/widget/widget.cpp" line="436"/>
<location filename="../src/widget/widget.cpp" line="411"/>
<source>Executable file</source>
<comment>popup title</comment>
<translation>File eseguibile</translation>
</message>
<message>
<location filename="../src/widget/widget.cpp" line="436"/>
<location filename="../src/widget/widget.cpp" line="411"/>
<source>You have asked qTox to open an executable file. Executable files can potentially damage your computer. Are you sure want to open this file?</source>
<comment>popup text</comment>
<translation>Hai chiesto a qTox di aprire un file eseguibile. I files eseguibili possono danneggiare il tuo computer. Sei sicuro di voler aprire questo file?</translation>
</message>
<message>
<location filename="../src/widget/widget.cpp" line="492"/>
<location filename="../src/widget/widget.cpp" line="473"/>
<source>Settings</source>
<translation>Impostazioni</translation>
</message>
<message>
<location filename="../src/widget/widget.cpp" line="500"/>
<location filename="../src/widget/widget.cpp" line="481"/>
<source>Profile</source>
<translation>Profilo</translation>
</message>
<message>
<location filename="../src/widget/widget.cpp" line="609"/>
<location filename="../src/widget/widget.cpp" line="590"/>
<source>Couldn&apos;t request friendship</source>
<translation>Impossibile inviare la richiesta d&apos;amicizia</translation>
</message>
<message>
<location filename="../src/widget/widget.cpp" line="637"/>
<location filename="../src/widget/widget.cpp" line="618"/>
<source>away</source>
<comment>contact status</comment>
<translation>assente</translation>
</message>
<message>
<location filename="../src/widget/widget.cpp" line="639"/>
<location filename="../src/widget/widget.cpp" line="620"/>
<source>busy</source>
<comment>contact status</comment>
<translation>occupato</translation>
</message>
<message>
<location filename="../src/widget/widget.cpp" line="641"/>
<location filename="../src/widget/widget.cpp" line="622"/>
<source>offline</source>
<comment>contact status</comment>
<translation>offline</translation>
</message>
<message>
<location filename="../src/widget/widget.cpp" line="645"/>
<location filename="../src/widget/widget.cpp" line="626"/>
<source>online</source>
<comment>contact status</comment>
<translation>online</translation>
</message>
<message>
<location filename="../src/widget/widget.cpp" line="648"/>
<location filename="../src/widget/widget.cpp" line="629"/>
<source>%1 is now %2</source>
<comment>e.g. &quot;Dubslow is now online&quot;</comment>
<translation>%1 è ora %2</translation>
</message>
<message>
<location filename="../src/widget/widget.cpp" line="825"/>
<location filename="../src/widget/widget.cpp" line="805"/>
<source>Group invite</source>
<comment>popup title</comment>
<translation>Invito chat di gruppo</translation>
</message>
<message>
<location filename="../src/widget/widget.cpp" line="825"/>
<location filename="../src/widget/widget.cpp" line="805"/>
<source>%1 has invited you to a groupchat. Would you like to join?</source>
<comment>popup text</comment>
<translation>%1 ti ha invitato in una chat di gruppo. Vuoi partecipare?</translation>
</message>
<message>
<location filename="../src/widget/widget.cpp" line="880"/>
<location filename="../src/widget/widget.cpp" line="860"/>
<source>&lt;Unknown&gt;</source>
<comment>Placeholder when we don&apos;t know someone&apos;s name in a group chat</comment>
<translation>&lt;Sconosciuto&gt;</translation>
</message>
<message>
<location filename="../src/widget/widget.cpp" line="906"/>
<location filename="../src/widget/widget.cpp" line="886"/>
<source>%1 has set the title to %2</source>
<translation>%1 ha impostato il titolo in %2</translation>
</message>
<message>
<location filename="../src/widget/widget.cpp" line="1118"/>
<location filename="../src/widget/widget.cpp" line="1098"/>
<source>Message failed to send</source>
<translation>Impossibile inviare il messaggio</translation>
</message>

383
translations/lt.ts vendored

File diff suppressed because it is too large Load Diff

836
translations/ru.ts vendored

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

View File

@ -0,0 +1,45 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
width="50"
height="50"
id="svg2">
<defs
id="defs4" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
transform="translate(0,-1002.3622)"
id="layer1">
<rect
width="49.821426"
height="50.17857"
ry="25.089285"
x="-1.8160549e-08"
y="1002.3622"
id="rect2985"
style="fill:#6bc25f;fill-opacity:1;fill-rule:nonzero;stroke:none" />
<polygon
points="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 4.24,6.707 "
transform="matrix(2.0727105,0,0,2.0575931,12.878646,1018.1177)"
id="polygon3756"
style="fill:#ffffff" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 447 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 448 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 443 B

View File

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

View File

@ -1,72 +1,83 @@
QPushButton#green
{
background-color: transparent;
background-image: url(":/ui/callButton/callButton.png");
background-repeat: none;
background-color: #6bc260;
background-image: url(":/ui/callButton/callButton.svg");
background-repeat: none;
background-position: center;
border: none;
border-radius: 5px;
width: 50px;
height: 40px;
}
QPushButton#green:hover
{
background-image: url(":/ui/callButton/callButtonHover.png");
background-color: #79c76f;
}
QPushButton#green:pressed
{
background-image: url(":/ui/callButton/callButtonPressed.png");
background-color: #51b244;
}
QPushButton#red
{
background-color: transparent;
background-image: url(":/ui/callButton/callButtonRed.png");
background-repeat: none;
background-color: #c84e4e;
background-image: url(":/ui/callButton/callButton.svg");
background-repeat: none;
background-position: center;
border: none;
border-radius: 5px;
width: 50px;
height: 40px;
}
QPushButton#red:hover
{
background-image: url(":/ui/callButton/callButtonRedHover.png");
background-color: #e87474;
}
QPushButton#red:pressed
{
background-image: url(":/ui/callButton/callButtonRedPressed.png");
background-color: #df3b3b;
}
QPushButton#yellow
{
background-color: transparent;
background-image: url(":/ui/callButton/callButtonYellow.png");
background-repeat: none;
background-color: #e6e465;
background-image: url(":/ui/callButton/callButton.svg");
background-repeat: none;
background-position: center;
border: none;
border-radius: 5px;
width: 50px;
height: 40px;
}
QPushButton#yellow:hover
{
background-image: url(":/ui/callButton/callButtonYellowHover.png");
background-color: #e8e774;
}
QPushButton#yellow:pressed
{
background-image: url(":/ui/callButton/callButtonYellowPressed.png");
background-color: #e3e155;
}
QPushButton#grey
{
background-color: transparent;
background-image: url(":/ui/callButton/callButtonDisabled.png");
background-repeat: none;
background-color: #919191;
background-image: url(":/ui/callButton/callButton.svg");
background-repeat: none;
background-position: center;
border: none;
border-radius: 5px;
width: 50px;
height: 40px;
}
QPushButton:focus {
QPushButton:focus
{
outline: none;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 974 B

View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
width="100%"
height="100%"
viewBox="0 0 25 23"
id="Layer_1"
xml:space="preserve"><metadata
id="metadata9"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs7" /><path
d="m 19.546776,-0.03791866 c 0,0 -0.585151,-0.1170302 -0.819211,0.58515098 L 16.621021,5.4625006 c 0,0 -0.35109,0.7021812 0.234061,1.4043624 l 1.521392,1.9895133 c 0,0 0.585151,0.4681208 0.11703,1.1703017 -0.46812,0.585151 -2.691694,4.681208 -8.426174,7.255873 0,0 -0.702181,0.46812 -1.287332,-0.234061 C 8.3118772,16.346309 6.6734545,13.771645 5.6201827,14.239765 L 0.35382383,16.6974 c 0,0 -0.46812079,0 -0.35109059,0.936241 0.1170302,0.936242 0,5.266359 6.20260046,5.266359 7.3729023,0 18.6078013,-10.649748 18.6078013,-17.3204692 0,0 0,-5.61744946 -3.510906,-5.61744946 h -1.755453 z"
id="path3"
style="fill:#ffffff" /></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

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