import os from PyQt5.QtWidgets import QMainWindow, QWidget, QHBoxLayout, QMessageBox from PyQt5.QtCore import Qt from editortool.map.glwidget import GLWidget from editortool.map.chunkpanel import ChunkPanel from editortool.map.mapinfopanel import MapInfoPanel from editortool.map.mapdata import MapData from editortool.map.toolbar import MapToolbar from editortool.map.statusbar import StatusBar from editortool.map.map import Map from editortool.map.mapdefs import TILE_WIDTH, TILE_HEIGHT, TILE_DEPTH class MapWindow(QMainWindow): def __init__(self): super().__init__() # Subclasses self.mapData = MapData() self.map = Map(self) # Window setup self.setWindowTitle("Dusk Map Editor") self.resize(1280, 720) # Components self.toolbar = MapToolbar(self) central = QWidget() self.setCentralWidget(central) mainLayout = QHBoxLayout(central) # Left panel (ChunkPanel) self.chunkPanel = ChunkPanel(self) leftWidget = QWidget() leftWidget.setLayout(self.chunkPanel.layout()) leftWidget.setFixedWidth(200) mainLayout.addWidget(leftWidget) # Center panel (GLWidget + controls) self.glWidget = GLWidget(self) mainLayout.addWidget(self.glWidget, stretch=3) # Right panel (MapInfoPanel) self.mapInfoPanel = MapInfoPanel(self) rightWidget = self.mapInfoPanel rightWidget.setFixedWidth(250) mainLayout.addWidget(rightWidget) # Status bar self.statusBar = StatusBar(self) self.setStatusBar(self.statusBar) self.installEventFilter(self) self._install_event_filter_recursive(self) def _install_event_filter_recursive(self, widget): for child in widget.findChildren(QWidget): child.installEventFilter(self) self._install_event_filter_recursive(child) def generateData(self): objOut = {} self.fileSaving.invoke(objOut) self.mapData.data = objOut return objOut def closeEvent(self, event): if not self.mapData.isDirty(): event.accept() return reply = QMessageBox.question( self, "Unsaved Changes", "You have unsaved changes. Do you want to save before closing?", QMessageBox.Save | QMessageBox.Discard | QMessageBox.Cancel, QMessageBox.Save ) if reply == QMessageBox.Save: self.saveFile() if self.mapData.isDirty(): event.ignore() return elif reply == QMessageBox.Cancel: event.ignore() return event.accept() def eventFilter(self, obj, event): if event.type() == event.KeyPress: amtX, amtY, amtZ = 0, 0, 0 key = event.key() if key == Qt.Key_Left: amtX = -1 elif key == Qt.Key_Right: amtX = 1 elif key == Qt.Key_Up: amtY = -1 elif key == Qt.Key_Down: amtY = 1 elif key == Qt.Key_PageUp: amtZ = 1 elif key == Qt.Key_PageDown: amtZ = -1 if event.modifiers() & Qt.ShiftModifier: amtX *= int(TILE_WIDTH) amtY *= int(TILE_HEIGHT) amtZ *= int(TILE_DEPTH) if amtX != 0 or amtY != 0 or amtZ != 0: self.map.moveRelative(amtX, amtY, amtZ) event.accept() return True return super().eventFilter(obj, event)