aboutsummaryrefslogtreecommitdiff
path: root/internal/admin/static/map.js
diff options
context:
space:
mode:
Diffstat (limited to 'internal/admin/static/map.js')
-rw-r--r--internal/admin/static/map.js51
1 files changed, 30 insertions, 21 deletions
diff --git a/internal/admin/static/map.js b/internal/admin/static/map.js
index 47dcb27..ba68d80 100644
--- a/internal/admin/static/map.js
+++ b/internal/admin/static/map.js
@@ -3,9 +3,9 @@ var currentZ = 0, currentDir = '', selectedRoom = null, mapData = null;
var panX = 0, panY = 0, scale = 1;
var dragging = false, startX = 0, startY = 0, prevX = 0, prevY = 0;
var dragRoom = false;
-var linkDrag = false, linkFromId = null, linkTargetId = null, linkGhostDir = null;
+var linkDrag = false, linkFromId = null, linkTargetId = null, linkTargetDir = null, linkGhostDir = null;
var linkDragOneWay = false;
-var shiftHeld = false;
+var ctrlHeld = false;
var delOneWay = false;
var delDrag = false, delFromId = null, delTargetId = null;
var roomMap = {}, occupied = {};
@@ -22,8 +22,8 @@ var upTarget = {}, downTarget = {};
var _mapMouseCleanup = false;
-function isShiftKey(e) {
- return e && (e.key === 'Shift' || e.code === 'ShiftLeft' || e.code === 'ShiftRight' || e.keyCode === 16);
+function isCtrlKey(e) {
+ return e && (e.key === 'Control' || e.code === 'ControlLeft' || e.code === 'ControlRight' || e.keyCode === 17);
}
function onMapMouseMove(e) {
@@ -32,7 +32,7 @@ function onMapMouseMove(e) {
if (delFromId && moved && !delDrag) { delDrag = true; }
if (delDrag && moved) {
- delOneWay = e.shiftKey;
+ delOneWay = e.ctrlKey;
updateDelDragTarget(e);
showDelDragBadge();
return;
@@ -47,7 +47,7 @@ function onMapMouseMove(e) {
if (linkFromId && moved) {
linkDrag = true;
- linkDragOneWay = e.shiftKey;
+ linkDragOneWay = e.ctrlKey;
showLinkDragBadge();
updateLinkDragTarget(e);
}
@@ -70,7 +70,7 @@ function onMapMouseUp(e) {
}
if (delDrag && delFromId && delTargetId) {
- deleteLink(delFromId, delTargetId, (delOneWay || e.shiftKey) ? 'from' : '');
+ deleteLink(delFromId, delTargetId, (delOneWay || e.ctrlKey) ? 'from' : '');
clearDelHighlight();
hideDragBadge();
dragging = false; dragRoom = false; delDrag = false; delFromId = null; delTargetId = null; delOneWay = false;
@@ -79,14 +79,14 @@ function onMapMouseUp(e) {
}
if (linkDrag && linkFromId) {
- var oneway = linkDragOneWay || e.shiftKey;
- if (linkTargetId) { createLink(linkFromId, linkTargetId, oneway); }
+ var oneway = linkDragOneWay || e.ctrlKey;
+ if (linkTargetId) { createLink(linkFromId, linkTargetId, oneway, linkTargetDir); }
else if (linkGhostDir) { createRoom(linkFromId, linkGhostDir, oneway); }
} else if (!moved && !delDrag) {
if (e.target.classList.contains('rm')) {
selectRoom(parseInt(e.target.getAttribute('data-id')));
} else if (e.target.classList.contains('ghost')) {
- createRoom(selectedRoom, e.target.getAttribute('data-dir'), e.shiftKey);
+ createRoom(selectedRoom, e.target.getAttribute('data-dir'), e.ctrlKey);
}
}
@@ -94,7 +94,7 @@ function onMapMouseUp(e) {
clearDelHighlight();
hideDragBadge();
dragging = false; dragRoom = false;
- linkDrag = false; linkFromId = null; linkTargetId = null; linkGhostDir = null; linkDragOneWay = false;
+ linkDrag = false; linkFromId = null; linkTargetId = null; linkTargetDir = null; linkGhostDir = null; linkDragOneWay = false;
delDrag = false; delFromId = null; delTargetId = null; delOneWay = false;
if (document.activeElement && document.activeElement.blur) document.activeElement.blur();
}
@@ -108,7 +108,7 @@ function cancelMapDrag() {
clearDelHighlight();
hideDragBadge();
dragging = false; dragRoom = false;
- linkDrag = false; linkFromId = null; linkTargetId = null; linkGhostDir = null; linkDragOneWay = false;
+ linkDrag = false; linkFromId = null; linkTargetId = null; linkTargetDir = null; linkGhostDir = null; linkDragOneWay = false;
delDrag = false; delFromId = null; delTargetId = null; delOneWay = false;
if (document.activeElement && document.activeElement.blur) document.activeElement.blur();
}
@@ -139,9 +139,9 @@ function showDelDragBadge() {
showDragBadge(label, delOneWay);
}
-function refreshDragMode(shiftDown) {
- if (linkDrag && linkFromId) { linkDragOneWay = shiftDown; showLinkDragBadge(); }
- if (delDrag && delFromId) { delOneWay = shiftDown; showDelDragBadge(); }
+function refreshDragMode(ctrlDown) {
+ if (linkDrag && linkFromId) { linkDragOneWay = ctrlDown; showLinkDragBadge(); }
+ if (delDrag && delFromId) { delOneWay = ctrlDown; showDelDragBadge(); }
}
function changeZ(dz) {
@@ -314,18 +314,24 @@ function renderMap(data) {
svg.oncontextmenu = function(e) { e.preventDefault(); };
+ if (!svg._ctxWired) {
+ svg.addEventListener('contextmenu', function(e) { e.preventDefault(); e.stopPropagation(); });
+ svg._ctxWired = true;
+ }
+
if (!svg._mapKeysWired) {
svg.setAttribute('tabindex', '0');
svg.addEventListener('keydown', function(e) {
- if (isShiftKey(e)) { shiftHeld = true; if (dragging) refreshDragMode(true); }
+ if (isCtrlKey(e)) { ctrlHeld = true; if (dragging) refreshDragMode(true); }
});
svg.addEventListener('keyup', function(e) {
- if (isShiftKey(e)) { shiftHeld = false; if (dragging) refreshDragMode(false); }
+ if (isCtrlKey(e)) { ctrlHeld = false; if (dragging) refreshDragMode(false); }
});
svg._mapKeysWired = true;
}
svg.onmousedown = function(e) {
+ if (e.button === 2) e.preventDefault();
var onRoom = e.target.classList.contains('rm');
var onGhost = e.target.classList.contains('ghost');
var onUdBtn = e.target.classList.contains('ud-btn');
@@ -373,7 +379,7 @@ function renderMap(data) {
linkDrag = false;
linkTargetId = null;
linkGhostDir = null;
- linkDragOneWay = onRoom ? (e.shiftKey || shiftHeld) : false;
+ linkDragOneWay = onRoom ? (e.ctrlKey || ctrlHeld) : false;
delDrag = false; delFromId = null; delTargetId = null;
clearLinkHighlight();
document.addEventListener('mousemove', onMapMouseMove);
@@ -1989,6 +1995,7 @@ function gridDeltaToDir(dx, dy) {
function updateLinkDragTarget(e) {
clearLinkHighlight();
linkTargetId = null;
+ linkTargetDir = null;
linkGhostDir = null;
var fromRoom = mapData.rooms ? mapData.rooms.find(function(r){return r.id === linkFromId;}) : null;
@@ -2007,6 +2014,7 @@ function updateLinkDragTarget(e) {
if (neighbor && neighbor !== linkFromId) {
linkTargetId = neighbor;
+ linkTargetDir = dir;
linkGhostDir = null;
applyLinkHighlight(linkFromId, linkTargetId);
} else if (!neighbor) {
@@ -2093,9 +2101,10 @@ function clearLinkHighlight() {
}
}
-function createLink(fromId, toId, oneway) {
+function createLink(fromId, toId, oneway, dir) {
var body = {from: fromId, to: toId};
if (oneway) body.oneway = true;
+ if (dir) body.dir = dir;
API.post('/api/rooms/link', body).then(function(res) {
if (res && res.error) { notify('Link failed: ' + res.error, 'error'); return; }
notify('Linked rooms #'+fromId+' '+toId + (oneway ? ' (one-way)' : ''), 'success');
@@ -2443,6 +2452,6 @@ function reloadRoomDirs(cb) {
}
document.addEventListener('DOMContentLoaded', function() { loadRoomDirs(function() { loadMap(); }); initPanelResize();
- window.addEventListener('keydown', function(e) { if (isShiftKey(e)) { shiftHeld = true; if (dragging) refreshDragMode(true); } });
- window.addEventListener('keyup', function(e) { if (isShiftKey(e)) { shiftHeld = false; if (dragging) refreshDragMode(false); } });
+ window.addEventListener('keydown', function(e) { if (isCtrlKey(e)) { ctrlHeld = true; if (dragging) refreshDragMode(true); } });
+ window.addEventListener('keyup', function(e) { if (isCtrlKey(e)) { ctrlHeld = false; if (dragging) refreshDragMode(false); } });
});