Begin Tag's structure

master
Julien Rosset 5 years ago
parent 80afbd9e9b
commit 78db7d5dc9

@ -1,4 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="CMakeWorkspace" PROJECT_DIR="$PROJECT_DIR$" /> <component name="CMakeWorkspace" PROJECT_DIR="$PROJECT_DIR$" />
<component name="CidrRootsConfiguration">
<excludeRoots>
<file path="$PROJECT_DIR$/cmake-build-debug" />
</excludeRoots>
</component>
</project> </project>

@ -20,5 +20,10 @@ add_executable(
MainWindow/MainWindow.ui MainWindow/MainWindow.h MainWindow/MainWindow.cpp MainWindow/MainWindow.ui MainWindow/MainWindow.h MainWindow/MainWindow.cpp
icons/breeze.qrc icons/breeze-dark.qrc icons/breeze.qrc icons/breeze-dark.qrc
NBT/AbstractTag.h NBT/AbstractTag.cpp
NBT/AbstractNamedTag.h NBT/AbstractNamedTag.cpp
NBT/TagEnd.cpp NBT/TagEnd.h
NBT/TagByte.cpp NBT/TagByte.h
) )
target_link_libraries(NBTModifier Qt5::Widgets Qt5::Svg) target_link_libraries(NBTModifier Qt5::Widgets Qt5::Svg)

@ -1,53 +1,69 @@
#include "MainWindow.h" #include "MainWindow.h"
#include "ui_MainWindow.h" #include "ui_MainWindow.h"
#include <QtWidgets/QFileDialog>
#include <QtWidgets/QMessageBox> #include <QtWidgets/QMessageBox>
MainWindow::MainWindow(QWidget *parent) : MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent), QMainWindow(parent),
ui(new Ui::MainWindow) { m_ui(new Ui::MainWindow) {
setupUi(); setupUi();
} }
MainWindow::~MainWindow() { MainWindow::~MainWindow() {
delete ui; delete m_ui;
} }
void MainWindow::setupUi() { void MainWindow::setupUi() {
ui->setupUi(this); m_ui->setupUi(this);
//region Shortcuts //region Shortcuts
ui->actionFileNew->setShortcut(QKeySequence::New); m_ui->actionFileNew->setShortcut(QKeySequence::New);
ui->actionFileOpen->setShortcut(QKeySequence::Open); m_ui->actionFileOpen->setShortcut(QKeySequence::Open);
ui->actionFileSave->setShortcut(QKeySequence::Save); m_ui->actionFileSave->setShortcut(QKeySequence::Save);
ui->actionFileSaveAs->setShortcut(QKeySequence::SaveAs); m_ui->actionFileSaveAs->setShortcut(QKeySequence::SaveAs);
ui->actionFileReload->setShortcut(QKeySequence::Refresh); m_ui->actionFileReload->setShortcut(QKeySequence::Refresh);
ui->actionFileClose->setShortcut(QKeySequence::Close); m_ui->actionFileClose->setShortcut(QKeySequence::Close);
ui->actionFileSettings->setShortcut(QKeySequence::Preferences); m_ui->actionFileSettings->setShortcut(QKeySequence::Preferences);
ui->actionFileQuit->setShortcut(QKeySequence::Quit); m_ui->actionFileQuit->setShortcut(QKeySequence::Quit);
ui->actionEditUndo->setShortcut(QKeySequence::Undo); m_ui->actionEditUndo->setShortcut(QKeySequence::Undo);
ui->actionEditRedo->setShortcut(QKeySequence::Redo); m_ui->actionEditRedo->setShortcut(QKeySequence::Redo);
ui->actionEditCopy->setShortcut(QKeySequence::Copy); m_ui->actionEditCopy->setShortcut(QKeySequence::Copy);
ui->actionEditCut->setShortcut(QKeySequence::Cut); m_ui->actionEditCut->setShortcut(QKeySequence::Cut);
ui->actionEditPaste->setShortcut(QKeySequence::Paste); m_ui->actionEditPaste->setShortcut(QKeySequence::Paste);
ui->actionEditModify->setShortcut(QKeySequence(tr("F2"))); m_ui->actionEditModify->setShortcut(QKeySequence(tr("F2")));
ui->actionEditDelete->setShortcut(QKeySequence::Delete); m_ui->actionEditDelete->setShortcut(QKeySequence::Delete);
ui->actionEditMoveUp->setShortcut(QKeySequence(tr("Ctrl+Up"))); m_ui->actionEditMoveUp->setShortcut(QKeySequence(tr("Ctrl+Up")));
ui->actionEditMoveDown->setShortcut(QKeySequence(tr("Ctrl+Down"))); m_ui->actionEditMoveDown->setShortcut(QKeySequence(tr("Ctrl+Down")));
ui->actionSearchFind->setShortcut(QKeySequence::Find); m_ui->actionSearchFind->setShortcut(QKeySequence::Find);
ui->actionSearchFindNext->setShortcut(QKeySequence::FindNext); m_ui->actionSearchFindNext->setShortcut(QKeySequence::FindNext);
ui->actionSearchFindPrevious->setShortcut(QKeySequence::FindPrevious); m_ui->actionSearchFindPrevious->setShortcut(QKeySequence::FindPrevious);
ui->actionSearchReplace->setShortcut(QKeySequence::Replace); m_ui->actionSearchReplace->setShortcut(QKeySequence::Replace);
ui->actionHelpAboutNBTModifier->setShortcut(QKeySequence::HelpContents); m_ui->actionHelpAboutNBTModifier->setShortcut(QKeySequence::HelpContents);
//endregion //endregion
//region Signals //region Signals
connect(ui->actionHelpAboutQt, &QAction::triggered, qApp, &QApplication::aboutQt); connect(m_ui->actionHelpAboutQt, &QAction::triggered, qApp, &QApplication::aboutQt);
//endregion //endregion
} }
void MainWindow::on_actionFileOpen_triggered() {
const QString path = QFileDialog::getOpenFileName(
this,
tr("Choose a file to open"),
qApp->applicationDirPath(),
QString(tr("Data files (*.dat);;All files (*.*)"))
);
if (path.isEmpty()) {
return;
}
const QFile file(path, this);
}
void MainWindow::on_actionHelpAboutNBTModifier_triggered() { void MainWindow::on_actionHelpAboutNBTModifier_triggered() {
QMessageBox info(this); QMessageBox info(this);

@ -7,6 +7,9 @@ namespace Ui {
class MainWindow; class MainWindow;
} }
/**
* Main window of application
*/
class MainWindow : public QMainWindow { class MainWindow : public QMainWindow {
Q_OBJECT Q_OBJECT
@ -15,11 +18,25 @@ public:
virtual ~MainWindow() override; virtual ~MainWindow() override;
private: private:
Ui::MainWindow *ui; /**
* Internal window design
*/
Ui::MainWindow *m_ui;
/**
* Build the internal window design
*/
void setupUi(); void setupUi();
private slots: private slots:
/**
* Open a file
*/
void on_actionFileOpen_triggered();
/**
* Display the "about" dialog
*/
void on_actionHelpAboutNBTModifier_triggered(); void on_actionHelpAboutNBTModifier_triggered();
}; };

@ -28,36 +28,22 @@
<number>0</number> <number>0</number>
</property> </property>
<item> <item>
<widget class="QTreeWidget" name="treeWidget"> <widget class="QMdiArea" name="mdiArea">
<property name="tabKeyNavigation"> <property name="activationOrder">
<bool>true</bool> <enum>QMdiArea::StackingOrder</enum>
</property> </property>
<property name="dragEnabled"> <property name="viewMode">
<bool>true</bool> <enum>QMdiArea::TabbedView</enum>
</property> </property>
<property name="dragDropOverwriteMode"> <property name="documentMode">
<bool>true</bool> <bool>true</bool>
</property> </property>
<property name="dragDropMode"> <property name="tabsClosable">
<enum>QAbstractItemView::InternalMove</enum>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::MultiSelection</enum>
</property>
<property name="uniformRowHeights">
<bool>true</bool> <bool>true</bool>
</property> </property>
<property name="headerHidden"> <property name="tabsMovable">
<bool>true</bool> <bool>true</bool>
</property> </property>
<attribute name="headerVisible">
<bool>false</bool>
</attribute>
<column>
<property name="text">
<string notr="true">1</string>
</property>
</column>
</widget> </widget>
</item> </item>
</layout> </layout>
@ -68,7 +54,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>800</width> <width>800</width>
<height>29</height> <height>21</height>
</rect> </rect>
</property> </property>
<widget class="QMenu" name="menuFile"> <widget class="QMenu" name="menuFile">
@ -76,7 +62,7 @@
<string>&amp;File</string> <string>&amp;File</string>
</property> </property>
<addaction name="actionFileNew"/> <addaction name="actionFileNew"/>
<addaction name="actionFileOpen"/> <addaction name="actionFileOpenFile"/>
<addaction name="separator"/> <addaction name="separator"/>
<addaction name="actionFileSave"/> <addaction name="actionFileSave"/>
<addaction name="actionFileSaveAs"/> <addaction name="actionFileSaveAs"/>
@ -170,13 +156,13 @@
<string>&amp;New</string> <string>&amp;New</string>
</property> </property>
</action> </action>
<action name="actionFileOpen"> <action name="actionFileOpenFile">
<property name="icon"> <property name="icon">
<iconset theme="document-open"> <iconset theme="document-open">
<normaloff>.</normaloff>.</iconset> <normaloff>.</normaloff>.</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>&amp;Open</string> <string>&amp;Open file</string>
</property> </property>
</action> </action>
<action name="actionFileSave"> <action name="actionFileSave">
@ -415,10 +401,12 @@
<string>Settings</string> <string>Settings</string>
</property> </property>
</action> </action>
<action name="actionOpen_directory">
<property name="text">
<string>Open directory</string>
</property>
</action>
</widget> </widget>
<tabstops>
<tabstop>treeWidget</tabstop>
</tabstops>
<resources/> <resources/>
<connections> <connections>
<connection> <connection>

@ -0,0 +1,34 @@
#include "AbstractNamedTag.h"
#include <QtEndian>
#include <QtCore/QDataStream>
AbstractNamedTag::AbstractNamedTag(const quint8 id) : AbstractTag(id) {}
const bool AbstractNamedTag::readFromData(QDataStream &data) {
quint16 size;
data >> size;
size = qFromBigEndian(size);
char *rawName = new char[size];
if (data.readRawData(rawName, size) == -1) {
return false;
}
m_name = QString::fromUtf8(rawName);
return readPayloadFromData(data);
}
const bool AbstractNamedTag::writeToData(QDataStream &data) const {
const QByteArray rawName = m_name.toUtf8();
data << qToBigEndian(rawName.size()) << rawName.constData();
return writePayloadToData(data);
}
const QString &AbstractNamedTag::name() const {
return m_name;
}
void AbstractNamedTag::setName(const QString &name) {
m_name = name;
}

@ -0,0 +1,53 @@
#ifndef NBTMODIFIER_ABSTRACTNAMEDTAG_H
#define NBTMODIFIER_ABSTRACTNAMEDTAG_H
#include "AbstractTag.h"
#include <QtCore/QString>
class AbstractNamedTag : public AbstractTag {
public:
/**
* Get the tag name
*
* @return The tag name
*/
const QString& name() const;
/**
* Set the tag name
*
* @param name The new tag name
*/
void setName (const QString &name);
protected:
explicit AbstractNamedTag(const quint8 id);
virtual const bool readFromData(QDataStream &data) override;
virtual const bool writeToData(QDataStream &data) const override;
/**
* Read a tag payload from a data stream
*
* @param data The data stream
*
* @return True if read is success, otherwise false
*/
virtual const bool readPayloadFromData(QDataStream &data) = 0;
/**
* Write a tag payload to a data stream
*
* @param data The data stream
*
* @return True if write is success, otherwise false
*/
virtual const bool writePayloadToData(QDataStream &data) const = 0;
private:
/**
* The tag name
*/
QString m_name;
};
#endif //NBTMODIFIER_ABSTRACTNAMEDTAG_H

@ -0,0 +1,41 @@
#include "AbstractTag.h"
#include "TagEnd.h"
#include "TagByte.h"
#include <QtCore/QDataStream>
AbstractTag::AbstractTag(const quint8 id) : m_id(id) {}
const quint8 AbstractTag::id() const {
return m_id;
}
AbstractTag *AbstractTag::fromData(QDataStream &data, bool *ok) {
quint8 id;
data >> id;
AbstractTag *tag = nullptr;
switch (id) {
case TagEnd::ID:
tag = new TagEnd();
case TagByte::ID:
tag = new TagByte();
}
if (tag == nullptr) {
return nullptr;
}
*ok = tag->readFromData(data);
return tag;
}
QByteArray AbstractTag::toData(bool *ok) {
QByteArray data;
QDataStream stream(data);
stream << id();
*ok = writeToData(stream);
return data;
}

@ -0,0 +1,50 @@
#ifndef NBTMODIFIER_ABSTRACTTAG_H
#define NBTMODIFIER_ABSTRACTTAG_H
#include <QtGlobal>
class QDataStream;
/**
* Interface for all NBT tags
*/
class AbstractTag {
public:
const quint8 id() const;
static AbstractTag *fromData(QDataStream &data, bool *ok = nullptr);
QByteArray toData(bool *ok = nullptr);
protected:
/**
* Create a new tag
*
* @param id
*/
explicit AbstractTag(const quint8 id);
/**
* Read a tag from a data stream
*
* @param data The data stream
*
* @return True if read is success, otherwise false
*/
virtual const bool readFromData(QDataStream &data) = 0;
/**
* Write a tag to a data stream
*
* @param data The data stream
*
* @return True if write is success, otherwise false
*/
virtual const bool writeToData(QDataStream &data) const = 0;
private:
/**
* The tag's ID
*/
const quint8 m_id;
};
#endif //NBTMODIFIER_ABSTRACTTAG_H

@ -0,0 +1,14 @@
#include "TagByte.h"
#include <QtCore/QDataStream>
TagByte::TagByte(const qint8 value) : AbstractNamedTag(ID), m_value(value) {}
bool const TagByte::readPayloadFromData(QDataStream &data) {
data >> m_value;
return true;
}
bool const TagByte::writePayloadToData(QDataStream &data) const {
data << m_value;
return true;
}

@ -0,0 +1,20 @@
#ifndef NBTMODIFIER_TAGBYTE_H
#define NBTMODIFIER_TAGBYTE_H
#include "AbstractNamedTag.h"
class TagByte : public AbstractNamedTag {
public:
static constexpr quint8 ID = 1;
TagByte(const qint8 value = 0);
protected:
virtual bool const readPayloadFromData(QDataStream &data) override;
virtual bool const writePayloadToData(QDataStream &data) const override;
private:
qint8 m_value;
};
#endif //NBTMODIFIER_TAGBYTE_H

@ -0,0 +1,11 @@
#include "TagEnd.h"
TagEnd::TagEnd() : AbstractTag(ID) {
}
bool const TagEnd::readFromData(QDataStream &data) {
return true;
}
bool const TagEnd::writeToData(QDataStream &data) const {
return true;
}

@ -0,0 +1,17 @@
#ifndef NBTMODIFIER_TAGEND_H
#define NBTMODIFIER_TAGEND_H
#include "AbstractTag.h"
class TagEnd : public AbstractTag {
public:
static constexpr quint8 ID = 0;
explicit TagEnd();
protected:
virtual bool const readFromData(QDataStream &data) override;
virtual bool const writeToData(QDataStream &data) const override;
};
#endif //NBTMODIFIER_TAGEND_H
Loading…
Cancel
Save