2023-08-10 17:19:58 +01:00
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
"""Wx dialogs for showing a user's profile."""
|
|
|
|
|
|
|
|
from io import BytesIO
|
|
|
|
from typing import Tuple
|
2023-08-10 19:15:34 +01:00
|
|
|
import requests
|
|
|
|
import wx
|
|
|
|
|
|
|
|
def _(s):
|
|
|
|
return s
|
2023-08-10 17:19:58 +01:00
|
|
|
|
|
|
|
|
|
|
|
def selectUserDialog(users: list) -> tuple:
|
|
|
|
"""Choose a user from a possible list of users"""
|
|
|
|
if len(users) == 1:
|
|
|
|
return users[0]
|
|
|
|
dlg = wx.Dialog(None, title=_("Select user"))
|
|
|
|
label = wx.StaticText(dlg, label="Select a user: ")
|
2023-08-10 19:15:34 +01:00
|
|
|
choiceList = []
|
|
|
|
for user in users:
|
|
|
|
if len(user) == 3: # (display_name, username, id)
|
|
|
|
choiceList.append(f"{user[0]}: @{user[1]}")
|
|
|
|
else: # (acct, id)
|
|
|
|
choiceList.append(f"{user[0]}")
|
|
|
|
choice = wx.Choice(dlg, choices=choiceList)
|
2023-08-10 17:19:58 +01:00
|
|
|
ok = wx.Button(dlg, wx.ID_OK, _("OK"))
|
|
|
|
ok.SetDefault()
|
|
|
|
cancel = wx.Button(dlg, wx.ID_CANCEL, _("Cancel"))
|
|
|
|
dlg.SetEscapeId(cancel.GetId())
|
|
|
|
|
|
|
|
#sizers
|
|
|
|
sizer = wx.GridSizer(2, 2, 5, 5)
|
|
|
|
sizer.Add(label, wx.SizerFlags().Center())
|
|
|
|
sizer.Add(choice, wx.SizerFlags().Center())
|
|
|
|
sizer.Add(ok, wx.SizerFlags().Center())
|
|
|
|
sizer.Add(cancel, wx.SizerFlags().Center())
|
|
|
|
|
|
|
|
if dlg.ShowModal() == wx.ID_CANCEL:
|
2023-08-10 19:15:34 +01:00
|
|
|
return ()
|
2023-08-10 17:19:58 +01:00
|
|
|
# return the selected user
|
|
|
|
return users[choice.GetSelection()]
|
|
|
|
|
|
|
|
|
|
|
|
def returnTrue():
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
|
|
class ShowUserProfile(wx.Dialog):
|
|
|
|
"""
|
|
|
|
A dialog for Showing user profile
|
|
|
|
layout is:
|
|
|
|
```
|
|
|
|
header
|
|
|
|
avatar
|
|
|
|
name
|
|
|
|
bio
|
|
|
|
meta data
|
|
|
|
```
|
|
|
|
"""
|
|
|
|
|
2023-08-12 10:32:29 +01:00
|
|
|
def __init__(self, display_name: str, url: str, created_at, note: str, header: str, avatar: str, fields: list, locked: bool, bot: bool, discoverable: bool):
|
2023-08-10 17:19:58 +01:00
|
|
|
"""Initialize update profile dialog
|
|
|
|
Parameters:
|
|
|
|
- display_name: The user's display name to show in the display name field
|
2023-08-10 19:15:34 +01:00
|
|
|
- url: The user's url
|
2023-08-10 17:19:58 +01:00
|
|
|
- note: The users bio to show in the bio field
|
|
|
|
- header: the users header pic link
|
|
|
|
- avatar: The users avatar pic link
|
|
|
|
"""
|
|
|
|
super().__init__(parent=None)
|
|
|
|
self.SetTitle(_("{}'s Profile").format(display_name))
|
|
|
|
self.panel = wx.Panel(self)
|
2023-08-12 10:32:29 +01:00
|
|
|
wrapperSizer = wx.BoxSizer(wx.VERTICAL)
|
|
|
|
topSizer = wx.GridSizer(2, 10, 5, 5)
|
2023-08-10 17:19:58 +01:00
|
|
|
|
|
|
|
# create widgets
|
|
|
|
nameLabel = wx.StaticText(self.panel, label=_("Name: "))
|
|
|
|
name = self.createTextCtrl(display_name, size=(200, 30))
|
2023-08-12 10:32:29 +01:00
|
|
|
topSizer.Add(nameLabel, wx.SizerFlags().Center())
|
|
|
|
topSizer.Add(name, wx.SizerFlags().Center())
|
2023-08-10 17:19:58 +01:00
|
|
|
|
2023-08-10 19:15:34 +01:00
|
|
|
urlLabel = wx.StaticText(self.panel, label=_("URL: "))
|
|
|
|
url = self.createTextCtrl(url, size=(200, 30))
|
2023-08-12 10:32:29 +01:00
|
|
|
topSizer.Add(urlLabel, wx.SizerFlags().Center())
|
|
|
|
topSizer.Add(url, wx.SizerFlags().Center())
|
|
|
|
|
|
|
|
joinLabel = wx.StaticText(self.panel, label=_("Joined at: "))
|
|
|
|
joinText = self.createTextCtrl(created_at.strftime('%d %B, %Y'), (80, 30))
|
|
|
|
topSizer.Add(joinLabel, wx.SizerFlags().Center())
|
|
|
|
topSizer.Add(joinText, wx.SizerFlags().Center())
|
2023-08-10 17:19:58 +01:00
|
|
|
|
|
|
|
bioLabel = wx.StaticText(self.panel, label=_("Bio: "))
|
|
|
|
bio = self.createTextCtrl(note, (400, 60))
|
2023-08-12 10:32:29 +01:00
|
|
|
topSizer.Add(bioLabel, wx.SizerFlags().Center())
|
|
|
|
topSizer.Add(bio, wx.SizerFlags().Center())
|
2023-08-10 17:19:58 +01:00
|
|
|
|
|
|
|
# header
|
|
|
|
headerLabel = wx.StaticText(self.panel, label=_("Header: "))
|
|
|
|
try:
|
|
|
|
response = requests.get(header)
|
|
|
|
except requests.exceptions.RequestException:
|
|
|
|
# Create empty image
|
|
|
|
headerImage = wx.StaticBitmap()
|
|
|
|
else:
|
|
|
|
image_bytes = BytesIO(response.content)
|
|
|
|
image = wx.Image(image_bytes, wx.BITMAP_TYPE_ANY)
|
|
|
|
image.Rescale(300, 100, wx.IMAGE_QUALITY_HIGH)
|
|
|
|
headerImage = wx.StaticBitmap(self.panel, bitmap=image.ConvertToBitmap())
|
|
|
|
|
|
|
|
headerImage.AcceptsFocusFromKeyboard = returnTrue
|
2023-08-12 10:32:29 +01:00
|
|
|
topSizer.Add(headerLabel, wx.SizerFlags().Center())
|
|
|
|
topSizer.Add(headerImage, wx.SizerFlags().Center())
|
2023-08-10 17:19:58 +01:00
|
|
|
|
|
|
|
# avatar
|
2023-08-12 10:32:29 +01:00
|
|
|
avatarLabel = wx.StaticText(self.panel, label=_("Avatar: "))
|
2023-08-10 17:19:58 +01:00
|
|
|
try:
|
|
|
|
response = requests.get(avatar)
|
|
|
|
except requests.exceptions.RequestException:
|
|
|
|
# Create empty image
|
|
|
|
avatarImage = wx.StaticBitmap()
|
|
|
|
else:
|
|
|
|
image_bytes = BytesIO(response.content)
|
|
|
|
image = wx.Image(image_bytes, wx.BITMAP_TYPE_ANY)
|
|
|
|
image.Rescale(150, 150, wx.IMAGE_QUALITY_HIGH)
|
|
|
|
avatarImage = wx.StaticBitmap(self.panel, bitmap=image.ConvertToBitmap())
|
|
|
|
|
|
|
|
avatarImage.AcceptsFocusFromKeyboard = returnTrue
|
2023-08-12 10:32:29 +01:00
|
|
|
topSizer.Add(avatarLabel, wx.SizerFlags().Center())
|
|
|
|
topSizer.Add(avatarImage, wx.SizerFlags().Center())
|
2023-08-10 17:19:58 +01:00
|
|
|
|
|
|
|
self.fields = []
|
|
|
|
for num, (label, content) in enumerate(fields):
|
|
|
|
labelSizer = wx.BoxSizer(wx.HORIZONTAL)
|
2023-08-12 10:32:29 +01:00
|
|
|
labelLabel = wx.StaticText(self.panel, label=_("Field {} - Label: ").format(num + 1))
|
2023-08-10 17:19:58 +01:00
|
|
|
labelSizer.Add(labelLabel, wx.SizerFlags().Center().Border(wx.ALL, 5))
|
|
|
|
labelText = self.createTextCtrl(label, (230, 30), True)
|
|
|
|
labelSizer.Add(labelText, wx.SizerFlags().Expand().Border(wx.ALL, 5))
|
2023-08-12 10:32:29 +01:00
|
|
|
topSizer.Add(labelSizer, 0, wx.CENTER)
|
2023-08-10 17:19:58 +01:00
|
|
|
|
|
|
|
contentSizer = wx.BoxSizer(wx.HORIZONTAL)
|
|
|
|
contentLabel = wx.StaticText(self.panel, label=_("Content: "))
|
|
|
|
contentSizer.Add(contentLabel, wx.SizerFlags().Center())
|
|
|
|
contentText = self.createTextCtrl(content, (400, 60), True)
|
|
|
|
contentSizer.Add(contentText, wx.SizerFlags().Center())
|
2023-08-12 10:32:29 +01:00
|
|
|
topSizer.Add(contentSizer, 0, wx.CENTER | wx.LEFT, 10)
|
|
|
|
|
|
|
|
# 3 X 2 grid sizer
|
|
|
|
bottomSizer = wx.GridSizer(3, 2, 10, 5)
|
|
|
|
bullSwitch = {True: _('Yes'), False: _('No'), None: _('No')}
|
|
|
|
privateSizer = wx.BoxSizer(wx.HORIZONTAL)
|
|
|
|
privateLabel = wx.StaticText(self.panel, label=_("Private account: "))
|
|
|
|
private = self.createTextCtrl(bullSwitch[locked], (30, 30))
|
|
|
|
privateSizer.Add(privateLabel, wx.SizerFlags().Center())
|
|
|
|
privateSizer.Add(private, wx.SizerFlags().Center())
|
|
|
|
bottomSizer.Add(privateSizer, 0, wx.ALL | wx.CENTER)
|
|
|
|
|
|
|
|
|
|
|
|
botSizer = wx.BoxSizer(wx.HORIZONTAL)
|
|
|
|
botLabel = wx.StaticText(self.panel, label=_("Bot account: "))
|
|
|
|
botText = self.createTextCtrl(bullSwitch[bot], (30, 30))
|
|
|
|
botSizer.Add(botLabel, wx.SizerFlags().Center())
|
|
|
|
botSizer.Add(botText, wx.SizerFlags().Center())
|
|
|
|
bottomSizer.Add(botSizer, 0, wx.ALL | wx.CENTER)
|
|
|
|
|
|
|
|
discoverSizer = wx.BoxSizer(wx.HORIZONTAL)
|
|
|
|
discoverLabel = wx.StaticText(self.panel, label=_("Discoverable account: "))
|
|
|
|
discoverText = self.createTextCtrl(bullSwitch[discoverable], (30, 30))
|
|
|
|
discoverSizer.Add(discoverLabel, wx.SizerFlags().Center())
|
|
|
|
discoverSizer.Add(discoverText, wx.SizerFlags().Center())
|
|
|
|
bottomSizer.Add(discoverSizer, 0, wx.ALL | wx.CENTER)
|
|
|
|
|
2023-08-10 17:19:58 +01:00
|
|
|
|
|
|
|
close = wx.Button(self.panel, wx.ID_CLOSE, _("Close"))
|
|
|
|
self.SetEscapeId(close.GetId())
|
|
|
|
close.SetDefault()
|
2023-08-12 10:32:29 +01:00
|
|
|
wrapperSizer.Add(topSizer, 0, wx.CENTER)
|
|
|
|
wrapperSizer.Add(bottomSizer, 0, wx.CENTER)
|
|
|
|
wrapperSizer.Add(close, wx.SizerFlags().Center())
|
|
|
|
self.panel.SetSizerAndFit(wrapperSizer)
|
|
|
|
topSizer.Fit(self)
|
2023-08-10 17:19:58 +01:00
|
|
|
self.Center()
|
|
|
|
|
|
|
|
|
|
|
|
def createTextCtrl(self, text: str, size: Tuple[int, int], multiline: bool = False) -> wx.TextCtrl:
|
|
|
|
"""Creates a wx.TextCtrl and returns it
|
|
|
|
Parameters:
|
|
|
|
text: The value of the wx.TextCtrl
|
|
|
|
size: The size of the wx.TextCtrl
|
|
|
|
Returns: the created wx.TextCtrl object
|
|
|
|
"""
|
|
|
|
if not multiline:
|
|
|
|
style= wx.TE_PROCESS_ENTER | wx.TE_PROCESS_TAB | wx.TE_READONLY
|
|
|
|
else:
|
|
|
|
style= wx.TE_PROCESS_ENTER | wx.TE_PROCESS_TAB | wx.TE_READONLY | wx.TE_MULTILINE
|
|
|
|
textCtrl = wx.TextCtrl(self.panel, value=text, size=size, style=style)
|
|
|
|
textCtrl.AcceptsFocusFromKeyboard = returnTrue
|
|
|
|
return textCtrl
|