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()