[Editor] Implement save feature in DocumentEditor and JsonEditor
Some checks failed
buildbot/elemental-game-linux-builder Build done.
buildbot/elemental-game-macos-builder Build done.
buildbot/elemental-game-freebsd-builder Build done.

This commit is contained in:
S David 2024-05-15 22:56:57 -04:00
parent 742cfc402f
commit 0649c82999
11 changed files with 110 additions and 71 deletions

View File

@ -1,3 +1,5 @@
include_directories(PREPEND ${Elemental_CMAKE_SOURCE_DIR}/Modules)
#add_subdirectory(Demos)
add_subdirectory(Editors)

View File

@ -8,9 +8,7 @@ set_target_properties(ResourceEditor
PROPERTIES
AUTOMOC ON
AUTOUIC ON
)
target_link_libraries(ResourceEditor
PRIVATE
fmt::fmt-header-only

View File

@ -10,9 +10,9 @@
#include "MainWindow.hpp"
#include "ui_MainWindow.h"
#include "DocumentEditor.hpp"
#include "ExceptionDialog.hpp"
#include "JsonEditor.hpp"
#include "EditorWidgets/DocumentEditor.hpp"
#include "EditorWidgets/ExceptionDialog.hpp"
#include "EditorWidgets/JsonEditor.hpp"
#include "IOCore/Exception.hpp"
@ -136,12 +136,12 @@ auto MainWindow::loadFile(QFileInfo& fileInfo) -> QMdiSubWindow*
auto suffix = fileInfo.suffix();
if (suffix == "json") {
auto json_editor =
auto document_widget =
new DocumentEditor(this->ui->mdiArea, this, path);
// new JsonEditor(this->ui->mdiArea, path);
document_widget->loadFile<JsonEditor>(path);
subwindow_ptr =
this->ui->mdiArea->addSubWindow(json_editor);
this->ui->mdiArea->addSubWindow(document_widget);
subwindow_ptr->setObjectName(filename);
subwindow_ptr->setWindowFilePath(path);
subwindow_ptr->setWindowTitle(filename);

View File

@ -7,11 +7,11 @@
* obtain one at https://mozilla.org/MPL/2.0/.
*/
#include "IOCore/Exception.hpp"
#include "MainWindow.hpp"
#include "ExceptionDialog.hpp"
#include "EditorWidgets/ExceptionDialog.hpp"
#include "IOCore/Exception.hpp"
#include <stdexcept>
#include <QApplication>

View File

@ -1,5 +1,7 @@
add_subdirectory(IOCore)
add_subdirectory(elemental)
add_subdirectory(QJsonModel)
add_subdirectory(EditorWidgets)

View File

@ -21,11 +21,15 @@ PROPERTIES
AUTOGEN_BUILD_DIR "${EditorWidgets_AUTOGEN_BUILD_DIR}"
)
target_include_directories(EditorWidgets PUBLIC
target_include_directories(EditorWidgets PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}
${EditorWidgets_AUTOGEN_BUILD_DIR}/include
)
target_include_directories(EditorWidgets INTERFACE
${EditorWidgets_AUTOGEN_BUILD_DIR}/include
)
## Append the MOC files to the source list
#target_sources(EditorWidgets PRIVATE ${EditorWidgets_MOC_SOURCES})
add_library(EditorWidgets::EditorWidgets ALIAS EditorWidgets)
@ -39,7 +43,3 @@ PUBLIC
QJsonModel
fmt::fmt-header-only
)
target_include_directories(EditorWidgets INTERFACE
${AUTOGEN_BUILD_DIR}/include
)

View File

@ -35,6 +35,7 @@
#include <QMainWindow>
#include <QMenu>
#include <QMenuBar>
#include <QStatusBar>
#include <QWidget>
#include <memory>
@ -51,8 +52,6 @@ DocumentEditor::DocumentEditor(
ASSERT(this->main_window);
this->setupActions();
this->loadFile(filepath);
}
DocumentEditor::~DocumentEditor() = default;
@ -64,46 +63,12 @@ void DocumentEditor::saveFile(bool compact)
if (json_editor) {
json_editor->saveFile(compact);
}
this->main_window->statusBar()->showMessage("File saved", 2000);
} else {
throw IOCore::NotImplementedException();
}
}
void DocumentEditor::loadFile(const QString& path)
{
QFileInfo file_info(path);
if (!file_info.exists()) {
throw IOCore::Exception(
fmt::format("File not found: {}", path.toStdString())
);
}
QVBoxLayout* layout = qobject_cast<QVBoxLayout*>(this->layout());
if (!layout) {
layout = new QVBoxLayout(this);
}
auto filename = file_info.baseName();
auto suffix = file_info.suffix();
if (suffix == "json") {
this->editor_widget = new JsonEditor(this, path);
layout->insertWidget(0, this->editor_widget);
this->main_window->addAction(this->action_save);
this->main_window->addAction(this->action_save_as);
} else {
try {
throw IOCore::Exception(fmt::format(
"Unsupported file type: {}", suffix.toStdString()
));
} catch (IOCore::Exception& e) {
auto dialog = ExceptionDialog::display(this, e);
}
}
}
void DocumentEditor::setupActions()
{
this->action_save = new QAction("Save", this);
@ -127,6 +92,9 @@ void DocumentEditor::setupActions()
connect(this->action_save, &QAction::triggered, this, [this]() {
this->saveFile(false);
});
connect(this->ui->saveButton, &QPushButton::clicked, this, [this]() {
this->saveFile(false);
});
connect(this->action_save_as, &QAction::triggered, this, [this]() {
auto selected_filepath = QFileDialog::getSaveFileName(
this->main_window,

View File

@ -39,8 +39,9 @@ class DocumentEditor : public QWidget {
template<typename TChild>
void connectActions(const TChild* child);
protected slots:
void saveFile(bool compact = true);
template<typename TWidget>
void loadFile(const QString& filePath);
protected:
@ -58,22 +59,8 @@ class DocumentEditor : public QWidget {
Ptr<Ui::DocumentEditor> ui;
};
#include <QFileDialog>
template<typename TChild>
void DocumentEditor::connectActions(const TChild* child)
{
connect(child->getSaveAction, &QAction::triggered, child, [child]() {
child->saveFile(false);
});
connect(child->action_save_as, &QAction::triggered, child, [&]() {
auto selected_filepath = QFileDialog::getSaveFileName(
this->main_window,
tr("Save File As"),
child->file_info.filePath()
);
});
}
#ifndef DOCUMENT_EDITOR_IMPL_HPP
#include "DocumentEditor.impl.hpp"
#endif
// clang-format off
// vim: set foldmethod=marker foldmarker=#region,#endregion textwidth=80 ts=8 sts=0 sw=8 noexpandtab ft=cpp.doxygen :

View File

@ -0,0 +1,81 @@
/* DocumentEditor.impl.hpp
* Copyright © 2024 Saul D. Beniquez
* License: Mozilla Public License v2.0 (MPL2)
*
* This Source Code Form is subject to the terms of the Mozilla Public License,
* v.2.0. If a copy of the MPL was not distributed with this file, You can
* obtain one at https://mozilla.org/MPL/2.0/.
*/
#ifndef DOCUMENT_EDITOR_IMPL_HPP
#define DOCUMENT_EDITOR_IMPL_HPP
#include "DocumentEditor.hpp"
#include "ExceptionDialog.hpp"
#include "JsonEditor.hpp"
#include "IOCore/Exception.hpp"
#include "fmt/core.h"
#include <QFileDialog>
#include <QFileInfo>
#include <QMainWindow>
#include <QMenu>
#include <QMenuBar>
#include <QWidget>
#include <QvboxLayout>
template<typename TChild>
void DocumentEditor::connectActions(const TChild* child)
{
connect(child->getSaveAction, &QAction::triggered, child, [child]() {
child->saveFile(false);
});
connect(child->action_save_as, &QAction::triggered, child, [&]() {
auto selected_filepath = QFileDialog::getSaveFileName(
this->main_window,
tr("Save File As"),
child->file_info.filePath()
);
});
}
template<typename TWidget>
void DocumentEditor::loadFile(const QString& path)
{
QFileInfo file_info(path);
if (!file_info.exists()) {
throw IOCore::Exception(
fmt::format("File not found: {}", path.toStdString())
);
}
QVBoxLayout* layout = qobject_cast<QVBoxLayout*>(this->layout());
if (!layout) {
layout = new QVBoxLayout(this);
}
auto filename = file_info.baseName();
auto suffix = file_info.suffix();
if (suffix == "json") {
this->editor_widget = new JsonEditor(this, path);
layout->insertWidget(0, this->editor_widget);
this->main_window->addAction(this->action_save);
this->main_window->addAction(this->action_save_as);
} else {
try {
throw IOCore::Exception(fmt::format(
"Unsupported file type: {}", suffix.toStdString()
));
} catch (IOCore::Exception& e) {
auto dialog = ExceptionDialog::display(this, e);
}
}
}
#endif
// clang-format off
// vim: set foldmethod=syntax foldminlines=10 textwidth=80 ts=8 sts=0 sw=8 noexpandtab ft=cpp.doxygen :

View File

@ -21,6 +21,8 @@
* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#pragma once
#include "IOCore/Exception.hpp"
#include "ui_ExceptionDialog.h"

View File

@ -1,4 +1,3 @@
/* JsonEditor.cpp
* Copyright © 2022 Saul D. Beniquez
* License: Mozilla Public License v. 2.0