From d8dd16e8659a36279feeb410f602d383ec285192 Mon Sep 17 00:00:00 2001 From: ingvar1995 Date: Fri, 5 Aug 2016 18:34:38 +0300 Subject: [PATCH 01/21] init commit --- toxygen/avwidgets.py | 5 ++++- toxygen/callbacks.py | 8 ++++++++ toxygen/calls.py | 1 + 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/toxygen/avwidgets.py b/toxygen/avwidgets.py index 480fa28..4ae329d 100644 --- a/toxygen/avwidgets.py +++ b/toxygen/avwidgets.py @@ -10,6 +10,9 @@ import wave import settings from util import curr_directory +# TODO: widget for video +# TODO: improve IncomingCallWidget + class IncomingCallWidget(widgets.CenteredWidget): @@ -56,7 +59,7 @@ class IncomingCallWidget(widgets.CenteredWidget): self.call_type.setText(text) pr = profile.Profile.get_instance() self.accept_audio.clicked.connect(lambda: pr.accept_call(friend_number, True, False) or self.stop()) - # self.accept_video.clicked.connect(lambda: pr.start_call(friend_number, True, True)) + self.accept_video.clicked.connect(lambda: pr.accept_call(friend_number, True, True)) self.decline.clicked.connect(lambda: pr.stop_call(friend_number, False) or self.stop()) class SoundPlay(QtCore.QThread): diff --git a/toxygen/callbacks.py b/toxygen/callbacks.py index f8ddb17..e280c06 100644 --- a/toxygen/callbacks.py +++ b/toxygen/callbacks.py @@ -320,6 +320,13 @@ def callback_audio(toxav, friend_number, samples, audio_samples_per_channel, aud audio_channels_count, rate) +# ----------------------------------------------------------------------------------------------------------------- +# Callbacks - video +# ----------------------------------------------------------------------------------------------------------------- + + +def video_receive_frame(toxav, friend_number, width, height, y, u, v, ystride, ustride, vstride, user_data): + pass # ----------------------------------------------------------------------------------------------------------------- # Callbacks - initialization @@ -353,6 +360,7 @@ def init_callbacks(tox, window, tray): toxav.callback_call_state(call_state, 0) toxav.callback_call(call, 0) toxav.callback_audio_receive_frame(callback_audio, 0) + tox.callback_video_receive_frame(video_receive_frame, 0) tox.callback_friend_lossless_packet(lossless_packet, 0) tox.callback_friend_lossy_packet(lossy_packet, 0) diff --git a/toxygen/calls.py b/toxygen/calls.py index 16cef47..2f02b83 100644 --- a/toxygen/calls.py +++ b/toxygen/calls.py @@ -11,6 +11,7 @@ CALL_TYPE = { 'AUDIO': 1, 'VIDEO': 2 } +# TODO: rewrite (make class) class AV: From 01546f00472a1cd73473bdbb35be805252fab527 Mon Sep 17 00:00:00 2001 From: ingvar1995 Date: Sun, 7 Aug 2016 00:31:38 +0300 Subject: [PATCH 02/21] dict on incoming call widgets, calls.py update --- toxygen/callbacks.py | 2 +- toxygen/calls.py | 83 +++++++++++++++++++++++++++----------------- toxygen/profile.py | 15 ++++---- 3 files changed, 60 insertions(+), 40 deletions(-) diff --git a/toxygen/callbacks.py b/toxygen/callbacks.py index e280c06..5151637 100644 --- a/toxygen/callbacks.py +++ b/toxygen/callbacks.py @@ -315,7 +315,7 @@ def callback_audio(toxav, friend_number, samples, audio_samples_per_channel, aud """ New audio chunk """ - Profile.get_instance().call.chunk( + Profile.get_instance().call.audio_chunk( bytes(samples[:audio_samples_per_channel * 2 * audio_channels_count]), audio_channels_count, rate) diff --git a/toxygen/calls.py b/toxygen/calls.py index 2f02b83..7dc6b67 100644 --- a/toxygen/calls.py +++ b/toxygen/calls.py @@ -4,14 +4,14 @@ import threading import settings from toxav_enums import * # TODO: play sound until outgoing call will be started or cancelled and add timeout -# TODO: add widget for call -CALL_TYPE = { - 'NONE': 0, - 'AUDIO': 1, - 'VIDEO': 2 -} -# TODO: rewrite (make class) + +class Call: + + def __init__(self, audio=False, video=False): + self.audio = audio + self.video = video + # TODO: add widget for call class AV: @@ -20,7 +20,7 @@ class AV: self._toxav = toxav 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_stream = None @@ -33,15 +33,30 @@ class AV: self._audio_duration = 60 self._audio_sample_count = self._audio_rate * self._audio_channels * self._audio_duration // 1000 + def stop(self): + self._running = False + self.stop_audio_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_TYPE['AUDIO'] + self._calls[friend_number] = Call(audio, video) self.start_audio_thread() + 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) + self.start_audio_thread() + def finish_call(self, friend_number, by_friend=False): if not by_friend: @@ -51,9 +66,21 @@ class AV: if not len(self._calls): self.stop_audio_thread() - def stop(self): - self._running = False - self.stop_audio_thread() + def toxav_call_state_cb(self, friend_number, state): + """ + New call state + """ + pass # TODO: ignore? + # if self._running: + # + # if state & TOXAV_FRIEND_CALL_STATE['ACCEPTING_A']: + # self._calls[friend_number].audio = True + # if state & TOXAV_FRIEND_CALL_STATE['ACCEPTING_V']: + # self._calls[friend_number].video = True + + # ----------------------------------------------------------------------------------------------------------------- + # Threads + # ----------------------------------------------------------------------------------------------------------------- def start_audio_thread(self): """ @@ -93,7 +120,11 @@ class AV: self._out_stream.close() self._out_stream = None - def chunk(self, samples, channels_count, rate): + # ----------------------------------------------------------------------------------------------------------------- + # Incoming chunks + # ----------------------------------------------------------------------------------------------------------------- + + def audio_chunk(self, samples, channels_count, rate): """ Incoming chunk """ @@ -106,6 +137,13 @@ class AV: output=True) self._out_stream.write(samples) + def video_chunk(self): + pass + + # ----------------------------------------------------------------------------------------------------------------- + # AV sending + # ----------------------------------------------------------------------------------------------------------------- + def send_audio(self): """ This method sends audio to friends @@ -116,7 +154,7 @@ class AV: pcm = self._audio_stream.read(self._audio_sample_count) if pcm: for friend in self._calls: - if self._calls[friend] & 1: + if self._calls[friend].audio: try: self._toxav.audio_send_frame(friend, pcm, self._audio_sample_count, self._audio_channels, self._audio_rate) @@ -126,20 +164,3 @@ class AV: pass time.sleep(0.01) - - def accept_call(self, friend_number, audio_enabled, video_enabled): - - 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 - """ - if self._running: - - if state & TOXAV_FRIEND_CALL_STATE['ACCEPTING_A']: - self._calls[friend_number] |= 1 - diff --git a/toxygen/profile.py b/toxygen/profile.py index 3f48cc9..e89bf2b 100644 --- a/toxygen/profile.py +++ b/toxygen/profile.py @@ -39,6 +39,7 @@ class Profile(basecontact.BaseContact, Singleton): self._tox = tox 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_widgets = {} # dict of incoming call widgets self._incoming_calls = set() self._load_history = True self._waiting_for_reconnection = False @@ -1237,10 +1238,9 @@ class Profile(basecontact.BaseContact, Singleton): self._messages.scrollToBottom() else: friend.actions = True - # TODO: dict of widgets - self._call_widget = avwidgets.IncomingCallWidget(friend_number, text, friend.name) - self._call_widget.set_pixmap(friend.get_pixmap()) - self._call_widget.show() + self._call_widgets[friend_number] = avwidgets.IncomingCallWidget(friend_number, text, friend.name) + self._call_widgets[friend_number].set_pixmap(friend.get_pixmap()) + self._call_widgets[friend_number].show() def accept_call(self, friend_number, audio, video): """ @@ -1250,8 +1250,7 @@ class Profile(basecontact.BaseContact, Singleton): self._screen.active_call() if friend_number in self._incoming_calls: self._incoming_calls.remove(friend_number) - if hasattr(self, '_call_widget'): - del self._call_widget + del self._call_widgets[friend_number] def stop_call(self, friend_number, by_friend): """ @@ -1265,8 +1264,8 @@ class Profile(basecontact.BaseContact, Singleton): self._screen.call_finished() self._call.finish_call(friend_number, by_friend) # finish or decline call if hasattr(self, '_call_widget'): - self._call_widget.close() - del self._call_widget + self._call_widget[friend_number].close() + del self._call_widget[friend_number] friend = self.get_friend_by_number(friend_number) friend.append_message(InfoMessage(text, time.time())) if friend_number == self.get_active_number(): From f8a7087779eddcb096438a5c22bb5c623437278d Mon Sep 17 00:00:00 2001 From: ingvar1995 Date: Mon, 8 Aug 2016 12:10:18 +0300 Subject: [PATCH 03/21] video recording and thread --- setup.py | 13 +++++++--- toxygen/callbacks.py | 2 +- toxygen/calls.py | 59 +++++++++++++++++++++++++++++++++++++++++--- 3 files changed, 67 insertions(+), 7 deletions(-) diff --git a/setup.py b/setup.py index 86141f5..7155c37 100644 --- a/setup.py +++ b/setup.py @@ -8,15 +8,21 @@ import sys version = program_version + '.0' -MODULES = [] +MODULES = ['numpy'] if system() in ('Windows', 'Darwin'): - MODULES = ['PyAudio', 'PySide'] + MODULES.extend(['PyAudio', 'PySide']) else: try: import pyaudio except ImportError: - MODULES = ['PyAudio'] + MODULES.append('PyAudio') + + +if system() == 'Windows': + DEPS_LINKS = [] # TODO: add opencv.whl +else: + DEPS_LINKS = [] class InstallScript(install): @@ -55,6 +61,7 @@ setup(name='Toxygen', license='GPL3', packages=['toxygen', 'toxygen.plugins', 'toxygen.styles'], install_requires=MODULES, + dependency_links=DEP_LINKS, include_package_data=True, classifiers=[ 'Programming Language :: Python :: 3 :: Only', diff --git a/toxygen/callbacks.py b/toxygen/callbacks.py index 5151637..cc4d216 100644 --- a/toxygen/callbacks.py +++ b/toxygen/callbacks.py @@ -360,7 +360,7 @@ def init_callbacks(tox, window, tray): toxav.callback_call_state(call_state, 0) toxav.callback_call(call, 0) toxav.callback_audio_receive_frame(callback_audio, 0) - tox.callback_video_receive_frame(video_receive_frame, 0) + toxav.callback_video_receive_frame(video_receive_frame, 0) tox.callback_friend_lossless_packet(lossless_packet, 0) tox.callback_friend_lossy_packet(lossy_packet, 0) diff --git a/toxygen/calls.py b/toxygen/calls.py index 7dc6b67..02272be 100644 --- a/toxygen/calls.py +++ b/toxygen/calls.py @@ -3,6 +3,7 @@ import time import threading import settings from toxav_enums import * +import cv2 # TODO: play sound until outgoing call will be started or cancelled and add timeout @@ -33,9 +34,14 @@ class AV: self._audio_duration = 60 self._audio_sample_count = self._audio_rate * self._audio_channels * self._audio_duration // 1000 + self._video = None + self._video_thread = None + self._video_running = False + def stop(self): self._running = False self.stop_audio_thread() + self.stop_video_thread() def __contains__(self, friend_number): return friend_number in self._calls @@ -120,6 +126,29 @@ class AV: self._out_stream.close() self._out_stream = None + def start_video_thread(self): + if self._video_thread is not None: + return + + self._video_running = True + + self._video = cv2.VideoCapture(0) + self._video.set(cv2.CV_CAP_PROP_FPS, 25) + self._video.set(cv2.CV_CAP_PROP_FRAME_WIDTH, 640) + self._video.set(cv2.CV_CAP_PROP_FRAME_HEIGHT, 480) + + 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 # ----------------------------------------------------------------------------------------------------------------- @@ -153,10 +182,10 @@ class AV: try: pcm = self._audio_stream.read(self._audio_sample_count) if pcm: - for friend in self._calls: - if self._calls[friend].audio: + for friend_num in self._calls: + if self._calls[friend_num].audio: 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) except: pass @@ -164,3 +193,27 @@ class AV: pass time.sleep(0.01) + + def send_video(self): + 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].video: + try: # TODO: bgr => yuv + y, u, v = 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) + + time.sleep(0.01) + + +def convert_bgr_to_yuv(frame): + print(frame.tostring()) + print(dir(frame)) + return 0, 0, 0 From d0e2f61d0338fc8e05e8695a0361979facf76979 Mon Sep 17 00:00:00 2001 From: ingvar1995 Date: Sun, 11 Jun 2017 15:35:52 +0300 Subject: [PATCH 04/21] merge with pyqt5 branch and video sending --- .travis.yml | 6 +- setup.py | 6 +- toxygen/avwidgets.py | 25 +- toxygen/basecontact.py | 5 +- toxygen/callbacks.py | 12 +- toxygen/calls.py | 28 +- toxygen/contact.py | 5 +- toxygen/file_transfers.py | 10 +- toxygen/items_factory.py | 15 +- toxygen/list_items.py | 78 ++-- toxygen/loginscreen.py | 41 +-- toxygen/main.py | 129 +++---- toxygen/mainscreen.py | 251 +++++++------ toxygen/mainscreen_widgets.py | 167 ++++----- toxygen/menu.py | 489 ++++++++++++-------------- toxygen/notifications.py | 13 +- toxygen/passwordscreen.py | 52 ++- toxygen/plugins/plugin_super_class.py | 13 +- toxygen/profile.py | 67 ++-- toxygen/smileys.py | 5 +- toxygen/styles/style.py | 2 +- toxygen/tox_dns.py | 5 +- toxygen/updater.py | 5 +- toxygen/widgets.py | 57 ++- 24 files changed, 681 insertions(+), 805 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6002d8f..700b449 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,14 +1,14 @@ language: python python: - - "3.4" + - "3.5" + - "3.6" before_install: - sudo apt-get update - sudo apt-get install -y checkinstall build-essential - sudo apt-get install portaudio19-dev - sudo apt-get install libconfig-dev libvpx-dev check -qq + - sudo apt-get install -y python3-pyqt5 install: - - pip install PySide --no-index --find-links https://parkin.github.io/python-wheelhouse/; - - python ~/virtualenv/python${TRAVIS_PYTHON_VERSION}/bin/pyside_postinstall.py -install - pip install pyaudio before_script: # OPUS diff --git a/setup.py b/setup.py index 7155c37..4794969 100644 --- a/setup.py +++ b/setup.py @@ -11,7 +11,8 @@ version = program_version + '.0' MODULES = ['numpy'] if system() in ('Windows', 'Darwin'): - MODULES.extend(['PyAudio', 'PySide']) + MODULES.extend['PyAudio', 'PyQt5'] + else: try: import pyaudio @@ -65,7 +66,8 @@ setup(name='Toxygen', include_package_data=True, classifiers=[ 'Programming Language :: Python :: 3 :: Only', - 'Programming Language :: Python :: 3.4', + 'Programming Language :: Python :: 3.5', + 'Programming Language :: Python :: 3.6', ], entry_points={ 'console_scripts': ['toxygen=toxygen.main:main'], diff --git a/toxygen/avwidgets.py b/toxygen/avwidgets.py index 4ae329d..ff276c4 100644 --- a/toxygen/avwidgets.py +++ b/toxygen/avwidgets.py @@ -1,7 +1,4 @@ -try: - from PySide import QtCore, QtGui -except ImportError: - from PyQt4 import QtCore, QtGui +from PyQt5 import QtCore, QtGui, QtWidgets import widgets import profile import util @@ -20,7 +17,7 @@ class IncomingCallWidget(widgets.CenteredWidget): super(IncomingCallWidget, self).__init__() self.setWindowFlags(QtCore.Qt.CustomizeWindowHint | QtCore.Qt.WindowTitleHint | QtCore.Qt.WindowStaysOnTopHint) 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.setScaledContents(False) self.name = widgets.DataLabel(self) @@ -33,11 +30,11 @@ class IncomingCallWidget(widgets.CenteredWidget): self.call_type = widgets.DataLabel(self) self.call_type.setGeometry(QtCore.QRect(90, 55, 300, 25)) 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_video = QtGui.QPushButton(self) + self.accept_video = QtWidgets.QPushButton(self) 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)) pixmap = QtGui.QPixmap(util.curr_directory() + '/images/accept_audio.png') icon = QtGui.QIcon(pixmap) @@ -119,15 +116,14 @@ class AudioMessageRecorder(widgets.CenteredWidget): def __init__(self, friend_number, name): super(AudioMessageRecorder, self).__init__() - self.label = QtGui.QLabel(self) + self.label = QtWidgets.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) + text = QtWidgets.QApplication.translate("MenuWindow", "Send audio message to friend {}") self.label.setText(text.format(name)) - self.record = QtGui.QPushButton(self) + self.record = QtWidgets.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.setText(QtWidgets.QApplication.translate("MenuWindow", "Start recording")) self.record.clicked.connect(self.start_or_stop_recording) self.recording = False self.friend_num = friend_number @@ -135,8 +131,7 @@ class AudioMessageRecorder(widgets.CenteredWidget): 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)) + self.record.setText(QtWidgets.QApplication.translate("MenuWindow", "Stop recording")) else: self.close() diff --git a/toxygen/basecontact.py b/toxygen/basecontact.py index d6366c3..e1243a4 100644 --- a/toxygen/basecontact.py +++ b/toxygen/basecontact.py @@ -1,8 +1,5 @@ from settings import * -try: - from PySide import QtCore, QtGui -except ImportError: - from PyQt4 import QtCore, QtGui +from PyQt5 import QtCore, QtGui from toxcore_enums_and_consts import TOX_PUBLIC_KEY_SIZE diff --git a/toxygen/callbacks.py b/toxygen/callbacks.py index cc4d216..01a14d4 100644 --- a/toxygen/callbacks.py +++ b/toxygen/callbacks.py @@ -1,7 +1,4 @@ -try: - from PySide import QtCore -except ImportError: - from PyQt4 import QtCore +from PyQt5 import QtCore, QtGui, QtWidgets from notifications import * from settings import Settings from profile import Profile @@ -12,6 +9,8 @@ from plugin_support import PluginLoader import queue import threading import util +import cv2 +import numpy as np # ----------------------------------------------------------------------------------------------------------------- @@ -225,7 +224,7 @@ def tox_file_recv(window, tray): if not window.isActiveWindow(): friend = profile.get_friend_by_number(friend_number) 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) if settings['sound_notifications'] and profile.status != TOX_USER_STATUS['BUSY']: sound_notification(SOUND_NOTIFICATION['FILE_TRANSFER']) @@ -327,6 +326,9 @@ def callback_audio(toxav, friend_number, samples, audio_samples_per_channel, aud def video_receive_frame(toxav, friend_number, width, height, y, u, v, ystride, ustride, vstride, user_data): pass + #frame = cv2.merge((np.asarray(y), np.asarray(u), np.asarray(v))) + #frame = cv2.cvtColor(frame, cv2.COLOR_YUV2BGR_I420) + #cv2.imshow("frame", frame) # ----------------------------------------------------------------------------------------------------------------- # Callbacks - initialization diff --git a/toxygen/calls.py b/toxygen/calls.py index 02272be..f2600c9 100644 --- a/toxygen/calls.py +++ b/toxygen/calls.py @@ -4,6 +4,8 @@ import threading import settings from toxav_enums import * import cv2 +import itertools +import numpy as np # TODO: play sound until outgoing call will be started or cancelled and add timeout @@ -55,6 +57,7 @@ class AV: self._toxav.call(friend_number, 32 if audio else 0, 5000 if video else 0) self._calls[friend_number] = Call(audio, video) self.start_audio_thread() + self.start_video_thread() def accept_call(self, friend_number, audio_enabled, video_enabled): @@ -133,9 +136,9 @@ class AV: self._video_running = True self._video = cv2.VideoCapture(0) - self._video.set(cv2.CV_CAP_PROP_FPS, 25) - self._video.set(cv2.CV_CAP_PROP_FRAME_WIDTH, 640) - self._video.set(cv2.CV_CAP_PROP_FRAME_HEIGHT, 480) + self._video.set(cv2.CAP_PROP_FPS, 25) + self._video.set(cv2.CAP_PROP_FRAME_WIDTH, 640) + self._video.set(cv2.CAP_PROP_FRAME_HEIGHT, 480) self._video_thread = threading.Thread(target=self.send_video) self._video_thread.start() @@ -206,14 +209,23 @@ class AV: y, u, v = convert_bgr_to_yuv(frame) self._toxav.video_send_frame(friend_num, width, height, y, u, v) except Exception as e: - print(e) + print('1', e) except Exception as e: - print(e) + print('2', e) time.sleep(0.01) def convert_bgr_to_yuv(frame): - print(frame.tostring()) - print(dir(frame)) - return 0, 0, 0 + frame = cv2.cvtColor(frame, cv2.COLOR_BGR2YUV_I420) + y = frame[:480,:].tolist() + y = list(itertools.chain.from_iterable(y)) + v = np.zeros((240, 320), dtype=np.int) + v[::2,:] = frame[480:600, :320] + v[1::2,:] = frame[480:600, 320:] + v = list(itertools.chain.from_iterable(v)) + u = np.zeros((240, 320), dtype=np.int) + u[::2,:] = frame[600:, :320] + u[1::2,:] = frame[600:, 320:] + u = list(itertools.chain.from_iterable(u)) + return bytes(y), bytes(v), bytes(u) diff --git a/toxygen/contact.py b/toxygen/contact.py index 1b69b9e..4475e53 100644 --- a/toxygen/contact.py +++ b/toxygen/contact.py @@ -1,7 +1,4 @@ -try: - from PySide import QtCore, QtGui -except ImportError: - from PyQt4 import QtCore, QtGui +from PyQt5 import QtCore, QtGui from history import * import basecontact import util diff --git a/toxygen/file_transfers.py b/toxygen/file_transfers.py index 4a9723a..7e0b193 100644 --- a/toxygen/file_transfers.py +++ b/toxygen/file_transfers.py @@ -4,11 +4,7 @@ from os import remove, rename, chdir from time import time, sleep from tox import Tox import settings -try: - from PySide import QtCore -except ImportError: - from PyQt4 import QtCore - QtCore.Signal = QtCore.pyqtSignal +from PyQt5 import QtCore TOX_FILE_TRANSFER_STATE = { @@ -38,12 +34,12 @@ def is_inline(file_name): 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): - signal = QtCore.Signal(int, int) # friend number, file number + signal = QtCore.pyqtSignal(int, int) # friend number, file number class FileTransfer(QtCore.QObject): diff --git a/toxygen/items_factory.py b/toxygen/items_factory.py index 80986c3..44a00ad 100644 --- a/toxygen/items_factory.py +++ b/toxygen/items_factory.py @@ -1,7 +1,4 @@ -try: - from PySide import QtCore, QtGui -except ImportError: - from PyQt4 import QtCore, QtGui +from PyQt5 import QtWidgets, QtCore from list_items import * @@ -13,7 +10,7 @@ class ItemsFactory: def friend_item(self): item = ContactItem() - elem = QtGui.QListWidgetItem(self._friends) + elem = QtWidgets.QListWidgetItem(self._friends) elem.setSizeHint(QtCore.QSize(250, item.height())) self._friends.addItem(elem) self._friends.setItemWidget(elem, item) @@ -23,7 +20,7 @@ class ItemsFactory: item = MessageItem(text, time, name, sent, message_type, self._messages) if pixmap is not None: item.set_avatar(pixmap) - elem = QtGui.QListWidgetItem() + elem = QtWidgets.QListWidgetItem() elem.setSizeHint(QtCore.QSize(self._messages.width(), item.height())) if append: self._messages.addItem(elem) @@ -33,7 +30,7 @@ class ItemsFactory: return item def inline_item(self, data, append): - elem = QtGui.QListWidgetItem() + elem = QtWidgets.QListWidgetItem() item = InlineImageItem(data, self._messages.width(), elem) elem.setSizeHint(QtCore.QSize(self._messages.width(), item.height())) if append: @@ -49,7 +46,7 @@ class ItemsFactory: name, time, self._messages.width()) - elem = QtGui.QListWidgetItem() + elem = QtWidgets.QListWidgetItem() elem.setSizeHint(QtCore.QSize(self._messages.width() - 30, 34)) if append: self._messages.addItem(elem) @@ -61,7 +58,7 @@ class ItemsFactory: def file_transfer_item(self, data, append): data.append(self._messages.width()) item = FileTransferItem(*data) - elem = QtGui.QListWidgetItem() + elem = QtWidgets.QListWidgetItem() elem.setSizeHint(QtCore.QSize(self._messages.width() - 30, 34)) if append: self._messages.addItem(elem) diff --git a/toxygen/list_items.py b/toxygen/list_items.py index ab8d0b4..9ef4e84 100644 --- a/toxygen/list_items.py +++ b/toxygen/list_items.py @@ -1,9 +1,5 @@ from toxcore_enums_and_consts import * -try: - from PySide import QtCore, QtGui -except ImportError: - from PyQt4 import QtCore, QtGui - QtCore.Slot = QtCore.pyqtSlot +from PyQt5 import QtCore, QtGui, QtWidgets 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 util import curr_directory, convert_time, curr_time @@ -14,7 +10,7 @@ import settings import re -class MessageEdit(QtGui.QTextBrowser): +class MessageEdit(QtWidgets.QTextBrowser): def __init__(self, text, width, message_type, parent=None): super(MessageEdit, self).__init__(parent) @@ -46,7 +42,7 @@ class MessageEdit(QtGui.QTextBrowser): def contextMenuEvent(self, event): 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) text = self.textCursor().selection().toPlainText() if not text: @@ -55,7 +51,7 @@ class MessageEdit(QtGui.QTextBrowser): import plugin_support submenu = plugin_support.PluginLoader.get_instance().get_message_menu(menu, text) 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) menu.popup(event.globalPos()) menu.exec_(event.globalPos()) @@ -123,12 +119,12 @@ class MessageEdit(QtGui.QTextBrowser): return text -class MessageItem(QtGui.QWidget): +class MessageItem(QtWidgets.QWidget): """ Message in messages list """ 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.setGeometry(QtCore.QRect(2, 2, 95, 23)) self.name.setTextFormat(QtCore.Qt.PlainText) @@ -139,7 +135,7 @@ class MessageItem(QtGui.QWidget): self.name.setFont(font) 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)) font.setPointSize(10) font.setBold(False) @@ -164,9 +160,9 @@ class MessageItem(QtGui.QWidget): def mouseReleaseEvent(self, event): if event.button() == QtCore.Qt.RightButton and event.x() > self.time.x(): - self.listMenu = QtGui.QMenu() - delete_item = self.listMenu.addAction(QtGui.QApplication.translate("MainWindow", 'Delete message', None, QtGui.QApplication.UnicodeUTF8)) - self.connect(delete_item, QtCore.SIGNAL("triggered()"), self.delete) + self.listMenu = QtWidgets.QMenu() + delete_item = self.listMenu.addAction(QtWidgets.QApplication.translate("MainWindow", 'Delete message')) + delete_item.triggered.connect(self.delete) parent_position = self.time.mapToGlobal(QtCore.QPoint(0, 0)) self.listMenu.move(parent_position) self.listMenu.show() @@ -216,16 +212,16 @@ class MessageItem(QtGui.QWidget): return text -class ContactItem(QtGui.QWidget): +class ContactItem(QtWidgets.QWidget): """ Contact in friends list """ def __init__(self, parent=None): - QtGui.QWidget.__init__(self, parent) + QtWidgets.QWidget.__init__(self, parent) mode = settings.Settings.get_instance()['compact_mode'] 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 self.avatar_label.setGeometry(QtCore.QRect(3, 4, size, size)) 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)) -class StatusCircle(QtGui.QWidget): +class StatusCircle(QtWidgets.QWidget): """ Connection status """ def __init__(self, parent): - QtGui.QWidget.__init__(self, parent) + QtWidgets.QWidget.__init__(self, parent) 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.unread = False @@ -281,12 +277,12 @@ class StatusCircle(QtGui.QWidget): self.label.setPixmap(pixmap) -class UnreadMessagesCount(QtGui.QWidget): +class UnreadMessagesCount(QtWidgets.QWidget): def __init__(self, parent=None): super(UnreadMessagesCount, self).__init__(parent) 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.setVisible(False) font = QtGui.QFont() @@ -308,11 +304,11 @@ class UnreadMessagesCount(QtGui.QWidget): 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): - QtGui.QListWidget.__init__(self, parent) + QtWidgets.QListWidget.__init__(self, parent) self.resize(QtCore.QSize(width, 34)) if state == TOX_FILE_TRANSFER_STATE['CANCELLED']: self.setStyleSheet('QListWidget { border: 1px solid #B40404; }') @@ -332,14 +328,14 @@ class FileTransferItem(QtGui.QListWidget): self.name.setFont(font) self.name.setText(user) - self.time = QtGui.QLabel(self) + self.time = QtWidgets.QLabel(self) self.time.setGeometry(QtCore.QRect(width - 60, 7, 50, 25)) font.setPointSize(10) font.setBold(False) self.time.setFont(font) 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)) pixmap = QtGui.QPixmap(curr_directory() + '/images/decline.png') 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.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)) if state == TOX_FILE_TRANSFER_STATE['INCOMING_NOT_STARTED']: 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.pb = QtGui.QProgressBar(self) + self.pb = QtWidgets.QProgressBar(self) self.pb.setGeometry(QtCore.QRect(100, 7, 100, 20)) self.pb.setValue(0) self.pb.setStyleSheet('QProgressBar { background-color: #302F2F; }') @@ -387,7 +383,7 @@ class FileTransferItem(QtGui.QListWidget): self.file_name.setText(file_data) self.file_name.setToolTip(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)) font.setPointSize(10) self.time_left.setFont(font) @@ -405,10 +401,10 @@ class FileTransferItem(QtGui.QListWidget): def accept_or_pause_transfer(self, friend_number, file_number, size): if self.state == TOX_FILE_TRANSFER_STATE['INCOMING_NOT_STARTED']: - directory = QtGui.QFileDialog.getExistingDirectory(self, - QtGui.QApplication.translate("MainWindow", 'Choose folder', None, QtGui.QApplication.UnicodeUTF8), + directory = QtWidgets.QFileDialog.getExistingDirectory(self, + QtWidgets.QApplication.translate("MainWindow", 'Choose folder'), curr_directory(), - QtGui.QFileDialog.ShowDirsOnly | QtGui.QFileDialog.DontUseNativeDialog) + QtWidgets.QFileDialog.ShowDirsOnly | QtWidgets.QFileDialog.DontUseNativeDialog) self.pb.setVisible(True) if directory: pr = profile.Profile.get_instance() @@ -432,8 +428,7 @@ class FileTransferItem(QtGui.QListWidget): self.accept_or_pause.setIcon(icon) self.accept_or_pause.setIconSize(QtCore.QSize(30, 30)) - @QtCore.Slot(int, float, int) - def update(self, state, progress, time): + def update_transfer_state(self, state, progress, time): self.pb.setValue(int(progress * 100)) if time + 1: m, s = divmod(time, 60) @@ -496,14 +491,14 @@ class UnsentFileItem(FileTransferItem): pr.cancel_not_started_transfer(self._time) -class InlineImageItem(QtGui.QScrollArea): +class InlineImageItem(QtWidgets.QScrollArea): def __init__(self, data, width, elem): - QtGui.QScrollArea.__init__(self) + QtWidgets.QScrollArea.__init__(self) self.setFocusPolicy(QtCore.Qt.NoFocus) self._elem = elem - self._image_label = QtGui.QLabel(self) + self._image_label = QtWidgets.QLabel(self) self._image_label.raise_() self.setWidget(self._image_label) self._image_label.setScaledContents(False) @@ -537,12 +532,11 @@ class InlineImageItem(QtGui.QScrollArea): self._full_size = not self._full_size self._elem.setSizeHint(QtCore.QSize(self.width(), self.height())) elif event.button() == QtCore.Qt.RightButton: # save inline - directory = QtGui.QFileDialog.getExistingDirectory(self, - QtGui.QApplication.translate("MainWindow", - 'Choose folder', None, - QtGui.QApplication.UnicodeUTF8), + directory = QtWidgets.QFileDialog.getExistingDirectory(self, + QtWidgets.QApplication.translate("MainWindow", + 'Choose folder'), curr_directory(), - QtGui.QFileDialog.ShowDirsOnly | QtGui.QFileDialog.DontUseNativeDialog) + QtWidgets.QFileDialog.ShowDirsOnly | QtWidgets.QFileDialog.DontUseNativeDialog) if directory: fl = QtCore.QFile(directory + '/toxygen_inline_' + curr_time().replace(':', '_') + '.png') self._pixmap.save(fl, 'PNG') diff --git a/toxygen/loginscreen.py b/toxygen/loginscreen.py index b6d0811..77aa5ba 100644 --- a/toxygen/loginscreen.py +++ b/toxygen/loginscreen.py @@ -1,9 +1,4 @@ -# -*- coding: utf-8 -*- - -try: - from PySide import QtCore, QtGui -except ImportError: - from PyQt4 import QtCore, QtGui +from PyQt5 import QtWidgets, QtCore from widgets import * @@ -31,25 +26,25 @@ class LoginScreen(CenteredWidget): self.resize(400, 200) self.setMinimumSize(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.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.new_name = NickEdit(self) 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.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.groupBox = QtGui.QGroupBox(self) + self.groupBox = QtWidgets.QGroupBox(self) 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.groupBox_2 = QtGui.QGroupBox(self) + self.groupBox_2 = QtWidgets.QGroupBox(self) 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_2.raise_() self.comboBox.raise_() @@ -71,15 +66,15 @@ class LoginScreen(CenteredWidget): QtCore.QMetaObject.connectSlotsByName(self) def retranslateUi(self): - self.new_name.setPlaceholderText(QtGui.QApplication.translate("login", "Profile name", None, QtGui.QApplication.UnicodeUTF8)) - self.setWindowTitle(QtGui.QApplication.translate("login", "Log in", None, QtGui.QApplication.UnicodeUTF8)) - self.new_profile.setText(QtGui.QApplication.translate("login", "Create", None, QtGui.QApplication.UnicodeUTF8)) - self.label.setText(QtGui.QApplication.translate("login", "Profile name:", None, QtGui.QApplication.UnicodeUTF8)) - self.load_profile.setText(QtGui.QApplication.translate("login", "Load profile", None, QtGui.QApplication.UnicodeUTF8)) - self.default.setText(QtGui.QApplication.translate("login", "Use as default", None, QtGui.QApplication.UnicodeUTF8)) - self.groupBox.setTitle(QtGui.QApplication.translate("login", "Load existing profile", None, QtGui.QApplication.UnicodeUTF8)) - self.groupBox_2.setTitle(QtGui.QApplication.translate("login", "Create new profile", None, QtGui.QApplication.UnicodeUTF8)) - self.toxygen.setText(QtGui.QApplication.translate("login", "toxygen", None, QtGui.QApplication.UnicodeUTF8)) + self.new_name.setPlaceholderText(QtWidgets.QApplication.translate("login", "Profile name")) + self.setWindowTitle(QtWidgets.QApplication.translate("login", "Log in")) + self.new_profile.setText(QtWidgets.QApplication.translate("login", "Create")) + self.label.setText(QtWidgets.QApplication.translate("login", "Profile name:")) + self.load_profile.setText(QtWidgets.QApplication.translate("login", "Load profile")) + self.default.setText(QtWidgets.QApplication.translate("login", "Use as default")) + self.groupBox.setTitle(QtWidgets.QApplication.translate("login", "Load existing profile")) + self.groupBox_2.setTitle(QtWidgets.QApplication.translate("login", "Create new profile")) + self.toxygen.setText(QtWidgets.QApplication.translate("login", "toxygen")) def create_profile(self): self.type = 1 diff --git a/toxygen/main.py b/toxygen/main.py index 8c51fd2..b1dffb5 100644 --- a/toxygen/main.py +++ b/toxygen/main.py @@ -2,10 +2,7 @@ import sys from loginscreen import LoginScreen import profile from settings import * -try: - from PySide import QtCore, QtGui -except ImportError: - from PyQt4 import QtCore, QtGui +from PyQt5 import QtCore, QtGui, QtWidgets from bootstrap import node_generator from mainscreen import MainWindow from callbacks import init_callbacks, stop, start @@ -39,7 +36,7 @@ class Toxygen: tmp = [data] p = PasswordScreen(toxes.ToxES.get_instance(), tmp) 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_() if tmp[0] == data: raise SystemExit() @@ -50,7 +47,7 @@ class Toxygen: """ 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')) self.app = app @@ -92,7 +89,6 @@ class Toxygen: _login = self.Login(profiles) ls.update_on_close(_login.login_screen_close) ls.show() - app.connect(app, QtCore.SIGNAL("lastWindowClosed()"), app, QtCore.SLOT("quit()")) app.exec_() if not _login.t: return @@ -101,40 +97,35 @@ class Toxygen: name = _login.name if _login.name else 'toxygen_user' pr = map(lambda x: x[1], ProfileHelper.find_profiles()) if name in list(pr): - msgBox = QtGui.QMessageBox() + msgBox = QtWidgets.QMessageBox() msgBox.setWindowTitle( - QtGui.QApplication.translate("MainWindow", "Error", None, QtGui.QApplication.UnicodeUTF8)) - text = (QtGui.QApplication.translate("MainWindow", - 'Profile with this name already exists', - None, QtGui.QApplication.UnicodeUTF8)) + QtWidgets.QApplication.translate("MainWindow", "Error")) + text = (QtWidgets.QApplication.translate("MainWindow", + 'Profile with this name already exists')) msgBox.setText(text) msgBox.exec_() return 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_status_message(b'Toxing on Toxygen') - reply = QtGui.QMessageBox.question(None, + reply = QtWidgets.QMessageBox.question(None, 'Profile {}'.format(name), - QtGui.QApplication.translate("login", - 'Do you want to set profile password?', - None, - QtGui.QApplication.UnicodeUTF8), - QtGui.QMessageBox.Yes, - QtGui.QMessageBox.No) - if reply == QtGui.QMessageBox.Yes: + QtWidgets.QApplication.translate("login", + 'Do you want to set profile password?'), + QtWidgets.QMessageBox.Yes, + QtWidgets.QMessageBox.No) + if reply == QtWidgets.QMessageBox.Yes: set_pass = SetProfilePasswordScreen(encrypt_save) 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_() - reply = QtGui.QMessageBox.question(None, + reply = QtWidgets.QMessageBox.question(None, 'Profile {}'.format(name), - QtGui.QApplication.translate("login", - 'Do you want to save profile in default folder? If no, profile will be saved in program folder', - None, - QtGui.QApplication.UnicodeUTF8), - QtGui.QMessageBox.Yes, - QtGui.QMessageBox.No) - if reply == QtGui.QMessageBox.Yes: + QtWidgets.QApplication.translate("login", + 'Do you want to save profile in default folder? If no, profile will be saved in program folder'), + QtWidgets.QMessageBox.Yes, + QtWidgets.QMessageBox.No) + if reply == QtWidgets.QMessageBox.Yes: path = Settings.get_default_path() else: path = curr_directory() + '/' @@ -143,11 +134,9 @@ class Toxygen: except Exception as ex: print(str(ex)) log('Profile creation exception: ' + str(ex)) - msgBox = QtGui.QMessageBox() - msgBox.setText(QtGui.QApplication.translate("login", - 'Profile saving error! Does Toxygen have permission to write to this directory?', - None, - QtGui.QApplication.UnicodeUTF8)) + msgBox = QtWidgets.QMessageBox() + msgBox.setText(QtWidgets.QApplication.translate("login", + 'Profile saving error! Does Toxygen have permission to write to this directory?')) msgBox.exec_() return path = Settings.get_default_path() @@ -173,12 +162,12 @@ class Toxygen: self.tox = profile.tox_factory(data, settings) if Settings.is_active_profile(path, name): # profile is in use - reply = QtGui.QMessageBox.question(None, + reply = QtWidgets.QMessageBox.question(None, '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), - QtGui.QMessageBox.Yes, - QtGui.QMessageBox.No) - if reply != QtGui.QMessageBox.Yes: + QtWidgets.QApplication.translate("login", 'Other instance of Toxygen uses this profile or profile was not properly closed. Continue?'), + QtWidgets.QMessageBox.Yes, + QtWidgets.QMessageBox.No) + if reply != QtWidgets.QMessageBox.Yes: return else: settings.set_active_profile() @@ -190,21 +179,21 @@ class Toxygen: app.translator = translator # 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.ms = MainWindow(self.tox, self.reset, self.tray) app.aboutToQuit.connect(self.ms.close_window) - class Menu(QtGui.QMenu): + class Menu(QtWidgets.QMenu): def newStatus(self, status): if not Settings.get_instance().locked: profile.Profile.get_instance().set_status(status) - self.aboutToShow() + self.aboutToShowHandler() self.hide() - def aboutToShow(self): + def aboutToShowHandler(self): status = profile.Profile.get_instance().status act = self.act if status is None or Settings.get_instance().locked: @@ -218,24 +207,24 @@ class Toxygen: self.actions()[2].setVisible(not Settings.get_instance().locked) def languageChange(self, *args, **kwargs): - self.actions()[0].setText(QtGui.QApplication.translate('tray', 'Open Toxygen', None, QtGui.QApplication.UnicodeUTF8)) - self.actions()[1].setText(QtGui.QApplication.translate('tray', 'Set status', None, QtGui.QApplication.UnicodeUTF8)) - self.actions()[2].setText(QtGui.QApplication.translate('tray', 'Exit', None, QtGui.QApplication.UnicodeUTF8)) - self.act.actions()[0].setText(QtGui.QApplication.translate('tray', 'Online', None, QtGui.QApplication.UnicodeUTF8)) - self.act.actions()[1].setText(QtGui.QApplication.translate('tray', 'Away', None, QtGui.QApplication.UnicodeUTF8)) - self.act.actions()[2].setText(QtGui.QApplication.translate('tray', 'Busy', None, QtGui.QApplication.UnicodeUTF8)) + self.actions()[0].setText(QtWidgets.QApplication.translate('tray', 'Open Toxygen')) + self.actions()[1].setText(QtWidgets.QApplication.translate('tray', 'Set status')) + self.actions()[2].setText(QtWidgets.QApplication.translate('tray', 'Exit')) + self.act.actions()[0].setText(QtWidgets.QApplication.translate('tray', 'Online')) + self.act.actions()[1].setText(QtWidgets.QApplication.translate('tray', 'Away')) + self.act.actions()[2].setText(QtWidgets.QApplication.translate('tray', 'Busy')) m = Menu() - show = m.addAction(QtGui.QApplication.translate('tray', 'Open Toxygen', None, QtGui.QApplication.UnicodeUTF8)) - sub = m.addMenu(QtGui.QApplication.translate('tray', 'Set status', None, QtGui.QApplication.UnicodeUTF8)) - onl = sub.addAction(QtGui.QApplication.translate('tray', 'Online', None, QtGui.QApplication.UnicodeUTF8)) - away = sub.addAction(QtGui.QApplication.translate('tray', 'Away', None, QtGui.QApplication.UnicodeUTF8)) - busy = sub.addAction(QtGui.QApplication.translate('tray', 'Busy', None, QtGui.QApplication.UnicodeUTF8)) + show = m.addAction(QtWidgets.QApplication.translate('tray', 'Open Toxygen')) + sub = m.addMenu(QtWidgets.QApplication.translate('tray', 'Set status')) + onl = sub.addAction(QtWidgets.QApplication.translate('tray', 'Online')) + away = sub.addAction(QtWidgets.QApplication.translate('tray', 'Away')) + busy = sub.addAction(QtWidgets.QApplication.translate('tray', 'Busy')) onl.setCheckable(True) away.setCheckable(True) busy.setCheckable(True) 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(): s = Settings.get_instance() @@ -258,7 +247,7 @@ class Toxygen: self.p.show() def tray_activated(reason): - if reason == QtGui.QSystemTrayIcon.DoubleClick: + if reason == QtWidgets.QSystemTrayIcon.DoubleClick: show_window() def close_app(): @@ -266,12 +255,12 @@ class Toxygen: settings.closing = True self.ms.close() - m.connect(show, QtCore.SIGNAL("triggered()"), show_window) - m.connect(exit, QtCore.SIGNAL("triggered()"), close_app) - m.connect(m, QtCore.SIGNAL("aboutToShow()"), lambda: m.aboutToShow()) - sub.connect(onl, QtCore.SIGNAL("triggered()"), lambda: m.newStatus(0)) - sub.connect(away, QtCore.SIGNAL("triggered()"), lambda: m.newStatus(1)) - sub.connect(busy, QtCore.SIGNAL("triggered()"), lambda: m.newStatus(2)) + show.triggered.connect(show_window) + exit.triggered.connect(close_app) + m.aboutToShow.connect(lambda: m.aboutToShowHandler()) + onl.triggered.connect(lambda: m.newStatus(0)) + away.triggered.connect(lambda: m.newStatus(1)) + busy.triggered.connect(lambda: m.newStatus(2)) self.tray.setContextMenu(m) self.tray.show() @@ -287,15 +276,13 @@ class Toxygen: updater.download(version) updating = True else: - reply = QtGui.QMessageBox.question(None, + reply = QtWidgets.QMessageBox.question(None, 'Toxygen', - QtGui.QApplication.translate("login", - 'Update for Toxygen was found. Download and install it?', - None, - QtGui.QApplication.UnicodeUTF8), - QtGui.QMessageBox.Yes, - QtGui.QMessageBox.No) - if reply == QtGui.QMessageBox.Yes: + QtWidgets.QApplication.translate("login", + 'Update for Toxygen was found. Download and install it?'), + QtWidgets.QMessageBox.Yes, + QtWidgets.QMessageBox.No) + if reply == QtWidgets.QMessageBox.Yes: updater.download(version) updating = True @@ -323,7 +310,7 @@ class Toxygen: if self.uri is not None: self.ms.add_contact(self.uri) - app.connect(app, QtCore.SIGNAL("lastWindowClosed()"), app, QtCore.SLOT("quit()")) + app.lastWindowClosed.connect(app.quit) app.exec_() self.init.stop = True diff --git a/toxygen/mainscreen.py b/toxygen/mainscreen.py index cf52814..9847d01 100644 --- a/toxygen/mainscreen.py +++ b/toxygen/mainscreen.py @@ -1,7 +1,7 @@ from menu import * from profile import * from list_items import * -from widgets import MultilineEdit, LineEdit, ComboBox +from widgets import MultilineEdit, ComboBox import plugin_support from mainscreen_widgets import * import settings @@ -9,7 +9,7 @@ import platform import toxes -class MainWindow(QtGui.QMainWindow, Singleton): +class MainWindow(QtWidgets.QMainWindow, Singleton): def __init__(self, tox, reset, tray): super().__init__() @@ -23,7 +23,7 @@ class MainWindow(QtGui.QMainWindow, Singleton): self.ws = WelcomeScreen() def setup_menu(self, Form): - box = QtGui.QHBoxLayout() + box = QtWidgets.QHBoxLayout() box.setContentsMargins(0, 0, 0, 0) box.setAlignment(QtCore.Qt.AlignLeft) self.profile_button = MainMenuButton(Form) @@ -36,37 +36,37 @@ class MainWindow(QtGui.QMainWindow, Singleton): box.addWidget(self.about_button) box.setSpacing(0) - self.menuProfile = QtGui.QMenu() + self.menuProfile = QtWidgets.QMenu() self.menuProfile.setObjectName("menuProfile") - self.menuSettings = QtGui.QMenu() + self.menuSettings = QtWidgets.QMenu() self.menuSettings.setObjectName("menuSettings") - self.menuPlugins = QtGui.QMenu() + self.menuPlugins = QtWidgets.QMenu() self.menuPlugins.setObjectName("menuPlugins") - self.menuAbout = QtGui.QMenu() + self.menuAbout = QtWidgets.QMenu() self.menuAbout.setObjectName("menuAbout") - self.actionAdd_friend = QtGui.QAction(Form) + self.actionAdd_friend = QtWidgets.QAction(Form) self.actionAdd_friend.setObjectName("actionAdd_friend") - self.actionprofilesettings = QtGui.QAction(Form) + self.actionprofilesettings = QtWidgets.QAction(Form) self.actionprofilesettings.setObjectName("actionprofilesettings") - self.actionPrivacy_settings = QtGui.QAction(Form) + self.actionPrivacy_settings = QtWidgets.QAction(Form) 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.actionNotifications = QtGui.QAction(Form) + self.actionNotifications = QtWidgets.QAction(Form) self.actionNotifications.setObjectName("actionNotifications") - self.actionNetwork = QtGui.QAction(Form) + self.actionNetwork = QtWidgets.QAction(Form) self.actionNetwork.setObjectName("actionNetwork") - self.actionAbout_program = QtGui.QAction(Form) + self.actionAbout_program = QtWidgets.QAction(Form) self.actionAbout_program.setObjectName("actionAbout_program") - self.updateSettings = QtGui.QAction(Form) - self.actionSettings = QtGui.QAction(Form) + self.updateSettings = QtWidgets.QAction(Form) + self.actionSettings = QtWidgets.QAction(Form) self.actionSettings.setObjectName("actionSettings") - self.audioSettings = QtGui.QAction(Form) - self.pluginData = QtGui.QAction(Form) - self.importPlugin = QtGui.QAction(Form) - self.reloadPlugins = QtGui.QAction(Form) - self.lockApp = QtGui.QAction(Form) + self.audioSettings = QtWidgets.QAction(Form) + self.pluginData = QtWidgets.QAction(Form) + self.importPlugin = QtWidgets.QAction(Form) + self.reloadPlugins = QtWidgets.QAction(Form) + self.lockApp = QtWidgets.QAction(Form) self.menuProfile.addAction(self.actionAdd_friend) self.menuProfile.addAction(self.actionSettings) self.menuProfile.addAction(self.lockApp) @@ -113,37 +113,37 @@ class MainWindow(QtGui.QMainWindow, Singleton): return super(MainWindow, self).event(event) def retranslateUi(self): - self.lockApp.setText(QtGui.QApplication.translate("MainWindow", "Lock", None, QtGui.QApplication.UnicodeUTF8)) - self.plugins_button.setText(QtGui.QApplication.translate("MainWindow", "Plugins", None, QtGui.QApplication.UnicodeUTF8)) - self.pluginData.setText(QtGui.QApplication.translate("MainWindow", "List of plugins", None, QtGui.QApplication.UnicodeUTF8)) - self.profile_button.setText(QtGui.QApplication.translate("MainWindow", "Profile", None, QtGui.QApplication.UnicodeUTF8)) - self.settings_button.setText(QtGui.QApplication.translate("MainWindow", "Settings", None, QtGui.QApplication.UnicodeUTF8)) - self.about_button.setText(QtGui.QApplication.translate("MainWindow", "About", None, QtGui.QApplication.UnicodeUTF8)) - self.actionAdd_friend.setText(QtGui.QApplication.translate("MainWindow", "Add contact", None, QtGui.QApplication.UnicodeUTF8)) - self.actionprofilesettings.setText(QtGui.QApplication.translate("MainWindow", "Profile", None, QtGui.QApplication.UnicodeUTF8)) - self.actionPrivacy_settings.setText(QtGui.QApplication.translate("MainWindow", "Privacy", None, QtGui.QApplication.UnicodeUTF8)) - self.actionInterface_settings.setText(QtGui.QApplication.translate("MainWindow", "Interface", None, QtGui.QApplication.UnicodeUTF8)) - self.actionNotifications.setText(QtGui.QApplication.translate("MainWindow", "Notifications", None, QtGui.QApplication.UnicodeUTF8)) - self.actionNetwork.setText(QtGui.QApplication.translate("MainWindow", "Network", None, QtGui.QApplication.UnicodeUTF8)) - self.actionAbout_program.setText(QtGui.QApplication.translate("MainWindow", "About program", None, QtGui.QApplication.UnicodeUTF8)) - self.actionSettings.setText(QtGui.QApplication.translate("MainWindow", "Settings", None, QtGui.QApplication.UnicodeUTF8)) - self.audioSettings.setText(QtGui.QApplication.translate("MainWindow", "Audio", None, QtGui.QApplication.UnicodeUTF8)) - self.updateSettings.setText(QtGui.QApplication.translate("MainWindow", "Updates", None, QtGui.QApplication.UnicodeUTF8)) - self.contact_name.setPlaceholderText(QtGui.QApplication.translate("MainWindow", "Search", None, QtGui.QApplication.UnicodeUTF8)) - self.sendMessageButton.setToolTip(QtGui.QApplication.translate("MainWindow", "Send message", None, QtGui.QApplication.UnicodeUTF8)) - self.callButton.setToolTip(QtGui.QApplication.translate("MainWindow", "Start audio call with friend", None, QtGui.QApplication.UnicodeUTF8)) + self.lockApp.setText(QtWidgets.QApplication.translate("MainWindow", "Lock")) + self.plugins_button.setText(QtWidgets.QApplication.translate("MainWindow", "Plugins")) + self.pluginData.setText(QtWidgets.QApplication.translate("MainWindow", "List of plugins")) + self.profile_button.setText(QtWidgets.QApplication.translate("MainWindow", "Profile")) + self.settings_button.setText(QtWidgets.QApplication.translate("MainWindow", "Settings")) + self.about_button.setText(QtWidgets.QApplication.translate("MainWindow", "About")) + self.actionAdd_friend.setText(QtWidgets.QApplication.translate("MainWindow", "Add contact")) + self.actionprofilesettings.setText(QtWidgets.QApplication.translate("MainWindow", "Profile")) + self.actionPrivacy_settings.setText(QtWidgets.QApplication.translate("MainWindow", "Privacy")) + self.actionInterface_settings.setText(QtWidgets.QApplication.translate("MainWindow", "Interface")) + self.actionNotifications.setText(QtWidgets.QApplication.translate("MainWindow", "Notifications")) + self.actionNetwork.setText(QtWidgets.QApplication.translate("MainWindow", "Network")) + self.actionAbout_program.setText(QtWidgets.QApplication.translate("MainWindow", "About program")) + self.actionSettings.setText(QtWidgets.QApplication.translate("MainWindow", "Settings")) + self.audioSettings.setText(QtWidgets.QApplication.translate("MainWindow", "Audio")) + self.updateSettings.setText(QtWidgets.QApplication.translate("MainWindow", "Updates")) + self.contact_name.setPlaceholderText(QtWidgets.QApplication.translate("MainWindow", "Search")) + 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.addItem(QtGui.QApplication.translate("MainWindow", "All", None, QtGui.QApplication.UnicodeUTF8)) - self.online_contacts.addItem(QtGui.QApplication.translate("MainWindow", "Online", None, QtGui.QApplication.UnicodeUTF8)) - self.online_contacts.addItem(QtGui.QApplication.translate("MainWindow", "Online first", None, QtGui.QApplication.UnicodeUTF8)) - self.online_contacts.addItem(QtGui.QApplication.translate("MainWindow", "Name", None, QtGui.QApplication.UnicodeUTF8)) - self.online_contacts.addItem(QtGui.QApplication.translate("MainWindow", "Online and by name", None, QtGui.QApplication.UnicodeUTF8)) - 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", "All")) + self.online_contacts.addItem(QtWidgets.QApplication.translate("MainWindow", "Online")) + self.online_contacts.addItem(QtWidgets.QApplication.translate("MainWindow", "Online first")) + self.online_contacts.addItem(QtWidgets.QApplication.translate("MainWindow", "Name")) + self.online_contacts.addItem(QtWidgets.QApplication.translate("MainWindow", "Online and by name")) + self.online_contacts.addItem(QtWidgets.QApplication.translate("MainWindow", "Online first and by name")) ind = Settings.get_instance()['sorting'] d = {0: 0, 1: 1, 2: 2, 3: 4, 1 | 4: 4, 2 | 4: 5} self.online_contacts.setCurrentIndex(d[ind]) - self.importPlugin.setText(QtGui.QApplication.translate("MainWindow", "Import plugin", None, QtGui.QApplication.UnicodeUTF8)) - self.reloadPlugins.setText(QtGui.QApplication.translate("MainWindow", "Reload plugins", None, QtGui.QApplication.UnicodeUTF8)) + self.importPlugin.setText(QtWidgets.QApplication.translate("MainWindow", "Import plugin")) + self.reloadPlugins.setText(QtWidgets.QApplication.translate("MainWindow", "Reload plugins")) def setup_right_bottom(self, Form): Form.resize(650, 60) @@ -155,7 +155,7 @@ class MainWindow(QtGui.QMainWindow, Singleton): font.setFamily(settings.Settings.get_instance()['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.setObjectName("sendMessageButton") @@ -178,7 +178,7 @@ class MainWindow(QtGui.QMainWindow, Singleton): def setup_left_center_menu(self, Form): 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)) pixmap = QtGui.QPixmap() pixmap.load(curr_directory() + '/images/search.png') @@ -202,7 +202,7 @@ class MainWindow(QtGui.QMainWindow, Singleton): Form.setMinimumSize(QtCore.QSize(270, 75)) Form.setMaximumSize(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.setScaledContents(False) self.avatar_label.setAlignment(QtCore.Qt.AlignCenter) @@ -230,7 +230,7 @@ class MainWindow(QtGui.QMainWindow, Singleton): def setup_right_top(self, Form): 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.setScaledContents(False) self.account_name = DataLabel(Form) @@ -249,16 +249,16 @@ class MainWindow(QtGui.QMainWindow, Singleton): font.setBold(False) self.account_status.setFont(font) 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.setObjectName("callButton") 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.setObjectName("videocallButton") self.videocallButton.clicked.connect(lambda: self.profile.call_click(True, True)) self.update_call_state('call') - self.typing = QtGui.QLabel(Form) + self.typing = QtWidgets.QLabel(Form) self.typing.setGeometry(QtCore.QRect(500, 25, 50, 30)) pixmap = QtGui.QPixmap(QtCore.QSize(50, 30)) pixmap.load(curr_directory() + '/images/typing.png') @@ -268,20 +268,19 @@ class MainWindow(QtGui.QMainWindow, Singleton): QtCore.QMetaObject.connectSlotsByName(Form) 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.setGeometry(0, 0, 270, 310) self.friends_list.clicked.connect(self.friend_click) self.friends_list.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) - self.friends_list.connect(self.friends_list, QtCore.SIGNAL("customContextMenuRequested(QPoint)"), - self.friend_right_click) - self.friends_list.setVerticalScrollMode(QtGui.QAbstractItemView.ScrollPerPixel) + self.friends_list.customContextMenuRequested.connect(self.friend_right_click) + self.friends_list.setVerticalScrollMode(QtWidgets.QAbstractItemView.ScrollPerPixel) self.friends_list.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn) self.friends_list.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) self.friends_list.verticalScrollBar().setContextMenuPolicy(QtCore.Qt.NoContextMenu) 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.setObjectName("messages") self.messages.setSpacing(1) @@ -295,8 +294,8 @@ class MainWindow(QtGui.QMainWindow, Singleton): self.profile.load_history() self.messages.verticalScrollBar().setValue(1) self.messages.verticalScrollBar().valueChanged.connect(load) - self.messages.setVerticalScrollMode(QtGui.QAbstractItemView.ScrollPerPixel) - self.messages.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) + self.messages.setVerticalScrollMode(QtWidgets.QAbstractItemView.ScrollPerPixel) + self.messages.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection) def initUI(self, tox): self.setMinimumSize(920, 500) @@ -304,15 +303,15 @@ class MainWindow(QtGui.QMainWindow, Singleton): self.setGeometry(s['x'], s['y'], s['width'], s['height']) self.setWindowTitle('Toxygen') os.chdir(curr_directory() + '/images/') - menu = QtGui.QWidget() - main = QtGui.QWidget() - grid = QtGui.QGridLayout() - search = QtGui.QWidget() - name = QtGui.QWidget() - info = QtGui.QWidget() - main_list = QtGui.QWidget() - messages = QtGui.QWidget() - message_buttons = QtGui.QWidget() + menu = QtWidgets.QWidget() + main = QtWidgets.QWidget() + grid = QtWidgets.QGridLayout() + search = QtWidgets.QWidget() + name = QtWidgets.QWidget() + info = QtWidgets.QWidget() + main_list = QtWidgets.QWidget() + messages = QtWidgets.QWidget() + message_buttons = QtWidgets.QWidget() self.setup_left_center_menu(search) self.setup_left_top(name) self.setup_right_center(messages) @@ -369,9 +368,9 @@ class MainWindow(QtGui.QMainWindow, Singleton): s['width'] = self.width() s['height'] = self.height() s.save() - QtGui.QApplication.closeAllWindows() + QtWidgets.QApplication.closeAllWindows() event.accept() - elif QtGui.QSystemTrayIcon.isSystemTrayAvailable(): + elif QtWidgets.QSystemTrayIcon.isSystemTrayAvailable(): event.ignore() self.hide() @@ -401,13 +400,13 @@ class MainWindow(QtGui.QMainWindow, Singleton): self.profile.update() 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() 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())) indexes = (rows[0] - self.messages.count(), rows[-1] - self.messages.count()) s = self.profile.export_history(self.profile.active_friend, True, indexes) - clipboard = QtGui.QApplication.clipboard() + clipboard = QtWidgets.QApplication.clipboard() clipboard.setText(s) elif event.key() == QtCore.Qt.Key_Z and event.modifiers() & QtCore.Qt.ControlModifier and self.messages.selectedIndexes(): self.messages.clearSelection() @@ -422,9 +421,9 @@ class MainWindow(QtGui.QMainWindow, Singleton): def about_program(self): import util - msgBox = QtGui.QMessageBox() - msgBox.setWindowTitle(QtGui.QApplication.translate("MainWindow", "About", None, QtGui.QApplication.UnicodeUTF8)) - text = (QtGui.QApplication.translate("MainWindow", 'Toxygen is Tox client written on Python.\nVersion: ', None, QtGui.QApplication.UnicodeUTF8)) + msgBox = QtWidgets.QMessageBox() + msgBox.setWindowTitle(QtWidgets.QApplication.translate("MainWindow", "About")) + 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.exec_() @@ -471,22 +470,19 @@ class MainWindow(QtGui.QMainWindow, Singleton): def import_plugin(self): import util - directory = QtGui.QFileDialog.getExistingDirectory(self, - QtGui.QApplication.translate("MainWindow", 'Choose folder with plugin', - None, - QtGui.QApplication.UnicodeUTF8), + directory = QtWidgets.QFileDialog.getExistingDirectory(self, + QtWidgets.QApplication.translate("MainWindow", 'Choose folder with plugin'), util.curr_directory(), - QtGui.QFileDialog.ShowDirsOnly | QtGui.QFileDialog.DontUseNativeDialog) + QtWidgets.QFileDialog.ShowDirsOnly | QtWidgets.QFileDialog.DontUseNativeDialog) if directory: src = directory + '/' dest = curr_directory() + '/plugins/' util.copy(src, dest) - msgBox = QtGui.QMessageBox() + msgBox = QtWidgets.QMessageBox() msgBox.setWindowTitle( - QtGui.QApplication.translate("MainWindow", "Restart Toxygen", None, QtGui.QApplication.UnicodeUTF8)) + QtWidgets.QApplication.translate("MainWindow", "Restart Toxygen")) msgBox.setText( - QtGui.QApplication.translate("MainWindow", 'Plugin will be loaded after restart', None, - QtGui.QApplication.UnicodeUTF8)) + QtWidgets.QApplication.translate("MainWindow", 'Plugin will be loaded after restart')) msgBox.exec_() def lock_app(self): @@ -494,12 +490,11 @@ class MainWindow(QtGui.QMainWindow, Singleton): Settings.get_instance().locked = True self.hide() else: - msgBox = QtGui.QMessageBox() + msgBox = QtWidgets.QMessageBox() msgBox.setWindowTitle( - QtGui.QApplication.translate("MainWindow", "Cannot lock app", None, QtGui.QApplication.UnicodeUTF8)) + QtWidgets.QApplication.translate("MainWindow", "Cannot lock app")) msgBox.setText( - QtGui.QApplication.translate("MainWindow", 'Error. Profile password is not set.', None, - QtGui.QApplication.UnicodeUTF8)) + QtWidgets.QApplication.translate("MainWindow", 'Error. Profile password is not set.')) msgBox.exec_() def show_menu(self): @@ -522,8 +517,8 @@ class MainWindow(QtGui.QMainWindow, Singleton): def send_file(self): self.menu.hide() if self.profile.active_friend + 1: - choose = QtGui.QApplication.translate("MainWindow", 'Choose file', None, QtGui.QApplication.UnicodeUTF8) - name = QtGui.QFileDialog.getOpenFileName(self, choose, options=QtGui.QFileDialog.DontUseNativeDialog) + choose = QtWidgets.QApplication.translate("MainWindow", 'Choose file') + name = QtWidgets.QFileDialog.getOpenFileName(self, choose, options=QtWidgets.QFileDialog.DontUseNativeDialog) if name[0]: self.profile.send_file(name[0]) @@ -588,44 +583,43 @@ class MainWindow(QtGui.QMainWindow, Singleton): return settings = Settings.get_instance() 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: - self.listMenu = QtGui.QMenu() - set_alias_item = self.listMenu.addAction(QtGui.QApplication.translate("MainWindow", 'Set alias', None, QtGui.QApplication.UnicodeUTF8)) + self.listMenu = QtWidgets.QMenu() + 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)) - clear_history_item = history_menu.addAction(QtGui.QApplication.translate("MainWindow", 'Clear history', None, QtGui.QApplication.UnicodeUTF8)) - export_to_text_item = history_menu.addAction(QtGui.QApplication.translate("MainWindow", 'Export as text', None, QtGui.QApplication.UnicodeUTF8)) - export_to_html_item = history_menu.addAction(QtGui.QApplication.translate("MainWindow", 'Export as HTML', None, QtGui.QApplication.UnicodeUTF8)) + history_menu = self.listMenu.addMenu(QtWidgets.QApplication.translate("MainWindow", 'Chat history')) + clear_history_item = history_menu.addAction(QtWidgets.QApplication.translate("MainWindow", 'Clear history')) + export_to_text_item = history_menu.addAction(QtWidgets.QApplication.translate("MainWindow", 'Export as text')) + 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_name_item = copy_menu.addAction(QtGui.QApplication.translate("MainWindow", 'Name', None, QtGui.QApplication.UnicodeUTF8)) - copy_status_item = copy_menu.addAction(QtGui.QApplication.translate("MainWindow", 'Status message', None, QtGui.QApplication.UnicodeUTF8)) - copy_key_item = copy_menu.addAction(QtGui.QApplication.translate("MainWindow", 'Public key', None, QtGui.QApplication.UnicodeUTF8)) + copy_menu = self.listMenu.addMenu(QtWidgets.QApplication.translate("MainWindow", 'Copy')) + copy_name_item = copy_menu.addAction(QtWidgets.QApplication.translate("MainWindow", 'Name')) + copy_status_item = copy_menu.addAction(QtWidgets.QApplication.translate("MainWindow", 'Status message')) + copy_key_item = copy_menu.addAction(QtWidgets.QApplication.translate("MainWindow", 'Public key')) auto_accept_item = self.listMenu.addAction(auto) - remove_item = self.listMenu.addAction(QtGui.QApplication.translate("MainWindow", 'Remove friend', None, QtGui.QApplication.UnicodeUTF8)) - block_item = self.listMenu.addAction(QtGui.QApplication.translate("MainWindow", 'Block friend', None, QtGui.QApplication.UnicodeUTF8)) - notes_item = self.listMenu.addAction(QtGui.QApplication.translate("MainWindow", 'Notes', None, QtGui.QApplication.UnicodeUTF8)) + remove_item = self.listMenu.addAction(QtWidgets.QApplication.translate("MainWindow", 'Remove friend')) + block_item = self.listMenu.addAction(QtWidgets.QApplication.translate("MainWindow", 'Block friend')) + notes_item = self.listMenu.addAction(QtWidgets.QApplication.translate("MainWindow", 'Notes')) plugins_loader = plugin_support.PluginLoader.get_instance() if plugins_loader is not None: submenu = plugins_loader.get_menu(self.listMenu, num) 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) - self.connect(set_alias_item, QtCore.SIGNAL("triggered()"), lambda: self.set_alias(num)) - self.connect(remove_item, QtCore.SIGNAL("triggered()"), lambda: self.remove_friend(num)) - self.connect(block_item, QtCore.SIGNAL("triggered()"), lambda: self.block_friend(num)) - self.connect(copy_key_item, QtCore.SIGNAL("triggered()"), lambda: self.copy_friend_key(num)) - self.connect(clear_history_item, QtCore.SIGNAL("triggered()"), lambda: self.clear_history(num)) - self.connect(auto_accept_item, QtCore.SIGNAL("triggered()"), lambda: self.auto_accept(num, not allowed)) - self.connect(notes_item, QtCore.SIGNAL("triggered()"), lambda: self.show_note(friend)) - self.connect(copy_name_item, QtCore.SIGNAL("triggered()"), lambda: self.copy_name(friend)) - self.connect(copy_status_item, QtCore.SIGNAL("triggered()"), lambda: self.copy_status(friend)) - self.connect(export_to_text_item, QtCore.SIGNAL("triggered()"), lambda: self.export_history(num)) - self.connect(export_to_html_item, QtCore.SIGNAL("triggered()"), - lambda: self.export_history(num, False)) + set_alias_item.triggered.connect(lambda: self.set_alias(num)) + remove_item.triggered.connect(lambda: self.remove_friend(num)) + block_item.triggered.connect(lambda: self.block_friend(num)) + copy_key_item.triggered.connect(lambda: self.copy_friend_key(num)) + clear_history_item.triggered.connect(lambda: self.clear_history(num)) + auto_accept_item.triggered.connect(lambda: self.auto_accept(num, not allowed)) + notes_item.triggered.connect(lambda: self.show_note(friend)) + copy_name_item.triggered.connect(lambda: self.copy_name(friend)) + copy_status_item.triggered.connect(lambda: self.copy_status(friend)) + export_to_text_item.triggered.connect(lambda: self.export_history(num)) + export_to_html_item.triggered.connect(lambda: self.export_history(num, False)) parent_position = self.friends_list.mapToGlobal(QtCore.QPoint(0, 0)) self.listMenu.move(parent_position + pos) self.listMenu.show() @@ -633,7 +627,7 @@ class MainWindow(QtGui.QMainWindow, Singleton): def show_note(self, friend): s = Settings.get_instance() 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) def save_note(text): @@ -647,12 +641,11 @@ class MainWindow(QtGui.QMainWindow, Singleton): def export_history(self, num, as_text=True): s = self.profile.export_history(num, as_text) - directory = QtGui.QFileDialog.getExistingDirectory(None, - QtGui.QApplication.translate("MainWindow", 'Choose folder', - None, - QtGui.QApplication.UnicodeUTF8), + directory = QtWidgets.QFileDialog.getExistingDirectory(None, + QtWidgets.QApplication.translate("MainWindow", + 'Choose folder'), curr_directory(), - QtGui.QFileDialog.ShowDirsOnly | QtGui.QFileDialog.DontUseNativeDialog) + QtWidgets.QFileDialog.ShowDirsOnly | QtWidgets.QFileDialog.DontUseNativeDialog) if directory: name = 'exported_history_{}.{}'.format(convert_time(time.time()), 'txt' if as_text else 'html') @@ -671,15 +664,15 @@ class MainWindow(QtGui.QMainWindow, Singleton): def copy_friend_key(self, num): tox_id = self.profile.friend_public_key(num) - clipboard = QtGui.QApplication.clipboard() + clipboard = QtWidgets.QApplication.clipboard() clipboard.setText(tox_id) def copy_name(self, friend): - clipboard = QtGui.QApplication.clipboard() + clipboard = QtWidgets.QApplication.clipboard() clipboard.setText(friend.name) def copy_status(self, friend): - clipboard = QtGui.QApplication.clipboard() + clipboard = QtWidgets.QApplication.clipboard() clipboard.setText(friend.status_message) def clear_history(self, num): diff --git a/toxygen/mainscreen_widgets.py b/toxygen/mainscreen_widgets.py index 967cd4a..74ae20f 100644 --- a/toxygen/mainscreen_widgets.py +++ b/toxygen/mainscreen_widgets.py @@ -1,14 +1,11 @@ -try: - from PySide import QtCore, QtGui -except ImportError: - from PyQt4 import QtCore, QtGui +from PyQt5 import QtCore, QtGui, QtWidgets from widgets import RubberBand, create_menu, QRightClickButton, CenteredWidget, LineEdit from profile import Profile import smileys import util -class MessageArea(QtGui.QPlainTextEdit): +class MessageArea(QtWidgets.QPlainTextEdit): """User types messages here""" def __init__(self, parent, form): @@ -20,7 +17,7 @@ class MessageArea(QtGui.QPlainTextEdit): def keyPressEvent(self, event): if event.matches(QtGui.QKeySequence.Paste): - mimeData = QtGui.QApplication.clipboard().mimeData() + mimeData = QtWidgets.QApplication.clipboard().mimeData() if mimeData.hasUrls(): for url in mimeData.urls(): self.pasteEvent(url.toString()) @@ -67,14 +64,14 @@ class MessageArea(QtGui.QPlainTextEdit): e.ignore() def pasteEvent(self, text=None): - text = text or QtGui.QApplication.clipboard().text() + text = text or QtWidgets.QApplication.clipboard().text() if text.startswith('file://'): self.parent.profile.send_file(text[7:]) else: self.insertPlainText(text) -class ScreenShotWindow(QtGui.QWidget): +class ScreenShotWindow(QtWidgets.QWidget): def __init__(self, parent): super(ScreenShotWindow, self).__init__() @@ -84,6 +81,8 @@ class ScreenShotWindow(QtGui.QWidget): self.showFullScreen() self.setWindowOpacity(0.5) self.rubberband = RubberBand() + self.rubberband.setWindowFlags(self.rubberband.windowFlags() | QtCore.Qt.FramelessWindowHint) + self.rubberband.setAttribute(QtCore.Qt.WA_TranslucentBackground) def closeEvent(self, *args): if self.parent.isHidden(): @@ -93,7 +92,7 @@ class ScreenShotWindow(QtGui.QWidget): self.origin = event.pos() self.rubberband.setGeometry(QtCore.QRect(self.origin, QtCore.QSize())) self.rubberband.show() - QtGui.QWidget.mousePressEvent(self, event) + QtWidgets.QWidget.mousePressEvent(self, event) def mouseMoveEvent(self, event): if self.rubberband.isVisible(): @@ -109,11 +108,12 @@ class ScreenShotWindow(QtGui.QWidget): self.rubberband.hide() rect = self.rubberband.geometry() if rect.width() and rect.height(): - p = QtGui.QPixmap.grabWindow(QtGui.QApplication.desktop().winId(), - rect.x() + 4, - rect.y() + 4, - rect.width() - 8, - rect.height() - 8) + screen = QtWidgets.QApplication.primaryScreen() + p = screen.grabWindow(0, + rect.x() + 4, + rect.y() + 4, + rect.width() - 8, + rect.height() - 8) byte_array = QtCore.QByteArray() buffer = QtCore.QBuffer(byte_array) buffer.open(QtCore.QIODevice.WriteOnly) @@ -129,7 +129,7 @@ class ScreenShotWindow(QtGui.QWidget): super(ScreenShotWindow, self).keyPressEvent(event) -class SmileyWindow(QtGui.QWidget): +class SmileyWindow(QtWidgets.QWidget): """ Smiley selection window """ @@ -151,7 +151,7 @@ class SmileyWindow(QtGui.QWidget): self.radio = [] self.parent = parent 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.clicked.connect(lambda i=i: self.checked(i)) self.radio.append(elem) @@ -160,7 +160,7 @@ class SmileyWindow(QtGui.QWidget): self.setMinimumSize(width, 200) self.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.clicked.connect(lambda i=i: self.clicked(i)) self.buttons.append(b) @@ -190,7 +190,7 @@ class SmileyWindow(QtGui.QWidget): self.close() -class MenuButton(QtGui.QPushButton): +class MenuButton(QtWidgets.QPushButton): def __init__(self, parent, enter): super(MenuButton, self).__init__(parent) @@ -201,7 +201,7 @@ class MenuButton(QtGui.QPushButton): super(MenuButton, self).enterEvent(event) -class DropdownMenu(QtGui.QWidget): +class DropdownMenu(QtWidgets.QWidget): def __init__(self, parent): super(DropdownMenu, self).__init__(parent) @@ -213,20 +213,20 @@ class DropdownMenu(QtGui.QWidget): self.screenshotButton.setGeometry(QtCore.QRect(0, 60, 60, 60)) 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.setObjectName("fileTransferButton") - self.audioMessageButton = QtGui.QPushButton(self) + self.audioMessageButton = QtWidgets.QPushButton(self) self.audioMessageButton.setGeometry(QtCore.QRect(120, 60, 60, 60)) - self.smileyButton = QtGui.QPushButton(self) + self.smileyButton = QtWidgets.QPushButton(self) self.smileyButton.setGeometry(QtCore.QRect(0, 0, 60, 60)) - self.videoMessageButton = QtGui.QPushButton(self) + self.videoMessageButton = QtWidgets.QPushButton(self) self.videoMessageButton.setGeometry(QtCore.QRect(120, 0, 60, 60)) - self.stickerButton = QtGui.QPushButton(self) + self.stickerButton = QtWidgets.QPushButton(self) self.stickerButton.setGeometry(QtCore.QRect(60, 0, 60, 60)) pixmap = QtGui.QPixmap(util.curr_directory() + '/images/file.png') @@ -254,16 +254,16 @@ class DropdownMenu(QtGui.QWidget): self.stickerButton.setIcon(icon) self.stickerButton.setIconSize(QtCore.QSize(55, 55)) - self.screenshotButton.setToolTip(QtGui.QApplication.translate("MenuWindow", "Send screenshot", None, QtGui.QApplication.UnicodeUTF8)) - self.fileTransferButton.setToolTip(QtGui.QApplication.translate("MenuWindow", "Send file", None, QtGui.QApplication.UnicodeUTF8)) - self.audioMessageButton.setToolTip(QtGui.QApplication.translate("MenuWindow", "Send audio message", None, QtGui.QApplication.UnicodeUTF8)) - self.videoMessageButton.setToolTip(QtGui.QApplication.translate("MenuWindow", "Send video message", None, QtGui.QApplication.UnicodeUTF8)) - 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.screenshotButton.setToolTip(QtWidgets.QApplication.translate("MenuWindow", "Send screenshot")) + self.fileTransferButton.setToolTip(QtWidgets.QApplication.translate("MenuWindow", "Send file")) + self.audioMessageButton.setToolTip(QtWidgets.QApplication.translate("MenuWindow", "Send audio message")) + self.videoMessageButton.setToolTip(QtWidgets.QApplication.translate("MenuWindow", "Send video message")) + self.smileyButton.setToolTip(QtWidgets.QApplication.translate("MenuWindow", "Add smiley")) + self.stickerButton.setToolTip(QtWidgets.QApplication.translate("MenuWindow", "Send sticker")) self.fileTransferButton.clicked.connect(parent.send_file) 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.stickerButton.clicked.connect(parent.send_sticker) @@ -276,11 +276,11 @@ class DropdownMenu(QtGui.QWidget): return False -class StickerItem(QtGui.QWidget): +class StickerItem(QtWidgets.QWidget): def __init__(self, fl): super(StickerItem, self).__init__() - self._image_label = QtGui.QLabel(self) + self._image_label = QtWidgets.QLabel(self) self.path = fl self.pixmap = QtGui.QPixmap() self.pixmap.load(fl) @@ -290,7 +290,7 @@ class StickerItem(QtGui.QWidget): self._image_label.setPixmap(self.pixmap) -class StickerWindow(QtGui.QWidget): +class StickerWindow(QtWidgets.QWidget): """Sticker selection window""" def __init__(self, parent): @@ -298,16 +298,16 @@ class StickerWindow(QtGui.QWidget): self.setWindowFlags(QtCore.Qt.FramelessWindowHint) self.setMaximumSize(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.arr = smileys.sticker_loader() for sticker in self.arr: item = StickerItem(sticker) - elem = QtGui.QListWidgetItem() + elem = QtWidgets.QListWidgetItem() elem.setSizeHint(QtCore.QSize(250, item.height())) self.list.addItem(elem) self.list.setItemWidget(elem, item) - self.list.setVerticalScrollMode(QtGui.QAbstractItemView.ScrollPerPixel) + self.list.setVerticalScrollMode(QtWidgets.QAbstractItemView.ScrollPerPixel) self.list.setSpacing(3) self.list.clicked.connect(self.click) self.parent = parent @@ -329,56 +329,44 @@ class WelcomeScreen(CenteredWidget): self.setMinimumSize(250, 200) self.center() 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.setOpenExternalLinks(True) - self.checkbox = QtGui.QCheckBox(self) + self.checkbox = QtWidgets.QCheckBox(self) self.checkbox.setGeometry(QtCore.QRect(5, 170, 240, 30)) - self.checkbox.setText(QtGui.QApplication.translate('WelcomeScreen', "Don't show again", - None, QtGui.QApplication.UnicodeUTF8)) - self.setWindowTitle(QtGui.QApplication.translate('WelcomeScreen', 'Tip of the day', - None, QtGui.QApplication.UnicodeUTF8)) + self.checkbox.setText(QtWidgets.QApplication.translate('WelcomeScreen', "Don't show again")) + self.setWindowTitle(QtWidgets.QApplication.translate('WelcomeScreen', 'Tip of the day')) import random num = random.randint(0, 10) if num == 0: - text = QtGui.QApplication.translate('WelcomeScreen', 'Press Esc if you want hide app to tray.', - None, QtGui.QApplication.UnicodeUTF8) + text = QtWidgets.QApplication.translate('WelcomeScreen', 'Press Esc if you want hide app to tray.') elif num == 1: - text = QtGui.QApplication.translate('WelcomeScreen', - 'Right click on screenshot button hides app to tray during screenshot.', - None, QtGui.QApplication.UnicodeUTF8) + text = QtWidgets.QApplication.translate('WelcomeScreen', + 'Right click on screenshot button hides app to tray during screenshot.') elif num == 2: - text = QtGui.QApplication.translate('WelcomeScreen', - 'You can use Tox over Tor. For more info read this post', - None, QtGui.QApplication.UnicodeUTF8) + text = QtWidgets.QApplication.translate('WelcomeScreen', + 'You can use Tox over Tor. For more info read this post') elif num == 3: - text = QtGui.QApplication.translate('WelcomeScreen', - 'Use Settings -> Interface to customize interface.', - None, QtGui.QApplication.UnicodeUTF8) + text = QtWidgets.QApplication.translate('WelcomeScreen', + 'Use Settings -> Interface to customize interface.') elif num == 4: - text = QtGui.QApplication.translate('WelcomeScreen', - 'Set profile password via Profile -> Settings. Password allows Toxygen encrypt your history and settings.', - None, QtGui.QApplication.UnicodeUTF8) + text = QtWidgets.QApplication.translate('WelcomeScreen', + 'Set profile password via Profile -> Settings. Password allows Toxygen encrypt your history and settings.') elif num == 5: - text = QtGui.QApplication.translate('WelcomeScreen', - 'Since v0.1.3 Toxygen supports plugins. Read more', - None, QtGui.QApplication.UnicodeUTF8) + text = QtWidgets.QApplication.translate('WelcomeScreen', + 'Since v0.1.3 Toxygen supports plugins. Read more') elif num in (6, 7): - text = QtGui.QApplication.translate('WelcomeScreen', - '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) + 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.') elif num == 8: - text = QtGui.QApplication.translate('WelcomeScreen', - 'Delete single message in chat: make right click on spinner or message time and choose "Delete" in menu', - None, QtGui.QApplication.UnicodeUTF8) + text = QtWidgets.QApplication.translate('WelcomeScreen', + 'Delete single message in chat: make right click on spinner or message time and choose "Delete" in menu') elif num == 9: - text = QtGui.QApplication.translate('WelcomeScreen', - 'Use right click on inline image to save it', - None, QtGui.QApplication.UnicodeUTF8) + text = QtWidgets.QApplication.translate('WelcomeScreen', + 'Use right click on inline image to save it') else: - text = QtGui.QApplication.translate('WelcomeScreen', - 'Set new NoSpam to avoid spam friend requests: Profile -> Settings -> Set new NoSpam.', - None, QtGui.QApplication.UnicodeUTF8) + text = QtWidgets.QApplication.translate('WelcomeScreen', + 'Set new NoSpam to avoid spam friend requests: Profile -> Settings -> Set new NoSpam.') self.text.setHtml(text) self.checkbox.stateChanged.connect(self.not_show) QtCore.QTimer.singleShot(1000, self.show) @@ -390,7 +378,7 @@ class WelcomeScreen(CenteredWidget): s.save() -class MainMenuButton(QtGui.QPushButton): +class MainMenuButton(QtWidgets.QPushButton): def __init__(self, *args): super().__init__(*args) @@ -402,16 +390,18 @@ class MainMenuButton(QtGui.QPushButton): super().setText(text) -class ClickableLabel(QtGui.QLabel): +class ClickableLabel(QtWidgets.QLabel): + + clicked = QtCore.pyqtSignal() def __init__(self, *args): super().__init__(*args) 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): super().__init__(*args) @@ -429,23 +419,23 @@ class SearchScreen(QtGui.QWidget): self.search_button.setScaledContents(False) self.search_button.setAlignment(QtCore.Qt.AlignCenter) 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.setPointSize(32) 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.clicked.connect(self.prev) 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.clicked.connect(self.next) 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.clicked.connect(self.close) self.close_button.setText('×') @@ -458,8 +448,7 @@ class SearchScreen(QtGui.QWidget): self.retranslateUi() def retranslateUi(self): - self.search_text.setPlaceholderText(QtGui.QApplication.translate("MainWindow", "Search", None, - QtGui.QApplication.UnicodeUTF8)) + self.search_text.setPlaceholderText(QtWidgets.QApplication.translate("MainWindow", "Search")) def show(self): super().show() @@ -515,15 +504,11 @@ class SearchScreen(QtGui.QWidget): @staticmethod def not_found(text): - mbox = QtGui.QMessageBox() - mbox_text = QtGui.QApplication.translate("MainWindow", - 'Text "{}" was not found', - None, - QtGui.QApplication.UnicodeUTF8) + mbox = QtWidgets.QMessageBox() + mbox_text = QtWidgets.QApplication.translate("MainWindow", + 'Text "{}" was not found') mbox.setText(mbox_text.format(text)) - mbox.setWindowTitle(QtGui.QApplication.translate("MainWindow", - 'Not found', - None, - QtGui.QApplication.UnicodeUTF8)) + mbox.setWindowTitle(QtWidgets.QApplication.translate("MainWindow", + 'Not found')) mbox.exec_() diff --git a/toxygen/menu.py b/toxygen/menu.py index 1fe22cb..c3958e9 100644 --- a/toxygen/menu.py +++ b/toxygen/menu.py @@ -1,7 +1,4 @@ -try: - from PySide import QtCore, QtGui -except ImportError: - from PyQt4 import QtCore, QtGui +from PyQt5 import QtCore, QtGui, QtWidgets from settings import * from profile import Profile from util import curr_directory, copy @@ -23,7 +20,7 @@ class AddContact(CenteredWidget): def initUI(self, tox_id): self.setObjectName('AddContact') self.resize(568, 306) - self.sendRequestButton = QtGui.QPushButton(self) + self.sendRequestButton = QtWidgets.QPushButton(self) self.sendRequestButton.setGeometry(QtCore.QRect(50, 270, 471, 31)) self.sendRequestButton.setMinimumSize(QtCore.QSize(0, 0)) self.sendRequestButton.setBaseSize(QtCore.QSize(0, 0)) @@ -33,7 +30,7 @@ class AddContact(CenteredWidget): self.tox_id.setGeometry(QtCore.QRect(50, 40, 471, 27)) self.tox_id.setObjectName("lineEdit") self.tox_id.setText(tox_id) - self.label = QtGui.QLabel(self) + self.label = QtWidgets.QLabel(self) self.label.setGeometry(QtCore.QRect(50, 10, 80, 20)) self.error_label = DataLabel(self) self.error_label.setGeometry(QtCore.QRect(120, 10, 420, 20)) @@ -44,10 +41,10 @@ class AddContact(CenteredWidget): self.error_label.setFont(font) self.error_label.setStyleSheet("QLabel { color: #BC1C1C; }") self.label.setObjectName("label") - self.message_edit = QtGui.QTextEdit(self) + self.message_edit = QtWidgets.QTextEdit(self) self.message_edit.setGeometry(QtCore.QRect(50, 110, 471, 151)) self.message_edit.setObjectName("textEdit") - self.message = QtGui.QLabel(self) + self.message = QtWidgets.QLabel(self) self.message.setGeometry(QtCore.QRect(50, 70, 101, 31)) self.message.setFont(font) self.message.setObjectName("label_2") @@ -73,11 +70,11 @@ class AddContact(CenteredWidget): self.error_label.setText(send) def retranslateUi(self): - self.setWindowTitle(QtGui.QApplication.translate('AddContact', "Add contact", None, QtGui.QApplication.UnicodeUTF8)) - self.sendRequestButton.setText(QtGui.QApplication.translate("Form", "Send request", None, QtGui.QApplication.UnicodeUTF8)) - self.label.setText(QtGui.QApplication.translate('AddContact', "TOX ID:", None, QtGui.QApplication.UnicodeUTF8)) - self.message.setText(QtGui.QApplication.translate('AddContact', "Message:", None, QtGui.QApplication.UnicodeUTF8)) - self.tox_id.setPlaceholderText(QtGui.QApplication.translate('AddContact', "TOX ID or public key of contact", None, QtGui.QApplication.UnicodeUTF8)) + self.setWindowTitle(QtWidgets.QApplication.translate('AddContact', "Add contact")) + self.sendRequestButton.setText(QtWidgets.QApplication.translate("Form", "Send request")) + self.label.setText(QtWidgets.QApplication.translate('AddContact', "TOX ID:")) + self.message.setText(QtWidgets.QApplication.translate('AddContact', "Message:")) + self.tox_id.setPlaceholderText(QtWidgets.QApplication.translate('AddContact', "TOX ID or public key of contact")) class ProfileSettings(CenteredWidget): @@ -95,12 +92,12 @@ class ProfileSettings(CenteredWidget): self.nick.setGeometry(QtCore.QRect(30, 60, 350, 27)) profile = Profile.get_instance() self.nick.setText(profile.name) - self.status = QtGui.QComboBox(self) + self.status = QtWidgets.QComboBox(self) self.status.setGeometry(QtCore.QRect(400, 60, 200, 27)) self.status_message = LineEdit(self) self.status_message.setGeometry(QtCore.QRect(30, 130, 350, 27)) self.status_message.setText(profile.status_message) - self.label = QtGui.QLabel(self) + self.label = QtWidgets.QLabel(self) self.label.setGeometry(QtCore.QRect(40, 30, 91, 25)) font = QtGui.QFont() font.setFamily(Settings.get_instance()['font']) @@ -108,59 +105,59 @@ class ProfileSettings(CenteredWidget): font.setWeight(75) font.setBold(True) self.label.setFont(font) - self.label_2 = QtGui.QLabel(self) + self.label_2 = QtWidgets.QLabel(self) self.label_2.setGeometry(QtCore.QRect(40, 100, 100, 25)) self.label_2.setFont(font) - self.label_3 = QtGui.QLabel(self) + self.label_3 = QtWidgets.QLabel(self) self.label_3.setGeometry(QtCore.QRect(40, 180, 100, 25)) self.label_3.setFont(font) - self.tox_id = QtGui.QLabel(self) + self.tox_id = QtWidgets.QLabel(self) self.tox_id.setGeometry(QtCore.QRect(15, 210, 685, 21)) font.setPointSize(10) self.tox_id.setFont(font) s = profile.tox_id self.tox_id.setText(s) - self.copyId = QtGui.QPushButton(self) + self.copyId = QtWidgets.QPushButton(self) self.copyId.setGeometry(QtCore.QRect(40, 250, 180, 30)) self.copyId.clicked.connect(self.copy) - self.export = QtGui.QPushButton(self) + self.export = QtWidgets.QPushButton(self) self.export.setGeometry(QtCore.QRect(230, 250, 180, 30)) self.export.clicked.connect(self.export_profile) - self.new_nospam = QtGui.QPushButton(self) + self.new_nospam = QtWidgets.QPushButton(self) self.new_nospam.setGeometry(QtCore.QRect(420, 250, 180, 30)) self.new_nospam.clicked.connect(self.new_no_spam) - self.copy_pk = QtGui.QPushButton(self) + self.copy_pk = QtWidgets.QPushButton(self) self.copy_pk.setGeometry(QtCore.QRect(40, 300, 180, 30)) self.copy_pk.clicked.connect(self.copy_public_key) - self.new_avatar = QtGui.QPushButton(self) + self.new_avatar = QtWidgets.QPushButton(self) self.new_avatar.setGeometry(QtCore.QRect(230, 300, 180, 30)) - self.delete_avatar = QtGui.QPushButton(self) + self.delete_avatar = QtWidgets.QPushButton(self) self.delete_avatar.setGeometry(QtCore.QRect(420, 300, 180, 30)) self.delete_avatar.clicked.connect(self.reset_avatar) self.new_avatar.clicked.connect(self.set_avatar) - self.profilepass = QtGui.QLabel(self) + self.profilepass = QtWidgets.QLabel(self) self.profilepass.setGeometry(QtCore.QRect(40, 340, 300, 30)) font.setPointSize(18) self.profilepass.setFont(font) self.password = LineEdit(self) self.password.setGeometry(QtCore.QRect(40, 380, 300, 30)) - self.password.setEchoMode(QtGui.QLineEdit.EchoMode.Password) - self.leave_blank = QtGui.QLabel(self) + self.password.setEchoMode(QtWidgets.QLineEdit.Password) + self.leave_blank = QtWidgets.QLabel(self) self.leave_blank.setGeometry(QtCore.QRect(350, 380, 300, 30)) self.confirm_password = LineEdit(self) self.confirm_password.setGeometry(QtCore.QRect(40, 420, 300, 30)) - self.confirm_password.setEchoMode(QtGui.QLineEdit.EchoMode.Password) - self.set_password = QtGui.QPushButton(self) + self.confirm_password.setEchoMode(QtWidgets.QLineEdit.Password) + self.set_password = QtWidgets.QPushButton(self) self.set_password.setGeometry(QtCore.QRect(40, 470, 300, 30)) 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, 420, 300, 30)) self.not_match.setVisible(False) self.not_match.setStyleSheet('QLabel { color: #BC1C1C; }') - self.warning = QtGui.QLabel(self) + self.warning = QtWidgets.QLabel(self) self.warning.setGeometry(QtCore.QRect(40, 510, 500, 30)) self.warning.setStyleSheet('QLabel { color: #BC1C1C; }') - self.default = QtGui.QPushButton(self) + self.default = QtWidgets.QPushButton(self) self.default.setGeometry(QtCore.QRect(40, 550, 620, 30)) path, name = Settings.get_auto_profile() self.auto = path + name == ProfileHelper.get_path() + Settings.get_instance().name @@ -173,30 +170,30 @@ class ProfileSettings(CenteredWidget): QtCore.QMetaObject.connectSlotsByName(self) def retranslateUi(self): - self.export.setText(QtGui.QApplication.translate("ProfileSettingsForm", "Export profile", None, QtGui.QApplication.UnicodeUTF8)) - self.setWindowTitle(QtGui.QApplication.translate("ProfileSettingsForm", "Profile settings", None, QtGui.QApplication.UnicodeUTF8)) - self.label.setText(QtGui.QApplication.translate("ProfileSettingsForm", "Name:", None, QtGui.QApplication.UnicodeUTF8)) - self.label_2.setText(QtGui.QApplication.translate("ProfileSettingsForm", "Status:", None, QtGui.QApplication.UnicodeUTF8)) - self.label_3.setText(QtGui.QApplication.translate("ProfileSettingsForm", "TOX ID:", None, QtGui.QApplication.UnicodeUTF8)) - self.copyId.setText(QtGui.QApplication.translate("ProfileSettingsForm", "Copy TOX ID", None, QtGui.QApplication.UnicodeUTF8)) - self.new_avatar.setText(QtGui.QApplication.translate("ProfileSettingsForm", "New avatar", None, QtGui.QApplication.UnicodeUTF8)) - self.delete_avatar.setText(QtGui.QApplication.translate("ProfileSettingsForm", "Reset avatar", None, QtGui.QApplication.UnicodeUTF8)) - self.new_nospam.setText(QtGui.QApplication.translate("ProfileSettingsForm", "New NoSpam", None, QtGui.QApplication.UnicodeUTF8)) - self.profilepass.setText(QtGui.QApplication.translate("ProfileSettingsForm", "Profile password", None, QtGui.QApplication.UnicodeUTF8)) - self.password.setPlaceholderText(QtGui.QApplication.translate("ProfileSettingsForm", "Password (at least 8 symbols)", None, QtGui.QApplication.UnicodeUTF8)) - self.confirm_password.setPlaceholderText(QtGui.QApplication.translate("ProfileSettingsForm", "Confirm password", None, QtGui.QApplication.UnicodeUTF8)) - self.set_password.setText(QtGui.QApplication.translate("ProfileSettingsForm", "Set password", None, QtGui.QApplication.UnicodeUTF8)) - self.not_match.setText(QtGui.QApplication.translate("ProfileSettingsForm", "Passwords do not match", None, QtGui.QApplication.UnicodeUTF8)) - self.leave_blank.setText(QtGui.QApplication.translate("ProfileSettingsForm", "Leaving blank will reset current password", None, QtGui.QApplication.UnicodeUTF8)) - self.warning.setText(QtGui.QApplication.translate("ProfileSettingsForm", "There is no way to recover lost passwords", None, QtGui.QApplication.UnicodeUTF8)) - self.status.addItem(QtGui.QApplication.translate("ProfileSettingsForm", "Online", None, QtGui.QApplication.UnicodeUTF8)) - self.status.addItem(QtGui.QApplication.translate("ProfileSettingsForm", "Away", None, QtGui.QApplication.UnicodeUTF8)) - self.status.addItem(QtGui.QApplication.translate("ProfileSettingsForm", "Busy", None, QtGui.QApplication.UnicodeUTF8)) - self.copy_pk.setText(QtGui.QApplication.translate("ProfileSettingsForm", "Copy public key", None, QtGui.QApplication.UnicodeUTF8)) + self.export.setText(QtWidgets.QApplication.translate("ProfileSettingsForm", "Export profile")) + self.setWindowTitle(QtWidgets.QApplication.translate("ProfileSettingsForm", "Profile settings")) + self.label.setText(QtWidgets.QApplication.translate("ProfileSettingsForm", "Name:")) + self.label_2.setText(QtWidgets.QApplication.translate("ProfileSettingsForm", "Status:")) + self.label_3.setText(QtWidgets.QApplication.translate("ProfileSettingsForm", "TOX ID:")) + self.copyId.setText(QtWidgets.QApplication.translate("ProfileSettingsForm", "Copy TOX ID")) + self.new_avatar.setText(QtWidgets.QApplication.translate("ProfileSettingsForm", "New avatar")) + self.delete_avatar.setText(QtWidgets.QApplication.translate("ProfileSettingsForm", "Reset avatar")) + self.new_nospam.setText(QtWidgets.QApplication.translate("ProfileSettingsForm", "New NoSpam")) + self.profilepass.setText(QtWidgets.QApplication.translate("ProfileSettingsForm", "Profile password")) + self.password.setPlaceholderText(QtWidgets.QApplication.translate("ProfileSettingsForm", "Password (at least 8 symbols)")) + self.confirm_password.setPlaceholderText(QtWidgets.QApplication.translate("ProfileSettingsForm", "Confirm password")) + self.set_password.setText(QtWidgets.QApplication.translate("ProfileSettingsForm", "Set password")) + self.not_match.setText(QtWidgets.QApplication.translate("ProfileSettingsForm", "Passwords do not match")) + self.leave_blank.setText(QtWidgets.QApplication.translate("ProfileSettingsForm", "Leaving blank will reset current password")) + self.warning.setText(QtWidgets.QApplication.translate("ProfileSettingsForm", "There is no way to recover lost passwords")) + self.status.addItem(QtWidgets.QApplication.translate("ProfileSettingsForm", "Online")) + self.status.addItem(QtWidgets.QApplication.translate("ProfileSettingsForm", "Away")) + self.status.addItem(QtWidgets.QApplication.translate("ProfileSettingsForm", "Busy")) + self.copy_pk.setText(QtWidgets.QApplication.translate("ProfileSettingsForm", "Copy public key")) if self.auto: - self.default.setText(QtGui.QApplication.translate("ProfileSettingsForm", "Mark as not default profile", None, QtGui.QApplication.UnicodeUTF8)) + self.default.setText(QtWidgets.QApplication.translate("ProfileSettingsForm", "Mark as not default profile")) else: - self.default.setText(QtGui.QApplication.translate("ProfileSettingsForm", "Mark as default profile", None, QtGui.QApplication.UnicodeUTF8)) + self.default.setText(QtWidgets.QApplication.translate("ProfileSettingsForm", "Mark as default profile")) def auto_profile(self): if self.auto: @@ -205,12 +202,10 @@ class ProfileSettings(CenteredWidget): Settings.set_auto_profile(ProfileHelper.get_path(), Settings.get_instance().name) self.auto = not self.auto if self.auto: - self.default.setText(QtGui.QApplication.translate("ProfileSettingsForm", "Mark as not default profile", None, - QtGui.QApplication.UnicodeUTF8)) + self.default.setText(QtWidgets.QApplication.translate("ProfileSettingsForm", "Mark as not default profile")) else: self.default.setText( - QtGui.QApplication.translate("ProfileSettingsForm", "Mark as default profile", None, - QtGui.QApplication.UnicodeUTF8)) + QtWidgets.QApplication.translate("ProfileSettingsForm", "Mark as default profile")) def new_password(self): if self.password.text() == self.confirm_password.text(): @@ -220,16 +215,14 @@ class ProfileSettings(CenteredWidget): self.close() else: self.not_match.setText( - QtGui.QApplication.translate("ProfileSettingsForm", "Password must be at least 8 symbols", None, - QtGui.QApplication.UnicodeUTF8)) + QtWidgets.QApplication.translate("ProfileSettingsForm", "Password must be at least 8 symbols")) self.not_match.setVisible(True) else: - self.not_match.setText(QtGui.QApplication.translate("ProfileSettingsForm", "Passwords do not match", None, - QtGui.QApplication.UnicodeUTF8)) + self.not_match.setText(QtWidgets.QApplication.translate("ProfileSettingsForm", "Passwords do not match")) self.not_match.setVisible(True) def copy(self): - clipboard = QtGui.QApplication.clipboard() + clipboard = QtWidgets.QApplication.clipboard() profile = Profile.get_instance() clipboard.setText(profile.tox_id) pixmap = QtGui.QPixmap(curr_directory() + '/images/accept.png') @@ -238,7 +231,7 @@ class ProfileSettings(CenteredWidget): self.copyId.setIconSize(QtCore.QSize(10, 10)) def copy_public_key(self): - clipboard = QtGui.QApplication.clipboard() + clipboard = QtWidgets.QApplication.clipboard() profile = Profile.get_instance() clipboard.setText(profile.tox_id[:64]) pixmap = QtGui.QPixmap(curr_directory() + '/images/accept.png') @@ -253,9 +246,9 @@ class ProfileSettings(CenteredWidget): Profile.get_instance().reset_avatar() def set_avatar(self): - choose = QtGui.QApplication.translate("ProfileSettingsForm", "Choose avatar", None, QtGui.QApplication.UnicodeUTF8) - name = QtGui.QFileDialog.getOpenFileName(self, choose, None, 'Images (*.png)', - options=QtGui.QFileDialog.DontUseNativeDialog) + choose = QtWidgets.QApplication.translate("ProfileSettingsForm", "Choose avatar") + name = QtWidgets.QFileDialog.getOpenFileName(self, choose, None, 'Images (*.png)', + QtGui.QComboBoxQtWidgets.QFileDialog.DontUseNativeDialog) if name[0]: bitmap = QtGui.QPixmap(name[0]) bitmap.scaled(QtCore.QSize(128, 128), aspectMode=QtCore.Qt.KeepAspectRatio, @@ -268,25 +261,21 @@ class ProfileSettings(CenteredWidget): Profile.get_instance().set_avatar(bytes(byte_array.data())) def export_profile(self): - directory = QtGui.QFileDialog.getExistingDirectory(options=QtGui.QFileDialog.DontUseNativeDialog, + directory = QtWidgets.QFileDialog.getExistingDirectory(options=QtWidgets.QFileDialog.DontUseNativeDialog, dir=curr_directory()) + '/' if directory != '/': - reply = QtGui.QMessageBox.question(None, - QtGui.QApplication.translate("ProfileSettingsForm", - 'Use new path', - None, - QtGui.QApplication.UnicodeUTF8), - QtGui.QApplication.translate("ProfileSettingsForm", - 'Do you want to move your profile to this location?', - None, - QtGui.QApplication.UnicodeUTF8), - QtGui.QMessageBox.Yes, - QtGui.QMessageBox.No) + reply = QtWidgets.QMessageBox.question(None, + QtWidgets.QApplication.translate("ProfileSettingsForm", + 'Use new path'), + QtWidgets.QApplication.translate("ProfileSettingsForm", + 'Do you want to move your profile to this location?'), + QtWidgets.QMessageBox.Yes, + QtWidgets.QMessageBox.No) settings = Settings.get_instance() settings.export(directory) profile = Profile.get_instance() profile.export_db(directory) - ProfileHelper.get_instance().export_profile(directory, reply == QtGui.QMessageBox.Yes) + ProfileHelper.get_instance().export_profile(directory, reply == QtWidgets.QMessageBox.Yes) def closeEvent(self, event): profile = Profile.get_instance() @@ -309,15 +298,15 @@ class NetworkSettings(CenteredWidget): self.setMinimumSize(QtCore.QSize(300, 330)) self.setMaximumSize(QtCore.QSize(300, 330)) self.setBaseSize(QtCore.QSize(300, 330)) - self.ipv = QtGui.QCheckBox(self) + self.ipv = QtWidgets.QCheckBox(self) self.ipv.setGeometry(QtCore.QRect(20, 10, 97, 22)) self.ipv.setObjectName("ipv") - self.udp = QtGui.QCheckBox(self) + self.udp = QtWidgets.QCheckBox(self) self.udp.setGeometry(QtCore.QRect(150, 10, 97, 22)) self.udp.setObjectName("udp") - self.proxy = QtGui.QCheckBox(self) + self.proxy = QtWidgets.QCheckBox(self) self.proxy.setGeometry(QtCore.QRect(20, 40, 97, 22)) - self.http = QtGui.QCheckBox(self) + self.http = QtWidgets.QCheckBox(self) self.http.setGeometry(QtCore.QRect(20, 70, 97, 22)) self.proxy.setObjectName("proxy") self.proxyip = LineEdit(self) @@ -326,11 +315,11 @@ class NetworkSettings(CenteredWidget): self.proxyport = LineEdit(self) self.proxyport.setGeometry(QtCore.QRect(40, 190, 231, 27)) self.proxyport.setObjectName("proxyport") - self.label = QtGui.QLabel(self) + self.label = QtWidgets.QLabel(self) self.label.setGeometry(QtCore.QRect(40, 100, 66, 17)) - self.label_2 = QtGui.QLabel(self) + self.label_2 = QtWidgets.QLabel(self) self.label_2.setGeometry(QtCore.QRect(40, 165, 66, 17)) - self.reconnect = QtGui.QPushButton(self) + self.reconnect = QtWidgets.QPushButton(self) self.reconnect.setGeometry(QtCore.QRect(40, 230, 231, 30)) self.reconnect.clicked.connect(self.restart_core) settings = Settings.get_instance() @@ -340,7 +329,7 @@ class NetworkSettings(CenteredWidget): self.proxyip.setText(settings['proxy_host']) self.proxyport.setText(str(settings['proxy_port'])) self.http.setChecked(settings['proxy_type'] == 1) - self.warning = QtGui.QLabel(self) + self.warning = QtWidgets.QLabel(self) self.warning.setGeometry(QtCore.QRect(5, 270, 290, 60)) self.warning.setStyleSheet('QLabel { color: #BC1C1C; }') self.retranslateUi() @@ -349,16 +338,15 @@ class NetworkSettings(CenteredWidget): QtCore.QMetaObject.connectSlotsByName(self) def retranslateUi(self): - self.setWindowTitle(QtGui.QApplication.translate("NetworkSettings", "Network settings", None, QtGui.QApplication.UnicodeUTF8)) - self.ipv.setText(QtGui.QApplication.translate("Form", "IPv6", None, QtGui.QApplication.UnicodeUTF8)) - self.udp.setText(QtGui.QApplication.translate("Form", "UDP", None, QtGui.QApplication.UnicodeUTF8)) - self.proxy.setText(QtGui.QApplication.translate("Form", "Proxy", None, QtGui.QApplication.UnicodeUTF8)) - self.label.setText(QtGui.QApplication.translate("Form", "IP:", None, QtGui.QApplication.UnicodeUTF8)) - self.label_2.setText(QtGui.QApplication.translate("Form", "Port:", None, QtGui.QApplication.UnicodeUTF8)) - self.reconnect.setText(QtGui.QApplication.translate("NetworkSettings", "Restart TOX core", None, QtGui.QApplication.UnicodeUTF8)) - self.http.setText(QtGui.QApplication.translate("Form", "HTTP", None, QtGui.QApplication.UnicodeUTF8)) - self.warning.setText(QtGui.QApplication.translate("Form", "WARNING:\nusing proxy with enabled UDP\ncan produce IP leak", - None, QtGui.QApplication.UnicodeUTF8)) + self.setWindowTitle(QtWidgets.QApplication.translate("NetworkSettings", "Network settings")) + self.ipv.setText(QtWidgets.QApplication.translate("Form", "IPv6")) + self.udp.setText(QtWidgets.QApplication.translate("Form", "UDP")) + self.proxy.setText(QtWidgets.QApplication.translate("Form", "Proxy")) + self.label.setText(QtWidgets.QApplication.translate("Form", "IP:")) + self.label_2.setText(QtWidgets.QApplication.translate("Form", "Port:")) + self.reconnect.setText(QtWidgets.QApplication.translate("NetworkSettings", "Restart TOX core")) + self.http.setText(QtWidgets.QApplication.translate("Form", "HTTP")) + self.warning.setText(QtWidgets.QApplication.translate("Form", "WARNING:\nusing proxy with enabled UDP\ncan produce IP leak")) def activate(self): bl = self.proxy.isChecked() @@ -395,23 +383,23 @@ class PrivacySettings(CenteredWidget): self.resize(370, 600) self.setMinimumSize(QtCore.QSize(370, 600)) self.setMaximumSize(QtCore.QSize(370, 600)) - self.saveHistory = QtGui.QCheckBox(self) + self.saveHistory = QtWidgets.QCheckBox(self) self.saveHistory.setGeometry(QtCore.QRect(10, 20, 350, 22)) - self.saveUnsentOnly = QtGui.QCheckBox(self) + self.saveUnsentOnly = QtWidgets.QCheckBox(self) self.saveUnsentOnly.setGeometry(QtCore.QRect(10, 60, 350, 22)) - self.fileautoaccept = QtGui.QCheckBox(self) + self.fileautoaccept = QtWidgets.QCheckBox(self) self.fileautoaccept.setGeometry(QtCore.QRect(10, 100, 350, 22)) - self.typingNotifications = QtGui.QCheckBox(self) + self.typingNotifications = QtWidgets.QCheckBox(self) self.typingNotifications.setGeometry(QtCore.QRect(10, 140, 350, 30)) - self.inlines = QtGui.QCheckBox(self) + self.inlines = QtWidgets.QCheckBox(self) self.inlines.setGeometry(QtCore.QRect(10, 180, 350, 30)) - self.auto_path = QtGui.QLabel(self) + self.auto_path = QtWidgets.QLabel(self) self.auto_path.setGeometry(QtCore.QRect(10, 230, 350, 30)) - self.path = QtGui.QPlainTextEdit(self) + self.path = QtWidgets.QPlainTextEdit(self) self.path.setGeometry(QtCore.QRect(10, 265, 350, 45)) - self.change_path = QtGui.QPushButton(self) + self.change_path = QtWidgets.QPushButton(self) self.change_path.setGeometry(QtCore.QRect(10, 320, 350, 30)) settings = Settings.get_instance() self.typingNotifications.setChecked(settings['typing_notifications']) @@ -423,37 +411,37 @@ class PrivacySettings(CenteredWidget): self.saveHistory.stateChanged.connect(self.update) self.path.setPlainText(settings['auto_accept_path'] or curr_directory()) self.change_path.clicked.connect(self.new_path) - self.block_user_label = QtGui.QLabel(self) + self.block_user_label = QtWidgets.QLabel(self) self.block_user_label.setGeometry(QtCore.QRect(10, 360, 350, 30)) - self.block_id = QtGui.QPlainTextEdit(self) + self.block_id = QtWidgets.QPlainTextEdit(self) self.block_id.setGeometry(QtCore.QRect(10, 390, 350, 30)) - self.block = QtGui.QPushButton(self) + self.block = QtWidgets.QPushButton(self) self.block.setGeometry(QtCore.QRect(10, 430, 350, 30)) self.block.clicked.connect(lambda: Profile.get_instance().block_user(self.block_id.toPlainText()) or self.close()) - self.blocked_users_label = QtGui.QLabel(self) + self.blocked_users_label = QtWidgets.QLabel(self) self.blocked_users_label.setGeometry(QtCore.QRect(10, 470, 350, 30)) - self.comboBox = QtGui.QComboBox(self) + self.comboBox = QtWidgets.QComboBox(self) self.comboBox.setGeometry(QtCore.QRect(10, 500, 350, 30)) self.comboBox.addItems(settings['blocked']) - self.unblock = QtGui.QPushButton(self) + self.unblock = QtWidgets.QPushButton(self) self.unblock.setGeometry(QtCore.QRect(10, 540, 350, 30)) self.unblock.clicked.connect(lambda: self.unblock_user()) self.retranslateUi() QtCore.QMetaObject.connectSlotsByName(self) def retranslateUi(self): - self.setWindowTitle(QtGui.QApplication.translate("privacySettings", "Privacy settings", None, QtGui.QApplication.UnicodeUTF8)) - self.saveHistory.setText(QtGui.QApplication.translate("privacySettings", "Save chat history", None, QtGui.QApplication.UnicodeUTF8)) - self.fileautoaccept.setText(QtGui.QApplication.translate("privacySettings", "Allow file auto accept", None, QtGui.QApplication.UnicodeUTF8)) - self.typingNotifications.setText(QtGui.QApplication.translate("privacySettings", "Send typing notifications", None, QtGui.QApplication.UnicodeUTF8)) - self.auto_path.setText(QtGui.QApplication.translate("privacySettings", "Auto accept default path:", None, QtGui.QApplication.UnicodeUTF8)) - self.change_path.setText(QtGui.QApplication.translate("privacySettings", "Change", None, QtGui.QApplication.UnicodeUTF8)) - self.inlines.setText(QtGui.QApplication.translate("privacySettings", "Allow inlines", None, QtGui.QApplication.UnicodeUTF8)) - self.block_user_label.setText(QtGui.QApplication.translate("privacySettings", "Block by public key:", None, QtGui.QApplication.UnicodeUTF8)) - self.blocked_users_label.setText(QtGui.QApplication.translate("privacySettings", "Blocked users:", None, QtGui.QApplication.UnicodeUTF8)) - self.unblock.setText(QtGui.QApplication.translate("privacySettings", "Unblock", None, QtGui.QApplication.UnicodeUTF8)) - self.block.setText(QtGui.QApplication.translate("privacySettings", "Block user", None, QtGui.QApplication.UnicodeUTF8)) - self.saveUnsentOnly.setText(QtGui.QApplication.translate("privacySettings", "Save unsent messages only", None, QtGui.QApplication.UnicodeUTF8)) + self.setWindowTitle(QtWidgets.QApplication.translate("privacySettings", "Privacy settings")) + self.saveHistory.setText(QtWidgets.QApplication.translate("privacySettings", "Save chat history")) + self.fileautoaccept.setText(QtWidgets.QApplication.translate("privacySettings", "Allow file auto accept")) + self.typingNotifications.setText(QtWidgets.QApplication.translate("privacySettings", "Send typing notifications")) + self.auto_path.setText(QtWidgets.QApplication.translate("privacySettings", "Auto accept default path:")) + self.change_path.setText(QtWidgets.QApplication.translate("privacySettings", "Change")) + self.inlines.setText(QtWidgets.QApplication.translate("privacySettings", "Allow inlines")) + self.block_user_label.setText(QtWidgets.QApplication.translate("privacySettings", "Block by public key:")) + self.blocked_users_label.setText(QtWidgets.QApplication.translate("privacySettings", "Blocked users:")) + self.unblock.setText(QtWidgets.QApplication.translate("privacySettings", "Unblock")) + self.block.setText(QtWidgets.QApplication.translate("privacySettings", "Block user")) + self.saveUnsentOnly.setText(QtWidgets.QApplication.translate("privacySettings", "Save unsent messages only")) def update(self, new_state): self.saveUnsentOnly.setEnabled(new_state) @@ -463,10 +451,10 @@ class PrivacySettings(CenteredWidget): def unblock_user(self): if not self.comboBox.count(): return - title = QtGui.QApplication.translate("privacySettings", "Add to friend list", None, QtGui.QApplication.UnicodeUTF8) - info = QtGui.QApplication.translate("privacySettings", "Do you want to add this user to friend list?", None, QtGui.QApplication.UnicodeUTF8) - reply = QtGui.QMessageBox.question(None, title, info, QtGui.QMessageBox.Yes, QtGui.QMessageBox.No) - Profile.get_instance().unblock_user(self.comboBox.currentText(), reply == QtGui.QMessageBox.Yes) + title = QtWidgets.QApplication.translate("privacySettings", "Add to friend list") + info = QtWidgets.QApplication.translate("privacySettings", "Do you want to add this user to friend list?") + reply = QtWidgets.QMessageBox.question(None, title, info, QtWidgets.QMessageBox.Yes, QtWidgets.QMessageBox.No) + Profile.get_instance().unblock_user(self.comboBox.currentText(), reply == QtWidgets.QMessageBox.Yes) self.close() def closeEvent(self, event): @@ -475,31 +463,27 @@ class PrivacySettings(CenteredWidget): settings['allow_auto_accept'] = self.fileautoaccept.isChecked() if settings['save_history'] and not self.saveHistory.isChecked(): # clear history - reply = QtGui.QMessageBox.question(None, - QtGui.QApplication.translate("privacySettings", - 'Chat history', - None, QtGui.QApplication.UnicodeUTF8), - QtGui.QApplication.translate("privacySettings", - 'History will be cleaned! Continue?', - None, QtGui.QApplication.UnicodeUTF8), - QtGui.QMessageBox.Yes, - QtGui.QMessageBox.No) - if reply == QtGui.QMessageBox.Yes: + reply = QtWidgets.QMessageBox.question(None, + QtWidgets.QApplication.translate("privacySettings", + 'Chat history'), + QtWidgets.QApplication.translate("privacySettings", + 'History will be cleaned! Continue?'), + QtWidgets.QMessageBox.Yes, + QtWidgets.QMessageBox.No) + if reply == QtWidgets.QMessageBox.Yes: Profile.get_instance().clear_history() settings['save_history'] = self.saveHistory.isChecked() else: settings['save_history'] = self.saveHistory.isChecked() if self.saveUnsentOnly.isChecked() and not settings['save_unsent_only']: - reply = QtGui.QMessageBox.question(None, - QtGui.QApplication.translate("privacySettings", - 'Chat history', - None, QtGui.QApplication.UnicodeUTF8), - QtGui.QApplication.translate("privacySettings", - 'History will be cleaned! Continue?', - None, QtGui.QApplication.UnicodeUTF8), - QtGui.QMessageBox.Yes, - QtGui.QMessageBox.No) - if reply == QtGui.QMessageBox.Yes: + reply = QtWidgets.QMessageBox.question(None, + QtWidgets.QApplication.translate("privacySettings", + 'Chat history'), + QtWidgets.QApplication.translate("privacySettings", + 'History will be cleaned! Continue?'), + QtWidgets.QMessageBox.Yes, + QtWidgets.QMessageBox.No) + if reply == QtWidgets.QMessageBox.Yes: Profile.get_instance().clear_history(None, True) settings['save_unsent_only'] = self.saveUnsentOnly.isChecked() else: @@ -509,7 +493,7 @@ class PrivacySettings(CenteredWidget): settings.save() def new_path(self): - directory = QtGui.QFileDialog.getExistingDirectory(options=QtGui.QFileDialog.DontUseNativeDialog) + '/' + directory = QtWidgets.QFileDialog.getExistingDirectory(options=QtWidgets.QFileDialog.DontUseNativeDialog) + '/' if directory != '/': self.path.setPlainText(directory) @@ -527,11 +511,11 @@ class NotificationsSettings(CenteredWidget): self.resize(350, 180) self.setMinimumSize(QtCore.QSize(350, 180)) self.setMaximumSize(QtCore.QSize(350, 180)) - self.enableNotifications = QtGui.QCheckBox(self) + self.enableNotifications = QtWidgets.QCheckBox(self) self.enableNotifications.setGeometry(QtCore.QRect(10, 20, 340, 18)) - self.callsSound = QtGui.QCheckBox(self) + self.callsSound = QtWidgets.QCheckBox(self) self.callsSound.setGeometry(QtCore.QRect(10, 120, 340, 18)) - self.soundNotifications = QtGui.QCheckBox(self) + self.soundNotifications = QtWidgets.QCheckBox(self) self.soundNotifications.setGeometry(QtCore.QRect(10, 70, 340, 18)) font = QtGui.QFont() s = Settings.get_instance() @@ -547,10 +531,10 @@ class NotificationsSettings(CenteredWidget): QtCore.QMetaObject.connectSlotsByName(self) def retranslateUi(self): - self.setWindowTitle(QtGui.QApplication.translate("notificationsForm", "Notification settings", None, QtGui.QApplication.UnicodeUTF8)) - self.enableNotifications.setText(QtGui.QApplication.translate("notificationsForm", "Enable notifications", None, QtGui.QApplication.UnicodeUTF8)) - self.callsSound.setText(QtGui.QApplication.translate("notificationsForm", "Enable call\'s sound", None, QtGui.QApplication.UnicodeUTF8)) - self.soundNotifications.setText(QtGui.QApplication.translate("notificationsForm", "Enable sound notifications", None, QtGui.QApplication.UnicodeUTF8)) + self.setWindowTitle(QtWidgets.QApplication.translate("notificationsForm", "Notification settings")) + self.enableNotifications.setText(QtWidgets.QApplication.translate("notificationsForm", "Enable notifications")) + self.callsSound.setText(QtWidgets.QApplication.translate("notificationsForm", "Enable call\'s sound")) + self.soundNotifications.setText(QtWidgets.QApplication.translate("notificationsForm", "Enable sound notifications")) def closeEvent(self, *args, **kwargs): settings = Settings.get_instance() @@ -571,7 +555,7 @@ class InterfaceSettings(CenteredWidget): self.setObjectName("interfaceForm") self.setMinimumSize(QtCore.QSize(400, 650)) self.setMaximumSize(QtCore.QSize(400, 650)) - self.label = QtGui.QLabel(self) + self.label = QtWidgets.QLabel(self) self.label.setGeometry(QtCore.QRect(30, 10, 370, 20)) settings = Settings.get_instance() font = QtGui.QFont() @@ -579,7 +563,7 @@ class InterfaceSettings(CenteredWidget): font.setBold(True) font.setFamily(settings['font']) self.label.setFont(font) - self.themeSelect = QtGui.QComboBox(self) + self.themeSelect = QtWidgets.QComboBox(self) self.themeSelect.setGeometry(QtCore.QRect(30, 40, 120, 30)) list_of_themes = ['dark'] self.themeSelect.addItems(list_of_themes) @@ -589,26 +573,26 @@ class InterfaceSettings(CenteredWidget): else: index = 0 self.themeSelect.setCurrentIndex(index) - self.lang_choose = QtGui.QComboBox(self) + self.lang_choose = QtWidgets.QComboBox(self) self.lang_choose.setGeometry(QtCore.QRect(30, 110, 120, 30)) supported = sorted(Settings.supported_languages().keys(), reverse=True) for key in supported: self.lang_choose.insertItem(0, key) if settings['language'] == key: self.lang_choose.setCurrentIndex(0) - self.lang = QtGui.QLabel(self) + self.lang = QtWidgets.QLabel(self) self.lang.setGeometry(QtCore.QRect(30, 80, 370, 20)) self.lang.setFont(font) - self.mirror_mode = QtGui.QCheckBox(self) + self.mirror_mode = QtWidgets.QCheckBox(self) self.mirror_mode.setGeometry(QtCore.QRect(30, 160, 370, 20)) self.mirror_mode.setChecked(settings['mirror_mode']) - self.smileys = QtGui.QCheckBox(self) + self.smileys = QtWidgets.QCheckBox(self) self.smileys.setGeometry(QtCore.QRect(30, 190, 120, 20)) self.smileys.setChecked(settings['smileys']) - self.smiley_pack_label = QtGui.QLabel(self) + self.smiley_pack_label = QtWidgets.QLabel(self) self.smiley_pack_label.setGeometry(QtCore.QRect(30, 230, 370, 20)) self.smiley_pack_label.setFont(font) - self.smiley_pack = QtGui.QComboBox(self) + self.smiley_pack = QtWidgets.QComboBox(self) self.smiley_pack.setGeometry(QtCore.QRect(30, 260, 160, 30)) sm = smileys.SmileyLoader.get_instance() self.smiley_pack.addItems(sm.get_packs_list()) @@ -617,39 +601,39 @@ class InterfaceSettings(CenteredWidget): except: ind = sm.get_packs_list().index('default') self.smiley_pack.setCurrentIndex(ind) - self.messages_font_size_label = QtGui.QLabel(self) + self.messages_font_size_label = QtWidgets.QLabel(self) self.messages_font_size_label.setGeometry(QtCore.QRect(30, 300, 370, 20)) self.messages_font_size_label.setFont(font) - self.messages_font_size = QtGui.QComboBox(self) + self.messages_font_size = QtWidgets.QComboBox(self) self.messages_font_size.setGeometry(QtCore.QRect(30, 330, 160, 30)) self.messages_font_size.addItems([str(x) for x in range(10, 19)]) self.messages_font_size.setCurrentIndex(settings['message_font_size'] - 10) - self.unread = QtGui.QPushButton(self) + self.unread = QtWidgets.QPushButton(self) self.unread.setGeometry(QtCore.QRect(30, 470, 340, 30)) self.unread.clicked.connect(self.select_color) - self.compact_mode = QtGui.QCheckBox(self) + self.compact_mode = QtWidgets.QCheckBox(self) self.compact_mode.setGeometry(QtCore.QRect(30, 380, 370, 20)) self.compact_mode.setChecked(settings['compact_mode']) - self.close_to_tray = QtGui.QCheckBox(self) + self.close_to_tray = QtWidgets.QCheckBox(self) self.close_to_tray.setGeometry(QtCore.QRect(30, 410, 370, 20)) self.close_to_tray.setChecked(settings['close_to_tray']) - self.show_avatars = QtGui.QCheckBox(self) + self.show_avatars = QtWidgets.QCheckBox(self) self.show_avatars.setGeometry(QtCore.QRect(30, 440, 370, 20)) self.show_avatars.setChecked(settings['show_avatars']) - self.choose_font = QtGui.QPushButton(self) + self.choose_font = QtWidgets.QPushButton(self) self.choose_font.setGeometry(QtCore.QRect(30, 510, 340, 30)) self.choose_font.clicked.connect(self.new_font) - self.import_smileys = QtGui.QPushButton(self) + self.import_smileys = QtWidgets.QPushButton(self) self.import_smileys.setGeometry(QtCore.QRect(30, 550, 340, 30)) self.import_smileys.clicked.connect(self.import_sm) - self.import_stickers = QtGui.QPushButton(self) + self.import_stickers = QtWidgets.QPushButton(self) self.import_stickers.setGeometry(QtCore.QRect(30, 590, 340, 30)) self.import_stickers.clicked.connect(self.import_st) @@ -657,29 +641,27 @@ class InterfaceSettings(CenteredWidget): QtCore.QMetaObject.connectSlotsByName(self) def retranslateUi(self): - self.show_avatars.setText(QtGui.QApplication.translate("interfaceForm", "Show avatars in chat", None, QtGui.QApplication.UnicodeUTF8)) - self.setWindowTitle(QtGui.QApplication.translate("interfaceForm", "Interface settings", None, QtGui.QApplication.UnicodeUTF8)) - self.label.setText(QtGui.QApplication.translate("interfaceForm", "Theme:", None, QtGui.QApplication.UnicodeUTF8)) - self.lang.setText(QtGui.QApplication.translate("interfaceForm", "Language:", None, QtGui.QApplication.UnicodeUTF8)) - self.smileys.setText(QtGui.QApplication.translate("interfaceForm", "Smileys", None, QtGui.QApplication.UnicodeUTF8)) - self.smiley_pack_label.setText(QtGui.QApplication.translate("interfaceForm", "Smiley pack:", None, QtGui.QApplication.UnicodeUTF8)) - self.mirror_mode.setText(QtGui.QApplication.translate("interfaceForm", "Mirror mode", None, QtGui.QApplication.UnicodeUTF8)) - self.messages_font_size_label.setText(QtGui.QApplication.translate("interfaceForm", "Messages font size:", None, QtGui.QApplication.UnicodeUTF8)) - self.unread.setText(QtGui.QApplication.translate("interfaceForm", "Select unread messages notification color", None, QtGui.QApplication.UnicodeUTF8)) - self.compact_mode.setText(QtGui.QApplication.translate("interfaceForm", "Compact contact list", None, QtGui.QApplication.UnicodeUTF8)) - self.import_smileys.setText(QtGui.QApplication.translate("interfaceForm", "Import smiley pack", None, QtGui.QApplication.UnicodeUTF8)) - self.import_stickers.setText(QtGui.QApplication.translate("interfaceForm", "Import sticker pack", None, QtGui.QApplication.UnicodeUTF8)) - self.close_to_tray.setText(QtGui.QApplication.translate("interfaceForm", "Close to tray", None, QtGui.QApplication.UnicodeUTF8)) - self.choose_font.setText(QtGui.QApplication.translate("interfaceForm", "Select font", None, QtGui.QApplication.UnicodeUTF8)) + self.show_avatars.setText(QtWidgets.QApplication.translate("interfaceForm", "Show avatars in chat")) + self.setWindowTitle(QtWidgets.QApplication.translate("interfaceForm", "Interface settings")) + self.label.setText(QtWidgets.QApplication.translate("interfaceForm", "Theme:")) + self.lang.setText(QtWidgets.QApplication.translate("interfaceForm", "Language:")) + self.smileys.setText(QtWidgets.QApplication.translate("interfaceForm", "Smileys")) + self.smiley_pack_label.setText(QtWidgets.QApplication.translate("interfaceForm", "Smiley pack:")) + self.mirror_mode.setText(QtWidgets.QApplication.translate("interfaceForm", "Mirror mode")) + self.messages_font_size_label.setText(QtWidgets.QApplication.translate("interfaceForm", "Messages font size:")) + self.unread.setText(QtWidgets.QApplication.translate("interfaceForm", "Select unread messages notification color")) + self.compact_mode.setText(QtWidgets.QApplication.translate("interfaceForm", "Compact contact list")) + self.import_smileys.setText(QtWidgets.QApplication.translate("interfaceForm", "Import smiley pack")) + self.import_stickers.setText(QtWidgets.QApplication.translate("interfaceForm", "Import sticker pack")) + self.close_to_tray.setText(QtWidgets.QApplication.translate("interfaceForm", "Close to tray")) + self.choose_font.setText(QtWidgets.QApplication.translate("interfaceForm", "Select font")) def import_st(self): - directory = QtGui.QFileDialog.getExistingDirectory(self, - QtGui.QApplication.translate("MainWindow", - 'Choose folder with sticker pack', - None, - QtGui.QApplication.UnicodeUTF8), + directory = QtWidgets.QFileDialog.getExistingDirectory(self, + QtWidgets.QApplication.translate("MainWindow", + 'Choose folder with sticker pack'), curr_directory(), - QtGui.QFileDialog.ShowDirsOnly | QtGui.QFileDialog.DontUseNativeDialog) + QtWidgets.QFileDialog.ShowDirsOnly | QtWidgets.QFileDialog.DontUseNativeDialog) if directory: src = directory + '/' @@ -687,13 +669,11 @@ class InterfaceSettings(CenteredWidget): copy(src, dest) def import_sm(self): - directory = QtGui.QFileDialog.getExistingDirectory(self, - QtGui.QApplication.translate("MainWindow", - 'Choose folder with smiley pack', - None, - QtGui.QApplication.UnicodeUTF8), + directory = QtWidgets.QFileDialog.getExistingDirectory(self, + QtWidgets.QApplication.translate("MainWindow", + 'Choose folder with smiley pack'), curr_directory(), - QtGui.QFileDialog.ShowDirsOnly | QtGui.QFileDialog.DontUseNativeDialog) + QtWidgets.QFileDialog.ShowDirsOnly | QtWidgets.QFileDialog.DontUseNativeDialog) if directory: src = directory + '/' @@ -702,21 +682,19 @@ class InterfaceSettings(CenteredWidget): def new_font(self): settings = Settings.get_instance() - font, ok = QtGui.QFontDialog.getFont(QtGui.QFont(settings['font'], 10), self) + font, ok = QtWidgets.QFontDialog.getFont(QtGui.QFont(settings['font'], 10), self) if ok: settings['font'] = font.family() settings.save() - msgBox = QtGui.QMessageBox() - text = QtGui.QApplication.translate("interfaceForm", 'Restart app to apply settings', None, - QtGui.QApplication.UnicodeUTF8) - msgBox.setWindowTitle(QtGui.QApplication.translate("interfaceForm", 'Restart required', None, - QtGui.QApplication.UnicodeUTF8)) + msgBox = QtWidgets.QMessageBox() + text = QtWidgets.QApplication.translate("interfaceForm", 'Restart app to apply settings') + msgBox.setWindowTitle(QtWidgets.QApplication.translate("interfaceForm", 'Restart required')) msgBox.setText(text) msgBox.exec_() def select_color(self): settings = Settings.get_instance() - col = QtGui.QColorDialog.getColor(settings['unread_color']) + col = QtWidgets.QColorDialog.getColor(QtGui.QColor(settings['unread_color'])) if col.isValid(): name = col.name() @@ -745,7 +723,7 @@ class InterfaceSettings(CenteredWidget): settings['language'] = language text = self.lang_choose.currentText() path = Settings.supported_languages()[text] - app = QtGui.QApplication.instance() + app = QtWidgets.QApplication.instance() app.removeTranslator(app.translator) app.translator.load(curr_directory() + '/translations/' + path) app.installTranslator(app.translator) @@ -753,11 +731,9 @@ class InterfaceSettings(CenteredWidget): Profile.get_instance().update() settings.save() if restart: - msgBox = QtGui.QMessageBox() - text = QtGui.QApplication.translate("interfaceForm", 'Restart app to apply settings', None, - QtGui.QApplication.UnicodeUTF8) - msgBox.setWindowTitle(QtGui.QApplication.translate("interfaceForm", 'Restart required', None, - QtGui.QApplication.UnicodeUTF8)) + msgBox = QtWidgets.QMessageBox() + text = QtWidgets.QApplication.translate("interfaceForm", 'Restart app to apply settings') + msgBox.setWindowTitle(QtWidgets.QApplication.translate("interfaceForm", 'Restart required')) msgBox.setText(text) msgBox.exec_() @@ -778,9 +754,9 @@ class AudioSettings(CenteredWidget): self.resize(400, 150) self.setMinimumSize(QtCore.QSize(400, 150)) self.setMaximumSize(QtCore.QSize(400, 150)) - self.in_label = QtGui.QLabel(self) + self.in_label = QtWidgets.QLabel(self) self.in_label.setGeometry(QtCore.QRect(25, 5, 350, 20)) - self.out_label = QtGui.QLabel(self) + self.out_label = QtWidgets.QLabel(self) self.out_label.setGeometry(QtCore.QRect(25, 65, 350, 20)) settings = Settings.get_instance() font = QtGui.QFont() @@ -789,9 +765,9 @@ class AudioSettings(CenteredWidget): font.setFamily(settings['font']) self.in_label.setFont(font) self.out_label.setFont(font) - self.input = QtGui.QComboBox(self) + self.input = QtWidgets.QComboBox(self) self.input.setGeometry(QtCore.QRect(25, 30, 350, 30)) - self.output = QtGui.QComboBox(self) + self.output = QtWidgets.QComboBox(self) self.output.setGeometry(QtCore.QRect(25, 90, 350, 30)) p = pyaudio.PyAudio() self.in_indexes, self.out_indexes = [], [] @@ -808,9 +784,9 @@ class AudioSettings(CenteredWidget): QtCore.QMetaObject.connectSlotsByName(self) def retranslateUi(self): - self.setWindowTitle(QtGui.QApplication.translate("audioSettingsForm", "Audio settings", None, QtGui.QApplication.UnicodeUTF8)) - self.in_label.setText(QtGui.QApplication.translate("audioSettingsForm", "Input device:", None, QtGui.QApplication.UnicodeUTF8)) - self.out_label.setText(QtGui.QApplication.translate("audioSettingsForm", "Output device:", None, QtGui.QApplication.UnicodeUTF8)) + self.setWindowTitle(QtWidgets.QApplication.translate("audioSettingsForm", "Audio settings")) + self.in_label.setText(QtWidgets.QApplication.translate("audioSettingsForm", "Input device:")) + self.out_label.setText(QtWidgets.QApplication.translate("audioSettingsForm", "Output device:")) def closeEvent(self, event): settings = Settings.get_instance() @@ -834,15 +810,15 @@ class PluginsSettings(CenteredWidget): self.resize(400, 210) self.setMinimumSize(QtCore.QSize(400, 210)) self.setMaximumSize(QtCore.QSize(400, 210)) - self.comboBox = QtGui.QComboBox(self) + self.comboBox = QtWidgets.QComboBox(self) self.comboBox.setGeometry(QtCore.QRect(30, 10, 340, 30)) - self.label = QtGui.QLabel(self) + self.label = QtWidgets.QLabel(self) self.label.setGeometry(QtCore.QRect(30, 40, 340, 90)) self.label.setWordWrap(True) - self.button = QtGui.QPushButton(self) + self.button = QtWidgets.QPushButton(self) self.button.setGeometry(QtCore.QRect(30, 130, 340, 30)) self.button.clicked.connect(self.button_click) - self.open = QtGui.QPushButton(self) + self.open = QtWidgets.QPushButton(self) self.open.setGeometry(QtCore.QRect(30, 170, 340, 30)) self.open.clicked.connect(self.open_plugin) self.pl_loader = plugin_support.PluginLoader.get_instance() @@ -851,8 +827,8 @@ class PluginsSettings(CenteredWidget): self.show_data() def retranslateUi(self): - self.setWindowTitle(QtGui.QApplication.translate('PluginsForm', "Plugins", None, QtGui.QApplication.UnicodeUTF8)) - self.open.setText(QtGui.QApplication.translate('PluginsForm', "Open selected plugin", None, QtGui.QApplication.UnicodeUTF8)) + self.setWindowTitle(QtWidgets.QApplication.translate('PluginsForm', "Plugins")) + self.open.setText(QtWidgets.QApplication.translate('PluginsForm', "Open selected plugin")) def open_plugin(self): ind = self.comboBox.currentIndex() @@ -862,11 +838,9 @@ class PluginsSettings(CenteredWidget): self.window = window self.window.show() else: - msgBox = QtGui.QMessageBox() - text = QtGui.QApplication.translate("PluginsForm", 'No GUI found for this plugin', None, - QtGui.QApplication.UnicodeUTF8) - msgBox.setWindowTitle(QtGui.QApplication.translate("PluginsForm", 'Error', None, - QtGui.QApplication.UnicodeUTF8)) + msgBox = QtWidgets.QMessageBox() + text = QtWidgets.QApplication.translate("PluginsForm", 'No GUI found for this plugin') + msgBox.setWindowTitle(QtWidgets.QApplication.translate("PluginsForm", 'Error')) msgBox.setText(text) msgBox.exec_() @@ -880,16 +854,16 @@ class PluginsSettings(CenteredWidget): ind = self.comboBox.currentIndex() if len(self.data): plugin = self.data[ind] - descr = plugin[2] or QtGui.QApplication.translate("PluginsForm", "No description available", None, QtGui.QApplication.UnicodeUTF8) + descr = plugin[2] or QtWidgets.QApplication.translate("PluginsForm", "No description available") self.label.setText(descr) if plugin[1]: - self.button.setText(QtGui.QApplication.translate("PluginsForm", "Disable plugin", None, QtGui.QApplication.UnicodeUTF8)) + self.button.setText(QtWidgets.QApplication.translate("PluginsForm", "Disable plugin")) else: - self.button.setText(QtGui.QApplication.translate("PluginsForm", "Enable plugin", None, QtGui.QApplication.UnicodeUTF8)) + self.button.setText(QtWidgets.QApplication.translate("PluginsForm", "Enable plugin")) else: self.open.setVisible(False) self.button.setVisible(False) - self.label.setText(QtGui.QApplication.translate("PluginsForm", "No plugins found", None, QtGui.QApplication.UnicodeUTF8)) + self.label.setText(QtWidgets.QApplication.translate("PluginsForm", "No plugins found")) def button_click(self): ind = self.comboBox.currentIndex() @@ -897,9 +871,9 @@ class PluginsSettings(CenteredWidget): self.pl_loader.toggle_plugin(plugin[-1]) plugin[1] = not plugin[1] if plugin[1]: - self.button.setText(QtGui.QApplication.translate("PluginsForm", "Disable plugin", None, QtGui.QApplication.UnicodeUTF8)) + self.button.setText(QtWidgets.QApplication.translate("PluginsForm", "Disable plugin")) else: - self.button.setText(QtGui.QApplication.translate("PluginsForm", "Enable plugin", None, QtGui.QApplication.UnicodeUTF8)) + self.button.setText(QtWidgets.QApplication.translate("PluginsForm", "Enable plugin")) class UpdateSettings(CenteredWidget): @@ -917,7 +891,7 @@ class UpdateSettings(CenteredWidget): self.resize(400, 150) self.setMinimumSize(QtCore.QSize(400, 120)) self.setMaximumSize(QtCore.QSize(400, 120)) - self.in_label = QtGui.QLabel(self) + self.in_label = QtWidgets.QLabel(self) self.in_label.setGeometry(QtCore.QRect(25, 5, 350, 20)) settings = Settings.get_instance() font = QtGui.QFont() @@ -925,9 +899,9 @@ class UpdateSettings(CenteredWidget): font.setBold(True) font.setFamily(settings['font']) self.in_label.setFont(font) - self.autoupdate = QtGui.QComboBox(self) + self.autoupdate = QtWidgets.QComboBox(self) self.autoupdate.setGeometry(QtCore.QRect(25, 30, 350, 30)) - self.button = QtGui.QPushButton(self) + self.button = QtWidgets.QPushButton(self) self.button.setGeometry(QtCore.QRect(25, 70, 350, 30)) self.button.setEnabled(settings['update']) self.button.clicked.connect(self.update_client) @@ -937,12 +911,12 @@ class UpdateSettings(CenteredWidget): QtCore.QMetaObject.connectSlotsByName(self) def retranslateUi(self): - self.setWindowTitle(QtGui.QApplication.translate("updateSettingsForm", "Update settings", None, QtGui.QApplication.UnicodeUTF8)) - self.in_label.setText(QtGui.QApplication.translate("updateSettingsForm", "Select update mode:", None, QtGui.QApplication.UnicodeUTF8)) - self.button.setText(QtGui.QApplication.translate("updateSettingsForm", "Update Toxygen", None, QtGui.QApplication.UnicodeUTF8)) - self.autoupdate.addItem(QtGui.QApplication.translate("updateSettingsForm", "Disabled", None, QtGui.QApplication.UnicodeUTF8)) - self.autoupdate.addItem(QtGui.QApplication.translate("updateSettingsForm", "Manual", None, QtGui.QApplication.UnicodeUTF8)) - self.autoupdate.addItem(QtGui.QApplication.translate("updateSettingsForm", "Auto", None, QtGui.QApplication.UnicodeUTF8)) + self.setWindowTitle(QtWidgets.QApplication.translate("updateSettingsForm", "Update settings")) + self.in_label.setText(QtWidgets.QApplication.translate("updateSettingsForm", "Select update mode:")) + self.button.setText(QtWidgets.QApplication.translate("updateSettingsForm", "Update Toxygen")) + self.autoupdate.addItem(QtWidgets.QApplication.translate("updateSettingsForm", "Disabled")) + self.autoupdate.addItem(QtWidgets.QApplication.translate("updateSettingsForm", "Manual")) + self.autoupdate.addItem(QtWidgets.QApplication.translate("updateSettingsForm", "Auto")) def closeEvent(self, event): settings = Settings.get_instance() @@ -951,34 +925,29 @@ class UpdateSettings(CenteredWidget): def update_client(self): if not updater.connection_available(): - msgBox = QtGui.QMessageBox() + msgBox = QtWidgets.QMessageBox() msgBox.setWindowTitle( - QtGui.QApplication.translate("updateSettingsForm", "Error", None, - QtGui.QApplication.UnicodeUTF8)) - text = (QtGui.QApplication.translate("updateSettingsForm", 'Problems with internet connection', None, - QtGui.QApplication.UnicodeUTF8)) + QtWidgets.QApplication.translate("updateSettingsForm", "Error")) + text = (QtWidgets.QApplication.translate("updateSettingsForm", 'Problems with internet connection')) msgBox.setText(text) msgBox.exec_() return if not updater.updater_available(): - msgBox = QtGui.QMessageBox() + msgBox = QtWidgets.QMessageBox() msgBox.setWindowTitle( - QtGui.QApplication.translate("updateSettingsForm", "Error", None, - QtGui.QApplication.UnicodeUTF8)) - text = (QtGui.QApplication.translate("updateSettingsForm", 'Updater not found', None, - QtGui.QApplication.UnicodeUTF8)) + QtWidgets.QApplication.translate("updateSettingsForm", "Error")) + text = (QtWidgets.QApplication.translate("updateSettingsForm", 'Updater not found')) msgBox.setText(text) msgBox.exec_() return version = updater.check_for_updates() if version is not None: updater.download(version) - QtGui.QApplication.closeAllWindows() + QtWidgets.QApplication.closeAllWindows() else: - msgBox = QtGui.QMessageBox() + msgBox = QtWidgets.QMessageBox() msgBox.setWindowTitle( - QtGui.QApplication.translate("updateSettingsForm", "No updates found", None, QtGui.QApplication.UnicodeUTF8)) - text = (QtGui.QApplication.translate("updateSettingsForm", 'Toxygen is up to date', None, - QtGui.QApplication.UnicodeUTF8)) + QtWidgets.QApplication.translate("updateSettingsForm", "No updates found")) + text = (QtWidgets.QApplication.translate("updateSettingsForm", 'Toxygen is up to date')) msgBox.setText(text) msgBox.exec_() diff --git a/toxygen/notifications.py b/toxygen/notifications.py index 20082f6..26a29ec 100644 --- a/toxygen/notifications.py +++ b/toxygen/notifications.py @@ -1,7 +1,4 @@ -try: - from PySide import QtCore, QtGui -except ImportError: - from PyQt4 import QtCore, QtGui +from PyQt5 import QtCore, QtWidgets from util import curr_directory import wave import pyaudio @@ -23,16 +20,16 @@ def tray_notification(title, text, tray, window): :param tray: ref to tray icon :param window: main window """ - if QtGui.QSystemTrayIcon.isSystemTrayAvailable(): + if QtWidgets.QSystemTrayIcon.isSystemTrayAvailable(): if len(text) > 30: text = text[:27] + '...' - tray.showMessage(title, text, QtGui.QSystemTrayIcon.NoIcon, 3000) - QtGui.QApplication.alert(window, 0) + tray.showMessage(title, text, QtWidgets.QSystemTrayIcon.NoIcon, 3000) + QtWidgets.QApplication.alert(window, 0) def message_clicked(): window.setWindowState(window.windowState() & ~QtCore.Qt.WindowMinimized | QtCore.Qt.WindowActive) window.activateWindow() - tray.connect(tray, QtCore.SIGNAL("messageClicked()"), message_clicked) + tray.messageClicked.connect(message_clicked) class AudioFile: diff --git a/toxygen/passwordscreen.py b/toxygen/passwordscreen.py index dcd9d05..ca721e5 100644 --- a/toxygen/passwordscreen.py +++ b/toxygen/passwordscreen.py @@ -1,8 +1,5 @@ from widgets import CenteredWidget, LineEdit -try: - from PySide import QtCore, QtGui -except ImportError: - from PyQt4 import QtCore, QtGui +from PyQt5 import QtCore, QtWidgets class PasswordArea(LineEdit): @@ -10,7 +7,7 @@ class PasswordArea(LineEdit): def __init__(self, parent): super(PasswordArea, self).__init__(parent) self.parent = parent - self.setEchoMode(QtGui.QLineEdit.EchoMode.Password) + self.setEchoMode(QtWidgets.QLineEdit.Password) def keyPressEvent(self, event): if event.key() == QtCore.Qt.Key_Return: @@ -31,18 +28,18 @@ class PasswordScreenBase(CenteredWidget): self.setMinimumSize(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.password = PasswordArea(self) 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.setText('OK') 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.setStyleSheet('QLabel { color: #F70D1A; }') self.warning.setVisible(False) @@ -61,9 +58,9 @@ class PasswordScreenBase(CenteredWidget): super(PasswordScreenBase, self).keyPressEvent(event) def retranslateUi(self): - self.setWindowTitle(QtGui.QApplication.translate("pass", "Enter password", None, QtGui.QApplication.UnicodeUTF8)) - self.enter_pass.setText(QtGui.QApplication.translate("pass", "Password:", None, QtGui.QApplication.UnicodeUTF8)) - self.warning.setText(QtGui.QApplication.translate("pass", "Incorrect password", None, QtGui.QApplication.UnicodeUTF8)) + self.setWindowTitle(QtWidgets.QApplication.translate("pass", "Enter password")) + self.enter_pass.setText(QtWidgets.QApplication.translate("pass", "Password:")) + self.warning.setText(QtWidgets.QApplication.translate("pass", "Incorrect password")) class PasswordScreen(PasswordScreenBase): @@ -116,37 +113,32 @@ class SetProfilePasswordScreen(CenteredWidget): self.setMaximumSize(QtCore.QSize(700, 200)) self.password = LineEdit(self) 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.setGeometry(QtCore.QRect(40, 50, 300, 30)) - self.confirm_password.setEchoMode(QtGui.QLineEdit.EchoMode.Password) - self.set_password = QtGui.QPushButton(self) + self.confirm_password.setEchoMode(QtWidgets.QLineEdit.Password) + self.set_password = QtWidgets.QPushButton(self) self.set_password.setGeometry(QtCore.QRect(40, 100, 300, 30)) 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.setVisible(False) 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.setStyleSheet('QLabel { color: #BC1C1C; }') def retranslateUi(self): - self.setWindowTitle(QtGui.QApplication.translate("PasswordScreen", "Profile password", None, - QtGui.QApplication.UnicodeUTF8)) + self.setWindowTitle(QtWidgets.QApplication.translate("PasswordScreen", "Profile password")) self.password.setPlaceholderText( - QtGui.QApplication.translate("PasswordScreen", "Password (at least 8 symbols)", None, - QtGui.QApplication.UnicodeUTF8)) + QtWidgets.QApplication.translate("PasswordScreen", "Password (at least 8 symbols)")) self.confirm_password.setPlaceholderText( - QtGui.QApplication.translate("PasswordScreen", "Confirm password", None, - QtGui.QApplication.UnicodeUTF8)) + QtWidgets.QApplication.translate("PasswordScreen", "Confirm password")) self.set_password.setText( - QtGui.QApplication.translate("PasswordScreen", "Set password", None, QtGui.QApplication.UnicodeUTF8)) - self.not_match.setText(QtGui.QApplication.translate("PasswordScreen", "Passwords do not match", None, - QtGui.QApplication.UnicodeUTF8)) + QtWidgets.QApplication.translate("PasswordScreen", "Set password")) + self.not_match.setText(QtWidgets.QApplication.translate("PasswordScreen", "Passwords do not match")) self.warning.setText( - QtGui.QApplication.translate("PasswordScreen", "There is no way to recover lost passwords", None, - QtGui.QApplication.UnicodeUTF8)) + QtWidgets.QApplication.translate("PasswordScreen", "There is no way to recover lost passwords")) def new_password(self): if self.password.text() == self.confirm_password.text(): @@ -155,10 +147,8 @@ class SetProfilePasswordScreen(CenteredWidget): self.close() else: self.not_match.setText( - QtGui.QApplication.translate("PasswordScreen", "Password must be at least 8 symbols", None, - QtGui.QApplication.UnicodeUTF8)) + QtWidgets.QApplication.translate("PasswordScreen", "Password must be at least 8 symbols")) self.not_match.setVisible(True) else: - self.not_match.setText(QtGui.QApplication.translate("PasswordScreen", "Passwords do not match", None, - QtGui.QApplication.UnicodeUTF8)) + self.not_match.setText(QtWidgets.QApplication.translate("PasswordScreen", "Passwords do not match")) self.not_match.setVisible(True) diff --git a/toxygen/plugins/plugin_super_class.py b/toxygen/plugins/plugin_super_class.py index 8192b78..c857c56 100644 --- a/toxygen/plugins/plugin_super_class.py +++ b/toxygen/plugins/plugin_super_class.py @@ -1,8 +1,5 @@ import os -try: - from PySide import QtCore, QtGui -except ImportError: - from PyQt4 import QtCore, QtGui +from PyQt5 import QtCore, QtWidgets MAX_SHORT_NAME_LENGTH = 5 @@ -137,10 +134,10 @@ class PluginSuperClass: :param command: string with command """ if command == 'help': - msgbox = QtGui.QMessageBox() - title = QtGui.QApplication.translate("PluginWindow", "List of commands for plugin {}", None, QtGui.QApplication.UnicodeUTF8) + msgbox = QtWidgets.QMessageBox() + title = QtWidgets.QApplication.translate("PluginWindow", "List of commands for plugin {}") 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_() # ----------------------------------------------------------------------------------------------------------------- @@ -151,7 +148,7 @@ class PluginSuperClass: """ This method loads translations for GUI """ - app = QtGui.QApplication.instance() + app = QtWidgets.QApplication.instance() langs = self._settings.supported_languages() curr_lang = self._settings['language'] if curr_lang in langs: diff --git a/toxygen/profile.py b/toxygen/profile.py index e89bf2b..dd123ed 100644 --- a/toxygen/profile.py +++ b/toxygen/profile.py @@ -1,8 +1,5 @@ from list_items import * -try: - from PySide import QtCore, QtGui -except ImportError: - from PyQt4 import QtCore, QtGui +from PyQt5 import QtGui, QtWidgets from friend import * from settings import * from toxcore_enums_and_consts import * @@ -97,8 +94,7 @@ class Profile(basecontact.BaseContact, Singleton): tmp = self.name super(Profile, self).set_name(value.encode('utf-8')) self._tox.self_set_name(self._name.encode('utf-8')) - 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, value) for friend in self._contacts: friend.append_message(InfoMessage(message, time.time())) @@ -246,7 +242,7 @@ class Profile(basecontact.BaseContact, Singleton): if message.get_status() in ACTIVE_FILE_TRANSFERS: # active file transfer try: 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() except: print('Incoming not started transfer - no info found') @@ -312,7 +308,7 @@ class Profile(basecontact.BaseContact, Singleton): friend.set_name(name) name = str(name, 'utf-8') 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) friend.append_message(InfoMessage(message, time.time())) friend.actions = True @@ -566,7 +562,7 @@ class Profile(basecontact.BaseContact, Singleton): if message.get_status() in ACTIVE_FILE_TRANSFERS: # active file transfer try: 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() except: print('Incoming not started transfer - no info found') @@ -663,17 +659,15 @@ class Profile(basecontact.BaseContact, Singleton): """ friend = self._contacts[num] name = friend.name - dialog = QtGui.QApplication.translate('MainWindow', - "Enter new alias for friend {} or leave empty to use friend's name:", - None, QtGui.QApplication.UnicodeUTF8) + dialog = QtWidgets.QApplication.translate('MainWindow', + "Enter new alias for friend {} or leave empty to use friend's name:") dialog = dialog.format(name) - title = QtGui.QApplication.translate('MainWindow', - 'Set alias', - None, QtGui.QApplication.UnicodeUTF8) + title = QtWidgets.QApplication.translate('MainWindow', + 'Set alias') text, ok = QtGui.QInputDialog.getText(None, title, dialog, - QtGui.QLineEdit.Normal, + QtWidgets.QLineEdit.Normal, name) if ok: settings = Settings.get_instance() @@ -798,9 +792,9 @@ class Profile(basecontact.BaseContact, Singleton): raise Exception('TOX DNS lookup failed') if len(tox_id) == TOX_PUBLIC_KEY_SIZE * 2: # public key self.add_friend(tox_id) - msgBox = QtGui.QMessageBox() - msgBox.setWindowTitle(QtGui.QApplication.translate("MainWindow", "Friend added", None, QtGui.QApplication.UnicodeUTF8)) - text = (QtGui.QApplication.translate("MainWindow", 'Friend added without sending friend request', None, QtGui.QApplication.UnicodeUTF8)) + msgBox = QtWidgets.QMessageBox() + msgBox.setWindowTitle(QtWidgets.QApplication.translate("MainWindow", "Friend added")) + text = (QtWidgets.QApplication.translate("MainWindow", 'Friend added without sending friend request')) msgBox.setText(text) msgBox.exec_() else: @@ -826,11 +820,11 @@ class Profile(basecontact.BaseContact, Singleton): :param message: message """ 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) - fr_req = QtGui.QApplication.translate('MainWindow', 'Friend request', None, QtGui.QApplication.UnicodeUTF8) - reply = QtGui.QMessageBox.question(None, fr_req, info, QtGui.QMessageBox.Yes, QtGui.QMessageBox.No) - if reply == QtGui.QMessageBox.Yes: # accepted + fr_req = QtWidgets.QApplication.translate('MainWindow', 'Friend request') + reply = QtWidgets.QMessageBox.question(None, fr_req, info, QtWidgets.QMessageBox.Yes, QtWidgets.QMessageBox.No) + if reply == QtWidgets.QMessageBox.Yes: # accepted self.add_friend(tox_id) data = self._tox.get_savedata() ProfileHelper.get_instance().save_profile(data) @@ -942,7 +936,7 @@ class Profile(basecontact.BaseContact, Singleton): if friend_number == self.get_active_number(): item = self.create_file_transfer_item(tm) 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() else: friend.actions = True @@ -1031,7 +1025,7 @@ class Profile(basecontact.BaseContact, Singleton): self._file_transfers[(friend_number, file_number)] = rt self._tox.file_control(friend_number, file_number, TOX_FILE_CONTROL['RESUME']) 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, TOX_FILE_TRANSFER_STATE['RUNNING']) @@ -1070,7 +1064,7 @@ class Profile(basecontact.BaseContact, Singleton): st.get_file_number()) item = self.create_file_transfer_item(tm) friend.append_message(tm) - st.set_state_changed_handler(item.update) + st.set_state_changed_handler(item.update_transfer_state) self._messages.scrollToBottom() def send_file(self, path, number=None, is_resend=False, file_id=None): @@ -1103,7 +1097,7 @@ class Profile(basecontact.BaseContact, Singleton): st.get_file_number()) if friend_number == self.get_active_number(): 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._contacts[friend_number].append_message(tm) @@ -1119,7 +1113,6 @@ class Profile(basecontact.BaseContact, Singleton): """ self._file_transfers[(friend_number, file_number)].send_chunk(position, size) - @QtCore.Slot(int, int) def transfer_finished(self, friend_number, file_number): transfer = self._file_transfers[(friend_number, file_number)] t = type(transfer) @@ -1136,7 +1129,7 @@ class Profile(basecontact.BaseContact, Singleton): if friend_number == self.get_active_number(): count = self._messages.count() if count + i + 1 >= 0: - elem = QtGui.QListWidgetItem() + elem = QtWidgets.QListWidgetItem() item = InlineImageItem(transfer.get_data(), self._messages.width(), elem) elem.setSizeHint(QtCore.QSize(self._messages.width(), item.height())) self._messages.insertItem(count + i + 1, elem) @@ -1206,11 +1199,9 @@ class Profile(basecontact.BaseContact, Singleton): self._call(num, audio, video) self._screen.active_call() if video: - text = QtGui.QApplication.translate("incoming_call", "Outgoing video call", None, - QtGui.QApplication.UnicodeUTF8) + text = QtWidgets.QApplication.translate("incoming_call", "Outgoing video call") else: - text = QtGui.QApplication.translate("incoming_call", "Outgoing audio call", None, - QtGui.QApplication.UnicodeUTF8) + text = QtWidgets.QApplication.translate("incoming_call", "Outgoing audio call") self.get_curr_friend().append_message(InfoMessage(text, time.time())) self.create_message_item(text, time.time(), '', MESSAGE_TYPE['INFO_MESSAGE']) self._messages.scrollToBottom() @@ -1225,11 +1216,9 @@ class Profile(basecontact.BaseContact, Singleton): return friend = self.get_friend_by_number(friend_number) if video: - text = QtGui.QApplication.translate("incoming_call", "Incoming video call", None, - QtGui.QApplication.UnicodeUTF8) + text = QtWidgets.QApplication.translate("incoming_call", "Incoming video call") else: - text = QtGui.QApplication.translate("incoming_call", "Incoming audio call", None, - QtGui.QApplication.UnicodeUTF8) + text = QtWidgets.QApplication.translate("incoming_call", "Incoming audio call") friend.append_message(InfoMessage(text, time.time())) self._incoming_calls.add(friend_number) if friend_number == self.get_active_number(): @@ -1258,9 +1247,9 @@ class Profile(basecontact.BaseContact, Singleton): """ if friend_number in self._incoming_calls: 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: - 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._call.finish_call(friend_number, by_friend) # finish or decline call if hasattr(self, '_call_widget'): diff --git a/toxygen/smileys.py b/toxygen/smileys.py index 6031ac4..52cb603 100644 --- a/toxygen/smileys.py +++ b/toxygen/smileys.py @@ -2,10 +2,7 @@ import util import json import os from collections import OrderedDict -try: - from PySide import QtCore -except ImportError: - from PyQt4 import QtCore +from PyQt5 import QtCore class SmileyLoader(util.Singleton): diff --git a/toxygen/styles/style.py b/toxygen/styles/style.py index 61352b0..6e05c3e 100644 --- a/toxygen/styles/style.py +++ b/toxygen/styles/style.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- try: - from PySide import QtCore + from PyQt5 import QtCore except ImportError: from PyQt4 import QtCore diff --git a/toxygen/tox_dns.py b/toxygen/tox_dns.py index ec8582f..76614a4 100644 --- a/toxygen/tox_dns.py +++ b/toxygen/tox_dns.py @@ -2,10 +2,7 @@ import json import urllib.request from util import log import settings -try: - from PySide import QtNetwork, QtCore -except: - from PyQt4 import QtNetwork, QtCore +from PyQt5 import QtNetwork, QtCore def tox_dns(email): diff --git a/toxygen/updater.py b/toxygen/updater.py index e7cd1c2..ba5d1c9 100644 --- a/toxygen/updater.py +++ b/toxygen/updater.py @@ -3,10 +3,7 @@ import os import settings import platform import urllib -try: - from PySide import QtNetwork, QtCore -except ImportError: - from PyQt4 import QtNetwork, QtCore +from PyQt5 import QtNetwork, QtCore import subprocess diff --git a/toxygen/widgets.py b/toxygen/widgets.py index f83e02c..3894782 100644 --- a/toxygen/widgets.py +++ b/toxygen/widgets.py @@ -1,10 +1,7 @@ -try: - from PySide import QtCore, QtGui -except ImportError: - from PyQt4 import QtCore, QtGui +from PyQt5 import QtCore, QtGui, QtWidgets -class DataLabel(QtGui.QLabel): +class DataLabel(QtWidgets.QLabel): """ Label with elided text """ @@ -15,14 +12,14 @@ class DataLabel(QtGui.QLabel): super().setText(text) -class ComboBox(QtGui.QComboBox): +class ComboBox(QtWidgets.QComboBox): def __init__(self, *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): super(CenteredWidget, self).__init__() @@ -30,12 +27,12 @@ class CenteredWidget(QtGui.QWidget): def center(self): qr = self.frameGeometry() - cp = QtGui.QDesktopWidget().availableGeometry().center() + cp = QtWidgets.QDesktopWidget().availableGeometry().center() qr.moveCenter(cp) self.move(qr.topLeft()) -class LineEdit(QtGui.QLineEdit): +class LineEdit(QtWidgets.QLineEdit): def __init__(self, parent=None): super(LineEdit, self).__init__(parent) @@ -46,25 +43,27 @@ class LineEdit(QtGui.QLineEdit): del menu -class QRightClickButton(QtGui.QPushButton): +class QRightClickButton(QtWidgets.QPushButton): """ Button with right click support """ + rightClicked = QtCore.pyqtSignal() + def __init__(self, parent): super(QRightClickButton, self).__init__(parent) def mousePressEvent(self, event): if event.button() == QtCore.Qt.RightButton: - self.emit(QtCore.SIGNAL("rightClicked()")) + self.rightClicked.emit() else: super(QRightClickButton, self).mousePressEvent(event) -class RubberBand(QtGui.QRubberBand): +class RubberBand(QtWidgets.QRubberBand): 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.pen = QtGui.QPen(QtCore.Qt.blue, 4) self.pen.setStyle(QtCore.Qt.SolidLine) @@ -86,29 +85,21 @@ def create_menu(menu): text = action.text() if 'Link Location' in text: text = text.replace('Copy &Link Location', - QtGui.QApplication.translate("MainWindow", "Copy link location", None, - QtGui.QApplication.UnicodeUTF8)) + QtWidgets.QApplication.translate("MainWindow", "Copy link location")) elif '&Copy' in text: - text = text.replace('&Copy', QtGui.QApplication.translate("MainWindow", "Copy", None, - QtGui.QApplication.UnicodeUTF8)) + text = text.replace('&Copy', QtWidgets.QApplication.translate("MainWindow", "Copy")) elif 'All' in text: - text = text.replace('Select All', QtGui.QApplication.translate("MainWindow", "Select all", None, - QtGui.QApplication.UnicodeUTF8)) + text = text.replace('Select All', QtWidgets.QApplication.translate("MainWindow", "Select all")) elif 'Delete' in text: - text = text.replace('Delete', QtGui.QApplication.translate("MainWindow", "Delete", None, - QtGui.QApplication.UnicodeUTF8)) + text = text.replace('Delete', QtWidgets.QApplication.translate("MainWindow", "Delete")) elif '&Paste' in text: - text = text.replace('&Paste', QtGui.QApplication.translate("MainWindow", "Paste", None, - QtGui.QApplication.UnicodeUTF8)) + text = text.replace('&Paste', QtWidgets.QApplication.translate("MainWindow", "Paste")) elif 'Cu&t' in text: - text = text.replace('Cu&t', QtGui.QApplication.translate("MainWindow", "Cut", None, - QtGui.QApplication.UnicodeUTF8)) + text = text.replace('Cu&t', QtWidgets.QApplication.translate("MainWindow", "Cut")) elif '&Undo' in text: - text = text.replace('&Undo', QtGui.QApplication.translate("MainWindow", "Undo", None, - QtGui.QApplication.UnicodeUTF8)) + text = text.replace('&Undo', QtWidgets.QApplication.translate("MainWindow", "Undo")) elif '&Redo' in text: - text = text.replace('&Redo', QtGui.QApplication.translate("MainWindow", "Redo", None, - QtGui.QApplication.UnicodeUTF8)) + text = text.replace('&Redo', QtWidgets.QApplication.translate("MainWindow", "Redo")) else: menu.removeAction(action) continue @@ -124,12 +115,12 @@ class MultilineEdit(CenteredWidget): self.setMinimumSize(QtCore.QSize(350, 200)) self.setMaximumSize(QtCore.QSize(350, 200)) self.setWindowTitle(title) - self.edit = QtGui.QTextEdit(self) + self.edit = QtWidgets.QTextEdit(self) self.edit.setGeometry(QtCore.QRect(0, 0, 350, 150)) 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.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.center() self.save = save From a2273e8c2765439a0d1943553474fc6ded8c030c Mon Sep 17 00:00:00 2001 From: ingvar1995 Date: Tue, 13 Jun 2017 00:26:21 +0300 Subject: [PATCH 05/21] video sending and playing, temporary hardcoded size --- toxygen/callbacks.py | 28 +++++++++++++++++++++++----- toxygen/calls.py | 17 ++++++++++------- 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/toxygen/callbacks.py b/toxygen/callbacks.py index 01a14d4..f3cd71a 100644 --- a/toxygen/callbacks.py +++ b/toxygen/callbacks.py @@ -12,7 +12,6 @@ import util import cv2 import numpy as np - # ----------------------------------------------------------------------------------------------------------------- # Threads # ----------------------------------------------------------------------------------------------------------------- @@ -325,10 +324,29 @@ def callback_audio(toxav, friend_number, samples, audio_samples_per_channel, aud def video_receive_frame(toxav, friend_number, width, height, y, u, v, ystride, ustride, vstride, user_data): - pass - #frame = cv2.merge((np.asarray(y), np.asarray(u), np.asarray(v))) - #frame = cv2.cvtColor(frame, cv2.COLOR_YUV2BGR_I420) - #cv2.imshow("frame", frame) + try: + Y = abs(max(width, abs(ystride))) + U = abs(max(width//2, abs(ustride))) + V = abs(max(width//2, abs(vstride))) + y = np.asarray(y[:Y * height], dtype=np.uint8).reshape(height, Y) + u = np.asarray(u[:U * height // 2], dtype=np.uint8).reshape(height // 2, U) + v = np.asarray(v[:V * height // 2], dtype=np.uint8).reshape(height // 2, V) + frame = np.zeros((int(height * 1.5), width), dtype=np.uint8) + + frame[:height,:] = y[:,:width] + #tmp, tmp2 = u[::2,:width], frame[height:height * 5 // 4, :width // 2] + #print(tmp.shape, tmp2.shape + frame[height:height * 5 // 4, :width // 2] = u[:140:2,:width // 2] + frame[height:height * 5 // 4, width // 2:] = u[1:140:2,:width // 2] + + frame[height * 5 // 4 + 1:, :width // 2] = v[:140:2,:width // 2] + frame[height * 5 // 4 + 1:, width // 2:] = v[1:140: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 diff --git a/toxygen/calls.py b/toxygen/calls.py index f2600c9..a771470 100644 --- a/toxygen/calls.py +++ b/toxygen/calls.py @@ -218,14 +218,17 @@ class AV: def convert_bgr_to_yuv(frame): frame = cv2.cvtColor(frame, cv2.COLOR_BGR2YUV_I420) + y = frame[:480,:].tolist() y = list(itertools.chain.from_iterable(y)) - v = np.zeros((240, 320), dtype=np.int) - v[::2,:] = frame[480:600, :320] - v[1::2,:] = frame[480:600, 320:] - v = list(itertools.chain.from_iterable(v)) + u = np.zeros((240, 320), dtype=np.int) - u[::2,:] = frame[600:, :320] - u[1::2,:] = frame[600:, 320:] + u[::2,:] = frame[480:600, :320] + u[1::2,:] = frame[480:600, 320:] u = list(itertools.chain.from_iterable(u)) - return bytes(y), bytes(v), bytes(u) + + v = np.zeros((240, 320), dtype=np.int) + v[::2,:] = frame[600:, :320] + v[1::2,:] = frame[600:, 320:] + v = list(itertools.chain.from_iterable(v)) + return bytes(y), bytes(u), bytes(v) From c60808a7dace52ba998ad6274a9d254ac0f81bdf Mon Sep 17 00:00:00 2001 From: ingvar1995 Date: Tue, 13 Jun 2017 00:36:45 +0300 Subject: [PATCH 06/21] cleanup and few todo's --- setup.py | 10 ++++------ toxygen/callbacks.py | 30 ++++++++++++++---------------- toxygen/calls.py | 26 ++++++++++++++------------ 3 files changed, 32 insertions(+), 34 deletions(-) diff --git a/setup.py b/setup.py index 4794969..b738a61 100644 --- a/setup.py +++ b/setup.py @@ -11,19 +11,17 @@ version = program_version + '.0' MODULES = ['numpy'] if system() in ('Windows', 'Darwin'): - MODULES.extend['PyAudio', 'PyQt5'] - + MODULES.extend(['PyAudio', 'PyQt5']) else: try: import pyaudio except ImportError: - MODULES.append('PyAudio') + MODULES.append('PyAudio') # TODO: ? +DEP_LINKS = [] if system() == 'Windows': - DEPS_LINKS = [] # TODO: add opencv.whl -else: - DEPS_LINKS = [] + DEP_LINKS = [] # TODO: add opencv.whl class InstallScript(install): diff --git a/toxygen/callbacks.py b/toxygen/callbacks.py index f3cd71a..a2ee895 100644 --- a/toxygen/callbacks.py +++ b/toxygen/callbacks.py @@ -325,23 +325,21 @@ def callback_audio(toxav, friend_number, samples, audio_samples_per_channel, aud def video_receive_frame(toxav, friend_number, width, height, y, u, v, ystride, ustride, vstride, user_data): try: - Y = abs(max(width, abs(ystride))) - U = abs(max(width//2, abs(ustride))) - V = abs(max(width//2, abs(vstride))) - y = np.asarray(y[:Y * height], dtype=np.uint8).reshape(height, Y) - u = np.asarray(u[:U * height // 2], dtype=np.uint8).reshape(height // 2, U) - v = np.asarray(v[:V * height // 2], dtype=np.uint8).reshape(height // 2, V) + 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) frame = np.zeros((int(height * 1.5), width), dtype=np.uint8) - - frame[:height,:] = y[:,:width] - #tmp, tmp2 = u[::2,:width], frame[height:height * 5 // 4, :width // 2] - #print(tmp.shape, tmp2.shape - frame[height:height * 5 // 4, :width // 2] = u[:140:2,:width // 2] - frame[height:height * 5 // 4, width // 2:] = u[1:140:2,:width // 2] - - frame[height * 5 // 4 + 1:, :width // 2] = v[:140:2,:width // 2] - frame[height * 5 // 4 + 1:, width // 2:] = v[1:140:2,:width // 2] - + + frame[:height, :] = y[:, :width] + frame[height:height * 5 // 4, :width // 2] = u[:140:2, :width // 2] # TODO: remove hardcoded values + frame[height:height * 5 // 4, width // 2:] = u[1:140:2, :width // 2] + + frame[height * 5 // 4 + 1:, :width // 2] = v[:140:2, :width // 2] + frame[height * 5 // 4 + 1:, width // 2:] = v[1:140:2, :width // 2] + frame = cv2.cvtColor(frame, cv2.COLOR_YUV2BGR_I420) invoke_in_main_thread(cv2.imshow, str(friend_number), frame) diff --git a/toxygen/calls.py b/toxygen/calls.py index a771470..5c6ead4 100644 --- a/toxygen/calls.py +++ b/toxygen/calls.py @@ -7,6 +7,7 @@ import cv2 import itertools import numpy as np # TODO: play sound until outgoing call will be started or cancelled and add timeout +# TODO: rewrite logic class Call: @@ -205,30 +206,31 @@ class AV: height, width, channels = frame.shape for friend_num in self._calls: if self._calls[friend_num].video: - try: # TODO: bgr => yuv + try: y, u, v = convert_bgr_to_yuv(frame) self._toxav.video_send_frame(friend_num, width, height, y, u, v) except Exception as e: - print('1', e) + print(e) except Exception as e: - print('2', e) + print(e) time.sleep(0.01) -def convert_bgr_to_yuv(frame): +def convert_bgr_to_yuv(frame): # TODO: remove hardcoded values and add docs frame = cv2.cvtColor(frame, cv2.COLOR_BGR2YUV_I420) - - y = frame[:480,:].tolist() + + y = frame[:480, :].tolist() y = list(itertools.chain.from_iterable(y)) - + u = np.zeros((240, 320), dtype=np.int) - u[::2,:] = frame[480:600, :320] - u[1::2,:] = frame[480:600, 320:] + u[::2, :] = frame[480:600, :320] + u[1::2, :] = frame[480:600, 320:] u = list(itertools.chain.from_iterable(u)) - + v = np.zeros((240, 320), dtype=np.int) - v[::2,:] = frame[600:, :320] - v[1::2,:] = frame[600:, 320:] + v[::2, :] = frame[600:, :320] + v[1::2, :] = frame[600:, 320:] v = list(itertools.chain.from_iterable(v)) + return bytes(y), bytes(u), bytes(v) From 464fba23c53f0c0fbad5fe819b4eb8a5170e54ee Mon Sep 17 00:00:00 2001 From: ingvar1995 Date: Tue, 13 Jun 2017 21:14:05 +0300 Subject: [PATCH 07/21] incoming video yuv => bgr fix --- toxygen/callbacks.py | 44 ++++++++++++++++++++++++++++++++++++-------- toxygen/calls.py | 32 +++++++++++++++++++++++++++++++- 2 files changed, 67 insertions(+), 9 deletions(-) diff --git a/toxygen/callbacks.py b/toxygen/callbacks.py index a2ee895..f97e980 100644 --- a/toxygen/callbacks.py +++ b/toxygen/callbacks.py @@ -324,21 +324,50 @@ def callback_audio(toxav, friend_number, samples, audio_samples_per_channel, aud 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))) + 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[:, :width] - frame[height:height * 5 // 4, :width // 2] = u[:140:2, :width // 2] # TODO: remove hardcoded values - frame[height:height * 5 // 4, width // 2:] = u[1:140:2, :width // 2] + 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 + 1:, :width // 2] = v[:140:2, :width // 2] - frame[height * 5 // 4 + 1:, width // 2:] = v[1:140: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) @@ -382,4 +411,3 @@ def init_callbacks(tox, window, tray): tox.callback_friend_lossless_packet(lossless_packet, 0) tox.callback_friend_lossy_packet(lossy_packet, 0) - diff --git a/toxygen/calls.py b/toxygen/calls.py index 5c6ead4..cf8b0e1 100644 --- a/toxygen/calls.py +++ b/toxygen/calls.py @@ -217,7 +217,37 @@ class AV: time.sleep(0.01) -def convert_bgr_to_yuv(frame): # TODO: remove hardcoded values and add docs +def convert_bgr_to_yuv(frame): # TODO: remove hardcoded values + """ + :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[:480, :].tolist() From 6d705deb557e9e75bbae2e46513c27fa74424b4e Mon Sep 17 00:00:00 2001 From: ingvar1995 Date: Tue, 13 Jun 2017 21:40:54 +0300 Subject: [PATCH 08/21] calls.py rewriting --- toxygen/calls.py | 172 +++++++++++++++++++++++++++++------------------ 1 file changed, 107 insertions(+), 65 deletions(-) diff --git a/toxygen/calls.py b/toxygen/calls.py index cf8b0e1..cde8133 100644 --- a/toxygen/calls.py +++ b/toxygen/calls.py @@ -7,15 +7,47 @@ import cv2 import itertools import numpy as np # TODO: play sound until outgoing call will be started or cancelled and add timeout -# TODO: rewrite logic class Call: - def __init__(self, audio=False, video=False): - self.audio = audio - self.video = video - # TODO: add widget for call + 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 + + 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) + + 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: @@ -41,6 +73,9 @@ class AV: self._video_thread = None self._video_running = False + self._video_width = 640 + self._video_height = 480 + def stop(self): self._running = False self.stop_audio_thread() @@ -57,15 +92,15 @@ class AV: """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) - self.start_audio_thread() - self.start_video_thread() 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) - self.start_audio_thread() + if audio_enabled: + self.start_audio_thread() + if video_enabled: + self.start_video_thread() def finish_call(self, friend_number, by_friend=False): @@ -73,20 +108,25 @@ class AV: 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): + 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 toxav_call_state_cb(self, friend_number, state): """ New call state """ - pass # TODO: ignore? - # if self._running: - # - # if state & TOXAV_FRIEND_CALL_STATE['ACCEPTING_A']: - # self._calls[friend_number].audio = True - # if state & TOXAV_FRIEND_CALL_STATE['ACCEPTING_V']: - # self._calls[friend_number].video = True + call = self._calls[friend_number] + + 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 @@ -136,10 +176,13 @@ class AV: self._video_running = True + self._video_width = 640 # TODO: use settings + self._video_height = 480 + self._video = cv2.VideoCapture(0) self._video.set(cv2.CAP_PROP_FPS, 25) - self._video.set(cv2.CAP_PROP_FRAME_WIDTH, 640) - self._video.set(cv2.CAP_PROP_FRAME_HEIGHT, 480) + 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() @@ -170,9 +213,6 @@ class AV: output=True) self._out_stream.write(samples) - def video_chunk(self): - pass - # ----------------------------------------------------------------------------------------------------------------- # AV sending # ----------------------------------------------------------------------------------------------------------------- @@ -187,7 +227,7 @@ class AV: pcm = self._audio_stream.read(self._audio_sample_count) if pcm: for friend_num in self._calls: - if self._calls[friend_num].audio: + if self._calls[friend_num].out_audio: try: self._toxav.audio_send_frame(friend_num, pcm, self._audio_sample_count, self._audio_channels, self._audio_rate) @@ -199,15 +239,18 @@ class AV: time.sleep(0.01) def send_video(self): + """ + This method sends video to friends + """ 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].video: + if self._calls[friend_num].out_video: try: - y, u, v = convert_bgr_to_yuv(frame) + 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) @@ -216,51 +259,50 @@ class AV: time.sleep(0.01) + def convert_bgr_to_yuv(self, frame): + """ + :param frame: input bgr frame + :return y, u, v: y, u, v values of frame -def convert_bgr_to_yuv(frame): # TODO: remove hardcoded values - """ - :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 - 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 - ------------------------- - | | - | Y | height - | | - ------------------------- - | | | - | U even | U odd | height // 4 - | | | - ------------------------- - | | | - | V even | V odd | height // 4 - | | | - ------------------------- + width // 2 width // 2 - 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, 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, :].tolist() + y = list(itertools.chain.from_iterable(y)) - y = frame[:480, :].tolist() - y = list(itertools.chain.from_iterable(y)) + u = np.zeros((self._video_width // 2, self._video_height // 2), dtype=np.int) + u[::2, :] = frame[self._video_height:self._video_height * 5 // 4, :self._video_height // 2] + u[1::2, :] = frame[self._video_height:self._video_height * 5 // 4, self._video_height // 2:] + u = list(itertools.chain.from_iterable(u)) - u = np.zeros((240, 320), dtype=np.int) - u[::2, :] = frame[480:600, :320] - u[1::2, :] = frame[480:600, 320:] - u = list(itertools.chain.from_iterable(u)) + v = np.zeros((self._video_width // 2, self._video_height // 2), dtype=np.int) + v[::2, :] = frame[self._video_height * 5 // 4:, :self._video_height // 2] + v[1::2, :] = frame[self._video_height * 5 // 4:, self._video_height // 2:] + v = list(itertools.chain.from_iterable(v)) - v = np.zeros((240, 320), dtype=np.int) - v[::2, :] = frame[600:, :320] - v[1::2, :] = frame[600:, 320:] - v = list(itertools.chain.from_iterable(v)) - - return bytes(y), bytes(u), bytes(v) + return bytes(y), bytes(u), bytes(v) From d1e90c6aefb021b1851f7bc7231974a7ff30103f Mon Sep 17 00:00:00 2001 From: ingvar1995 Date: Tue, 13 Jun 2017 21:50:00 +0300 Subject: [PATCH 09/21] fixed bug with video sending --- toxygen/calls.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/toxygen/calls.py b/toxygen/calls.py index cde8133..f7fa9cc 100644 --- a/toxygen/calls.py +++ b/toxygen/calls.py @@ -292,17 +292,17 @@ class AV: """ frame = cv2.cvtColor(frame, cv2.COLOR_BGR2YUV_I420) - y = frame[:self._video_height, :].tolist() + y = frame[:self._video_height, :] y = list(itertools.chain.from_iterable(y)) - u = np.zeros((self._video_width // 2, self._video_height // 2), dtype=np.int) - u[::2, :] = frame[self._video_height:self._video_height * 5 // 4, :self._video_height // 2] - u[1::2, :] = frame[self._video_height:self._video_height * 5 // 4, self._video_height // 2:] + 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_width // 2, self._video_height // 2), dtype=np.int) - v[::2, :] = frame[self._video_height * 5 // 4:, :self._video_height // 2] - v[1::2, :] = frame[self._video_height * 5 // 4:, self._video_height // 2:] + 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) From 769119c79515d3be386f469724629fd02d31d277 Mon Sep 17 00:00:00 2001 From: ingvar1995 Date: Tue, 13 Jun 2017 22:32:32 +0300 Subject: [PATCH 10/21] video settings (untested) --- toxygen/menu.py | 46 +++++++++++++++++++++++++++++++++++++++++++++ toxygen/settings.py | 1 + 2 files changed, 47 insertions(+) diff --git a/toxygen/menu.py b/toxygen/menu.py index c3958e9..3e9696f 100644 --- a/toxygen/menu.py +++ b/toxygen/menu.py @@ -795,6 +795,52 @@ class AudioSettings(CenteredWidget): settings.save() +class VideoSettings(CenteredWidget): + """ + Audio calls settings form + """ + + def __init__(self): + super().__init__() + self.initUI() + self.retranslateUi() + self.center() + + def initUI(self): + self.setObjectName("videoSettingsForm") + self.resize(400, 100) + self.setMinimumSize(QtCore.QSize(400, 100)) + self.setMaximumSize(QtCore.QSize(400, 100)) + self.in_label = QtWidgets.QLabel(self) + self.in_label.setGeometry(QtCore.QRect(25, 5, 350, 20)) + settings = Settings.get_instance() + font = QtGui.QFont() + font.setPointSize(16) + font.setBold(True) + font.setFamily(settings['font']) + self.in_label.setFont(font) + self.input = QtWidgets.QComboBox(self) + self.input.setGeometry(QtCore.QRect(25, 30, 350, 30)) + import cv2 + self.devices = [] + for i in range(15): + v = cv2.VideoCapture(i) + if v.isOpened(): + del v + self.devices.append(i) + self.input.addItem('Device #' + str(i)) + self.input.setCurrentIndex(self.in_indexes.index(settings.video['device'])) + + def retranslateUi(self): + self.setWindowTitle(QtWidgets.QApplication.translate("videoSettingsForm", "Video settings")) + self.in_label.setText(QtWidgets.QApplication.translate("videoSettingsForm", "Device:")) + + def closeEvent(self, event): + settings = Settings.get_instance() + settings.video['device'] = self.devices[self.input.currentIndex()] + settings.save() + + class PluginsSettings(CenteredWidget): """ Plugins settings form diff --git a/toxygen/settings.py b/toxygen/settings.py index 9604250..c007d3a 100644 --- a/toxygen/settings.py +++ b/toxygen/settings.py @@ -47,6 +47,7 @@ class Settings(dict, Singleton): 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, 'enabled': input_devices and output_devices} + self.video = {'device': 0} @staticmethod def get_auto_profile(): From ec6c04a7df8858c32b96de5fd3668f07dcb25760 Mon Sep 17 00:00:00 2001 From: ingvar1995 Date: Tue, 13 Jun 2017 22:37:01 +0300 Subject: [PATCH 11/21] video settings to main menu --- toxygen/mainscreen.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/toxygen/mainscreen.py b/toxygen/mainscreen.py index 9847d01..1c1e113 100644 --- a/toxygen/mainscreen.py +++ b/toxygen/mainscreen.py @@ -63,6 +63,7 @@ class MainWindow(QtWidgets.QMainWindow, Singleton): self.actionSettings = QtWidgets.QAction(Form) self.actionSettings.setObjectName("actionSettings") self.audioSettings = QtWidgets.QAction(Form) + self.videoSettings = QtWidgets.QAction(Form) self.pluginData = QtWidgets.QAction(Form) self.importPlugin = QtWidgets.QAction(Form) self.reloadPlugins = QtWidgets.QAction(Form) @@ -75,6 +76,7 @@ class MainWindow(QtWidgets.QMainWindow, Singleton): self.menuSettings.addAction(self.actionNotifications) self.menuSettings.addAction(self.actionNetwork) self.menuSettings.addAction(self.audioSettings) + self.menuSettings.addAction(self.videoSettings) self.menuSettings.addAction(self.updateSettings) self.menuPlugins.addAction(self.pluginData) self.menuPlugins.addAction(self.importPlugin) @@ -94,6 +96,7 @@ class MainWindow(QtWidgets.QMainWindow, Singleton): self.actionInterface_settings.triggered.connect(self.interface_settings) self.actionNotifications.triggered.connect(self.notification_settings) self.audioSettings.triggered.connect(self.audio_settings) + self.videoSettings.triggered.connect(self.video_settings) self.updateSettings.triggered.connect(self.update_settings) self.pluginData.triggered.connect(self.plugins_menu) self.lockApp.triggered.connect(self.lock_app) @@ -459,6 +462,10 @@ class MainWindow(QtWidgets.QMainWindow, Singleton): self.audio_s = AudioSettings() self.audio_s.show() + def video_settings(self): + self.video_s = VideoSettings() + self.video_s.show() + def update_settings(self): self.update_s = UpdateSettings() self.update_s.show() From 8bc4613407189748989c15cca5d8f3a970caf3ab Mon Sep 17 00:00:00 2001 From: ingvar1995 Date: Tue, 13 Jun 2017 22:42:05 +0300 Subject: [PATCH 12/21] device selection in settings --- toxygen/calls.py | 2 +- toxygen/mainscreen.py | 1 + toxygen/menu.py | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/toxygen/calls.py b/toxygen/calls.py index f7fa9cc..5898862 100644 --- a/toxygen/calls.py +++ b/toxygen/calls.py @@ -179,7 +179,7 @@ class AV: self._video_width = 640 # TODO: use settings self._video_height = 480 - self._video = cv2.VideoCapture(0) + self._video = cv2.VideoCapture(settings.Settings.get_instance().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) diff --git a/toxygen/mainscreen.py b/toxygen/mainscreen.py index 1c1e113..84d266c 100644 --- a/toxygen/mainscreen.py +++ b/toxygen/mainscreen.py @@ -131,6 +131,7 @@ class MainWindow(QtWidgets.QMainWindow, Singleton): self.actionAbout_program.setText(QtWidgets.QApplication.translate("MainWindow", "About program")) self.actionSettings.setText(QtWidgets.QApplication.translate("MainWindow", "Settings")) self.audioSettings.setText(QtWidgets.QApplication.translate("MainWindow", "Audio")) + self.videoSettings.setText(QtWidgets.QApplication.translate("MainWindow", "Video")) self.updateSettings.setText(QtWidgets.QApplication.translate("MainWindow", "Updates")) self.contact_name.setPlaceholderText(QtWidgets.QApplication.translate("MainWindow", "Search")) self.sendMessageButton.setToolTip(QtWidgets.QApplication.translate("MainWindow", "Send message")) diff --git a/toxygen/menu.py b/toxygen/menu.py index 3e9696f..77fd1ea 100644 --- a/toxygen/menu.py +++ b/toxygen/menu.py @@ -823,13 +823,13 @@ class VideoSettings(CenteredWidget): self.input.setGeometry(QtCore.QRect(25, 30, 350, 30)) import cv2 self.devices = [] - for i in range(15): + for i in range(10): v = cv2.VideoCapture(i) if v.isOpened(): del v self.devices.append(i) self.input.addItem('Device #' + str(i)) - self.input.setCurrentIndex(self.in_indexes.index(settings.video['device'])) + self.input.setCurrentIndex(self.devices.index(settings.video['device'])) def retranslateUi(self): self.setWindowTitle(QtWidgets.QApplication.translate("videoSettingsForm", "Video settings")) From 0a378c168215b5b43ed9342c79f379689a1a0d9d Mon Sep 17 00:00:00 2001 From: ingvar1995 Date: Thu, 15 Jun 2017 00:25:16 +0300 Subject: [PATCH 13/21] ui fixes for video --- toxygen/avwidgets.py | 3 +-- toxygen/profile.py | 3 +++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/toxygen/avwidgets.py b/toxygen/avwidgets.py index ff276c4..84f2174 100644 --- a/toxygen/avwidgets.py +++ b/toxygen/avwidgets.py @@ -7,7 +7,6 @@ import wave import settings from util import curr_directory -# TODO: widget for video # TODO: improve IncomingCallWidget @@ -56,7 +55,7 @@ class IncomingCallWidget(widgets.CenteredWidget): self.call_type.setText(text) pr = profile.Profile.get_instance() self.accept_audio.clicked.connect(lambda: pr.accept_call(friend_number, True, False) or self.stop()) - self.accept_video.clicked.connect(lambda: pr.accept_call(friend_number, True, True)) + self.accept_video.clicked.connect(lambda: pr.accept_call(friend_number, True, True) or self.stop()) self.decline.clicked.connect(lambda: pr.stop_call(friend_number, False) or self.stop()) class SoundPlay(QtCore.QThread): diff --git a/toxygen/profile.py b/toxygen/profile.py index dd123ed..b479cb1 100644 --- a/toxygen/profile.py +++ b/toxygen/profile.py @@ -14,6 +14,8 @@ import avwidgets import plugin_support import basecontact import items_factory +import cv2 +import threading class Profile(basecontact.BaseContact, Singleton): @@ -1255,6 +1257,7 @@ class Profile(basecontact.BaseContact, Singleton): if hasattr(self, '_call_widget'): self._call_widget[friend_number].close() del self._call_widget[friend_number] + threading.Timer(3.0, lambda: cv2.destroyWindow(str(friend_number))).start() friend = self.get_friend_by_number(friend_number) friend.append_message(InfoMessage(text, time.time())) if friend_number == self.get_active_number(): From 9031a4a3e366b51e4086fc991c9739c3fbbca0a6 Mon Sep 17 00:00:00 2001 From: ingvar1995 Date: Thu, 15 Jun 2017 21:34:43 +0300 Subject: [PATCH 14/21] incoming call widget update --- setup.py | 6 +++--- toxygen/avwidgets.py | 35 +++++++++++++++++++++++++++++------ 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/setup.py b/setup.py index b738a61..82526c1 100644 --- a/setup.py +++ b/setup.py @@ -8,15 +8,15 @@ import sys version = program_version + '.0' -MODULES = ['numpy'] +MODULES = ['numpy', 'PyQt5'] if system() in ('Windows', 'Darwin'): - MODULES.extend(['PyAudio', 'PyQt5']) + MODULES.append('PyAudio') else: try: import pyaudio except ImportError: - MODULES.append('PyAudio') # TODO: ? + MODULES.append('PyAudio') DEP_LINKS = [] diff --git a/toxygen/avwidgets.py b/toxygen/avwidgets.py index 84f2174..9280f2a 100644 --- a/toxygen/avwidgets.py +++ b/toxygen/avwidgets.py @@ -7,8 +7,6 @@ import wave import settings from util import curr_directory -# TODO: improve IncomingCallWidget - class IncomingCallWidget(widgets.CenteredWidget): @@ -21,6 +19,7 @@ class IncomingCallWidget(widgets.CenteredWidget): self.avatar_label.setScaledContents(False) self.name = widgets.DataLabel(self) self.name.setGeometry(QtCore.QRect(90, 20, 300, 25)) + self._friend_number = friend_number font = QtGui.QFont() font.setFamily(settings.Settings.get_instance()['font']) font.setPointSize(16) @@ -53,10 +52,10 @@ class IncomingCallWidget(widgets.CenteredWidget): self.setWindowTitle(text) self.name.setText(name) self.call_type.setText(text) - pr = profile.Profile.get_instance() - self.accept_audio.clicked.connect(lambda: pr.accept_call(friend_number, True, False) or self.stop()) - self.accept_video.clicked.connect(lambda: pr.accept_call(friend_number, True, True) or self.stop()) - self.decline.clicked.connect(lambda: pr.stop_call(friend_number, False) or self.stop()) + self._processing = False + self.accept_audio.clicked.connect(self.accept_call_with_audio) + self.accept_video.clicked.connect(self.accept_call_with_video) + self.decline.clicked.connect(self.decline_call) class SoundPlay(QtCore.QThread): @@ -107,6 +106,30 @@ class IncomingCallWidget(widgets.CenteredWidget): self.thread.wait() 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): self.avatar_label.setPixmap(pixmap) From 361f1f0e29938ef61611506cfbd40c12f0b9bfe6 Mon Sep 17 00:00:00 2001 From: ingvar1995 Date: Fri, 16 Jun 2017 18:47:00 +0300 Subject: [PATCH 15/21] call timeout --- toxygen/calls.py | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/toxygen/calls.py b/toxygen/calls.py index 5898862..0ad8fac 100644 --- a/toxygen/calls.py +++ b/toxygen/calls.py @@ -6,7 +6,7 @@ from toxav_enums import * import cv2 import itertools import numpy as np -# TODO: play sound until outgoing call will be started or cancelled and add timeout +# TODO: play sound until outgoing call will be started or cancelled class Call: @@ -16,6 +16,19 @@ class Call: 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 @@ -33,6 +46,10 @@ class Call: out_audio = property(get_out_audio, set_out_audio) + # ----------------------------------------------------------------------------------------------------------------- + # Video + # ----------------------------------------------------------------------------------------------------------------- + def get_in_video(self): return self._in_video @@ -92,6 +109,7 @@ class AV: """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: @@ -103,7 +121,6 @@ class AV: 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: @@ -113,11 +130,18 @@ class AV: 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'] From 54a2da46706c70ab321c8a9507e9a1e58bbc5b30 Mon Sep 17 00:00:00 2001 From: ingvar1995 Date: Sun, 18 Jun 2017 00:30:08 +0300 Subject: [PATCH 16/21] video setting - selector --- toxygen/menu.py | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/toxygen/menu.py b/toxygen/menu.py index 77fd1ea..ea323d6 100644 --- a/toxygen/menu.py +++ b/toxygen/menu.py @@ -823,13 +823,25 @@ class VideoSettings(CenteredWidget): self.input.setGeometry(QtCore.QRect(25, 30, 350, 30)) import cv2 self.devices = [] + self.frame_max_sizes = [] for i in range(10): v = cv2.VideoCapture(i) if v.isOpened(): + v.set(cv2.CAP_PROP_FRAME_WIDTH, 10000) + v.set(cv2.CAP_PROP_FRAME_HEIGHT, 10000) + + width = int(v.get(cv2.CAP_PROP_FRAME_WIDTH)) + height = int(v.get(cv2.CAP_PROP_FRAME_HEIGHT)) del v self.devices.append(i) + self.frame_max_sizes.append((width, height)) self.input.addItem('Device #' + str(i)) - self.input.setCurrentIndex(self.devices.index(settings.video['device'])) + self.size = QtWidgets.QComboBox(self) + self.size.setGeometry(QtCore.QRect(60, 30, 350, 30)) + self.input.currentIndexChanged.connect(self.selectionChanged) + index = self.devices.index(settings.video['device']) + if index + 1: + self.input.setCurrentIndex(index) def retranslateUi(self): self.setWindowTitle(QtWidgets.QApplication.translate("videoSettingsForm", "Video settings")) @@ -840,6 +852,22 @@ class VideoSettings(CenteredWidget): settings.video['device'] = self.devices[self.input.currentIndex()] settings.save() + def selectionChanged(self): + width, height = self.frame_max_sizes[self.input.currentIndex()] + self.size.clear() + dims = [ + (320, 240), + (640, 360), + (640, 480), + (720, 480), + (1280, 720), + (1920, 1080), + (2560, 1440) + ] + for w, h in dims: + if w <= width and h <= height: + self.size.addItem(str(w) + ' * ' + str(h)) + class PluginsSettings(CenteredWidget): """ From df5a1a901a326d58fcf587c9f3b4da48eb9faabb Mon Sep 17 00:00:00 2001 From: ingvar1995 Date: Sun, 18 Jun 2017 00:50:42 +0300 Subject: [PATCH 17/21] video settings --- toxygen/calls.py | 8 ++++---- toxygen/menu.py | 19 +++++++++++-------- toxygen/settings.py | 2 +- 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/toxygen/calls.py b/toxygen/calls.py index 0ad8fac..a651a26 100644 --- a/toxygen/calls.py +++ b/toxygen/calls.py @@ -199,11 +199,11 @@ class AV: return self._video_running = True + s = settings.Settings.get_instance() + self._video_width = s.video['width'] + self._video_height = s.video['height'] - self._video_width = 640 # TODO: use settings - self._video_height = 480 - - self._video = cv2.VideoCapture(settings.Settings.get_instance().video['device']) + 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) diff --git a/toxygen/menu.py b/toxygen/menu.py index ea323d6..4bb5258 100644 --- a/toxygen/menu.py +++ b/toxygen/menu.py @@ -808,9 +808,9 @@ class VideoSettings(CenteredWidget): def initUI(self): self.setObjectName("videoSettingsForm") - self.resize(400, 100) - self.setMinimumSize(QtCore.QSize(400, 100)) - self.setMaximumSize(QtCore.QSize(400, 100)) + self.resize(400, 120) + self.setMinimumSize(QtCore.QSize(400, 120)) + self.setMaximumSize(QtCore.QSize(400, 120)) self.in_label = QtWidgets.QLabel(self) self.in_label.setGeometry(QtCore.QRect(25, 5, 350, 20)) settings = Settings.get_instance() @@ -819,8 +819,11 @@ class VideoSettings(CenteredWidget): font.setBold(True) font.setFamily(settings['font']) self.in_label.setFont(font) + self.video_size = QtWidgets.QComboBox(self) + self.video_size.setGeometry(QtCore.QRect(25, 70, 350, 30)) self.input = QtWidgets.QComboBox(self) self.input.setGeometry(QtCore.QRect(25, 30, 350, 30)) + self.input.currentIndexChanged.connect(self.selectionChanged) import cv2 self.devices = [] self.frame_max_sizes = [] @@ -836,9 +839,6 @@ class VideoSettings(CenteredWidget): self.devices.append(i) self.frame_max_sizes.append((width, height)) self.input.addItem('Device #' + str(i)) - self.size = QtWidgets.QComboBox(self) - self.size.setGeometry(QtCore.QRect(60, 30, 350, 30)) - self.input.currentIndexChanged.connect(self.selectionChanged) index = self.devices.index(settings.video['device']) if index + 1: self.input.setCurrentIndex(index) @@ -850,11 +850,14 @@ class VideoSettings(CenteredWidget): def closeEvent(self, event): settings = Settings.get_instance() settings.video['device'] = self.devices[self.input.currentIndex()] + text = self.video_size.currentText() + settings.video['width'] = int(text.split(' ')[0]) + settings.video['height'] = int(text.split(' ')[-1]) settings.save() def selectionChanged(self): width, height = self.frame_max_sizes[self.input.currentIndex()] - self.size.clear() + self.video_size.clear() dims = [ (320, 240), (640, 360), @@ -866,7 +869,7 @@ class VideoSettings(CenteredWidget): ] for w, h in dims: if w <= width and h <= height: - self.size.addItem(str(w) + ' * ' + str(h)) + self.video_size.addItem(str(w) + ' * ' + str(h)) class PluginsSettings(CenteredWidget): diff --git a/toxygen/settings.py b/toxygen/settings.py index c007d3a..9a1c439 100644 --- a/toxygen/settings.py +++ b/toxygen/settings.py @@ -47,7 +47,7 @@ class Settings(dict, Singleton): 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, 'enabled': input_devices and output_devices} - self.video = {'device': 0} + self.video = {'device': 0, 'width': 640, 'height': 480} @staticmethod def get_auto_profile(): From 49fc253c19b65ceab08775e20fc50fc9b139330f Mon Sep 17 00:00:00 2001 From: ingvar1995 Date: Sun, 18 Jun 2017 12:43:11 +0300 Subject: [PATCH 18/21] video call icons --- toxygen/images/{videocall.png => call_video.png} | Bin toxygen/images/finish_call_video.png | Bin 0 -> 3112 bytes toxygen/images/incoming_call_video.png | Bin 0 -> 3112 bytes toxygen/list_items.py | 10 ++++------ toxygen/mainscreen.py | 3 +-- toxygen/util.py | 2 +- 6 files changed, 6 insertions(+), 9 deletions(-) rename toxygen/images/{videocall.png => call_video.png} (100%) create mode 100755 toxygen/images/finish_call_video.png create mode 100755 toxygen/images/incoming_call_video.png diff --git a/toxygen/images/videocall.png b/toxygen/images/call_video.png similarity index 100% rename from toxygen/images/videocall.png rename to toxygen/images/call_video.png diff --git a/toxygen/images/finish_call_video.png b/toxygen/images/finish_call_video.png new file mode 100755 index 0000000000000000000000000000000000000000..846510638a42a6c5a02f2af943fb9c9debbd8d45 GIT binary patch literal 3112 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 literal 0 HcmV?d00001 diff --git a/toxygen/images/incoming_call_video.png b/toxygen/images/incoming_call_video.png new file mode 100755 index 0000000000000000000000000000000000000000..4fe4c98de12608600d4d98cf8d5978e32523d79c GIT binary patch literal 3112 zcmaKuS6CBjvxUD%@4bsV6af(kolS>?61qSzAS#3w6cJFiG{J<9AjL>G2r9j(putd- z4pM@E)KH`g2p%a0rTy&xIXCC#T&!6$&)lqeuO{h|tvLs)C@TPf!vbmIaOz(Fikb1W z1}2enUHokua0eMe_0bsSefk0fkjs%xnAx+CYW5m9_Hy_+ zp06?89bNNFN=A5A=|I5ET<0Zm_ecr?_M`OlE=smAeE^Wq5jJMfVw2yZd^X{PYaO0@ z6@rU}v;=4TZN-e^2S(wk@DgBT2Eh??WE?>uJ#g>y^jHL!6oI?!gOw40Bkt!$K!EEL z2?0o927vN;Cz=3XT~IZ6`JpLrRtEe&Rvp@4LJ=ripnZ_wbv2cKQGpBugag2%B|HSOKY3rU6~bwn9yjYb8-|5p^N;Qm@}9> zBc-;mToF~gI@i~oegFzH1WvErISQq4)=(&#sU%J}#r2PjCz2i>i^t1@m4QY8%m+se z9V@`gP&duBkKwM7MIwH(@5Vj$6t~UG4BUe=D#MJp0~ARW1?a_|xFzCJ`;yv{*pkGyD=X2%DCp(B@Z0drtd5YA9DoFToRL1{<*XWRWGcbAo zo_u4@k$7XWenokaHbTu(4PEE3^TfxHX)z~g|7ox-%c@*y_D?k)53ksq7SC zy-tmw06lS7H}$7I;##{Aq8O8j$)1nRAP?!i7&Uuj#+7oT>*}KPqJNiv*9#d&83`FH zn{}J5JO>+c$%PVKYhCN^f&PK#17o=w`T8p3s;l{{`Q!O>_3l?fuPBhpNbkKZYL~8* zxNMP{ZpU5Gb}4ptx^k_~teRMTeyp*&v6QEjY)i1MEEvPKzy3-3L@KWrdA&TrNUb6H zlOi!#4rOq=2#&t`EJZkVsesIbe~eTfl|I$*Gy0Il4bB-(6#yS;XPu0 zU4GkU8THkc=GKj^gz0Df>d!6|xTxLz+}?xuYQH>W$o4E#*>A2Y$_`x)AwXqX>D2EPpMJXF~%awQ)bh3=B6K(%~@;}Dh@@0Z4=ePMn&Zn}5wTZW3C1FFFLx~fJtMcb; zw~_KT;g7#(G--rMcd8XDER$np%hQ{zIjm>$bqWOY?m_)k^>vz6VjgFt2f-^OYzQRm zI(Eh9USE}WTJLhDYk1}zW_ z+L6Jh4^$_Jlg+5lsP}=zK^@JoCaGd=KkLB%TD7fz&}KK?Fx?T86enq%{AE;pSRdt( zHg<8toU{9{568qGA&MND98Qm(b}dK+nuIN_(OBka=Qwnx?xjRj%`=Vsbx#~C4!a4@ z+s-q~cg#C*^>A&l>o*u0Tb~U-G^hT>^;BKYCCqXM_36gcTJ#73yFHjf%p^ueDgB;y zr#>e|ta?)BZgK_uXy6W>A2vNnUe#^VrCi;9AG}>lUFJi-N9VoLar0jfUe`M&jM#NI zK5fjaAz$?)Z-qC%i}0bXi4|y3W_FvyehQw9jTUI@&ou9Z2hcicdvk&_QFmmID1D8S zA+lT5O?FLgyGEPFlZcswQA5|`>4_iH4{o-E6z&X7o6{KMVg`>h_R_cz3~9M(eeoRe z8wGzGXlpMR-Z@%3EJX}@4ayV<9X~(rs}T}}MeUDnj8lekhKjPcvk4#l?-w7fw`_>K zqIR`)o%`@9R88gj?&X8c){yBC@gFbdxa^khLm$YU`2K#g=lHqwfFMF3oY2$d>>PTk zDN;}WO{gc*!3Kcv^8nyt0Qh}!>T3Y}qYS{hI{-R400;#RhRV8s zh8OtH{XBzq4XqLtZ+xZ~G+z0rayBAzYD~-U;^h;aFZJCzDc*AEt}0GXmfqzz{k3iG z_*kO1(aO=SqqnehWh4|sfIu;7YEaCG7Zl?s2*p%}Lyd)v+LUpz7{JmFc;g|`>~u(B z#&l(NC>{clgc{M)C*uB_*$2mvFH~fCT~JjsL%k zl}M^sx*=fTjUP_ye9&^M;j3TBAh#SJdM>2vJHd@UCBn15+nuTYIx*tud^OrNlPWCZ ooyG9KB>o%9q Date: Sun, 18 Jun 2017 13:05:26 +0300 Subject: [PATCH 19/21] icons fixes --- toxygen/mainscreen.py | 8 +++++--- toxygen/profile.py | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/toxygen/mainscreen.py b/toxygen/mainscreen.py index 669ec65..834ae32 100644 --- a/toxygen/mainscreen.py +++ b/toxygen/mainscreen.py @@ -567,13 +567,15 @@ class MainWindow(QtWidgets.QMainWindow, Singleton): def call_finished(self): self.update_call_state('call') - def update_call_state(self, fl): + def update_call_state(self, state): 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) self.callButton.setIcon(icon) self.callButton.setIconSize(QtCore.QSize(50, 50)) - pixmap = QtGui.QPixmap(curr_directory() + '/images/{}_video.png') + + pixmap = QtGui.QPixmap(curr_directory() + '/images/{}_video.png'.format(state)) icon = QtGui.QIcon(pixmap) self.videocallButton.setIcon(icon) self.videocallButton.setIconSize(QtCore.QSize(35, 35)) diff --git a/toxygen/profile.py b/toxygen/profile.py index b479cb1..32d9abd 100644 --- a/toxygen/profile.py +++ b/toxygen/profile.py @@ -1257,7 +1257,7 @@ class Profile(basecontact.BaseContact, Singleton): if hasattr(self, '_call_widget'): self._call_widget[friend_number].close() del self._call_widget[friend_number] - threading.Timer(3.0, lambda: cv2.destroyWindow(str(friend_number))).start() + threading.Timer(2.0, lambda: cv2.destroyWindow(str(friend_number))).start() friend = self.get_friend_by_number(friend_number) friend.append_message(InfoMessage(text, time.time())) if friend_number == self.get_active_number(): From 6cbacef95b671cb662848ba1bbb44778d77e3427 Mon Sep 17 00:00:00 2001 From: ingvar1995 Date: Sun, 18 Jun 2017 17:48:32 +0300 Subject: [PATCH 20/21] travis.yml fix --- .travis.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 700b449..4c5c585 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,9 +7,11 @@ before_install: - sudo apt-get install -y checkinstall build-essential - sudo apt-get install portaudio19-dev - sudo apt-get install libconfig-dev libvpx-dev check -qq - - sudo apt-get install -y python3-pyqt5 install: + - pip install sip + - pip install pyqt5 - pip install pyaudio + - pip install opencv-python before_script: # OPUS - wget http://downloads.xiph.org/releases/opus/opus-1.0.3.tar.gz From 4d4fd21fe973cae278c16e10ae269edd20585a0f Mon Sep 17 00:00:00 2001 From: ingvar1995 Date: Tue, 20 Jun 2017 19:41:08 +0300 Subject: [PATCH 21/21] removed audio/video messages functionality. tox dns fixed --- toxygen/avwidgets.py | 26 -------------------------- toxygen/images/audio_message.png | Bin 4295 -> 0 bytes toxygen/images/video_message.png | Bin 3671 -> 0 bytes toxygen/mainscreen_widgets.py | 25 ++++++------------------- toxygen/tox_dns.py | 3 ++- 5 files changed, 8 insertions(+), 46 deletions(-) delete mode 100755 toxygen/images/audio_message.png delete mode 100755 toxygen/images/video_message.png diff --git a/toxygen/avwidgets.py b/toxygen/avwidgets.py index 9280f2a..8c81387 100644 --- a/toxygen/avwidgets.py +++ b/toxygen/avwidgets.py @@ -132,29 +132,3 @@ class IncomingCallWidget(widgets.CenteredWidget): def set_pixmap(self, pixmap): self.avatar_label.setPixmap(pixmap) - - -class AudioMessageRecorder(widgets.CenteredWidget): - - def __init__(self, friend_number, name): - super(AudioMessageRecorder, self).__init__() - self.label = QtWidgets.QLabel(self) - self.label.setGeometry(QtCore.QRect(10, 20, 250, 20)) - text = QtWidgets.QApplication.translate("MenuWindow", "Send audio message to friend {}") - self.label.setText(text.format(name)) - self.record = QtWidgets.QPushButton(self) - self.record.setGeometry(QtCore.QRect(20, 100, 150, 150)) - - self.record.setText(QtWidgets.QApplication.translate("MenuWindow", "Start recording")) - 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(QtWidgets.QApplication.translate("MenuWindow", "Stop recording")) - else: - self.close() - - diff --git a/toxygen/images/audio_message.png b/toxygen/images/audio_message.png deleted file mode 100755 index 22ba2a053911650a480dce7444960f1902cfa7b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4295 zcmV;&5IFCNP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000H@NklT(=#TlLDY0;FiI`^8i@=1Kxrt_f@Wq0LHGSbQszIr2xi-DMIKSbu`#krL&+ead z=kE(++r9TW=XcNNp7T5B+;e`9cI^g|pe_gQ2UY#$=-DD+DLkd7E@KRAtxKJGf z-Uqtl1`~G;sj~cmSqA(FY@7xRre~u+2ao2fhUs#hB(I;2UYysuf6dwE|t@ zw3Fz_d;oMNl>UqZ@`AvqN}&d>S0KS^0XC$V-;0u`0x6>g;GLA45l8ZDR3N2#TcBj| zAbg}irs`%H@MWcYtUIl70w&6(yVl)pk6_T}9h%FaAkQN&XLTqSJAZFIq7Bye& zKx%-+76DnDwJ*yWNFA`iA|MOICLM>U6o>**DG&vsQXmRMr9c#jN`a^phyqcCD2c^l z^_Ufh<7M(1!YqQ$lbYq8COpSyW0t5Mv>nJ@z&4+Ae*)J7CvyVh3Sbv-wa@v_;s%m- zlQlbM&199>tUg4Yx=Mkl6o>**DG&vsQXmRMr9c#jYGwkd(_*ydLPo~Q2nByOw%4KQ^9Mvd6& zr`?zUY1RW76J!0fkg2h+P60bD0J2+b_p{ThgP!ZHcIv$W=gK{K?PME*Z-mnD8Y=_* z$5>LGk)(j^CpZA*DyGIYIRbQK2&6-7m{b9HCgA!$Y2tDNWEj{UaK3@k*d}d2PX;i0 zB=2H9fmuK1r;qbE4%roQevPM=xYCrR*$qA}dAgp5WnIX_){{pdheE1#112O>u?B%x zJOz}LT*+(Db9^1aVWPH^U_9U?fs6s0LauoX6JODL!>vj5U_7?9mT6X7fagP;e|w&% zPC7l#vYfV18uVo=up}YJIUs3o^&D>`JfdAkg!{1?$O!Oe$Tfap_6C5Zm>7(sG1xLH zX)P@Sx)InD(o`J*UQ4DQQ$Q21F#SH5;!Vpd$kPM z3|tpt*9L)EN-E}1<7vizZ;{#(CF4?BMAwFZ$4@`(pxkjKADoDE*SPlFZX}CXwzG0^uvx_xK zFNZR<0L-`U#PxL+6TpYS%arc8O-)&^I_Z@rWk<$#3`kFEZI&=>0D?3-k75ED|B`av z#iRFq7L$3LBVDC9;%95Va*#z9=GkRAbo`PBeJc4=Gek!K4&xxaM!vz0N1AMNW zdXOd;KJ1j~l81mhfEzIj4{9T%@gHyo_!;wV=5ydDIcBZ$@I8h{f%oL^TFiXda%uZ7 z3;5jYGBe-^oLnexYkSWCzsl1-9s%Tdo?zq=$c&c)Q6MS>qCiv%M1iOjhyqb55Cx)A zASwl-KvWgUw)Y{IVBT>At*x2BEPM-FZ&Z-`n-g-Ki`mNUDv(mG#B7B-9dez6iOU|O zc3^!7xN6J-yxV|(6iE3RQVm=gLs|u*EtH!e+5&L(A?nms3Phzq6o@Lny{sYNE8yRh p@|z`Nka1fIAol$ss_E(f0RZ5cK`mVAFQ)(i002ovPDHLkV1jJ^?a}}M diff --git a/toxygen/images/video_message.png b/toxygen/images/video_message.png deleted file mode 100755 index 37603ce69a04fa268c3a540ae5ef9b2e7c658f85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3671 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 diff --git a/toxygen/mainscreen_widgets.py b/toxygen/mainscreen_widgets.py index 74ae20f..ed0d94e 100644 --- a/toxygen/mainscreen_widgets.py +++ b/toxygen/mainscreen_widgets.py @@ -207,8 +207,8 @@ class DropdownMenu(QtWidgets.QWidget): super(DropdownMenu, self).__init__(parent) self.installEventFilter(self) self.setWindowFlags(QtCore.Qt.FramelessWindowHint) - self.setMaximumSize(180, 120) - self.setMinimumSize(180, 120) + self.setMaximumSize(120, 120) + self.setMinimumSize(120, 120) self.screenshotButton = QRightClickButton(self) self.screenshotButton.setGeometry(QtCore.QRect(0, 60, 60, 60)) self.screenshotButton.setObjectName("screenshotButton") @@ -217,15 +217,9 @@ class DropdownMenu(QtWidgets.QWidget): self.fileTransferButton.setGeometry(QtCore.QRect(60, 60, 60, 60)) self.fileTransferButton.setObjectName("fileTransferButton") - self.audioMessageButton = QtWidgets.QPushButton(self) - self.audioMessageButton.setGeometry(QtCore.QRect(120, 60, 60, 60)) - self.smileyButton = QtWidgets.QPushButton(self) self.smileyButton.setGeometry(QtCore.QRect(0, 0, 60, 60)) - self.videoMessageButton = QtWidgets.QPushButton(self) - self.videoMessageButton.setGeometry(QtCore.QRect(120, 0, 60, 60)) - self.stickerButton = QtWidgets.QPushButton(self) self.stickerButton.setGeometry(QtCore.QRect(60, 0, 60, 60)) @@ -233,22 +227,17 @@ class DropdownMenu(QtWidgets.QWidget): icon = QtGui.QIcon(pixmap) self.fileTransferButton.setIcon(icon) self.fileTransferButton.setIconSize(QtCore.QSize(50, 50)) + pixmap = QtGui.QPixmap(util.curr_directory() + '/images/screenshot.png') icon = QtGui.QIcon(pixmap) self.screenshotButton.setIcon(icon) 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') icon = QtGui.QIcon(pixmap) self.smileyButton.setIcon(icon) 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') icon = QtGui.QIcon(pixmap) self.stickerButton.setIcon(icon) @@ -256,8 +245,6 @@ class DropdownMenu(QtWidgets.QWidget): self.screenshotButton.setToolTip(QtWidgets.QApplication.translate("MenuWindow", "Send screenshot")) self.fileTransferButton.setToolTip(QtWidgets.QApplication.translate("MenuWindow", "Send file")) - self.audioMessageButton.setToolTip(QtWidgets.QApplication.translate("MenuWindow", "Send audio message")) - self.videoMessageButton.setToolTip(QtWidgets.QApplication.translate("MenuWindow", "Send video message")) self.smileyButton.setToolTip(QtWidgets.QApplication.translate("MenuWindow", "Add smiley")) self.stickerButton.setToolTip(QtWidgets.QApplication.translate("MenuWindow", "Send sticker")) @@ -270,7 +257,7 @@ class DropdownMenu(QtWidgets.QWidget): def leaveEvent(self, event): self.close() - def eventFilter(self, object, event): + def eventFilter(self, obj, event): if event.type() == QtCore.QEvent.WindowDeactivate: self.close() return False diff --git a/toxygen/tox_dns.py b/toxygen/tox_dns.py index 76614a4..26b9619 100644 --- a/toxygen/tox_dns.py +++ b/toxygen/tox_dns.py @@ -30,7 +30,8 @@ def tox_dns(email): netman.setProxy(proxy) for url in urls: try: - request = QtNetwork.QNetworkRequest(url) + request = QtNetwork.QNetworkRequest() + request.setUrl(QtCore.QUrl(url)) request.setHeader(QtNetwork.QNetworkRequest.ContentTypeHeader, "application/json") reply = netman.post(request, bytes(json.dumps(data), 'utf-8'))