mirror of
https://github.com/FoggedLens/iD.git
synced 2026-02-13 09:12:52 +00:00
269 lines
7.7 KiB
JavaScript
269 lines
7.7 KiB
JavaScript
import * as d3 from 'd3';
|
|
import { d3keybinding } from '../lib/d3.keybinding.js';
|
|
import { t } from '../util/locale';
|
|
import { setDimensions } from '../util/dimensions';
|
|
import { tooltip } from '../util/tooltip';
|
|
import { Defs, Icon } from '../svg/index';
|
|
import { Account } from './account';
|
|
import { Attribution } from './attribution';
|
|
import { Background } from './background';
|
|
import { Browse } from '../modes/index';
|
|
import { Contributors } from './contributors';
|
|
import { Detect } from '../util/detect';
|
|
import { FeatureInfo } from './feature_info';
|
|
import { FullScreen } from './full_screen';
|
|
import { Geolocate } from './geolocate';
|
|
import { Hash } from '../behavior/index';
|
|
import { Help } from './help';
|
|
import { Info } from './info';
|
|
import { Loading } from './loading';
|
|
import { MapData } from './map_data';
|
|
import { MapInMap } from './map_in_map';
|
|
import { Modes } from './modes';
|
|
import { Restore } from './restore';
|
|
import { Save } from './save';
|
|
import { Scale } from './scale';
|
|
import { Sidebar } from './sidebar';
|
|
import { Spinner } from './spinner';
|
|
import { Splash } from './splash';
|
|
import { Status } from './status';
|
|
import { UndoRedo } from './undo_redo';
|
|
import { Zoom } from './zoom';
|
|
import { cmd } from './cmd';
|
|
|
|
|
|
export function init(context) {
|
|
function render(container) {
|
|
var map = context.map();
|
|
|
|
if (Detect().opera) container.classed('opera', true);
|
|
|
|
var hash = Hash(context);
|
|
hash();
|
|
|
|
if (!hash.hadHash) {
|
|
map.centerZoom([0, 0], 2);
|
|
}
|
|
|
|
container.append('svg')
|
|
.attr('id', 'defs')
|
|
.call(Defs(context));
|
|
|
|
container.append('div')
|
|
.attr('id', 'sidebar')
|
|
.attr('class', 'col4')
|
|
.call(ui.sidebar);
|
|
|
|
var content = container.append('div')
|
|
.attr('id', 'content');
|
|
|
|
var bar = content.append('div')
|
|
.attr('id', 'bar')
|
|
.attr('class', 'fillD');
|
|
|
|
content.append('div')
|
|
.attr('id', 'map')
|
|
.call(map);
|
|
|
|
content
|
|
.call(MapInMap(context));
|
|
|
|
content.append('div')
|
|
.call(Info(context));
|
|
|
|
bar.append('div')
|
|
.attr('class', 'spacer col4');
|
|
|
|
var limiter = bar.append('div')
|
|
.attr('class', 'limiter');
|
|
|
|
limiter.append('div')
|
|
.attr('class', 'button-wrap joined col3')
|
|
.call(Modes(context), limiter);
|
|
|
|
limiter.append('div')
|
|
.attr('class', 'button-wrap joined col1')
|
|
.call(UndoRedo(context));
|
|
|
|
limiter.append('div')
|
|
.attr('class', 'button-wrap col1')
|
|
.call(Save(context));
|
|
|
|
bar.append('div')
|
|
.attr('class', 'full-screen')
|
|
.call(FullScreen(context));
|
|
|
|
bar.append('div')
|
|
.attr('class', 'spinner')
|
|
.call(Spinner(context));
|
|
|
|
var controls = bar.append('div')
|
|
.attr('class', 'map-controls');
|
|
|
|
controls.append('div')
|
|
.attr('class', 'map-control zoombuttons')
|
|
.call(Zoom(context));
|
|
|
|
controls.append('div')
|
|
.attr('class', 'map-control geolocate-control')
|
|
.call(Geolocate(context));
|
|
|
|
controls.append('div')
|
|
.attr('class', 'map-control background-control')
|
|
.call(Background(context));
|
|
|
|
controls.append('div')
|
|
.attr('class', 'map-control map-data-control')
|
|
.call(MapData(context));
|
|
|
|
controls.append('div')
|
|
.attr('class', 'map-control help-control')
|
|
.call(Help(context));
|
|
|
|
var about = content.append('div')
|
|
.attr('id', 'about');
|
|
|
|
about.append('div')
|
|
.attr('id', 'attrib')
|
|
.call(Attribution(context));
|
|
|
|
var footer = about.append('div')
|
|
.attr('id', 'footer')
|
|
.attr('class', 'fillD');
|
|
|
|
footer.append('div')
|
|
.attr('class', 'api-status')
|
|
.call(Status(context));
|
|
|
|
footer.append('div')
|
|
.attr('id', 'scale-block')
|
|
.call(Scale(context));
|
|
|
|
var aboutList = footer.append('div')
|
|
.attr('id', 'info-block')
|
|
.append('ul')
|
|
.attr('id', 'about-list');
|
|
|
|
if (!context.embed()) {
|
|
aboutList.call(Account(context));
|
|
}
|
|
|
|
aboutList.append('li')
|
|
.append('a')
|
|
.attr('target', '_blank')
|
|
.attr('tabindex', -1)
|
|
.attr('href', 'https://github.com/openstreetmap/iD')
|
|
.text(context.version);
|
|
|
|
var issueLinks = aboutList.append('li');
|
|
|
|
issueLinks.append('a')
|
|
.attr('target', '_blank')
|
|
.attr('tabindex', -1)
|
|
.attr('href', 'https://github.com/openstreetmap/iD/issues')
|
|
.call(Icon('#icon-bug', 'light'))
|
|
.call(tooltip()
|
|
.title(t('report_a_bug'))
|
|
.placement('top')
|
|
);
|
|
|
|
issueLinks.append('a')
|
|
.attr('target', '_blank')
|
|
.attr('tabindex', -1)
|
|
.attr('href', 'https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating')
|
|
.call(Icon('#icon-translate', 'light'))
|
|
.call(tooltip()
|
|
.title(t('help_translate'))
|
|
.placement('top')
|
|
);
|
|
|
|
aboutList.append('li')
|
|
.attr('class', 'feature-warning')
|
|
.attr('tabindex', -1)
|
|
.call(FeatureInfo(context));
|
|
|
|
aboutList.append('li')
|
|
.attr('class', 'user-list')
|
|
.attr('tabindex', -1)
|
|
.call(Contributors(context));
|
|
|
|
window.onbeforeunload = function() {
|
|
return context.save();
|
|
};
|
|
|
|
window.onunload = function() {
|
|
context.history().unlock();
|
|
};
|
|
|
|
var mapDimensions = map.dimensions();
|
|
|
|
function onResize() {
|
|
mapDimensions = setDimensions(content, null);
|
|
map.dimensions(mapDimensions);
|
|
}
|
|
|
|
d3.select(window).on('resize.editor', onResize);
|
|
onResize();
|
|
|
|
function pan(d) {
|
|
return function() {
|
|
d3.event.preventDefault();
|
|
if (!context.inIntro()) {
|
|
context.pan(d, 100);
|
|
}
|
|
};
|
|
}
|
|
|
|
// pan amount
|
|
var pa = 10;
|
|
|
|
var keybinding = d3keybinding('main')
|
|
.on('⌫', function() { d3.event.preventDefault(); })
|
|
.on('←', pan([pa, 0]))
|
|
.on('↑', pan([0, pa]))
|
|
.on('→', pan([-pa, 0]))
|
|
.on('↓', pan([0, -pa]))
|
|
.on('⇧←', pan([mapDimensions[0], 0]))
|
|
.on('⇧↑', pan([0, mapDimensions[1]]))
|
|
.on('⇧→', pan([-mapDimensions[0], 0]))
|
|
.on('⇧↓', pan([0, -mapDimensions[1]]))
|
|
.on(cmd('⌘←'), pan([mapDimensions[0], 0]))
|
|
.on(cmd('⌘↑'), pan([0, mapDimensions[1]]))
|
|
.on(cmd('⌘→'), pan([-mapDimensions[0], 0]))
|
|
.on(cmd('⌘↓'), pan([0, -mapDimensions[1]]));
|
|
|
|
d3.select(document)
|
|
.call(keybinding);
|
|
|
|
context.enter(Browse(context));
|
|
|
|
context.container()
|
|
.call(Splash(context))
|
|
.call(Restore(context));
|
|
|
|
var authenticating = Loading(context)
|
|
.message(t('loading_auth'));
|
|
|
|
context.connection()
|
|
.on('authenticating.ui', function() {
|
|
context.container()
|
|
.call(authenticating);
|
|
})
|
|
.on('authenticated.ui', function() {
|
|
authenticating.close();
|
|
});
|
|
}
|
|
|
|
function ui(node) {
|
|
var container = d3.select(node);
|
|
context.container(container);
|
|
context.loadLocale(function() {
|
|
render(container);
|
|
});
|
|
}
|
|
|
|
ui.sidebar = Sidebar(context);
|
|
|
|
return ui;
|
|
}
|