diff --git a/.travis.yml b/.travis.yml index e79850e..76d89d2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,7 @@ language: python python: - - "3.4" + - "3.5" + - "3.6" notifications: email: false before_install: @@ -9,9 +10,10 @@ before_install: - sudo apt-get install portaudio19-dev - sudo apt-get install libconfig-dev libvpx-dev check -qq 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 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 diff --git a/setup.py b/setup.py index 86141f5..82526c1 100644 --- a/setup.py +++ b/setup.py @@ -8,15 +8,20 @@ import sys version = program_version + '.0' -MODULES = [] +MODULES = ['numpy', 'PyQt5'] if system() in ('Windows', 'Darwin'): - MODULES = ['PyAudio', 'PySide'] + MODULES.append('PyAudio') else: try: import pyaudio except ImportError: - MODULES = ['PyAudio'] + MODULES.append('PyAudio') + +DEP_LINKS = [] + +if system() == 'Windows': + DEP_LINKS = [] # TODO: add opencv.whl class InstallScript(install): @@ -55,10 +60,12 @@ 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', - '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 480fa28..8c81387 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 @@ -17,11 +14,12 @@ 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) 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) @@ -30,11 +28,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) @@ -54,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.start_call(friend_number, True, True)) - 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): @@ -108,33 +106,29 @@ 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) - - -class AudioMessageRecorder(widgets.CenteredWidget): - - def __init__(self, friend_number, name): - super(AudioMessageRecorder, self).__init__() - self.label = QtGui.QLabel(self) - self.label.setGeometry(QtCore.QRect(10, 20, 250, 20)) - text = QtGui.QApplication.translate("MenuWindow", "Send audio message to friend {}", None, QtGui.QApplication.UnicodeUTF8) - self.label.setText(text.format(name)) - self.record = QtGui.QPushButton(self) - self.record.setGeometry(QtCore.QRect(20, 100, 150, 150)) - - self.record.setText(QtGui.QApplication.translate("MenuWindow", "Start recording", None, - QtGui.QApplication.UnicodeUTF8)) - self.record.clicked.connect(self.start_or_stop_recording) - self.recording = False - self.friend_num = friend_number - - def start_or_stop_recording(self): - if not self.recording: - self.recording = True - self.record.setText(QtGui.QApplication.translate("MenuWindow", "Stop recording", None, - QtGui.QApplication.UnicodeUTF8)) - else: - self.close() - - 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 f8ddb17..f97e980 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,7 +9,8 @@ from plugin_support import PluginLoader import queue import threading import util - +import cv2 +import numpy as np # ----------------------------------------------------------------------------------------------------------------- # Threads @@ -225,7 +223,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']) @@ -315,11 +313,67 @@ 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) +# ----------------------------------------------------------------------------------------------------------------- +# Callbacks - video +# ----------------------------------------------------------------------------------------------------------------- + + +def video_receive_frame(toxav, friend_number, width, height, y, u, v, ystride, ustride, vstride, user_data): + """ + Creates yuv frame from y, u, v and shows it using OpenCV + For yuv => bgr we need this YUV420 frame: + + width + ------------------------- + | | + | Y | height + | | + ------------------------- + | | | + | U even | U odd | height // 4 + | | | + ------------------------- + | | | + | V even | V odd | height // 4 + | | | + ------------------------- + + width // 2 width // 2 + + It can be created from initial y, u, v using slices + For more info see callback_video_receive_frame docs + """ + try: + y_size = abs(max(width, abs(ystride))) + u_size = abs(max(width // 2, abs(ustride))) + v_size = abs(max(width // 2, abs(vstride))) + + y = np.asarray(y[:y_size * height], dtype=np.uint8).reshape(height, y_size) + u = np.asarray(u[:u_size * height // 2], dtype=np.uint8).reshape(height // 2, u_size) + v = np.asarray(v[:v_size * height // 2], dtype=np.uint8).reshape(height // 2, v_size) + + width -= width % 4 + height -= height % 4 + + frame = np.zeros((int(height * 1.5), width), dtype=np.uint8) + + frame[:height, :] = y[:height, :width] + frame[height:height * 5 // 4, :width // 2] = u[:height // 2:2, :width // 2] + frame[height:height * 5 // 4, width // 2:] = u[1:height // 2:2, :width // 2] + + frame[height * 5 // 4:, :width // 2] = v[:height // 2:2, :width // 2] + frame[height * 5 // 4:, width // 2:] = v[1:height // 2:2, :width // 2] + + frame = cv2.cvtColor(frame, cv2.COLOR_YUV2BGR_I420) + + invoke_in_main_thread(cv2.imshow, str(friend_number), frame) + except Exception as ex: + print(ex) # ----------------------------------------------------------------------------------------------------------------- # Callbacks - initialization @@ -353,7 +407,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) + 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 2b700d7..6d6bbef 100644 --- a/toxygen/calls.py +++ b/toxygen/calls.py @@ -3,14 +3,68 @@ import time 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 +import cv2 +import itertools +import numpy as np +# TODO: play sound until outgoing call will be started or cancelled -CALL_TYPE = { - 'NONE': 0, - 'AUDIO': 1, - 'VIDEO': 2 -} + +class 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 + self._is_active = False + + def get_is_active(self): + return self._is_active + + def set_is_active(self, value): + self._is_active = value + + is_active = property(get_is_active, set_is_active) + + # ----------------------------------------------------------------------------------------------------------------- + # Audio + # ----------------------------------------------------------------------------------------------------------------- + + def get_in_audio(self): + return self._in_audio + + def set_in_audio(self, value): + self._in_audio = value + + in_audio = property(get_in_audio, set_in_audio) + + def get_out_audio(self): + return self._out_audio + + def set_out_audio(self, value): + self._out_audio = value + + out_audio = property(get_out_audio, set_out_audio) + + # ----------------------------------------------------------------------------------------------------------------- + # Video + # ----------------------------------------------------------------------------------------------------------------- + + def get_in_video(self): + return self._in_video + + def set_in_video(self, value): + self._in_video = value + + in_video = property(get_in_video, set_in_video) + + def get_out_video(self): + return self._out_video + + def set_out_video(self, value): + self._in_video = value + + out_video = property(get_out_video, set_out_video) class AV: @@ -19,7 +73,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 @@ -32,27 +86,75 @@ class AV: self._audio_duration = 60 self._audio_sample_count = self._audio_rate * self._audio_channels * self._audio_duration // 1000 - def __contains__(self, friend_number): - return friend_number in self._calls + self._video = None + self._video_thread = None + self._video_running = False - 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.start_audio_thread() - - def finish_call(self, friend_number, by_friend=False): - - if not by_friend: - self._toxav.call_control(friend_number, TOXAV_CALL_CONTROL['CANCEL']) - if friend_number in self._calls: - del self._calls[friend_number] - if not len(self._calls): - self.stop_audio_thread() + self._video_width = 640 + self._video_height = 480 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 + + # ----------------------------------------------------------------------------------------------------------------- + # Calls + # ----------------------------------------------------------------------------------------------------------------- + + def __call__(self, friend_number, audio, video): + """Call friend with specified number""" + self._toxav.call(friend_number, 32 if audio else 0, 5000 if video else 0) + self._calls[friend_number] = Call(audio, video) + threading.Timer(30.0, lambda: self.finish_not_started_call(friend_number)).start() + + def accept_call(self, friend_number, audio_enabled, video_enabled): + if self._running: + self._calls[friend_number] = Call(audio_enabled, video_enabled) + self._toxav.answer(friend_number, 32 if audio_enabled else 0, 5000 if video_enabled else 0) + if audio_enabled: + self.start_audio_thread() + if video_enabled: + self.start_video_thread() + + def finish_call(self, friend_number, by_friend=False): + if not by_friend: + self._toxav.call_control(friend_number, TOXAV_CALL_CONTROL['CANCEL']) + if friend_number in self._calls: + del self._calls[friend_number] + if not len(list(filter(lambda c: c.out_audio, self._calls))): + self.stop_audio_thread() + if not len(list(filter(lambda c: c.out_video, self._calls))): + self.stop_video_thread() + + def finish_not_started_call(self, friend_number): + if friend_number in self: + call = self._calls[friend_number] + if not call.is_active: + self.finish_call(friend_number) + + def toxav_call_state_cb(self, friend_number, state): + """ + New call state + """ + call = self._calls[friend_number] + call.is_active = True + + call.in_audio = state | TOXAV_FRIEND_CALL_STATE['SENDING_A'] + call.in_video = state | TOXAV_FRIEND_CALL_STATE['SENDING_V'] + + if state | TOXAV_FRIEND_CALL_STATE['ACCEPTING_A'] and call.out_audio: + self.start_audio_thread() + + if state | TOXAV_FRIEND_CALL_STATE['ACCEPTING_V'] and call.out_video: + self.start_video_thread() + + # ----------------------------------------------------------------------------------------------------------------- + # Threads + # ----------------------------------------------------------------------------------------------------------------- def start_audio_thread(self): """ @@ -92,7 +194,37 @@ class AV: self._out_stream.close() self._out_stream = None - def chunk(self, samples, channels_count, rate): + def start_video_thread(self): + if self._video_thread is not None: + return + + self._video_running = True + s = settings.Settings.get_instance() + self._video_width = s.video['width'] + self._video_height = s.video['height'] + + self._video = cv2.VideoCapture(s.video['device']) + self._video.set(cv2.CAP_PROP_FPS, 25) + self._video.set(cv2.CAP_PROP_FRAME_WIDTH, self._video_width) + self._video.set(cv2.CAP_PROP_FRAME_HEIGHT, self._video_height) + + self._video_thread = threading.Thread(target=self.send_video) + self._video_thread.start() + + def stop_video_thread(self): + if self._video_thread is None: + return + + self._video_running = False + self._video_thread.join() + self._video_thread = None + self._video = None + + # ----------------------------------------------------------------------------------------------------------------- + # Incoming chunks + # ----------------------------------------------------------------------------------------------------------------- + + def audio_chunk(self, samples, channels_count, rate): """ Incoming chunk """ @@ -105,6 +237,10 @@ class AV: output=True) self._out_stream.write(samples) + # ----------------------------------------------------------------------------------------------------------------- + # AV sending + # ----------------------------------------------------------------------------------------------------------------- + def send_audio(self): """ This method sends audio to friends @@ -114,10 +250,10 @@ class AV: try: pcm = self._audio_stream.read(self._audio_sample_count) if pcm: - for friend in self._calls: - if self._calls[friend] & 1: + for friend_num in self._calls: + if self._calls[friend_num].out_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 @@ -126,18 +262,70 @@ class AV: 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): + def send_video(self): """ - New call state + This method sends video to friends """ - if self._running: + while self._video_running: + try: + result, frame = self._video.read() + if result: + height, width, channels = frame.shape + for friend_num in self._calls: + if self._calls[friend_num].out_video: + try: + y, u, v = self.convert_bgr_to_yuv(frame) + self._toxav.video_send_frame(friend_num, width, height, y, u, v) + except Exception as e: + print(e) + except Exception as e: + print(e) - if state & TOXAV_FRIEND_CALL_STATE['ACCEPTING_A']: - self._calls[friend_number] |= 1 + 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 + + How this function works: + OpenCV creates YUV420 frame from BGR + This frame has following structure and size: + width, height - dim of input frame + width, height * 1.5 - dim of output frame + + width + ------------------------- + | | + | Y | height + | | + ------------------------- + | | | + | U even | U odd | height // 4 + | | | + ------------------------- + | | | + | V even | V odd | height // 4 + | | | + ------------------------- + + width // 2 width // 2 + + Y, U, V can be extracted using slices and joined in one list using itertools.chain.from_iterable() + Function returns bytes(y), bytes(u), bytes(v), because it is required for ctypes + """ + frame = cv2.cvtColor(frame, cv2.COLOR_BGR2YUV_I420) + + y = frame[:self._video_height, :] + y = list(itertools.chain.from_iterable(y)) + + u = np.zeros((self._video_height // 2, self._video_width // 2), dtype=np.int) + u[::2, :] = frame[self._video_height:self._video_height * 5 // 4, :self._video_width // 2] + u[1::2, :] = frame[self._video_height:self._video_height * 5 // 4, self._video_width // 2:] + u = list(itertools.chain.from_iterable(u)) + v = np.zeros((self._video_height // 2, self._video_width // 2), dtype=np.int) + v[::2, :] = frame[self._video_height * 5 // 4:, :self._video_width // 2] + v[1::2, :] = frame[self._video_height * 5 // 4:, self._video_width // 2:] + v = list(itertools.chain.from_iterable(v)) + + return bytes(y), bytes(u), bytes(v) 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/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/video_message.png b/toxygen/images/finish_call_video.png similarity index 73% rename from toxygen/images/video_message.png rename to toxygen/images/finish_call_video.png index 37603ce..8465106 100755 Binary files a/toxygen/images/video_message.png and b/toxygen/images/finish_call_video.png differ diff --git a/toxygen/images/audio_message.png b/toxygen/images/incoming_call_video.png similarity index 63% rename from toxygen/images/audio_message.png rename to toxygen/images/incoming_call_video.png index 22ba2a0..4fe4c98 100755 Binary files a/toxygen/images/audio_message.png and b/toxygen/images/incoming_call_video.png differ 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..8e58c59 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,18 +532,15 @@ 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), - curr_directory(), - QtGui.QFileDialog.ShowDirsOnly | QtGui.QFileDialog.DontUseNativeDialog) + directory = QtWidgets.QFileDialog.getExistingDirectory(self, + QtWidgets.QApplication.translate("MainWindow", + 'Choose folder'), + curr_directory(), + QtWidgets.QFileDialog.ShowDirsOnly | QtWidgets.QFileDialog.DontUseNativeDialog) if directory: fl = QtCore.QFile(directory + '/toxygen_inline_' + curr_time().replace(':', '_') + '.png') self._pixmap.save(fl, 'PNG') - return False - def mark_as_sent(self): return False diff --git a/toxygen/loginscreen.py b/toxygen/loginscreen.py index fbaa4e3..77aa5ba 100644 --- a/toxygen/loginscreen.py +++ b/toxygen/loginscreen.py @@ -1,7 +1,4 @@ -try: - from PySide import QtCore, QtGui -except ImportError: - from PyQt4 import QtCore, QtGui +from PyQt5 import QtWidgets, QtCore from widgets import * @@ -29,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_() @@ -69,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 0f6932e..b7838ef 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 @@ -91,7 +88,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 @@ -100,40 +96,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() + '/' @@ -142,11 +133,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() @@ -172,12 +161,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() @@ -196,21 +185,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: @@ -224,24 +213,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() @@ -264,7 +253,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(): @@ -272,12 +261,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() @@ -293,15 +282,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 @@ -329,7 +316,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..834ae32 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,38 @@ 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.videoSettings = 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) @@ -75,6 +76,7 @@ class MainWindow(QtGui.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(QtGui.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) @@ -113,37 +116,38 @@ 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.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")) + 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 +159,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 +182,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 +206,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 +234,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 +253,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 +272,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 +298,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 +307,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 +372,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 +404,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 +425,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_() @@ -460,6 +463,10 @@ class MainWindow(QtGui.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() @@ -471,22 +478,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 +498,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 +525,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]) @@ -564,14 +567,15 @@ class MainWindow(QtGui.QMainWindow, Singleton): def call_finished(self): self.update_call_state('call') - def update_call_state(self, fl): - # TODO: do smth with video call button + 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/videocall.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)) @@ -588,44 +592,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 +636,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 +650,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 +673,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..ed0d94e 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,86 +201,73 @@ 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) 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") - 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.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.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') 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) 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.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) 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 -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 +277,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 +285,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 +316,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 +365,7 @@ class WelcomeScreen(CenteredWidget): s.save() -class MainMenuButton(QtGui.QPushButton): +class MainMenuButton(QtWidgets.QPushButton): def __init__(self, *args): super().__init__(*args) @@ -402,16 +377,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 +406,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 +435,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 +491,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 8488578..cabd03f 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)) self.themeSelect.addItems(list(settings.built_in_themes().keys())) theme = settings['theme'] @@ -588,26 +572,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()) @@ -616,39 +600,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) @@ -656,29 +640,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 + '/' @@ -686,13 +668,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 + '/' @@ -701,21 +681,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() @@ -752,7 +730,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) @@ -760,11 +738,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_() @@ -785,9 +761,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() @@ -796,9 +772,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 = [], [] @@ -815,9 +791,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() @@ -826,6 +802,83 @@ 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, 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() + font = QtGui.QFont() + font.setPointSize(16) + 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 = [] + 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)) + 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")) + 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()] + 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.video_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.video_size.addItem(str(w) + ' * ' + str(h)) + + class PluginsSettings(CenteredWidget): """ Plugins settings form @@ -841,15 +894,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() @@ -858,8 +911,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() @@ -869,11 +922,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_() @@ -887,16 +938,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() @@ -904,9 +955,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): @@ -924,7 +975,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() @@ -932,9 +983,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) @@ -944,12 +995,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() @@ -958,34 +1009,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 eda76bf..c9502e5 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 * @@ -17,6 +14,8 @@ import avwidgets import plugin_support import basecontact import items_factory +import cv2 +import threading class Profile(basecontact.BaseContact, Singleton): @@ -39,6 +38,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 @@ -97,8 +97,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 +245,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 +311,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 +565,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 +662,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 +795,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 +823,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 +939,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 +1028,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 +1067,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 +1100,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 +1116,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 +1132,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 +1202,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 +1219,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(): @@ -1238,10 +1230,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): """ @@ -1251,8 +1242,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): """ @@ -1260,14 +1250,15 @@ 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'): - self._call_widget.close() - del self._call_widget + self._call_widget[friend_number].close() + del self._call_widget[friend_number] + threading.Timer(2.0, lambda: cv2.destroyWindow(str(friend_number))).start() friend = self.get_friend_by_number(friend_number) friend.append_message(InfoMessage(text, time.time())) if friend_number == self.get_active_number(): diff --git a/toxygen/settings.py b/toxygen/settings.py index 6edce36..0718b17 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, 'width': 640, 'height': 480} @staticmethod def get_auto_profile(): 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..26b9619 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): @@ -33,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')) 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/util.py b/toxygen/util.py index 07e78b3..df33998 100644 --- a/toxygen/util.py +++ b/toxygen/util.py @@ -4,7 +4,8 @@ import shutil import sys import re -program_version = '0.2.9' + +program_version = '0.3.0' def cached(func): diff --git a/toxygen/widgets.py b/toxygen/widgets.py index ff441ed..2cc97cf 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