summaryrefslogtreecommitdiff
path: root/lib/chessh/ssh/screens/menu.ex
diff options
context:
space:
mode:
authorSimponic <loganhunt@simponic.xyz>2023-01-04 00:03:38 -0700
committerSimponic <loganhunt@simponic.xyz>2023-01-04 00:03:38 -0700
commit93ae544684b29db30c6c65a5ba5e7cb51972123c (patch)
tree70ea4e1c8fe43a60434d38ec44cb58a9499f3bbc /lib/chessh/ssh/screens/menu.ex
parent720a110c957a9ac1399ca3d2324b5b2cf8bbf3c6 (diff)
downloadchessh-93ae544684b29db30c6c65a5ba5e7cb51972123c.tar.gz
chessh-93ae544684b29db30c6c65a5ba5e7cb51972123c.zip
Create a Screen module behaviour, some ascii character arts, handle_input does stuff now
Diffstat (limited to 'lib/chessh/ssh/screens/menu.ex')
-rw-r--r--lib/chessh/ssh/screens/menu.ex79
1 files changed, 79 insertions, 0 deletions
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