diff options
Diffstat (limited to 'lib/chessh/ssh/screens')
-rw-r--r-- | lib/chessh/ssh/screens/board.ex | 15 | ||||
-rw-r--r-- | lib/chessh/ssh/screens/menu.ex | 79 | ||||
-rw-r--r-- | lib/chessh/ssh/screens/screen.ex | 15 |
3 files changed, 109 insertions, 0 deletions
diff --git a/lib/chessh/ssh/screens/board.ex b/lib/chessh/ssh/screens/board.ex new file mode 100644 index 0000000..7b22052 --- /dev/null +++ b/lib/chessh/ssh/screens/board.ex @@ -0,0 +1,15 @@ +defmodule Chessh.SSH.Client.Board do + use Chessh.SSH.Client.Screen + alias Chessh.SSH.Client.State + + def render(%State{} = _state) do + @ascii_chars["pieces"]["white"]["knight"] + end + + def handle_input(action, state) do + case action do + "q" -> state + _ -> state + end + end +end diff --git a/lib/chessh/ssh/screens/menu.ex b/lib/chessh/ssh/screens/menu.ex new file mode 100644 index 0000000..22aba85 --- /dev/null +++ b/lib/chessh/ssh/screens/menu.ex @@ -0,0 +1,79 @@ +defmodule Chessh.SSH.Client.Menu do + alias Chessh.SSH.Client + alias Chessh.Utils + alias IO.ANSI + + require Logger + + defmodule State do + defstruct y: 0, + x: 0 + end + + use Chessh.SSH.Client.Screen + + @logo " Simponic's + + dP MP\"\"\"\"\"\"`MM MP\"\"\"\"\"\"`MM M\"\"MMMMM\"\"MM + 88 M mmmmm..M M mmmmm..M M MMMMM MM +.d8888b. 88d888b. .d8888b. M. `YM M. `YM M `M +88' `\"\" 88' `88 88ooood8 MMMMMMM. M MMMMMMM. M M MMMMM MM +88. ... 88 88 88. ... M. .MMM' M M. .MMM' M M MMMMM MM +`88888P' dP dP `88888P' Mb. .dM Mb. .dM M MMMMM MM + MMMMMMMMMMM MMMMMMMMMMM MMMMMMMMMMMM" + + def render(%Client.State{ + width: width, + height: height, + state_stack: [{_this_module, %State{y: y, x: x}} | _tail] + }) do + {logo_width, logo_height} = Utils.text_dim(@logo) + + split = String.split(@logo, "\n") + + Enum.flat_map( + Enum.zip(0..(length(split) - 1), split), + fn {i, line} -> + [ + ANSI.cursor(div(height - logo_height, 2) + i + y, div(width - logo_width, 2) + x), + "#{line}\n" + ] + end + ) + end + + def handle_input( + data, + %Client.State{state_stack: [{this_module, %State{y: y, x: x} = screen_state} | tail]} = + state + ) do + case data do + :left -> + %Client.State{ + state + | state_stack: [{this_module, %State{screen_state | x: x - 1}} | tail] + } + + :right -> + %Client.State{ + state + | state_stack: [{this_module, %State{screen_state | x: x + 1}} | tail] + } + + :up -> + %Client.State{ + state + | state_stack: [{this_module, %State{screen_state | y: y - 1}} | tail] + } + + :down -> + %Client.State{ + state + | state_stack: [{this_module, %State{screen_state | y: y + 1}} | tail] + } + + _ -> + state + end + end +end diff --git a/lib/chessh/ssh/screens/screen.ex b/lib/chessh/ssh/screens/screen.ex new file mode 100644 index 0000000..be6e00e --- /dev/null +++ b/lib/chessh/ssh/screens/screen.ex @@ -0,0 +1,15 @@ +defmodule Chessh.SSH.Client.Screen do + @callback render(state :: Chessh.SSH.Client.State.t() | any()) :: any() + @callback handle_input(action :: any(), state :: Chessh.SSH.Client.State.t()) :: + Chessh.SSH.Client.State.t() + + defmacro __using__(_) do + quote do + @behaviour Chessh.SSH.Client.Screen + + @ascii_chars Application.compile_env!(:chessh, :ascii_chars_json_file) + |> File.read!() + |> Jason.decode!() + end + end +end |