chore: next big god module down
Co-authored-by: Copilot <copilot@github.com>
This commit is contained in:
134
lib/bds/scripting/capabilities/app_shell.ex
Normal file
134
lib/bds/scripting/capabilities/app_shell.ex
Normal file
@@ -0,0 +1,134 @@
|
||||
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
|
||||
Reference in New Issue
Block a user