Compare commits
4 Commits
3e3f06eb17
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 9cea2c52b4 | |||
| 5d26e97607 | |||
| 898981e9dd | |||
| 8752fdf1e8 |
25
README.md
25
README.md
@@ -1,7 +1,28 @@
|
|||||||
# RU
|
# RU
|
||||||
|
|
||||||
Это хранилище МИРА, модульной платформы.
|
МУРОМ:
|
||||||
|
|
||||||
|
* является редактором игр
|
||||||
|
* исполняется в веб-браузере
|
||||||
|
* использует [МОТОР][motor] для отображения 3D
|
||||||
|
* долговечен, доступен, независим
|
||||||
|
* выпущен под лицензией [CC0][cc0] (общественное достояние)
|
||||||
|
|
||||||
|
Подробности на [http://opengamestudio.org/murom][murom-ru].
|
||||||
|
|
||||||
# EN
|
# EN
|
||||||
|
|
||||||
This is the repository of MIR, a modular platform.
|
MUROM:
|
||||||
|
|
||||||
|
* is a game editor
|
||||||
|
* runs in your web browser
|
||||||
|
* uses [MOTOR][motor] to render 3D
|
||||||
|
* is durable, accessible, independent
|
||||||
|
* is released under [CC0][cc0] license (public domain)
|
||||||
|
|
||||||
|
Read more at [http://opengamestudio.org/murom][murom].
|
||||||
|
|
||||||
|
[murom]: http://opengamestudio.org/murom
|
||||||
|
[murom-ru]: http://opengamestudio.org/murom/ru
|
||||||
|
[motor]: http://bitbucket.com/ogstudio/motor
|
||||||
|
[cc0]: https://creativecommons.org/share-your-work/public-domain/cc0/
|
||||||
|
|||||||
@@ -1,12 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<head>
|
|
||||||
<style>
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<script>
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
1
murom_2.0.0.html
Symbolic link
1
murom_2.0.0.html
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
муром_2.0.0.html
|
||||||
166
модули/муром.база_1.0.0.js
Normal file
166
модули/муром.база_1.0.0.js
Normal file
@@ -0,0 +1,166 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* Скачиваемый файл / Downloaded file
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
муром.файл = {};
|
||||||
|
муром.файл.начало =
|
||||||
|
`
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<body>
|
||||||
|
<script>
|
||||||
|
var муром = {};
|
||||||
|
var murom = муром;
|
||||||
|
муром.модули = [
|
||||||
|
`;
|
||||||
|
муром.файл.конец =
|
||||||
|
`
|
||||||
|
];
|
||||||
|
|
||||||
|
Object.defineProperty(murom, "modules", {
|
||||||
|
get: function()
|
||||||
|
{
|
||||||
|
return муром.модули;
|
||||||
|
},
|
||||||
|
set: function(значения)
|
||||||
|
{
|
||||||
|
муром.модули = значения;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var загрузочныйМодуль = муром.модули[0];
|
||||||
|
var код = atob(загрузочныйМодуль[1]);
|
||||||
|
eval(код);
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
`;
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* UUID
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Create GUID / UUID in JavaScript?
|
||||||
|
// https://stackoverflow.com/a/2117523
|
||||||
|
муром.uuid = function()
|
||||||
|
{
|
||||||
|
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(
|
||||||
|
/[xy]/g,
|
||||||
|
function(c)
|
||||||
|
{
|
||||||
|
var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
|
||||||
|
return v.toString(16);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* Уведомитель / Reporter
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ReporterSubscription class.
|
||||||
|
function ReporterSubscription(id, callback, reporter)
|
||||||
|
{
|
||||||
|
this.id = id;
|
||||||
|
this.callback = callback;
|
||||||
|
this.reporter = reporter;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reporter class.
|
||||||
|
function Reporter(name)
|
||||||
|
{
|
||||||
|
this.name =
|
||||||
|
(typeof name !== "undefined") ?
|
||||||
|
name :
|
||||||
|
"";
|
||||||
|
this.subscriptions = [];
|
||||||
|
}
|
||||||
|
Reporter.prototype.report = function()
|
||||||
|
{
|
||||||
|
for (var id in this.subscriptions)
|
||||||
|
{
|
||||||
|
var subscription = this.subscriptions[id];
|
||||||
|
subscription.callback();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Reporter.prototype.subscribe = function(callback)
|
||||||
|
{
|
||||||
|
var id = murom.uuid();
|
||||||
|
var subscription = new ReporterSubscription(id, callback, this);
|
||||||
|
this.subscriptions.push(subscription);
|
||||||
|
return subscription;
|
||||||
|
}
|
||||||
|
Reporter.prototype.subscribeMany = function(funcs)
|
||||||
|
{
|
||||||
|
for (var i = 0; i < funcs.length; ++i)
|
||||||
|
{
|
||||||
|
var func = funcs[i];
|
||||||
|
this.subscribe(func);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var Уведомитель = Reporter;
|
||||||
|
Reporter.prototype.уведомить = function()
|
||||||
|
{
|
||||||
|
this.report();
|
||||||
|
};
|
||||||
|
Reporter.prototype.подписать = function(функция)
|
||||||
|
{
|
||||||
|
this.subscribe(функция);
|
||||||
|
};
|
||||||
|
Reporter.prototype.подписатьМного = function(funcs)
|
||||||
|
{
|
||||||
|
this.subscribeMany(funcs);
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* Пуск / Start
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
муром.пуск = new Уведомитель();
|
||||||
|
// Can also be accessed as 'murom.run'.
|
||||||
|
Object.defineProperty(murom, "run", {
|
||||||
|
get: function()
|
||||||
|
{
|
||||||
|
return муром.пуск;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
murom.start = function()
|
||||||
|
{
|
||||||
|
муром.пуск.уведомить();
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* Левая и правая области / Left and right regions
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
муром.создатьЛевуюПравуюОбласти = function()
|
||||||
|
{
|
||||||
|
// Левая область.
|
||||||
|
var ло = document.createElement("div");
|
||||||
|
ло.id="левая-область";
|
||||||
|
ло.style.cssText =
|
||||||
|
"position: fixed; left: 0; top: 0; bottom: 0; width: 50%;";
|
||||||
|
document.body.appendChild(ло);
|
||||||
|
|
||||||
|
// Правая область.
|
||||||
|
var по = document.createElement("div");
|
||||||
|
по.id="правая-область";
|
||||||
|
по.style.cssText =
|
||||||
|
"position: fixed; right: 0; top: 0; bottom: 0; width: 50%;";
|
||||||
|
document.body.appendChild(по);
|
||||||
|
|
||||||
|
return [ло, по];
|
||||||
|
};
|
||||||
122
модули/муром.загрузка_1.0.0.js
Normal file
122
модули/муром.загрузка_1.0.0.js
Normal file
File diff suppressed because one or more lines are too long
765
модули/муром.пу_1.0.0.js
Normal file
765
модули/муром.пу_1.0.0.js
Normal file
@@ -0,0 +1,765 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* Внешний вид
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
function задатьВнешнийВид()
|
||||||
|
{
|
||||||
|
var вид = document.createElement("style");
|
||||||
|
document.head.appendChild(вид);
|
||||||
|
вид.innerHTML =
|
||||||
|
`
|
||||||
|
.муром-кнопка
|
||||||
|
{
|
||||||
|
padding: 0.5em 2em 0.5em 2em;
|
||||||
|
margin-right: 0.5em;
|
||||||
|
float: right;
|
||||||
|
color: #222;
|
||||||
|
font-family: sans-serif;
|
||||||
|
border: 1px solid #ddd;
|
||||||
|
background-color: transparent;
|
||||||
|
cursor: pointer;
|
||||||
|
text-transform: uppercase;
|
||||||
|
-webkit-transition-duration: 0.2s; /* Safari */
|
||||||
|
transition-duration: 0.2s;
|
||||||
|
}
|
||||||
|
.муром-кнопка:hover
|
||||||
|
{
|
||||||
|
border: 1px solid #222;
|
||||||
|
}
|
||||||
|
.муром-отступ-по-сторонам
|
||||||
|
{
|
||||||
|
margin-left: 0.5em;
|
||||||
|
margin-right: 0.5em;
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* Список модулей
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
function СписокМодулей()
|
||||||
|
{
|
||||||
|
var я = this;
|
||||||
|
|
||||||
|
this.создатьИнтерфейс();
|
||||||
|
this.задатьВид();
|
||||||
|
this.выбрали = new Уведомитель();
|
||||||
|
this.выбрали.подписать(function(){
|
||||||
|
я.отобразитьВыбор();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
СписокМодулей.prototype.создатьИнтерфейс = function()
|
||||||
|
{
|
||||||
|
// Помещаем таблицу в div для реализации промотки.
|
||||||
|
this.иф = document.createElement("div");
|
||||||
|
this.таблица = document.createElement("table");
|
||||||
|
this.иф.appendChild(this.таблица);
|
||||||
|
};
|
||||||
|
СписокМодулей.prototype.задатьВид = function()
|
||||||
|
{
|
||||||
|
this.иф.style.cssText =
|
||||||
|
`
|
||||||
|
overflow: auto;
|
||||||
|
height: 18.5em;
|
||||||
|
border: 1px solid #ddd;
|
||||||
|
/*
|
||||||
|
padding: 0.5em;
|
||||||
|
margin: 0.5em;
|
||||||
|
*/
|
||||||
|
`;
|
||||||
|
this.таблица.style.cssText =
|
||||||
|
`
|
||||||
|
color: #666666;
|
||||||
|
font-family: sans-serif;
|
||||||
|
cursor: default;
|
||||||
|
border-collapse: collapse;
|
||||||
|
`;
|
||||||
|
};
|
||||||
|
СписокМодулей.prototype.очистить = function()
|
||||||
|
{
|
||||||
|
while (this.таблица.rows.length)
|
||||||
|
{
|
||||||
|
this.таблица.deleteRow(0);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
СписокМодулей.prototype.добавитьЭлемент = function(статус, имя)
|
||||||
|
{
|
||||||
|
var статусHTML = "";
|
||||||
|
if (статус)
|
||||||
|
{
|
||||||
|
статусHTML = "checked";
|
||||||
|
}
|
||||||
|
|
||||||
|
var ряд = this.таблица.insertRow();
|
||||||
|
var ячейка = 0;
|
||||||
|
|
||||||
|
var номер = ряд.insertCell(ячейка++);
|
||||||
|
номер.innerHTML = this.таблица.rows.length - 1;
|
||||||
|
номер.style.cssText = "padding: 0.5em;";
|
||||||
|
|
||||||
|
var вкл = ряд.insertCell(ячейка++);
|
||||||
|
вкл.innerHTML = `<input type="checkbox" disabled ` + статусHTML + `></input>`;
|
||||||
|
|
||||||
|
var название = ряд.insertCell(ячейка++);
|
||||||
|
название.innerHTML = имя;
|
||||||
|
название.style.cssText = "padding: 0.5em; width: 100%;";
|
||||||
|
};
|
||||||
|
СписокМодулей.prototype.отобразитьСписок = function(список)
|
||||||
|
{
|
||||||
|
this.очистить();
|
||||||
|
for (var номер in список)
|
||||||
|
{
|
||||||
|
var элемент = список[номер];
|
||||||
|
var статус = элемент[0];
|
||||||
|
var имя = элемент[1];
|
||||||
|
this.добавитьЭлемент(статус, имя);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
СписокМодулей.prototype.улавливатьВыборЭлемента = function(номер)
|
||||||
|
{
|
||||||
|
var я = this;
|
||||||
|
|
||||||
|
var ряд = this.таблица.rows[номер]
|
||||||
|
ряд.onclick = function()
|
||||||
|
{
|
||||||
|
я.выборРанее = я.выбор;
|
||||||
|
я.выбор = номер;
|
||||||
|
я.выбрали.уведомить();
|
||||||
|
};
|
||||||
|
};
|
||||||
|
СписокМодулей.prototype.улавливатьВыбор = function()
|
||||||
|
{
|
||||||
|
this.выборРанее = null;
|
||||||
|
this.выбор = null;
|
||||||
|
for (var номер = 0; номер < this.таблица.rows.length; ++номер)
|
||||||
|
{
|
||||||
|
this.улавливатьВыборЭлемента(номер);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
СписокМодулей.prototype.отобразитьВыбор = function()
|
||||||
|
{
|
||||||
|
if (this.выборРанее != null)
|
||||||
|
{
|
||||||
|
var ряд = this.таблица.rows[this.выборРанее];
|
||||||
|
ряд.style.backgroundColor = null;
|
||||||
|
}
|
||||||
|
var ряд = this.таблица.rows[this.выбор];
|
||||||
|
ряд.style.backgroundColor = "#eee";
|
||||||
|
};
|
||||||
|
СписокМодулей.prototype.задатьСписок = function(список)
|
||||||
|
{
|
||||||
|
this.отобразитьСписок(список);
|
||||||
|
this.улавливатьВыбор();
|
||||||
|
};
|
||||||
|
СписокМодулей.prototype.выбрать = function(номер)
|
||||||
|
{
|
||||||
|
var ряд = this.таблица.rows[номер];
|
||||||
|
ряд.scrollIntoView();
|
||||||
|
ряд.onclick();
|
||||||
|
};
|
||||||
|
СписокМодулей.prototype.обновитьЭлемент = function(номер, статус, имя)
|
||||||
|
{
|
||||||
|
var ряд = this.таблица.rows[номер];
|
||||||
|
ряд.cells[1].childNodes[0].checked = статус;
|
||||||
|
ряд.cells[2].innerHTML = имя;
|
||||||
|
};
|
||||||
|
СписокМодулей.prototype.удалитьЭлемент = function(номер)
|
||||||
|
{
|
||||||
|
var ряд = this.таблица.rows[номер];
|
||||||
|
ряд.parentNode.removeChild(ряд);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* Тест списка модулей
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
function ТестСпискаМодулей()
|
||||||
|
{
|
||||||
|
this.создатьИнтерфейс();
|
||||||
|
}
|
||||||
|
ТестСпискаМодулей.prototype.создатьИнтерфейс = function()
|
||||||
|
{
|
||||||
|
var я = this;
|
||||||
|
|
||||||
|
this.иф = document.createElement("div");
|
||||||
|
this.список = new СписокМодулей();
|
||||||
|
this.иф.appendChild(this.список.иф);
|
||||||
|
|
||||||
|
var модули = [
|
||||||
|
[true, "муром.загрузка_1.0.0"],
|
||||||
|
[true, "муром.uuid_1.0.0"],
|
||||||
|
[true, "Уведомитель_1.0.0"],
|
||||||
|
[false, "uikit_3.2.0.css"],
|
||||||
|
[false, "uikit_3.2.0.js"],
|
||||||
|
[false, "ПанельУправления.UIKit"],
|
||||||
|
[false, "ПанельУправления_1.0.0"],
|
||||||
|
];
|
||||||
|
|
||||||
|
this.список.задатьСписок(модули);
|
||||||
|
this.список.выбрать(0);
|
||||||
|
|
||||||
|
this.создатьКнопку("Выбрать последний", function(){
|
||||||
|
console.log("выбрать");
|
||||||
|
я.список.выбрать(модули.length - 1);
|
||||||
|
});
|
||||||
|
this.создатьКнопку("Обновить последний", function(){
|
||||||
|
я.список.обновитьЭлемент(модули.length - 1, true, "Новое имя");
|
||||||
|
});
|
||||||
|
this.создатьКнопку("Удалить последний", function(){
|
||||||
|
я.список.удалитьЭлемент(модули.length - 1);
|
||||||
|
});
|
||||||
|
this.создатьКнопку("Добавить", function(){
|
||||||
|
я.список.добавитьЭлемент(true, "Новый-599");
|
||||||
|
var номер = я.список.таблица.rows.length - 1;
|
||||||
|
я.список.улавливатьВыборЭлемента(номер);
|
||||||
|
я.список.выбрать(номер);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
ТестСпискаМодулей.prototype.создатьКнопку = function(имя, реакция)
|
||||||
|
{
|
||||||
|
var кнопка = document.createElement("button");
|
||||||
|
кнопка.innerHTML = имя;
|
||||||
|
this.иф.appendChild(кнопка);
|
||||||
|
кнопка.onclick = реакция;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* Свойства модуля
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
function СвойстваМодуля()
|
||||||
|
{
|
||||||
|
this.создатьИнтерфейс();
|
||||||
|
this.изменилиНомер = new Уведомитель();
|
||||||
|
this.настроитьНомер();
|
||||||
|
this.изменилиИмя = new Уведомитель();
|
||||||
|
this.настроитьИмя();
|
||||||
|
this.изменилиСтатус = new Уведомитель();
|
||||||
|
this.настроитьСтатус();
|
||||||
|
this.удалить = new Уведомитель();
|
||||||
|
this.настроитьУдаление();
|
||||||
|
}
|
||||||
|
СвойстваМодуля.prototype.создатьИнтерфейс = function()
|
||||||
|
{
|
||||||
|
this.иф = document.createElement("div");
|
||||||
|
this.иф.style.cssText =
|
||||||
|
`
|
||||||
|
border: 1px solid #ddd;
|
||||||
|
/*
|
||||||
|
padding: 0.5em;
|
||||||
|
margin: 0.5em;
|
||||||
|
*/
|
||||||
|
color: #666666;
|
||||||
|
font-family: sans-serif;
|
||||||
|
`;
|
||||||
|
this.таблица = document.createElement("table");
|
||||||
|
this.иф.appendChild(this.таблица);
|
||||||
|
};
|
||||||
|
Object.defineProperty(СвойстваМодуля.prototype, "номер", {
|
||||||
|
get: function()
|
||||||
|
{
|
||||||
|
return Number(this.полеНомер.value);
|
||||||
|
},
|
||||||
|
set: function(значение)
|
||||||
|
{
|
||||||
|
this.полеНомер.value = значение;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
СвойстваМодуля.prototype.настроитьНомер = function()
|
||||||
|
{
|
||||||
|
var я = this;
|
||||||
|
|
||||||
|
var ряд = this.таблица.insertRow();
|
||||||
|
var ячейка = 0;
|
||||||
|
|
||||||
|
var ключ = ряд.insertCell(ячейка++);
|
||||||
|
ключ.innerHTML = "Номер:";
|
||||||
|
ключ.style.cssText = "padding: 0.5em;";
|
||||||
|
|
||||||
|
var значение = ряд.insertCell(ячейка++);
|
||||||
|
this.полеНомер = document.createElement("input");
|
||||||
|
this.полеНомер.type = "number";
|
||||||
|
this.полеНомер.min = 0;
|
||||||
|
значение.style.cssText = "width: 100%; padding: 0.5em;";
|
||||||
|
this.полеНомер.style.cssText = "width: 100%;";
|
||||||
|
значение.appendChild(this.полеНомер);
|
||||||
|
|
||||||
|
this.полеНомер.oninput = function()
|
||||||
|
{
|
||||||
|
я.изменилиНомер.уведомить();
|
||||||
|
};
|
||||||
|
};
|
||||||
|
Object.defineProperty(СвойстваМодуля.prototype, "имя", {
|
||||||
|
get: function()
|
||||||
|
{
|
||||||
|
return this.полеИмя.value;
|
||||||
|
},
|
||||||
|
set: function(значение)
|
||||||
|
{
|
||||||
|
this.полеИмя.value = значение;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
СвойстваМодуля.prototype.настроитьИмя = function()
|
||||||
|
{
|
||||||
|
var я = this;
|
||||||
|
|
||||||
|
var ряд = this.таблица.insertRow();
|
||||||
|
var ячейка = 0;
|
||||||
|
|
||||||
|
var ключ = ряд.insertCell(ячейка++);
|
||||||
|
ключ.innerHTML = "Имя:";
|
||||||
|
ключ.style.cssText = "padding: 0.5em;";
|
||||||
|
|
||||||
|
var значение = ряд.insertCell(ячейка++);
|
||||||
|
this.полеИмя = document.createElement("input");
|
||||||
|
значение.style.cssText = "width: 100%; padding: 0.5em;";
|
||||||
|
this.полеИмя.style.cssText = "width: 100%;";
|
||||||
|
значение.appendChild(this.полеИмя);
|
||||||
|
|
||||||
|
this.полеИмя.oninput = function()
|
||||||
|
{
|
||||||
|
я.изменилиИмя.уведомить();
|
||||||
|
};
|
||||||
|
};
|
||||||
|
Object.defineProperty(СвойстваМодуля.prototype, "статус", {
|
||||||
|
get: function()
|
||||||
|
{
|
||||||
|
return this.переключатель.checked;
|
||||||
|
},
|
||||||
|
set: function(значение)
|
||||||
|
{
|
||||||
|
this.переключатель.checked = значение;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
СвойстваМодуля.prototype.настроитьСтатус = function()
|
||||||
|
{
|
||||||
|
var я = this;
|
||||||
|
|
||||||
|
var ряд = this.таблица.insertRow();
|
||||||
|
var ячейка = 0;
|
||||||
|
|
||||||
|
var ключ = ряд.insertCell(ячейка++);
|
||||||
|
ключ.innerHTML = "Исполнять:";
|
||||||
|
ключ.style.cssText = "padding: 0.5em;";
|
||||||
|
|
||||||
|
var значение = ряд.insertCell(ячейка++);
|
||||||
|
this.переключатель = document.createElement("input");
|
||||||
|
this.переключатель.type = "checkbox";
|
||||||
|
this.переключатель.style.cssText = "padding: 0.5em;";
|
||||||
|
значение.appendChild(this.переключатель);
|
||||||
|
|
||||||
|
this.переключатель.onchange = function()
|
||||||
|
{
|
||||||
|
я.изменилиСтатус.уведомить();
|
||||||
|
};
|
||||||
|
ключ.onclick = function()
|
||||||
|
{
|
||||||
|
я.переключатель.checked = !я.переключатель.checked;
|
||||||
|
я.изменилиСтатус.уведомить();
|
||||||
|
};
|
||||||
|
};
|
||||||
|
СвойстваМодуля.prototype.настроитьУдаление = function()
|
||||||
|
{
|
||||||
|
var я = this;
|
||||||
|
|
||||||
|
var ряд = this.таблица.insertRow();
|
||||||
|
var ячейка = 0;
|
||||||
|
|
||||||
|
ряд.insertCell(ячейка++);
|
||||||
|
var значение = ряд.insertCell(ячейка++);
|
||||||
|
|
||||||
|
this.кнопкаУдалить = document.createElement("button");
|
||||||
|
this.кнопкаУдалить.innerHTML = "Удалить";
|
||||||
|
this.кнопкаУдалить.classList.add("муром-кнопка");
|
||||||
|
значение.appendChild(this.кнопкаУдалить);
|
||||||
|
|
||||||
|
this.кнопкаУдалить.onclick = function()
|
||||||
|
{
|
||||||
|
я.удалить.уведомить();
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* Тест свойства модуля
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
function ТестСвойстваМодуля()
|
||||||
|
{
|
||||||
|
this.создатьИнтерфейс();
|
||||||
|
}
|
||||||
|
ТестСвойстваМодуля.prototype.создатьИнтерфейс = function()
|
||||||
|
{
|
||||||
|
var я = this;
|
||||||
|
|
||||||
|
this.иф = document.createElement("div");
|
||||||
|
this.свойства = new СвойстваМодуля();
|
||||||
|
this.иф.appendChild(this.свойства.иф);
|
||||||
|
|
||||||
|
this.свойства.изменилиНомер.подписать(function(){
|
||||||
|
console.log("номер: '" + я.свойства.номер + "'");
|
||||||
|
});
|
||||||
|
this.свойства.изменилиИмя.подписать(function(){
|
||||||
|
console.log("имя: '" + я.свойства.имя + "'");
|
||||||
|
});
|
||||||
|
this.свойства.изменилиСтатус.подписать(function(){
|
||||||
|
console.log("статус: '" + я.свойства.статус + "'");
|
||||||
|
});
|
||||||
|
this.свойства.удалить.подписать(function(){
|
||||||
|
console.log("удалить модуль '" + я.свойства.имя + "'");
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* Модули
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
function Модули()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
Модули.prototype.свойства = function(номер)
|
||||||
|
{
|
||||||
|
return murom.moduleProperties(номер);
|
||||||
|
};
|
||||||
|
Модули.prototype.задатьСвойства = function(номер, свойства)
|
||||||
|
{
|
||||||
|
var м = муром.модули[номер];
|
||||||
|
м[2] = свойства;
|
||||||
|
};
|
||||||
|
Модули.prototype.статус = function(номер)
|
||||||
|
{
|
||||||
|
return murom.moduleStatus(номер);
|
||||||
|
};
|
||||||
|
Модули.prototype.задатьСтатус = function(номер, статус)
|
||||||
|
{
|
||||||
|
var св = this.свойства(номер);
|
||||||
|
св["status"] = статус;
|
||||||
|
this.задатьСвойства(номер, св);
|
||||||
|
};
|
||||||
|
Модули.prototype.задатьИмя = function(номер, имя)
|
||||||
|
{
|
||||||
|
var м = муром.модули[номер];
|
||||||
|
м[0] = имя;
|
||||||
|
};
|
||||||
|
Модули.prototype.задатьНомер = function(старый, новый)
|
||||||
|
{
|
||||||
|
//console.log("задать номер. '" + старый + "' -> '" + новый + "'");
|
||||||
|
var модуль = муром.модули[старый];
|
||||||
|
// Удаляем старую запись.
|
||||||
|
муром.модули.splice(старый, 1);
|
||||||
|
// Добавляем модуль в новую позицию.
|
||||||
|
муром.модули.splice(новый, 0, модуль);
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* Панель управления
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
function ПанельУправления()
|
||||||
|
{
|
||||||
|
this.модули = new Модули();
|
||||||
|
this.создатьОснову();
|
||||||
|
this.создатьСохранениеСкачиваниеДобавление();
|
||||||
|
this.создатьСписокМодулей();
|
||||||
|
this.создатьСвойстваМодуля();
|
||||||
|
}
|
||||||
|
ПанельУправления.prototype.создатьОбёрткуЯчейку = function()
|
||||||
|
{
|
||||||
|
var обёртка = document.createElement("table");
|
||||||
|
обёртка.style.cssText = "width: 100%;";
|
||||||
|
var ряд = обёртка.insertRow();
|
||||||
|
var ячейка = ряд.insertCell();
|
||||||
|
return [обёртка, ячейка];
|
||||||
|
};
|
||||||
|
ПанельУправления.prototype.создатьОснову = function()
|
||||||
|
{
|
||||||
|
this.иф = document.createElement("table");
|
||||||
|
this.иф.style.cssText = "width: 100%;";
|
||||||
|
var ряд = this.иф.insertRow();
|
||||||
|
this.лево = ряд.insertCell();
|
||||||
|
this.лево.style.cssText = "width: 100%;";
|
||||||
|
var право = ряд.insertCell();
|
||||||
|
право.style.cssText = "height: 100%;";
|
||||||
|
this.кнопки = document.createElement("table");
|
||||||
|
this.кнопки.style.cssText = "height: 100%;";
|
||||||
|
право.appendChild(this.кнопки);
|
||||||
|
ряд = this.иф.insertRow();
|
||||||
|
this.низ = ряд.insertCell();
|
||||||
|
this.низ.colSpan = 2;
|
||||||
|
};
|
||||||
|
ПанельУправления.prototype.создатьСписокМодулей = function()
|
||||||
|
{
|
||||||
|
this.список = new СписокМодулей();
|
||||||
|
this.список.задатьСписок(this.списокМодулей());
|
||||||
|
var оя = this.создатьОбёрткуЯчейку();
|
||||||
|
this.лево.appendChild(оя[0]);
|
||||||
|
оя[1].appendChild(this.список.иф);
|
||||||
|
};
|
||||||
|
ПанельУправления.prototype.создатьСвойстваМодуля = function()
|
||||||
|
{
|
||||||
|
this.свойства = new СвойстваМодуля();
|
||||||
|
оя = this.создатьОбёрткуЯчейку();
|
||||||
|
this.низ.appendChild(оя[0]);
|
||||||
|
оя[1].appendChild(this.свойства.иф);
|
||||||
|
};
|
||||||
|
ПанельУправления.prototype.списокМодулей = function()
|
||||||
|
{
|
||||||
|
var список = [];
|
||||||
|
for (var номер in муром.модули)
|
||||||
|
{
|
||||||
|
var м = муром.модули[номер];
|
||||||
|
var статус = this.модули.статус(номер);
|
||||||
|
var имя = м[0];
|
||||||
|
var элемент = [статус, имя];
|
||||||
|
список.push(элемент);
|
||||||
|
}
|
||||||
|
|
||||||
|
return список;
|
||||||
|
};
|
||||||
|
ПанельУправления.prototype.создатьКнопку = function(имя, уведомитель)
|
||||||
|
{
|
||||||
|
var кнопка = document.createElement("button");
|
||||||
|
кнопка.innerHTML = имя;
|
||||||
|
кнопка.style.cssText = "width: 100%;";
|
||||||
|
кнопка.classList.add("муром-кнопка");
|
||||||
|
кнопка.onclick = function()
|
||||||
|
{
|
||||||
|
уведомитель.уведомить();
|
||||||
|
};
|
||||||
|
|
||||||
|
return кнопка;
|
||||||
|
};
|
||||||
|
ПанельУправления.prototype.создатьСохранениеСкачиваниеДобавление = function()
|
||||||
|
{
|
||||||
|
var я = this;
|
||||||
|
|
||||||
|
var ряд = this.кнопки.insertRow();
|
||||||
|
var ячейка = ряд.insertCell();
|
||||||
|
this.сохранить = new Уведомитель();
|
||||||
|
this.кнопкаСохранить = this.создатьКнопку("Сохранить", this.сохранить);
|
||||||
|
ячейка.appendChild(this.кнопкаСохранить);
|
||||||
|
|
||||||
|
ряд = this.кнопки.insertRow();
|
||||||
|
ячейка = ряд.insertCell();
|
||||||
|
this.скачать = new Уведомитель();
|
||||||
|
this.кнопкаСкачать = this.создатьКнопку("Скачать", this.скачать);
|
||||||
|
ячейка.appendChild(this.кнопкаСкачать);
|
||||||
|
|
||||||
|
// Пробел.
|
||||||
|
ряд = this.кнопки.insertRow();
|
||||||
|
ячейка = ряд.insertCell();
|
||||||
|
ячейка.style.cssText = "height: 100%;";
|
||||||
|
|
||||||
|
ряд = this.кнопки.insertRow();
|
||||||
|
ячейка = ряд.insertCell();
|
||||||
|
this.добавить = new Уведомитель();
|
||||||
|
this.кнопкаДобавить = this.создатьКнопку("Добавить", this.добавить);
|
||||||
|
ячейка.appendChild(this.кнопкаДобавить);
|
||||||
|
};
|
||||||
|
ПанельУправления.prototype.имяФайла = function()
|
||||||
|
{
|
||||||
|
var путь = window.location.pathname;
|
||||||
|
var имя = путь.split("/").pop();
|
||||||
|
return decodeURI(имя);
|
||||||
|
};
|
||||||
|
|
||||||
|
function запуститьПУ()
|
||||||
|
{
|
||||||
|
var пу = new ПанельУправления();
|
||||||
|
муром.пу = пу;
|
||||||
|
var области = муром.создатьЛевуюПравуюОбласти();
|
||||||
|
var по = области[1];
|
||||||
|
по.appendChild(пу.иф);
|
||||||
|
муром.создатьРедакторВЛевойОбласти();
|
||||||
|
var список = пу.список;
|
||||||
|
var свойства = пу.свойства;
|
||||||
|
var модули = пу.модули;
|
||||||
|
|
||||||
|
function отобразитьКодВыбранногоМодуля()
|
||||||
|
{
|
||||||
|
var модуль = муром.модули[список.выбор];
|
||||||
|
var код = муром.atob(модуль[1]);
|
||||||
|
муром.редактор.session.setValue(код);
|
||||||
|
}
|
||||||
|
function отобразитьСвойстваВыбранногоМодуля()
|
||||||
|
{
|
||||||
|
var модуль = муром.модули[список.выбор];
|
||||||
|
|
||||||
|
свойства.номер = список.выбор;
|
||||||
|
свойства.имя = модуль[0];
|
||||||
|
свойства.статус = пу.модули.статус(список.выбор);
|
||||||
|
}
|
||||||
|
список.выбрали.подписатьМного([
|
||||||
|
отобразитьКодВыбранногоМодуля,
|
||||||
|
отобразитьСвойстваВыбранногоМодуля,
|
||||||
|
]);
|
||||||
|
|
||||||
|
function обновитьСтатусМодуля()
|
||||||
|
{
|
||||||
|
var номер = список.выбор;
|
||||||
|
var имя = свойства.имя;
|
||||||
|
var статус = свойства.статус;
|
||||||
|
модули.задатьСтатус(номер, статус);
|
||||||
|
список.обновитьЭлемент(номер, статус, имя);
|
||||||
|
}
|
||||||
|
свойства.изменилиСтатус.подписать(обновитьСтатусМодуля);
|
||||||
|
|
||||||
|
function обновитьИмяМодуля()
|
||||||
|
{
|
||||||
|
var номер = список.выбор;
|
||||||
|
var имя = свойства.имя;
|
||||||
|
var статус = свойства.статус;
|
||||||
|
модули.задатьИмя(номер, имя);
|
||||||
|
список.обновитьЭлемент(номер, статус, имя);
|
||||||
|
}
|
||||||
|
свойства.изменилиИмя.подписать(обновитьИмяМодуля);
|
||||||
|
|
||||||
|
function обновитьНомерМодуля()
|
||||||
|
{
|
||||||
|
var старый = список.выбор;
|
||||||
|
var новый = свойства.номер;
|
||||||
|
if (старый == новый)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (новый > муром.модули.length - 1)
|
||||||
|
{
|
||||||
|
новый = муром.модули.length - 1;
|
||||||
|
}
|
||||||
|
модули.задатьНомер(старый, новый);
|
||||||
|
список.задатьСписок(пу.списокМодулей());
|
||||||
|
список.выбрать(новый);
|
||||||
|
}
|
||||||
|
свойства.изменилиНомер.подписать(обновитьНомерМодуля);
|
||||||
|
|
||||||
|
function добавитьМодуль()
|
||||||
|
{
|
||||||
|
var число = Math.floor(Math.random() * Math.floor(1000));
|
||||||
|
var имя = "новый-" + число;
|
||||||
|
var код = `console.log("НАДО Добавить код в модуль '` + имя + `'");`;
|
||||||
|
var модуль = [имя, муром.btoa(код)];
|
||||||
|
муром.модули.push(модуль);
|
||||||
|
var модули = пу.списокМодулей();
|
||||||
|
список.задатьСписок(модули);
|
||||||
|
список.выбрать(модули.length - 1);
|
||||||
|
}
|
||||||
|
пу.добавить.подписать(добавитьМодуль);
|
||||||
|
|
||||||
|
function удалитьМодуль()
|
||||||
|
{
|
||||||
|
var номер = список.выбор;
|
||||||
|
|
||||||
|
var статус = пу.модули.статус(номер);
|
||||||
|
if (статус)
|
||||||
|
{
|
||||||
|
alert("ОШИБКА Удалить можно лишь неисполняемый модуль");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Удалить выбранный модуль.
|
||||||
|
муром.модули.splice(номер, 1);
|
||||||
|
--номер;
|
||||||
|
if (номер < 0)
|
||||||
|
{
|
||||||
|
номер = 0;
|
||||||
|
}
|
||||||
|
var модули = пу.списокМодулей();
|
||||||
|
список.задатьСписок(модули);
|
||||||
|
список.выбрать(номер);
|
||||||
|
}
|
||||||
|
свойства.удалить.подписать(удалитьМодуль);
|
||||||
|
|
||||||
|
function сохранитьВыбранныйМодуль()
|
||||||
|
{
|
||||||
|
var модуль = муром.модули[список.выбор];
|
||||||
|
var код = муром.редактор.session.getValue();
|
||||||
|
модуль[1] = муром.btoa(код);
|
||||||
|
}
|
||||||
|
function сохранить()
|
||||||
|
{
|
||||||
|
пу.кнопкаСохранить.disabled = true;
|
||||||
|
localforage.setItem("modules", муром.модули, function(ошибка, значение){
|
||||||
|
пу.кнопкаСохранить.disabled = false;
|
||||||
|
if (ошибка)
|
||||||
|
{
|
||||||
|
console.error("Не удалось сохранить модули: '" + ошибка + "'");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
пу.сохранить.подписатьМного([
|
||||||
|
сохранитьВыбранныйМодуль,
|
||||||
|
сохранить,
|
||||||
|
]);
|
||||||
|
|
||||||
|
// How to create a file in memory for user to download, but not through server?
|
||||||
|
// https://stackoverflow.com/a/18197341
|
||||||
|
function скачать()
|
||||||
|
{
|
||||||
|
var содержимое = муром.файл.начало;
|
||||||
|
for (var номер in муром.модули)
|
||||||
|
{
|
||||||
|
var модуль = муром.модули[номер];
|
||||||
|
var имя = модуль[0];
|
||||||
|
var код64 = модуль[1];
|
||||||
|
var свойства = модули.свойства(номер);
|
||||||
|
содержимое +=
|
||||||
|
`
|
||||||
|
|
||||||
|
[
|
||||||
|
"` + имя + `",
|
||||||
|
"` + код64 + `",
|
||||||
|
`
|
||||||
|
+
|
||||||
|
JSON.stringify(свойства)
|
||||||
|
+
|
||||||
|
`
|
||||||
|
],
|
||||||
|
`
|
||||||
|
;
|
||||||
|
}
|
||||||
|
содержимое += муром.файл.конец;
|
||||||
|
содержимое = муром.btoa(содержимое);
|
||||||
|
|
||||||
|
var ссыль = document.createElement("a");
|
||||||
|
ссыль.setAttribute("href", "data:text/html;charset=utf-8;base64," + содержимое);
|
||||||
|
var имя = пу.имяФайла();
|
||||||
|
ссыль.setAttribute("download", имя);
|
||||||
|
ссыль.style.display = "none";
|
||||||
|
document.body.appendChild(ссыль);
|
||||||
|
ссыль.click();
|
||||||
|
document.body.removeChild(ссыль);
|
||||||
|
}
|
||||||
|
пу.скачать.подписать(скачать);
|
||||||
|
|
||||||
|
// При запуске.
|
||||||
|
список.выбрать(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* Пуск
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (window.location.search == "?0")
|
||||||
|
{
|
||||||
|
console.debug("Запуск панели управления");
|
||||||
|
задатьВнешнийВид();
|
||||||
|
запуститьПУ();
|
||||||
|
console.debug("Панель управления запущена")
|
||||||
|
}
|
||||||
48
модули/муром.редактор_1.0.0.js
Normal file
48
модули/муром.редактор_1.0.0.js
Normal file
File diff suppressed because one or more lines are too long
156
муром_2.0.0.html
Normal file
156
муром_2.0.0.html
Normal file
File diff suppressed because one or more lines are too long
46
примеры/заставка.js
Normal file
46
примеры/заставка.js
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
function добавитьЭкранЗаставки()
|
||||||
|
{
|
||||||
|
var заставка = document.createElement("div");
|
||||||
|
document.body.appendChild(заставка);
|
||||||
|
заставка.id = "заставка";
|
||||||
|
заставка.style.cssText = "position: absolute; left: 0; right: 0; top: 0; bottom: 0; pointer-events: none;";
|
||||||
|
заставка.innerHTML =
|
||||||
|
`
|
||||||
|
<h1 id = "заголовок">Заставка</h1>
|
||||||
|
`;
|
||||||
|
|
||||||
|
var вид = document.createElement("style");
|
||||||
|
document.head.appendChild(вид);
|
||||||
|
вид.innerHTML =
|
||||||
|
`
|
||||||
|
#заголовок
|
||||||
|
{
|
||||||
|
position: absolute;
|
||||||
|
left: 50%;
|
||||||
|
top: 50%;
|
||||||
|
transform: translateX(-50%) translateY(-50%);
|
||||||
|
}
|
||||||
|
#заставка
|
||||||
|
{
|
||||||
|
opacity: 1;
|
||||||
|
background-color: grey;
|
||||||
|
animation: fadeOut 1s ease;
|
||||||
|
animation-fill-mode: forwards;
|
||||||
|
}
|
||||||
|
@keyframes fadeOut
|
||||||
|
{
|
||||||
|
from
|
||||||
|
{
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
to
|
||||||
|
{
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
муром.пуск.подписать(добавитьЭкранЗаставки);
|
||||||
|
|
||||||
Reference in New Issue
Block a user