Make TGUINanoMap actually somewhat as good as old NanoMap
@@ -1,5 +1,6 @@
|
|||||||
/datum/tgui_module/crew_monitor
|
/datum/tgui_module/crew_monitor
|
||||||
name = "Crew monitor"
|
name = "Crew monitor"
|
||||||
|
var/mapZoom = 1
|
||||||
|
|
||||||
/datum/tgui_module/crew_monitor/tgui_act(action, params)
|
/datum/tgui_module/crew_monitor/tgui_act(action, params)
|
||||||
if(..())
|
if(..())
|
||||||
@@ -18,6 +19,10 @@
|
|||||||
if(hassensorlevel(H, SUIT_SENSOR_TRACKING))
|
if(hassensorlevel(H, SUIT_SENSOR_TRACKING))
|
||||||
AI.ai_actual_track(H)
|
AI.ai_actual_track(H)
|
||||||
return TRUE
|
return TRUE
|
||||||
|
if("changeZoom")
|
||||||
|
var/newZoom = params["newZoom"]
|
||||||
|
mapZoom = newZoom
|
||||||
|
return TRUE
|
||||||
|
|
||||||
|
|
||||||
/datum/tgui_module/crew_monitor/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state)
|
/datum/tgui_module/crew_monitor/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state)
|
||||||
@@ -51,4 +56,8 @@
|
|||||||
for(var/zlevel in map_levels)
|
for(var/zlevel in map_levels)
|
||||||
data["crewmembers"] += crew_repository.health_data(zlevel)
|
data["crewmembers"] += crew_repository.health_data(zlevel)
|
||||||
|
|
||||||
|
data["zoomLevels"] = list(1, 1.25, 1.5, 1.75, 2)
|
||||||
|
|
||||||
|
data["mapZoom"] = mapZoom
|
||||||
|
|
||||||
return data
|
return data
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 261 KiB After Width: | Height: | Size: 246 KiB |
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 561 KiB After Width: | Height: | Size: 383 KiB |
|
Before Width: | Height: | Size: 236 KiB After Width: | Height: | Size: 222 KiB |
|
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 11 KiB |
@@ -1,29 +1,102 @@
|
|||||||
import { Box, Icon, Tooltip } from '.';
|
import { Box, Icon, Tooltip } from '.';
|
||||||
|
import { Component } from 'inferno';
|
||||||
import { useBackend } from "../backend";
|
import { useBackend } from "../backend";
|
||||||
|
|
||||||
export const NanoMap = (props, context) => {
|
export class NanoMap extends Component {
|
||||||
const { config } = useBackend(context);
|
constructor(props) {
|
||||||
const { onClick } = props;
|
super(props);
|
||||||
return (
|
|
||||||
<Box className="NanoMap__container">
|
this.state = {
|
||||||
<Box
|
offsetX: 0,
|
||||||
as="img"
|
offsetY: 0,
|
||||||
src={config.map+"_nanomap_z"+config.mapZLevel+".png"}
|
transform: 'none',
|
||||||
style={{
|
dragging: false,
|
||||||
width: '600px',
|
originX: null,
|
||||||
height: '600px',
|
originY: null,
|
||||||
'margin-top': '-91px',
|
};
|
||||||
'-ms-interpolation-mode': 'nearest-neighbor',
|
|
||||||
}}
|
this.handleDragStart = e => {
|
||||||
onClick={onClick} />
|
document.body.style['pointer-events'] = 'none';
|
||||||
</Box>
|
this.ref = e.target;
|
||||||
);
|
this.setState({
|
||||||
};
|
dragging: false,
|
||||||
|
originX: e.screenX,
|
||||||
|
originY: e.screenY,
|
||||||
|
});
|
||||||
|
this.timer = setTimeout(() => {
|
||||||
|
this.setState({
|
||||||
|
dragging: true,
|
||||||
|
});
|
||||||
|
}, 250);
|
||||||
|
document.addEventListener('mousemove', this.handleDragMove);
|
||||||
|
document.addEventListener('mouseup', this.handleDragEnd);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.handleDragMove = e => {
|
||||||
|
this.setState(prevState => {
|
||||||
|
const state = { ... prevState };
|
||||||
|
const newOffsetX = e.screenX - state.originX;
|
||||||
|
const newOffsetY = e.screenY - state.originY;
|
||||||
|
if (prevState.dragging) {
|
||||||
|
state.offsetX += newOffsetX;
|
||||||
|
state.offsetY += newOffsetY;
|
||||||
|
state.originX = e.screenX;
|
||||||
|
state.originY = e.screenY;
|
||||||
|
} else {
|
||||||
|
state.dragging = true;
|
||||||
|
}
|
||||||
|
return state;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
this.handleDragEnd = e => {
|
||||||
|
document.body.style['pointer-events'] = 'auto';
|
||||||
|
clearTimeout(this.timer);
|
||||||
|
this.setState({
|
||||||
|
dragging: false,
|
||||||
|
originX: null,
|
||||||
|
originY: null,
|
||||||
|
});
|
||||||
|
document.removeEventListener('mousemove', this.handleDragMove);
|
||||||
|
document.removeEventListener('mouseup', this.handleDragEnd);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
const { config } = useBackend(this.context);
|
||||||
|
const { offsetX, offsetY } = this.state;
|
||||||
|
const { children, zoom } = this.props;
|
||||||
|
|
||||||
|
const newStyle = {
|
||||||
|
width: 508 * zoom + 'px',
|
||||||
|
height: 508 * zoom + 'px',
|
||||||
|
"margin-top": offsetY + 'px',
|
||||||
|
"margin-left": offsetX + 'px',
|
||||||
|
"overflow": "hidden",
|
||||||
|
"position": "relative",
|
||||||
|
"padding": "0px",
|
||||||
|
"background-image":
|
||||||
|
"url("+config.map+"_nanomap_z"+config.mapZLevel+".png)",
|
||||||
|
"background-size": "cover",
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Box className="NanoMap__container">
|
||||||
|
<Box
|
||||||
|
style={newStyle}
|
||||||
|
onMouseDown={this.handleDragStart}>
|
||||||
|
{ children }
|
||||||
|
</Box>
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const NanoMapMarker = props => {
|
const NanoMapMarker = props => {
|
||||||
const {
|
const {
|
||||||
x,
|
x,
|
||||||
y,
|
y,
|
||||||
|
zoom,
|
||||||
icon,
|
icon,
|
||||||
tooltip,
|
tooltip,
|
||||||
color,
|
color,
|
||||||
@@ -32,8 +105,8 @@ const NanoMapMarker = props => {
|
|||||||
<Box
|
<Box
|
||||||
position="absolute"
|
position="absolute"
|
||||||
className="NanoMap__marker"
|
className="NanoMap__marker"
|
||||||
top={(((263 - y) * 2) + 2) + 'px'}
|
top={((255 - y) * 2 * zoom) - 8 + 'px'}
|
||||||
left={((x * 2) + 1) + 'px'}>
|
left={((x * 2 * zoom)) - 8 + 'px'} >
|
||||||
<Icon
|
<Icon
|
||||||
name={icon}
|
name={icon}
|
||||||
color={color}
|
color={color}
|
||||||
|
|||||||
@@ -21,21 +21,30 @@ export const CrewMonitor = (props, context) => {
|
|||||||
"mapZLevel": level,
|
"mapZLevel": level,
|
||||||
})} />
|
})} />
|
||||||
))}
|
))}
|
||||||
{crew
|
{data.zoomLevels.map(zoomLevel => (
|
||||||
.filter(x =>
|
<Button
|
||||||
(x.sensor_type === 3 && ~~x.realZ === ~~config.mapZLevel)
|
key={zoomLevel}
|
||||||
)
|
selected={Number(data.mapZoom) === Number(zoomLevel)}
|
||||||
.map(crewmember => (
|
content={zoomLevel}
|
||||||
<NanoMap.Marker
|
onClick={() => act("changeZoom", { "newZoom": zoomLevel })} />
|
||||||
key={crewmember.ref}
|
))}
|
||||||
x={crewmember.x}
|
<NanoMap zoom={data.mapZoom}>
|
||||||
y={crewmember.y}
|
{crew
|
||||||
icon="circle"
|
.filter(x =>
|
||||||
tooltip={crewmember.name}
|
(x.sensor_type === 3 && ~~x.realZ === ~~config.mapZLevel)
|
||||||
color={crewmember.dead ? 'red' : 'green'}
|
)
|
||||||
/>
|
.map(crewmember => (
|
||||||
))}
|
<NanoMap.Marker
|
||||||
<NanoMap />
|
key={crewmember.ref}
|
||||||
|
x={crewmember.x}
|
||||||
|
y={crewmember.y}
|
||||||
|
zoom={data.mapZoom}
|
||||||
|
icon="circle"
|
||||||
|
tooltip={crewmember.name}
|
||||||
|
color={crewmember.dead ? 'red' : 'green'}
|
||||||
|
/>
|
||||||
|
))}
|
||||||
|
</NanoMap>
|
||||||
<Box className="NanoMap__contentOffset">
|
<Box className="NanoMap__contentOffset">
|
||||||
<Box bold m={2}>
|
<Box bold m={2}>
|
||||||
<Table>
|
<Table>
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ $color-background: rgba(0, 0, 0, 0.33) !default;
|
|||||||
bottom: 0;
|
bottom: 0;
|
||||||
left: 524px;
|
left: 524px;
|
||||||
right: 0;
|
right: 0;
|
||||||
|
padding: 0px;
|
||||||
|
margin: 0px;
|
||||||
background-color: $color-background;
|
background-color: $color-background;
|
||||||
overflow-y: scroll;
|
overflow-y: scroll;
|
||||||
}
|
}
|
||||||
@@ -20,4 +22,6 @@ $color-background: rgba(0, 0, 0, 0.33) !default;
|
|||||||
|
|
||||||
.NanoMap__marker {
|
.NanoMap__marker {
|
||||||
z-index: 10;
|
z-index: 10;
|
||||||
|
padding: 0px;
|
||||||
|
margin: 0px;
|
||||||
}
|
}
|
||||||
|
|||||||