Commit dc133f4e authored by Cage, Gregory's avatar Cage, Gregory
Browse files

Implement default exit callbacks for exit button

parent edb2e8bc
Loading
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -1588,13 +1588,13 @@ files = [

[[package]]
name = "nova-common"
version = "0.2.2"
version = "0.2.3"
description = "NOVA Common Project"
optional = false
python-versions = "<4.0,>=3.10"
groups = ["main"]
files = [
    {file = "nova_common-0.2.2-py3-none-any.whl", hash = "sha256:f306b846e487dda2d914c4d93dd949cc86a99242ba16602e7b94e9c44d7e4964"},
    {file = "nova_common-0.2.3-py3-none-any.whl", hash = "sha256:68089eee23e1dd292639d017bdd46aa556ee11793cff9aef8f11c470b46ff683"},
]

[package.dependencies]
+57 −16
Original line number Diff line number Diff line
"""Components used to control the lifecycle of a Themed Application."""

import asyncio
import logging
import sys
from typing import Any

import blinker
from trame.app import get_server
from trame.widgets import vuetify3 as vuetify
from trame_client.widgets import html

from nova.common.signals import Signal

logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)


class ExitButton:
    """Exit button for Trame Applications."""

    def __init__(self) -> None:
        self.create_ui()
    def __init__(self, exit_callback: Any = None, job_status_callback: Any = None) -> None:
        self.server = get_server(None, client_type="vue3")
        self.server.state.nova_kill_jobs_on_exit = True
        self.server.state.nova_kill_jobs_on_exit = False
        self.server.state.nova_show_exit_dialog = False
        self.server.state.nova_show_stop_jobs_on_exit_checkbox = False
        self.server.state.nova_running_jobs = []
        self.server.state.nova_show_exit_progress = False
        self.exit_application_callback = exit_callback if exit_callback else self.exit_application
        self.job_status_callback = job_status_callback if job_status_callback else self.get_all_running_jobs
        self.create_ui()

    def create_ui(self) -> None:
        with vuetify.VBtn(
@@ -27,34 +39,63 @@ class ExitButton:
            click=self.open_exit_dialog,
        ):
            with vuetify.VDialog(v_model="nova_show_exit_dialog", persistent="true"):
                with vuetify.VCard(classes="pa-4 justify-md-center ma-auto"):
                    vuetify.VCardText(
                with vuetify.VCard(classes="pa-4 ma-auto"):
                    vuetify.VCardTitle("Exit Application")
                    with vuetify.VCardText(
                        "Are you sure you want to exit this application?",
                        classes="text-h6",
                        variant="outlined",
                    ):
                        vuetify.VCheckbox(
                            v_model="nova_kill_jobs_on_exit",
                            label="Stop All Jobs On Exit.",
                            v_if="nova_running_jobs.length > 0",
                        )
                    vuetify.VCheckbox(v_model="nova_kill_jobs_on_exit", label="Stop All Jobs On Exit.")
                    with html.Div(classes="text-center"):
                        with vuetify.VList():
                            vuetify.VListSubheader("Running Jobs:", v_if="nova_running_jobs.length > 0")
                            vuetify.VListItem("{{ item }}", v_for="(item, index) in nova_running_jobs")
                    with vuetify.VCardActions(v_if="!nova_show_exit_progress"):
                        vuetify.VBtn(
                            "Exit App",
                            classes="mr-4",
                            click=self.exit_application,
                            click=self.exit_application_callback,
                            color="error",
                        )
                        vuetify.VBtn(
                            "Stay In App",
                            click=self.close_exit_dialog,
                        )
                    with vuetify.VCardActions(v_else=True):
                        vuetify.VCardText(
                            "Exiting Application...",
                            variant="outlined",
                        )
                        vuetify.VProgressCircular(indeterminate=True)

    def open_exit_dialog(self) -> None:
    async def open_exit_dialog(self) -> None:
        self.server.state.nova_show_exit_dialog = True
        await self.job_status_callback()

    def close_exit_dialog(self) -> None:
    async def close_exit_dialog(self) -> None:
        self.server.state.nova_show_exit_dialog = False

    async def get_all_running_jobs(self) -> None:
        get_tools_signal = blinker.signal(Signal.GET_ALL_TOOLS)
        response = get_tools_signal.send()
        try:
            self.server.state.nova_running_jobs = [tool.id for tool in response[0][1]]
            if len(self.server.state.nova_running_jobs) > 0:
                self.server.state.nova_show_stop_jobs_on_exit_checkbox = True
                self.server.state.nova_kill_jobs_on_exit = True
            else:
                self.server.state.nova_show_stop_jobs_on_exit_checkbox = False
        except Exception as e:
            logger.warning(f"Issue getting running jobs: {e}")

    async def exit_application(self) -> None:
        print(f"Closing App. Killing jobs: {self.server.state.nova_kill_jobs_on_exit}")

        if self.server.state.nova_kill_jobs_on_exit:
            self.server.state.nova_show_exit_progress = True
            await asyncio.sleep(2)
            stop_signal = blinker.signal(Signal.EXIT_SIGNAL)
            await stop_signal.send_async("nova-trame-exit")
        await self.server.stop()
            stop_signal.send()
        sys.exit(0)