Files
bDS2/lib/bds/desktop/menu_bar.ex

74 lines
1.8 KiB
Elixir

defmodule BDS.Desktop.MenuBar do
@moduledoc false
use Desktop.Menu
alias Desktop.Window
def groups(opts \\ []) do
dev_mode? = Keyword.get(opts, :dev_mode?, false)
[
%{id: :app, label: "App", items: [%{id: :about, label: "About"}]},
%{id: :file, label: "File", items: [%{id: :new_post, label: "New Post"}, %{id: :close_tab, label: "Close Tab"}]},
%{id: :edit, label: "Edit", items: [%{id: :undo, label: "Undo"}, %{id: :redo, label: "Redo"}]},
%{id: :view, label: "View", items: view_items(dev_mode?)},
%{id: :window, label: "Window", items: [%{id: :minimize, label: "Minimize"}]},
%{id: :help, label: "Help", items: [%{id: :documentation, label: "Documentation"}]}
]
end
@impl true
def mount(menu) do
{:ok,
Desktop.Menu.assign(
menu,
:groups,
groups(dev_mode?: Application.get_env(:bds, :dev_routes, false))
)}
end
@impl true
def render(assigns) do
~H"""
<menubar>
<%= for group <- @groups do %>
<menu label={group.label}>
<%= for item <- group.items do %>
<item onclick={Atom.to_string(item.id)}>{item.label}</item>
<% end %>
</menu>
<% end %>
</menubar>
"""
end
@impl true
def handle_event("quit", menu) do
Window.quit()
{:noreply, menu}
end
def handle_event(_, menu) do
{:noreply, menu}
end
@impl true
def handle_info(_, menu) do
{:noreply, menu}
end
defp view_items(dev_mode?) do
items = [
%{id: :toggle_sidebar, label: "Toggle Sidebar"},
%{id: :toggle_panel, label: "Toggle Panel"},
%{id: :toggle_assistant_sidebar, label: "Toggle Assistant Sidebar"}
]
if dev_mode? do
items ++ [%{id: :toggle_dev_tools, label: "Toggle Dev Tools"}]
else
items
end
end
end