diff --git a/tools/editor.py b/tools/editor.py index fa36166..646cd1d 100755 --- a/tools/editor.py +++ b/tools/editor.py @@ -11,7 +11,8 @@ from editortool.langtool import LangToolWindow from editortool.cutscenetool import CutsceneToolWindow DEFAULT_TOOL = None -DEFAULT_TOOL = "map" +# DEFAULT_TOOL = "map" +DEFAULT_TOOL = "cutscene" TOOLS = [ ("Map Editor", "map", MapWindow), diff --git a/tools/editortool/cutscene/cutsceneitem.py b/tools/editortool/cutscene/cutsceneitemeditor.py similarity index 91% rename from tools/editortool/cutscene/cutsceneitem.py rename to tools/editortool/cutscene/cutsceneitemeditor.py index 4ccf082..0241ccd 100644 --- a/tools/editortool/cutscene/cutsceneitem.py +++ b/tools/editortool/cutscene/cutsceneitemeditor.py @@ -31,11 +31,16 @@ class CutsceneItemEditor(QWidget): self.activeEditor = None # Events + self.nameInput.textChanged.connect(self.onNameChanged) self.typeDropdown.currentTextChanged.connect(self.onTypeChanged) # First load + self.onNameChanged(self.nameInput.text()) self.onTypeChanged(self.typeDropdown.currentText()) + def onNameChanged(self, nameText): + pass + def onTypeChanged(self, typeText): typeKey = typeText.lower() diff --git a/tools/editortool/cutscene/cutscenemenubar.py b/tools/editortool/cutscene/cutscenemenubar.py new file mode 100644 index 0000000..991ad01 --- /dev/null +++ b/tools/editortool/cutscene/cutscenemenubar.py @@ -0,0 +1,54 @@ +from PyQt5.QtWidgets import QMenuBar, QAction, QFileDialog, QMessageBox +from PyQt5.QtGui import QKeySequence + +class CutsceneMenuBar(QMenuBar): + def __init__(self, parent): + super().__init__(parent) + self.parent = parent + fileMenu = self.addMenu("File") + + self.newAction = QAction("New", self) + self.newAction.setShortcut(QKeySequence.New) + self.newAction.triggered.connect(self.newFile) + fileMenu.addAction(self.newAction) + + self.openAction = QAction("Open", self) + self.openAction.setShortcut(QKeySequence.Open) + self.openAction.triggered.connect(self.openFile) + fileMenu.addAction(self.openAction) + + self.saveAction = QAction("Save", self) + self.saveAction.setShortcut(QKeySequence.Save) + self.saveAction.triggered.connect(self.saveFile) + fileMenu.addAction(self.saveAction) + + self.saveAsAction = QAction("Save As", self) + self.saveAsAction.setShortcut(QKeySequence.SaveAs) + self.saveAsAction.triggered.connect(self.saveFileAs) + fileMenu.addAction(self.saveAsAction) + + def newFile(self): + self.parent.clearCutscene() + + def openFile(self): + path, _ = QFileDialog.getOpenFileName(self.parent, "Open Cutscene File", "", "JSON Files (*.json);;All Files (*)") + if not path: + return + + # TODO: Load file contents into timeline + self.parent.currentFile = path + pass + + def saveFile(self): + if not self.parent.currentFile: + self.saveFileAs() + return + + # TODO: Save timeline to self.parent.currentFile + pass + + def saveFileAs(self): + path, _ = QFileDialog.getSaveFileName(self.parent, "Save Cutscene File As", "", "JSON Files (*.json);;All Files (*)") + if path: + self.parent.currentFile = path + self.saveFile() diff --git a/tools/editortool/cutscenetool.py b/tools/editortool/cutscenetool.py index e9f88ab..81d7e19 100644 --- a/tools/editortool/cutscenetool.py +++ b/tools/editortool/cutscenetool.py @@ -1,5 +1,7 @@ -from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, QVBoxLayout, QHBoxLayout, QLabel, QPushButton, QListWidget, QListWidgetItem -from editortool.cutscene.cutsceneitem import CutsceneItemEditor +from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, QVBoxLayout, QHBoxLayout, QLabel, QPushButton, QListWidget, QListWidgetItem, QMenuBar, QAction, QFileDialog, QMessageBox +from PyQt5.QtGui import QKeySequence +from editortool.cutscene.cutsceneitemeditor import CutsceneItemEditor +from editortool.cutscene.cutscenemenubar import CutsceneMenuBar import sys class CutsceneToolWindow(QMainWindow): @@ -8,6 +10,12 @@ class CutsceneToolWindow(QMainWindow): self.setWindowTitle("Dusk Cutscene Editor") self.setGeometry(100, 100, 800, 600) self.nextItemNumber = 1 # Track next available number + self.currentFile = None + self.dirty = False # Track unsaved changes + + # File menu (handled by CutsceneMenuBar) + menubar = CutsceneMenuBar(self) + self.setMenuBar(menubar) # Main layout: horizontal split central = QWidget() @@ -44,21 +52,34 @@ class CutsceneToolWindow(QMainWindow): def addCutsceneItem(self): name = f"Cutscene item {self.nextItemNumber}" - item = QListWidgetItem(name) - self.timelineList.addItem(item) - self.timelineList.setCurrentItem(item) + timelineItem = QListWidgetItem(name) + self.timelineList.addItem(timelineItem) + self.timelineList.setCurrentItem(timelineItem) self.nextItemNumber += 1 + self.dirty = True def removeCutsceneItem(self): row = self.timelineList.currentRow() - if row >= 0: - self.timelineList.takeItem(row) - # Remove editor if nothing selected - if self.timelineList.currentItem() is None: - if self.itemEditor: - self.editorLayout.removeWidget(self.itemEditor) - self.itemEditor.deleteLater() - self.itemEditor = None + if row < 0: + return + self.timelineList.takeItem(row) + self.dirty = True + + # Remove editor if nothing selected + if self.timelineList.currentItem() is None or self.itemEditor is None: + return + + self.editorLayout.removeWidget(self.itemEditor) + self.itemEditor.deleteLater() + self.itemEditor = None + + def clearCutscene(self): + self.timelineList.clear() + self.nextItemNumber = 1 + self.currentFile = None + self.dirty = False + if self.itemEditor: + self.editorLayout.removeWidget(self.itemEditor) def onItemSelected(self, current, previous): if current: