Merge branch 'video' into develop

Conflicts:
	.travis.yml
	toxygen/calls.py
	toxygen/loginscreen.py
	toxygen/util.py
This commit is contained in:
ingvar1995 2017-06-20 19:58:59 +03:00
commit 43c71ec1a5
29 changed files with 1085 additions and 897 deletions

View File

@ -1,6 +1,7 @@
language: python language: python
python: python:
- "3.4" - "3.5"
- "3.6"
notifications: notifications:
email: false email: false
before_install: before_install:
@ -9,9 +10,10 @@ before_install:
- sudo apt-get install portaudio19-dev - sudo apt-get install portaudio19-dev
- sudo apt-get install libconfig-dev libvpx-dev check -qq - sudo apt-get install libconfig-dev libvpx-dev check -qq
install: install:
- pip install PySide --no-index --find-links https://parkin.github.io/python-wheelhouse/; - pip install sip
- python ~/virtualenv/python${TRAVIS_PYTHON_VERSION}/bin/pyside_postinstall.py -install - pip install pyqt5
- pip install pyaudio - pip install pyaudio
- pip install opencv-python
before_script: before_script:
# OPUS # OPUS
- wget http://downloads.xiph.org/releases/opus/opus-1.0.3.tar.gz - wget http://downloads.xiph.org/releases/opus/opus-1.0.3.tar.gz

View File

@ -8,15 +8,20 @@ import sys
version = program_version + '.0' version = program_version + '.0'
MODULES = [] MODULES = ['numpy', 'PyQt5']
if system() in ('Windows', 'Darwin'): if system() in ('Windows', 'Darwin'):
MODULES = ['PyAudio', 'PySide'] MODULES.append('PyAudio')
else: else:
try: try:
import pyaudio import pyaudio
except ImportError: except ImportError:
MODULES = ['PyAudio'] MODULES.append('PyAudio')
DEP_LINKS = []
if system() == 'Windows':
DEP_LINKS = [] # TODO: add opencv.whl
class InstallScript(install): class InstallScript(install):
@ -55,10 +60,12 @@ setup(name='Toxygen',
license='GPL3', license='GPL3',
packages=['toxygen', 'toxygen.plugins', 'toxygen.styles'], packages=['toxygen', 'toxygen.plugins', 'toxygen.styles'],
install_requires=MODULES, install_requires=MODULES,
dependency_links=DEP_LINKS,
include_package_data=True, include_package_data=True,
classifiers=[ classifiers=[
'Programming Language :: Python :: 3 :: Only', 'Programming Language :: Python :: 3 :: Only',
'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.5',
'Programming Language :: Python :: 3.6',
], ],
entry_points={ entry_points={
'console_scripts': ['toxygen=toxygen.main:main'], 'console_scripts': ['toxygen=toxygen.main:main'],

View File

@ -1,7 +1,4 @@
try: from PyQt5 import QtCore, QtGui, QtWidgets
from PySide import QtCore, QtGui
except ImportError:
from PyQt4 import QtCore, QtGui
import widgets import widgets
import profile import profile
import util import util
@ -17,11 +14,12 @@ class IncomingCallWidget(widgets.CenteredWidget):
super(IncomingCallWidget, self).__init__() super(IncomingCallWidget, self).__init__()
self.setWindowFlags(QtCore.Qt.CustomizeWindowHint | QtCore.Qt.WindowTitleHint | QtCore.Qt.WindowStaysOnTopHint) self.setWindowFlags(QtCore.Qt.CustomizeWindowHint | QtCore.Qt.WindowTitleHint | QtCore.Qt.WindowStaysOnTopHint)
self.resize(QtCore.QSize(500, 270)) self.resize(QtCore.QSize(500, 270))
self.avatar_label = QtGui.QLabel(self) self.avatar_label = QtWidgets.QLabel(self)
self.avatar_label.setGeometry(QtCore.QRect(10, 20, 64, 64)) self.avatar_label.setGeometry(QtCore.QRect(10, 20, 64, 64))
self.avatar_label.setScaledContents(False) self.avatar_label.setScaledContents(False)
self.name = widgets.DataLabel(self) self.name = widgets.DataLabel(self)
self.name.setGeometry(QtCore.QRect(90, 20, 300, 25)) self.name.setGeometry(QtCore.QRect(90, 20, 300, 25))
self._friend_number = friend_number
font = QtGui.QFont() font = QtGui.QFont()
font.setFamily(settings.Settings.get_instance()['font']) font.setFamily(settings.Settings.get_instance()['font'])
font.setPointSize(16) font.setPointSize(16)
@ -30,11 +28,11 @@ class IncomingCallWidget(widgets.CenteredWidget):
self.call_type = widgets.DataLabel(self) self.call_type = widgets.DataLabel(self)
self.call_type.setGeometry(QtCore.QRect(90, 55, 300, 25)) self.call_type.setGeometry(QtCore.QRect(90, 55, 300, 25))
self.call_type.setFont(font) self.call_type.setFont(font)
self.accept_audio = QtGui.QPushButton(self) self.accept_audio = QtWidgets.QPushButton(self)
self.accept_audio.setGeometry(QtCore.QRect(20, 100, 150, 150)) self.accept_audio.setGeometry(QtCore.QRect(20, 100, 150, 150))
self.accept_video = QtGui.QPushButton(self) self.accept_video = QtWidgets.QPushButton(self)
self.accept_video.setGeometry(QtCore.QRect(170, 100, 150, 150)) self.accept_video.setGeometry(QtCore.QRect(170, 100, 150, 150))
self.decline = QtGui.QPushButton(self) self.decline = QtWidgets.QPushButton(self)
self.decline.setGeometry(QtCore.QRect(320, 100, 150, 150)) self.decline.setGeometry(QtCore.QRect(320, 100, 150, 150))
pixmap = QtGui.QPixmap(util.curr_directory() + '/images/accept_audio.png') pixmap = QtGui.QPixmap(util.curr_directory() + '/images/accept_audio.png')
icon = QtGui.QIcon(pixmap) icon = QtGui.QIcon(pixmap)
@ -54,10 +52,10 @@ class IncomingCallWidget(widgets.CenteredWidget):
self.setWindowTitle(text) self.setWindowTitle(text)
self.name.setText(name) self.name.setText(name)
self.call_type.setText(text) self.call_type.setText(text)
pr = profile.Profile.get_instance() self._processing = False
self.accept_audio.clicked.connect(lambda: pr.accept_call(friend_number, True, False) or self.stop()) self.accept_audio.clicked.connect(self.accept_call_with_audio)
# self.accept_video.clicked.connect(lambda: pr.start_call(friend_number, True, True)) self.accept_video.clicked.connect(self.accept_call_with_video)
self.decline.clicked.connect(lambda: pr.stop_call(friend_number, False) or self.stop()) self.decline.clicked.connect(self.decline_call)
class SoundPlay(QtCore.QThread): class SoundPlay(QtCore.QThread):
@ -108,33 +106,29 @@ class IncomingCallWidget(widgets.CenteredWidget):
self.thread.wait() self.thread.wait()
self.close() self.close()
def accept_call_with_audio(self):
if self._processing:
return
self._processing = True
pr = profile.Profile.get_instance()
pr.accept_call(self._friend_number, True, False)
self.stop()
def accept_call_with_video(self):
if self._processing:
return
self._processing = True
pr = profile.Profile.get_instance()
pr.accept_call(self._friend_number, True, True)
self.stop()
def decline_call(self):
if self._processing:
return
self._processing = True
pr = profile.Profile.get_instance()
pr.stop_call(self._friend_number, False)
self.stop()
def set_pixmap(self, pixmap): def set_pixmap(self, pixmap):
self.avatar_label.setPixmap(pixmap) self.avatar_label.setPixmap(pixmap)
class AudioMessageRecorder(widgets.CenteredWidget):
def __init__(self, friend_number, name):
super(AudioMessageRecorder, self).__init__()
self.label = QtGui.QLabel(self)
self.label.setGeometry(QtCore.QRect(10, 20, 250, 20))
text = QtGui.QApplication.translate("MenuWindow", "Send audio message to friend {}", None, QtGui.QApplication.UnicodeUTF8)
self.label.setText(text.format(name))
self.record = QtGui.QPushButton(self)
self.record.setGeometry(QtCore.QRect(20, 100, 150, 150))
self.record.setText(QtGui.QApplication.translate("MenuWindow", "Start recording", None,
QtGui.QApplication.UnicodeUTF8))
self.record.clicked.connect(self.start_or_stop_recording)
self.recording = False
self.friend_num = friend_number
def start_or_stop_recording(self):
if not self.recording:
self.recording = True
self.record.setText(QtGui.QApplication.translate("MenuWindow", "Stop recording", None,
QtGui.QApplication.UnicodeUTF8))
else:
self.close()

View File

@ -1,8 +1,5 @@
from settings import * from settings import *
try: from PyQt5 import QtCore, QtGui
from PySide import QtCore, QtGui
except ImportError:
from PyQt4 import QtCore, QtGui
from toxcore_enums_and_consts import TOX_PUBLIC_KEY_SIZE from toxcore_enums_and_consts import TOX_PUBLIC_KEY_SIZE

View File

@ -1,7 +1,4 @@
try: from PyQt5 import QtCore, QtGui, QtWidgets
from PySide import QtCore
except ImportError:
from PyQt4 import QtCore
from notifications import * from notifications import *
from settings import Settings from settings import Settings
from profile import Profile from profile import Profile
@ -12,7 +9,8 @@ from plugin_support import PluginLoader
import queue import queue
import threading import threading
import util import util
import cv2
import numpy as np
# ----------------------------------------------------------------------------------------------------------------- # -----------------------------------------------------------------------------------------------------------------
# Threads # Threads
@ -225,7 +223,7 @@ def tox_file_recv(window, tray):
if not window.isActiveWindow(): if not window.isActiveWindow():
friend = profile.get_friend_by_number(friend_number) friend = profile.get_friend_by_number(friend_number)
if settings['notifications'] and profile.status != TOX_USER_STATUS['BUSY'] and not settings.locked: if settings['notifications'] and profile.status != TOX_USER_STATUS['BUSY'] and not settings.locked:
file_from = QtGui.QApplication.translate("Callback", "File from", None, QtGui.QApplication.UnicodeUTF8) file_from = QtWidgets.QApplication.translate("Callback", "File from")
invoke_in_main_thread(tray_notification, file_from + ' ' + friend.name, file_name, tray, window) invoke_in_main_thread(tray_notification, file_from + ' ' + friend.name, file_name, tray, window)
if settings['sound_notifications'] and profile.status != TOX_USER_STATUS['BUSY']: if settings['sound_notifications'] and profile.status != TOX_USER_STATUS['BUSY']:
sound_notification(SOUND_NOTIFICATION['FILE_TRANSFER']) sound_notification(SOUND_NOTIFICATION['FILE_TRANSFER'])
@ -315,11 +313,67 @@ def callback_audio(toxav, friend_number, samples, audio_samples_per_channel, aud
""" """
New audio chunk New audio chunk
""" """
Profile.get_instance().call.chunk( Profile.get_instance().call.audio_chunk(
bytes(samples[:audio_samples_per_channel * 2 * audio_channels_count]), bytes(samples[:audio_samples_per_channel * 2 * audio_channels_count]),
audio_channels_count, audio_channels_count,
rate) rate)
# -----------------------------------------------------------------------------------------------------------------
# Callbacks - video
# -----------------------------------------------------------------------------------------------------------------
def video_receive_frame(toxav, friend_number, width, height, y, u, v, ystride, ustride, vstride, user_data):
"""
Creates yuv frame from y, u, v and shows it using OpenCV
For yuv => bgr we need this YUV420 frame:
width
-------------------------
| |
| Y | height
| |
-------------------------
| | |
| U even | U odd | height // 4
| | |
-------------------------
| | |
| V even | V odd | height // 4
| | |
-------------------------
width // 2 width // 2
It can be created from initial y, u, v using slices
For more info see callback_video_receive_frame docs
"""
try:
y_size = abs(max(width, abs(ystride)))
u_size = abs(max(width // 2, abs(ustride)))
v_size = abs(max(width // 2, abs(vstride)))
y = np.asarray(y[:y_size * height], dtype=np.uint8).reshape(height, y_size)
u = np.asarray(u[:u_size * height // 2], dtype=np.uint8).reshape(height // 2, u_size)
v = np.asarray(v[:v_size * height // 2], dtype=np.uint8).reshape(height // 2, v_size)
width -= width % 4
height -= height % 4
frame = np.zeros((int(height * 1.5), width), dtype=np.uint8)
frame[:height, :] = y[:height, :width]
frame[height:height * 5 // 4, :width // 2] = u[:height // 2:2, :width // 2]
frame[height:height * 5 // 4, width // 2:] = u[1:height // 2:2, :width // 2]
frame[height * 5 // 4:, :width // 2] = v[:height // 2:2, :width // 2]
frame[height * 5 // 4:, width // 2:] = v[1:height // 2:2, :width // 2]
frame = cv2.cvtColor(frame, cv2.COLOR_YUV2BGR_I420)
invoke_in_main_thread(cv2.imshow, str(friend_number), frame)
except Exception as ex:
print(ex)
# ----------------------------------------------------------------------------------------------------------------- # -----------------------------------------------------------------------------------------------------------------
# Callbacks - initialization # Callbacks - initialization
@ -353,7 +407,7 @@ def init_callbacks(tox, window, tray):
toxav.callback_call_state(call_state, 0) toxav.callback_call_state(call_state, 0)
toxav.callback_call(call, 0) toxav.callback_call(call, 0)
toxav.callback_audio_receive_frame(callback_audio, 0) toxav.callback_audio_receive_frame(callback_audio, 0)
toxav.callback_video_receive_frame(video_receive_frame, 0)
tox.callback_friend_lossless_packet(lossless_packet, 0) tox.callback_friend_lossless_packet(lossless_packet, 0)
tox.callback_friend_lossy_packet(lossy_packet, 0) tox.callback_friend_lossy_packet(lossy_packet, 0)

View File

@ -3,14 +3,68 @@ import time
import threading import threading
import settings import settings
from toxav_enums import * from toxav_enums import *
# TODO: play sound until outgoing call will be started or cancelled and add timeout import cv2
# TODO: add widget for call import itertools
import numpy as np
# TODO: play sound until outgoing call will be started or cancelled
CALL_TYPE = {
'NONE': 0, class Call:
'AUDIO': 1,
'VIDEO': 2 def __init__(self, out_audio, out_video, in_audio=False, in_video=False):
} self._in_audio = in_audio
self._in_video = in_video
self._out_audio = out_audio
self._out_video = out_video
self._is_active = False
def get_is_active(self):
return self._is_active
def set_is_active(self, value):
self._is_active = value
is_active = property(get_is_active, set_is_active)
# -----------------------------------------------------------------------------------------------------------------
# Audio
# -----------------------------------------------------------------------------------------------------------------
def get_in_audio(self):
return self._in_audio
def set_in_audio(self, value):
self._in_audio = value
in_audio = property(get_in_audio, set_in_audio)
def get_out_audio(self):
return self._out_audio
def set_out_audio(self, value):
self._out_audio = value
out_audio = property(get_out_audio, set_out_audio)
# -----------------------------------------------------------------------------------------------------------------
# Video
# -----------------------------------------------------------------------------------------------------------------
def get_in_video(self):
return self._in_video
def set_in_video(self, value):
self._in_video = value
in_video = property(get_in_video, set_in_video)
def get_out_video(self):
return self._out_video
def set_out_video(self, value):
self._in_video = value
out_video = property(get_out_video, set_out_video)
class AV: class AV:
@ -19,7 +73,7 @@ class AV:
self._toxav = toxav self._toxav = toxav
self._running = True self._running = True
self._calls = {} # dict: key - friend number, value - call type self._calls = {} # dict: key - friend number, value - Call instance
self._audio = None self._audio = None
self._audio_stream = None self._audio_stream = None
@ -32,27 +86,75 @@ class AV:
self._audio_duration = 60 self._audio_duration = 60
self._audio_sample_count = self._audio_rate * self._audio_channels * self._audio_duration // 1000 self._audio_sample_count = self._audio_rate * self._audio_channels * self._audio_duration // 1000
def __contains__(self, friend_number): self._video = None
return friend_number in self._calls self._video_thread = None
self._video_running = False
def __call__(self, friend_number, audio, video): self._video_width = 640
"""Call friend with specified number""" self._video_height = 480
self._toxav.call(friend_number, 32 if audio else 0, 5000 if video else 0)
self._calls[friend_number] = CALL_TYPE['AUDIO']
self.start_audio_thread()
def finish_call(self, friend_number, by_friend=False):
if not by_friend:
self._toxav.call_control(friend_number, TOXAV_CALL_CONTROL['CANCEL'])
if friend_number in self._calls:
del self._calls[friend_number]
if not len(self._calls):
self.stop_audio_thread()
def stop(self): def stop(self):
self._running = False self._running = False
self.stop_audio_thread() self.stop_audio_thread()
self.stop_video_thread()
def __contains__(self, friend_number):
return friend_number in self._calls
# -----------------------------------------------------------------------------------------------------------------
# Calls
# -----------------------------------------------------------------------------------------------------------------
def __call__(self, friend_number, audio, video):
"""Call friend with specified number"""
self._toxav.call(friend_number, 32 if audio else 0, 5000 if video else 0)
self._calls[friend_number] = Call(audio, video)
threading.Timer(30.0, lambda: self.finish_not_started_call(friend_number)).start()
def accept_call(self, friend_number, audio_enabled, video_enabled):
if self._running:
self._calls[friend_number] = Call(audio_enabled, video_enabled)
self._toxav.answer(friend_number, 32 if audio_enabled else 0, 5000 if video_enabled else 0)
if audio_enabled:
self.start_audio_thread()
if video_enabled:
self.start_video_thread()
def finish_call(self, friend_number, by_friend=False):
if not by_friend:
self._toxav.call_control(friend_number, TOXAV_CALL_CONTROL['CANCEL'])
if friend_number in self._calls:
del self._calls[friend_number]
if not len(list(filter(lambda c: c.out_audio, self._calls))):
self.stop_audio_thread()
if not len(list(filter(lambda c: c.out_video, self._calls))):
self.stop_video_thread()
def finish_not_started_call(self, friend_number):
if friend_number in self:
call = self._calls[friend_number]
if not call.is_active:
self.finish_call(friend_number)
def toxav_call_state_cb(self, friend_number, state):
"""
New call state
"""
call = self._calls[friend_number]
call.is_active = True
call.in_audio = state | TOXAV_FRIEND_CALL_STATE['SENDING_A']
call.in_video = state | TOXAV_FRIEND_CALL_STATE['SENDING_V']
if state | TOXAV_FRIEND_CALL_STATE['ACCEPTING_A'] and call.out_audio:
self.start_audio_thread()
if state | TOXAV_FRIEND_CALL_STATE['ACCEPTING_V'] and call.out_video:
self.start_video_thread()
# -----------------------------------------------------------------------------------------------------------------
# Threads
# -----------------------------------------------------------------------------------------------------------------
def start_audio_thread(self): def start_audio_thread(self):
""" """
@ -92,7 +194,37 @@ class AV:
self._out_stream.close() self._out_stream.close()
self._out_stream = None self._out_stream = None
def chunk(self, samples, channels_count, rate): def start_video_thread(self):
if self._video_thread is not None:
return
self._video_running = True
s = settings.Settings.get_instance()
self._video_width = s.video['width']
self._video_height = s.video['height']
self._video = cv2.VideoCapture(s.video['device'])
self._video.set(cv2.CAP_PROP_FPS, 25)
self._video.set(cv2.CAP_PROP_FRAME_WIDTH, self._video_width)
self._video.set(cv2.CAP_PROP_FRAME_HEIGHT, self._video_height)
self._video_thread = threading.Thread(target=self.send_video)
self._video_thread.start()
def stop_video_thread(self):
if self._video_thread is None:
return
self._video_running = False
self._video_thread.join()
self._video_thread = None
self._video = None
# -----------------------------------------------------------------------------------------------------------------
# Incoming chunks
# -----------------------------------------------------------------------------------------------------------------
def audio_chunk(self, samples, channels_count, rate):
""" """
Incoming chunk Incoming chunk
""" """
@ -105,6 +237,10 @@ class AV:
output=True) output=True)
self._out_stream.write(samples) self._out_stream.write(samples)
# -----------------------------------------------------------------------------------------------------------------
# AV sending
# -----------------------------------------------------------------------------------------------------------------
def send_audio(self): def send_audio(self):
""" """
This method sends audio to friends This method sends audio to friends
@ -114,10 +250,10 @@ class AV:
try: try:
pcm = self._audio_stream.read(self._audio_sample_count) pcm = self._audio_stream.read(self._audio_sample_count)
if pcm: if pcm:
for friend in self._calls: for friend_num in self._calls:
if self._calls[friend] & 1: if self._calls[friend_num].out_audio:
try: try:
self._toxav.audio_send_frame(friend, pcm, self._audio_sample_count, self._toxav.audio_send_frame(friend_num, pcm, self._audio_sample_count,
self._audio_channels, self._audio_rate) self._audio_channels, self._audio_rate)
except: except:
pass pass
@ -126,18 +262,70 @@ class AV:
time.sleep(0.01) time.sleep(0.01)
def accept_call(self, friend_number, audio_enabled, video_enabled): def send_video(self):
if self._running:
self._calls[friend_number] = int(video_enabled) * 2 + int(audio_enabled)
self._toxav.answer(friend_number, 32 if audio_enabled else 0, 5000 if video_enabled else 0)
self.start_audio_thread()
def toxav_call_state_cb(self, friend_number, state):
""" """
New call state This method sends video to friends
""" """
if self._running: while self._video_running:
try:
result, frame = self._video.read()
if result:
height, width, channels = frame.shape
for friend_num in self._calls:
if self._calls[friend_num].out_video:
try:
y, u, v = self.convert_bgr_to_yuv(frame)
self._toxav.video_send_frame(friend_num, width, height, y, u, v)
except Exception as e:
print(e)
except Exception as e:
print(e)
if state & TOXAV_FRIEND_CALL_STATE['ACCEPTING_A']: time.sleep(0.01)
self._calls[friend_number] |= 1
def convert_bgr_to_yuv(self, frame):
"""
:param frame: input bgr frame
:return y, u, v: y, u, v values of frame
How this function works:
OpenCV creates YUV420 frame from BGR
This frame has following structure and size:
width, height - dim of input frame
width, height * 1.5 - dim of output frame
width
-------------------------
| |
| Y | height
| |
-------------------------
| | |
| U even | U odd | height // 4
| | |
-------------------------
| | |
| V even | V odd | height // 4
| | |
-------------------------
width // 2 width // 2
Y, U, V can be extracted using slices and joined in one list using itertools.chain.from_iterable()
Function returns bytes(y), bytes(u), bytes(v), because it is required for ctypes
"""
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2YUV_I420)
y = frame[:self._video_height, :]
y = list(itertools.chain.from_iterable(y))
u = np.zeros((self._video_height // 2, self._video_width // 2), dtype=np.int)
u[::2, :] = frame[self._video_height:self._video_height * 5 // 4, :self._video_width // 2]
u[1::2, :] = frame[self._video_height:self._video_height * 5 // 4, self._video_width // 2:]
u = list(itertools.chain.from_iterable(u))
v = np.zeros((self._video_height // 2, self._video_width // 2), dtype=np.int)
v[::2, :] = frame[self._video_height * 5 // 4:, :self._video_width // 2]
v[1::2, :] = frame[self._video_height * 5 // 4:, self._video_width // 2:]
v = list(itertools.chain.from_iterable(v))
return bytes(y), bytes(u), bytes(v)

View File

@ -1,7 +1,4 @@
try: from PyQt5 import QtCore, QtGui
from PySide import QtCore, QtGui
except ImportError:
from PyQt4 import QtCore, QtGui
from history import * from history import *
import basecontact import basecontact
import util import util

View File

@ -4,11 +4,7 @@ from os import remove, rename, chdir
from time import time, sleep from time import time, sleep
from tox import Tox from tox import Tox
import settings import settings
try: from PyQt5 import QtCore
from PySide import QtCore
except ImportError:
from PyQt4 import QtCore
QtCore.Signal = QtCore.pyqtSignal
TOX_FILE_TRANSFER_STATE = { TOX_FILE_TRANSFER_STATE = {
@ -38,12 +34,12 @@ def is_inline(file_name):
class StateSignal(QtCore.QObject): class StateSignal(QtCore.QObject):
signal = QtCore.Signal(int, float, int) # state, progress, time in sec signal = QtCore.pyqtSignal(int, float, int) # state, progress, time in sec
class TransferFinishedSignal(QtCore.QObject): class TransferFinishedSignal(QtCore.QObject):
signal = QtCore.Signal(int, int) # friend number, file number signal = QtCore.pyqtSignal(int, int) # friend number, file number
class FileTransfer(QtCore.QObject): class FileTransfer(QtCore.QObject):

View File

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@ -1,7 +1,4 @@
try: from PyQt5 import QtWidgets, QtCore
from PySide import QtCore, QtGui
except ImportError:
from PyQt4 import QtCore, QtGui
from list_items import * from list_items import *
@ -13,7 +10,7 @@ class ItemsFactory:
def friend_item(self): def friend_item(self):
item = ContactItem() item = ContactItem()
elem = QtGui.QListWidgetItem(self._friends) elem = QtWidgets.QListWidgetItem(self._friends)
elem.setSizeHint(QtCore.QSize(250, item.height())) elem.setSizeHint(QtCore.QSize(250, item.height()))
self._friends.addItem(elem) self._friends.addItem(elem)
self._friends.setItemWidget(elem, item) self._friends.setItemWidget(elem, item)
@ -23,7 +20,7 @@ class ItemsFactory:
item = MessageItem(text, time, name, sent, message_type, self._messages) item = MessageItem(text, time, name, sent, message_type, self._messages)
if pixmap is not None: if pixmap is not None:
item.set_avatar(pixmap) item.set_avatar(pixmap)
elem = QtGui.QListWidgetItem() elem = QtWidgets.QListWidgetItem()
elem.setSizeHint(QtCore.QSize(self._messages.width(), item.height())) elem.setSizeHint(QtCore.QSize(self._messages.width(), item.height()))
if append: if append:
self._messages.addItem(elem) self._messages.addItem(elem)
@ -33,7 +30,7 @@ class ItemsFactory:
return item return item
def inline_item(self, data, append): def inline_item(self, data, append):
elem = QtGui.QListWidgetItem() elem = QtWidgets.QListWidgetItem()
item = InlineImageItem(data, self._messages.width(), elem) item = InlineImageItem(data, self._messages.width(), elem)
elem.setSizeHint(QtCore.QSize(self._messages.width(), item.height())) elem.setSizeHint(QtCore.QSize(self._messages.width(), item.height()))
if append: if append:
@ -49,7 +46,7 @@ class ItemsFactory:
name, name,
time, time,
self._messages.width()) self._messages.width())
elem = QtGui.QListWidgetItem() elem = QtWidgets.QListWidgetItem()
elem.setSizeHint(QtCore.QSize(self._messages.width() - 30, 34)) elem.setSizeHint(QtCore.QSize(self._messages.width() - 30, 34))
if append: if append:
self._messages.addItem(elem) self._messages.addItem(elem)
@ -61,7 +58,7 @@ class ItemsFactory:
def file_transfer_item(self, data, append): def file_transfer_item(self, data, append):
data.append(self._messages.width()) data.append(self._messages.width())
item = FileTransferItem(*data) item = FileTransferItem(*data)
elem = QtGui.QListWidgetItem() elem = QtWidgets.QListWidgetItem()
elem.setSizeHint(QtCore.QSize(self._messages.width() - 30, 34)) elem.setSizeHint(QtCore.QSize(self._messages.width() - 30, 34))
if append: if append:
self._messages.addItem(elem) self._messages.addItem(elem)

View File

@ -1,9 +1,5 @@
from toxcore_enums_and_consts import * from toxcore_enums_and_consts import *
try: from PyQt5 import QtCore, QtGui, QtWidgets
from PySide import QtCore, QtGui
except ImportError:
from PyQt4 import QtCore, QtGui
QtCore.Slot = QtCore.pyqtSlot
import profile import profile
from file_transfers import TOX_FILE_TRANSFER_STATE, PAUSED_FILE_TRANSFERS, DO_NOT_SHOW_ACCEPT_BUTTON, ACTIVE_FILE_TRANSFERS, SHOW_PROGRESS_BAR from file_transfers import TOX_FILE_TRANSFER_STATE, PAUSED_FILE_TRANSFERS, DO_NOT_SHOW_ACCEPT_BUTTON, ACTIVE_FILE_TRANSFERS, SHOW_PROGRESS_BAR
from util import curr_directory, convert_time, curr_time from util import curr_directory, convert_time, curr_time
@ -14,7 +10,7 @@ import settings
import re import re
class MessageEdit(QtGui.QTextBrowser): class MessageEdit(QtWidgets.QTextBrowser):
def __init__(self, text, width, message_type, parent=None): def __init__(self, text, width, message_type, parent=None):
super(MessageEdit, self).__init__(parent) super(MessageEdit, self).__init__(parent)
@ -46,7 +42,7 @@ class MessageEdit(QtGui.QTextBrowser):
def contextMenuEvent(self, event): def contextMenuEvent(self, event):
menu = create_menu(self.createStandardContextMenu(event.pos())) menu = create_menu(self.createStandardContextMenu(event.pos()))
quote = menu.addAction(QtGui.QApplication.translate("MainWindow", 'Quote selected text', None, QtGui.QApplication.UnicodeUTF8)) quote = menu.addAction(QtWidgets.QApplication.translate("MainWindow", 'Quote selected text'))
quote.triggered.connect(self.quote_text) quote.triggered.connect(self.quote_text)
text = self.textCursor().selection().toPlainText() text = self.textCursor().selection().toPlainText()
if not text: if not text:
@ -55,7 +51,7 @@ class MessageEdit(QtGui.QTextBrowser):
import plugin_support import plugin_support
submenu = plugin_support.PluginLoader.get_instance().get_message_menu(menu, text) submenu = plugin_support.PluginLoader.get_instance().get_message_menu(menu, text)
if len(submenu): if len(submenu):
plug = menu.addMenu(QtGui.QApplication.translate("MainWindow", 'Plugins', None, QtGui.QApplication.UnicodeUTF8)) plug = menu.addMenu(QtWidgets.QApplication.translate("MainWindow", 'Plugins'))
plug.addActions(submenu) plug.addActions(submenu)
menu.popup(event.globalPos()) menu.popup(event.globalPos())
menu.exec_(event.globalPos()) menu.exec_(event.globalPos())
@ -123,12 +119,12 @@ class MessageEdit(QtGui.QTextBrowser):
return text return text
class MessageItem(QtGui.QWidget): class MessageItem(QtWidgets.QWidget):
""" """
Message in messages list Message in messages list
""" """
def __init__(self, text, time, user='', sent=True, message_type=TOX_MESSAGE_TYPE['NORMAL'], parent=None): def __init__(self, text, time, user='', sent=True, message_type=TOX_MESSAGE_TYPE['NORMAL'], parent=None):
QtGui.QWidget.__init__(self, parent) QtWidgets.QWidget.__init__(self, parent)
self.name = DataLabel(self) self.name = DataLabel(self)
self.name.setGeometry(QtCore.QRect(2, 2, 95, 23)) self.name.setGeometry(QtCore.QRect(2, 2, 95, 23))
self.name.setTextFormat(QtCore.Qt.PlainText) self.name.setTextFormat(QtCore.Qt.PlainText)
@ -139,7 +135,7 @@ class MessageItem(QtGui.QWidget):
self.name.setFont(font) self.name.setFont(font)
self.name.setText(user) self.name.setText(user)
self.time = QtGui.QLabel(self) self.time = QtWidgets.QLabel(self)
self.time.setGeometry(QtCore.QRect(parent.width() - 60, 0, 50, 25)) self.time.setGeometry(QtCore.QRect(parent.width() - 60, 0, 50, 25))
font.setPointSize(10) font.setPointSize(10)
font.setBold(False) font.setBold(False)
@ -164,9 +160,9 @@ class MessageItem(QtGui.QWidget):
def mouseReleaseEvent(self, event): def mouseReleaseEvent(self, event):
if event.button() == QtCore.Qt.RightButton and event.x() > self.time.x(): if event.button() == QtCore.Qt.RightButton and event.x() > self.time.x():
self.listMenu = QtGui.QMenu() self.listMenu = QtWidgets.QMenu()
delete_item = self.listMenu.addAction(QtGui.QApplication.translate("MainWindow", 'Delete message', None, QtGui.QApplication.UnicodeUTF8)) delete_item = self.listMenu.addAction(QtWidgets.QApplication.translate("MainWindow", 'Delete message'))
self.connect(delete_item, QtCore.SIGNAL("triggered()"), self.delete) delete_item.triggered.connect(self.delete)
parent_position = self.time.mapToGlobal(QtCore.QPoint(0, 0)) parent_position = self.time.mapToGlobal(QtCore.QPoint(0, 0))
self.listMenu.move(parent_position) self.listMenu.move(parent_position)
self.listMenu.show() self.listMenu.show()
@ -216,16 +212,16 @@ class MessageItem(QtGui.QWidget):
return text return text
class ContactItem(QtGui.QWidget): class ContactItem(QtWidgets.QWidget):
""" """
Contact in friends list Contact in friends list
""" """
def __init__(self, parent=None): def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent) QtWidgets.QWidget.__init__(self, parent)
mode = settings.Settings.get_instance()['compact_mode'] mode = settings.Settings.get_instance()['compact_mode']
self.setBaseSize(QtCore.QSize(250, 40 if mode else 70)) self.setBaseSize(QtCore.QSize(250, 40 if mode else 70))
self.avatar_label = QtGui.QLabel(self) self.avatar_label = QtWidgets.QLabel(self)
size = 32 if mode else 64 size = 32 if mode else 64
self.avatar_label.setGeometry(QtCore.QRect(3, 4, size, size)) self.avatar_label.setGeometry(QtCore.QRect(3, 4, size, size))
self.avatar_label.setScaledContents(False) self.avatar_label.setScaledContents(False)
@ -248,14 +244,14 @@ class ContactItem(QtGui.QWidget):
self.messages.setGeometry(QtCore.QRect(20 if mode else 52, 20 if mode else 50, 30, 20)) self.messages.setGeometry(QtCore.QRect(20 if mode else 52, 20 if mode else 50, 30, 20))
class StatusCircle(QtGui.QWidget): class StatusCircle(QtWidgets.QWidget):
""" """
Connection status Connection status
""" """
def __init__(self, parent): def __init__(self, parent):
QtGui.QWidget.__init__(self, parent) QtWidgets.QWidget.__init__(self, parent)
self.setGeometry(0, 0, 32, 32) self.setGeometry(0, 0, 32, 32)
self.label = QtGui.QLabel(self) self.label = QtWidgets.QLabel(self)
self.label.setGeometry(QtCore.QRect(0, 0, 32, 32)) self.label.setGeometry(QtCore.QRect(0, 0, 32, 32))
self.unread = False self.unread = False
@ -281,12 +277,12 @@ class StatusCircle(QtGui.QWidget):
self.label.setPixmap(pixmap) self.label.setPixmap(pixmap)
class UnreadMessagesCount(QtGui.QWidget): class UnreadMessagesCount(QtWidgets.QWidget):
def __init__(self, parent=None): def __init__(self, parent=None):
super(UnreadMessagesCount, self).__init__(parent) super(UnreadMessagesCount, self).__init__(parent)
self.resize(30, 20) self.resize(30, 20)
self.label = QtGui.QLabel(self) self.label = QtWidgets.QLabel(self)
self.label.setGeometry(QtCore.QRect(0, 0, 30, 20)) self.label.setGeometry(QtCore.QRect(0, 0, 30, 20))
self.label.setVisible(False) self.label.setVisible(False)
font = QtGui.QFont() font = QtGui.QFont()
@ -308,11 +304,11 @@ class UnreadMessagesCount(QtGui.QWidget):
self.label.setVisible(False) self.label.setVisible(False)
class FileTransferItem(QtGui.QListWidget): class FileTransferItem(QtWidgets.QListWidget):
def __init__(self, file_name, size, time, user, friend_number, file_number, state, width, parent=None): def __init__(self, file_name, size, time, user, friend_number, file_number, state, width, parent=None):
QtGui.QListWidget.__init__(self, parent) QtWidgets.QListWidget.__init__(self, parent)
self.resize(QtCore.QSize(width, 34)) self.resize(QtCore.QSize(width, 34))
if state == TOX_FILE_TRANSFER_STATE['CANCELLED']: if state == TOX_FILE_TRANSFER_STATE['CANCELLED']:
self.setStyleSheet('QListWidget { border: 1px solid #B40404; }') self.setStyleSheet('QListWidget { border: 1px solid #B40404; }')
@ -332,14 +328,14 @@ class FileTransferItem(QtGui.QListWidget):
self.name.setFont(font) self.name.setFont(font)
self.name.setText(user) self.name.setText(user)
self.time = QtGui.QLabel(self) self.time = QtWidgets.QLabel(self)
self.time.setGeometry(QtCore.QRect(width - 60, 7, 50, 25)) self.time.setGeometry(QtCore.QRect(width - 60, 7, 50, 25))
font.setPointSize(10) font.setPointSize(10)
font.setBold(False) font.setBold(False)
self.time.setFont(font) self.time.setFont(font)
self.time.setText(convert_time(time)) self.time.setText(convert_time(time))
self.cancel = QtGui.QPushButton(self) self.cancel = QtWidgets.QPushButton(self)
self.cancel.setGeometry(QtCore.QRect(width - 125, 2, 30, 30)) self.cancel.setGeometry(QtCore.QRect(width - 125, 2, 30, 30))
pixmap = QtGui.QPixmap(curr_directory() + '/images/decline.png') pixmap = QtGui.QPixmap(curr_directory() + '/images/decline.png')
icon = QtGui.QIcon(pixmap) icon = QtGui.QIcon(pixmap)
@ -349,7 +345,7 @@ class FileTransferItem(QtGui.QListWidget):
self.cancel.clicked.connect(lambda: self.cancel_transfer(friend_number, file_number)) self.cancel.clicked.connect(lambda: self.cancel_transfer(friend_number, file_number))
self.cancel.setStyleSheet('QPushButton:hover { border: 1px solid #3A3939; background-color: none;}') self.cancel.setStyleSheet('QPushButton:hover { border: 1px solid #3A3939; background-color: none;}')
self.accept_or_pause = QtGui.QPushButton(self) self.accept_or_pause = QtWidgets.QPushButton(self)
self.accept_or_pause.setGeometry(QtCore.QRect(width - 170, 2, 30, 30)) self.accept_or_pause.setGeometry(QtCore.QRect(width - 170, 2, 30, 30))
if state == TOX_FILE_TRANSFER_STATE['INCOMING_NOT_STARTED']: if state == TOX_FILE_TRANSFER_STATE['INCOMING_NOT_STARTED']:
self.accept_or_pause.setVisible(True) self.accept_or_pause.setVisible(True)
@ -366,7 +362,7 @@ class FileTransferItem(QtGui.QListWidget):
self.accept_or_pause.setStyleSheet('QPushButton:hover { border: 1px solid #3A3939; background-color: none}') self.accept_or_pause.setStyleSheet('QPushButton:hover { border: 1px solid #3A3939; background-color: none}')
self.pb = QtGui.QProgressBar(self) self.pb = QtWidgets.QProgressBar(self)
self.pb.setGeometry(QtCore.QRect(100, 7, 100, 20)) self.pb.setGeometry(QtCore.QRect(100, 7, 100, 20))
self.pb.setValue(0) self.pb.setValue(0)
self.pb.setStyleSheet('QProgressBar { background-color: #302F2F; }') self.pb.setStyleSheet('QProgressBar { background-color: #302F2F; }')
@ -387,7 +383,7 @@ class FileTransferItem(QtGui.QListWidget):
self.file_name.setText(file_data) self.file_name.setText(file_data)
self.file_name.setToolTip(file_name) self.file_name.setToolTip(file_name)
self.saved_name = file_name self.saved_name = file_name
self.time_left = QtGui.QLabel(self) self.time_left = QtWidgets.QLabel(self)
self.time_left.setGeometry(QtCore.QRect(width - 92, 7, 30, 20)) self.time_left.setGeometry(QtCore.QRect(width - 92, 7, 30, 20))
font.setPointSize(10) font.setPointSize(10)
self.time_left.setFont(font) self.time_left.setFont(font)
@ -405,10 +401,10 @@ class FileTransferItem(QtGui.QListWidget):
def accept_or_pause_transfer(self, friend_number, file_number, size): def accept_or_pause_transfer(self, friend_number, file_number, size):
if self.state == TOX_FILE_TRANSFER_STATE['INCOMING_NOT_STARTED']: if self.state == TOX_FILE_TRANSFER_STATE['INCOMING_NOT_STARTED']:
directory = QtGui.QFileDialog.getExistingDirectory(self, directory = QtWidgets.QFileDialog.getExistingDirectory(self,
QtGui.QApplication.translate("MainWindow", 'Choose folder', None, QtGui.QApplication.UnicodeUTF8), QtWidgets.QApplication.translate("MainWindow", 'Choose folder'),
curr_directory(), curr_directory(),
QtGui.QFileDialog.ShowDirsOnly | QtGui.QFileDialog.DontUseNativeDialog) QtWidgets.QFileDialog.ShowDirsOnly | QtWidgets.QFileDialog.DontUseNativeDialog)
self.pb.setVisible(True) self.pb.setVisible(True)
if directory: if directory:
pr = profile.Profile.get_instance() pr = profile.Profile.get_instance()
@ -432,8 +428,7 @@ class FileTransferItem(QtGui.QListWidget):
self.accept_or_pause.setIcon(icon) self.accept_or_pause.setIcon(icon)
self.accept_or_pause.setIconSize(QtCore.QSize(30, 30)) self.accept_or_pause.setIconSize(QtCore.QSize(30, 30))
@QtCore.Slot(int, float, int) def update_transfer_state(self, state, progress, time):
def update(self, state, progress, time):
self.pb.setValue(int(progress * 100)) self.pb.setValue(int(progress * 100))
if time + 1: if time + 1:
m, s = divmod(time, 60) m, s = divmod(time, 60)
@ -496,14 +491,14 @@ class UnsentFileItem(FileTransferItem):
pr.cancel_not_started_transfer(self._time) pr.cancel_not_started_transfer(self._time)
class InlineImageItem(QtGui.QScrollArea): class InlineImageItem(QtWidgets.QScrollArea):
def __init__(self, data, width, elem): def __init__(self, data, width, elem):
QtGui.QScrollArea.__init__(self) QtWidgets.QScrollArea.__init__(self)
self.setFocusPolicy(QtCore.Qt.NoFocus) self.setFocusPolicy(QtCore.Qt.NoFocus)
self._elem = elem self._elem = elem
self._image_label = QtGui.QLabel(self) self._image_label = QtWidgets.QLabel(self)
self._image_label.raise_() self._image_label.raise_()
self.setWidget(self._image_label) self.setWidget(self._image_label)
self._image_label.setScaledContents(False) self._image_label.setScaledContents(False)
@ -537,18 +532,15 @@ class InlineImageItem(QtGui.QScrollArea):
self._full_size = not self._full_size self._full_size = not self._full_size
self._elem.setSizeHint(QtCore.QSize(self.width(), self.height())) self._elem.setSizeHint(QtCore.QSize(self.width(), self.height()))
elif event.button() == QtCore.Qt.RightButton: # save inline elif event.button() == QtCore.Qt.RightButton: # save inline
directory = QtGui.QFileDialog.getExistingDirectory(self, directory = QtWidgets.QFileDialog.getExistingDirectory(self,
QtGui.QApplication.translate("MainWindow", QtWidgets.QApplication.translate("MainWindow",
'Choose folder', None, 'Choose folder'),
QtGui.QApplication.UnicodeUTF8), curr_directory(),
curr_directory(), QtWidgets.QFileDialog.ShowDirsOnly | QtWidgets.QFileDialog.DontUseNativeDialog)
QtGui.QFileDialog.ShowDirsOnly | QtGui.QFileDialog.DontUseNativeDialog)
if directory: if directory:
fl = QtCore.QFile(directory + '/toxygen_inline_' + curr_time().replace(':', '_') + '.png') fl = QtCore.QFile(directory + '/toxygen_inline_' + curr_time().replace(':', '_') + '.png')
self._pixmap.save(fl, 'PNG') self._pixmap.save(fl, 'PNG')
return False
def mark_as_sent(self): def mark_as_sent(self):
return False return False

View File

@ -1,7 +1,4 @@
try: from PyQt5 import QtWidgets, QtCore
from PySide import QtCore, QtGui
except ImportError:
from PyQt4 import QtCore, QtGui
from widgets import * from widgets import *
@ -29,25 +26,25 @@ class LoginScreen(CenteredWidget):
self.resize(400, 200) self.resize(400, 200)
self.setMinimumSize(QtCore.QSize(400, 200)) self.setMinimumSize(QtCore.QSize(400, 200))
self.setMaximumSize(QtCore.QSize(400, 200)) self.setMaximumSize(QtCore.QSize(400, 200))
self.new_profile = QtGui.QPushButton(self) self.new_profile = QtWidgets.QPushButton(self)
self.new_profile.setGeometry(QtCore.QRect(20, 150, 171, 27)) self.new_profile.setGeometry(QtCore.QRect(20, 150, 171, 27))
self.new_profile.clicked.connect(self.create_profile) self.new_profile.clicked.connect(self.create_profile)
self.label = QtGui.QLabel(self) self.label = QtWidgets.QLabel(self)
self.label.setGeometry(QtCore.QRect(20, 70, 101, 17)) self.label.setGeometry(QtCore.QRect(20, 70, 101, 17))
self.new_name = NickEdit(self) self.new_name = NickEdit(self)
self.new_name.setGeometry(QtCore.QRect(20, 100, 171, 31)) self.new_name.setGeometry(QtCore.QRect(20, 100, 171, 31))
self.load_profile = QtGui.QPushButton(self) self.load_profile = QtWidgets.QPushButton(self)
self.load_profile.setGeometry(QtCore.QRect(220, 150, 161, 27)) self.load_profile.setGeometry(QtCore.QRect(220, 150, 161, 27))
self.load_profile.clicked.connect(self.load_ex_profile) self.load_profile.clicked.connect(self.load_ex_profile)
self.default = QtGui.QCheckBox(self) self.default = QtWidgets.QCheckBox(self)
self.default.setGeometry(QtCore.QRect(220, 110, 131, 22)) self.default.setGeometry(QtCore.QRect(220, 110, 131, 22))
self.groupBox = QtGui.QGroupBox(self) self.groupBox = QtWidgets.QGroupBox(self)
self.groupBox.setGeometry(QtCore.QRect(210, 40, 181, 151)) self.groupBox.setGeometry(QtCore.QRect(210, 40, 181, 151))
self.comboBox = QtGui.QComboBox(self.groupBox) self.comboBox = QtWidgets.QComboBox(self.groupBox)
self.comboBox.setGeometry(QtCore.QRect(10, 30, 161, 27)) self.comboBox.setGeometry(QtCore.QRect(10, 30, 161, 27))
self.groupBox_2 = QtGui.QGroupBox(self) self.groupBox_2 = QtWidgets.QGroupBox(self)
self.groupBox_2.setGeometry(QtCore.QRect(10, 40, 191, 151)) self.groupBox_2.setGeometry(QtCore.QRect(10, 40, 191, 151))
self.toxygen = QtGui.QLabel(self) self.toxygen = QtWidgets.QLabel(self)
self.groupBox.raise_() self.groupBox.raise_()
self.groupBox_2.raise_() self.groupBox_2.raise_()
self.comboBox.raise_() self.comboBox.raise_()
@ -69,15 +66,15 @@ class LoginScreen(CenteredWidget):
QtCore.QMetaObject.connectSlotsByName(self) QtCore.QMetaObject.connectSlotsByName(self)
def retranslateUi(self): def retranslateUi(self):
self.new_name.setPlaceholderText(QtGui.QApplication.translate("login", "Profile name", None, QtGui.QApplication.UnicodeUTF8)) self.new_name.setPlaceholderText(QtWidgets.QApplication.translate("login", "Profile name"))
self.setWindowTitle(QtGui.QApplication.translate("login", "Log in", None, QtGui.QApplication.UnicodeUTF8)) self.setWindowTitle(QtWidgets.QApplication.translate("login", "Log in"))
self.new_profile.setText(QtGui.QApplication.translate("login", "Create", None, QtGui.QApplication.UnicodeUTF8)) self.new_profile.setText(QtWidgets.QApplication.translate("login", "Create"))
self.label.setText(QtGui.QApplication.translate("login", "Profile name:", None, QtGui.QApplication.UnicodeUTF8)) self.label.setText(QtWidgets.QApplication.translate("login", "Profile name:"))
self.load_profile.setText(QtGui.QApplication.translate("login", "Load profile", None, QtGui.QApplication.UnicodeUTF8)) self.load_profile.setText(QtWidgets.QApplication.translate("login", "Load profile"))
self.default.setText(QtGui.QApplication.translate("login", "Use as default", None, QtGui.QApplication.UnicodeUTF8)) self.default.setText(QtWidgets.QApplication.translate("login", "Use as default"))
self.groupBox.setTitle(QtGui.QApplication.translate("login", "Load existing profile", None, QtGui.QApplication.UnicodeUTF8)) self.groupBox.setTitle(QtWidgets.QApplication.translate("login", "Load existing profile"))
self.groupBox_2.setTitle(QtGui.QApplication.translate("login", "Create new profile", None, QtGui.QApplication.UnicodeUTF8)) self.groupBox_2.setTitle(QtWidgets.QApplication.translate("login", "Create new profile"))
self.toxygen.setText(QtGui.QApplication.translate("login", "toxygen", None, QtGui.QApplication.UnicodeUTF8)) self.toxygen.setText(QtWidgets.QApplication.translate("login", "toxygen"))
def create_profile(self): def create_profile(self):
self.type = 1 self.type = 1

View File

@ -2,10 +2,7 @@ import sys
from loginscreen import LoginScreen from loginscreen import LoginScreen
import profile import profile
from settings import * from settings import *
try: from PyQt5 import QtCore, QtGui, QtWidgets
from PySide import QtCore, QtGui
except ImportError:
from PyQt4 import QtCore, QtGui
from bootstrap import node_generator from bootstrap import node_generator
from mainscreen import MainWindow from mainscreen import MainWindow
from callbacks import init_callbacks, stop, start from callbacks import init_callbacks, stop, start
@ -39,7 +36,7 @@ class Toxygen:
tmp = [data] tmp = [data]
p = PasswordScreen(toxes.ToxES.get_instance(), tmp) p = PasswordScreen(toxes.ToxES.get_instance(), tmp)
p.show() p.show()
self.app.connect(self.app, QtCore.SIGNAL("lastWindowClosed()"), self.app, QtCore.SLOT("quit()")) self.app.lastWindowClosed.connect(self.app.quit)
self.app.exec_() self.app.exec_()
if tmp[0] == data: if tmp[0] == data:
raise SystemExit() raise SystemExit()
@ -50,7 +47,7 @@ class Toxygen:
""" """
Main function of app. loads login screen if needed and starts main screen Main function of app. loads login screen if needed and starts main screen
""" """
app = QtGui.QApplication(sys.argv) app = QtWidgets.QApplication(sys.argv)
app.setWindowIcon(QtGui.QIcon(curr_directory() + '/images/icon.png')) app.setWindowIcon(QtGui.QIcon(curr_directory() + '/images/icon.png'))
self.app = app self.app = app
@ -91,7 +88,6 @@ class Toxygen:
_login = self.Login(profiles) _login = self.Login(profiles)
ls.update_on_close(_login.login_screen_close) ls.update_on_close(_login.login_screen_close)
ls.show() ls.show()
app.connect(app, QtCore.SIGNAL("lastWindowClosed()"), app, QtCore.SLOT("quit()"))
app.exec_() app.exec_()
if not _login.t: if not _login.t:
return return
@ -100,40 +96,35 @@ class Toxygen:
name = _login.name if _login.name else 'toxygen_user' name = _login.name if _login.name else 'toxygen_user'
pr = map(lambda x: x[1], ProfileHelper.find_profiles()) pr = map(lambda x: x[1], ProfileHelper.find_profiles())
if name in list(pr): if name in list(pr):
msgBox = QtGui.QMessageBox() msgBox = QtWidgets.QMessageBox()
msgBox.setWindowTitle( msgBox.setWindowTitle(
QtGui.QApplication.translate("MainWindow", "Error", None, QtGui.QApplication.UnicodeUTF8)) QtWidgets.QApplication.translate("MainWindow", "Error"))
text = (QtGui.QApplication.translate("MainWindow", text = (QtWidgets.QApplication.translate("MainWindow",
'Profile with this name already exists', 'Profile with this name already exists'))
None, QtGui.QApplication.UnicodeUTF8))
msgBox.setText(text) msgBox.setText(text)
msgBox.exec_() msgBox.exec_()
return return
self.tox = profile.tox_factory() self.tox = profile.tox_factory()
self.tox.self_set_name(bytes(_login.name, 'utf-8') if _login.name else b'Toxygen User') self.tox.self_set_name(bytes(_login.name, 'utf-8') if _login.name else b'Toxygen User')
self.tox.self_set_status_message(b'Toxing on Toxygen') self.tox.self_set_status_message(b'Toxing on Toxygen')
reply = QtGui.QMessageBox.question(None, reply = QtWidgets.QMessageBox.question(None,
'Profile {}'.format(name), 'Profile {}'.format(name),
QtGui.QApplication.translate("login", QtWidgets.QApplication.translate("login",
'Do you want to set profile password?', 'Do you want to set profile password?'),
None, QtWidgets.QMessageBox.Yes,
QtGui.QApplication.UnicodeUTF8), QtWidgets.QMessageBox.No)
QtGui.QMessageBox.Yes, if reply == QtWidgets.QMessageBox.Yes:
QtGui.QMessageBox.No)
if reply == QtGui.QMessageBox.Yes:
set_pass = SetProfilePasswordScreen(encrypt_save) set_pass = SetProfilePasswordScreen(encrypt_save)
set_pass.show() set_pass.show()
self.app.connect(self.app, QtCore.SIGNAL("lastWindowClosed()"), self.app, QtCore.SLOT("quit()")) self.app.lastWindowClosed.connect(self.app.quit)
self.app.exec_() self.app.exec_()
reply = QtGui.QMessageBox.question(None, reply = QtWidgets.QMessageBox.question(None,
'Profile {}'.format(name), 'Profile {}'.format(name),
QtGui.QApplication.translate("login", QtWidgets.QApplication.translate("login",
'Do you want to save profile in default folder? If no, profile will be saved in program folder', 'Do you want to save profile in default folder? If no, profile will be saved in program folder'),
None, QtWidgets.QMessageBox.Yes,
QtGui.QApplication.UnicodeUTF8), QtWidgets.QMessageBox.No)
QtGui.QMessageBox.Yes, if reply == QtWidgets.QMessageBox.Yes:
QtGui.QMessageBox.No)
if reply == QtGui.QMessageBox.Yes:
path = Settings.get_default_path() path = Settings.get_default_path()
else: else:
path = curr_directory() + '/' path = curr_directory() + '/'
@ -142,11 +133,9 @@ class Toxygen:
except Exception as ex: except Exception as ex:
print(str(ex)) print(str(ex))
log('Profile creation exception: ' + str(ex)) log('Profile creation exception: ' + str(ex))
msgBox = QtGui.QMessageBox() msgBox = QtWidgets.QMessageBox()
msgBox.setText(QtGui.QApplication.translate("login", msgBox.setText(QtWidgets.QApplication.translate("login",
'Profile saving error! Does Toxygen have permission to write to this directory?', 'Profile saving error! Does Toxygen have permission to write to this directory?'))
None,
QtGui.QApplication.UnicodeUTF8))
msgBox.exec_() msgBox.exec_()
return return
path = Settings.get_default_path() path = Settings.get_default_path()
@ -172,12 +161,12 @@ class Toxygen:
self.tox = profile.tox_factory(data, settings) self.tox = profile.tox_factory(data, settings)
if Settings.is_active_profile(path, name): # profile is in use if Settings.is_active_profile(path, name): # profile is in use
reply = QtGui.QMessageBox.question(None, reply = QtWidgets.QMessageBox.question(None,
'Profile {}'.format(name), 'Profile {}'.format(name),
QtGui.QApplication.translate("login", 'Other instance of Toxygen uses this profile or profile was not properly closed. Continue?', None, QtGui.QApplication.UnicodeUTF8), QtWidgets.QApplication.translate("login", 'Other instance of Toxygen uses this profile or profile was not properly closed. Continue?'),
QtGui.QMessageBox.Yes, QtWidgets.QMessageBox.Yes,
QtGui.QMessageBox.No) QtWidgets.QMessageBox.No)
if reply != QtGui.QMessageBox.Yes: if reply != QtWidgets.QMessageBox.Yes:
return return
else: else:
settings.set_active_profile() settings.set_active_profile()
@ -196,21 +185,21 @@ class Toxygen:
app.translator = translator app.translator = translator
# tray icon # tray icon
self.tray = QtGui.QSystemTrayIcon(QtGui.QIcon(curr_directory() + '/images/icon.png')) self.tray = QtWidgets.QSystemTrayIcon(QtGui.QIcon(curr_directory() + '/images/icon.png'))
self.tray.setObjectName('tray') self.tray.setObjectName('tray')
self.ms = MainWindow(self.tox, self.reset, self.tray) self.ms = MainWindow(self.tox, self.reset, self.tray)
app.aboutToQuit.connect(self.ms.close_window) app.aboutToQuit.connect(self.ms.close_window)
class Menu(QtGui.QMenu): class Menu(QtWidgets.QMenu):
def newStatus(self, status): def newStatus(self, status):
if not Settings.get_instance().locked: if not Settings.get_instance().locked:
profile.Profile.get_instance().set_status(status) profile.Profile.get_instance().set_status(status)
self.aboutToShow() self.aboutToShowHandler()
self.hide() self.hide()
def aboutToShow(self): def aboutToShowHandler(self):
status = profile.Profile.get_instance().status status = profile.Profile.get_instance().status
act = self.act act = self.act
if status is None or Settings.get_instance().locked: if status is None or Settings.get_instance().locked:
@ -224,24 +213,24 @@ class Toxygen:
self.actions()[2].setVisible(not Settings.get_instance().locked) self.actions()[2].setVisible(not Settings.get_instance().locked)
def languageChange(self, *args, **kwargs): def languageChange(self, *args, **kwargs):
self.actions()[0].setText(QtGui.QApplication.translate('tray', 'Open Toxygen', None, QtGui.QApplication.UnicodeUTF8)) self.actions()[0].setText(QtWidgets.QApplication.translate('tray', 'Open Toxygen'))
self.actions()[1].setText(QtGui.QApplication.translate('tray', 'Set status', None, QtGui.QApplication.UnicodeUTF8)) self.actions()[1].setText(QtWidgets.QApplication.translate('tray', 'Set status'))
self.actions()[2].setText(QtGui.QApplication.translate('tray', 'Exit', None, QtGui.QApplication.UnicodeUTF8)) self.actions()[2].setText(QtWidgets.QApplication.translate('tray', 'Exit'))
self.act.actions()[0].setText(QtGui.QApplication.translate('tray', 'Online', None, QtGui.QApplication.UnicodeUTF8)) self.act.actions()[0].setText(QtWidgets.QApplication.translate('tray', 'Online'))
self.act.actions()[1].setText(QtGui.QApplication.translate('tray', 'Away', None, QtGui.QApplication.UnicodeUTF8)) self.act.actions()[1].setText(QtWidgets.QApplication.translate('tray', 'Away'))
self.act.actions()[2].setText(QtGui.QApplication.translate('tray', 'Busy', None, QtGui.QApplication.UnicodeUTF8)) self.act.actions()[2].setText(QtWidgets.QApplication.translate('tray', 'Busy'))
m = Menu() m = Menu()
show = m.addAction(QtGui.QApplication.translate('tray', 'Open Toxygen', None, QtGui.QApplication.UnicodeUTF8)) show = m.addAction(QtWidgets.QApplication.translate('tray', 'Open Toxygen'))
sub = m.addMenu(QtGui.QApplication.translate('tray', 'Set status', None, QtGui.QApplication.UnicodeUTF8)) sub = m.addMenu(QtWidgets.QApplication.translate('tray', 'Set status'))
onl = sub.addAction(QtGui.QApplication.translate('tray', 'Online', None, QtGui.QApplication.UnicodeUTF8)) onl = sub.addAction(QtWidgets.QApplication.translate('tray', 'Online'))
away = sub.addAction(QtGui.QApplication.translate('tray', 'Away', None, QtGui.QApplication.UnicodeUTF8)) away = sub.addAction(QtWidgets.QApplication.translate('tray', 'Away'))
busy = sub.addAction(QtGui.QApplication.translate('tray', 'Busy', None, QtGui.QApplication.UnicodeUTF8)) busy = sub.addAction(QtWidgets.QApplication.translate('tray', 'Busy'))
onl.setCheckable(True) onl.setCheckable(True)
away.setCheckable(True) away.setCheckable(True)
busy.setCheckable(True) busy.setCheckable(True)
m.act = sub m.act = sub
exit = m.addAction(QtGui.QApplication.translate('tray', 'Exit', None, QtGui.QApplication.UnicodeUTF8)) exit = m.addAction(QtWidgets.QApplication.translate('tray', 'Exit'))
def show_window(): def show_window():
s = Settings.get_instance() s = Settings.get_instance()
@ -264,7 +253,7 @@ class Toxygen:
self.p.show() self.p.show()
def tray_activated(reason): def tray_activated(reason):
if reason == QtGui.QSystemTrayIcon.DoubleClick: if reason == QtWidgets.QSystemTrayIcon.DoubleClick:
show_window() show_window()
def close_app(): def close_app():
@ -272,12 +261,12 @@ class Toxygen:
settings.closing = True settings.closing = True
self.ms.close() self.ms.close()
m.connect(show, QtCore.SIGNAL("triggered()"), show_window) show.triggered.connect(show_window)
m.connect(exit, QtCore.SIGNAL("triggered()"), close_app) exit.triggered.connect(close_app)
m.connect(m, QtCore.SIGNAL("aboutToShow()"), lambda: m.aboutToShow()) m.aboutToShow.connect(lambda: m.aboutToShowHandler())
sub.connect(onl, QtCore.SIGNAL("triggered()"), lambda: m.newStatus(0)) onl.triggered.connect(lambda: m.newStatus(0))
sub.connect(away, QtCore.SIGNAL("triggered()"), lambda: m.newStatus(1)) away.triggered.connect(lambda: m.newStatus(1))
sub.connect(busy, QtCore.SIGNAL("triggered()"), lambda: m.newStatus(2)) busy.triggered.connect(lambda: m.newStatus(2))
self.tray.setContextMenu(m) self.tray.setContextMenu(m)
self.tray.show() self.tray.show()
@ -293,15 +282,13 @@ class Toxygen:
updater.download(version) updater.download(version)
updating = True updating = True
else: else:
reply = QtGui.QMessageBox.question(None, reply = QtWidgets.QMessageBox.question(None,
'Toxygen', 'Toxygen',
QtGui.QApplication.translate("login", QtWidgets.QApplication.translate("login",
'Update for Toxygen was found. Download and install it?', 'Update for Toxygen was found. Download and install it?'),
None, QtWidgets.QMessageBox.Yes,
QtGui.QApplication.UnicodeUTF8), QtWidgets.QMessageBox.No)
QtGui.QMessageBox.Yes, if reply == QtWidgets.QMessageBox.Yes:
QtGui.QMessageBox.No)
if reply == QtGui.QMessageBox.Yes:
updater.download(version) updater.download(version)
updating = True updating = True
@ -329,7 +316,7 @@ class Toxygen:
if self.uri is not None: if self.uri is not None:
self.ms.add_contact(self.uri) self.ms.add_contact(self.uri)
app.connect(app, QtCore.SIGNAL("lastWindowClosed()"), app, QtCore.SLOT("quit()")) app.lastWindowClosed.connect(app.quit)
app.exec_() app.exec_()
self.init.stop = True self.init.stop = True

View File

@ -1,7 +1,7 @@
from menu import * from menu import *
from profile import * from profile import *
from list_items import * from list_items import *
from widgets import MultilineEdit, LineEdit, ComboBox from widgets import MultilineEdit, ComboBox
import plugin_support import plugin_support
from mainscreen_widgets import * from mainscreen_widgets import *
import settings import settings
@ -9,7 +9,7 @@ import platform
import toxes import toxes
class MainWindow(QtGui.QMainWindow, Singleton): class MainWindow(QtWidgets.QMainWindow, Singleton):
def __init__(self, tox, reset, tray): def __init__(self, tox, reset, tray):
super().__init__() super().__init__()
@ -23,7 +23,7 @@ class MainWindow(QtGui.QMainWindow, Singleton):
self.ws = WelcomeScreen() self.ws = WelcomeScreen()
def setup_menu(self, Form): def setup_menu(self, Form):
box = QtGui.QHBoxLayout() box = QtWidgets.QHBoxLayout()
box.setContentsMargins(0, 0, 0, 0) box.setContentsMargins(0, 0, 0, 0)
box.setAlignment(QtCore.Qt.AlignLeft) box.setAlignment(QtCore.Qt.AlignLeft)
self.profile_button = MainMenuButton(Form) self.profile_button = MainMenuButton(Form)
@ -36,37 +36,38 @@ class MainWindow(QtGui.QMainWindow, Singleton):
box.addWidget(self.about_button) box.addWidget(self.about_button)
box.setSpacing(0) box.setSpacing(0)
self.menuProfile = QtGui.QMenu() self.menuProfile = QtWidgets.QMenu()
self.menuProfile.setObjectName("menuProfile") self.menuProfile.setObjectName("menuProfile")
self.menuSettings = QtGui.QMenu() self.menuSettings = QtWidgets.QMenu()
self.menuSettings.setObjectName("menuSettings") self.menuSettings.setObjectName("menuSettings")
self.menuPlugins = QtGui.QMenu() self.menuPlugins = QtWidgets.QMenu()
self.menuPlugins.setObjectName("menuPlugins") self.menuPlugins.setObjectName("menuPlugins")
self.menuAbout = QtGui.QMenu() self.menuAbout = QtWidgets.QMenu()
self.menuAbout.setObjectName("menuAbout") self.menuAbout.setObjectName("menuAbout")
self.actionAdd_friend = QtGui.QAction(Form) self.actionAdd_friend = QtWidgets.QAction(Form)
self.actionAdd_friend.setObjectName("actionAdd_friend") self.actionAdd_friend.setObjectName("actionAdd_friend")
self.actionprofilesettings = QtGui.QAction(Form) self.actionprofilesettings = QtWidgets.QAction(Form)
self.actionprofilesettings.setObjectName("actionprofilesettings") self.actionprofilesettings.setObjectName("actionprofilesettings")
self.actionPrivacy_settings = QtGui.QAction(Form) self.actionPrivacy_settings = QtWidgets.QAction(Form)
self.actionPrivacy_settings.setObjectName("actionPrivacy_settings") self.actionPrivacy_settings.setObjectName("actionPrivacy_settings")
self.actionInterface_settings = QtGui.QAction(Form) self.actionInterface_settings = QtWidgets.QAction(Form)
self.actionInterface_settings.setObjectName("actionInterface_settings") self.actionInterface_settings.setObjectName("actionInterface_settings")
self.actionNotifications = QtGui.QAction(Form) self.actionNotifications = QtWidgets.QAction(Form)
self.actionNotifications.setObjectName("actionNotifications") self.actionNotifications.setObjectName("actionNotifications")
self.actionNetwork = QtGui.QAction(Form) self.actionNetwork = QtWidgets.QAction(Form)
self.actionNetwork.setObjectName("actionNetwork") self.actionNetwork.setObjectName("actionNetwork")
self.actionAbout_program = QtGui.QAction(Form) self.actionAbout_program = QtWidgets.QAction(Form)
self.actionAbout_program.setObjectName("actionAbout_program") self.actionAbout_program.setObjectName("actionAbout_program")
self.updateSettings = QtGui.QAction(Form) self.updateSettings = QtWidgets.QAction(Form)
self.actionSettings = QtGui.QAction(Form) self.actionSettings = QtWidgets.QAction(Form)
self.actionSettings.setObjectName("actionSettings") self.actionSettings.setObjectName("actionSettings")
self.audioSettings = QtGui.QAction(Form) self.audioSettings = QtWidgets.QAction(Form)
self.pluginData = QtGui.QAction(Form) self.videoSettings = QtWidgets.QAction(Form)
self.importPlugin = QtGui.QAction(Form) self.pluginData = QtWidgets.QAction(Form)
self.reloadPlugins = QtGui.QAction(Form) self.importPlugin = QtWidgets.QAction(Form)
self.lockApp = QtGui.QAction(Form) self.reloadPlugins = QtWidgets.QAction(Form)
self.lockApp = QtWidgets.QAction(Form)
self.menuProfile.addAction(self.actionAdd_friend) self.menuProfile.addAction(self.actionAdd_friend)
self.menuProfile.addAction(self.actionSettings) self.menuProfile.addAction(self.actionSettings)
self.menuProfile.addAction(self.lockApp) self.menuProfile.addAction(self.lockApp)
@ -75,6 +76,7 @@ class MainWindow(QtGui.QMainWindow, Singleton):
self.menuSettings.addAction(self.actionNotifications) self.menuSettings.addAction(self.actionNotifications)
self.menuSettings.addAction(self.actionNetwork) self.menuSettings.addAction(self.actionNetwork)
self.menuSettings.addAction(self.audioSettings) self.menuSettings.addAction(self.audioSettings)
self.menuSettings.addAction(self.videoSettings)
self.menuSettings.addAction(self.updateSettings) self.menuSettings.addAction(self.updateSettings)
self.menuPlugins.addAction(self.pluginData) self.menuPlugins.addAction(self.pluginData)
self.menuPlugins.addAction(self.importPlugin) self.menuPlugins.addAction(self.importPlugin)
@ -94,6 +96,7 @@ class MainWindow(QtGui.QMainWindow, Singleton):
self.actionInterface_settings.triggered.connect(self.interface_settings) self.actionInterface_settings.triggered.connect(self.interface_settings)
self.actionNotifications.triggered.connect(self.notification_settings) self.actionNotifications.triggered.connect(self.notification_settings)
self.audioSettings.triggered.connect(self.audio_settings) self.audioSettings.triggered.connect(self.audio_settings)
self.videoSettings.triggered.connect(self.video_settings)
self.updateSettings.triggered.connect(self.update_settings) self.updateSettings.triggered.connect(self.update_settings)
self.pluginData.triggered.connect(self.plugins_menu) self.pluginData.triggered.connect(self.plugins_menu)
self.lockApp.triggered.connect(self.lock_app) self.lockApp.triggered.connect(self.lock_app)
@ -113,37 +116,38 @@ class MainWindow(QtGui.QMainWindow, Singleton):
return super(MainWindow, self).event(event) return super(MainWindow, self).event(event)
def retranslateUi(self): def retranslateUi(self):
self.lockApp.setText(QtGui.QApplication.translate("MainWindow", "Lock", None, QtGui.QApplication.UnicodeUTF8)) self.lockApp.setText(QtWidgets.QApplication.translate("MainWindow", "Lock"))
self.plugins_button.setText(QtGui.QApplication.translate("MainWindow", "Plugins", None, QtGui.QApplication.UnicodeUTF8)) self.plugins_button.setText(QtWidgets.QApplication.translate("MainWindow", "Plugins"))
self.pluginData.setText(QtGui.QApplication.translate("MainWindow", "List of plugins", None, QtGui.QApplication.UnicodeUTF8)) self.pluginData.setText(QtWidgets.QApplication.translate("MainWindow", "List of plugins"))
self.profile_button.setText(QtGui.QApplication.translate("MainWindow", "Profile", None, QtGui.QApplication.UnicodeUTF8)) self.profile_button.setText(QtWidgets.QApplication.translate("MainWindow", "Profile"))
self.settings_button.setText(QtGui.QApplication.translate("MainWindow", "Settings", None, QtGui.QApplication.UnicodeUTF8)) self.settings_button.setText(QtWidgets.QApplication.translate("MainWindow", "Settings"))
self.about_button.setText(QtGui.QApplication.translate("MainWindow", "About", None, QtGui.QApplication.UnicodeUTF8)) self.about_button.setText(QtWidgets.QApplication.translate("MainWindow", "About"))
self.actionAdd_friend.setText(QtGui.QApplication.translate("MainWindow", "Add contact", None, QtGui.QApplication.UnicodeUTF8)) self.actionAdd_friend.setText(QtWidgets.QApplication.translate("MainWindow", "Add contact"))
self.actionprofilesettings.setText(QtGui.QApplication.translate("MainWindow", "Profile", None, QtGui.QApplication.UnicodeUTF8)) self.actionprofilesettings.setText(QtWidgets.QApplication.translate("MainWindow", "Profile"))
self.actionPrivacy_settings.setText(QtGui.QApplication.translate("MainWindow", "Privacy", None, QtGui.QApplication.UnicodeUTF8)) self.actionPrivacy_settings.setText(QtWidgets.QApplication.translate("MainWindow", "Privacy"))
self.actionInterface_settings.setText(QtGui.QApplication.translate("MainWindow", "Interface", None, QtGui.QApplication.UnicodeUTF8)) self.actionInterface_settings.setText(QtWidgets.QApplication.translate("MainWindow", "Interface"))
self.actionNotifications.setText(QtGui.QApplication.translate("MainWindow", "Notifications", None, QtGui.QApplication.UnicodeUTF8)) self.actionNotifications.setText(QtWidgets.QApplication.translate("MainWindow", "Notifications"))
self.actionNetwork.setText(QtGui.QApplication.translate("MainWindow", "Network", None, QtGui.QApplication.UnicodeUTF8)) self.actionNetwork.setText(QtWidgets.QApplication.translate("MainWindow", "Network"))
self.actionAbout_program.setText(QtGui.QApplication.translate("MainWindow", "About program", None, QtGui.QApplication.UnicodeUTF8)) self.actionAbout_program.setText(QtWidgets.QApplication.translate("MainWindow", "About program"))
self.actionSettings.setText(QtGui.QApplication.translate("MainWindow", "Settings", None, QtGui.QApplication.UnicodeUTF8)) self.actionSettings.setText(QtWidgets.QApplication.translate("MainWindow", "Settings"))
self.audioSettings.setText(QtGui.QApplication.translate("MainWindow", "Audio", None, QtGui.QApplication.UnicodeUTF8)) self.audioSettings.setText(QtWidgets.QApplication.translate("MainWindow", "Audio"))
self.updateSettings.setText(QtGui.QApplication.translate("MainWindow", "Updates", None, QtGui.QApplication.UnicodeUTF8)) self.videoSettings.setText(QtWidgets.QApplication.translate("MainWindow", "Video"))
self.contact_name.setPlaceholderText(QtGui.QApplication.translate("MainWindow", "Search", None, QtGui.QApplication.UnicodeUTF8)) self.updateSettings.setText(QtWidgets.QApplication.translate("MainWindow", "Updates"))
self.sendMessageButton.setToolTip(QtGui.QApplication.translate("MainWindow", "Send message", None, QtGui.QApplication.UnicodeUTF8)) self.contact_name.setPlaceholderText(QtWidgets.QApplication.translate("MainWindow", "Search"))
self.callButton.setToolTip(QtGui.QApplication.translate("MainWindow", "Start audio call with friend", None, QtGui.QApplication.UnicodeUTF8)) self.sendMessageButton.setToolTip(QtWidgets.QApplication.translate("MainWindow", "Send message"))
self.callButton.setToolTip(QtWidgets.QApplication.translate("MainWindow", "Start audio call with friend"))
self.online_contacts.clear() self.online_contacts.clear()
self.online_contacts.addItem(QtGui.QApplication.translate("MainWindow", "All", None, QtGui.QApplication.UnicodeUTF8)) self.online_contacts.addItem(QtWidgets.QApplication.translate("MainWindow", "All"))
self.online_contacts.addItem(QtGui.QApplication.translate("MainWindow", "Online", None, QtGui.QApplication.UnicodeUTF8)) self.online_contacts.addItem(QtWidgets.QApplication.translate("MainWindow", "Online"))
self.online_contacts.addItem(QtGui.QApplication.translate("MainWindow", "Online first", None, QtGui.QApplication.UnicodeUTF8)) self.online_contacts.addItem(QtWidgets.QApplication.translate("MainWindow", "Online first"))
self.online_contacts.addItem(QtGui.QApplication.translate("MainWindow", "Name", None, QtGui.QApplication.UnicodeUTF8)) self.online_contacts.addItem(QtWidgets.QApplication.translate("MainWindow", "Name"))
self.online_contacts.addItem(QtGui.QApplication.translate("MainWindow", "Online and by name", None, QtGui.QApplication.UnicodeUTF8)) self.online_contacts.addItem(QtWidgets.QApplication.translate("MainWindow", "Online and by name"))
self.online_contacts.addItem(QtGui.QApplication.translate("MainWindow", "Online first and by name", None, QtGui.QApplication.UnicodeUTF8)) self.online_contacts.addItem(QtWidgets.QApplication.translate("MainWindow", "Online first and by name"))
ind = Settings.get_instance()['sorting'] ind = Settings.get_instance()['sorting']
d = {0: 0, 1: 1, 2: 2, 3: 4, 1 | 4: 4, 2 | 4: 5} d = {0: 0, 1: 1, 2: 2, 3: 4, 1 | 4: 4, 2 | 4: 5}
self.online_contacts.setCurrentIndex(d[ind]) self.online_contacts.setCurrentIndex(d[ind])
self.importPlugin.setText(QtGui.QApplication.translate("MainWindow", "Import plugin", None, QtGui.QApplication.UnicodeUTF8)) self.importPlugin.setText(QtWidgets.QApplication.translate("MainWindow", "Import plugin"))
self.reloadPlugins.setText(QtGui.QApplication.translate("MainWindow", "Reload plugins", None, QtGui.QApplication.UnicodeUTF8)) self.reloadPlugins.setText(QtWidgets.QApplication.translate("MainWindow", "Reload plugins"))
def setup_right_bottom(self, Form): def setup_right_bottom(self, Form):
Form.resize(650, 60) Form.resize(650, 60)
@ -155,7 +159,7 @@ class MainWindow(QtGui.QMainWindow, Singleton):
font.setFamily(settings.Settings.get_instance()['font']) font.setFamily(settings.Settings.get_instance()['font'])
self.messageEdit.setFont(font) self.messageEdit.setFont(font)
self.sendMessageButton = QtGui.QPushButton(Form) self.sendMessageButton = QtWidgets.QPushButton(Form)
self.sendMessageButton.setGeometry(QtCore.QRect(565, 3, 60, 55)) self.sendMessageButton.setGeometry(QtCore.QRect(565, 3, 60, 55))
self.sendMessageButton.setObjectName("sendMessageButton") self.sendMessageButton.setObjectName("sendMessageButton")
@ -178,7 +182,7 @@ class MainWindow(QtGui.QMainWindow, Singleton):
def setup_left_center_menu(self, Form): def setup_left_center_menu(self, Form):
Form.resize(270, 25) Form.resize(270, 25)
self.search_label = QtGui.QLabel(Form) self.search_label = QtWidgets.QLabel(Form)
self.search_label.setGeometry(QtCore.QRect(3, 2, 20, 20)) self.search_label.setGeometry(QtCore.QRect(3, 2, 20, 20))
pixmap = QtGui.QPixmap() pixmap = QtGui.QPixmap()
pixmap.load(curr_directory() + '/images/search.png') pixmap.load(curr_directory() + '/images/search.png')
@ -202,7 +206,7 @@ class MainWindow(QtGui.QMainWindow, Singleton):
Form.setMinimumSize(QtCore.QSize(270, 75)) Form.setMinimumSize(QtCore.QSize(270, 75))
Form.setMaximumSize(QtCore.QSize(270, 75)) Form.setMaximumSize(QtCore.QSize(270, 75))
Form.setBaseSize(QtCore.QSize(270, 75)) Form.setBaseSize(QtCore.QSize(270, 75))
self.avatar_label = Form.avatar_label = QtGui.QLabel(Form) self.avatar_label = Form.avatar_label = QtWidgets.QLabel(Form)
self.avatar_label.setGeometry(QtCore.QRect(5, 5, 64, 64)) self.avatar_label.setGeometry(QtCore.QRect(5, 5, 64, 64))
self.avatar_label.setScaledContents(False) self.avatar_label.setScaledContents(False)
self.avatar_label.setAlignment(QtCore.Qt.AlignCenter) self.avatar_label.setAlignment(QtCore.Qt.AlignCenter)
@ -230,7 +234,7 @@ class MainWindow(QtGui.QMainWindow, Singleton):
def setup_right_top(self, Form): def setup_right_top(self, Form):
Form.resize(650, 75) Form.resize(650, 75)
self.account_avatar = QtGui.QLabel(Form) self.account_avatar = QtWidgets.QLabel(Form)
self.account_avatar.setGeometry(QtCore.QRect(10, 5, 64, 64)) self.account_avatar.setGeometry(QtCore.QRect(10, 5, 64, 64))
self.account_avatar.setScaledContents(False) self.account_avatar.setScaledContents(False)
self.account_name = DataLabel(Form) self.account_name = DataLabel(Form)
@ -249,16 +253,16 @@ class MainWindow(QtGui.QMainWindow, Singleton):
font.setBold(False) font.setBold(False)
self.account_status.setFont(font) self.account_status.setFont(font)
self.account_status.setObjectName("account_status") self.account_status.setObjectName("account_status")
self.callButton = QtGui.QPushButton(Form) self.callButton = QtWidgets.QPushButton(Form)
self.callButton.setGeometry(QtCore.QRect(550, 5, 50, 50)) self.callButton.setGeometry(QtCore.QRect(550, 5, 50, 50))
self.callButton.setObjectName("callButton") self.callButton.setObjectName("callButton")
self.callButton.clicked.connect(lambda: self.profile.call_click(True)) self.callButton.clicked.connect(lambda: self.profile.call_click(True))
self.videocallButton = QtGui.QPushButton(Form) self.videocallButton = QtWidgets.QPushButton(Form)
self.videocallButton.setGeometry(QtCore.QRect(550, 5, 50, 50)) self.videocallButton.setGeometry(QtCore.QRect(550, 5, 50, 50))
self.videocallButton.setObjectName("videocallButton") self.videocallButton.setObjectName("videocallButton")
self.videocallButton.clicked.connect(lambda: self.profile.call_click(True, True)) self.videocallButton.clicked.connect(lambda: self.profile.call_click(True, True))
self.update_call_state('call') self.update_call_state('call')
self.typing = QtGui.QLabel(Form) self.typing = QtWidgets.QLabel(Form)
self.typing.setGeometry(QtCore.QRect(500, 25, 50, 30)) self.typing.setGeometry(QtCore.QRect(500, 25, 50, 30))
pixmap = QtGui.QPixmap(QtCore.QSize(50, 30)) pixmap = QtGui.QPixmap(QtCore.QSize(50, 30))
pixmap.load(curr_directory() + '/images/typing.png') pixmap.load(curr_directory() + '/images/typing.png')
@ -268,20 +272,19 @@ class MainWindow(QtGui.QMainWindow, Singleton):
QtCore.QMetaObject.connectSlotsByName(Form) QtCore.QMetaObject.connectSlotsByName(Form)
def setup_left_center(self, widget): def setup_left_center(self, widget):
self.friends_list = QtGui.QListWidget(widget) self.friends_list = QtWidgets.QListWidget(widget)
self.friends_list.setObjectName("friends_list") self.friends_list.setObjectName("friends_list")
self.friends_list.setGeometry(0, 0, 270, 310) self.friends_list.setGeometry(0, 0, 270, 310)
self.friends_list.clicked.connect(self.friend_click) self.friends_list.clicked.connect(self.friend_click)
self.friends_list.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) self.friends_list.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
self.friends_list.connect(self.friends_list, QtCore.SIGNAL("customContextMenuRequested(QPoint)"), self.friends_list.customContextMenuRequested.connect(self.friend_right_click)
self.friend_right_click) self.friends_list.setVerticalScrollMode(QtWidgets.QAbstractItemView.ScrollPerPixel)
self.friends_list.setVerticalScrollMode(QtGui.QAbstractItemView.ScrollPerPixel)
self.friends_list.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn) self.friends_list.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
self.friends_list.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) self.friends_list.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
self.friends_list.verticalScrollBar().setContextMenuPolicy(QtCore.Qt.NoContextMenu) self.friends_list.verticalScrollBar().setContextMenuPolicy(QtCore.Qt.NoContextMenu)
def setup_right_center(self, widget): def setup_right_center(self, widget):
self.messages = QtGui.QListWidget(widget) self.messages = QtWidgets.QListWidget(widget)
self.messages.setGeometry(0, 0, 620, 310) self.messages.setGeometry(0, 0, 620, 310)
self.messages.setObjectName("messages") self.messages.setObjectName("messages")
self.messages.setSpacing(1) self.messages.setSpacing(1)
@ -295,8 +298,8 @@ class MainWindow(QtGui.QMainWindow, Singleton):
self.profile.load_history() self.profile.load_history()
self.messages.verticalScrollBar().setValue(1) self.messages.verticalScrollBar().setValue(1)
self.messages.verticalScrollBar().valueChanged.connect(load) self.messages.verticalScrollBar().valueChanged.connect(load)
self.messages.setVerticalScrollMode(QtGui.QAbstractItemView.ScrollPerPixel) self.messages.setVerticalScrollMode(QtWidgets.QAbstractItemView.ScrollPerPixel)
self.messages.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) self.messages.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection)
def initUI(self, tox): def initUI(self, tox):
self.setMinimumSize(920, 500) self.setMinimumSize(920, 500)
@ -304,15 +307,15 @@ class MainWindow(QtGui.QMainWindow, Singleton):
self.setGeometry(s['x'], s['y'], s['width'], s['height']) self.setGeometry(s['x'], s['y'], s['width'], s['height'])
self.setWindowTitle('Toxygen') self.setWindowTitle('Toxygen')
os.chdir(curr_directory() + '/images/') os.chdir(curr_directory() + '/images/')
menu = QtGui.QWidget() menu = QtWidgets.QWidget()
main = QtGui.QWidget() main = QtWidgets.QWidget()
grid = QtGui.QGridLayout() grid = QtWidgets.QGridLayout()
search = QtGui.QWidget() search = QtWidgets.QWidget()
name = QtGui.QWidget() name = QtWidgets.QWidget()
info = QtGui.QWidget() info = QtWidgets.QWidget()
main_list = QtGui.QWidget() main_list = QtWidgets.QWidget()
messages = QtGui.QWidget() messages = QtWidgets.QWidget()
message_buttons = QtGui.QWidget() message_buttons = QtWidgets.QWidget()
self.setup_left_center_menu(search) self.setup_left_center_menu(search)
self.setup_left_top(name) self.setup_left_top(name)
self.setup_right_center(messages) self.setup_right_center(messages)
@ -369,9 +372,9 @@ class MainWindow(QtGui.QMainWindow, Singleton):
s['width'] = self.width() s['width'] = self.width()
s['height'] = self.height() s['height'] = self.height()
s.save() s.save()
QtGui.QApplication.closeAllWindows() QtWidgets.QApplication.closeAllWindows()
event.accept() event.accept()
elif QtGui.QSystemTrayIcon.isSystemTrayAvailable(): elif QtWidgets.QSystemTrayIcon.isSystemTrayAvailable():
event.ignore() event.ignore()
self.hide() self.hide()
@ -401,13 +404,13 @@ class MainWindow(QtGui.QMainWindow, Singleton):
self.profile.update() self.profile.update()
def keyPressEvent(self, event): def keyPressEvent(self, event):
if event.key() == QtCore.Qt.Key_Escape and QtGui.QSystemTrayIcon.isSystemTrayAvailable(): if event.key() == QtCore.Qt.Key_Escape and QtWidgets.QSystemTrayIcon.isSystemTrayAvailable():
self.hide() self.hide()
elif event.key() == QtCore.Qt.Key_C and event.modifiers() & QtCore.Qt.ControlModifier and self.messages.selectedIndexes(): elif event.key() == QtCore.Qt.Key_C and event.modifiers() & QtCore.Qt.ControlModifier and self.messages.selectedIndexes():
rows = list(map(lambda x: self.messages.row(x), self.messages.selectedItems())) rows = list(map(lambda x: self.messages.row(x), self.messages.selectedItems()))
indexes = (rows[0] - self.messages.count(), rows[-1] - self.messages.count()) indexes = (rows[0] - self.messages.count(), rows[-1] - self.messages.count())
s = self.profile.export_history(self.profile.active_friend, True, indexes) s = self.profile.export_history(self.profile.active_friend, True, indexes)
clipboard = QtGui.QApplication.clipboard() clipboard = QtWidgets.QApplication.clipboard()
clipboard.setText(s) clipboard.setText(s)
elif event.key() == QtCore.Qt.Key_Z and event.modifiers() & QtCore.Qt.ControlModifier and self.messages.selectedIndexes(): elif event.key() == QtCore.Qt.Key_Z and event.modifiers() & QtCore.Qt.ControlModifier and self.messages.selectedIndexes():
self.messages.clearSelection() self.messages.clearSelection()
@ -422,9 +425,9 @@ class MainWindow(QtGui.QMainWindow, Singleton):
def about_program(self): def about_program(self):
import util import util
msgBox = QtGui.QMessageBox() msgBox = QtWidgets.QMessageBox()
msgBox.setWindowTitle(QtGui.QApplication.translate("MainWindow", "About", None, QtGui.QApplication.UnicodeUTF8)) msgBox.setWindowTitle(QtWidgets.QApplication.translate("MainWindow", "About"))
text = (QtGui.QApplication.translate("MainWindow", 'Toxygen is Tox client written on Python.\nVersion: ', None, QtGui.QApplication.UnicodeUTF8)) text = (QtWidgets.QApplication.translate("MainWindow", 'Toxygen is Tox client written on Python.\nVersion: '))
msgBox.setText(text + util.program_version + '\nGitHub: https://github.com/toxygen-project/toxygen/') msgBox.setText(text + util.program_version + '\nGitHub: https://github.com/toxygen-project/toxygen/')
msgBox.exec_() msgBox.exec_()
@ -460,6 +463,10 @@ class MainWindow(QtGui.QMainWindow, Singleton):
self.audio_s = AudioSettings() self.audio_s = AudioSettings()
self.audio_s.show() self.audio_s.show()
def video_settings(self):
self.video_s = VideoSettings()
self.video_s.show()
def update_settings(self): def update_settings(self):
self.update_s = UpdateSettings() self.update_s = UpdateSettings()
self.update_s.show() self.update_s.show()
@ -471,22 +478,19 @@ class MainWindow(QtGui.QMainWindow, Singleton):
def import_plugin(self): def import_plugin(self):
import util import util
directory = QtGui.QFileDialog.getExistingDirectory(self, directory = QtWidgets.QFileDialog.getExistingDirectory(self,
QtGui.QApplication.translate("MainWindow", 'Choose folder with plugin', QtWidgets.QApplication.translate("MainWindow", 'Choose folder with plugin'),
None,
QtGui.QApplication.UnicodeUTF8),
util.curr_directory(), util.curr_directory(),
QtGui.QFileDialog.ShowDirsOnly | QtGui.QFileDialog.DontUseNativeDialog) QtWidgets.QFileDialog.ShowDirsOnly | QtWidgets.QFileDialog.DontUseNativeDialog)
if directory: if directory:
src = directory + '/' src = directory + '/'
dest = curr_directory() + '/plugins/' dest = curr_directory() + '/plugins/'
util.copy(src, dest) util.copy(src, dest)
msgBox = QtGui.QMessageBox() msgBox = QtWidgets.QMessageBox()
msgBox.setWindowTitle( msgBox.setWindowTitle(
QtGui.QApplication.translate("MainWindow", "Restart Toxygen", None, QtGui.QApplication.UnicodeUTF8)) QtWidgets.QApplication.translate("MainWindow", "Restart Toxygen"))
msgBox.setText( msgBox.setText(
QtGui.QApplication.translate("MainWindow", 'Plugin will be loaded after restart', None, QtWidgets.QApplication.translate("MainWindow", 'Plugin will be loaded after restart'))
QtGui.QApplication.UnicodeUTF8))
msgBox.exec_() msgBox.exec_()
def lock_app(self): def lock_app(self):
@ -494,12 +498,11 @@ class MainWindow(QtGui.QMainWindow, Singleton):
Settings.get_instance().locked = True Settings.get_instance().locked = True
self.hide() self.hide()
else: else:
msgBox = QtGui.QMessageBox() msgBox = QtWidgets.QMessageBox()
msgBox.setWindowTitle( msgBox.setWindowTitle(
QtGui.QApplication.translate("MainWindow", "Cannot lock app", None, QtGui.QApplication.UnicodeUTF8)) QtWidgets.QApplication.translate("MainWindow", "Cannot lock app"))
msgBox.setText( msgBox.setText(
QtGui.QApplication.translate("MainWindow", 'Error. Profile password is not set.', None, QtWidgets.QApplication.translate("MainWindow", 'Error. Profile password is not set.'))
QtGui.QApplication.UnicodeUTF8))
msgBox.exec_() msgBox.exec_()
def show_menu(self): def show_menu(self):
@ -522,8 +525,8 @@ class MainWindow(QtGui.QMainWindow, Singleton):
def send_file(self): def send_file(self):
self.menu.hide() self.menu.hide()
if self.profile.active_friend + 1: if self.profile.active_friend + 1:
choose = QtGui.QApplication.translate("MainWindow", 'Choose file', None, QtGui.QApplication.UnicodeUTF8) choose = QtWidgets.QApplication.translate("MainWindow", 'Choose file')
name = QtGui.QFileDialog.getOpenFileName(self, choose, options=QtGui.QFileDialog.DontUseNativeDialog) name = QtWidgets.QFileDialog.getOpenFileName(self, choose, options=QtWidgets.QFileDialog.DontUseNativeDialog)
if name[0]: if name[0]:
self.profile.send_file(name[0]) self.profile.send_file(name[0])
@ -564,14 +567,15 @@ class MainWindow(QtGui.QMainWindow, Singleton):
def call_finished(self): def call_finished(self):
self.update_call_state('call') self.update_call_state('call')
def update_call_state(self, fl): def update_call_state(self, state):
# TODO: do smth with video call button
os.chdir(curr_directory() + '/images/') os.chdir(curr_directory() + '/images/')
pixmap = QtGui.QPixmap(curr_directory() + '/images/{}.png'.format(fl))
pixmap = QtGui.QPixmap(curr_directory() + '/images/{}.png'.format(state))
icon = QtGui.QIcon(pixmap) icon = QtGui.QIcon(pixmap)
self.callButton.setIcon(icon) self.callButton.setIcon(icon)
self.callButton.setIconSize(QtCore.QSize(50, 50)) self.callButton.setIconSize(QtCore.QSize(50, 50))
pixmap = QtGui.QPixmap(curr_directory() + '/images/videocall.png')
pixmap = QtGui.QPixmap(curr_directory() + '/images/{}_video.png'.format(state))
icon = QtGui.QIcon(pixmap) icon = QtGui.QIcon(pixmap)
self.videocallButton.setIcon(icon) self.videocallButton.setIcon(icon)
self.videocallButton.setIconSize(QtCore.QSize(35, 35)) self.videocallButton.setIconSize(QtCore.QSize(35, 35))
@ -588,44 +592,43 @@ class MainWindow(QtGui.QMainWindow, Singleton):
return return
settings = Settings.get_instance() settings = Settings.get_instance()
allowed = friend.tox_id in settings['auto_accept_from_friends'] allowed = friend.tox_id in settings['auto_accept_from_friends']
auto = QtGui.QApplication.translate("MainWindow", 'Disallow auto accept', None, QtGui.QApplication.UnicodeUTF8) if allowed else QtGui.QApplication.translate("MainWindow", 'Allow auto accept', None, QtGui.QApplication.UnicodeUTF8) auto = QtWidgets.QApplication.translate("MainWindow", 'Disallow auto accept') if allowed else QtWidgets.QApplication.translate("MainWindow", 'Allow auto accept')
if item is not None: if item is not None:
self.listMenu = QtGui.QMenu() self.listMenu = QtWidgets.QMenu()
set_alias_item = self.listMenu.addAction(QtGui.QApplication.translate("MainWindow", 'Set alias', None, QtGui.QApplication.UnicodeUTF8)) set_alias_item = self.listMenu.addAction(QtWidgets.QApplication.translate("MainWindow", 'Set alias'))
history_menu = self.listMenu.addMenu(QtGui.QApplication.translate("MainWindow", 'Chat history', None, QtGui.QApplication.UnicodeUTF8)) history_menu = self.listMenu.addMenu(QtWidgets.QApplication.translate("MainWindow", 'Chat history'))
clear_history_item = history_menu.addAction(QtGui.QApplication.translate("MainWindow", 'Clear history', None, QtGui.QApplication.UnicodeUTF8)) clear_history_item = history_menu.addAction(QtWidgets.QApplication.translate("MainWindow", 'Clear history'))
export_to_text_item = history_menu.addAction(QtGui.QApplication.translate("MainWindow", 'Export as text', None, QtGui.QApplication.UnicodeUTF8)) export_to_text_item = history_menu.addAction(QtWidgets.QApplication.translate("MainWindow", 'Export as text'))
export_to_html_item = history_menu.addAction(QtGui.QApplication.translate("MainWindow", 'Export as HTML', None, QtGui.QApplication.UnicodeUTF8)) export_to_html_item = history_menu.addAction(QtWidgets.QApplication.translate("MainWindow", 'Export as HTML'))
copy_menu = self.listMenu.addMenu(QtGui.QApplication.translate("MainWindow", 'Copy', None, QtGui.QApplication.UnicodeUTF8)) copy_menu = self.listMenu.addMenu(QtWidgets.QApplication.translate("MainWindow", 'Copy'))
copy_name_item = copy_menu.addAction(QtGui.QApplication.translate("MainWindow", 'Name', None, QtGui.QApplication.UnicodeUTF8)) copy_name_item = copy_menu.addAction(QtWidgets.QApplication.translate("MainWindow", 'Name'))
copy_status_item = copy_menu.addAction(QtGui.QApplication.translate("MainWindow", 'Status message', None, QtGui.QApplication.UnicodeUTF8)) copy_status_item = copy_menu.addAction(QtWidgets.QApplication.translate("MainWindow", 'Status message'))
copy_key_item = copy_menu.addAction(QtGui.QApplication.translate("MainWindow", 'Public key', None, QtGui.QApplication.UnicodeUTF8)) copy_key_item = copy_menu.addAction(QtWidgets.QApplication.translate("MainWindow", 'Public key'))
auto_accept_item = self.listMenu.addAction(auto) auto_accept_item = self.listMenu.addAction(auto)
remove_item = self.listMenu.addAction(QtGui.QApplication.translate("MainWindow", 'Remove friend', None, QtGui.QApplication.UnicodeUTF8)) remove_item = self.listMenu.addAction(QtWidgets.QApplication.translate("MainWindow", 'Remove friend'))
block_item = self.listMenu.addAction(QtGui.QApplication.translate("MainWindow", 'Block friend', None, QtGui.QApplication.UnicodeUTF8)) block_item = self.listMenu.addAction(QtWidgets.QApplication.translate("MainWindow", 'Block friend'))
notes_item = self.listMenu.addAction(QtGui.QApplication.translate("MainWindow", 'Notes', None, QtGui.QApplication.UnicodeUTF8)) notes_item = self.listMenu.addAction(QtWidgets.QApplication.translate("MainWindow", 'Notes'))
plugins_loader = plugin_support.PluginLoader.get_instance() plugins_loader = plugin_support.PluginLoader.get_instance()
if plugins_loader is not None: if plugins_loader is not None:
submenu = plugins_loader.get_menu(self.listMenu, num) submenu = plugins_loader.get_menu(self.listMenu, num)
if len(submenu): if len(submenu):
plug = self.listMenu.addMenu(QtGui.QApplication.translate("MainWindow", 'Plugins', None, QtGui.QApplication.UnicodeUTF8)) plug = self.listMenu.addMenu(QtWidgets.QApplication.translate("MainWindow", 'Plugins'))
plug.addActions(submenu) plug.addActions(submenu)
self.connect(set_alias_item, QtCore.SIGNAL("triggered()"), lambda: self.set_alias(num)) set_alias_item.triggered.connect(lambda: self.set_alias(num))
self.connect(remove_item, QtCore.SIGNAL("triggered()"), lambda: self.remove_friend(num)) remove_item.triggered.connect(lambda: self.remove_friend(num))
self.connect(block_item, QtCore.SIGNAL("triggered()"), lambda: self.block_friend(num)) block_item.triggered.connect(lambda: self.block_friend(num))
self.connect(copy_key_item, QtCore.SIGNAL("triggered()"), lambda: self.copy_friend_key(num)) copy_key_item.triggered.connect(lambda: self.copy_friend_key(num))
self.connect(clear_history_item, QtCore.SIGNAL("triggered()"), lambda: self.clear_history(num)) clear_history_item.triggered.connect(lambda: self.clear_history(num))
self.connect(auto_accept_item, QtCore.SIGNAL("triggered()"), lambda: self.auto_accept(num, not allowed)) auto_accept_item.triggered.connect(lambda: self.auto_accept(num, not allowed))
self.connect(notes_item, QtCore.SIGNAL("triggered()"), lambda: self.show_note(friend)) notes_item.triggered.connect(lambda: self.show_note(friend))
self.connect(copy_name_item, QtCore.SIGNAL("triggered()"), lambda: self.copy_name(friend)) copy_name_item.triggered.connect(lambda: self.copy_name(friend))
self.connect(copy_status_item, QtCore.SIGNAL("triggered()"), lambda: self.copy_status(friend)) copy_status_item.triggered.connect(lambda: self.copy_status(friend))
self.connect(export_to_text_item, QtCore.SIGNAL("triggered()"), lambda: self.export_history(num)) export_to_text_item.triggered.connect(lambda: self.export_history(num))
self.connect(export_to_html_item, QtCore.SIGNAL("triggered()"), export_to_html_item.triggered.connect(lambda: self.export_history(num, False))
lambda: self.export_history(num, False))
parent_position = self.friends_list.mapToGlobal(QtCore.QPoint(0, 0)) parent_position = self.friends_list.mapToGlobal(QtCore.QPoint(0, 0))
self.listMenu.move(parent_position + pos) self.listMenu.move(parent_position + pos)
self.listMenu.show() self.listMenu.show()
@ -633,7 +636,7 @@ class MainWindow(QtGui.QMainWindow, Singleton):
def show_note(self, friend): def show_note(self, friend):
s = Settings.get_instance() s = Settings.get_instance()
note = s['notes'][friend.tox_id] if friend.tox_id in s['notes'] else '' note = s['notes'][friend.tox_id] if friend.tox_id in s['notes'] else ''
user = QtGui.QApplication.translate("MainWindow", 'Notes about user', None, QtGui.QApplication.UnicodeUTF8) user = QtWidgets.QApplication.translate("MainWindow", 'Notes about user')
user = '{} {}'.format(user, friend.name) user = '{} {}'.format(user, friend.name)
def save_note(text): def save_note(text):
@ -647,12 +650,11 @@ class MainWindow(QtGui.QMainWindow, Singleton):
def export_history(self, num, as_text=True): def export_history(self, num, as_text=True):
s = self.profile.export_history(num, as_text) s = self.profile.export_history(num, as_text)
directory = QtGui.QFileDialog.getExistingDirectory(None, directory = QtWidgets.QFileDialog.getExistingDirectory(None,
QtGui.QApplication.translate("MainWindow", 'Choose folder', QtWidgets.QApplication.translate("MainWindow",
None, 'Choose folder'),
QtGui.QApplication.UnicodeUTF8),
curr_directory(), curr_directory(),
QtGui.QFileDialog.ShowDirsOnly | QtGui.QFileDialog.DontUseNativeDialog) QtWidgets.QFileDialog.ShowDirsOnly | QtWidgets.QFileDialog.DontUseNativeDialog)
if directory: if directory:
name = 'exported_history_{}.{}'.format(convert_time(time.time()), 'txt' if as_text else 'html') name = 'exported_history_{}.{}'.format(convert_time(time.time()), 'txt' if as_text else 'html')
@ -671,15 +673,15 @@ class MainWindow(QtGui.QMainWindow, Singleton):
def copy_friend_key(self, num): def copy_friend_key(self, num):
tox_id = self.profile.friend_public_key(num) tox_id = self.profile.friend_public_key(num)
clipboard = QtGui.QApplication.clipboard() clipboard = QtWidgets.QApplication.clipboard()
clipboard.setText(tox_id) clipboard.setText(tox_id)
def copy_name(self, friend): def copy_name(self, friend):
clipboard = QtGui.QApplication.clipboard() clipboard = QtWidgets.QApplication.clipboard()
clipboard.setText(friend.name) clipboard.setText(friend.name)
def copy_status(self, friend): def copy_status(self, friend):
clipboard = QtGui.QApplication.clipboard() clipboard = QtWidgets.QApplication.clipboard()
clipboard.setText(friend.status_message) clipboard.setText(friend.status_message)
def clear_history(self, num): def clear_history(self, num):

View File

@ -1,14 +1,11 @@
try: from PyQt5 import QtCore, QtGui, QtWidgets
from PySide import QtCore, QtGui
except ImportError:
from PyQt4 import QtCore, QtGui
from widgets import RubberBand, create_menu, QRightClickButton, CenteredWidget, LineEdit from widgets import RubberBand, create_menu, QRightClickButton, CenteredWidget, LineEdit
from profile import Profile from profile import Profile
import smileys import smileys
import util import util
class MessageArea(QtGui.QPlainTextEdit): class MessageArea(QtWidgets.QPlainTextEdit):
"""User types messages here""" """User types messages here"""
def __init__(self, parent, form): def __init__(self, parent, form):
@ -20,7 +17,7 @@ class MessageArea(QtGui.QPlainTextEdit):
def keyPressEvent(self, event): def keyPressEvent(self, event):
if event.matches(QtGui.QKeySequence.Paste): if event.matches(QtGui.QKeySequence.Paste):
mimeData = QtGui.QApplication.clipboard().mimeData() mimeData = QtWidgets.QApplication.clipboard().mimeData()
if mimeData.hasUrls(): if mimeData.hasUrls():
for url in mimeData.urls(): for url in mimeData.urls():
self.pasteEvent(url.toString()) self.pasteEvent(url.toString())
@ -67,14 +64,14 @@ class MessageArea(QtGui.QPlainTextEdit):
e.ignore() e.ignore()
def pasteEvent(self, text=None): def pasteEvent(self, text=None):
text = text or QtGui.QApplication.clipboard().text() text = text or QtWidgets.QApplication.clipboard().text()
if text.startswith('file://'): if text.startswith('file://'):
self.parent.profile.send_file(text[7:]) self.parent.profile.send_file(text[7:])
else: else:
self.insertPlainText(text) self.insertPlainText(text)
class ScreenShotWindow(QtGui.QWidget): class ScreenShotWindow(QtWidgets.QWidget):
def __init__(self, parent): def __init__(self, parent):
super(ScreenShotWindow, self).__init__() super(ScreenShotWindow, self).__init__()
@ -84,6 +81,8 @@ class ScreenShotWindow(QtGui.QWidget):
self.showFullScreen() self.showFullScreen()
self.setWindowOpacity(0.5) self.setWindowOpacity(0.5)
self.rubberband = RubberBand() self.rubberband = RubberBand()
self.rubberband.setWindowFlags(self.rubberband.windowFlags() | QtCore.Qt.FramelessWindowHint)
self.rubberband.setAttribute(QtCore.Qt.WA_TranslucentBackground)
def closeEvent(self, *args): def closeEvent(self, *args):
if self.parent.isHidden(): if self.parent.isHidden():
@ -93,7 +92,7 @@ class ScreenShotWindow(QtGui.QWidget):
self.origin = event.pos() self.origin = event.pos()
self.rubberband.setGeometry(QtCore.QRect(self.origin, QtCore.QSize())) self.rubberband.setGeometry(QtCore.QRect(self.origin, QtCore.QSize()))
self.rubberband.show() self.rubberband.show()
QtGui.QWidget.mousePressEvent(self, event) QtWidgets.QWidget.mousePressEvent(self, event)
def mouseMoveEvent(self, event): def mouseMoveEvent(self, event):
if self.rubberband.isVisible(): if self.rubberband.isVisible():
@ -109,11 +108,12 @@ class ScreenShotWindow(QtGui.QWidget):
self.rubberband.hide() self.rubberband.hide()
rect = self.rubberband.geometry() rect = self.rubberband.geometry()
if rect.width() and rect.height(): if rect.width() and rect.height():
p = QtGui.QPixmap.grabWindow(QtGui.QApplication.desktop().winId(), screen = QtWidgets.QApplication.primaryScreen()
rect.x() + 4, p = screen.grabWindow(0,
rect.y() + 4, rect.x() + 4,
rect.width() - 8, rect.y() + 4,
rect.height() - 8) rect.width() - 8,
rect.height() - 8)
byte_array = QtCore.QByteArray() byte_array = QtCore.QByteArray()
buffer = QtCore.QBuffer(byte_array) buffer = QtCore.QBuffer(byte_array)
buffer.open(QtCore.QIODevice.WriteOnly) buffer.open(QtCore.QIODevice.WriteOnly)
@ -129,7 +129,7 @@ class ScreenShotWindow(QtGui.QWidget):
super(ScreenShotWindow, self).keyPressEvent(event) super(ScreenShotWindow, self).keyPressEvent(event)
class SmileyWindow(QtGui.QWidget): class SmileyWindow(QtWidgets.QWidget):
""" """
Smiley selection window Smiley selection window
""" """
@ -151,7 +151,7 @@ class SmileyWindow(QtGui.QWidget):
self.radio = [] self.radio = []
self.parent = parent self.parent = parent
for i in range(self.page_count): # buttons with smileys for i in range(self.page_count): # buttons with smileys
elem = QtGui.QRadioButton(self) elem = QtWidgets.QRadioButton(self)
elem.setGeometry(QtCore.QRect(i * 20 + 5, 180, 20, 20)) elem.setGeometry(QtCore.QRect(i * 20 + 5, 180, 20, 20))
elem.clicked.connect(lambda i=i: self.checked(i)) elem.clicked.connect(lambda i=i: self.checked(i))
self.radio.append(elem) self.radio.append(elem)
@ -160,7 +160,7 @@ class SmileyWindow(QtGui.QWidget):
self.setMinimumSize(width, 200) self.setMinimumSize(width, 200)
self.buttons = [] self.buttons = []
for i in range(self.page_size): # pages - radio buttons for i in range(self.page_size): # pages - radio buttons
b = QtGui.QPushButton(self) b = QtWidgets.QPushButton(self)
b.setGeometry(QtCore.QRect((i // 8) * 20 + 5, (i % 8) * 20, 20, 20)) b.setGeometry(QtCore.QRect((i // 8) * 20 + 5, (i % 8) * 20, 20, 20))
b.clicked.connect(lambda i=i: self.clicked(i)) b.clicked.connect(lambda i=i: self.clicked(i))
self.buttons.append(b) self.buttons.append(b)
@ -190,7 +190,7 @@ class SmileyWindow(QtGui.QWidget):
self.close() self.close()
class MenuButton(QtGui.QPushButton): class MenuButton(QtWidgets.QPushButton):
def __init__(self, parent, enter): def __init__(self, parent, enter):
super(MenuButton, self).__init__(parent) super(MenuButton, self).__init__(parent)
@ -201,86 +201,73 @@ class MenuButton(QtGui.QPushButton):
super(MenuButton, self).enterEvent(event) super(MenuButton, self).enterEvent(event)
class DropdownMenu(QtGui.QWidget): class DropdownMenu(QtWidgets.QWidget):
def __init__(self, parent): def __init__(self, parent):
super(DropdownMenu, self).__init__(parent) super(DropdownMenu, self).__init__(parent)
self.installEventFilter(self) self.installEventFilter(self)
self.setWindowFlags(QtCore.Qt.FramelessWindowHint) self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
self.setMaximumSize(180, 120) self.setMaximumSize(120, 120)
self.setMinimumSize(180, 120) self.setMinimumSize(120, 120)
self.screenshotButton = QRightClickButton(self) self.screenshotButton = QRightClickButton(self)
self.screenshotButton.setGeometry(QtCore.QRect(0, 60, 60, 60)) self.screenshotButton.setGeometry(QtCore.QRect(0, 60, 60, 60))
self.screenshotButton.setObjectName("screenshotButton") self.screenshotButton.setObjectName("screenshotButton")
self.fileTransferButton = QtGui.QPushButton(self) self.fileTransferButton = QtWidgets.QPushButton(self)
self.fileTransferButton.setGeometry(QtCore.QRect(60, 60, 60, 60)) self.fileTransferButton.setGeometry(QtCore.QRect(60, 60, 60, 60))
self.fileTransferButton.setObjectName("fileTransferButton") self.fileTransferButton.setObjectName("fileTransferButton")
self.audioMessageButton = QtGui.QPushButton(self) self.smileyButton = QtWidgets.QPushButton(self)
self.audioMessageButton.setGeometry(QtCore.QRect(120, 60, 60, 60))
self.smileyButton = QtGui.QPushButton(self)
self.smileyButton.setGeometry(QtCore.QRect(0, 0, 60, 60)) self.smileyButton.setGeometry(QtCore.QRect(0, 0, 60, 60))
self.videoMessageButton = QtGui.QPushButton(self) self.stickerButton = QtWidgets.QPushButton(self)
self.videoMessageButton.setGeometry(QtCore.QRect(120, 0, 60, 60))
self.stickerButton = QtGui.QPushButton(self)
self.stickerButton.setGeometry(QtCore.QRect(60, 0, 60, 60)) self.stickerButton.setGeometry(QtCore.QRect(60, 0, 60, 60))
pixmap = QtGui.QPixmap(util.curr_directory() + '/images/file.png') pixmap = QtGui.QPixmap(util.curr_directory() + '/images/file.png')
icon = QtGui.QIcon(pixmap) icon = QtGui.QIcon(pixmap)
self.fileTransferButton.setIcon(icon) self.fileTransferButton.setIcon(icon)
self.fileTransferButton.setIconSize(QtCore.QSize(50, 50)) self.fileTransferButton.setIconSize(QtCore.QSize(50, 50))
pixmap = QtGui.QPixmap(util.curr_directory() + '/images/screenshot.png') pixmap = QtGui.QPixmap(util.curr_directory() + '/images/screenshot.png')
icon = QtGui.QIcon(pixmap) icon = QtGui.QIcon(pixmap)
self.screenshotButton.setIcon(icon) self.screenshotButton.setIcon(icon)
self.screenshotButton.setIconSize(QtCore.QSize(50, 60)) self.screenshotButton.setIconSize(QtCore.QSize(50, 60))
pixmap = QtGui.QPixmap(util.curr_directory() + '/images/audio_message.png')
icon = QtGui.QIcon(pixmap)
self.audioMessageButton.setIcon(icon)
self.audioMessageButton.setIconSize(QtCore.QSize(50, 50))
pixmap = QtGui.QPixmap(util.curr_directory() + '/images/smiley.png') pixmap = QtGui.QPixmap(util.curr_directory() + '/images/smiley.png')
icon = QtGui.QIcon(pixmap) icon = QtGui.QIcon(pixmap)
self.smileyButton.setIcon(icon) self.smileyButton.setIcon(icon)
self.smileyButton.setIconSize(QtCore.QSize(50, 50)) self.smileyButton.setIconSize(QtCore.QSize(50, 50))
pixmap = QtGui.QPixmap(util.curr_directory() + '/images/video_message.png')
icon = QtGui.QIcon(pixmap)
self.videoMessageButton.setIcon(icon)
self.videoMessageButton.setIconSize(QtCore.QSize(55, 55))
pixmap = QtGui.QPixmap(util.curr_directory() + '/images/sticker.png') pixmap = QtGui.QPixmap(util.curr_directory() + '/images/sticker.png')
icon = QtGui.QIcon(pixmap) icon = QtGui.QIcon(pixmap)
self.stickerButton.setIcon(icon) self.stickerButton.setIcon(icon)
self.stickerButton.setIconSize(QtCore.QSize(55, 55)) self.stickerButton.setIconSize(QtCore.QSize(55, 55))
self.screenshotButton.setToolTip(QtGui.QApplication.translate("MenuWindow", "Send screenshot", None, QtGui.QApplication.UnicodeUTF8)) self.screenshotButton.setToolTip(QtWidgets.QApplication.translate("MenuWindow", "Send screenshot"))
self.fileTransferButton.setToolTip(QtGui.QApplication.translate("MenuWindow", "Send file", None, QtGui.QApplication.UnicodeUTF8)) self.fileTransferButton.setToolTip(QtWidgets.QApplication.translate("MenuWindow", "Send file"))
self.audioMessageButton.setToolTip(QtGui.QApplication.translate("MenuWindow", "Send audio message", None, QtGui.QApplication.UnicodeUTF8)) self.smileyButton.setToolTip(QtWidgets.QApplication.translate("MenuWindow", "Add smiley"))
self.videoMessageButton.setToolTip(QtGui.QApplication.translate("MenuWindow", "Send video message", None, QtGui.QApplication.UnicodeUTF8)) self.stickerButton.setToolTip(QtWidgets.QApplication.translate("MenuWindow", "Send sticker"))
self.smileyButton.setToolTip(QtGui.QApplication.translate("MenuWindow", "Add smiley", None, QtGui.QApplication.UnicodeUTF8))
self.stickerButton.setToolTip(QtGui.QApplication.translate("MenuWindow", "Send sticker", None, QtGui.QApplication.UnicodeUTF8))
self.fileTransferButton.clicked.connect(parent.send_file) self.fileTransferButton.clicked.connect(parent.send_file)
self.screenshotButton.clicked.connect(parent.send_screenshot) self.screenshotButton.clicked.connect(parent.send_screenshot)
self.connect(self.screenshotButton, QtCore.SIGNAL("rightClicked()"), lambda: parent.send_screenshot(True)) self.screenshotButton.rightClicked.connect(lambda: parent.send_screenshot(True))
self.smileyButton.clicked.connect(parent.send_smiley) self.smileyButton.clicked.connect(parent.send_smiley)
self.stickerButton.clicked.connect(parent.send_sticker) self.stickerButton.clicked.connect(parent.send_sticker)
def leaveEvent(self, event): def leaveEvent(self, event):
self.close() self.close()
def eventFilter(self, object, event): def eventFilter(self, obj, event):
if event.type() == QtCore.QEvent.WindowDeactivate: if event.type() == QtCore.QEvent.WindowDeactivate:
self.close() self.close()
return False return False
class StickerItem(QtGui.QWidget): class StickerItem(QtWidgets.QWidget):
def __init__(self, fl): def __init__(self, fl):
super(StickerItem, self).__init__() super(StickerItem, self).__init__()
self._image_label = QtGui.QLabel(self) self._image_label = QtWidgets.QLabel(self)
self.path = fl self.path = fl
self.pixmap = QtGui.QPixmap() self.pixmap = QtGui.QPixmap()
self.pixmap.load(fl) self.pixmap.load(fl)
@ -290,7 +277,7 @@ class StickerItem(QtGui.QWidget):
self._image_label.setPixmap(self.pixmap) self._image_label.setPixmap(self.pixmap)
class StickerWindow(QtGui.QWidget): class StickerWindow(QtWidgets.QWidget):
"""Sticker selection window""" """Sticker selection window"""
def __init__(self, parent): def __init__(self, parent):
@ -298,16 +285,16 @@ class StickerWindow(QtGui.QWidget):
self.setWindowFlags(QtCore.Qt.FramelessWindowHint) self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
self.setMaximumSize(250, 200) self.setMaximumSize(250, 200)
self.setMinimumSize(250, 200) self.setMinimumSize(250, 200)
self.list = QtGui.QListWidget(self) self.list = QtWidgets.QListWidget(self)
self.list.setGeometry(QtCore.QRect(0, 0, 250, 200)) self.list.setGeometry(QtCore.QRect(0, 0, 250, 200))
self.arr = smileys.sticker_loader() self.arr = smileys.sticker_loader()
for sticker in self.arr: for sticker in self.arr:
item = StickerItem(sticker) item = StickerItem(sticker)
elem = QtGui.QListWidgetItem() elem = QtWidgets.QListWidgetItem()
elem.setSizeHint(QtCore.QSize(250, item.height())) elem.setSizeHint(QtCore.QSize(250, item.height()))
self.list.addItem(elem) self.list.addItem(elem)
self.list.setItemWidget(elem, item) self.list.setItemWidget(elem, item)
self.list.setVerticalScrollMode(QtGui.QAbstractItemView.ScrollPerPixel) self.list.setVerticalScrollMode(QtWidgets.QAbstractItemView.ScrollPerPixel)
self.list.setSpacing(3) self.list.setSpacing(3)
self.list.clicked.connect(self.click) self.list.clicked.connect(self.click)
self.parent = parent self.parent = parent
@ -329,56 +316,44 @@ class WelcomeScreen(CenteredWidget):
self.setMinimumSize(250, 200) self.setMinimumSize(250, 200)
self.center() self.center()
self.setAttribute(QtCore.Qt.WA_DeleteOnClose) self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
self.text = QtGui.QTextBrowser(self) self.text = QtWidgets.QTextBrowser(self)
self.text.setGeometry(QtCore.QRect(0, 0, 250, 170)) self.text.setGeometry(QtCore.QRect(0, 0, 250, 170))
self.text.setOpenExternalLinks(True) self.text.setOpenExternalLinks(True)
self.checkbox = QtGui.QCheckBox(self) self.checkbox = QtWidgets.QCheckBox(self)
self.checkbox.setGeometry(QtCore.QRect(5, 170, 240, 30)) self.checkbox.setGeometry(QtCore.QRect(5, 170, 240, 30))
self.checkbox.setText(QtGui.QApplication.translate('WelcomeScreen', "Don't show again", self.checkbox.setText(QtWidgets.QApplication.translate('WelcomeScreen', "Don't show again"))
None, QtGui.QApplication.UnicodeUTF8)) self.setWindowTitle(QtWidgets.QApplication.translate('WelcomeScreen', 'Tip of the day'))
self.setWindowTitle(QtGui.QApplication.translate('WelcomeScreen', 'Tip of the day',
None, QtGui.QApplication.UnicodeUTF8))
import random import random
num = random.randint(0, 10) num = random.randint(0, 10)
if num == 0: if num == 0:
text = QtGui.QApplication.translate('WelcomeScreen', 'Press Esc if you want hide app to tray.', text = QtWidgets.QApplication.translate('WelcomeScreen', 'Press Esc if you want hide app to tray.')
None, QtGui.QApplication.UnicodeUTF8)
elif num == 1: elif num == 1:
text = QtGui.QApplication.translate('WelcomeScreen', text = QtWidgets.QApplication.translate('WelcomeScreen',
'Right click on screenshot button hides app to tray during screenshot.', 'Right click on screenshot button hides app to tray during screenshot.')
None, QtGui.QApplication.UnicodeUTF8)
elif num == 2: elif num == 2:
text = QtGui.QApplication.translate('WelcomeScreen', text = QtWidgets.QApplication.translate('WelcomeScreen',
'You can use Tox over Tor. For more info read <a href="https://wiki.tox.chat/users/tox_over_tor_tot">this post</a>', 'You can use Tox over Tor. For more info read <a href="https://wiki.tox.chat/users/tox_over_tor_tot">this post</a>')
None, QtGui.QApplication.UnicodeUTF8)
elif num == 3: elif num == 3:
text = QtGui.QApplication.translate('WelcomeScreen', text = QtWidgets.QApplication.translate('WelcomeScreen',
'Use Settings -> Interface to customize interface.', 'Use Settings -> Interface to customize interface.')
None, QtGui.QApplication.UnicodeUTF8)
elif num == 4: elif num == 4:
text = QtGui.QApplication.translate('WelcomeScreen', text = QtWidgets.QApplication.translate('WelcomeScreen',
'Set profile password via Profile -> Settings. Password allows Toxygen encrypt your history and settings.', 'Set profile password via Profile -> Settings. Password allows Toxygen encrypt your history and settings.')
None, QtGui.QApplication.UnicodeUTF8)
elif num == 5: elif num == 5:
text = QtGui.QApplication.translate('WelcomeScreen', text = QtWidgets.QApplication.translate('WelcomeScreen',
'Since v0.1.3 Toxygen supports plugins. <a href="https://github.com/xveduk/toxygen/blob/master/docs/plugins.md">Read more</a>', 'Since v0.1.3 Toxygen supports plugins. <a href="https://github.com/xveduk/toxygen/blob/master/docs/plugins.md">Read more</a>')
None, QtGui.QApplication.UnicodeUTF8)
elif num in (6, 7): elif num in (6, 7):
text = QtGui.QApplication.translate('WelcomeScreen', text = QtWidgets.QApplication.translate('WelcomeScreen',
'Toxygen supports faux offline messages and file transfers. Send message or file to offline friend and he will get it later.', 'Toxygen supports faux offline messages and file transfers. Send message or file to offline friend and he will get it later.')
None, QtGui.QApplication.UnicodeUTF8)
elif num == 8: elif num == 8:
text = QtGui.QApplication.translate('WelcomeScreen', text = QtWidgets.QApplication.translate('WelcomeScreen',
'Delete single message in chat: make right click on spinner or message time and choose "Delete" in menu', 'Delete single message in chat: make right click on spinner or message time and choose "Delete" in menu')
None, QtGui.QApplication.UnicodeUTF8)
elif num == 9: elif num == 9:
text = QtGui.QApplication.translate('WelcomeScreen', text = QtWidgets.QApplication.translate('WelcomeScreen',
'Use right click on inline image to save it', 'Use right click on inline image to save it')
None, QtGui.QApplication.UnicodeUTF8)
else: else:
text = QtGui.QApplication.translate('WelcomeScreen', text = QtWidgets.QApplication.translate('WelcomeScreen',
'Set new NoSpam to avoid spam friend requests: Profile -> Settings -> Set new NoSpam.', 'Set new NoSpam to avoid spam friend requests: Profile -> Settings -> Set new NoSpam.')
None, QtGui.QApplication.UnicodeUTF8)
self.text.setHtml(text) self.text.setHtml(text)
self.checkbox.stateChanged.connect(self.not_show) self.checkbox.stateChanged.connect(self.not_show)
QtCore.QTimer.singleShot(1000, self.show) QtCore.QTimer.singleShot(1000, self.show)
@ -390,7 +365,7 @@ class WelcomeScreen(CenteredWidget):
s.save() s.save()
class MainMenuButton(QtGui.QPushButton): class MainMenuButton(QtWidgets.QPushButton):
def __init__(self, *args): def __init__(self, *args):
super().__init__(*args) super().__init__(*args)
@ -402,16 +377,18 @@ class MainMenuButton(QtGui.QPushButton):
super().setText(text) super().setText(text)
class ClickableLabel(QtGui.QLabel): class ClickableLabel(QtWidgets.QLabel):
clicked = QtCore.pyqtSignal()
def __init__(self, *args): def __init__(self, *args):
super().__init__(*args) super().__init__(*args)
def mouseReleaseEvent(self, ev): def mouseReleaseEvent(self, ev):
self.emit(QtCore.SIGNAL('clicked()')) self.clicked.emit()
class SearchScreen(QtGui.QWidget): class SearchScreen(QtWidgets.QWidget):
def __init__(self, messages, width, *args): def __init__(self, messages, width, *args):
super().__init__(*args) super().__init__(*args)
@ -429,23 +406,23 @@ class SearchScreen(QtGui.QWidget):
self.search_button.setScaledContents(False) self.search_button.setScaledContents(False)
self.search_button.setAlignment(QtCore.Qt.AlignCenter) self.search_button.setAlignment(QtCore.Qt.AlignCenter)
self.search_button.setPixmap(pixmap) self.search_button.setPixmap(pixmap)
self.connect(self.search_button, QtCore.SIGNAL('clicked()'), self.search) self.search_button.clicked.connect(self.search)
font = QtGui.QFont() font = QtGui.QFont()
font.setPointSize(32) font.setPointSize(32)
font.setBold(True) font.setBold(True)
self.prev_button = QtGui.QPushButton(self) self.prev_button = QtWidgets.QPushButton(self)
self.prev_button.setGeometry(width - 120, 0, 40, 40) self.prev_button.setGeometry(width - 120, 0, 40, 40)
self.prev_button.clicked.connect(self.prev) self.prev_button.clicked.connect(self.prev)
self.prev_button.setText('\u25B2') self.prev_button.setText('\u25B2')
self.next_button = QtGui.QPushButton(self) self.next_button = QtWidgets.QPushButton(self)
self.next_button.setGeometry(width - 80, 0, 40, 40) self.next_button.setGeometry(width - 80, 0, 40, 40)
self.next_button.clicked.connect(self.next) self.next_button.clicked.connect(self.next)
self.next_button.setText('\u25BC') self.next_button.setText('\u25BC')
self.close_button = QtGui.QPushButton(self) self.close_button = QtWidgets.QPushButton(self)
self.close_button.setGeometry(width - 40, 0, 40, 40) self.close_button.setGeometry(width - 40, 0, 40, 40)
self.close_button.clicked.connect(self.close) self.close_button.clicked.connect(self.close)
self.close_button.setText('×') self.close_button.setText('×')
@ -458,8 +435,7 @@ class SearchScreen(QtGui.QWidget):
self.retranslateUi() self.retranslateUi()
def retranslateUi(self): def retranslateUi(self):
self.search_text.setPlaceholderText(QtGui.QApplication.translate("MainWindow", "Search", None, self.search_text.setPlaceholderText(QtWidgets.QApplication.translate("MainWindow", "Search"))
QtGui.QApplication.UnicodeUTF8))
def show(self): def show(self):
super().show() super().show()
@ -515,15 +491,11 @@ class SearchScreen(QtGui.QWidget):
@staticmethod @staticmethod
def not_found(text): def not_found(text):
mbox = QtGui.QMessageBox() mbox = QtWidgets.QMessageBox()
mbox_text = QtGui.QApplication.translate("MainWindow", mbox_text = QtWidgets.QApplication.translate("MainWindow",
'Text "{}" was not found', 'Text "{}" was not found')
None,
QtGui.QApplication.UnicodeUTF8)
mbox.setText(mbox_text.format(text)) mbox.setText(mbox_text.format(text))
mbox.setWindowTitle(QtGui.QApplication.translate("MainWindow", mbox.setWindowTitle(QtWidgets.QApplication.translate("MainWindow",
'Not found', 'Not found'))
None,
QtGui.QApplication.UnicodeUTF8))
mbox.exec_() mbox.exec_()

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,4 @@
try: from PyQt5 import QtCore, QtWidgets
from PySide import QtCore, QtGui
except ImportError:
from PyQt4 import QtCore, QtGui
from util import curr_directory from util import curr_directory
import wave import wave
import pyaudio import pyaudio
@ -23,16 +20,16 @@ def tray_notification(title, text, tray, window):
:param tray: ref to tray icon :param tray: ref to tray icon
:param window: main window :param window: main window
""" """
if QtGui.QSystemTrayIcon.isSystemTrayAvailable(): if QtWidgets.QSystemTrayIcon.isSystemTrayAvailable():
if len(text) > 30: if len(text) > 30:
text = text[:27] + '...' text = text[:27] + '...'
tray.showMessage(title, text, QtGui.QSystemTrayIcon.NoIcon, 3000) tray.showMessage(title, text, QtWidgets.QSystemTrayIcon.NoIcon, 3000)
QtGui.QApplication.alert(window, 0) QtWidgets.QApplication.alert(window, 0)
def message_clicked(): def message_clicked():
window.setWindowState(window.windowState() & ~QtCore.Qt.WindowMinimized | QtCore.Qt.WindowActive) window.setWindowState(window.windowState() & ~QtCore.Qt.WindowMinimized | QtCore.Qt.WindowActive)
window.activateWindow() window.activateWindow()
tray.connect(tray, QtCore.SIGNAL("messageClicked()"), message_clicked) tray.messageClicked.connect(message_clicked)
class AudioFile: class AudioFile:

View File

@ -1,8 +1,5 @@
from widgets import CenteredWidget, LineEdit from widgets import CenteredWidget, LineEdit
try: from PyQt5 import QtCore, QtWidgets
from PySide import QtCore, QtGui
except ImportError:
from PyQt4 import QtCore, QtGui
class PasswordArea(LineEdit): class PasswordArea(LineEdit):
@ -10,7 +7,7 @@ class PasswordArea(LineEdit):
def __init__(self, parent): def __init__(self, parent):
super(PasswordArea, self).__init__(parent) super(PasswordArea, self).__init__(parent)
self.parent = parent self.parent = parent
self.setEchoMode(QtGui.QLineEdit.EchoMode.Password) self.setEchoMode(QtWidgets.QLineEdit.Password)
def keyPressEvent(self, event): def keyPressEvent(self, event):
if event.key() == QtCore.Qt.Key_Return: if event.key() == QtCore.Qt.Key_Return:
@ -31,18 +28,18 @@ class PasswordScreenBase(CenteredWidget):
self.setMinimumSize(QtCore.QSize(360, 170)) self.setMinimumSize(QtCore.QSize(360, 170))
self.setMaximumSize(QtCore.QSize(360, 170)) self.setMaximumSize(QtCore.QSize(360, 170))
self.enter_pass = QtGui.QLabel(self) self.enter_pass = QtWidgets.QLabel(self)
self.enter_pass.setGeometry(QtCore.QRect(30, 10, 300, 30)) self.enter_pass.setGeometry(QtCore.QRect(30, 10, 300, 30))
self.password = PasswordArea(self) self.password = PasswordArea(self)
self.password.setGeometry(QtCore.QRect(30, 50, 300, 30)) self.password.setGeometry(QtCore.QRect(30, 50, 300, 30))
self.button = QtGui.QPushButton(self) self.button = QtWidgets.QPushButton(self)
self.button.setGeometry(QtCore.QRect(30, 90, 300, 30)) self.button.setGeometry(QtCore.QRect(30, 90, 300, 30))
self.button.setText('OK') self.button.setText('OK')
self.button.clicked.connect(self.button_click) self.button.clicked.connect(self.button_click)
self.warning = QtGui.QLabel(self) self.warning = QtWidgets.QLabel(self)
self.warning.setGeometry(QtCore.QRect(30, 130, 300, 30)) self.warning.setGeometry(QtCore.QRect(30, 130, 300, 30))
self.warning.setStyleSheet('QLabel { color: #F70D1A; }') self.warning.setStyleSheet('QLabel { color: #F70D1A; }')
self.warning.setVisible(False) self.warning.setVisible(False)
@ -61,9 +58,9 @@ class PasswordScreenBase(CenteredWidget):
super(PasswordScreenBase, self).keyPressEvent(event) super(PasswordScreenBase, self).keyPressEvent(event)
def retranslateUi(self): def retranslateUi(self):
self.setWindowTitle(QtGui.QApplication.translate("pass", "Enter password", None, QtGui.QApplication.UnicodeUTF8)) self.setWindowTitle(QtWidgets.QApplication.translate("pass", "Enter password"))
self.enter_pass.setText(QtGui.QApplication.translate("pass", "Password:", None, QtGui.QApplication.UnicodeUTF8)) self.enter_pass.setText(QtWidgets.QApplication.translate("pass", "Password:"))
self.warning.setText(QtGui.QApplication.translate("pass", "Incorrect password", None, QtGui.QApplication.UnicodeUTF8)) self.warning.setText(QtWidgets.QApplication.translate("pass", "Incorrect password"))
class PasswordScreen(PasswordScreenBase): class PasswordScreen(PasswordScreenBase):
@ -116,37 +113,32 @@ class SetProfilePasswordScreen(CenteredWidget):
self.setMaximumSize(QtCore.QSize(700, 200)) self.setMaximumSize(QtCore.QSize(700, 200))
self.password = LineEdit(self) self.password = LineEdit(self)
self.password.setGeometry(QtCore.QRect(40, 10, 300, 30)) self.password.setGeometry(QtCore.QRect(40, 10, 300, 30))
self.password.setEchoMode(QtGui.QLineEdit.EchoMode.Password) self.password.setEchoMode(QtWidgets.QLineEdit.Password)
self.confirm_password = LineEdit(self) self.confirm_password = LineEdit(self)
self.confirm_password.setGeometry(QtCore.QRect(40, 50, 300, 30)) self.confirm_password.setGeometry(QtCore.QRect(40, 50, 300, 30))
self.confirm_password.setEchoMode(QtGui.QLineEdit.EchoMode.Password) self.confirm_password.setEchoMode(QtWidgets.QLineEdit.Password)
self.set_password = QtGui.QPushButton(self) self.set_password = QtWidgets.QPushButton(self)
self.set_password.setGeometry(QtCore.QRect(40, 100, 300, 30)) self.set_password.setGeometry(QtCore.QRect(40, 100, 300, 30))
self.set_password.clicked.connect(self.new_password) self.set_password.clicked.connect(self.new_password)
self.not_match = QtGui.QLabel(self) self.not_match = QtWidgets.QLabel(self)
self.not_match.setGeometry(QtCore.QRect(350, 50, 300, 30)) self.not_match.setGeometry(QtCore.QRect(350, 50, 300, 30))
self.not_match.setVisible(False) self.not_match.setVisible(False)
self.not_match.setStyleSheet('QLabel { color: #BC1C1C; }') self.not_match.setStyleSheet('QLabel { color: #BC1C1C; }')
self.warning = QtGui.QLabel(self) self.warning = QtWidgets.QLabel(self)
self.warning.setGeometry(QtCore.QRect(40, 160, 500, 30)) self.warning.setGeometry(QtCore.QRect(40, 160, 500, 30))
self.warning.setStyleSheet('QLabel { color: #BC1C1C; }') self.warning.setStyleSheet('QLabel { color: #BC1C1C; }')
def retranslateUi(self): def retranslateUi(self):
self.setWindowTitle(QtGui.QApplication.translate("PasswordScreen", "Profile password", None, self.setWindowTitle(QtWidgets.QApplication.translate("PasswordScreen", "Profile password"))
QtGui.QApplication.UnicodeUTF8))
self.password.setPlaceholderText( self.password.setPlaceholderText(
QtGui.QApplication.translate("PasswordScreen", "Password (at least 8 symbols)", None, QtWidgets.QApplication.translate("PasswordScreen", "Password (at least 8 symbols)"))
QtGui.QApplication.UnicodeUTF8))
self.confirm_password.setPlaceholderText( self.confirm_password.setPlaceholderText(
QtGui.QApplication.translate("PasswordScreen", "Confirm password", None, QtWidgets.QApplication.translate("PasswordScreen", "Confirm password"))
QtGui.QApplication.UnicodeUTF8))
self.set_password.setText( self.set_password.setText(
QtGui.QApplication.translate("PasswordScreen", "Set password", None, QtGui.QApplication.UnicodeUTF8)) QtWidgets.QApplication.translate("PasswordScreen", "Set password"))
self.not_match.setText(QtGui.QApplication.translate("PasswordScreen", "Passwords do not match", None, self.not_match.setText(QtWidgets.QApplication.translate("PasswordScreen", "Passwords do not match"))
QtGui.QApplication.UnicodeUTF8))
self.warning.setText( self.warning.setText(
QtGui.QApplication.translate("PasswordScreen", "There is no way to recover lost passwords", None, QtWidgets.QApplication.translate("PasswordScreen", "There is no way to recover lost passwords"))
QtGui.QApplication.UnicodeUTF8))
def new_password(self): def new_password(self):
if self.password.text() == self.confirm_password.text(): if self.password.text() == self.confirm_password.text():
@ -155,10 +147,8 @@ class SetProfilePasswordScreen(CenteredWidget):
self.close() self.close()
else: else:
self.not_match.setText( self.not_match.setText(
QtGui.QApplication.translate("PasswordScreen", "Password must be at least 8 symbols", None, QtWidgets.QApplication.translate("PasswordScreen", "Password must be at least 8 symbols"))
QtGui.QApplication.UnicodeUTF8))
self.not_match.setVisible(True) self.not_match.setVisible(True)
else: else:
self.not_match.setText(QtGui.QApplication.translate("PasswordScreen", "Passwords do not match", None, self.not_match.setText(QtWidgets.QApplication.translate("PasswordScreen", "Passwords do not match"))
QtGui.QApplication.UnicodeUTF8))
self.not_match.setVisible(True) self.not_match.setVisible(True)

View File

@ -1,8 +1,5 @@
import os import os
try: from PyQt5 import QtCore, QtWidgets
from PySide import QtCore, QtGui
except ImportError:
from PyQt4 import QtCore, QtGui
MAX_SHORT_NAME_LENGTH = 5 MAX_SHORT_NAME_LENGTH = 5
@ -137,10 +134,10 @@ class PluginSuperClass:
:param command: string with command :param command: string with command
""" """
if command == 'help': if command == 'help':
msgbox = QtGui.QMessageBox() msgbox = QtWidgets.QMessageBox()
title = QtGui.QApplication.translate("PluginWindow", "List of commands for plugin {}", None, QtGui.QApplication.UnicodeUTF8) title = QtWidgets.QApplication.translate("PluginWindow", "List of commands for plugin {}")
msgbox.setWindowTitle(title.format(self._name)) msgbox.setWindowTitle(title.format(self._name))
msgbox.setText(QtGui.QApplication.translate("PluginWindow", "No commands available", None, QtGui.QApplication.UnicodeUTF8)) msgbox.setText(QtWidgets.QApplication.translate("PluginWindow", "No commands available"))
msgbox.exec_() msgbox.exec_()
# ----------------------------------------------------------------------------------------------------------------- # -----------------------------------------------------------------------------------------------------------------
@ -151,7 +148,7 @@ class PluginSuperClass:
""" """
This method loads translations for GUI This method loads translations for GUI
""" """
app = QtGui.QApplication.instance() app = QtWidgets.QApplication.instance()
langs = self._settings.supported_languages() langs = self._settings.supported_languages()
curr_lang = self._settings['language'] curr_lang = self._settings['language']
if curr_lang in langs: if curr_lang in langs:

View File

@ -1,8 +1,5 @@
from list_items import * from list_items import *
try: from PyQt5 import QtGui, QtWidgets
from PySide import QtCore, QtGui
except ImportError:
from PyQt4 import QtCore, QtGui
from friend import * from friend import *
from settings import * from settings import *
from toxcore_enums_and_consts import * from toxcore_enums_and_consts import *
@ -17,6 +14,8 @@ import avwidgets
import plugin_support import plugin_support
import basecontact import basecontact
import items_factory import items_factory
import cv2
import threading
class Profile(basecontact.BaseContact, Singleton): class Profile(basecontact.BaseContact, Singleton):
@ -39,6 +38,7 @@ class Profile(basecontact.BaseContact, Singleton):
self._tox = tox self._tox = tox
self._file_transfers = {} # dict of file transfers. key - tuple (friend_number, file_number) self._file_transfers = {} # dict of file transfers. key - tuple (friend_number, file_number)
self._call = calls.AV(tox.AV) # object with data about calls self._call = calls.AV(tox.AV) # object with data about calls
self._call_widgets = {} # dict of incoming call widgets
self._incoming_calls = set() self._incoming_calls = set()
self._load_history = True self._load_history = True
self._waiting_for_reconnection = False self._waiting_for_reconnection = False
@ -97,8 +97,7 @@ class Profile(basecontact.BaseContact, Singleton):
tmp = self.name tmp = self.name
super(Profile, self).set_name(value.encode('utf-8')) super(Profile, self).set_name(value.encode('utf-8'))
self._tox.self_set_name(self._name.encode('utf-8')) self._tox.self_set_name(self._name.encode('utf-8'))
message = QtGui.QApplication.translate("MainWindow", 'User {} is now known as {}', None, message = QtWidgets.QApplication.translate("MainWindow", 'User {} is now known as {}')
QtGui.QApplication.UnicodeUTF8)
message = message.format(tmp, value) message = message.format(tmp, value)
for friend in self._contacts: for friend in self._contacts:
friend.append_message(InfoMessage(message, time.time())) friend.append_message(InfoMessage(message, time.time()))
@ -246,7 +245,7 @@ class Profile(basecontact.BaseContact, Singleton):
if message.get_status() in ACTIVE_FILE_TRANSFERS: # active file transfer if message.get_status() in ACTIVE_FILE_TRANSFERS: # active file transfer
try: try:
ft = self._file_transfers[(message.get_friend_number(), message.get_file_number())] ft = self._file_transfers[(message.get_friend_number(), message.get_file_number())]
ft.set_state_changed_handler(item.update) ft.set_state_changed_handler(item.update_transfer_state)
ft.signal() ft.signal()
except: except:
print('Incoming not started transfer - no info found') print('Incoming not started transfer - no info found')
@ -312,7 +311,7 @@ class Profile(basecontact.BaseContact, Singleton):
friend.set_name(name) friend.set_name(name)
name = str(name, 'utf-8') name = str(name, 'utf-8')
if friend.name == name and tmp != name: if friend.name == name and tmp != name:
message = QtGui.QApplication.translate("MainWindow", 'User {} is now known as {}', None, QtGui.QApplication.UnicodeUTF8) message = QtWidgets.QApplication.translate("MainWindow", 'User {} is now known as {}')
message = message.format(tmp, name) message = message.format(tmp, name)
friend.append_message(InfoMessage(message, time.time())) friend.append_message(InfoMessage(message, time.time()))
friend.actions = True friend.actions = True
@ -566,7 +565,7 @@ class Profile(basecontact.BaseContact, Singleton):
if message.get_status() in ACTIVE_FILE_TRANSFERS: # active file transfer if message.get_status() in ACTIVE_FILE_TRANSFERS: # active file transfer
try: try:
ft = self._file_transfers[(message.get_friend_number(), message.get_file_number())] ft = self._file_transfers[(message.get_friend_number(), message.get_file_number())]
ft.set_state_changed_handler(item.update) ft.set_state_changed_handler(item.update_transfer_state)
ft.signal() ft.signal()
except: except:
print('Incoming not started transfer - no info found') print('Incoming not started transfer - no info found')
@ -663,17 +662,15 @@ class Profile(basecontact.BaseContact, Singleton):
""" """
friend = self._contacts[num] friend = self._contacts[num]
name = friend.name name = friend.name
dialog = QtGui.QApplication.translate('MainWindow', dialog = QtWidgets.QApplication.translate('MainWindow',
"Enter new alias for friend {} or leave empty to use friend's name:", "Enter new alias for friend {} or leave empty to use friend's name:")
None, QtGui.QApplication.UnicodeUTF8)
dialog = dialog.format(name) dialog = dialog.format(name)
title = QtGui.QApplication.translate('MainWindow', title = QtWidgets.QApplication.translate('MainWindow',
'Set alias', 'Set alias')
None, QtGui.QApplication.UnicodeUTF8)
text, ok = QtGui.QInputDialog.getText(None, text, ok = QtGui.QInputDialog.getText(None,
title, title,
dialog, dialog,
QtGui.QLineEdit.Normal, QtWidgets.QLineEdit.Normal,
name) name)
if ok: if ok:
settings = Settings.get_instance() settings = Settings.get_instance()
@ -798,9 +795,9 @@ class Profile(basecontact.BaseContact, Singleton):
raise Exception('TOX DNS lookup failed') raise Exception('TOX DNS lookup failed')
if len(tox_id) == TOX_PUBLIC_KEY_SIZE * 2: # public key if len(tox_id) == TOX_PUBLIC_KEY_SIZE * 2: # public key
self.add_friend(tox_id) self.add_friend(tox_id)
msgBox = QtGui.QMessageBox() msgBox = QtWidgets.QMessageBox()
msgBox.setWindowTitle(QtGui.QApplication.translate("MainWindow", "Friend added", None, QtGui.QApplication.UnicodeUTF8)) msgBox.setWindowTitle(QtWidgets.QApplication.translate("MainWindow", "Friend added"))
text = (QtGui.QApplication.translate("MainWindow", 'Friend added without sending friend request', None, QtGui.QApplication.UnicodeUTF8)) text = (QtWidgets.QApplication.translate("MainWindow", 'Friend added without sending friend request'))
msgBox.setText(text) msgBox.setText(text)
msgBox.exec_() msgBox.exec_()
else: else:
@ -826,11 +823,11 @@ class Profile(basecontact.BaseContact, Singleton):
:param message: message :param message: message
""" """
try: try:
text = QtGui.QApplication.translate('MainWindow', 'User {} wants to add you to contact list. Message:\n{}', None, QtGui.QApplication.UnicodeUTF8) text = QtWidgets.QApplication.translate('MainWindow', 'User {} wants to add you to contact list. Message:\n{}')
info = text.format(tox_id, message) info = text.format(tox_id, message)
fr_req = QtGui.QApplication.translate('MainWindow', 'Friend request', None, QtGui.QApplication.UnicodeUTF8) fr_req = QtWidgets.QApplication.translate('MainWindow', 'Friend request')
reply = QtGui.QMessageBox.question(None, fr_req, info, QtGui.QMessageBox.Yes, QtGui.QMessageBox.No) reply = QtWidgets.QMessageBox.question(None, fr_req, info, QtWidgets.QMessageBox.Yes, QtWidgets.QMessageBox.No)
if reply == QtGui.QMessageBox.Yes: # accepted if reply == QtWidgets.QMessageBox.Yes: # accepted
self.add_friend(tox_id) self.add_friend(tox_id)
data = self._tox.get_savedata() data = self._tox.get_savedata()
ProfileHelper.get_instance().save_profile(data) ProfileHelper.get_instance().save_profile(data)
@ -942,7 +939,7 @@ class Profile(basecontact.BaseContact, Singleton):
if friend_number == self.get_active_number(): if friend_number == self.get_active_number():
item = self.create_file_transfer_item(tm) item = self.create_file_transfer_item(tm)
if accepted: if accepted:
self._file_transfers[(friend_number, file_number)].set_state_changed_handler(item.update) self._file_transfers[(friend_number, file_number)].set_state_changed_handler(item.update_transfer_state)
self._messages.scrollToBottom() self._messages.scrollToBottom()
else: else:
friend.actions = True friend.actions = True
@ -1031,7 +1028,7 @@ class Profile(basecontact.BaseContact, Singleton):
self._file_transfers[(friend_number, file_number)] = rt self._file_transfers[(friend_number, file_number)] = rt
self._tox.file_control(friend_number, file_number, TOX_FILE_CONTROL['RESUME']) self._tox.file_control(friend_number, file_number, TOX_FILE_CONTROL['RESUME'])
if item is not None: if item is not None:
rt.set_state_changed_handler(item.update) rt.set_state_changed_handler(item.update_transfer_state)
self.get_friend_by_number(friend_number).update_transfer_data(file_number, self.get_friend_by_number(friend_number).update_transfer_data(file_number,
TOX_FILE_TRANSFER_STATE['RUNNING']) TOX_FILE_TRANSFER_STATE['RUNNING'])
@ -1070,7 +1067,7 @@ class Profile(basecontact.BaseContact, Singleton):
st.get_file_number()) st.get_file_number())
item = self.create_file_transfer_item(tm) item = self.create_file_transfer_item(tm)
friend.append_message(tm) friend.append_message(tm)
st.set_state_changed_handler(item.update) st.set_state_changed_handler(item.update_transfer_state)
self._messages.scrollToBottom() self._messages.scrollToBottom()
def send_file(self, path, number=None, is_resend=False, file_id=None): def send_file(self, path, number=None, is_resend=False, file_id=None):
@ -1103,7 +1100,7 @@ class Profile(basecontact.BaseContact, Singleton):
st.get_file_number()) st.get_file_number())
if friend_number == self.get_active_number(): if friend_number == self.get_active_number():
item = self.create_file_transfer_item(tm) item = self.create_file_transfer_item(tm)
st.set_state_changed_handler(item.update) st.set_state_changed_handler(item.update_transfer_state)
self._messages.scrollToBottom() self._messages.scrollToBottom()
self._contacts[friend_number].append_message(tm) self._contacts[friend_number].append_message(tm)
@ -1119,7 +1116,6 @@ class Profile(basecontact.BaseContact, Singleton):
""" """
self._file_transfers[(friend_number, file_number)].send_chunk(position, size) self._file_transfers[(friend_number, file_number)].send_chunk(position, size)
@QtCore.Slot(int, int)
def transfer_finished(self, friend_number, file_number): def transfer_finished(self, friend_number, file_number):
transfer = self._file_transfers[(friend_number, file_number)] transfer = self._file_transfers[(friend_number, file_number)]
t = type(transfer) t = type(transfer)
@ -1136,7 +1132,7 @@ class Profile(basecontact.BaseContact, Singleton):
if friend_number == self.get_active_number(): if friend_number == self.get_active_number():
count = self._messages.count() count = self._messages.count()
if count + i + 1 >= 0: if count + i + 1 >= 0:
elem = QtGui.QListWidgetItem() elem = QtWidgets.QListWidgetItem()
item = InlineImageItem(transfer.get_data(), self._messages.width(), elem) item = InlineImageItem(transfer.get_data(), self._messages.width(), elem)
elem.setSizeHint(QtCore.QSize(self._messages.width(), item.height())) elem.setSizeHint(QtCore.QSize(self._messages.width(), item.height()))
self._messages.insertItem(count + i + 1, elem) self._messages.insertItem(count + i + 1, elem)
@ -1206,11 +1202,9 @@ class Profile(basecontact.BaseContact, Singleton):
self._call(num, audio, video) self._call(num, audio, video)
self._screen.active_call() self._screen.active_call()
if video: if video:
text = QtGui.QApplication.translate("incoming_call", "Outgoing video call", None, text = QtWidgets.QApplication.translate("incoming_call", "Outgoing video call")
QtGui.QApplication.UnicodeUTF8)
else: else:
text = QtGui.QApplication.translate("incoming_call", "Outgoing audio call", None, text = QtWidgets.QApplication.translate("incoming_call", "Outgoing audio call")
QtGui.QApplication.UnicodeUTF8)
self.get_curr_friend().append_message(InfoMessage(text, time.time())) self.get_curr_friend().append_message(InfoMessage(text, time.time()))
self.create_message_item(text, time.time(), '', MESSAGE_TYPE['INFO_MESSAGE']) self.create_message_item(text, time.time(), '', MESSAGE_TYPE['INFO_MESSAGE'])
self._messages.scrollToBottom() self._messages.scrollToBottom()
@ -1225,11 +1219,9 @@ class Profile(basecontact.BaseContact, Singleton):
return return
friend = self.get_friend_by_number(friend_number) friend = self.get_friend_by_number(friend_number)
if video: if video:
text = QtGui.QApplication.translate("incoming_call", "Incoming video call", None, text = QtWidgets.QApplication.translate("incoming_call", "Incoming video call")
QtGui.QApplication.UnicodeUTF8)
else: else:
text = QtGui.QApplication.translate("incoming_call", "Incoming audio call", None, text = QtWidgets.QApplication.translate("incoming_call", "Incoming audio call")
QtGui.QApplication.UnicodeUTF8)
friend.append_message(InfoMessage(text, time.time())) friend.append_message(InfoMessage(text, time.time()))
self._incoming_calls.add(friend_number) self._incoming_calls.add(friend_number)
if friend_number == self.get_active_number(): if friend_number == self.get_active_number():
@ -1238,10 +1230,9 @@ class Profile(basecontact.BaseContact, Singleton):
self._messages.scrollToBottom() self._messages.scrollToBottom()
else: else:
friend.actions = True friend.actions = True
# TODO: dict of widgets self._call_widgets[friend_number] = avwidgets.IncomingCallWidget(friend_number, text, friend.name)
self._call_widget = avwidgets.IncomingCallWidget(friend_number, text, friend.name) self._call_widgets[friend_number].set_pixmap(friend.get_pixmap())
self._call_widget.set_pixmap(friend.get_pixmap()) self._call_widgets[friend_number].show()
self._call_widget.show()
def accept_call(self, friend_number, audio, video): def accept_call(self, friend_number, audio, video):
""" """
@ -1251,8 +1242,7 @@ class Profile(basecontact.BaseContact, Singleton):
self._screen.active_call() self._screen.active_call()
if friend_number in self._incoming_calls: if friend_number in self._incoming_calls:
self._incoming_calls.remove(friend_number) self._incoming_calls.remove(friend_number)
if hasattr(self, '_call_widget'): del self._call_widgets[friend_number]
del self._call_widget
def stop_call(self, friend_number, by_friend): def stop_call(self, friend_number, by_friend):
""" """
@ -1260,14 +1250,15 @@ class Profile(basecontact.BaseContact, Singleton):
""" """
if friend_number in self._incoming_calls: if friend_number in self._incoming_calls:
self._incoming_calls.remove(friend_number) self._incoming_calls.remove(friend_number)
text = QtGui.QApplication.translate("incoming_call", "Call declined", None, QtGui.QApplication.UnicodeUTF8) text = QtWidgets.QApplication.translate("incoming_call", "Call declined")
else: else:
text = QtGui.QApplication.translate("incoming_call", "Call finished", None, QtGui.QApplication.UnicodeUTF8) text = QtWidgets.QApplication.translate("incoming_call", "Call finished")
self._screen.call_finished() self._screen.call_finished()
self._call.finish_call(friend_number, by_friend) # finish or decline call self._call.finish_call(friend_number, by_friend) # finish or decline call
if hasattr(self, '_call_widget'): if hasattr(self, '_call_widget'):
self._call_widget.close() self._call_widget[friend_number].close()
del self._call_widget del self._call_widget[friend_number]
threading.Timer(2.0, lambda: cv2.destroyWindow(str(friend_number))).start()
friend = self.get_friend_by_number(friend_number) friend = self.get_friend_by_number(friend_number)
friend.append_message(InfoMessage(text, time.time())) friend.append_message(InfoMessage(text, time.time()))
if friend_number == self.get_active_number(): if friend_number == self.get_active_number():

View File

@ -47,6 +47,7 @@ class Settings(dict, Singleton):
self.audio = {'input': p.get_default_input_device_info()['index'] if input_devices else -1, self.audio = {'input': p.get_default_input_device_info()['index'] if input_devices else -1,
'output': p.get_default_output_device_info()['index'] if output_devices else -1, 'output': p.get_default_output_device_info()['index'] if output_devices else -1,
'enabled': input_devices and output_devices} 'enabled': input_devices and output_devices}
self.video = {'device': 0, 'width': 640, 'height': 480}
@staticmethod @staticmethod
def get_auto_profile(): def get_auto_profile():

View File

@ -2,10 +2,7 @@ import util
import json import json
import os import os
from collections import OrderedDict from collections import OrderedDict
try: from PyQt5 import QtCore
from PySide import QtCore
except ImportError:
from PyQt4 import QtCore
class SmileyLoader(util.Singleton): class SmileyLoader(util.Singleton):

View File

@ -1,7 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
try: try:
from PySide import QtCore from PyQt5 import QtCore
except ImportError: except ImportError:
from PyQt4 import QtCore from PyQt4 import QtCore

View File

@ -2,10 +2,7 @@ import json
import urllib.request import urllib.request
from util import log from util import log
import settings import settings
try: from PyQt5 import QtNetwork, QtCore
from PySide import QtNetwork, QtCore
except:
from PyQt4 import QtNetwork, QtCore
def tox_dns(email): def tox_dns(email):
@ -33,7 +30,8 @@ def tox_dns(email):
netman.setProxy(proxy) netman.setProxy(proxy)
for url in urls: for url in urls:
try: try:
request = QtNetwork.QNetworkRequest(url) request = QtNetwork.QNetworkRequest()
request.setUrl(QtCore.QUrl(url))
request.setHeader(QtNetwork.QNetworkRequest.ContentTypeHeader, "application/json") request.setHeader(QtNetwork.QNetworkRequest.ContentTypeHeader, "application/json")
reply = netman.post(request, bytes(json.dumps(data), 'utf-8')) reply = netman.post(request, bytes(json.dumps(data), 'utf-8'))

View File

@ -3,10 +3,7 @@ import os
import settings import settings
import platform import platform
import urllib import urllib
try: from PyQt5 import QtNetwork, QtCore
from PySide import QtNetwork, QtCore
except ImportError:
from PyQt4 import QtNetwork, QtCore
import subprocess import subprocess

View File

@ -4,7 +4,8 @@ import shutil
import sys import sys
import re import re
program_version = '0.2.9'
program_version = '0.3.0'
def cached(func): def cached(func):

View File

@ -1,10 +1,7 @@
try: from PyQt5 import QtCore, QtGui, QtWidgets
from PySide import QtCore, QtGui
except ImportError:
from PyQt4 import QtCore, QtGui
class DataLabel(QtGui.QLabel): class DataLabel(QtWidgets.QLabel):
""" """
Label with elided text Label with elided text
""" """
@ -15,14 +12,14 @@ class DataLabel(QtGui.QLabel):
super().setText(text) super().setText(text)
class ComboBox(QtGui.QComboBox): class ComboBox(QtWidgets.QComboBox):
def __init__(self, *args): def __init__(self, *args):
super().__init__(*args) super().__init__(*args)
self.view().setSizePolicy(QtGui.QSizePolicy.MinimumExpanding, QtGui.QSizePolicy.Expanding) self.view().setSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Expanding)
class CenteredWidget(QtGui.QWidget): class CenteredWidget(QtWidgets.QWidget):
def __init__(self): def __init__(self):
super(CenteredWidget, self).__init__() super(CenteredWidget, self).__init__()
@ -30,12 +27,12 @@ class CenteredWidget(QtGui.QWidget):
def center(self): def center(self):
qr = self.frameGeometry() qr = self.frameGeometry()
cp = QtGui.QDesktopWidget().availableGeometry().center() cp = QtWidgets.QDesktopWidget().availableGeometry().center()
qr.moveCenter(cp) qr.moveCenter(cp)
self.move(qr.topLeft()) self.move(qr.topLeft())
class LineEdit(QtGui.QLineEdit): class LineEdit(QtWidgets.QLineEdit):
def __init__(self, parent=None): def __init__(self, parent=None):
super(LineEdit, self).__init__(parent) super(LineEdit, self).__init__(parent)
@ -46,25 +43,27 @@ class LineEdit(QtGui.QLineEdit):
del menu del menu
class QRightClickButton(QtGui.QPushButton): class QRightClickButton(QtWidgets.QPushButton):
""" """
Button with right click support Button with right click support
""" """
rightClicked = QtCore.pyqtSignal()
def __init__(self, parent): def __init__(self, parent):
super(QRightClickButton, self).__init__(parent) super(QRightClickButton, self).__init__(parent)
def mousePressEvent(self, event): def mousePressEvent(self, event):
if event.button() == QtCore.Qt.RightButton: if event.button() == QtCore.Qt.RightButton:
self.emit(QtCore.SIGNAL("rightClicked()")) self.rightClicked.emit()
else: else:
super(QRightClickButton, self).mousePressEvent(event) super(QRightClickButton, self).mousePressEvent(event)
class RubberBand(QtGui.QRubberBand): class RubberBand(QtWidgets.QRubberBand):
def __init__(self): def __init__(self):
super(RubberBand, self).__init__(QtGui.QRubberBand.Rectangle, None) super(RubberBand, self).__init__(QtWidgets.QRubberBand.Rectangle, None)
self.setPalette(QtGui.QPalette(QtCore.Qt.transparent)) self.setPalette(QtGui.QPalette(QtCore.Qt.transparent))
self.pen = QtGui.QPen(QtCore.Qt.blue, 4) self.pen = QtGui.QPen(QtCore.Qt.blue, 4)
self.pen.setStyle(QtCore.Qt.SolidLine) self.pen.setStyle(QtCore.Qt.SolidLine)
@ -86,29 +85,21 @@ def create_menu(menu):
text = action.text() text = action.text()
if 'Link Location' in text: if 'Link Location' in text:
text = text.replace('Copy &Link Location', text = text.replace('Copy &Link Location',
QtGui.QApplication.translate("MainWindow", "Copy link location", None, QtWidgets.QApplication.translate("MainWindow", "Copy link location"))
QtGui.QApplication.UnicodeUTF8))
elif '&Copy' in text: elif '&Copy' in text:
text = text.replace('&Copy', QtGui.QApplication.translate("MainWindow", "Copy", None, text = text.replace('&Copy', QtWidgets.QApplication.translate("MainWindow", "Copy"))
QtGui.QApplication.UnicodeUTF8))
elif 'All' in text: elif 'All' in text:
text = text.replace('Select All', QtGui.QApplication.translate("MainWindow", "Select all", None, text = text.replace('Select All', QtWidgets.QApplication.translate("MainWindow", "Select all"))
QtGui.QApplication.UnicodeUTF8))
elif 'Delete' in text: elif 'Delete' in text:
text = text.replace('Delete', QtGui.QApplication.translate("MainWindow", "Delete", None, text = text.replace('Delete', QtWidgets.QApplication.translate("MainWindow", "Delete"))
QtGui.QApplication.UnicodeUTF8))
elif '&Paste' in text: elif '&Paste' in text:
text = text.replace('&Paste', QtGui.QApplication.translate("MainWindow", "Paste", None, text = text.replace('&Paste', QtWidgets.QApplication.translate("MainWindow", "Paste"))
QtGui.QApplication.UnicodeUTF8))
elif 'Cu&t' in text: elif 'Cu&t' in text:
text = text.replace('Cu&t', QtGui.QApplication.translate("MainWindow", "Cut", None, text = text.replace('Cu&t', QtWidgets.QApplication.translate("MainWindow", "Cut"))
QtGui.QApplication.UnicodeUTF8))
elif '&Undo' in text: elif '&Undo' in text:
text = text.replace('&Undo', QtGui.QApplication.translate("MainWindow", "Undo", None, text = text.replace('&Undo', QtWidgets.QApplication.translate("MainWindow", "Undo"))
QtGui.QApplication.UnicodeUTF8))
elif '&Redo' in text: elif '&Redo' in text:
text = text.replace('&Redo', QtGui.QApplication.translate("MainWindow", "Redo", None, text = text.replace('&Redo', QtWidgets.QApplication.translate("MainWindow", "Redo"))
QtGui.QApplication.UnicodeUTF8))
else: else:
menu.removeAction(action) menu.removeAction(action)
continue continue
@ -124,12 +115,12 @@ class MultilineEdit(CenteredWidget):
self.setMinimumSize(QtCore.QSize(350, 200)) self.setMinimumSize(QtCore.QSize(350, 200))
self.setMaximumSize(QtCore.QSize(350, 200)) self.setMaximumSize(QtCore.QSize(350, 200))
self.setWindowTitle(title) self.setWindowTitle(title)
self.edit = QtGui.QTextEdit(self) self.edit = QtWidgets.QTextEdit(self)
self.edit.setGeometry(QtCore.QRect(0, 0, 350, 150)) self.edit.setGeometry(QtCore.QRect(0, 0, 350, 150))
self.edit.setText(text) self.edit.setText(text)
self.button = QtGui.QPushButton(self) self.button = QtWidgets.QPushButton(self)
self.button.setGeometry(QtCore.QRect(0, 150, 350, 50)) self.button.setGeometry(QtCore.QRect(0, 150, 350, 50))
self.button.setText(QtGui.QApplication.translate("MainWindow", "Save", None, QtGui.QApplication.UnicodeUTF8)) self.button.setText(QtWidgets.QApplication.translate("MainWindow", "Save"))
self.button.clicked.connect(self.button_click) self.button.clicked.connect(self.button_click)
self.center() self.center()
self.save = save self.save = save