diff --git a/toxygen/file_transfers/file_transfers.py b/toxygen/file_transfers/file_transfers.py index 445dac9..9b29575 100644 --- a/toxygen/file_transfers/file_transfers.py +++ b/toxygen/file_transfers/file_transfers.py @@ -4,6 +4,7 @@ from os import remove, rename, chdir from time import time from wrapper.tox import Tox from common.event import Event +from middleware.threads import invoke_in_main_thread FILE_TRANSFER_STATE = { @@ -120,10 +121,10 @@ class FileTransfer: t = -1 else: t = ((time() - self._creation_time) / percentage) * (1 - percentage) - self._state_changed_event(self.state, percentage, int(t)) + invoke_in_main_thread(self._state_changed_event, self.state, percentage, int(t)) def _finished(self): - self._finished_event(self._friend_number, self._file_number) + invoke_in_main_thread(self._finished_event, self._friend_number, self._file_number) # ----------------------------------------------------------------------------------------------------------------- # Send file diff --git a/toxygen/file_transfers/file_transfers_messages_service.py b/toxygen/file_transfers/file_transfers_messages_service.py index 7cb90f5..4509183 100644 --- a/toxygen/file_transfers/file_transfers_messages_service.py +++ b/toxygen/file_transfers/file_transfers_messages_service.py @@ -40,10 +40,11 @@ class FileTransfersMessagesService: return tm def add_inline_message(self, transfer, index): - if self._is_friend_active(transfer.friend_number): - count = self._messages.count() - if count + index + 1 >= 0: - self._create_inline_item(transfer.data, count + index + 1) + if not self._is_friend_active(transfer.friend_number): + return + count = self._messages.count() + if count + index + 1 >= 0: + self._create_inline_item(transfer.data, count + index + 1) def add_unsent_file_message(self, friend, file_path, data): author = MessageAuthor(self._profile.name, MESSAGE_AUTHOR['ME']) diff --git a/toxygen/middleware/threads.py b/toxygen/middleware/threads.py index 15e9665..5f9404b 100644 --- a/toxygen/middleware/threads.py +++ b/toxygen/middleware/threads.py @@ -106,7 +106,7 @@ class ToxAVIterateThread(BaseQThread): # File transfers thread # ----------------------------------------------------------------------------------------------------------------- -class FileTransfersThread(BaseThread): +class FileTransfersThread(BaseQThread): def __init__(self): super().__init__() diff --git a/toxygen/ui/main_screen.py b/toxygen/ui/main_screen.py index 96b2b9e..5a510a5 100644 --- a/toxygen/ui/main_screen.py +++ b/toxygen/ui/main_screen.py @@ -18,6 +18,7 @@ class MainWindow(QtWidgets.QMainWindow): self._plugins_loader = None self.setAcceptDrops(True) self._saved = False + self._smiley_window = None self._profile = self._toxes = self._messenger = None self._file_transfer_handler = self._history_loader = self._groups_service = self._calls_manager = None self._should_show_group_peers_list = False @@ -556,13 +557,15 @@ class MainWindow(QtWidgets.QMainWindow): def send_smiley(self): self.menu.hide() - if self._contacts_manager.get_curr_contact() is not None: - self.smiley = self._widget_factory.create_smiley_window(self) - self.smiley.setGeometry(QtCore.QRect(self.x() if self._settings['mirror_mode'] else 200 + self.x(), - self.y() + self.height() - 400, - self.smiley.width(), - self.smiley.height())) - self.smiley.show() + if self._contacts_manager.get_curr_contact() is None: + return + self._smiley_window = self._widget_factory.create_smiley_window(self) + rect = QtCore.QRect(self.menu.x(), + self.menu.y() - self.menu.height(), + self._smiley_window.width(), + self._smiley_window.height()) + self._smiley_window.setGeometry(rect) + self._smiley_window.show() def send_sticker(self): self.menu.hide() diff --git a/toxygen/ui/main_screen_widgets.py b/toxygen/ui/main_screen_widgets.py index a2d7526..122561b 100644 --- a/toxygen/ui/main_screen_widgets.py +++ b/toxygen/ui/main_screen_widgets.py @@ -141,57 +141,62 @@ class SmileyWindow(QtWidgets.QWidget): def __init__(self, parent, smiley_loader): super().__init__(parent) self.setWindowFlags(QtCore.Qt.FramelessWindowHint) - self.data = smiley_loader.get_smileys() - count = len(self.data) + self._parent = parent + self._data = smiley_loader.get_smileys() + + count = len(self._data) if not count: self.close() - self.page_size = int(pow(count / 8, 0.5) + 1) * 8 # smileys per page - if count % self.page_size == 0: - self.page_count = count // self.page_size + + self._page_size = int(pow(count / 8, 0.5) + 1) * 8 # smileys per page + if count % self._page_size == 0: + self._page_count = count // self._page_size else: - self.page_count = round(count / self.page_size + 0.5) - self.page = -1 - self.radio = [] - self.parent = parent - for i in range(self.page_count): # buttons with smileys + self._page_count = round(count / self._page_size + 0.5) + self._page = -1 + self._radio = [] + + for i in range(self._page_count): # pages - radio buttons elem = QtWidgets.QRadioButton(self) - elem.setGeometry(QtCore.QRect(i * 20 + 5, 180, 20, 20)) - elem.clicked.connect(lambda c, t=i: self.checked(t)) - self.radio.append(elem) - width = max(self.page_count * 20 + 30, (self.page_size + 5) * 8 // 10) + elem.setGeometry(QtCore.QRect(i * 20 + 5, 160, 20, 20)) + elem.clicked.connect(lambda c, t=i: self._checked(t)) + self._radio.append(elem) + + width = max(self._page_count * 20 + 30, (self._page_size + 5) * 8 // 10) self.setMaximumSize(width, 200) self.setMinimumSize(width, 200) - self.buttons = [] - for i in range(self.page_size): # pages - radio buttons + self._buttons = [] + + for i in range(self._page_size): # buttons with smileys b = QtWidgets.QPushButton(self) b.setGeometry(QtCore.QRect((i // 8) * 20 + 5, (i % 8) * 20, 20, 20)) - b.clicked.connect(lambda c, t=i: self.clicked(t)) - self.buttons.append(b) - self.checked(0) - - def checked(self, pos): # new page opened - self.radio[self.page].setChecked(False) - self.radio[pos].setChecked(True) - self.page = pos - start = self.page * self.page_size - for i in range(self.page_size): - try: - self.buttons[i].setVisible(True) - pixmap = QtGui.QPixmap(self.data[start + i][1]) - icon = QtGui.QIcon(pixmap) - self.buttons[i].setIcon(icon) - except: - self.buttons[i].setVisible(False) - - def clicked(self, pos): # smiley selected - pos += self.page * self.page_size - smiley = self.data[pos][0] - self.parent.messageEdit.insertPlainText(smiley) - self.close() + b.clicked.connect(lambda c, t=i: self._clicked(t)) + self._buttons.append(b) + self._checked(0) def leaveEvent(self, event): self.close() + def _checked(self, pos): # new page opened + self._radio[self._page].setChecked(False) + self._radio[pos].setChecked(True) + self._page = pos + start = self._page * self._page_size + for i in range(self._page_size): + try: + self._buttons[i].setVisible(True) + pixmap = QtGui.QPixmap(self._data[start + i][1]) + icon = QtGui.QIcon(pixmap) + self._buttons[i].setIcon(icon) + except: + self._buttons[i].setVisible(False) + + def _clicked(self, pos): # smiley selected + pos += self._page * self._page_size + smiley = self._data[pos][0] + self._parent.messageEdit.insertPlainText(smiley) + self.close() + class MenuButton(QtWidgets.QPushButton):