From def909a913518b2291bc79c88c9602e212787a36 Mon Sep 17 00:00:00 2001 From: sabaimran <65192171+sabaimran@users.noreply.github.com> Date: Wed, 16 Aug 2023 06:26:28 +0000 Subject: [PATCH] Revert "Open Web interface within Desktop app in GUI mode" (#444) --- docs/setup.md | 2 +- src/khoj/interface/desktop/main_window.py | 45 ++++++++++++----------- src/khoj/interface/desktop/system_tray.py | 11 ++++-- src/khoj/main.py | 18 +++++---- 4 files changed, 43 insertions(+), 33 deletions(-) diff --git a/docs/setup.md b/docs/setup.md index a2bcc2bc..25890126 100644 --- a/docs/setup.md +++ b/docs/setup.md @@ -24,7 +24,7 @@ For more detailed Windows installation and troubleshooting, see [Windows Install ### 2. Start -Run the following command in your terminal to start the Khoj backend and open the Khoj native GUI +Run the following command from your terminal to start the Khoj backend and open Khoj in your browser. ```shell khoj --gui diff --git a/src/khoj/interface/desktop/main_window.py b/src/khoj/interface/desktop/main_window.py index 12702337..aa4c9639 100644 --- a/src/khoj/interface/desktop/main_window.py +++ b/src/khoj/interface/desktop/main_window.py @@ -1,11 +1,13 @@ +# Standard Packages +import webbrowser + # External Packages -from PySide6 import QtGui -from PySide6.QtCore import Qt, QThread, QUrl -from PySide6.QtWebEngineWidgets import QWebEngineView -from PySide6.QtWebEngineCore import QWebEnginePage +from PySide6 import QtGui, QtWidgets +from PySide6.QtCore import Qt # Internal Packages from khoj.utils import constants +from PySide6.QtCore import QThread class ServerThread(QThread): @@ -20,12 +22,11 @@ class ServerThread(QThread): self.start_server_func() -class MainWindow(QWebEngineView): +class MainWindow(QtWidgets.QMainWindow): """Create Window to Navigate users to the web UI""" - def __init__(self, url: str): + def __init__(self, host: str, port: int): super(MainWindow, self).__init__() - self.base_url = url # Initialize Configure Window self.setWindowTitle("Khoj") @@ -34,23 +35,25 @@ class MainWindow(QWebEngineView): icon_path = constants.web_directory / "assets/icons/favicon-128x128.png" self.setWindowIcon(QtGui.QIcon(f"{icon_path.absolute()}")) - # Open Khoj Web App Root - self.webpage = QWebEnginePage() - self.setPage(self.webpage) - self.webpage.load(QUrl(self.base_url)) + # Initialize Configure Window Layout + self.wlayout = QtWidgets.QVBoxLayout() + # Add a Label that says "Khoj Configuration" to the Window + self.wlayout.addWidget(QtWidgets.QLabel("Welcome to Khoj")) + + # Add a Button to open the Web UI at http://host:port/config + self.open_web_ui_button = QtWidgets.QPushButton("Open Web UI") + self.open_web_ui_button.clicked.connect(lambda: webbrowser.open(f"http://{host}:{port}/config")) + + self.wlayout.addWidget(self.open_web_ui_button) + + # Set the central widget of the Window. Widget will expand + # to take up all the space in the window by default. + self.config_window = QtWidgets.QWidget() + self.config_window.setLayout(self.wlayout) + self.setCentralWidget(self.config_window) self.position_window() - def show_page(self, page: str = "", maximized=False): - def load_page(): - self.webpage.load(QUrl(f"{self.base_url}/{page}")) - if maximized: - self.showMaximized() - else: - self.show() - - return load_page - def position_window(self): "Position the window at center of X axis and near top on Y axis" window_rectangle = self.geometry() diff --git a/src/khoj/interface/desktop/system_tray.py b/src/khoj/interface/desktop/system_tray.py index 02750ce7..73fb0b7c 100644 --- a/src/khoj/interface/desktop/system_tray.py +++ b/src/khoj/interface/desktop/system_tray.py @@ -1,8 +1,11 @@ +# Standard Packages +import webbrowser + # External Packages from PySide6 import QtGui, QtWidgets # Internal Packages -from khoj.utils import constants +from khoj.utils import constants, state from khoj.interface.desktop.main_window import MainWindow @@ -22,9 +25,9 @@ def create_system_tray(gui: QtWidgets.QApplication, main_window: MainWindow): # Create the menu and menu actions menu = QtWidgets.QMenu() menu_actions = [ - ("Search", main_window.show_page()), - ("Chat", main_window.show_page("chat")), - ("Configure", main_window.show_page("config")), + ("Search", lambda: webbrowser.open(f"http://{state.host}:{state.port}/")), + ("Configure", lambda: webbrowser.open(f"http://{state.host}:{state.port}/config")), + ("App", main_window.show), ("Quit", gui.quit), ] diff --git a/src/khoj/main.py b/src/khoj/main.py index 936ebf1c..751f75e9 100644 --- a/src/khoj/main.py +++ b/src/khoj/main.py @@ -13,6 +13,7 @@ import logging import threading import warnings from platform import system +import webbrowser # Ignore non-actionable warnings warnings.filterwarnings("ignore", message=r"snapshot_download.py has been made private", category=FutureWarning) @@ -84,9 +85,8 @@ def run(): from khoj.interface.desktop.system_tray import create_system_tray # Setup GUI - url = f"http://{args.host}:{args.port}" gui = QtWidgets.QApplication([]) - main_window = MainWindow(url) + main_window = MainWindow(args.host, args.port) # System tray is only available on Windows, MacOS. # On Linux (Gnome) the System tray is not supported. @@ -102,13 +102,17 @@ def run(): configure_routes(app) server = ServerThread(start_server_func=lambda: start_server(app, host=args.host, port=args.port)) + url = f"http://{args.host}:{args.port}" logger.info(f"🌗 Khoj is running at {url}") + try: + startup_url = url if args.config else f"{url}/config" + webbrowser.open(startup_url) + except: + logger.warning(f"🚧 Unable to open browser. Please open {url} manually to configure or use Khoj.") - # Show config window on first run and main window otherwise - startup_window = ( - main_window.show_page(maximized=True) if args.config else main_window.show_page("config", maximized=True) - ) - startup_window() + # Show Main Window on First Run Experience or if on Linux + if args.config is None or system() not in ["Windows", "Darwin"]: + main_window.show() # Setup Signal Handlers signal.signal(signal.SIGINT, sigint_handler)