From 3b9ba42a1c4afb3ec63dc72698912ab65a0c94d8 Mon Sep 17 00:00:00 2001 From: nsensfel Date: Mon, 23 Oct 2017 16:47:53 +0200 Subject: Adds tabs to the footer menu, no CSS for it though. --- src/battlemap/src/Event.elm | 3 + src/battlemap/src/UI.elm | 70 ++++++++++++++-- src/battlemap/src/Update.elm | 3 + src/battlemap/src/Util/Html.elm | 6 ++ src/battlemap/src/View.elm | 18 ++--- src/battlemap/src/View/Battlemap.elm | 6 +- src/battlemap/src/View/Controls.elm | 56 ------------- src/battlemap/src/View/Footer.elm | 38 +++++++++ src/battlemap/src/View/Footer/ManualControls.elm | 50 ++++++++++++ src/battlemap/src/View/Footer/TabMenu.elm | 94 ++++++++++++++++++++++ .../src/View/Footer/TabMenu/Characters.elm | 29 +++++++ src/battlemap/src/View/Footer/TabMenu/Settings.elm | 42 ++++++++++ src/battlemap/src/View/Footer/TabMenu/Status.elm | 74 +++++++++++++++++ src/battlemap/src/View/Header.elm | 24 ++++++ src/battlemap/src/View/Status.elm | 60 -------------- 15 files changed, 440 insertions(+), 133 deletions(-) create mode 100644 src/battlemap/src/Util/Html.elm delete mode 100644 src/battlemap/src/View/Controls.elm create mode 100644 src/battlemap/src/View/Footer.elm create mode 100644 src/battlemap/src/View/Footer/ManualControls.elm create mode 100644 src/battlemap/src/View/Footer/TabMenu.elm create mode 100644 src/battlemap/src/View/Footer/TabMenu/Characters.elm create mode 100644 src/battlemap/src/View/Footer/TabMenu/Settings.elm create mode 100644 src/battlemap/src/View/Footer/TabMenu/Status.elm create mode 100644 src/battlemap/src/View/Header.elm delete mode 100644 src/battlemap/src/View/Status.elm diff --git a/src/battlemap/src/Event.elm b/src/battlemap/src/Event.elm index 96d4dfa..c56f8cf 100644 --- a/src/battlemap/src/Event.elm +++ b/src/battlemap/src/Event.elm @@ -5,9 +5,12 @@ import Battlemap.Location import Character +import UI + type Type = DirectionRequested Battlemap.Direction.Type | TileSelected Battlemap.Location.Ref | CharacterSelected Character.Ref | TurnEnded | ScaleChangeRequested Float + | TabSelected UI.Tab diff --git a/src/battlemap/src/UI.elm b/src/battlemap/src/UI.elm index 5e0718e..7e21a36 100644 --- a/src/battlemap/src/UI.elm +++ b/src/battlemap/src/UI.elm @@ -3,29 +3,51 @@ module UI exposing Type, Tab(..), default, + -- Zoom get_zoom_level, reset_zoom_level, - mod_zoom_level + mod_zoom_level, + -- Tab + try_getting_displayed_tab, + set_displayed_tab, + reset_displayed_tab, + to_string, + get_all_tabs, + -- Manual Controls + has_manual_controls_enabled ) +-------------------------------------------------------------------------------- +-- TYPES ----------------------------------------------------------------------- +-------------------------------------------------------------------------------- +type Tab = + StatusTab + | CharactersTab + | SettingsTab + type alias Type = { zoom_level : Float, - show_manual_controls : Bool + show_manual_controls : Bool, + displayed_tab : (Maybe Tab) } -type Tab = - NoTab - | StatusTab - | SettingsTab +-------------------------------------------------------------------------------- +-- LOCAL ----------------------------------------------------------------------- +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +-- EXPORTED -------------------------------------------------------------------- +-------------------------------------------------------------------------------- default : Type default = { zoom_level = 1.0, - show_manual_controls = True + show_manual_controls = True, + displayed_tab = Nothing } +-- Zoom ------------------------------------------------------------------------ get_zoom_level : Type -> Float get_zoom_level ui = ui.zoom_level @@ -34,3 +56,37 @@ reset_zoom_level ui = {ui | zoom_level = 1.0} mod_zoom_level : Type -> Float -> Type mod_zoom_level ui mod = {ui | zoom_level = (mod * ui.zoom_level)} + +-- Tab ------------------------------------------------------------------------- +try_getting_displayed_tab : Type -> (Maybe Tab) +try_getting_displayed_tab ui = ui.displayed_tab + +set_displayed_tab : Type -> Tab -> Type +set_displayed_tab ui tab = {ui | displayed_tab = (Just tab)} + +reset_displayed_tab : Type -> Type +reset_displayed_tab ui = {ui | displayed_tab = Nothing} + +to_string : Tab -> String +to_string tab = + case tab of + StatusTab -> "Status" + CharactersTab -> "Characters" + SettingsTab -> "Settings" + +get_all_tabs : (List Tab) +get_all_tabs = [StatusTab, CharactersTab, SettingsTab] +-- ManualControls -------------------------------------------------------------- +has_manual_controls_enabled : Type -> Bool +has_manual_controls_enabled ui = ui.show_manual_controls + +toggle_manual_controls : Type -> Type +toggle_manual_controls ui = + if (ui.show_manual_controls) + then + {ui | show_manual_controls = False} + else + {ui | show_manual_controls = True} + +set_enable_toggle_manual_controls : Type -> Bool -> Type +set_enable_toggle_manual_controls ui val = {ui | show_manual_controls = val} diff --git a/src/battlemap/src/Update.elm b/src/battlemap/src/Update.elm index 6466ddf..60d1f25 100644 --- a/src/battlemap/src/Update.elm +++ b/src/battlemap/src/Update.elm @@ -34,3 +34,6 @@ update event model = ({model | ui = (UI.reset_zoom_level model.ui)}, Cmd.none) else ({model | ui = (UI.mod_zoom_level model.ui mod)}, Cmd.none) + + (Event.TabSelected tab) -> + ({model | ui = (UI.set_displayed_tab model.ui tab)}, Cmd.none) diff --git a/src/battlemap/src/Util/Html.elm b/src/battlemap/src/Util/Html.elm new file mode 100644 index 0000000..42eadba --- /dev/null +++ b/src/battlemap/src/Util/Html.elm @@ -0,0 +1,6 @@ +module Util.Html exposing (nothing) + +import Html + +nothing : (Html.Html a) +nothing = (Html.text "") diff --git a/src/battlemap/src/View.elm b/src/battlemap/src/View.elm index 1b84971..4e23561 100644 --- a/src/battlemap/src/View.elm +++ b/src/battlemap/src/View.elm @@ -1,19 +1,24 @@ module View exposing (view) +-- Elm ------------------------------------------------------------------------- import Dict import Html import Html.Attributes +-- Battlemap ------------------------------------------------------------------- import UI import View.Battlemap -import View.Controls -import View.Status +import View.Header +import View.Footer import Event import Model +-------------------------------------------------------------------------------- +-- EXPORTED -------------------------------------------------------------------- +-------------------------------------------------------------------------------- view : Model.Type -> (Html.Html Event.Type) view model = (Html.div @@ -21,12 +26,7 @@ view model = (Html.Attributes.class "battlemap") ] [ - (Html.div - [ - (Html.Attributes.class "battlemap-controls") - ] - (View.Controls.view) - ), + (View.Header.get_html model), (Html.div [ (Html.Attributes.class "battlemap-container") @@ -39,6 +39,6 @@ view model = ) ] ), - (View.Status.view model) + (View.Footer.get_html model) ] ) diff --git a/src/battlemap/src/View/Battlemap.elm b/src/battlemap/src/View/Battlemap.elm index 071cce4..450a392 100644 --- a/src/battlemap/src/View/Battlemap.elm +++ b/src/battlemap/src/View/Battlemap.elm @@ -1,5 +1,6 @@ module View.Battlemap exposing (get_html) +-- Elm ------------------------------------------------------------------------- import Array import List @@ -9,6 +10,7 @@ import Html.Attributes import Html.Events import Html.Lazy +-- Battlemap ------------------------------------------------------------------ import Battlemap import Battlemap.Tile @@ -16,6 +18,8 @@ import Character import Constants.UI +import Util.Html + import View.Battlemap.Tile import View.Battlemap.Navigator @@ -106,6 +110,6 @@ get_html battlemap scale characters = (Just nav_summary) -> (View.Battlemap.Navigator.get_html nav_summary) - Nothing -> [(Html.text "")] + Nothing -> [(Util.Html.nothing)] ) ) diff --git a/src/battlemap/src/View/Controls.elm b/src/battlemap/src/View/Controls.elm deleted file mode 100644 index a664ffe..0000000 --- a/src/battlemap/src/View/Controls.elm +++ /dev/null @@ -1,56 +0,0 @@ -module View.Controls exposing (view) - -import Html -import Html.Events - -import Battlemap.Direction - -import Event - --------------------------------------------------------------------------------- --- LOCAL ----------------------------------------------------------------------- --------------------------------------------------------------------------------- -direction_button : Battlemap.Direction.Type -> String -> (Html.Html Event.Type) -direction_button dir label = - (Html.button - [ - (Html.Events.onClick - (Event.DirectionRequested dir) - ) - ] - [ (Html.text label) ] - ) - -end_turn_button : (Html.Html Event.Type) -end_turn_button = - (Html.button - [ (Html.Events.onClick Event.TurnEnded) ] - [ (Html.text "End Turn") ] - ) - -scale_button : Float -> String -> (Html.Html Event.Type) -scale_button mod label = - (Html.button - [ - (Html.Events.onClick - (Event.ScaleChangeRequested mod) - ) - ] - [ (Html.text label) ] - ) - --------------------------------------------------------------------------------- --- EXPORTED -------------------------------------------------------------------- --------------------------------------------------------------------------------- -view : (List (Html.Html Event.Type)) -view = - [ - (direction_button Battlemap.Direction.Left "Left"), - (direction_button Battlemap.Direction.Down "Down"), - (direction_button Battlemap.Direction.Up "Up"), - (direction_button Battlemap.Direction.Right "Right"), - (end_turn_button), - (scale_button (0.75) "Zoom -"), - (scale_button 0 "Zoom Reset"), - (scale_button (1.15) "Zoom +") - ] diff --git a/src/battlemap/src/View/Footer.elm b/src/battlemap/src/View/Footer.elm new file mode 100644 index 0000000..3b4d8ef --- /dev/null +++ b/src/battlemap/src/View/Footer.elm @@ -0,0 +1,38 @@ +module View.Footer exposing (get_html) + +-- Elm ------------------------------------------------------------------------- +import Html +import Html.Attributes + +-- Battlemap ------------------------------------------------------------------- +import Event + +import Model + +import Util.Html + +import UI + +import View.Footer.TabMenu +import View.Footer.ManualControls + +-------------------------------------------------------------------------------- +-- EXPORTED -------------------------------------------------------------------- +-------------------------------------------------------------------------------- +get_html : Model.Type -> (Html.Html Event.Type) +get_html model = + (Html.div + [ + (Html.Attributes.class "battlemap-footer") + ] + [ + (View.Footer.TabMenu.get_html model), + ( + if (UI.has_manual_controls_enabled model.ui) + then + (View.Footer.ManualControls.get_html) + else + (Util.Html.nothing) + ) + ] + ) diff --git a/src/battlemap/src/View/Footer/ManualControls.elm b/src/battlemap/src/View/Footer/ManualControls.elm new file mode 100644 index 0000000..83f880f --- /dev/null +++ b/src/battlemap/src/View/Footer/ManualControls.elm @@ -0,0 +1,50 @@ +module View.Footer.ManualControls exposing (get_html) + +-- Elm ------------------------------------------------------------------------- +import Html +import Html.Attributes +import Html.Events + +-- Battlemap ------------------------------------------------------------------- +import Battlemap.Direction + +import Event + +-------------------------------------------------------------------------------- +-- LOCAL ----------------------------------------------------------------------- +-------------------------------------------------------------------------------- +direction_button : Battlemap.Direction.Type -> String -> (Html.Html Event.Type) +direction_button dir label = + (Html.button + [ + (Html.Events.onClick + (Event.DirectionRequested dir) + ) + ] + [ (Html.text label) ] + ) + +end_turn_button : (Html.Html Event.Type) +end_turn_button = + (Html.button + [ (Html.Events.onClick Event.TurnEnded) ] + [ (Html.text "End Turn") ] + ) + +-------------------------------------------------------------------------------- +-- EXPORTED -------------------------------------------------------------------- +-------------------------------------------------------------------------------- +get_html : (Html.Html Event.Type) +get_html = + (Html.div + [ + (Html.Attributes.class "battlemap-footer-manualcontrols") + ] + [ + (direction_button Battlemap.Direction.Left "Left"), + (direction_button Battlemap.Direction.Down "Down"), + (direction_button Battlemap.Direction.Up "Up"), + (direction_button Battlemap.Direction.Right "Right"), + (end_turn_button) + ] + ) diff --git a/src/battlemap/src/View/Footer/TabMenu.elm b/src/battlemap/src/View/Footer/TabMenu.elm new file mode 100644 index 0000000..73edf23 --- /dev/null +++ b/src/battlemap/src/View/Footer/TabMenu.elm @@ -0,0 +1,94 @@ +module View.Footer.TabMenu exposing (get_html) + +-- Elm ------------------------------------------------------------------------- +import Html +import Html.Attributes +import Html.Events + +-- Battlemap ------------------------------------------------------------------- +import Event + +import Model + +import UI + +import View.Footer.TabMenu.Characters +import View.Footer.TabMenu.Status +import View.Footer.TabMenu.Settings + +-------------------------------------------------------------------------------- +-- LOCAL ----------------------------------------------------------------------- +-------------------------------------------------------------------------------- +get_basic_button_html : UI.Tab -> (Html.Html Event.Type) +get_basic_button_html tab = + (Html.button + [ (Html.Events.onClick (Event.TabSelected tab)) ] + [ (Html.text (UI.to_string tab)) ] + ) + +get_menu_button_html : UI.Tab -> UI.Tab -> (Html.Html Event.Type) +get_menu_button_html selected_tab tab = + (Html.button + ( + if (tab == selected_tab) + then + [ (Html.Attributes.disabled True) ] + else + [ (Html.Events.onClick (Event.TabSelected tab)) ] + ) + [ (Html.text (UI.to_string tab)) ] + ) + +get_active_tab_selector_html : UI.Tab -> (Html.Html Event.Type) +get_active_tab_selector_html selected_tab = + (Html.div + [ + (Html.Attributes.class "battlemap-footer-tabmenu-selector") + ] + (List.map (get_menu_button_html selected_tab) (UI.get_all_tabs)) + ) + +get_inactive_tab_selector_html : (Html.Html Event.Type) +get_inactive_tab_selector_html = + (Html.div + [ + (Html.Attributes.class "battlemap-footer-tabmenu-selector") + ] + (List.map (get_basic_button_html) (UI.get_all_tabs)) + ) + +-------------------------------------------------------------------------------- +-- EXPORTED -------------------------------------------------------------------- +-------------------------------------------------------------------------------- +get_html : Model.Type -> (Html.Html Event.Type) +get_html model = + (Html.div + [ + (Html.Attributes.class "battlemap-footer-tabmenu") + ] + ( + let + displayed_tab = (UI.try_getting_displayed_tab model.ui) + in + case displayed_tab of + (Just UI.StatusTab) -> + [ + (get_active_tab_selector_html UI.StatusTab), + (View.Footer.TabMenu.Status.get_html model) + ] + + (Just UI.CharactersTab) -> + [ + (get_active_tab_selector_html UI.CharactersTab), + (View.Footer.TabMenu.Characters.get_html model) + ] + + (Just UI.SettingsTab) -> + [ + (get_active_tab_selector_html UI.SettingsTab), + (View.Footer.TabMenu.Settings.get_html model) + ] + + Nothing -> [(get_inactive_tab_selector_html)] + ) + ) diff --git a/src/battlemap/src/View/Footer/TabMenu/Characters.elm b/src/battlemap/src/View/Footer/TabMenu/Characters.elm new file mode 100644 index 0000000..2929dee --- /dev/null +++ b/src/battlemap/src/View/Footer/TabMenu/Characters.elm @@ -0,0 +1,29 @@ +module View.Footer.TabMenu.Characters exposing (get_html) + +-- Elm ------------------------------------------------------------------------- +import Html +import Html.Attributes +import Html.Events + +-- Battlemap ------------------------------------------------------------------- +import Event + +import Model + +-------------------------------------------------------------------------------- +-- LOCAL ----------------------------------------------------------------------- +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +-- EXPORTED -------------------------------------------------------------------- +-------------------------------------------------------------------------------- +get_html : Model.Type -> (Html.Html Event.Type) +get_html model = + (Html.div + [ + (Html.Attributes.class "battlemap-footer-tabmenu-content"), + (Html.Attributes.class "battlemap-footer-tabmenu-content-characters") + ] + [ + (Html.text "Not implemented yet.") + ] + ) diff --git a/src/battlemap/src/View/Footer/TabMenu/Settings.elm b/src/battlemap/src/View/Footer/TabMenu/Settings.elm new file mode 100644 index 0000000..f11fde0 --- /dev/null +++ b/src/battlemap/src/View/Footer/TabMenu/Settings.elm @@ -0,0 +1,42 @@ +module View.Footer.TabMenu.Settings exposing (get_html) + +-- Elm ------------------------------------------------------------------------- +import Html +import Html.Attributes +import Html.Events + +-- Battlemap ------------------------------------------------------------------- +import Event + +import Model + +-------------------------------------------------------------------------------- +-- LOCAL ----------------------------------------------------------------------- +-------------------------------------------------------------------------------- +scale_button : Float -> String -> (Html.Html Event.Type) +scale_button mod label = + (Html.button + [ + (Html.Events.onClick + (Event.ScaleChangeRequested mod) + ) + ] + [ (Html.text label) ] + ) + +-------------------------------------------------------------------------------- +-- EXPORTED -------------------------------------------------------------------- +-------------------------------------------------------------------------------- +get_html : Model.Type -> (Html.Html Event.Type) +get_html model = + (Html.div + [ + (Html.Attributes.class "battlemap-footer-tabmenu-content"), + (Html.Attributes.class "battlemap-footer-tabmenu-content-settings") + ] + [ + (scale_button (0.75) "Zoom -"), + (scale_button 0 "Zoom Reset"), + (scale_button (1.15) "Zoom +") + ] + ) diff --git a/src/battlemap/src/View/Footer/TabMenu/Status.elm b/src/battlemap/src/View/Footer/TabMenu/Status.elm new file mode 100644 index 0000000..3bb87c3 --- /dev/null +++ b/src/battlemap/src/View/Footer/TabMenu/Status.elm @@ -0,0 +1,74 @@ +module View.Footer.TabMenu.Status exposing (get_html) + +-- Elm ------------------------------------------------------------------------- +import Dict + +import Html +import Html.Attributes + +-- Battlemap ------------------------------------------------------------------- +import Battlemap +import Character + +import Error +import Event +import Model + +-------------------------------------------------------------------------------- +-- LOCAL ----------------------------------------------------------------------- +-------------------------------------------------------------------------------- +moving_character_text : Model.Type -> String +moving_character_text model = + case model.selection of + (Model.SelectedCharacter char_id) -> + case (Dict.get char_id model.characters) of + Nothing -> "Error: Unknown character selected." + (Just char) -> + ( + "Controlling " + ++ char.name + ++ ": " + ++ (toString + (Battlemap.get_navigator_remaining_points + model.battlemap + ) + ) + ++ "/" + ++ (toString (Character.get_movement_points char)) + ++ " movement points remaining." + ) + + _ -> "Error: model.selection does not match its state." + +-------------------------------------------------------------------------------- +-- EXPORTED -------------------------------------------------------------------- +-------------------------------------------------------------------------------- +get_html : Model.Type -> (Html.Html Event.Type) +get_html model = + (Html.div + [ + (Html.Attributes.class "battlemap-footer-tabmenu-content"), + (Html.Attributes.class "battlemap-footer-tabmenu-content-status") + ] + [ + (Html.text + ( + (case model.state of + Model.Default -> "Click on a character to control it." + Model.FocusingTile -> "Error: Unimplemented." + Model.MovingCharacterWithButtons -> + (moving_character_text model) + + Model.MovingCharacterWithClick -> + (moving_character_text model) + ) + ++ " " + ++ + (case model.error of + Nothing -> "" + (Just error) -> (Error.to_string error) + ) + ) + ) + ] + ) diff --git a/src/battlemap/src/View/Header.elm b/src/battlemap/src/View/Header.elm new file mode 100644 index 0000000..3a86741 --- /dev/null +++ b/src/battlemap/src/View/Header.elm @@ -0,0 +1,24 @@ +module View.Header exposing (get_html) + +-- Elm ------------------------------------------------------------------------- +import Html +import Html.Attributes + +-- Battlemap ------------------------------------------------------------------- +import Event + +import Model + +-------------------------------------------------------------------------------- +-- EXPORTED -------------------------------------------------------------------- +-------------------------------------------------------------------------------- +get_html : Model.Type -> (Html.Html Event.Type) +get_html model = + (Html.div + [ + (Html.Attributes.class "battlemap-header") + ] + [ + (Html.text "Tacticians Online - Development Branch") + ] + ) diff --git a/src/battlemap/src/View/Status.elm b/src/battlemap/src/View/Status.elm deleted file mode 100644 index 8986590..0000000 --- a/src/battlemap/src/View/Status.elm +++ /dev/null @@ -1,60 +0,0 @@ -module View.Status exposing (view) - -import Dict - -import Html -import Html.Attributes - -import Battlemap -import Character - -import Error -import Event -import Model - -moving_character_text : Model.Type -> String -moving_character_text model = - case model.selection of - (Model.SelectedCharacter char_id) -> - case (Dict.get char_id model.characters) of - Nothing -> "Error: Unknown character selected." - (Just char) -> - ( - "Controlling " - ++ char.name - ++ ": " - ++ (toString - (Battlemap.get_navigator_remaining_points - model.battlemap - ) - ) - ++ "/" - ++ (toString (Character.get_movement_points char)) - ++ " movement points remaining." - ) - _ -> "Error: model.selection does not match its state." - -view : Model.Type -> (Html.Html Event.Type) -view model = - (Html.div - [ - (Html.Attributes.class "battlemap-status") - ] - [ - (Html.text - ( - (case model.state of - Model.Default -> "Click on a character to control it." - Model.MovingCharacterWithButtons -> (moving_character_text model) - Model.MovingCharacterWithClick -> (moving_character_text model) - Model.FocusingTile -> "Error: Unimplemented." - ) - ++ " " ++ - (case model.error of - Nothing -> "" - (Just error) -> (Error.to_string error) - ) - ) - ) - ] - ) -- cgit v1.2.3-70-g09d2