From 7901aad3e7cc5d110f0ae82b74728f4ac73605eb Mon Sep 17 00:00:00 2001 From: ingvar1995 Date: Mon, 6 Jun 2016 21:18:32 +0300 Subject: [PATCH] drag n drop in linux and bug fixes --- src/mainscreen.py | 29 +++++++++++++++++++++++++++-- src/profile.py | 36 +++++++++++++++++++++++++----------- 2 files changed, 52 insertions(+), 13 deletions(-) diff --git a/src/mainscreen.py b/src/mainscreen.py index 8d652fb..70bcdfc 100644 --- a/src/mainscreen.py +++ b/src/mainscreen.py @@ -8,18 +8,22 @@ import plugin_support class MessageArea(QtGui.QPlainTextEdit): + """User enters messages here""" def __init__(self, parent, form): super(MessageArea, self).__init__(parent) self.parent = form + self.setAcceptDrops(True) self.timer = QtCore.QTimer(self) self.timer.timeout.connect(lambda: self.parent.profile.send_typing(False)) def keyPressEvent(self, event): - if event.key() == QtCore.Qt.Key_Return: + if event.matches(QtGui.QKeySequence.Paste): + self.pasteEvent() + elif event.key() == QtCore.Qt.Key_Return: modifiers = event.modifiers() if modifiers & QtCore.Qt.ControlModifier or modifiers & QtCore.Qt.ShiftModifier: - self.appendPlainText('') + self.insertPlainText('\n') else: if self.timer.isActive(): self.timer.stop() @@ -39,6 +43,26 @@ class MessageArea(QtGui.QPlainTextEdit): menu.exec_(event.globalPos()) del menu + def dragEnterEvent(self, e): + e.accept() + + def dragMoveEvent(self, e): + e.accept() + + def dropEvent(self, e): + if e.mimeData().hasFormat('text/plain'): + e.accept() + self.pasteEvent(e.mimeData().text()) + else: + e.ignore() + + def pasteEvent(self, text=None): + text = text or QtGui.QApplication.clipboard().text() + if text.startswith('file://'): + self.parent.profile.send_file(text[7:]) + else: + self.insertPlainText(text) + class MainWindow(QtGui.QMainWindow): @@ -46,6 +70,7 @@ class MainWindow(QtGui.QMainWindow): super(MainWindow, self).__init__() self.reset = reset self.tray = tray + self.setAcceptDrops(True) self.initUI(tox) def setup_menu(self, MainWindow): diff --git a/src/profile.py b/src/profile.py index 8f1d50c..3d01baf 100644 --- a/src/profile.py +++ b/src/profile.py @@ -29,7 +29,7 @@ class Contact(object): def __init__(self, name, status_message, widget, tox_id): """ :param name: name, example: 'Toxygen user' - :param status_message: status message, example: 'Toxing on toxygen' + :param status_message: status message, example: 'Toxing on Toxygen' :param widget: ContactItem instance :param tox_id: tox id of contact """ @@ -199,26 +199,32 @@ class Friend(Contact): def append_message(self, message): """ - :param message: tuple (message, owner, unix_time, message_type) + :param message: text or file transfer message """ self._corr.append(message) if message.get_type() <= 1: self._unsaved_messages += 1 def get_last_message_text(self): - messages = filter(lambda x: x.get_type() <= 1 and not x.get_owner(), self._corr) + messages = filter(lambda x: x.get_type() <= 1 and x.get_owner() != MESSAGE_OWNER['FRIEND'], self._corr) if messages: return messages[-1].get_data()[0] else: return '' def unsent_messages(self): - messages = filter(lambda x: x.get_owner() == 2, self._corr) + """ + :return list of unsent messages + """ + messages = filter(lambda x: x.get_owner() == MESSAGE_OWNER['NOT_SENT'], self._corr) return messages def mark_as_sent(self): - message = filter(lambda x: x.get_owner() == 2, self._corr)[0] - message.mark_as_sent() + try: + message = filter(lambda x: x.get_owner() == MESSAGE_OWNER['NOT_SENT'], self._corr)[0] + message.mark_as_sent() + except Exception as ex: + log('Mark as sent ex: ' + str(ex)) def clear_corr(self): """ @@ -226,7 +232,8 @@ class Friend(Contact): """ if hasattr(self, '_message_getter'): del self._message_getter - self._corr = filter(lambda x: x.get_type() == 2 and x.get_status() >= 2, self._corr) + # don't delete data about active file transfer + self._corr = filter(lambda x: x.get_type() in (2, 3) and x.get_status() >= 2, self._corr) self._unsaved_messages = 0 def update_transfer_data(self, file_number, status, inline=None): @@ -234,14 +241,15 @@ class Friend(Contact): Update status of active transfer and load inline if needed """ try: - tr = filter(lambda x: x.get_type() == 2 and x.is_active(file_number), self._corr)[0] + tr = filter(lambda x: x.get_type() == MESSAGE_TYPE['FILE_TRANSFER'] and x.is_active(file_number), + self._corr)[0] tr.set_status(status) if inline: # inline was loaded i = self._corr.index(tr) self._corr.insert(i, inline) return i - len(self._corr) - except Exception as ex: - log('Update transfer data failed: ' + str(ex)) + except: + pass # ----------------------------------------------------------------------------------------------------------------- # Alias support @@ -525,7 +533,7 @@ class Profile(Contact, Singleton): """ Send typing notification to a friend """ - if Settings.get_instance()['typing_notifications']: + if Settings.get_instance()['typing_notifications'] and self._active_friend + 1: friend = self._friends[self._active_friend] if friend.status is not None: self._tox.self_set_typing(friend.number, typing) @@ -1112,6 +1120,9 @@ class Profile(Contact, Singleton): self._messages.scrollToBottom() def incoming_chunk(self, friend_number, file_number, position, data): + """ + Incoming chunk + """ if (friend_number, file_number) in self._file_transfers: transfer = self._file_transfers[(friend_number, file_number)] transfer.write_chunk(position, data) @@ -1137,6 +1148,9 @@ class Profile(Contact, Singleton): del self._file_transfers[(friend_number, file_number)] def outgoing_chunk(self, friend_number, file_number, position, size): + """ + Ougoing chubk + """ if (friend_number, file_number) in self._file_transfers: transfer = self._file_transfers[(friend_number, file_number)] transfer.send_chunk(position, size)