[TGUI] Shuttle Manipulator (#14674)

* TGUI Shuttle Manipulator

* Cleanus up artefacts
This commit is contained in:
AffectedArc07
2020-10-20 20:25:53 +01:00
committed by GitHub
parent 0932f87fe5
commit e84e8ad0fa
4 changed files with 275 additions and 204 deletions
+56 -82
View File
@@ -10,7 +10,6 @@
icon = 'icons/obj/machines/shuttle_manipulator.dmi'
icon_state = "holograph_on"
var/selected_menu_key = "stat"
var/busy
// UI state variables
var/datum/map_template/shuttle/selected
@@ -53,27 +52,20 @@
if(SHUTTLE_ESCAPE)
. = "escape"
if(!.)
throw EXCEPTION("shuttlemode2str(): invalid mode")
. = "ERROR"
/obj/machinery/shuttle_manipulator/attack_hand(mob/user)
ui_interact(user)
tgui_interact(user)
/obj/machinery/shuttle_manipulator/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
// update the ui if it exists, returns null if no ui is passed/found
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open)
/obj/machinery/shuttle_manipulator/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_admin_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
ui = new(user, src, ui_key, "shuttle_manipulator.tmpl", "Shuttle Manipulator", 660, 700, null, null, GLOB.admin_state)
// when the ui is first opened this is the data it will use
// open the new ui window
ui = new(user, src, ui_key, "ShuttleManipulator", name, 650, 700, master_ui, state)
ui.open()
// auto update every Master Controller tick
ui.set_auto_update(1)
/obj/machinery/shuttle_manipulator/ui_data(mob/user, datum/topic_state/state)
var/data[0]
data["selectedMenuKey"] = selected_menu_key
/obj/machinery/shuttle_manipulator/tgui_data(mob/user)
var/list/data = list()
data["templates"] = list()
var/list/templates = data["templates"]
@@ -130,84 +122,66 @@
data["shuttles"] += list(L)
return data
/obj/machinery/shuttle_manipulator/Topic(href, href_list)
/obj/machinery/shuttle_manipulator/tgui_act(action, list/params, datum/tgui/ui)
if(..())
return
var/mob/user = usr
. = TRUE
// Preload some common parameters
var/shuttle_id = href_list["shuttle_id"]
var/datum/map_template/shuttle/S = GLOB.shuttle_templates[shuttle_id]
switch(action)
if("select_template_category")
var/chosen_shuttle_id = params["cat"]
selected = null
existing_shuttle = SSshuttle.getShuttle(chosen_shuttle_id)
if("select_template")
var/datum/map_template/shuttle/S = GLOB.shuttle_templates[params["shuttle_id"]]
if(S)
existing_shuttle = SSshuttle.getShuttle(S.port_id)
selected = S
if(href_list["selectMenuKey"])
selected_menu_key = href_list["selectMenuKey"]
return 1 // return 1 forces an update to all Nano uis attached to src
if("jump_to")
if(params["type"] == "mobile")
for(var/i in SSshuttle.mobile)
var/obj/docking_port/mobile/M = i
if(M.id == params["id"])
usr.forceMove(get_turf(M))
break
if(href_list["select_template_category"])
var/chosen_shuttle_id = href_list["select_template_category"]
selected = null
existing_shuttle = SSshuttle.getShuttle(chosen_shuttle_id)
return 1
if(href_list["select_template"])
if(S)
existing_shuttle = SSshuttle.getShuttle(S.port_id)
selected = S
. = TRUE
if(href_list["jump_to"])
if(href_list["type"] == "mobile")
if("fast_travel")
for(var/i in SSshuttle.mobile)
var/obj/docking_port/mobile/M = i
if(M.id == href_list["id"])
user.forceMove(get_turf(M))
. = TRUE
if(M.id == params["id"] && M.timer && M.timeLeft() >= 50)
M.setTimer(50)
message_admins("[key_name_admin(usr)] fast travelled [M]")
log_admin("[key_name(usr)] fast travelled [M]")
feedback_add_details("shuttle_fasttravel", M.name)
break
if("preview")
var/datum/map_template/shuttle/S = GLOB.shuttle_templates[params["shuttle_id"]]
if(S)
unload_preview()
load_template(S)
if(preview_shuttle)
preview_template = S
usr.forceMove(get_turf(preview_shuttle))
if(href_list["fast_travel"])
for(var/i in SSshuttle.mobile)
var/obj/docking_port/mobile/M = i
if(M.id == href_list["id"] && M.timer && M.timeLeft() >= 50)
M.setTimer(50)
. = TRUE
message_admins("[key_name_admin(usr)] fast travelled \
[M]")
log_admin("[key_name(usr)] fast travelled [M]")
feedback_add_details("shuttle_fasttravel", M.name)
break
if(href_list["preview"])
if(S)
. = TRUE
unload_preview()
load_template(S)
if(preview_shuttle)
preview_template = S
user.forceMove(get_turf(preview_shuttle))
if(href_list["load"])
if(existing_shuttle == SSshuttle.backup_shuttle)
// TODO make the load button disabled
WARNING("The shuttle that the selected shuttle will replace \
is the backup shuttle. Backup shuttle is required to be \
intact for round sanity.")
else if(S)
. = TRUE
// If successful, returns the mobile docking port
var/obj/docking_port/mobile/mdp = action_load(S)
if(mdp)
user.forceMove(get_turf(mdp))
message_admins("[key_name_admin(usr)] loaded [mdp] \
with the shuttle manipulator.")
log_admin("[key_name(usr)] loaded [mdp] with the \
shuttle manipulator.</span>")
feedback_add_details("shuttle_manipulator", mdp.name)
if("load")
var/datum/map_template/shuttle/S = GLOB.shuttle_templates[params["shuttle_id"]]
if(existing_shuttle == SSshuttle.backup_shuttle)
// TODO make the load button disabled
WARNING("The shuttle that the selected shuttle will replace \
is the backup shuttle. Backup shuttle is required to be \
intact for round sanity.")
else if(S)
// If successful, returns the mobile docking port
var/obj/docking_port/mobile/mdp = action_load(S)
if(mdp)
usr.forceMove(get_turf(mdp))
message_admins("[key_name_admin(usr)] loaded [mdp] with the shuttle manipulator.")
log_admin("[key_name(usr)] loaded [mdp] with the shuttle manipulator.</span>")
feedback_add_details("shuttle_manipulator", mdp.name)
/obj/machinery/shuttle_manipulator/proc/action_load(datum/map_template/shuttle/loading_template)
-121
View File
@@ -1,121 +0,0 @@
<!--
Title: Shuttle Manipulator UI
-->
<h3>Operations</h3>
<div class="item">
{{:helper.link('Status', 'link', {'selectMenuKey' : 'stat'}, data.selectedMenuKey == 'stat' ? 'selected' : null)}}
{{:helper.link('Templates', 'link', {'selectMenuKey' : 'stemp'}, data.selectedMenuKey == 'stemp' ? 'selected' : null)}}
{{:helper.link('Modification', 'link', {'selectMenuKey' : 'mod'}, data.selectedMenuKey == 'mod' ? 'selected' : null)}}
</div>
<div class="item">&nbsp;</div>
<!-- Shuttle Status Tab -->
{{if !data.selectedMenuKey || data.selectedMenuKey == 'stat'}}
{{for data.shuttles}}
<div class='statusDisplay'>
<div class='itemLabel'>
Name: {{:value.name}}
</div>
<div class='itemContentWide'>
ID: {{:value.id}}
</div>
<div class='itemContentWide'>
Shuttle Timer: {{:value.timeleft}}
</div>
<div class='itemContentWide'>
Shuttle Mode: {{:value.mode}}
</div>
<div class='itemContentWide'>
Shuttle Status: {{:value.status}}
</div>
<div class='itemContentWide'>
{{:helper.link('Jump to', 'space-shuttle', {'jump_to' : 1, 'type' : 'mobile', 'id' : value.id}, null)}}
{{:helper.link('Fast Travel', 'rocket', {'fast_travel' : 1, 'id' : value.id}, null)}}
</div>
</div>
{{/for}}
<!-- Shuttle template tab -->
{{else data.selectedMenuKey == 'stemp'}}
<div class="item">
{{for data.templates_tabs}}
{{:helper.link(value, 'space-shuttle', {'select_template_category' : value}, (data.existing_shuttle.id == value) ? 'selected' : null)}}
{{/for}}
</div>
{{if data.existing_shuttle}}
<div class="item">&nbsp;</div>
{{for data.templates[data.existing_shuttle.id].templates}}
<div class='statusDisplay'>
<div class='itemLabelWide'>
Name: {{:value.name}}
</div>
{{if value.description}}
<div class='itemContent'>
Description: {{:value.description}}
</div>
{{/if}}
{{if value.admin_notes}}
<div class='itemContent'>
Admin Notes: {{:value.admin_notes}}
</div>
{{/if}}
<div class='item'>
{{:helper.link('select template', 'space-shuttle', {'select_template' : 1, 'shuttle_id' : value.shuttle_id}, (data.selected && data.selected.shuttle_id == value.shuttle_id) ? 'selected' : null)}}
</div>
</div>
{{/for}}
{{/if}}
<!-- Shuttle Modification tab -->
{{else data.selectedMenuKey == 'mod'}}
<div class="statusDisplay">
{{if data.existing_shuttle}}
<div class='itemGroup'>
<div class='itemLabelWide'>
Existing Shuttle: {{:data.existing_shuttle.name}}
</div>
<div class='item'>
Status: {{:data.existing_shuttle.status}}
</div>
{{if data.existing_shuttle.timer}}
<div class='item'>
({{:data.existing_shuttle.timeleft}})
</div>
{{/if}}
<div class='item'>
{{:helper.link('Jump to', 'space-shuttle', {'jump_to' : 1, 'type' : 'mobile', 'id' : data.existing_shuttle.id}, null)}}
</div>
</div>
{{else}}
<h3>No shuttle selected</h3>
{{/if}}
{{if data.selected}}
<div class='itemGroup'>
<div class='itemLabelWide'>
Name: {{:data.selected.name}}
</div>
{{if data.selected.description}}
<div class='itemContent'>
Description: {{:data.selected.description}}
</div>
{{/if}}
{{if data.selected.admin_notes}}
<div class='itemContent'>
Admin Notes: {{:data.selected.admin_notes}}
</div>
{{/if}}
<div class='item'>
{{:helper.link('Preview', 'exclamation-circle', {'preview' : 1, 'shuttle_id' : data.selected.shuttle_id}, null)}}
{{:helper.link('Load', 'exclamation-circle', {'load' : 1, 'shuttle_id' : data.selected.shuttle_id}, null)}}
</div>
</div>
{{else}}
<h3>No template selected</h3>
{{/if}}
</div>
{{/if}}
@@ -0,0 +1,218 @@
import { useBackend, useLocalState } from "../backend";
import { Button, LabeledList, Box, Section, Tabs } from "../components";
import { Window } from "../layouts";
export const ShuttleManipulator = (props, context) => {
const [tabIndex, setTabIndex] = useLocalState(context, 'tabIndex', 0);
const decideTab = index => {
switch (index) {
case 0:
return <StatusView />;
case 1:
return <TemplatesView />;
case 2:
return <ModificationView />;
default:
return "WE SHOULDN'T BE HERE!";
}
};
return (
<Window>
<Window.Content scrollable>
<Box fillPositionedParent>
<Tabs>
<Tabs.Tab
key="Status"
selected={0 === tabIndex}
onClick={() => setTabIndex(0)}
icon="info-circle"
content="Status" />
<Tabs.Tab
key="Templates"
selected={1 === tabIndex}
onClick={() => setTabIndex(1)}
icon="file-import"
content="Templates" />
<Tabs.Tab
key="Modification"
selected={2 === tabIndex}
onClick={() => setTabIndex(2)}
icon="tools"
content="Modification" />
</Tabs>
{decideTab(tabIndex)}
</Box>
</Window.Content>
</Window>
);
};
const StatusView = (props, context) => {
const { act, data } = useBackend(context);
const {
shuttles,
} = data;
return (
<Box>
{shuttles.map(s => (
<Section key={s.name} title={s.name}>
<LabeledList>
<LabeledList.Item label="ID">
{s.id}
</LabeledList.Item>
<LabeledList.Item label="Shuttle Timer">
{s.timeleft}
</LabeledList.Item>
<LabeledList.Item label="Shuttle Mode">
{s.mode}
</LabeledList.Item>
<LabeledList.Item label="Shuttle Status">
{s.status}
</LabeledList.Item>
<LabeledList.Item label="Actions">
<Button
content="Jump To"
icon="location-arrow"
onClick={
() => act('jump_to', { type: "mobile", id: s.id })
} />
<Button
content="Fast Travel"
icon="fast-forward"
onClick={
() => act('fast_travel', { id: s.id })
} />
</LabeledList.Item>
</LabeledList>
</Section>
))}
</Box>
);
};
const TemplatesView = (props, context) => {
const { act, data } = useBackend(context);
const {
templates_tabs,
existing_shuttle,
templates,
} = data;
return (
<Box>
<Tabs>
{templates_tabs.map(t => (
<Tabs.Tab
key={t}
selected={t === existing_shuttle.id}
icon="file"
content={t}
onClick={
() => act('select_template_category', { cat: t })
} />
))}
</Tabs>
{!!existing_shuttle && (
templates[existing_shuttle.id].templates.map(t => (
<Section key={t.name} title={t.name}>
<LabeledList>
{t.description && (
<LabeledList.Item label="Description">
{t.description}
</LabeledList.Item>
)}
{t.admin_notes && (
<LabeledList.Item label="Admin Notes">
{t.admin_notes}
</LabeledList.Item>
)}
<LabeledList.Item label="Actions">
<Button
content="Load Template"
icon="download"
onClick={
() => act('select_template', { shuttle_id: t.shuttle_id })
} />
</LabeledList.Item>
</LabeledList>
</Section>
))
)}
</Box>
);
};
const ModificationView = (props, context) => {
const { act, data } = useBackend(context);
const {
existing_shuttle,
selected,
} = data;
return (
<Box>
{existing_shuttle ? (
<Section title={"Selected Shuttle: " + existing_shuttle.name}>
<LabeledList>
<LabeledList.Item label="Status">
{existing_shuttle.status}
</LabeledList.Item>
{existing_shuttle.timer && (
<LabeledList.Item label="Timer">
{existing_shuttle.timeleft}
</LabeledList.Item>
)}
<LabeledList.Item label="Actions">
<Button
content="Jump To"
icon="location-arrow"
onClick={
() => act('jump_to', { type: "mobile", id: existing_shuttle.id })
} />
</LabeledList.Item>
</LabeledList>
</Section>
) : (
<Section title="Selected Shuttle: None" />
)}
{selected ? (
<Section title={"Selected Template: " + selected.name}>
<LabeledList>
{selected.description && (
<LabeledList.Item label="Description">
{selected.description}
</LabeledList.Item>
)}
{selected.admin_notes && (
<LabeledList.Item label="Admin Notes">
{selected.admin_notes}
</LabeledList.Item>
)}
<LabeledList.Item label="Actions">
<Button
content="Preview"
icon="eye"
onClick={
() => act('preview', { shuttle_id: selected.shuttle_id })
} />
<Button
content="Load"
icon="download"
onClick={
() => act('load', { shuttle_id: selected.shuttle_id })
} />
</LabeledList.Item>
</LabeledList>
</Section>
) : (
<Section title="Selected Template: None" />
)}
</Box>
);
};
File diff suppressed because one or more lines are too long