PoeTrade/src/pyside6/trade_widget.py

167 lines
6.3 KiB
Python

from PySide6.QtWidgets import QPushButton, QHBoxLayout, QVBoxLayout, QWidget, QLabel, QSizePolicy, QFrame
from PySide6 import QtCore
from PySide6.QtGui import QIcon
from src.data import Message
from src import sendkeys
from src.data import log
from typing import Callable
class TradeWidget(QWidget):
"""docstring for TradeWidget."""
def __init__(self,
message: Message,
parent):
super(TradeWidget, self).__init__(parent=parent)
self.message = message
self.parent = parent
self.main_layout = QHBoxLayout()
self.main_layout.setSpacing(0)
self.setSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Fixed)
self.main_layout.setContentsMargins(0, 0, 0, 0)
self.setLayout(self.main_layout)
assert message.trade
def new_button(self, icon_filename: str, tooltip: str, callback: Callable[[], None]) -> QPushButton:
icon = QIcon(icon_filename)
button = QPushButton(icon=icon, text='', parent=self)
button.setToolTip(tooltip)
button.setSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Fixed)
button.setContentsMargins(0, 0, 0, 0)
button.clicked.connect(callback)
self.main_layout.addWidget(button)
return button
def new_Label(self, text: str) -> QLabel:
label = QLabel(text, self)
label.setFrameStyle(QFrame.Panel | QFrame.Sunken)
label.setAlignment(QtCore.Qt.AlignLeft)
self.main_layout.addWidget(label)
return label
class Trade_In_Widget(TradeWidget):
def __init__(self,
message: Message,
parent):
super(Trade_In_Widget, self).__init__(message=message, parent=parent)
self.inv_button = self.new_button('icons/material_invite.svg', 'Invite', self.inv_callback)
self.trade_button = self.new_button('icons/material_trade.svg', 'Trade', self.trade_callback)
self.thank_button = self.new_button('icons/material_thank.svg', 'Thank you', self.thank_callback)
self.wait_button = self.new_button('icons/material_wait2.svg', 'Busy', self.wait_callback)
self.close_button = self.new_button('icons/material_close.svg', 'Dismiss', self.close_callback)
# self.label_item = self.new_Label(message.trade.item)
self.label_price = self.new_Label(f'{message.trade.amount} {message.trade.currency}')
self.label_user = self.new_Label(message.user)
assert message.trade
if message.trade.tab:
self.label_tab = self.new_Label(message.trade.tab)
def inv_callback(self):
sendkeys.invite(message=self.message)
def thank_callback(self):
sendkeys.send_to_format(type='ty', message=self.message)
sendkeys.kick(message=self.message)
self.close_callback()
def trade_callback(self):
sendkeys.trade(message=self.message)
def wait_callback(self):
sendkeys.send_to_format(type='wait', message=self.message)
def close_callback(self):
self.deleteLater()
self.parent.del_trade(self.message)
class Trade_Out_Widget(TradeWidget):
def __init__(self,
message: Message,
parent):
super(Trade_Out_Widget, self).__init__(message=message, parent=parent)
self.inv_button = self.new_button('icons/material_door.svg', 'Join', self.join_callback)
self.trade_button = self.new_button('icons/material_trade.svg', 'Trade', self.trade_callback)
self.thank_button = self.new_button('icons/material_thank.svg', 'Thank you', self.thank_callback)
self.wait_button = self.new_button('icons/material_leave.svg', 'Leave group', self.leave_callback)
self.wait_button = self.new_button('icons/material_home.svg', 'Return to Hideout', self.return_callback)
self.close_button = self.new_button('icons/material_close.svg', 'Dismiss', self.close_callback)
# self.label_item = self.new_Label(message.trade.item)
assert message.trade
self.label_price = self.new_Label(f'{message.trade.amount} {message.trade.currency}')
self.label_user = self.new_Label(message.user)
def join_callback(self):
sendkeys.join(message=self.message)
def thank_callback(self):
sendkeys.send_to_format(type='ty', message=self.message)
sendkeys.kick(message=self.message)
def trade_callback(self):
sendkeys.trade(message=self.message)
def leave_callback(self):
sendkeys.leave()
def return_callback(self):
sendkeys.return_to_ho()
def close_callback(self):
self.deleteLater()
self.parent.del_trade(self.message)
class TradeCollection(QWidget):
"""This holds the content of one tab.
One tab corresponds to a unique item."""
def __init__(self,
parent,
unique_user_item: int):
super(TradeCollection, self).__init__(parent)
self.parent = parent
self.unique_user_item = unique_user_item
self.setSizePolicy(QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Minimum)
self.setGeometry(0, 0, 20, 20)
self.main_layout = QVBoxLayout()
self.main_layout.setSpacing(0)
self.main_layout.setContentsMargins(0, 0, 0, 0)
self.setContentsMargins(0, 0, 0, 0)
self.setLayout(self.main_layout)
self.trades = {}
def childEvent(self, event: QtCore.QChildEvent) -> None:
if event.removed() or event.added():
log.debug('Child added/removed')
self.parent.updateSizes()
return super().childEvent(event)
def add_trade(self, message: Message) -> None:
assert message.trade
if message.unique_trade() in self.trades:
return
if message.to_from == 'From':
trade = Trade_In_Widget(message, self)
else:
trade = Trade_Out_Widget(message, self)
self.main_layout.addWidget(trade)
self.trades[message.unique_trade()] = trade
def del_trade(self, message: Message):
assert message.trade
del self.trades[message.unique_trade()]
if not self.trades:
self.parent.del_collection(self.unique_user_item)
self.deleteLater()