[Editor] Implement save feature in DocumentEditor and JsonEditor
This commit is contained in:
parent
742cfc402f
commit
0649c82999
@ -1,3 +1,5 @@
|
||||
|
||||
include_directories(PREPEND ${Elemental_CMAKE_SOURCE_DIR}/Modules)
|
||||
|
||||
#add_subdirectory(Demos)
|
||||
add_subdirectory(Editors)
|
||||
|
@ -8,9 +8,7 @@ set_target_properties(ResourceEditor
|
||||
PROPERTIES
|
||||
AUTOMOC ON
|
||||
AUTOUIC ON
|
||||
|
||||
)
|
||||
|
||||
target_link_libraries(ResourceEditor
|
||||
PRIVATE
|
||||
fmt::fmt-header-only
|
||||
|
@ -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);
|
||||
|
@ -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>
|
||||
|
@ -1,5 +1,7 @@
|
||||
|
||||
add_subdirectory(IOCore)
|
||||
add_subdirectory(elemental)
|
||||
|
||||
add_subdirectory(QJsonModel)
|
||||
add_subdirectory(EditorWidgets)
|
||||
|
||||
|
@ -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
|
||||
)
|
||||
|
||||
|
@ -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,
|
||||
|
@ -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 :
|
||||
|
81
Modules/EditorWidgets/DocumentEditor.impl.hpp
Normal file
81
Modules/EditorWidgets/DocumentEditor.impl.hpp
Normal 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 :
|
@ -21,6 +21,8 @@
|
||||
* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "IOCore/Exception.hpp"
|
||||
#include "ui_ExceptionDialog.h"
|
||||
|
||||
|
@ -1,4 +1,3 @@
|
||||
|
||||
/* JsonEditor.cpp
|
||||
* Copyright © 2022 Saul D. Beniquez
|
||||
* License: Mozilla Public License v. 2.0
|
||||
|
Loading…
Reference in New Issue
Block a user