2021-01-24 06:24:14 +08:00
|
|
|
const LastVersion = localStorage.getItem('last_version') || localStorage.getItem('welcomed_version') || appVersion;
|
|
|
|
|
2019-07-18 00:02:07 +08:00
|
|
|
const Blockbench = {
|
|
|
|
isWeb: !isApp,
|
2022-07-22 23:22:55 +08:00
|
|
|
isMobile: (window.innerWidth <= 960 || window.innerHeight <= 500) && 'ontouchend' in document,
|
2022-03-07 21:37:19 +08:00
|
|
|
isLandscape: window.innerWidth > window.innerHeight,
|
2021-01-30 22:18:45 +08:00
|
|
|
isTouch: 'ontouchend' in document,
|
2021-02-21 23:46:06 +08:00
|
|
|
get isPWA() {
|
|
|
|
return navigator.standalone || window.matchMedia('(display-mode: standalone)').matches;
|
|
|
|
},
|
2019-07-18 00:02:07 +08:00
|
|
|
version: appVersion,
|
|
|
|
platform: 'web',
|
|
|
|
flags: [],
|
|
|
|
drag_handlers: {},
|
|
|
|
events: {},
|
|
|
|
openTime: new Date(),
|
2018-10-18 01:50:25 +08:00
|
|
|
edit(aspects, cb) {
|
|
|
|
Undo.initEdit(aspects)
|
|
|
|
cb()
|
|
|
|
Undo.finishEdit()
|
2019-07-18 00:02:07 +08:00
|
|
|
},
|
2018-10-18 01:50:25 +08:00
|
|
|
reload() {
|
|
|
|
if (isApp) {
|
2022-02-11 04:20:24 +08:00
|
|
|
Blockbench.setProgress(0)
|
2019-07-18 00:02:07 +08:00
|
|
|
Blockbench.addFlag('allow_closing')
|
2020-07-16 15:32:59 +08:00
|
|
|
Blockbench.addFlag('allow_reload')
|
2018-10-18 01:50:25 +08:00
|
|
|
currentwindow.reload()
|
|
|
|
} else {
|
|
|
|
location.reload()
|
|
|
|
}
|
2019-07-18 00:02:07 +08:00
|
|
|
},
|
2020-10-02 00:24:20 +08:00
|
|
|
isNewerThan(version) {
|
|
|
|
return compareVersions(Blockbench.version, version);
|
|
|
|
},
|
2020-10-12 01:53:22 +08:00
|
|
|
isOlderThan(version) {
|
|
|
|
return compareVersions(version, Blockbench.version);
|
|
|
|
},
|
2018-10-18 01:50:25 +08:00
|
|
|
registerEdit() {
|
2019-02-04 04:09:35 +08:00
|
|
|
console.warn('Blockbench.registerEdit is outdated. Please use Undo.initEdit and Undo.finishEdit')
|
2019-07-18 00:02:07 +08:00
|
|
|
},
|
2018-10-18 01:50:25 +08:00
|
|
|
//Interface
|
|
|
|
getIconNode(icon, color) {
|
2020-01-24 01:53:36 +08:00
|
|
|
let node;
|
2018-10-18 01:50:25 +08:00
|
|
|
if (typeof icon === 'function') {
|
|
|
|
icon = icon()
|
|
|
|
}
|
2020-01-24 01:53:36 +08:00
|
|
|
if (icon === undefined) {
|
|
|
|
//Missing
|
|
|
|
node = document.createElement('i');
|
|
|
|
node.classList.add('material-icons', 'icon');
|
|
|
|
node.innerText = 'help_outline';
|
|
|
|
} else if (icon instanceof HTMLElement) {
|
|
|
|
//Node
|
|
|
|
node = icon
|
2022-08-15 20:57:07 +08:00
|
|
|
} else if (icon === true || icon === false) {
|
|
|
|
//Boolean
|
|
|
|
node = document.createElement('i');
|
|
|
|
node.classList.add('material-icons', 'icon');
|
|
|
|
node.innerText = icon ? 'check_box' : 'check_box_outline_blank';
|
|
|
|
|
2020-03-05 03:56:17 +08:00
|
|
|
} else if (icon === null) {
|
|
|
|
//Node
|
|
|
|
node = document.createElement('i');
|
|
|
|
node.classList.add('fa_big', 'icon');
|
|
|
|
|
2021-10-23 19:44:43 +08:00
|
|
|
} else if (icon.match(/^(fa[.-])|(fa[rsb]\.)/)) {
|
2020-01-24 01:53:36 +08:00
|
|
|
//Font Awesome
|
|
|
|
node = document.createElement('i');
|
|
|
|
node.classList.add('fa_big', 'icon');
|
|
|
|
if (icon.substr(3, 1) === '.') {
|
|
|
|
node.classList.add(icon.substr(0, 3), icon.substr(4));
|
|
|
|
} else {
|
|
|
|
node.classList.add('fa', icon);
|
|
|
|
}
|
|
|
|
} else if (icon.substr(0, 5) === 'icon-') {
|
|
|
|
//Icomoon
|
|
|
|
node = document.createElement('i');
|
|
|
|
node.classList.add(icon, 'icon');
|
|
|
|
} else if (icon.substr(0, 14) === 'data:image/png') {
|
|
|
|
//Data URL
|
|
|
|
node = document.createElement('img');
|
|
|
|
node.classList.add('icon');
|
|
|
|
node.src = icon;
|
|
|
|
} else {
|
|
|
|
//Material Icon
|
|
|
|
node = document.createElement('i');
|
|
|
|
node.classList.add('material-icons', 'icon');
|
|
|
|
node.innerText = icon;
|
|
|
|
}
|
|
|
|
if (color) {
|
|
|
|
if (color === 'x') {
|
|
|
|
node.classList.add('color_x');
|
|
|
|
} else if (color === 'y') {
|
|
|
|
node.classList.add('color_y');
|
|
|
|
} else if (color === 'z') {
|
|
|
|
node.classList.add('color_z');
|
|
|
|
} else if (typeof color === 'string') {
|
|
|
|
node.style.color = color;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return node
|
2019-07-18 00:02:07 +08:00
|
|
|
},
|
2018-10-18 01:50:25 +08:00
|
|
|
showQuickMessage(message, time) {
|
2018-12-27 21:03:04 +08:00
|
|
|
$('#quick_message_box').remove()
|
2018-10-18 01:50:25 +08:00
|
|
|
var quick_message_box = $('<div id="quick_message_box" class="hidden"></div>')
|
|
|
|
$('body').append(quick_message_box)
|
|
|
|
|
|
|
|
quick_message_box.text(tl(message))
|
2019-07-18 00:02:07 +08:00
|
|
|
quick_message_box.fadeIn(0)
|
2018-10-18 01:50:25 +08:00
|
|
|
setTimeout(function() {
|
2019-07-18 00:02:07 +08:00
|
|
|
quick_message_box.fadeOut(0)
|
2018-10-18 01:50:25 +08:00
|
|
|
setTimeout(function() {
|
|
|
|
quick_message_box.remove()
|
2019-07-18 00:02:07 +08:00
|
|
|
}, 1)
|
2018-10-18 01:50:25 +08:00
|
|
|
}, time ? time : 1000)
|
2019-07-18 00:02:07 +08:00
|
|
|
},
|
2021-02-28 19:51:15 +08:00
|
|
|
/**
|
|
|
|
*
|
|
|
|
* @param {object} options Options
|
|
|
|
* @param {string} options.text Text Message
|
|
|
|
* @param {string} [options.icon] Blockbench icon string
|
|
|
|
* @param {number} [options.expire] Expire time in miliseconds
|
|
|
|
* @param {string} [options.color] Background color, accepts any CSS color string
|
2021-05-06 03:04:16 +08:00
|
|
|
* @param {function} [options.click] Method to run on click. Return `true` to close toast
|
2021-02-28 19:51:15 +08:00
|
|
|
*
|
|
|
|
*/
|
|
|
|
showToastNotification(options) {
|
|
|
|
let notification = document.createElement('li');
|
|
|
|
notification.className = 'toast_notification';
|
|
|
|
if (options.icon) {
|
|
|
|
let icon = Blockbench.getIconNode(options.icon);
|
|
|
|
notification.append(icon);
|
|
|
|
}
|
|
|
|
let text = document.createElement('span');
|
|
|
|
text.innerText = tl(options.text);
|
|
|
|
notification.append(text);
|
|
|
|
|
|
|
|
let close_button = document.createElement('div');
|
|
|
|
close_button.innerHTML = '<i class="material-icons">clear</i>';
|
|
|
|
close_button.className = 'toast_close_button';
|
|
|
|
close_button.addEventListener('click', (event) => {
|
|
|
|
notification.remove();
|
|
|
|
})
|
|
|
|
notification.append(close_button);
|
|
|
|
|
|
|
|
if (options.color) {
|
|
|
|
notification.style.backgroundColor = options.color;
|
|
|
|
}
|
|
|
|
if (typeof options.click == 'function') {
|
|
|
|
notification.addEventListener('click', (event) => {
|
|
|
|
if (event.target == close_button || event.target.parentElement == close_button) return;
|
|
|
|
let result = options.click(event);
|
|
|
|
if (result == true) {
|
|
|
|
notification.remove();
|
|
|
|
}
|
|
|
|
})
|
|
|
|
notification.style.cursor = 'pointer';
|
|
|
|
}
|
|
|
|
|
|
|
|
if (options.expire) {
|
|
|
|
setTimeout(() => {
|
|
|
|
notification.remove();
|
|
|
|
}, options.expire);
|
|
|
|
}
|
|
|
|
|
|
|
|
document.getElementById('toast_notification_list').append(notification);
|
|
|
|
|
|
|
|
function deletableToast(node) {
|
|
|
|
this.delete = function() {
|
|
|
|
node.remove();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return new deletableToast(notification);
|
2019-12-16 03:04:31 +08:00
|
|
|
},
|
2018-10-18 01:50:25 +08:00
|
|
|
showStatusMessage(message, time) {
|
2018-11-12 04:19:08 +08:00
|
|
|
Blockbench.setStatusBarText(tl(message))
|
|
|
|
setTimeout(function() {
|
|
|
|
Blockbench.setStatusBarText()
|
2019-07-18 00:02:07 +08:00
|
|
|
}, time ? time : 800)
|
|
|
|
},
|
2018-11-12 04:19:08 +08:00
|
|
|
setStatusBarText(text) {
|
2020-01-24 01:53:36 +08:00
|
|
|
if (text !== undefined) {
|
2018-11-12 04:19:08 +08:00
|
|
|
Prop.file_name = text
|
|
|
|
} else {
|
|
|
|
Prop.file_name = Prop.file_name_alt||''
|
|
|
|
}
|
2019-07-18 00:02:07 +08:00
|
|
|
},
|
2018-12-27 21:03:04 +08:00
|
|
|
setProgress(progress, time, bar) {
|
|
|
|
setProgressBar(bar, progress||0, time)
|
2019-07-18 00:02:07 +08:00
|
|
|
},
|
2017-10-27 01:00:52 +08:00
|
|
|
showMessage(message, location) {
|
|
|
|
if (location === 'status_bar') {
|
2018-10-18 01:50:25 +08:00
|
|
|
Blockbench.showStatusMessage(message)
|
2017-10-27 01:00:52 +08:00
|
|
|
} else if (location === 'center') {
|
2018-10-18 01:50:25 +08:00
|
|
|
Blockbench.showQuickMessage(message)
|
2017-10-27 01:00:52 +08:00
|
|
|
}
|
2019-07-18 00:02:07 +08:00
|
|
|
},
|
2020-10-27 02:56:00 +08:00
|
|
|
showMessageBox(options = 0, cb) {
|
2017-11-17 05:23:41 +08:00
|
|
|
|
|
|
|
if (options.confirm === undefined) options.confirm = 0
|
2020-10-27 02:56:00 +08:00
|
|
|
if (options.cancel === undefined) options.cancel = (options.buttons && options.buttons.length) ? options.buttons.length-1 : 0;
|
2018-10-18 01:50:25 +08:00
|
|
|
if (!options.buttons) options.buttons = [tl('dialog.ok')]
|
|
|
|
|
|
|
|
if (options.translateKey) {
|
|
|
|
if (!options.title) options.title = tl('message.'+options.translateKey+'.title')
|
|
|
|
if (!options.message) options.message = tl('message.'+options.translateKey+'.message')
|
|
|
|
}
|
2017-11-17 05:23:41 +08:00
|
|
|
|
2021-07-26 00:41:58 +08:00
|
|
|
var jq_dialog = $(`
|
2021-07-31 05:12:51 +08:00
|
|
|
<dialog class="dialog" style="width: auto;" id="message_box">
|
2021-08-08 00:33:50 +08:00
|
|
|
<div class="dialog_handle"><div class="dialog_title">${tl(options.title)}</div></div>
|
2021-07-26 00:41:58 +08:00
|
|
|
<div class="dialog_close_button" onclick="open_interface.cancel()"><i class="material-icons">clear</i></div>
|
|
|
|
</dialog>`)
|
2017-11-17 05:23:41 +08:00
|
|
|
|
2022-08-02 03:38:45 +08:00
|
|
|
let content = $('<div class="dialog_content"></div>');
|
|
|
|
jq_dialog.append(content);
|
|
|
|
|
|
|
|
if (options.message) {
|
|
|
|
content.append('<div class="dialog_bar markdown" style="height: auto; min-height: 56px; margin-bottom: 16px;">'+
|
|
|
|
marked(tl(options.message))+
|
|
|
|
'</div></div>')
|
|
|
|
}
|
2018-10-18 01:50:25 +08:00
|
|
|
if (options.icon) {
|
|
|
|
jq_dialog.find('.dialog_bar').prepend($(Blockbench.getIconNode(options.icon)).addClass('message_box_icon'))
|
|
|
|
}
|
2017-11-17 05:23:41 +08:00
|
|
|
|
2022-08-02 03:38:45 +08:00
|
|
|
if (options.commands) {
|
|
|
|
let list = Interface.createElement('ul');
|
|
|
|
for (let id in options.commands) {
|
|
|
|
let command = options.commands[id];
|
2022-10-09 05:02:35 +08:00
|
|
|
if (!Condition(command.condition)) continue;
|
2022-08-02 03:38:45 +08:00
|
|
|
let text = tl(typeof command == 'string' ? command : command.text);
|
|
|
|
let entry = Interface.createElement('li', {class: 'dialog_message_box_command'}, text)
|
|
|
|
entry.addEventListener('click', e => {
|
|
|
|
close(id);
|
|
|
|
})
|
|
|
|
list.append(entry);
|
|
|
|
}
|
|
|
|
content.append(list);
|
|
|
|
}
|
|
|
|
|
2021-06-09 05:33:40 +08:00
|
|
|
function close(button) {
|
|
|
|
hideDialog();
|
|
|
|
setTimeout(function() {
|
|
|
|
jq_dialog.remove();
|
|
|
|
},200)
|
|
|
|
if (cb) {
|
|
|
|
cb(button);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-11-17 05:23:41 +08:00
|
|
|
var buttons = []
|
|
|
|
|
|
|
|
options.buttons.forEach(function(b, i) {
|
2019-07-18 00:02:07 +08:00
|
|
|
var btn = $('<button type="button">'+tl(b)+'</button>')
|
2017-11-17 05:23:41 +08:00
|
|
|
btn.click(function(e) {
|
2021-06-09 05:33:40 +08:00
|
|
|
close(i);
|
2017-11-17 05:23:41 +08:00
|
|
|
})
|
2021-06-09 05:33:40 +08:00
|
|
|
buttons.push(btn);
|
2017-11-17 05:23:41 +08:00
|
|
|
})
|
2018-10-18 01:50:25 +08:00
|
|
|
jq_dialog.hide = function() {
|
|
|
|
$(jq_dialog.find('button').get(options.cancel)).click()
|
|
|
|
}
|
2017-11-17 05:23:41 +08:00
|
|
|
buttons[options.confirm].addClass('confirm_btn')
|
|
|
|
buttons[options.cancel].addClass('cancel_btn')
|
2018-12-03 02:37:06 +08:00
|
|
|
jq_dialog.append($('<div class="dialog_bar button_bar"></div>').append(buttons))
|
2019-08-18 00:26:14 +08:00
|
|
|
buttons.forEach(b => {
|
|
|
|
b.after(' ')
|
|
|
|
})
|
2017-11-17 05:23:41 +08:00
|
|
|
|
|
|
|
|
2018-10-18 01:50:25 +08:00
|
|
|
jq_dialog.addClass('draggable')
|
|
|
|
jq_dialog.draggable({
|
2019-09-06 06:16:54 +08:00
|
|
|
handle: ".dialog_handle",
|
|
|
|
containment: '#page_wrapper'
|
2018-10-18 01:50:25 +08:00
|
|
|
})
|
2021-01-31 07:12:53 +08:00
|
|
|
var x = (window.innerWidth-540)/2
|
2018-10-18 01:50:25 +08:00
|
|
|
jq_dialog.css('left', x+'px')
|
|
|
|
jq_dialog.css('position', 'absolute')
|
2017-11-17 05:23:41 +08:00
|
|
|
|
2021-02-20 20:21:11 +08:00
|
|
|
$('#dialog_wrapper').append(jq_dialog)
|
2019-07-18 00:02:07 +08:00
|
|
|
jq_dialog.show()
|
2018-10-18 01:50:25 +08:00
|
|
|
|
2022-12-19 19:43:27 +08:00
|
|
|
jq_dialog[0].style.zIndex = 21 + Dialog.stack.length * 2;
|
|
|
|
|
|
|
|
let blackout = document.getElementById('blackout');
|
|
|
|
blackout.style.display = 'block';
|
|
|
|
blackout.classList.toggle('darken', true);
|
|
|
|
blackout.style.zIndex = 20 + Dialog.stack.length * 2;
|
|
|
|
|
2021-01-31 07:12:53 +08:00
|
|
|
jq_dialog.css('top', limitNumber(window.innerHeight/2-jq_dialog.height()/2 - 140, 0, 2000)+'px')
|
2018-10-18 01:50:25 +08:00
|
|
|
if (options.width) {
|
|
|
|
jq_dialog.css('width', options.width+'px')
|
|
|
|
} else {
|
|
|
|
jq_dialog.css('width', limitNumber(options.buttons.length*170+44, 380, 894)+'px')
|
|
|
|
}
|
|
|
|
open_dialog = 'message_box'
|
2021-06-09 05:33:40 +08:00
|
|
|
open_interface = {
|
|
|
|
confirm() {
|
|
|
|
close(options.confirm);
|
|
|
|
},
|
|
|
|
cancel() {
|
|
|
|
close(options.cancel);
|
|
|
|
}
|
|
|
|
}
|
2018-10-18 01:50:25 +08:00
|
|
|
return jq_dialog
|
2019-07-18 00:02:07 +08:00
|
|
|
},
|
2022-01-31 04:07:43 +08:00
|
|
|
async textPrompt(title, value, callback, placeholder = null) {
|
2022-12-19 05:20:47 +08:00
|
|
|
let answer = await new Promise((resolve) => {
|
|
|
|
new Dialog({
|
|
|
|
id: 'text_input',
|
|
|
|
title: title || 'dialog.input.title',
|
|
|
|
form: {
|
|
|
|
text: {full_width: true, placeholder, value}
|
|
|
|
},
|
|
|
|
onConfirm({text}) {
|
|
|
|
callback(text);
|
|
|
|
resolve(text);
|
|
|
|
},
|
|
|
|
onOpen() {
|
|
|
|
this.object.querySelector('input')?.focus();
|
|
|
|
}
|
|
|
|
}).show();
|
|
|
|
});
|
|
|
|
return answer;
|
2019-07-18 00:02:07 +08:00
|
|
|
},
|
2018-10-18 01:50:25 +08:00
|
|
|
addMenuEntry(name, icon, click) {
|
2021-03-04 00:50:30 +08:00
|
|
|
console.warn('Blockbench.addMenuEntry is deprecated. Please use Actions instead.')
|
|
|
|
let id = name.replace(/\s/g, '').toLowerCase();
|
|
|
|
var action = new Action(id, {icon: icon, name: name, click: click})
|
2021-11-20 23:17:13 +08:00
|
|
|
MenuBar.addAction(action, 'tools')
|
2019-07-18 00:02:07 +08:00
|
|
|
},
|
2018-10-18 01:50:25 +08:00
|
|
|
removeMenuEntry(name) {
|
2021-03-04 00:50:30 +08:00
|
|
|
let id = name.replace(/\s/g, '').toLowerCase();
|
2021-11-20 23:17:13 +08:00
|
|
|
MenuBar.removeAction('tools.'+id);
|
2019-07-18 00:02:07 +08:00
|
|
|
},
|
2018-10-18 01:50:25 +08:00
|
|
|
openLink(link) {
|
|
|
|
if (isApp) {
|
|
|
|
shell.openExternal(link)
|
|
|
|
} else {
|
|
|
|
window.open(link)
|
|
|
|
}
|
2019-07-18 00:02:07 +08:00
|
|
|
},
|
|
|
|
notification(title, text, icon) {
|
|
|
|
Notification.requestPermission().then(status => {
|
|
|
|
if (status == 'granted') {
|
|
|
|
let n = new Notification(title, {body: text, icon: icon||'favicon.png'})
|
|
|
|
n.onclick = function() {
|
|
|
|
if (isApp) {
|
|
|
|
currentwindow.focus();
|
|
|
|
} else {
|
|
|
|
window.focus();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
})
|
|
|
|
},
|
2020-11-28 05:59:52 +08:00
|
|
|
//CSS
|
|
|
|
addCSS(css) {
|
|
|
|
let style_node = document.createElement('style');
|
|
|
|
style_node.type ='text/css';
|
|
|
|
style_node.appendChild(document.createTextNode(css));
|
|
|
|
document.getElementsByTagName('head')[0].appendChild(style_node);
|
|
|
|
function deletableStyle(node) {
|
|
|
|
this.delete = function() {
|
|
|
|
node.remove();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return new deletableStyle(style_node);
|
|
|
|
},
|
2018-10-18 01:50:25 +08:00
|
|
|
//Flags
|
|
|
|
addFlag(flag) {
|
2018-12-03 02:37:06 +08:00
|
|
|
this.flags[flag] = true
|
2019-07-18 00:02:07 +08:00
|
|
|
},
|
2018-10-18 01:50:25 +08:00
|
|
|
removeFlag(flag) {
|
2018-12-03 02:37:06 +08:00
|
|
|
delete this.flags[flag]
|
2019-07-18 00:02:07 +08:00
|
|
|
},
|
2018-10-18 01:50:25 +08:00
|
|
|
hasFlag(flag) {
|
2018-12-03 02:37:06 +08:00
|
|
|
return this.flags[flag]
|
2019-07-18 00:02:07 +08:00
|
|
|
},
|
2018-10-18 01:50:25 +08:00
|
|
|
//Events
|
2019-04-08 00:53:33 +08:00
|
|
|
dispatchEvent(event_name, data) {
|
2021-06-23 03:29:09 +08:00
|
|
|
let list = this.events[event_name];
|
2022-08-10 05:14:03 +08:00
|
|
|
let results;
|
|
|
|
if (list) {
|
|
|
|
results = [];
|
|
|
|
for (let i = 0; i < list.length; i++) {
|
|
|
|
if (typeof list[i] === 'function') {
|
|
|
|
let result = list[i](data);
|
|
|
|
results.push(result);
|
|
|
|
}
|
2017-10-27 01:00:52 +08:00
|
|
|
}
|
|
|
|
}
|
2022-08-04 03:14:59 +08:00
|
|
|
if (Validator.triggers.includes(event_name)) {
|
|
|
|
Validator.validate(event_name);
|
|
|
|
}
|
2021-06-23 03:29:09 +08:00
|
|
|
return results;
|
2019-07-18 00:02:07 +08:00
|
|
|
},
|
2020-10-22 00:31:26 +08:00
|
|
|
addListener(event_names, cb) {
|
|
|
|
event_names.split(' ').forEach(event_name => {
|
|
|
|
if (!this.events[event_name]) {
|
|
|
|
this.events[event_name] = [];
|
|
|
|
}
|
|
|
|
this.events[event_name].safePush(cb);
|
|
|
|
})
|
2020-05-31 21:54:04 +08:00
|
|
|
return Blockbench;
|
2019-07-18 00:02:07 +08:00
|
|
|
},
|
2019-04-08 00:53:33 +08:00
|
|
|
on(event_name, cb) {
|
|
|
|
return Blockbench.addListener(event_name, cb)
|
2019-07-18 00:02:07 +08:00
|
|
|
},
|
2017-10-27 01:00:52 +08:00
|
|
|
removeListener(event_name, cb) {
|
2019-04-08 00:53:33 +08:00
|
|
|
if (!this.events[event_name]) return;
|
|
|
|
this.events[event_name].remove(cb);
|
2019-07-18 00:02:07 +08:00
|
|
|
},
|
2021-01-24 06:24:14 +08:00
|
|
|
onUpdateTo(version, callback) {
|
2021-01-24 07:09:44 +08:00
|
|
|
if (LastVersion && compareVersions(version, LastVersion) && !Blockbench.isOlderThan(version)) {
|
2021-01-24 06:24:14 +08:00
|
|
|
callback(LastVersion);
|
|
|
|
}
|
|
|
|
}
|
2019-09-06 07:56:13 +08:00
|
|
|
};
|
2019-09-06 07:47:49 +08:00
|
|
|
|
|
|
|
(function() {
|
2021-01-24 06:24:14 +08:00
|
|
|
if (!LastVersion || LastVersion.replace(/.\d+$/, '') != appVersion.replace(/.\d+$/, '')) {
|
2019-09-06 07:47:49 +08:00
|
|
|
Blockbench.addFlag('after_update');
|
|
|
|
}
|
2022-12-22 02:18:05 +08:00
|
|
|
try {
|
|
|
|
let ui_mode = JSON.parse(localStorage.getItem('settings')).interface_mode.value;
|
|
|
|
if (ui_mode == 'desktop') Blockbench.isMobile = false;
|
|
|
|
if (ui_mode == 'mobile') Blockbench.isMobile = true;
|
|
|
|
} catch (err) {}
|
2019-09-06 07:47:49 +08:00
|
|
|
})();
|
|
|
|
|
2019-07-18 00:02:07 +08:00
|
|
|
if (isApp) {
|
|
|
|
Blockbench.platform = process.platform;
|
|
|
|
switch (Blockbench.platform) {
|
|
|
|
case 'win32': Blockbench.operating_system = 'Windows'; break;
|
|
|
|
case 'darwin': Blockbench.operating_system = 'macOS'; break;
|
|
|
|
default: Blockbench.operating_system = 'Linux'; break;
|
|
|
|
}
|
|
|
|
if (Blockbench.platform.includes('win32') === true) osfs = '\\';
|
2017-10-27 01:00:52 +08:00
|
|
|
}
|
|
|
|
|
2020-04-26 02:25:07 +08:00
|
|
|
|
|
|
|
|
|
|
|
const StateMemory = {
|
|
|
|
init(key, type) {
|
|
|
|
let saved = localStorage.getItem(`StateMemory.${key}`)
|
|
|
|
if (typeof saved == 'string') {
|
|
|
|
try {
|
|
|
|
saved = JSON.parse(saved)
|
|
|
|
} catch (err) {
|
|
|
|
localStorage.clearItem(`StateMemory.${key}`)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( saved !== null && (typeof saved == type || (type == 'array' && saved instanceof Array)) ) {
|
|
|
|
StateMemory[key] = saved;
|
|
|
|
} else {
|
|
|
|
StateMemory[key] = (() => {switch (type) {
|
|
|
|
case 'string': return ''; break;
|
|
|
|
case 'number': return 0; break;
|
|
|
|
case 'boolean': return false; break;
|
|
|
|
case 'object': return {}; break;
|
|
|
|
case 'array': return []; break;
|
|
|
|
}})();
|
|
|
|
}
|
|
|
|
},
|
2022-12-21 22:13:41 +08:00
|
|
|
set(key, value) {
|
|
|
|
if (StateMemory[key] instanceof Array) {
|
|
|
|
StateMemory[key].replace(value);
|
|
|
|
} else {
|
|
|
|
StateMemory[key] = value;
|
|
|
|
}
|
|
|
|
StateMemory.save(key);
|
|
|
|
},
|
2020-04-26 02:25:07 +08:00
|
|
|
save(key) {
|
|
|
|
let serialized = JSON.stringify(StateMemory[key])
|
|
|
|
localStorage.setItem(`StateMemory.${key}`, serialized)
|
|
|
|
}
|
|
|
|
}
|