kingkont 0.20.45 → 0.20.46
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/renderer/board.js +57 -0
- package/renderer/notifyPanel.js +21 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "kingkont",
|
|
3
|
-
"version": "0.20.
|
|
3
|
+
"version": "0.20.46",
|
|
4
4
|
"description": "KingKont \u00b7 Chatium \u2014 \u043d\u043e\u0434-\u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0441\u0446\u0435\u043d \u0441 AI-\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0435\u0439 (\u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438/\u0432\u0438\u0434\u0435\u043e/\u0433\u043e\u043b\u043e\u0441/SFX/\u043c\u0443\u0437\u044b\u043a\u0430/\u0442\u0435\u043a\u0441\u0442)",
|
|
5
5
|
"main": "main.js",
|
|
6
6
|
"bin": {
|
package/renderer/board.js
CHANGED
|
@@ -2530,6 +2530,13 @@ function showBoardContextMenu(kind, item, clientX, clientY) {
|
|
|
2530
2530
|
// юзер: «объедини дефолтные промпты и соотношение сторон в одну форму».
|
|
2531
2531
|
// Доступно также по дабл-клику на названии сцены в сайдбаре.
|
|
2532
2532
|
add('⚙ Настройки сцены…', () => openDefaultPromptsDialog(kind, item));
|
|
2533
|
+
// Скопировать / Вставить настройки между сценами.
|
|
2534
|
+
// Юзер: «сделай возможность скопировать настройки из одной сцены в другую».
|
|
2535
|
+
// state.clipboardSceneSettings — in-memory, живёт до закрытия проекта.
|
|
2536
|
+
add('📋 Скопировать настройки', () => copyBoardSettings(kind, item));
|
|
2537
|
+
if (state.clipboardSceneSettings) {
|
|
2538
|
+
add('📥 Вставить настройки', () => pasteBoardSettings(kind, item));
|
|
2539
|
+
}
|
|
2533
2540
|
if (kind === 'character') {
|
|
2534
2541
|
add('⚙ Свойства персонажа', () => {
|
|
2535
2542
|
// Открываем панель этого персонажа и потом её character-modal
|
|
@@ -2582,6 +2589,56 @@ async function promptBoardAspectRatio(kind, item) {
|
|
|
2582
2589
|
}
|
|
2583
2590
|
console.log(`[board] ${kind}/${item.name} aspectRatio → ${chosen}`);
|
|
2584
2591
|
}
|
|
2592
|
+
// Скопировать / вставить настройки сцены (aspectRatio + defaultPrompts).
|
|
2593
|
+
// Хранение — in-memory state.clipboardSceneSettings (живёт до closeProject).
|
|
2594
|
+
// Юзер: «сделай возможность скопировать настройки из одной сцены в другую».
|
|
2595
|
+
async function copyBoardSettings(kind, item) {
|
|
2596
|
+
const isActive = state.currentBoard?.kind === kind && state.currentBoard.name === item.name;
|
|
2597
|
+
const metaSettings = isActive
|
|
2598
|
+
? (state.currentBoard.metadata.settings || {})
|
|
2599
|
+
: ((await loadBoardMetadata(item.handle)).settings || {});
|
|
2600
|
+
// Deep-copy чтобы дальнейшие правки исходной сцены не вмешивались.
|
|
2601
|
+
state.clipboardSceneSettings = JSON.parse(JSON.stringify({
|
|
2602
|
+
aspectRatio: metaSettings.aspectRatio ?? null,
|
|
2603
|
+
defaultPrompts: metaSettings.defaultPrompts || [],
|
|
2604
|
+
}));
|
|
2605
|
+
const fromName = item.name;
|
|
2606
|
+
if (typeof showToast === 'function') {
|
|
2607
|
+
showToast(`📋 Настройки сцены «${fromName}» скопированы`, 'info');
|
|
2608
|
+
}
|
|
2609
|
+
}
|
|
2610
|
+
async function pasteBoardSettings(kind, item) {
|
|
2611
|
+
const cb = state.clipboardSceneSettings;
|
|
2612
|
+
if (!cb) { alert('Сначала скопируй настройки другой сцены через ПКМ'); return; }
|
|
2613
|
+
const isActive = state.currentBoard?.kind === kind && state.currentBoard.name === item.name;
|
|
2614
|
+
if (isActive) {
|
|
2615
|
+
if (!state.currentBoard.metadata.settings) state.currentBoard.metadata.settings = {};
|
|
2616
|
+
const s = state.currentBoard.metadata.settings;
|
|
2617
|
+
if (cb.aspectRatio) s.aspectRatio = cb.aspectRatio;
|
|
2618
|
+
if (cb.defaultPrompts && cb.defaultPrompts.length) {
|
|
2619
|
+
// Глубокая копия + новые id чтобы не было коллизий id'ов промптов.
|
|
2620
|
+
s.defaultPrompts = cb.defaultPrompts.map(p => ({ ...p, id: crypto.randomUUID() }));
|
|
2621
|
+
} else {
|
|
2622
|
+
delete s.defaultPrompts;
|
|
2623
|
+
}
|
|
2624
|
+
scheduleSave();
|
|
2625
|
+
if (typeof updateTimelineAspectLabel === 'function') updateTimelineAspectLabel();
|
|
2626
|
+
} else {
|
|
2627
|
+
const meta = await loadBoardMetadata(item.handle);
|
|
2628
|
+
meta.settings = meta.settings || {};
|
|
2629
|
+
if (cb.aspectRatio) meta.settings.aspectRatio = cb.aspectRatio;
|
|
2630
|
+
if (cb.defaultPrompts && cb.defaultPrompts.length) {
|
|
2631
|
+
meta.settings.defaultPrompts = cb.defaultPrompts.map(p => ({ ...p, id: crypto.randomUUID() }));
|
|
2632
|
+
} else {
|
|
2633
|
+
delete meta.settings.defaultPrompts;
|
|
2634
|
+
}
|
|
2635
|
+
await saveBoardMetadata(item.handle, meta);
|
|
2636
|
+
}
|
|
2637
|
+
if (typeof showToast === 'function') {
|
|
2638
|
+
showToast(`📥 Настройки вставлены в «${item.name}»`, 'ok');
|
|
2639
|
+
}
|
|
2640
|
+
}
|
|
2641
|
+
|
|
2585
2642
|
// Open «Дефолтные промпты сцены» modal — multi-prompt list, each with
|
|
2586
2643
|
// kind-tags (image/video/audio/text) и default-enabled-чекбоксом.
|
|
2587
2644
|
// Сохраняется в scene.json → settings.defaultPrompts как массив.
|
package/renderer/notifyPanel.js
CHANGED
|
@@ -184,7 +184,15 @@
|
|
|
184
184
|
list.innerHTML = '<div style="padding:24px; text-align:center; color:#555; font-size:12px;">Нет событий</div>';
|
|
185
185
|
return;
|
|
186
186
|
}
|
|
187
|
-
|
|
187
|
+
// В auto-режиме (panel всплыла сама после нового события) показываем
|
|
188
|
+
// ТОЛЬКО 3 последних события — иначе панель раскрывается на пол-экрана
|
|
189
|
+
// и мешает основному UI. Юзер: «всплывающее окно когда что-то готово —
|
|
190
|
+
// показывай 3 последних (сейчас слишком высокое)».
|
|
191
|
+
// В manual-режиме (юзер сам кликнул на 🔔) — полный список.
|
|
192
|
+
const limit = (openMode === 'auto') ? 3 : events.length;
|
|
193
|
+
const start = Math.max(0, events.length - limit);
|
|
194
|
+
const hidden = events.length - (events.length - start); // = events.length - count_shown
|
|
195
|
+
for (let i = events.length - 1; i >= start; i--) {
|
|
188
196
|
const e = events[i];
|
|
189
197
|
const row = document.createElement('div');
|
|
190
198
|
const colors = {
|
|
@@ -238,6 +246,18 @@
|
|
|
238
246
|
}
|
|
239
247
|
list.appendChild(row);
|
|
240
248
|
}
|
|
249
|
+
// Подсказка «ещё N» — в auto-режиме если есть скрытые события.
|
|
250
|
+
// Клик открывает панель в manual-режиме (= полный список + не закроется
|
|
251
|
+
// авто-таймером).
|
|
252
|
+
if (openMode === 'auto' && start > 0) {
|
|
253
|
+
const more = document.createElement('div');
|
|
254
|
+
more.style.cssText = 'padding:6px 10px; text-align:center; color:#888; font-size:11px; cursor:pointer; border-top:1px dashed #2a2a2a; margin-top:4px;';
|
|
255
|
+
more.textContent = `+ ещё ${start} событий — открыть всё`;
|
|
256
|
+
more.addEventListener('mouseenter', () => more.style.color = '#bbb');
|
|
257
|
+
more.addEventListener('mouseleave', () => more.style.color = '#888');
|
|
258
|
+
more.addEventListener('click', () => setOpen(true, 'manual'));
|
|
259
|
+
list.appendChild(more);
|
|
260
|
+
}
|
|
241
261
|
}
|
|
242
262
|
|
|
243
263
|
// Public API.
|