diff --git a/src/callbacks.py b/src/callbacks.py index e485e9e..c4eded7 100644 --- a/src/callbacks.py +++ b/src/callbacks.py @@ -107,10 +107,12 @@ def friend_message(window): def wrapped(tox, friend_number, message_type, message, size, user_data): print 'Message: ', message.decode('utf8') profile = Profile.get_instance() - if not window.isActiveWindow() and Settings()['notifications']: - friend = profile.get_friend_by_number(friend_number) - tray_notification(friend.name, message.decode('utf8')) + settings = Settings.get_instance() invoke_in_main_thread(profile.new_message, friend_number, message_type, message) + if not window.isActiveWindow(): + friend = profile.get_friend_by_number(friend_number) + if settings['notifications']: + invoke_in_main_thread(tray_notification, friend.name, message.decode('utf8')) return wrapped diff --git a/src/list_items.py b/src/list_items.py index 2c730ac..5c9073f 100644 --- a/src/list_items.py +++ b/src/list_items.py @@ -11,7 +11,7 @@ class MessageEdit(QtGui.QPlainTextEdit): self.document().setTextWidth(parent.width() - 100) font = QtGui.QFont() font.setFamily("Times New Roman") - font.setPixelSize(12) + font.setPixelSize(14) font.setBold(False) self.setFont(font) lines = 0 @@ -19,7 +19,6 @@ class MessageEdit(QtGui.QPlainTextEdit): try: for elem in xrange(self.document().blockCount()): block = self.document().findBlockByLineNumber(elem) - l = block.length() line_width = fm.width(block.text()) print 'Width: ', line_width print 'Parent width', parent.width() @@ -29,7 +28,7 @@ class MessageEdit(QtGui.QPlainTextEdit): print 'lines ', lines if self.document().blockCount() == 1: lines += 1 - size = (lines - 1) * 18 + 12 + size = lines * 21 self.setFixedHeight(max(size, 30)) self.setTextInteractionFlags(QtCore.Qt.TextSelectableByMouse | QtCore.Qt.LinksAccessibleByMouse) @@ -41,11 +40,11 @@ class MessageItem(QtGui.QListWidget): def __init__(self, text, time, user='', message_type=TOX_MESSAGE_TYPE['NORMAL'], parent=None): QtGui.QListWidget.__init__(self, parent) self.name = QtGui.QLabel(self) - self.name.setGeometry(QtCore.QRect(5, 0, 95, 30)) + self.name.setGeometry(QtCore.QRect(0, 0, 95, 40)) self.name.setTextFormat(QtCore.Qt.PlainText) font = QtGui.QFont() font.setFamily("Times New Roman") - font.setPointSize(10) + font.setPointSize(12) font.setBold(True) self.name.setFont(font) self.name.setObjectName("name") diff --git a/src/mainscreen.py b/src/mainscreen.py index cb6d30e..9e91280 100644 --- a/src/mainscreen.py +++ b/src/mainscreen.py @@ -124,6 +124,7 @@ class MainWindow(QtGui.QMainWindow): def setup_left_top(self, Form): Form.setObjectName("left_top") Form.resize(500, 300) + Form.setCursor(QtCore.Qt.PointingHandCursor) Form.setMinimumSize(QtCore.QSize(250, 100)) Form.setMaximumSize(QtCore.QSize(250, 100)) Form.setBaseSize(QtCore.QSize(250, 100)) @@ -131,7 +132,7 @@ class MainWindow(QtGui.QMainWindow): self.avatar_label.setGeometry(QtCore.QRect(10, 20, 64, 64)) self.avatar_label.setScaledContents(True) self.name = Form.name = QtGui.QLabel(Form) - Form.name.setGeometry(QtCore.QRect(80, 30, 200, 25)) + Form.name.setGeometry(QtCore.QRect(80, 30, 120, 25)) font = QtGui.QFont() font.setFamily("Times New Roman") font.setPointSize(14) @@ -149,6 +150,10 @@ class MainWindow(QtGui.QMainWindow): Form.connection_status.setMinimumSize(QtCore.QSize(32, 32)) Form.connection_status.setMaximumSize(QtCore.QSize(32, 32)) Form.connection_status.setBaseSize(QtCore.QSize(32, 32)) + self.avatar_label.mouseReleaseEvent = self.profile_settings + self.status_message.mouseReleaseEvent = self.profile_settings + self.name.mouseReleaseEvent = self.profile_settings + self.connection_status.raise_() Form.connection_status.setObjectName("connection_status") def setup_right_top(self, Form): @@ -243,7 +248,7 @@ class MainWindow(QtGui.QMainWindow): self.a_c = AddContact() self.a_c.show() - def profile_settings(self): + def profile_settings(self, *args): self.p_s = ProfileSettings() self.p_s.show() diff --git a/src/menu.py b/src/menu.py index 851df54..7c670b8 100644 --- a/src/menu.py +++ b/src/menu.py @@ -4,7 +4,19 @@ from profile import Profile from util import get_style -class AddContact(QtGui.QWidget): +class CenteredWidget(QtGui.QWidget): + def __init__(self): + super(CenteredWidget, self).__init__() + self.center() + + def center(self): + qr = self.frameGeometry() + cp = QtGui.QDesktopWidget().availableGeometry().center() + qr.moveCenter(cp) + self.move(qr.topLeft()) + + +class AddContact(CenteredWidget): """Add contact form""" def __init__(self): @@ -64,7 +76,7 @@ class AddContact(QtGui.QWidget): self.label_2.setText(QtGui.QApplication.translate('AddContact', "Message:", None, QtGui.QApplication.UnicodeUTF8)) -class ProfileSettings(QtGui.QWidget): +class ProfileSettings(CenteredWidget): """Form with profile settings such as name, status, TOX ID""" def __init__(self): super(ProfileSettings, self).__init__() @@ -72,10 +84,8 @@ class ProfileSettings(QtGui.QWidget): def initUI(self): self.setObjectName("ProfileSettingsForm") - self.resize(600, 400) - self.setMinimumSize(QtCore.QSize(700, 400)) - self.setMaximumSize(QtCore.QSize(700, 400)) - self.setBaseSize(QtCore.QSize(700, 400)) + self.setMinimumSize(QtCore.QSize(650, 400)) + self.setMaximumSize(QtCore.QSize(650, 400)) self.nick = QtGui.QLineEdit(self) self.nick.setGeometry(QtCore.QRect(30, 60, 351, 27)) self.nick.setObjectName("nick") @@ -120,6 +130,12 @@ class ProfileSettings(QtGui.QWidget): font.setPointSize(18) self.tox_id_2.setFont(font) self.tox_id_2.setObjectName("tox_id_2") + self.new_avatar = QtGui.QPushButton(self) + self.new_avatar.setGeometry(QtCore.QRect(400, 50, 200, 50)) + self.delete_avatar = QtGui.QPushButton(self) + self.delete_avatar.setGeometry(QtCore.QRect(400, 100, 200, 50)) + self.delete_avatar.clicked.connect(self.reset_avatar) + self.new_avatar.clicked.connect(self.set_avatar) self.retranslateUi() QtCore.QMetaObject.connectSlotsByName(self) @@ -130,19 +146,32 @@ class ProfileSettings(QtGui.QWidget): 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.tox_id_2.setText(QtGui.QApplication.translate("ProfileSettingsForm", "Language:", 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)) def copy(self): clipboard = QtGui.QApplication.clipboard() profile = Profile.get_instance() clipboard.setText(profile.tox_id) + def reset_avatar(self): + Profile.get_instance().reset_avatar() + + def set_avatar(self): + name = QtGui.QFileDialog.getOpenFileName(self, 'Open file') + print name + if name[0]: + with open(name[0], 'rb') as f: + data = f.read() + Profile.get_instance().set_avatar(data) + def closeEvent(self, event): profile = Profile.get_instance() profile.set_name(self.nick.text().encode('utf-8')) profile.set_status_message(self.status.text().encode('utf-8')) -class NetworkSettings(QtGui.QWidget): +class NetworkSettings(CenteredWidget): """Network settings form: UDP, Ipv6 and proxy""" # TODO: add possibility to change network settings def __init__(self): @@ -189,7 +218,7 @@ class NetworkSettings(QtGui.QWidget): self.label_2.setText(QtGui.QApplication.translate("Form", "Port:", None, QtGui.QApplication.UnicodeUTF8)) -class PrivacySettings(QtGui.QWidget): +class PrivacySettings(CenteredWidget): """Privacy settings form: history, typing notifications""" def __init__(self): @@ -234,7 +263,7 @@ class PrivacySettings(QtGui.QWidget): settings.save() -class NotificationsSettings(QtGui.QWidget): +class NotificationsSettings(CenteredWidget): """Notifications settings form""" def __init__(self): @@ -277,7 +306,7 @@ class NotificationsSettings(QtGui.QWidget): settings.save() -class InterfaceSettings(QtGui.QWidget): +class InterfaceSettings(CenteredWidget): """Interface settings form""" def __init__(self): diff --git a/src/profile.py b/src/profile.py index 42aabf3..654a4a9 100644 --- a/src/profile.py +++ b/src/profile.py @@ -138,6 +138,18 @@ class Contact(object): self._widget.avatar_label.setPixmap(avatar_path) self._widget.avatar_label.repaint() + def reset_avatar(self): + avatar_path = (Settings.get_default_path() + 'avatars/{}.png').format(self._tox_id[:TOX_PUBLIC_KEY_SIZE * 2]) + if os.path.isfile(avatar_path): + os.remove(avatar_path) + self.load_avatar() + + def set_avatar(self, avatar): + avatar_path = (Settings.get_default_path() + 'avatars/{}.png').format(self._tox_id[:TOX_PUBLIC_KEY_SIZE * 2]) + with open(avatar_path, 'wb') as f: + f.write(avatar) + self.load_avatar() + class Friend(Contact): """ @@ -398,8 +410,9 @@ class Profile(Contact, Singleton): self.screen.messageEdit.clear() # ----------------------------------------------------------------------------------------------------------------- - # Work with friends (add, remove, set alias, clear history) + # Work with friends (remove, set alias, clear history) # ----------------------------------------------------------------------------------------------------------------- + def set_alias(self, num): friend = self._friends[num] name = friend.name.encode('utf-8') @@ -442,6 +455,25 @@ class Profile(Contact, Singleton): self.screen.friends_list.setItemWidget(elem, item) return item + def delete_friend(self, num): + """ + Removes friend from contact list + :param num: number of friend in list + """ + friend = self._friends[num] + self.tox.friend_delete(friend.number) + del self._friends[num] + self.screen.friends_list.takeItem(num) + if num == self._active_friend: # active friend was deleted + if not len(self._friends): # last friend was deleted + self.set_active(-1) + else: + self.set_active(0) + + # ----------------------------------------------------------------------------------------------------------------- + # Friend requests + # ----------------------------------------------------------------------------------------------------------------- + def send_friend_request(self, tox_id, message): """ Function tries to send request to contact with specified id @@ -478,21 +510,6 @@ class Profile(Contact, Singleton): except Exception as ex: # something is wrong log('Accept friend request failed! ' + str(ex)) - def delete_friend(self, num): - """ - Removes friend from contact list - :param num: number of friend in list - """ - friend = self._friends[num] - self.tox.friend_delete(friend.number) - del self._friends[num] - self.screen.friends_list.takeItem(num) - if num == self._active_friend: # active friend was deleted - if not len(self._friends): # last friend was deleted - self.set_active(-1) - else: - self.set_active(0) - def tox_factory(data=None, settings=None): """