Abt to cutscene
This commit is contained in:
@@ -11,7 +11,8 @@ from editortool.langtool import LangToolWindow
|
|||||||
from editortool.cutscenetool import CutsceneToolWindow
|
from editortool.cutscenetool import CutsceneToolWindow
|
||||||
|
|
||||||
DEFAULT_TOOL = None
|
DEFAULT_TOOL = None
|
||||||
DEFAULT_TOOL = "map"
|
# DEFAULT_TOOL = "map"
|
||||||
|
DEFAULT_TOOL = "cutscene"
|
||||||
|
|
||||||
TOOLS = [
|
TOOLS = [
|
||||||
("Map Editor", "map", MapWindow),
|
("Map Editor", "map", MapWindow),
|
||||||
|
|||||||
@@ -31,11 +31,16 @@ class CutsceneItemEditor(QWidget):
|
|||||||
self.activeEditor = None
|
self.activeEditor = None
|
||||||
|
|
||||||
# Events
|
# Events
|
||||||
|
self.nameInput.textChanged.connect(self.onNameChanged)
|
||||||
self.typeDropdown.currentTextChanged.connect(self.onTypeChanged)
|
self.typeDropdown.currentTextChanged.connect(self.onTypeChanged)
|
||||||
|
|
||||||
# First load
|
# First load
|
||||||
|
self.onNameChanged(self.nameInput.text())
|
||||||
self.onTypeChanged(self.typeDropdown.currentText())
|
self.onTypeChanged(self.typeDropdown.currentText())
|
||||||
|
|
||||||
|
def onNameChanged(self, nameText):
|
||||||
|
pass
|
||||||
|
|
||||||
def onTypeChanged(self, typeText):
|
def onTypeChanged(self, typeText):
|
||||||
typeKey = typeText.lower()
|
typeKey = typeText.lower()
|
||||||
|
|
||||||
54
tools/editortool/cutscene/cutscenemenubar.py
Normal file
54
tools/editortool/cutscene/cutscenemenubar.py
Normal file
@@ -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()
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, QVBoxLayout, QHBoxLayout, QLabel, QPushButton, QListWidget, QListWidgetItem
|
from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, QVBoxLayout, QHBoxLayout, QLabel, QPushButton, QListWidget, QListWidgetItem, QMenuBar, QAction, QFileDialog, QMessageBox
|
||||||
from editortool.cutscene.cutsceneitem import CutsceneItemEditor
|
from PyQt5.QtGui import QKeySequence
|
||||||
|
from editortool.cutscene.cutsceneitemeditor import CutsceneItemEditor
|
||||||
|
from editortool.cutscene.cutscenemenubar import CutsceneMenuBar
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
class CutsceneToolWindow(QMainWindow):
|
class CutsceneToolWindow(QMainWindow):
|
||||||
@@ -8,6 +10,12 @@ class CutsceneToolWindow(QMainWindow):
|
|||||||
self.setWindowTitle("Dusk Cutscene Editor")
|
self.setWindowTitle("Dusk Cutscene Editor")
|
||||||
self.setGeometry(100, 100, 800, 600)
|
self.setGeometry(100, 100, 800, 600)
|
||||||
self.nextItemNumber = 1 # Track next available number
|
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
|
# Main layout: horizontal split
|
||||||
central = QWidget()
|
central = QWidget()
|
||||||
@@ -44,22 +52,35 @@ class CutsceneToolWindow(QMainWindow):
|
|||||||
|
|
||||||
def addCutsceneItem(self):
|
def addCutsceneItem(self):
|
||||||
name = f"Cutscene item {self.nextItemNumber}"
|
name = f"Cutscene item {self.nextItemNumber}"
|
||||||
item = QListWidgetItem(name)
|
timelineItem = QListWidgetItem(name)
|
||||||
self.timelineList.addItem(item)
|
self.timelineList.addItem(timelineItem)
|
||||||
self.timelineList.setCurrentItem(item)
|
self.timelineList.setCurrentItem(timelineItem)
|
||||||
self.nextItemNumber += 1
|
self.nextItemNumber += 1
|
||||||
|
self.dirty = True
|
||||||
|
|
||||||
def removeCutsceneItem(self):
|
def removeCutsceneItem(self):
|
||||||
row = self.timelineList.currentRow()
|
row = self.timelineList.currentRow()
|
||||||
if row >= 0:
|
if row < 0:
|
||||||
|
return
|
||||||
self.timelineList.takeItem(row)
|
self.timelineList.takeItem(row)
|
||||||
|
self.dirty = True
|
||||||
|
|
||||||
# Remove editor if nothing selected
|
# Remove editor if nothing selected
|
||||||
if self.timelineList.currentItem() is None:
|
if self.timelineList.currentItem() is None or self.itemEditor is None:
|
||||||
if self.itemEditor:
|
return
|
||||||
|
|
||||||
self.editorLayout.removeWidget(self.itemEditor)
|
self.editorLayout.removeWidget(self.itemEditor)
|
||||||
self.itemEditor.deleteLater()
|
self.itemEditor.deleteLater()
|
||||||
self.itemEditor = None
|
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):
|
def onItemSelected(self, current, previous):
|
||||||
if current:
|
if current:
|
||||||
if not self.itemEditor:
|
if not self.itemEditor:
|
||||||
|
|||||||
Reference in New Issue
Block a user