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