License | BSD-3-Clause |
---|---|
Safe Haskell | Safe-Inferred |
Language | Haskell2010 |
Application state for the brick
-based Swarm TUI.
Synopsis
- data AppEvent
- newtype WebCommand = RunWebCode Text
- data FocusablePanel
- data Name
- = FocusablePanel FocusablePanel
- | WorldEditorPanelControl WorldEditorFocusable
- | REPLInput
- | REPLHistoryCache
- | WorldCache
- | WorldExtent
- | WorldPositionIndicator
- | EntityPaintList
- | EntityPaintListItem Int
- | TerrainList
- | TerrainListItem Int
- | InventoryList
- | InventoryListItem Int
- | MenuList
- | AchievementList
- | ScenarioConfigControl ScenarioConfigPanel
- | GoalWidgets GoalWidget
- | ScenarioList
- | InfoViewport
- | ModalViewport
- | REPLViewport
- | Button Button
- data ModalType
- data ScenarioOutcome
- data Button
- data ButtonAction
- data Modal = Modal {}
- modalType :: Lens' Modal ModalType
- modalDialog :: Lens' Modal (Dialog ButtonAction Name)
- data MainMenuEntry
- mainMenu :: MainMenuEntry -> List Name MainMenuEntry
- data Menu
- _NewGameMenu :: Prism' Menu (NonEmpty (List Name ScenarioItem))
- mkScenarioList :: Bool -> ScenarioCollection -> List Name ScenarioItem
- mkNewGameMenu :: Bool -> ScenarioCollection -> FilePath -> Maybe Menu
- data REPLHistItem
- replItemText :: REPLHistItem -> Text
- isREPLEntry :: REPLHistItem -> Bool
- getREPLEntry :: REPLHistItem -> Maybe Text
- data REPLHistory
- replIndex :: Lens' REPLHistory Int
- replLength :: REPLHistory -> Int
- replSeq :: Lens' REPLHistory (Seq REPLHistItem)
- newREPLHistory :: [REPLHistItem] -> REPLHistory
- addREPLItem :: REPLHistItem -> REPLHistory -> REPLHistory
- restartREPLHistory :: REPLHistory -> REPLHistory
- getLatestREPLHistoryItems :: Int -> REPLHistory -> [REPLHistItem]
- moveReplHistIndex :: TimeDir -> Text -> REPLHistory -> REPLHistory
- getCurrentItemText :: REPLHistory -> Maybe Text
- replIndexIsAtInput :: REPLHistory -> Bool
- data TimeDir
- data REPLPrompt
- removeEntry :: Text -> REPLHistory -> REPLHistory
- data InventoryListEntry
- _Separator :: Prism' InventoryListEntry Text
- _InventoryEntry :: Prism' InventoryListEntry (Count, Entity)
- _EquippedEntry :: Prism' InventoryListEntry Entity
- data REPLState
- data ReplControlMode
- replPromptType :: Lens' REPLState REPLPrompt
- replPromptEditor :: Lens' REPLState (Editor Text Name)
- replPromptText :: Lens' REPLState Text
- replValid :: Lens' REPLState Bool
- replLast :: Lens' REPLState Text
- replType :: Lens' REPLState (Maybe Polytype)
- replControlMode :: Lens' REPLState ReplControlMode
- replHistory :: Lens' REPLState REPLHistory
- newREPLEditor :: Text -> Editor Text Name
- populateInventoryList :: MonadState UIState m => Maybe Robot -> m ()
- infoScroll :: ViewportScroll Name
- modalScroll :: ViewportScroll Name
- replScroll :: ViewportScroll Name
- data RuntimeState
- webPort :: Lens' RuntimeState (Maybe Port)
- upstreamRelease :: Lens' RuntimeState (Either NewReleaseFailure String)
- eventLog :: Lens' RuntimeState (Notifications LogEntry)
- worlds :: Lens' RuntimeState WorldMap
- scenarios :: Lens' RuntimeState ScenarioCollection
- stdEntityMap :: Lens' RuntimeState EntityMap
- stdRecipes :: Lens' RuntimeState [Recipe Entity]
- appData :: Lens' RuntimeState (Map Text Text)
- nameParts :: Lens' RuntimeState NameGenerator
- logEvent :: LogSource -> Severity -> Text -> Text -> Notifications LogEntry -> Notifications LogEntry
- mkGameStateConfig :: RuntimeState -> GameStateConfig
- data AppState = AppState GameState UIState RuntimeState
- gameState :: Lens' AppState GameState
- uiState :: Lens' AppState UIState
- runtimeState :: Lens' AppState RuntimeState
- data AppOpts = AppOpts {}
- defaultAppOpts :: AppOpts
- type Seed = Int
- data ColorMode
- topContext :: AppState -> RobotContext
- focusedItem :: AppState -> Maybe InventoryListEntry
- focusedEntity :: AppState -> Maybe Entity
- nextScenario :: Menu -> Maybe ScenarioInfoPair
- initRuntimeState :: (Has (Throw SystemFailure) sig m, Has (Accum (Seq SystemFailure)) sig m, Has (Lift IO) sig m) => m RuntimeState
Custom UI label types
These types are used as parameters to various brick
types.
newtype WebCommand Source #
Instances
Show WebCommand Source # | |
Defined in Swarm.TUI.Model showsPrec :: Int -> WebCommand -> ShowS # show :: WebCommand -> String # showList :: [WebCommand] -> ShowS # |
data FocusablePanel Source #
REPLPanel | The panel containing the REPL. |
WorldPanel | The panel containing the world view. |
WorldEditorPanel | The panel containing the world editor controls. |
RobotPanel | The panel showing robot info and inventory on the top left. |
InfoPanel | The info panel on the bottom left. |
Instances
Name
represents names to uniquely identify various components
of the UI, such as forms, panels, caches, extents, lists, and buttons.
FocusablePanel FocusablePanel | |
WorldEditorPanelControl WorldEditorFocusable | An individual control within the world editor panel. |
REPLInput | The REPL input form. |
REPLHistoryCache | The REPL history cache. |
WorldCache | The render cache for the world view. |
WorldExtent | The cached extent for the world view. |
WorldPositionIndicator | The cursor/viewCenter display in the bottom left of the World view |
EntityPaintList | The list of possible entities to paint a map with. |
EntityPaintListItem Int | The entity paint item position in the EntityPaintList. |
TerrainList | The list of possible terrain materials. |
TerrainListItem Int | The terrain item position in the TerrainList. |
InventoryList | The list of inventory items for the currently focused robot. |
InventoryListItem Int | The inventory item position in the InventoryList. |
MenuList | The list of main menu choices. |
AchievementList | The list of achievements. |
ScenarioConfigControl ScenarioConfigPanel | An individual control within the scenario launch config panel |
GoalWidgets GoalWidget | The list of goals/objectives. |
ScenarioList | The list of scenario choices. |
InfoViewport | The scrollable viewport for the info panel. |
ModalViewport | The scrollable viewport for any modal dialog. |
REPLViewport | The scrollable viewport for the REPL. |
Button Button | A clickable button in a modal dialog. |
Menus and dialogs
data ScenarioOutcome Source #
Instances
Show ScenarioOutcome Source # | |
Defined in Swarm.TUI.Model.Menu showsPrec :: Int -> ScenarioOutcome -> ShowS # show :: ScenarioOutcome -> String # showList :: [ScenarioOutcome] -> ShowS # |
Clickable buttons in modal dialogs.
data ButtonAction Source #
data MainMenuEntry Source #
Instances
NoMenu | We started playing directly from command line, no menu to show |
MainMenu (List Name MainMenuEntry) | |
NewGameMenu (NonEmpty (List Name ScenarioItem)) | Stack of scenario item lists. INVARIANT: the currently selected menu item is ALWAYS the same as the scenario currently being played. See https://github.com/swarm-game/swarm/issues/1064 and https://github.com/swarm-game/swarm/pull/1065. |
AchievementsMenu (List Name CategorizedAchievement) | |
MessagesMenu | |
AboutMenu |
_NewGameMenu :: Prism' Menu (NonEmpty (List Name ScenarioItem)) Source #
mkScenarioList :: Bool -> ScenarioCollection -> List Name ScenarioItem Source #
Create a brick List
of scenario items from a ScenarioCollection
.
mkNewGameMenu :: Bool -> ScenarioCollection -> FilePath -> Maybe Menu Source #
Given a ScenarioCollection
and a FilePath
which is the canonical
path to some folder or scenario, construct a NewGameMenu
stack
focused on the given item, if possible.
UI state
REPL
data REPLHistItem Source #
An item in the REPL history.
REPLEntry Text | Something entered by the user. |
REPLOutput Text | A response printed by the system. |
REPLError Text | An error printed by the system. |
Instances
replItemText :: REPLHistItem -> Text Source #
Get the text of REPL input/output.
isREPLEntry :: REPLHistItem -> Bool Source #
Useful helper function to filter out REPL output.
getREPLEntry :: REPLHistItem -> Maybe Text Source #
Useful helper function to only get user input text.
data REPLHistory Source #
History of the REPL with indices (0 is first entry) to the current line and to the first entry since loading saved history. We also (ab)use the length of the REPL as the index of current input line, since that number is one past the index of last entry.
Instances
Show REPLHistory Source # | |
Defined in Swarm.TUI.Model.Repl showsPrec :: Int -> REPLHistory -> ShowS # show :: REPLHistory -> String # showList :: [REPLHistory] -> ShowS # |
replIndex :: Lens' REPLHistory Int Source #
The current index in the REPL history (if the user is going back through the history using up/down keys).
replLength :: REPLHistory -> Int Source #
Current number lines of the REPL history - (ab)used as index of input buffer.
replSeq :: Lens' REPLHistory (Seq REPLHistItem) Source #
Sequence of REPL inputs and outputs, oldest entry is leftmost.
newREPLHistory :: [REPLHistItem] -> REPLHistory Source #
Create new REPL history (i.e. from loaded history file lines).
addREPLItem :: REPLHistItem -> REPLHistory -> REPLHistory Source #
Add new REPL input - the index must have been pointing one past the last element already, so we increment it to keep it that way.
restartREPLHistory :: REPLHistory -> REPLHistory Source #
Point the start of REPL history after current last line. See replStart
.
getLatestREPLHistoryItems :: Int -> REPLHistory -> [REPLHistItem] Source #
Get the latest N items in history, starting with the oldest one.
This is used to show previous REPL lines in UI, so we need the items sorted in the order they were entered and will be drawn top to bottom.
moveReplHistIndex :: TimeDir -> Text -> REPLHistory -> REPLHistory Source #
replIndexIsAtInput :: REPLHistory -> Bool Source #
Prompt utils
data REPLPrompt Source #
This data type tells us how to interpret the text typed by the player at the prompt (which is stored in Editor).
CmdPrompt [Text] | Interpret the prompt text as a regular command. The list is for potential completions, which we can cycle through by hitting Tab repeatedly |
SearchPrompt REPLHistory | Interpret the prompt text as "search this text in history" |
removeEntry :: Text -> REPLHistory -> REPLHistory Source #
Given some text, removes the REPLEntry
within REPLHistory
which is equal to that.
This is used when the user enters in search mode and want to traverse the history.
If a command has been used many times, the history will be populated with it causing
the effect that search command always finds the same command.
Inventory
data InventoryListEntry Source #
An entry in the inventory list displayed in the info panel. We can either have an entity with a count in the robot's inventory, an entity equipped on the robot, or a labelled separator. The purpose of the separators is to show a clear distinction between the robot's inventory and its equipped devices.
Instances
Eq InventoryListEntry Source # | |
Defined in Swarm.TUI.Model.Menu (==) :: InventoryListEntry -> InventoryListEntry -> Bool # (/=) :: InventoryListEntry -> InventoryListEntry -> Bool # |
REPL Panel Model
data ReplControlMode Source #
What is being done with user input to the REPL panel?
Typing | The user is typing at the REPL. |
Piloting | The user is driving the base using piloting mode. |
Handling | A custom user key handler is processing user input. |
Instances
Bounded ReplControlMode Source # | |
Defined in Swarm.TUI.Model.Repl | |
Enum ReplControlMode Source # | |
Defined in Swarm.TUI.Model.Repl succ :: ReplControlMode -> ReplControlMode # pred :: ReplControlMode -> ReplControlMode # toEnum :: Int -> ReplControlMode # fromEnum :: ReplControlMode -> Int # enumFrom :: ReplControlMode -> [ReplControlMode] # enumFromThen :: ReplControlMode -> ReplControlMode -> [ReplControlMode] # enumFromTo :: ReplControlMode -> ReplControlMode -> [ReplControlMode] # enumFromThenTo :: ReplControlMode -> ReplControlMode -> ReplControlMode -> [ReplControlMode] # | |
Eq ReplControlMode Source # | |
Defined in Swarm.TUI.Model.Repl (==) :: ReplControlMode -> ReplControlMode -> Bool # (/=) :: ReplControlMode -> ReplControlMode -> Bool # |
replPromptType :: Lens' REPLState REPLPrompt Source #
The way we interpret text typed by the player in the REPL prompt.
replPromptEditor :: Lens' REPLState (Editor Text Name) Source #
The prompt where the user can type input at the REPL.
replPromptText :: Lens' REPLState Text Source #
Convenience lens to get text from editor and replace it with new one that has the provided text.
replLast :: Lens' REPLState Text Source #
The last thing the user has typed which isn't part of the history. This is used to restore the repl form after the user visited the history.
replType :: Lens' REPLState (Maybe Polytype) Source #
The type of the current REPL input which should be displayed to the user (if any).
replControlMode :: Lens' REPLState ReplControlMode Source #
The current REPL control mode, i.e. how user input to the REPL panel is being handled.
replHistory :: Lens' REPLState REPLHistory Source #
History of things the user has typed at the REPL, interleaved with outputs the system has generated.
Updating
populateInventoryList :: MonadState UIState m => Maybe Robot -> m () Source #
Given the focused robot, populate the UI inventory list in the info panel with information about its inventory.
Runtime state
data RuntimeState Source #
webPort :: Lens' RuntimeState (Maybe Port) Source #
The port on which the HTTP debug service is running.
upstreamRelease :: Lens' RuntimeState (Either NewReleaseFailure String) Source #
The upstream release version.
eventLog :: Lens' RuntimeState (Notifications LogEntry) Source #
A log of runtime events.
This logging is separate from the logging done during game-play. If some error happens before a game is even selected, this is the place to log it.
worlds :: Lens' RuntimeState WorldMap Source #
A collection of typechecked world DSL terms that are available to be used in scenario definitions.
scenarios :: Lens' RuntimeState ScenarioCollection Source #
The collection of scenarios that comes with the game.
stdEntityMap :: Lens' RuntimeState EntityMap Source #
The standard entity map loaded from disk. Individual scenarios may define additional entities which will get added to this map when loading the scenario.
stdRecipes :: Lens' RuntimeState [Recipe Entity] Source #
The standard list of recipes loaded from disk. Individual scenarios may define additional recipes which will get added to this list when loading the scenario.
appData :: Lens' RuntimeState (Map Text Text) Source #
Free-form data loaded from the data
directory, for things like
the logo, about page, tutorial story, etc.
nameParts :: Lens' RuntimeState NameGenerator Source #
Lists of words/adjectives for use in building random robot names.
Utility
logEvent :: LogSource -> Severity -> Text -> Text -> Notifications LogEntry -> Notifications LogEntry Source #
Simply log to the runtime event log.
mkGameStateConfig :: RuntimeState -> GameStateConfig Source #
Create a GameStateConfig
record from the RuntimeState
.
App state
The AppState
just stores together the other states.
This is so you can use a smaller state when e.g. writing some game logic or updating the UI. Also consider that GameState can change when loading a new scenario - if the state should persist games, use RuntimeState.
runtimeState :: Lens' AppState RuntimeState Source #
The RuntimeState
record
Initialization
Command-line options for configuring the app.
AppOpts | |
|
defaultAppOpts :: AppOpts Source #
A default/empty AppOpts
record.
Re-exported types used in options
Instances
Utility
topContext :: AppState -> RobotContext Source #
Context for the REPL commands to execute in. Contains the base
robot context plus the it
variable that refer to the previously
computed values. (Note that `it{n}` variables are set in the
base robot context; we only set it
here because it's so transient)
focusedItem :: AppState -> Maybe InventoryListEntry Source #
Get the currently focused InventoryListEntry
from the robot
info panel (if any).
focusedEntity :: AppState -> Maybe Entity Source #
Get the currently focused entity from the robot info panel (if
any). This is just like focusedItem
but forgets the
distinction between plain inventory items and equipped devices.
nextScenario :: Menu -> Maybe ScenarioInfoPair Source #
Extract the scenario which would come next in the menu from the
currently selected scenario (if any). Can return Nothing
if
either we are not in the NewGameMenu
, or the current scenario
is the last among its siblings.
initRuntimeState :: (Has (Throw SystemFailure) sig m, Has (Accum (Seq SystemFailure)) sig m, Has (Lift IO) sig m) => m RuntimeState Source #