fix: ai chat styling and some crashes

This commit is contained in:
2026-05-01 21:39:05 +02:00
parent b5ebea6ff2
commit f8b8ccabbd
11 changed files with 835 additions and 81 deletions

View File

@@ -71,6 +71,7 @@ defmodule BDS.Desktop.MainWindow do
frame ->
apply_restored_bounds(frame)
BDS.Desktop.Shutdown.install_handlers(frame)
schedule_persist()
{:noreply,

View File

@@ -2,6 +2,7 @@ defmodule BDS.Desktop.Menu do
@moduledoc false
use BDS.Desktop.MenuCompat
alias BDS.Desktop.Shutdown
alias Desktop.Window
@impl true
@@ -27,7 +28,7 @@ defmodule BDS.Desktop.Menu do
end
def handle_event("quit", menu) do
Window.quit()
Shutdown.request_quit()
{:noreply, menu}
end

View File

@@ -2,6 +2,7 @@ defmodule BDS.Desktop.MenuBar do
@moduledoc false
use BDS.Desktop.MenuCompat
alias BDS.Desktop.Shutdown
alias BDS.UI.Commands
alias BDS.UI.MenuBar, as: ShellMenuBar
alias Desktop.OS
@@ -50,7 +51,7 @@ defmodule BDS.Desktop.MenuBar do
@impl true
def handle_event("quit", menu) do
Window.quit()
Shutdown.request_quit()
{:noreply, menu}
end

View File

@@ -0,0 +1,92 @@
defmodule BDS.Desktop.Shutdown do
@moduledoc false
alias BDS.Desktop.MainWindow
alias Desktop.Window
@stop_delay_ms 100
@spec install_handlers(term()) :: :ok
def install_handlers(frame) do
:wx.set_env(Desktop.Env.wx_env())
_ = :wxFrame.disconnect(frame, :close_window)
:wxFrame.connect(frame, :close_window,
callback: &__MODULE__.close_window/2,
userData: self()
)
_ = :wxFrame.disconnect(frame, :command_menu_selected, id: Desktop.Wx.wxID_EXIT())
:wxFrame.connect(frame, :command_menu_selected,
id: Desktop.Wx.wxID_EXIT(),
callback: &__MODULE__.command_menu_selected/2
)
:ok
rescue
_error -> :ok
catch
:exit, _reason -> :ok
end
@spec request_quit() :: :ok
def request_quit do
case Application.get_env(:bds, :desktop_shutdown_module, __MODULE__) do
__MODULE__ ->
start_shutdown_task()
module when is_atom(module) ->
module.request_quit()
end
end
@spec close_window(tuple(), term()) :: :ok
def close_window(_event, close_event) do
if :wxCloseEvent.canVeto(close_event) do
:wxCloseEvent.veto(close_event)
end
request_quit()
end
@spec command_menu_selected(tuple(), term()) :: :ok
def command_menu_selected(_event, _command_event) do
request_quit()
end
defp start_shutdown_task do
Task.start(fn ->
close_main_window()
Process.sleep(@stop_delay_ms)
System.stop(0)
end)
:ok
end
defp close_main_window do
with frame when not is_nil(frame) <- main_frame() do
:wx.set_env(Desktop.Env.wx_env())
if :wxWindow.isShown(frame) do
:wxWindow.hide(frame)
end
:wxWindow.destroy(frame)
else
_other -> :ok
end
rescue
_error -> :ok
catch
:exit, _reason -> :ok
end
defp main_frame do
Window.frame(MainWindow.window_id())
catch
:exit, _reason -> nil
end
end