Mon 21 Jul 22:43:21 CEST 2025

This commit is contained in:
sbosse 2025-07-21 23:19:52 +02:00
parent 6462b9d66d
commit b8a987e4e1

178
js/ui/webui/editor.js Normal file
View File

@ -0,0 +1,178 @@
Editors=[]
Editor = {
index:0,
create: function (options) {
// Direct WEBUI API
options=options||{}
options.collapsed=options.collapsed||false;
options.extension=options.extension||'lua';
Object.assign(options,{
file:'untitled',
})
function Label() {
return options.label?options.label:options.file+'.'+options.extension+' #'+id
}
function updateMenu() {
}
var id = Editor.index++,
label = Label();
var editor = {
id:'editor'+id,
index:id,
}
function collapse(mini) {
var container = $('[view_id=SourceTextWin'+id+']'),
head = container.find('.webix_win_head');
if (mini && options.collapsed) {
return {width:head.width(),height:head.height()}
}
options.collapsed=!options.collapsed;
if (options.collapsed) {
options._height=container.height();
container.height(head.height());
} else container.height(options._height);
return options.collapsed?{width:head.width(),height:head.height()}:
{width:container.width(),height:container.height()};
}
function createButtons (buts) {
var buttons=[];
for(var label in buts) {
// id:icon:tooltip
var tokens = label.split(':'),
icon = tokens[1]||'?',
tooltip = tokens[2]||'?',
handler = buts[label];
buttons.push(
{ view:"button", type:"icon", icon:icon, tooltip:tooltip, width:30, click:handler}
)
}
return buttons;
}
var toolbar = [
{ view:"button", type:"icon", icon:"folder-open", tooltip:'Open File', width:30, click:function () {
loadFile(function (text,file) {
if (text) {
UI('SourceText'+id).setValue(text)
if (file) {
options.file=file
if (editor.handlers['file']) editor.handlers['file'](file);
else UI('SourceTextWinLabel'+id).setValue(Label());
}
}
});
}},
{ view:"button", type:"icon", icon:"save", tooltip:'Save File', width:30, click:function () {
var code = UI('SourceText'+id).getValue();
saveFile(code,options.file,'text/plain',function (file) {
if (file) {
options.file=file
// UI('SourceTextWinLabel'+id).setValue(Label())
// updateMenu()
if (editor.handlers['file']) editor.handlers['file'](file);
else UI('SourceTextWinLabel'+id).setValue(Label());
}
});
}},
{ view:"button", type:"icon", icon:"file", tooltip:'New File', width:30, click:function () {
}},
{ view:"button", type:"icon", icon:"user", tooltip:'Share Code', width:30, click:function () {
Clip.share(id);
}}].concat(options.buttons?createButtons(options.buttons):[]).concat([
{ view:"label", label:label, id:'SourceTextWinLabel'+id, align:'right'},
{ view:"button", type:"icon", icon:"caret-down", tooltip:'Collapse Editor', width:30, click:function () {
collapse()
}},
{ view:"button", type:"icon", icon:"windows", tooltip:'Hide Editor', width:30, click:function () {
if (options.hide!==false) window.hide();
}}
]);
if (options.close!==false) toolbar.push({ view:"button", type:"icon", icon:"close", tooltip:'Close Editor', width:30, click:function () {
Editor.exit(id);
window.close();
if (editor.handlers.close) editor.handlers.close();
}});
var window = webix.ui({
id:'SourceTextWin'+id,
view:"window",
height:350,
width:600,
left:options.x||250, top:options.y||50,
move:true,
resize: true,
toFront:true,
css:'green_toolbar',
head:{
view:"toolbar",
cols:toolbar
},
body:{
id : 'SourceText'+id,
view: "codemirror-editor",
style : "color:black",
mode:options.mode||'plain',
attributes : { spellcheck:false, smartIndent:false, indentUnit:2 },
}
});
editor.window=window;
editor.collapse=collapse;
window.show();
editor.editor={
get : function () { return UI('SourceText'+id).getValue(); },
set : function (text) { return UI('SourceText'+id).setValue(text); },
}
if (options.buttons) {
// find run button, publish event handler
for(var p in options.buttons) {
if (p.indexOf('run')!=-1) {
editor.editor.run=options.buttons[p];
break;
}
}
}
if (options.text) editor.editor.set(options.text);
if (options.collapsed) { collapse(false) };
editor.close = function () {
Editor.exit(id);
window.close();
}
editor.handlers=[];
editor.on = function (ev,handler) {
editor.handlers[ev]=handler;
}
editor.options=options;
editor.setLabel = function (label) {
UI('SourceTextWinLabel'+id).setValue(label)
}
return editor
},
default : function (options) {
options=options||{}
var editor = Editor.editor({
label : options.label||'Text Editor',
mode : options.mode||'javascript',
buttons : options.buttons,
x : options.x,
y : options.y,
text : options.text,
collapsed : options.collapsed,
hide : options.hide,
close : options.close,
_height: options._height,
});
if (options.actions) {
options.actions.widget(editor);
editor.on('close',options.actions.close);
}
return editor;
},
editor : function (options) {
return Editor.create(options);
},
exit : function (id) {
id=String(id).replace('editor','');
if (!Editors[id]) return;
delete Editors[id];
},
}
UI.Editor=Editor;