From 28a54d14f0b9bb614dc4f0b30b131b2712a29b28 Mon Sep 17 00:00:00 2001 From: JDM170 <30170278+JDM170@users.noreply.github.com> Date: Sat, 22 Aug 2020 10:26:50 +0700 Subject: [PATCH] Added simple config editor Signed-off-by: JDM170 <30170278+JDM170@users.noreply.github.com> --- .gitignore | 2 + build.spec | 29 +++++++++ config_editor/__init__.py | 1 + config_editor/form.ui | 133 ++++++++++++++++++++++++++++++++++++++ config_editor/script.py | 113 ++++++++++++++++++++++++++++++++ init_config_editor.py | 12 ++++ setup.py | 7 +- 7 files changed, 294 insertions(+), 3 deletions(-) create mode 100644 config_editor/__init__.py create mode 100644 config_editor/form.ui create mode 100644 config_editor/script.py create mode 100644 init_config_editor.py diff --git a/.gitignore b/.gitignore index da2ee48..c7502f1 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,8 @@ /main/form.py /second/__pycache__ /second/form.py +/config_editor/__pycache__ +/config_editor/form.py ## Ignoring UPX /upx diff --git a/build.spec b/build.spec index a34cf60..c58a605 100644 --- a/build.spec +++ b/build.spec @@ -8,8 +8,18 @@ app = Analysis( ('configs/ets2', 'configs/ets2') ] ) +cfg = Analysis( + ['init_config_editor.py'], + pathex=['.'] +) + +MERGE( + (app, 'SaveWizard', 'SaveWizard'), + (cfg, 'SaveWizard_Config_Editor', 'SaveWizard_Config_Editor') +) app_pyz = PYZ(app.pure, app.zipped_data) +cfg_pyz = PYZ(cfg.pure, cfg.zipped_data) app_exe = EXE( app_pyz, @@ -31,3 +41,22 @@ app_coll = COLLECT( name='app_build' ) +cfg_exe = EXE( + cfg_pyz, + cfg.scripts, + [], + exclude_binaries=True, + name='SaveWizard_Config_Editor', + debug=False, + bootloader_ignore_signals=False, + strip=False, + console=False +) +cfg_coll = COLLECT( + cfg_exe, + cfg.binaries, + cfg.zipfiles, + cfg.datas, + strip=False, + name='cfg_build' +) diff --git a/config_editor/__init__.py b/config_editor/__init__.py new file mode 100644 index 0000000..9fc02b4 --- /dev/null +++ b/config_editor/__init__.py @@ -0,0 +1 @@ +# initializing module 'config_editor' diff --git a/config_editor/form.ui b/config_editor/form.ui new file mode 100644 index 0000000..30a7c4a --- /dev/null +++ b/config_editor/form.ui @@ -0,0 +1,133 @@ + + + JDM170 + MainWindow + + + + 0 + 0 + 504 + 374 + + + + + 9 + + + + SaveWizard config editor + + + QMainWindow::AllowTabbedDocks + + + + + + 0 + 0 + 501 + 351 + + + + + 0 + 0 + + + + + Verdana + 12 + + + + QFrame::NoFrame + + + QFrame::Plain + + + + + + + 0 + 0 + 504 + 21 + + + + true + + + false + + + + Options + + + + + + + + + + + + + + + Open + + + Ctrl+O + + + + + Save + + + Ctrl+S + + + + + Save As + + + Ctrl+Shift+S + + + + + Close file + + + Closing current file + + + Ctrl+W + + + + + Exit + + + + + Copy MD5 + + + + + + diff --git a/config_editor/script.py b/config_editor/script.py new file mode 100644 index 0000000..6347087 --- /dev/null +++ b/config_editor/script.py @@ -0,0 +1,113 @@ +#!/usr/bin/python3 +# -*- coding: utf-8 -*- + +from PyQt5.QtCore import Qt +from PyQt5.QtGui import QResizeEvent, QCloseEvent, QClipboard +from PyQt5.QtWidgets import QMainWindow, QFileDialog, QMessageBox, QApplication +from ast import literal_eval +from .form import Ui_MainWindow +from dataIO import dataIO +from util import generate_md5 + + +class EditorWindow(QMainWindow, Ui_MainWindow): + def __init__(self, parent=None): + QMainWindow.__init__(self, parent, flags=Qt.Window) + Ui_MainWindow.__init__(self) + self.ui = Ui_MainWindow() + self.ui.setupUi(self) + + self.file_path = "" + self.win_title = self.tr("{}".format(self.windowTitle())) + + self.ui.textEdit.document().contentsChanged.connect(self.content_changed) + + for action, method in { + self.ui.actionOpen: self.open_file, + self.ui.actionSave: self.save_file, + self.ui.actionSave_As: self.save_as, + self.ui.actionMD5: self.copy_hash, + self.ui.actionCloseFile: self.close_file, + self.ui.actionExit: self.exit + }.items(): + action.triggered.connect(method) + + def resizeEvent(self, event: QResizeEvent): + window = self.ui.centralwidget.geometry().getCoords() + edit = self.ui.textEdit.geometry().getCoords() + self.ui.textEdit.setGeometry(edit[0], edit[1], + window[2], window[3]-(self.ui.menubar.size().height()-1)) + + def closeEvent(self, event: QCloseEvent): + if self.maybe_save(): + event.accept() + else: + event.ignore() + + def content_changed(self): + self.setWindowModified(self.ui.textEdit.document().isModified()) + + def open_file(self): + file_path, file_name = QFileDialog.getOpenFileName(parent=self, + caption=self.tr("Choose config..."), + filter=self.tr("*.json")) + if file_path != "": + self.file_path = file_path + with open(file_path) as f: + self.ui.textEdit.setPlainText(f.read()) + self.setWindowTitle(self.tr("[*]{} - {}".format(file_path, self.win_title))) + self.ui.textEdit.document().setModified(False) + self.setWindowModified(False) + + def save_file(self): + if self.file_path != "": + data = literal_eval(self.ui.textEdit.toPlainText()) + ret = dataIO.save_json(self.file_path, data) + if ret: + self.ui.textEdit.document().setModified(False) + self.setWindowModified(False) + return ret + + def save_as(self): + file_path, file_name = QFileDialog.getSaveFileName(parent=self, + caption=self.tr("Select position"), + filter=self.tr("*.json")) + file_data = literal_eval(self.ui.textEdit.toPlainText()) + ret = dataIO.save_json(file_path, file_data) + if ret: + self.file_path = file_path + self.setWindowTitle(self.tr("[*]{} - {}".format(file_path, self.win_title))) + self.ui.textEdit.document().setModified(False) + self.setWindowModified(False) + + def copy_hash(self): + if self.maybe_save(): + result = generate_md5(self.file_path) + clip = QApplication.clipboard() + QClipboard.setText(clip, result) + box = QMessageBox(QMessageBox.Information, "Information", "Hash successfully copied into your clipboard.") + box.exec() + + def close_file(self): + if self.maybe_save(): + self.setWindowTitle(self.win_title) + self.ui.textEdit.clear() + self.file_path = "" + + def exit(self): + self.close() + + def maybe_save(self): + if not self.ui.textEdit.document().isModified(): + return True + box = QMessageBox.warning(self, + self.tr("App"), + self.tr("The document has been modified.\nDo you want to save your changes?"), + QMessageBox.Save | QMessageBox.Discard | QMessageBox.Cancel) + if box == QMessageBox.Save: + return self.save_file() + elif box == QMessageBox.Discard: + return True + elif box == QMessageBox.Cancel: + return False + return True diff --git a/init_config_editor.py b/init_config_editor.py new file mode 100644 index 0000000..05cd874 --- /dev/null +++ b/init_config_editor.py @@ -0,0 +1,12 @@ +#!/usr/bin/python3 +# -*- coding: utf-8 -*- + +from sys import argv, exit +from PyQt5.QtWidgets import QApplication +from config_editor.script import EditorWindow + +if __name__ == '__main__': + app = QApplication(argv) + win = EditorWindow() + win.show() + exit(app.exec()) diff --git a/setup.py b/setup.py index de23fb1..2428f14 100644 --- a/setup.py +++ b/setup.py @@ -9,7 +9,8 @@ if platform == 'win32': base = 'Win32GUI' executables = [ - Executable('init_main_program.py', targetName='SaveWizard.exe', base=base) + Executable('init_main_program.py', targetName='SaveWizard.exe', base=base), + Executable('init_config_editor.py', targetName='SaveWizard_Config_Editor.exe', base=base) ] excludes = ['html', 'pydoc_data', 'unittest', 'xml', 'pwd', 'shlex', 'platform', 'webbrowser', 'pydoc', 'tty', @@ -26,7 +27,7 @@ zip_include_packages = [ # Modules for parsing cfg's 'requests', 'logging', 'certifi', 'chardet', 'idna', 'urllib3', # Self-written modules - 'parsing', 'choice', 'main', 'second' + 'parsing', 'choice', 'main', 'second', 'config_editor' ] include_files = [ @@ -51,7 +52,7 @@ options = { setup( name='SaveWizard', - version='1.2.1', + version='1.3', description='For editing ETS2 sii files', executables=executables, options=options,