identicons basic support
This commit is contained in:
parent
f3aa0aeda3
commit
c0a143c817
9 changed files with 36 additions and 14 deletions
6
setup.py
6
setup.py
|
@ -10,7 +10,7 @@ version = main.__version__ + '.0'
|
||||||
|
|
||||||
|
|
||||||
if system() == 'Windows':
|
if system() == 'Windows':
|
||||||
MODULES = ['PyQt5', 'PyAudio', 'numpy', 'opencv-python']
|
MODULES = ['PyQt5', 'PyAudio', 'numpy', 'opencv-python', 'pydenticon']
|
||||||
else:
|
else:
|
||||||
MODULES = []
|
MODULES = []
|
||||||
try:
|
try:
|
||||||
|
@ -29,6 +29,10 @@ else:
|
||||||
import cv2
|
import cv2
|
||||||
except ImportError:
|
except ImportError:
|
||||||
MODULES.append('opencv-python')
|
MODULES.append('opencv-python')
|
||||||
|
try:
|
||||||
|
import pydenticon
|
||||||
|
except ImportError:
|
||||||
|
MODULES.append('pydenticon')
|
||||||
|
|
||||||
|
|
||||||
class InstallScript(install):
|
class InstallScript(install):
|
||||||
|
|
|
@ -3,6 +3,7 @@ from PyQt5 import QtCore, QtGui
|
||||||
from wrapper.toxcore_enums_and_consts import TOX_PUBLIC_KEY_SIZE
|
from wrapper.toxcore_enums_and_consts import TOX_PUBLIC_KEY_SIZE
|
||||||
import utils.util as util
|
import utils.util as util
|
||||||
import common.event as event
|
import common.event as event
|
||||||
|
import contacts.common as common
|
||||||
|
|
||||||
|
|
||||||
class BaseContact:
|
class BaseContact:
|
||||||
|
@ -119,14 +120,17 @@ class BaseContact:
|
||||||
self._widget.avatar_label.repaint()
|
self._widget.avatar_label.repaint()
|
||||||
self._avatar_changed_event(avatar_path)
|
self._avatar_changed_event(avatar_path)
|
||||||
|
|
||||||
def reset_avatar(self):
|
def reset_avatar(self, generate_new):
|
||||||
avatar_path = self.get_avatar_path()
|
avatar_path = self.get_avatar_path()
|
||||||
if os.path.isfile(avatar_path):
|
if os.path.isfile(avatar_path) and not avatar_path == self._get_default_avatar_path():
|
||||||
os.remove(avatar_path)
|
os.remove(avatar_path)
|
||||||
|
if generate_new:
|
||||||
|
self.set_avatar(common.generate_avatar(self.tox_id))
|
||||||
|
else:
|
||||||
self.load_avatar()
|
self.load_avatar()
|
||||||
|
|
||||||
def set_avatar(self, avatar):
|
def set_avatar(self, avatar):
|
||||||
avatar_path = self.get_avatar_path()
|
avatar_path = self.get_contact_avatar_path()
|
||||||
with open(avatar_path, 'wb') as f:
|
with open(avatar_path, 'wb') as f:
|
||||||
f.write(avatar)
|
f.write(avatar)
|
||||||
self.load_avatar()
|
self.load_avatar()
|
||||||
|
@ -137,7 +141,7 @@ class BaseContact:
|
||||||
def get_avatar_path(self):
|
def get_avatar_path(self):
|
||||||
avatar_path = self.get_contact_avatar_path()
|
avatar_path = self.get_contact_avatar_path()
|
||||||
if not os.path.isfile(avatar_path) or not os.path.getsize(avatar_path): # load default image
|
if not os.path.isfile(avatar_path) or not os.path.getsize(avatar_path): # load default image
|
||||||
avatar_path = util.join_path(util.get_images_directory(), self._get_default_avatar_name())
|
avatar_path = self._get_default_avatar_path()
|
||||||
|
|
||||||
return avatar_path
|
return avatar_path
|
||||||
|
|
||||||
|
@ -166,5 +170,5 @@ class BaseContact:
|
||||||
# -----------------------------------------------------------------------------------------------------------------
|
# -----------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _get_default_avatar_name():
|
def _get_default_avatar_path():
|
||||||
return 'avatar.png'
|
return util.join_path(util.get_images_directory(), 'avatar.png')
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
from pydenticon import Generator
|
||||||
|
|
||||||
|
|
||||||
class BaseTypingNotificationHandler:
|
class BaseTypingNotificationHandler:
|
||||||
|
@ -22,3 +23,17 @@ class FriendTypingNotificationHandler(BaseTypingNotificationHandler):
|
||||||
|
|
||||||
|
|
||||||
BaseTypingNotificationHandler.DEFAULT_HANDLER = BaseTypingNotificationHandler()
|
BaseTypingNotificationHandler.DEFAULT_HANDLER = BaseTypingNotificationHandler()
|
||||||
|
|
||||||
|
|
||||||
|
def generate_avatar(tox_id):
|
||||||
|
foreground = ["rgb(45,79,255)",
|
||||||
|
"rgb(254,180,44)",
|
||||||
|
"rgb(226,121,234)",
|
||||||
|
"rgb(30,179,253)",
|
||||||
|
"rgb(232,77,65)",
|
||||||
|
"rgb(49,203,115)",
|
||||||
|
"rgb(141,69,170)"]
|
||||||
|
generator = Generator(5, 5, foreground=foreground, background="rgba(42,42,42,0)")
|
||||||
|
identicon = generator.generate(tox_id, 220, 220, padding=(10, 10, 10, 10))
|
||||||
|
|
||||||
|
return identicon
|
||||||
|
|
|
@ -295,6 +295,7 @@ class ContactsManager:
|
||||||
self._history.add_friend_to_db(tox_id)
|
self._history.add_friend_to_db(tox_id)
|
||||||
friend = self._contact_provider.get_friend_by_public_key(tox_id)
|
friend = self._contact_provider.get_friend_by_public_key(tox_id)
|
||||||
self._contacts.append(friend)
|
self._contacts.append(friend)
|
||||||
|
friend.reset_avatar()
|
||||||
|
|
||||||
def block_user(self, tox_id):
|
def block_user(self, tox_id):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -136,8 +136,8 @@ class Profile(basecontact.BaseContact):
|
||||||
self._call.stop()
|
self._call.stop()
|
||||||
del self._call
|
del self._call
|
||||||
|
|
||||||
def reset_avatar(self):
|
def reset_avatar(self, generate_new):
|
||||||
super().reset_avatar()
|
super().reset_avatar(generate_new)
|
||||||
for friend in filter(lambda x: x.status is not None, self._contacts):
|
for friend in filter(lambda x: x.status is not None, self._contacts):
|
||||||
self.send_avatar(friend.number)
|
self.send_avatar(friend.number)
|
||||||
|
|
||||||
|
|
|
@ -316,9 +316,6 @@ class ReceiveAvatar(ReceiveTransfer):
|
||||||
elif not size:
|
elif not size:
|
||||||
self.send_control(TOX_FILE_CONTROL['CANCEL'])
|
self.send_control(TOX_FILE_CONTROL['CANCEL'])
|
||||||
self._file.close()
|
self._file.close()
|
||||||
if exists(path):
|
|
||||||
remove(path)
|
|
||||||
self._file.close()
|
|
||||||
remove(full_path)
|
remove(full_path)
|
||||||
elif exists(path):
|
elif exists(path):
|
||||||
hash = self.get_file_id()
|
hash = self.get_file_id()
|
||||||
|
|
|
@ -271,7 +271,7 @@ class FileTransfersHandler:
|
||||||
self._file_transfers[(friend_number, file_number)] = ra
|
self._file_transfers[(friend_number, file_number)] = ra
|
||||||
ra.set_transfer_finished_handler(self.transfer_finished)
|
ra.set_transfer_finished_handler(self.transfer_finished)
|
||||||
else:
|
else:
|
||||||
friend.load_avatar()
|
friend.reset_avatar(self._settings['identicons'])
|
||||||
|
|
||||||
# -----------------------------------------------------------------------------------------------------------------
|
# -----------------------------------------------------------------------------------------------------------------
|
||||||
# Private methods
|
# Private methods
|
||||||
|
|
|
@ -245,7 +245,7 @@ class ProfileSettings(CenteredWidget):
|
||||||
self.tox_id.setText(self._profile.new_nospam())
|
self.tox_id.setText(self._profile.new_nospam())
|
||||||
|
|
||||||
def reset_avatar(self):
|
def reset_avatar(self):
|
||||||
self._profile.reset_avatar()
|
self._profile.reset_avatar(self._settings['identicons'])
|
||||||
|
|
||||||
def set_avatar(self):
|
def set_avatar(self):
|
||||||
choose = util_ui.tr("Choose avatar")
|
choose = util_ui.tr("Choose avatar")
|
||||||
|
|
|
@ -140,6 +140,7 @@ class Settings(dict):
|
||||||
'unread_color': 'red',
|
'unread_color': 'red',
|
||||||
'save_unsent_only': False,
|
'save_unsent_only': False,
|
||||||
'compact_mode': False,
|
'compact_mode': False,
|
||||||
|
'identicons': True,
|
||||||
'show_welcome_screen': True,
|
'show_welcome_screen': True,
|
||||||
'close_to_tray': False,
|
'close_to_tray': False,
|
||||||
'font': 'Times New Roman',
|
'font': 'Times New Roman',
|
||||||
|
|
Loading…
Reference in a new issue