kingkont 0.7.51 → 0.7.53

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/main.js CHANGED
@@ -576,7 +576,14 @@ ipcMain.handle('window:close', () => {
576
576
  // Renderer уведомляет нас об открытом проекте — нужно чтобы win.on('close')
577
577
  // решал: возврат в welcome или реальный quit.
578
578
  let projectOpen = false;
579
- ipcMain.on('project:state', (_e, isOpen) => { projectOpen = !!isOpen; });
579
+ ipcMain.on('project:state', (_e, isOpen) => {
580
+ const next = !!isOpen;
581
+ if (next === projectOpen) return;
582
+ projectOpen = next;
583
+ // Пересобираем меню — пункты «Новая сцена/персонаж/локация» и весь
584
+ // подпункт «Правка» должны переключить enabled-состояние.
585
+ buildMenu();
586
+ });
580
587
  ipcMain.handle('window:minimize', () => {
581
588
  if (!win || win.isDestroyed()) return;
582
589
  // На macOS hide() убирает окно но оставляет приложение в Dock —
@@ -636,14 +643,17 @@ function buildMenu() {
636
643
  {
637
644
  label: 'Новая сцена',
638
645
  accelerator: 'CmdOrCtrl+N',
646
+ enabled: projectOpen,
639
647
  click: () => trigger('#newEpisode'),
640
648
  },
641
649
  {
642
650
  label: 'Новый персонаж',
651
+ enabled: projectOpen,
643
652
  click: () => trigger('#newCharacter'),
644
653
  },
645
654
  {
646
655
  label: 'Новая локация',
656
+ enabled: projectOpen,
647
657
  click: () => trigger('#newLocation'),
648
658
  },
649
659
  { type: 'separator' },
@@ -666,14 +676,17 @@ function buildMenu() {
666
676
  },
667
677
  {
668
678
  label: 'Правка',
679
+ // Все пункты «Правка» имеют смысл только когда открыт проект —
680
+ // undo/redo относятся к canvas mutations, cut/copy/paste юзаются
681
+ // в нодах. На welcome/settings/updates окнах пункты disabled.
669
682
  submenu: [
670
- { label: 'Отменить', click: () => sendToRenderer('menu:undo') },
671
- { label: 'Повторить', click: () => sendToRenderer('menu:redo') },
683
+ { label: 'Отменить', enabled: projectOpen, click: () => sendToRenderer('menu:undo') },
684
+ { label: 'Повторить', enabled: projectOpen, click: () => sendToRenderer('menu:redo') },
672
685
  { type: 'separator' },
673
- { role: 'cut' },
674
- { role: 'copy' },
675
- { role: 'paste' },
676
- { role: 'selectAll' },
686
+ { role: 'cut', enabled: projectOpen },
687
+ { role: 'copy', enabled: projectOpen },
688
+ { role: 'paste', enabled: projectOpen },
689
+ { role: 'selectAll', enabled: projectOpen },
677
690
  ],
678
691
  },
679
692
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kingkont",
3
- "version": "0.7.51",
3
+ "version": "0.7.53",
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
@@ -985,9 +985,11 @@ $('newEpisode').addEventListener('click', async () => {
985
985
  const name = await askName('Название сцены:', 'например, Сцена 1');
986
986
  vlog('info', 'newEpisode name=' + JSON.stringify(name));
987
987
  if (!name) return;
988
- await state.filmHandle.getDirectoryHandle(name, { create: true });
988
+ const handle = await state.filmHandle.getDirectoryHandle(name, { create: true });
989
989
  await refreshEpisodes();
990
- vlog('info', 'newEpisode created: ' + name);
990
+ // Сразу переходим на созданную сцену.
991
+ await selectBoard({ kind: 'episode', name, handle });
992
+ vlog('info', 'newEpisode created + selected: ' + name);
991
993
  } catch (e) {
992
994
  vlog('err', 'newEpisode failed: ' + (e?.message || e));
993
995
  alert('Ошибка: ' + (e?.message || e));
@@ -1002,9 +1004,10 @@ $('newCharacter').addEventListener('click', async () => {
1002
1004
  vlog('info', 'newCharacter name=' + JSON.stringify(name));
1003
1005
  if (!name) return;
1004
1006
  const root = await state.filmHandle.getDirectoryHandle(CHAR_DIR, { create: true });
1005
- await root.getDirectoryHandle(name, { create: true });
1007
+ const handle = await root.getDirectoryHandle(name, { create: true });
1006
1008
  await refreshCharacters();
1007
- vlog('info', 'newCharacter created: ' + name);
1009
+ await selectBoard({ kind: 'character', name, handle });
1010
+ vlog('info', 'newCharacter created + selected: ' + name);
1008
1011
  } catch (e) {
1009
1012
  vlog('err', 'newCharacter failed: ' + (e?.message || e));
1010
1013
  alert('Ошибка: ' + (e?.message || e));
@@ -1019,9 +1022,10 @@ $('newLocation').addEventListener('click', async () => {
1019
1022
  vlog('info', 'newLocation name=' + JSON.stringify(name));
1020
1023
  if (!name) return;
1021
1024
  const root = await state.filmHandle.getDirectoryHandle(LOC_DIR, { create: true });
1022
- await root.getDirectoryHandle(name, { create: true });
1025
+ const handle = await root.getDirectoryHandle(name, { create: true });
1023
1026
  await refreshLocations();
1024
- vlog('info', 'newLocation created: ' + name);
1027
+ await selectBoard({ kind: 'location', name, handle });
1028
+ vlog('info', 'newLocation created + selected: ' + name);
1025
1029
  } catch (e) {
1026
1030
  vlog('err', 'newLocation failed: ' + (e?.message || e));
1027
1031
  alert('Ошибка: ' + (e?.message || e));