diff --git a/main.py b/main.py index 3b5d278..f22ad34 100644 --- a/main.py +++ b/main.py @@ -1,10 +1,36 @@ #!/usr/bin/python3 -import sys +import sys, os from pathlib import Path from PySide6 import QtCore, QtGui, QtWidgets +from core.file_search import find + ASSET = Path(__file__).parent / "assets" / "2ktan.png" +class SearchResultsDialog(QtWidgets.QDialog): + def __init__(self, results, parent=None): + super().__init__(parent) + self.setWindowTitle("Search Results") + self.setMinimumSize(600, 400) + + # Create a list widget to display the results + self.list_widget = QtWidgets.QListWidget() + self.list_widget.addItems(results) + self.list_widget.itemDoubleClicked.connect(self.open_file_location) + + # Set up the layout + layout = QtWidgets.QVBoxLayout() + layout.addWidget(self.list_widget) + self.setLayout(layout) + + def open_file_location(self, item: QtWidgets.QListWidgetItem): + """Opens the directory containing the selected file.""" + file_path = item.text() + if os.path.exists(file_path): + directory = os.path.dirname(file_path) + url = QtCore.QUrl.fromLocalFile(directory) + QtGui.QDesktopServices.openUrl(url) + class MainWindow(QtWidgets.QMainWindow): def __init__(self): super().__init__() @@ -13,6 +39,7 @@ class MainWindow(QtWidgets.QMainWindow): QtCore.Qt.FramelessWindowHint #type: ignore | QtCore.Qt.WindowStaysOnTopHint #type: ignore | QtCore.Qt.Tool #type: ignore + | QtCore.Qt.WindowDoesNotAcceptFocus #type: ignore ) self.setWindowFlags(flags) @@ -31,7 +58,10 @@ class MainWindow(QtWidgets.QMainWindow): self.tray = QtWidgets.QSystemTrayIcon(self) self.tray.setIcon(QtGui.QIcon(str(ASSET))) + + # MENU menu = QtWidgets.QMenu() + menu.addAction("Search Files", self.start_file_search) menu.addAction("Hide/Show", self.toggle_visible) menu.addSeparator() menu.addAction("Quit", QtWidgets.QApplication.quit) @@ -48,12 +78,15 @@ class MainWindow(QtWidgets.QMainWindow): def ensure_on_top(self): if self.isVisible(): self.raise_() - self.activateWindow() def showEvent(self, event): super().showEvent(event) self.raise_() - self.activateWindow() + + def mouseDoubleClickEvent(self, event: QtGui.QMouseEvent): + if event.button() == QtCore.Qt.LeftButton: #type: ignore + self.start_file_search() + event.accept() def mousePressEvent(self, event: QtGui.QMouseEvent): if event.button() == QtCore.Qt.LeftButton: #type: ignore @@ -73,6 +106,26 @@ class MainWindow(QtWidgets.QMainWindow): def toggle_visible(self): self.setVisible(not self.isVisible()) + def start_file_search(self): + pattern, ok = QtWidgets.QInputDialog.getText(self, "File Search", "Enter search pattern:") + + if ok and pattern: + try: + QtWidgets.QApplication.setOverrideCursor(QtCore.Qt.WaitCursor) #type: ignore + results = find(pattern, root='~') + except RuntimeError as e: + QtWidgets.QMessageBox.critical(self, "Search Error", str(e)) + return + finally: + QtWidgets.QApplication.restoreOverrideCursor() + + if results: + self.results_dialog = SearchResultsDialog(results, self) + self.results_dialog.show() + else: + QtWidgets.QMessageBox.information(self, "No Results", f"No files found matching '{pattern}'.") + + def main(): app = QtWidgets.QApplication(sys.argv) app.setApplicationName("CLARA")