|
|
|
function switch_tool(state, item) {
|
|
|
|
const tool = item.getAttribute('data-tool');
|
|
|
|
|
|
|
|
if (tool === 'undo') {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (state.tools.active_element) {
|
|
|
|
state.tools.active_element.classList.remove('active');
|
|
|
|
}
|
|
|
|
|
|
|
|
state.tools.active = tool;
|
|
|
|
state.tools.active_element = item;
|
|
|
|
state.tools.active_element.classList.add('active');
|
|
|
|
}
|
|
|
|
|
|
|
|
function switch_color(state, item) {
|
|
|
|
const color = item.getAttribute('data-color');
|
|
|
|
|
|
|
|
if (state.colors.active_element) {
|
|
|
|
state.colors.active_element.classList.remove('active');
|
|
|
|
}
|
|
|
|
|
|
|
|
if (state.me in state.players) {
|
|
|
|
const color_u32 = color_to_u32(color);
|
|
|
|
state.players[state.me].color = color_u32
|
|
|
|
fire_event(state, color_event(color_u32));
|
|
|
|
}
|
|
|
|
|
|
|
|
state.colors.active_element = item;
|
|
|
|
state.colors.active_element.classList.add('active');
|
|
|
|
}
|
|
|
|
|
|
|
|
function show_stroke_preview(state, size) {
|
|
|
|
const preview = document.querySelector('#stroke-preview');
|
|
|
|
|
|
|
|
preview.style.width = size * state.canvas.zoom + 'px';
|
|
|
|
preview.style.height = size * state.canvas.zoom + 'px';
|
|
|
|
preview.style.background = color_from_u32(state.players[state.me].color);
|
|
|
|
|
|
|
|
preview.classList.remove('dhide');
|
|
|
|
}
|
|
|
|
|
|
|
|
function hide_stroke_preview() {
|
|
|
|
document.querySelector('#stroke-preview').classList.add('dhide');
|
|
|
|
}
|
|
|
|
|
|
|
|
function switch_stroke_width(e, state) {
|
|
|
|
if (!state.online) return;
|
|
|
|
|
|
|
|
const value = parseInt(e.target.value);
|
|
|
|
|
|
|
|
state.players[state.me].width = value;
|
|
|
|
show_stroke_preview(state, value);
|
|
|
|
|
|
|
|
if (state.hide_preview) {
|
|
|
|
clearTimeout(state.hide_preview);
|
|
|
|
}
|
|
|
|
|
|
|
|
state.hide_preview = setTimeout(hide_stroke_preview, config.brush_preview_timeout);
|
|
|
|
}
|
|
|
|
|
|
|
|
function broadcast_stroke_width(e, state) {
|
|
|
|
const value = e.target.value;
|
|
|
|
fire_event(state, width_event(value));
|
|
|
|
}
|
|
|
|
|
|
|
|
function init_tools(state) {
|
|
|
|
const tools = document.querySelectorAll('.tools .tool');
|
|
|
|
const colors = document.querySelectorAll('.pallete .color');
|
|
|
|
|
|
|
|
tools.forEach((item) => { item.addEventListener('click', () => switch_tool(state, item)); });
|
|
|
|
colors.forEach((item) => { item.addEventListener('click', () => switch_color(state, item)); });
|
|
|
|
|
|
|
|
// TODO: from localstorage
|
|
|
|
switch_tool(state, document.querySelector('.tool[data-tool="pencil"]'));
|
|
|
|
switch_color(state, document.querySelector('.color[data-color="000000"]'));
|
|
|
|
|
|
|
|
const slider = document.querySelector('#stroke-width');
|
|
|
|
|
|
|
|
// slider.value = state.players[state.me].width;
|
|
|
|
slider.addEventListener('input', (e) => switch_stroke_width(e, state));
|
|
|
|
slider.addEventListener('change', (e) => broadcast_stroke_width(e, state));
|
|
|
|
|
|
|
|
document.querySelector('.phone-extra-controls').addEventListener('click', zenmode);
|
|
|
|
}
|