PoeTrade/src/pyside6/gui_pyside6.py

150 lines
5.5 KiB
Python

import sys
from src import config
from src.data import log
from src.data import Message, compile_regex
from src.pyside6.trade_widget import TradeCollection
from PySide6 import QtCore
from PySide6.QtWidgets import QApplication, QMainWindow, QTabWidget, QSizePolicy
import qdarktheme
class ResizingTabWidget(QTabWidget):
def __init__(self, main_window):
super().__init__(main_window)
self.main_window = main_window
self.currentChanged.connect(self.updateGeometry)
self.setSizePolicy(QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Minimum)
self.setGeometry(0, 0, 20, 20)
self.trade_in_collections = {}
self.trade_out_collections = {}
self.setTabsClosable(True)
self.tabCloseRequested.connect(self.del_tab)
def minimumSizeHint(self):
return self.sizeHint()
def sizeHint(self):
current = self.currentWidget()
if not current:
return super().sizeHint()
size = current.sizeHint()
size.setHeight(size.height() + self.tabBar().sizeHint().height())
size.setWidth(max(size.width(), self.tabBar().sizeHint().width()))
return size
def updateSizes(self):
self.adjustSize()
self.main_window.updateSizes()
def new_in_trade(self, message: Message):
if message.trade:
unique_item = message.trade.unique_item()
if unique_item in self.trade_in_collections:
self.trade_in_collections[unique_item].add_trade(message)
else:
collection = TradeCollection(message, self)
self.addTab(collection, message.trade.item)
self.trade_in_collections[message.trade.unique_item()] = collection
self.main_window.show()
self.main_window.updateSizes()
def new_out_trade(self, message: Message):
if message.trade:
unique_item = message.trade.unique_item()
if unique_item in self.trade_out_collections:
self.trade_out_collections[unique_item].add_trade(message)
else:
collection = TradeCollection(message, self)
self.addTab(collection, message.trade.item)
self.trade_out_collections[message.trade.unique_item()] = collection
self.main_window.show()
self.main_window.updateSizes()
def del_tab(self, index: int):
collection = self.widget(index)
assert isinstance(collection, TradeCollection)
self.trade_in_collections[collection.unique_item].deleteLater()
del self.trade_in_collections[collection.unique_item]
if not self.trade_in_collections:
self.main_window.hide()
def del_collection(self, unique_item: str):
del self.trade_in_collections[unique_item]
if not self.trade_in_collections:
self.main_window.hide()
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowFlag(QtCore.Qt.FramelessWindowHint)
self.setWindowFlag(QtCore.Qt.WindowStaysOnTopHint)
self.setAttribute(QtCore.Qt.WA_TranslucentBackground)
self.setWindowTitle("My App")
self.tab_widget = ResizingTabWidget(self)
self.tab_widget.currentChanged.connect(self.updateSizes)
self.setSizePolicy(QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Minimum)
self.setGeometry(0, 0, 20, 20)
self.setCentralWidget(self.tab_widget)
def updateSizes(self):
QApplication.processEvents()
log.debug(f'updateSizes {self.tab_widget.minimumSizeHint()} / {self.sizeHint()}')
self.resize(self.tab_widget.minimumSizeHint())
@QtCore.Slot()
def new_in_trade(self, message: Message):
self.tab_widget.new_in_trade(message)
@QtCore.Slot()
def new_out_trade(self, message: Message):
self.tab_widget.new_out_trade(message)
def start_app():
app = QApplication(sys.argv)
qss = """QToolTip {
background-color: black;
color: white;
border: black solid 1px
}"""
qdarktheme.setup_theme(additional_qss=qss, custom_colors={"primary": "#eda65a"})
# app.setStyle('Material')
window = MainWindow()
return app, window
if __name__ == "__main__":
conf = config.read_config(r'config.yaml')
compile_regex(conf)
text = '2021/03/08 23:24:52 17931875 bb3 [INFO Client 1492] @From Sinusal: Hi, I would like to buy your level 21 23% Vaal Impurity of Lightning ' \
'listed for 18 chaos in Ritual (stash tab "$"; position: left 22, top 5)'
text2 = '2021/03/08 23:24:52 17931875 bb3 [INFO Client 1492] @From NiceGuy: Hi, I would like to buy your level 21 23% Vaal Impurity of Lightning ' \
'listed for 18 chaos in Ritual (stash tab "$"; position: left 22, top 5)'
text3 = '2023/01/02 23:57:26 15123437 cffb0734 [INFO Client 16668] @From <SETSU?> LASTTRYPOEenjoyer: ' \
'Hi, I would like to buy your Watcher\'s Eye, Prismatic Jewel listed for 2.5 divine in Sanctum (stash tab "$2"; position: left 8, top 7)'
message = Message.from_text(text)
message2 = Message.from_text(text2)
message3 = Message.from_text(text3)
assert message
assert message2
assert message3
app, window = start_app()
window.new_in_trade(message)
window.new_in_trade(message)
window.new_in_trade(message2)
window.new_in_trade(message3)
app.exec()