from PySide6.QtWidgets import QMainWindow, QFileDialog, QSpacerItem, QSizePolicy
from PySide6.QtCore import Slot, Qt
from PySide6.QtGui import QDesktopServices, QAction
from RWESharp.ui.FunnyVideo import FunnyVideo
from RWESharp.ui.uiscripts.mainui import Ui_MainWindow
from RWESharp.ui.aboutuiconnector import AboutDialog
from RWESharp.ui.settingsuiconnector import SettingsDialogUI
from RWESharp.ui.hotkeysuiconnector import HotkeysUI
from RWESharp.Level.RWELevel import RWELevel
from RWESharp.utils import modify_path_url
from RWESharp.info import PATH_LEVELS, PATH_FILES_VIDEOS, PATH_DRIZZLE, ISWIN, REPO_ISSUES, REPO, FULLNAME, CUSTOM_LINKS
from RWESharp.Core.LevelRenderer import LevelRenderer
import os
[docs]
class MainWindow(QMainWindow):
'''
Main window and bare ui of RWE#
'''
[docs]
def __init__(self, app, filename=None):
"""
:param filename: file to load by default
"""
from RWESharp.Core.Manager import Manager
super(MainWindow, self).__init__()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.ui.tabWidget.clear()
self.ui.tabWidget.setTabsClosable(True)
self.ui.tabWidget.tabCloseRequested.connect(self.close_tab)
self.ui.actionOpen.triggered.connect(self.open_file)
self.ui.actionNew.triggered.connect(self.new_file)
self.ui.actionClose.triggered.connect(self.close)
self.ui.actionAbout.triggered.connect(self.open_about)
self.ui.actionPreferences.triggered.connect(self.open_settings)
self.ui.actionHotkeys.triggered.connect(self.open_hotkeys)
self.manager = Manager(self, app, filename)
self.manager.basemod.bmconfig.hotkey_key.link_action(self.ui.actionHotkeys)
self.manager.basemod.bmconfig.settings_key.link_action(self.ui.actionPreferences)
self.manager.basemod.bmconfig.view_key.link_action(self.ui.actionView)
self.manager.basemod.bmconfig.edit_key.link_action(self.ui.actionEditors)
self.manager.basemod.bmconfig.prefabs_key.link_action(self.ui.actionPrefabs)
self.manager.basemod.bmconfig.new_key.link_action(self.ui.actionNew)
self.manager.basemod.bmconfig.open_key.link_action(self.ui.actionOpen)
self.manager.basemod.bmconfig.save_as_key.link_action(self.ui.actionSave_As)
self.manager.basemod.bmconfig.close_key.link_action(self.ui.actionClose)
self.manager.basemod.bmconfig.render_key.link_action(self.ui.actionRender)
self.manager.basemod.bmconfig.opendrizzle_key.link_action(self.ui.actionLaunch_Drizzle)
self.manager.basemod.bmconfig.zoom_in_key.link_action(self.ui.actionZoom_In)
self.ui.actionZoom_In.triggered.connect(lambda: self.manager.selected_viewport.do_zoom(0.2))
self.manager.basemod.bmconfig.zoom_out_key.link_action(self.ui.actionZoom_Out)
self.ui.actionZoom_Out.triggered.connect(lambda: self.manager.selected_viewport.do_zoom(-0.2))
self.manager.basemod.bmconfig.about_key.link_action(self.ui.actionAbout)
# self.ui.viewPort.add_managed_fields(self.manager)
# self.ui.menuRecent.addAction(QAction("lol", self.ui.menuRecent))
self.ui.ToolsTabs.currentChanged.connect(self.change_editor)
self.ui.tabWidget.currentChanged.connect(self.manager.mount_editor)
self.about = None
self.settings: SettingsDialogUI | None = None
self.hotkeys: HotkeysUI | None = None
self.verticalSpacer = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding)
self.ui.QuickOverlay.addItem(self.verticalSpacer)
self.manager.basemod.bmconfig.save_key.link_action(self.ui.actionSave)
self.ui.actionSave.triggered.connect(self.manager.save_level)
self.manager.basemod.bmconfig.save_as_key.link_action(self.ui.actionSave_As)
self.ui.actionSave_As.triggered.connect(self.manager.save_level_as)
self.manager.basemod.bmconfig.undo_key.link_action(self.ui.actionUndo)
self.ui.actionUndo.triggered.connect(self.manager.undo)
self.manager.basemod.bmconfig.redo_key.link_action(self.ui.actionRedo)
self.ui.actionRedo.triggered.connect(self.manager.redo)
self.ui.DockTools.link_action(self.ui.actionEditors)
self.ui.DockView.link_action(self.ui.actionView)
self.ui.DockPrefabs.link_action(self.ui.actionPrefabs)
self.manager.layer.link_spinbox(self.ui.LayerChange)
self.ui.actionNext_Layer.triggered.connect(lambda: self.manager.layer.update_value((self.manager.layer.value + 1) % 3))
self.ui.actionPrevious_Layer.triggered.connect(lambda: self.manager.layer.update_value((self.manager.layer.value - 1) % 3))
self.ui.NextLayer.clicked.connect(lambda: self.manager.layer.update_value((self.manager.layer.value + 1) % 3))
self.ui.PreviousLayer.clicked.connect(lambda: self.manager.layer.update_value((self.manager.layer.value - 1) % 3))
self.manager.basemod.bmconfig.next_layer.link_button(self.ui.actionNext_Layer)
self.manager.basemod.bmconfig.prev_layer.link_button(self.ui.actionPrevious_Layer)
self.ui.actionRender.triggered.connect(lambda: self.level_render(self.ui.tabWidget.currentWidget().level))
self.ui.actionLaunch_Drizzle.triggered.connect(lambda:
QDesktopServices.openUrl(modify_path_url(os.path.join(PATH_DRIZZLE, "Drizzle.Editor.exe" if ISWIN else "Drizzle.Editor")))) # todo
self.ui.actionRender_All_Levels.triggered.connect(self.render_all)
self.ui.actionDrizzleOpenExplorer.triggered.connect(lambda: QDesktopServices.openUrl(modify_path_url(PATH_DRIZZLE)))
self.ui.actionOpen_Levels_Folder.triggered.connect(lambda: QDesktopServices.openUrl(modify_path_url(PATH_LEVELS)))
self.ui.actionRWE_Github.triggered.connect(lambda: QDesktopServices.openUrl(REPO))
self.ui.actionRWE_Issues.triggered.connect(lambda: QDesktopServices.openUrl(REPO_ISSUES))
self.ui.actionOpen_ShowLevelFile.triggered.connect(lambda: self.open_level_folder(self.ui.tabWidget.currentWidget().level))
self.ui.actionReset_Viewport.triggered.connect(lambda: self.manager.selected_viewport.reset_viewport())
self.hotkeys = HotkeysUI(self.manager, self)
self.settings = SettingsDialogUI(self.manager, self)
self.setWindowModality(Qt.WindowModality.NonModal)
self.setDockNestingEnabled(True)
self.ui.tabWidget.manager = self.manager
self.vid = None
self.setWindowTitle(FULLNAME)
self.ui.menuHelp.addSeparator()
for k in CUSTOM_LINKS.keys():
action = QAction(k, parent=self.ui.menuHelp)
action.triggered.connect(self.openurl(CUSTOM_LINKS[k])) # this shouldn't be that complex, right?
self.ui.menuHelp.addAction(action)
[docs]
def openurl(self, k):
def opn():
QDesktopServices.openUrl(k)
return opn
[docs]
def level_render(self, level: RWELevel):
if level.file is None:
print("Level does Not exist, trying to save")
level.viewport.save_level()
if level.file is None:
print("Canceled")
return
newfile = level.export_txt()
if newfile is None:
return
print(level) #todo
# a, _ = os.path.split(level.file)
# print(QDesktopServices.openUrl(modify_path_url(a)), a)
LevelRenderer.render_level(newfile)
[docs]
def render_all(self):
for i in range(self.ui.tabWidget.count()):
self.level_render(self.ui.tabWidget.widget(i).level)
[docs]
def add_viewport(self, viewport):
self.ui.tabWidget.setCurrentIndex(self.ui.tabWidget.addTab(viewport, viewport.level.shortname))
[docs]
def open_level_folder(self, level):
if level.file is None or self.ui.tabWidget.count() <= 0:
return
a, _ = os.path.split(level.file)
QDesktopServices.openUrl(modify_path_url(a))
[docs]
@Slot(int)
def change_editor(self, val) -> None:
self.manager.change_editor(val)
[docs]
@Slot()
def open_about(self) -> None:
self.about = AboutDialog(self)
self.about.exec()
self.about.deleteLater()
[docs]
@Slot()
def open_settings(self) -> None:
self.settings.setVisible(True)
[docs]
@Slot()
def open_hotkeys(self) -> None:
self.hotkeys.setVisible(True)
[docs]
@Slot()
def close(self) -> None:
self.manager.application.close() # todo return funny
# if self.manager.basemod.bmconfig.funny_vid.value and self.manager.basemod.bmconfig.funny.value:
# self.vid = FunnyVideo(self.manager, True, os.path.join(PATH_FILES_VIDEOS, "fnuuy.mp4").replace("\\", "/"), "GoodBye")
# else:
# self.manager.application.exit()
[docs]
def closeEvent(self, event):
self.close()
[docs]
@Slot()
def open_file(self) -> None:
name, _ = QFileDialog.getOpenFileName(None, "Open Level", PATH_LEVELS, "Level files (*.txt *.wep *.rwl)")
if name == "":
return
self.manager.open_level_from_path(name)
[docs]
@Slot()
def new_file(self) -> None:
self.manager.open_level_from_path(None)
[docs]
@Slot()
def close_tab(self, index):
self.ui.tabWidget.removeTab(index)
# todo confirmation