Selectable menu
This commit is contained in:
parent
b1b62f154a
commit
9f56b735c6
@ -24,12 +24,19 @@ defmodule Chessh.SSH.Client do
|
|||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
def init([%State{} = state]) do
|
def init([%State{} = state]) do
|
||||||
{:ok, screen_pid} =
|
send(self(), {:set_screen_process, Chessh.SSH.Client.Menu, %Chessh.SSH.Client.Menu.State{}})
|
||||||
GenServer.start_link(Chessh.SSH.Client.Board, [
|
{:ok, state}
|
||||||
%Chessh.SSH.Client.Board.State{client_pid: self()}
|
end
|
||||||
])
|
|
||||||
|
|
||||||
{:ok, %{state | screen_processes: [screen_pid]}}
|
@impl true
|
||||||
|
def handle_info(
|
||||||
|
{:set_screen_process, module, screen_state},
|
||||||
|
%State{width: width, height: height, screen_processes: screen_processes} = state
|
||||||
|
) do
|
||||||
|
{:ok, new_screen_pid} = GenServer.start_link(module, [%{screen_state | client_pid: self()}])
|
||||||
|
send(new_screen_pid, {:render, width, height})
|
||||||
|
|
||||||
|
{:noreply, %{state | screen_processes: [new_screen_pid | screen_processes]}}
|
||||||
end
|
end
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
@ -60,13 +67,20 @@ defmodule Chessh.SSH.Client do
|
|||||||
|
|
||||||
def handle(
|
def handle(
|
||||||
{:data, data},
|
{:data, data},
|
||||||
%State{width: width, height: height, screen_processes: [screen_pid | _]} = state
|
%State{width: width, height: height, screen_processes: [screen_pid | rest_processes]} =
|
||||||
|
state
|
||||||
) do
|
) do
|
||||||
action = keymap(data)
|
case keymap(data) do
|
||||||
|
:quit ->
|
||||||
if action == :quit do
|
|
||||||
{:stop, :normal, state}
|
{:stop, :normal, state}
|
||||||
else
|
|
||||||
|
:previous_screen ->
|
||||||
|
Logger.debug(inspect(rest_processes))
|
||||||
|
Process.exit(screen_pid, :kill)
|
||||||
|
|
||||||
|
{:noreply, %State{state | screen_processes: rest_processes}}
|
||||||
|
|
||||||
|
action ->
|
||||||
send(screen_pid, {:input, width, height, action})
|
send(screen_pid, {:input, width, height, action})
|
||||||
{:noreply, state}
|
{:noreply, state}
|
||||||
end
|
end
|
||||||
@ -109,6 +123,8 @@ defmodule Chessh.SSH.Client do
|
|||||||
# Exit keys - C-c and C-d
|
# Exit keys - C-c and C-d
|
||||||
<<3>> -> :quit
|
<<3>> -> :quit
|
||||||
<<4>> -> :quit
|
<<4>> -> :quit
|
||||||
|
# C-b
|
||||||
|
<<2>> -> :previous_screen
|
||||||
# Arrow keys
|
# Arrow keys
|
||||||
"\e[A" -> :up
|
"\e[A" -> :up
|
||||||
"\e[B" -> :down
|
"\e[B" -> :down
|
||||||
|
@ -24,9 +24,11 @@ defmodule Chessh.SSH.Client.Menu do
|
|||||||
end
|
end
|
||||||
|
|
||||||
@options [
|
@options [
|
||||||
{"Option 1", {}},
|
{"Start A Game", {Chessh.SSH.Client.Board, %Chessh.SSH.Client.Board.State{}}},
|
||||||
{"Option 2", {}},
|
{"Join A Game", {}},
|
||||||
{"Option 3", {}}
|
{"My Games", {}},
|
||||||
|
{"Settings", {}},
|
||||||
|
{"Help", {}}
|
||||||
]
|
]
|
||||||
|
|
||||||
def input(width, height, action, %State{client_pid: client_pid, selected: selected} = state) do
|
def input(width, height, action, %State{client_pid: client_pid, selected: selected} = state) do
|
||||||
@ -41,15 +43,19 @@ defmodule Chessh.SSH.Client.Menu do
|
|||||||
:down ->
|
:down ->
|
||||||
%State{state | selected: Utils.wrap_around(selected, 1, length(@options))}
|
%State{state | selected: Utils.wrap_around(selected, 1, length(@options))}
|
||||||
|
|
||||||
# :return ->
|
:return ->
|
||||||
# {_, new_state} = Enum.at(@options, selected)
|
{_option, {module, state}} = Enum.at(@options, selected)
|
||||||
# new_state
|
send(client_pid, {:set_screen_process, module, state})
|
||||||
|
state
|
||||||
|
|
||||||
_ ->
|
_ ->
|
||||||
state
|
state
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if !(action == :return) do
|
||||||
send(client_pid, {:send_to_ssh, render_state(width, height, new_state)})
|
send(client_pid, {:send_to_ssh, render_state(width, height, new_state)})
|
||||||
|
end
|
||||||
|
|
||||||
new_state
|
new_state
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user