diff --git a/ui/2ktan.png b/assets/2ktan.png similarity index 100% rename from ui/2ktan.png rename to assets/2ktan.png diff --git a/main.py b/main.py index 9f5e065..3b5d278 100644 --- a/main.py +++ b/main.py @@ -1,2 +1,94 @@ -from ui import gui -gui.main() \ No newline at end of file +#!/usr/bin/python3 +import sys +from pathlib import Path +from PySide6 import QtCore, QtGui, QtWidgets + +ASSET = Path(__file__).parent / "assets" / "2ktan.png" + +class MainWindow(QtWidgets.QMainWindow): + def __init__(self): + super().__init__() + + flags = ( + QtCore.Qt.FramelessWindowHint #type: ignore + | QtCore.Qt.WindowStaysOnTopHint #type: ignore + | QtCore.Qt.Tool #type: ignore + ) + + self.setWindowFlags(flags) + self.setAttribute(QtCore.Qt.WA_TranslucentBackground) #type: ignore + pix = QtGui.QPixmap(str(ASSET)) + + self.label = QtWidgets.QLabel(self) + self.label.setPixmap(pix) + self.label.resize(pix.size()) + self.resize(pix.size()) + + img = pix.toImage() + mask_img = img.createAlphaMask() + mask = QtGui.QBitmap.fromImage(mask_img) + self.setMask(mask) + + self.tray = QtWidgets.QSystemTrayIcon(self) + self.tray.setIcon(QtGui.QIcon(str(ASSET))) + menu = QtWidgets.QMenu() + menu.addAction("Hide/Show", self.toggle_visible) + menu.addSeparator() + menu.addAction("Quit", QtWidgets.QApplication.quit) + self.tray.setContextMenu(menu) + self.tray.show() + + self._drag_pos = None + + # Timer to ensure window stays on top + self.stay_on_top_timer = QtCore.QTimer(self) + self.stay_on_top_timer.timeout.connect(self.ensure_on_top) + self.stay_on_top_timer.start(1000) + + def ensure_on_top(self): + if self.isVisible(): + self.raise_() + self.activateWindow() + + def showEvent(self, event): + super().showEvent(event) + self.raise_() + self.activateWindow() + + def mousePressEvent(self, event: QtGui.QMouseEvent): + if event.button() == QtCore.Qt.LeftButton: #type: ignore + self._drag_pos = event.globalPosition().toPoint() - self.frameGeometry().topLeft() + event.accept() + elif event.button() == QtCore.Qt.RightButton: #type: ignore + self.tray.contextMenu().popup(event.globalPosition().toPoint()) + + def mouseMoveEvent(self, event: QtGui.QMouseEvent): + if self._drag_pos and (event.buttons() & QtCore.Qt.LeftButton): #type: ignore + self.move(event.globalPosition().toPoint() - self._drag_pos) + + def mouseReleaseEvent(self, event: QtGui.QMouseEvent): + self._drag_pos = None + self.raise_() + + def toggle_visible(self): + self.setVisible(not self.isVisible()) + +def main(): + app = QtWidgets.QApplication(sys.argv) + app.setApplicationName("CLARA") + + pet = MainWindow() + + # bottom right corner + screen_geometry = app.primaryScreen().availableGeometry() + pet_geometry = pet.frameGeometry() + x = screen_geometry.width() - pet_geometry.width() + y = screen_geometry.height() - pet_geometry.height() + pet.move(x, y) + + pet.show() + + sys.exit(app.exec()) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/ui/gui.py b/ui/gui.py deleted file mode 100755 index 9026d1d..0000000 --- a/ui/gui.py +++ /dev/null @@ -1,91 +0,0 @@ -#!/usr/bin/python3 -import sys -from pathlib import Path -from PySide6 import QtCore, QtGui, QtWidgets - -ASSET = Path(__file__).with_name("2ktan.png") - -class MainWindow(QtWidgets.QMainWindow): - def __init__(self): - super().__init__() - - flags = ( - QtCore.Qt.FramelessWindowHint #type: ignore - | QtCore.Qt.WindowStaysOnTopHint #type: ignore - | QtCore.Qt.Tool #type: ignore - ) - - self.setWindowFlags(flags) - self.setAttribute(QtCore.Qt.WA_TranslucentBackground) #type: ignore - pix = QtGui.QPixmap(str(ASSET)) - - self.label = QtWidgets.QLabel(self) - self.label.setPixmap(pix) - self.label.resize(pix.size()) - self.resize(pix.size()) - - img = pix.toImage() - mask_img = img.createAlphaMask() - mask = QtGui.QBitmap.fromImage(mask_img) - self.setMask(mask) - - self.tray = QtWidgets.QSystemTrayIcon(self) - self.tray.setIcon(QtGui.QIcon(str(ASSET))) - menu = QtWidgets.QMenu() - menu.addAction("Hide/Show", self.toggle_visible) - menu.addSeparator() - menu.addAction("Quit", QtWidgets.QApplication.quit) - self.tray.setContextMenu(menu) - self.tray.show() - - self._drag_pos = None - - # Timer to ensure window stays on top - self.stay_on_top_timer = QtCore.QTimer(self) - self.stay_on_top_timer.timeout.connect(self.ensure_on_top) - self.stay_on_top_timer.start(1000) - - def ensure_on_top(self): - if self.isVisible(): - self.raise_() - self.activateWindow() - - def showEvent(self, event): - super().showEvent(event) - self.raise_() - self.activateWindow() - - def mousePressEvent(self, event: QtGui.QMouseEvent): - if event.button() == QtCore.Qt.LeftButton: #type: ignore - self._drag_pos = event.globalPosition().toPoint() - self.frameGeometry().topLeft() - event.accept() - elif event.button() == QtCore.Qt.RightButton: #type: ignore - self.tray.contextMenu().popup(event.globalPosition().toPoint()) - - def mouseMoveEvent(self, event: QtGui.QMouseEvent): - if self._drag_pos and (event.buttons() & QtCore.Qt.LeftButton): #type: ignore - self.move(event.globalPosition().toPoint() - self._drag_pos) - - def mouseReleaseEvent(self, event: QtGui.QMouseEvent): - self._drag_pos = None - self.raise_() - - def toggle_visible(self): - self.setVisible(not self.isVisible()) - -def main(): - app = QtWidgets.QApplication(sys.argv) - app.setApplicationName("CLARA") - - pet = MainWindow() - - # bottom right corner - screen_geometry = app.primaryScreen().availableGeometry() - pet_geometry = pet.frameGeometry() - x = screen_geometry.width() - pet_geometry.width() - y = screen_geometry.height() - pet_geometry.height() - pet.move(x, y) - - pet.show() - - sys.exit(app.exec()) \ No newline at end of file diff --git a/ui/pet.png b/ui/pet.png deleted file mode 100644 index 629268e..0000000 Binary files a/ui/pet.png and /dev/null differ