Files
bDS2/lib/bds/scripting/capabilities/app_shell.ex
2026-05-01 17:49:50 +02:00

153 lines
3.8 KiB
Elixir

defmodule BDS.Scripting.Capabilities.AppShell do
@moduledoc false
import BDS.Scripting.Capabilities.Util
alias BDS.Desktop.FolderPicker
alias BDS.Desktop.MenuBar
@compiled_env Application.compile_env(:bds, :current_env, Mix.env())
def copy_to_clipboard(text, opts) do
case Keyword.get(opts, :copy_to_clipboard) do
callback when is_function(callback, 1) -> callback.(string_or_nil(text) || "")
_other -> do_copy_to_clipboard(text)
end
end
defp do_copy_to_clipboard(text) do
if test_mode?() do
true
else
command = string_or_nil(text)
case :os.type() do
{:unix, :darwin} ->
match?({_output, 0}, System.cmd("pbcopy", [], input: command, stderr_to_stdout: true))
{:unix, _other} ->
match?(
{_output, 0},
System.cmd("xclip", ["-selection", "clipboard"],
input: command,
stderr_to_stdout: true
)
)
{:win32, _other} ->
match?(
{_output, 0},
System.cmd("cmd", ["/c", "clip"], input: command, stderr_to_stdout: true)
)
end
end
rescue
_error -> false
end
def blogmark_bookmarklet do
"javascript:(()=>{const t=encodeURIComponent(document.title||'');const u=encodeURIComponent(location.href||'');location.href='bds://new-post?title='+t+'&url='+u;})();"
end
def title_bar_metrics(opts) do
case Keyword.get(opts, :title_bar_metrics) do
callback when is_function(callback, 0) -> callback.()
_other -> do_title_bar_metrics()
end
end
defp do_title_bar_metrics do
case :os.type() do
{:unix, :darwin} -> %{macos_left_inset: 72}
_other -> nil
end
end
def notify_renderer_ready(opts) do
case Keyword.get(opts, :notify_renderer_ready) do
callback when is_function(callback, 0) -> callback.()
_other -> true
end
end
def open_folder(folder_path, opts) do
case Keyword.get(opts, :open_folder) do
callback when is_function(callback, 1) -> callback.(string_or_nil(folder_path))
_other -> do_open_folder(folder_path)
end
end
defp do_open_folder(folder_path) do
if test_mode?() do
""
else
case shell_open_system_path(string_or_nil(folder_path)) do
:ok -> ""
{:error, reason} -> inspect(reason)
end
end
end
def select_folder(title, opts) do
case Keyword.get(opts, :select_folder) do
callback when is_function(callback, 1) -> callback.(string_or_nil(title) || "Select Folder")
_other -> do_select_folder(title)
end
end
defp do_select_folder(title) do
if test_mode?() do
nil
else
case FolderPicker.choose_directory(string_or_nil(title) || "Select Folder") do
{:ok, path} -> path
:cancel -> nil
{:error, _reason} -> nil
end
end
end
def set_preview_post_target(post_id) do
:persistent_term.put(
{BDS.Scripting.Capabilities, :preview_post_target},
string_or_nil(post_id)
)
true
end
def show_item_in_folder(item_path, opts) do
callback = Keyword.get(opts, :show_item_in_folder)
cond do
is_function(callback, 1) -> callback.(string_or_nil(item_path))
test_mode?() -> :ok
true -> _ = shell_reveal_system_path(string_or_nil(item_path))
end
nil
end
def trigger_menu_action(action, opts) do
callback = Keyword.get(opts, :trigger_menu_action)
cond do
is_function(callback, 1) -> callback.(string_or_nil(action))
test_mode?() -> :ok
true -> _ = MenuBar.handle_event(string_or_nil(action), nil)
end
nil
rescue
_error -> nil
end
def test_mode? do
Application.get_env(:bds, :test_mode, false) or current_env() == :test
end
def current_env do
Application.get_env(:bds, :current_env_override) || @compiled_env
end
end