Skip to content
Open
3 changes: 3 additions & 0 deletions .clangd
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
CompileFlags:
Add: [-W3]
Remove: [-fsanitize*, -mno-direct-extern-access]
5 changes: 4 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -324,14 +324,17 @@ set(EDITOR_SOURCES

set(EDITOR_QML_UI
src/ui/common/CheckBox.qml
src/ui/common/ComboBox.qml
src/ui/common/RadioButton.qml
src/ui/common/SpinBox.qml
src/ui/common/TextField.qml
src/ui/MainWindow.qml
src/ui/database/DatabaseWindow.qml
src/ui/database/ActorPage.qml
src/ui/database/AttributePage.qml
src/ui/database/DatabaseEntryListPage.qml
src/ui/database/DatabaseEntryPage.qml
src/ui/database/DatabasePage.qml
src/ui/database/DatabaseWindow.qml
src/ui/database/ItemPage.qml
src/ui/database/SkillPage.qml
src/ui/database/VocabularyPage.qml
Expand Down
2 changes: 1 addition & 1 deletion src/common/lcf_widget_binding.h
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ namespace LcfWidgetBinding {
data.obj() = static_cast<T>(checkBox->isChecked());
};

QWidget::connect(checkBox, &QCheckBox::stateChanged, parent, callback);
QWidget::connect(checkBox, &QCheckBox::checkStateChanged, parent, callback);
}

template<typename T>
Expand Down
7 changes: 4 additions & 3 deletions src/common/sortfilter_proxy_models.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,16 +16,17 @@
*/

#include "sortfilter_proxy_models.h"
#include "json_list_view.h"

SortFilterProxyModelIdFilter::SortFilterProxyModelIdFilter(const std::vector<int>& indices) :
QSortFilterProxyModel() {
SortFilterProxyModelIdFilter::SortFilterProxyModelIdFilter(const std::vector<int>& indices, QObject* parent) :
QSortFilterProxyModel(parent) {
this->indices = indices;
std::sort(this->indices.begin(), this->indices.end());
}

bool SortFilterProxyModelIdFilter::filterAcceptsRow(int sourceRow, const QModelIndex& sourceParent) const {
QModelIndex index = sourceModel()->index(sourceRow, 0, sourceParent);
int val = sourceModel()->data(index, Qt::UserRole).toInt();
int val = sourceModel()->data(index, JsonListView::IdRole).toInt();

return std::binary_search(this->indices.begin(), this->indices.end(), val);
}
4 changes: 3 additions & 1 deletion src/common/sortfilter_proxy_models.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,10 @@
* Filters by a list of Lcf IDs
*/
class SortFilterProxyModelIdFilter : public QSortFilterProxyModel {
Q_OBJECT

public:
SortFilterProxyModelIdFilter(const std::vector<int>& indices);
SortFilterProxyModelIdFilter(const std::vector<int>& indices, QObject* parent);
bool filterAcceptsRow(int sourceRow, const QModelIndex& sourceParent) const override;

private:
Expand Down
29 changes: 18 additions & 11 deletions src/model/actor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,24 +17,25 @@

#include "actor.h"
#include <lcf/rpg/item.h>
#include "common/image_loader.h"
#include "ui/database/actor_widget.h"
#include "common/dbstring.h"
#include "common/sortfilter_proxy_models.h"

ActorModel::ActorModel(ProjectData& project, lcf::rpg::Actor& data) :
RpgBase(project), m_data(data) {
RpgBase(project), m_data(&data) {
}

lcf::rpg::Actor& ActorModel::data() {
return m_data;
return *m_data;
}

QPixmap ActorModel::preview() {
QString path = m_project.project().findFile("FaceSet", ToQString(m_data.face_name), FileFinder::FileType::Image);
QString path = m_project->project().findFile("FaceSet", ToQString(m_data->face_name), FileFinder::FileType::Image);
if (!path.isEmpty()) {
QPixmap faceSet = ImageLoader::Load(path);
int x = (m_data.face_index % 4) * 48;
int y = (m_data.face_index / 4) * 48;
int x = (m_data->face_index % 4) * 48;
int y = (m_data->face_index / 4) * 48;

return faceSet.copy(x, y, 48, 48);
} else {
Expand All @@ -46,11 +47,11 @@ QPixmap ActorModel::preview() {
}

const lcf::rpg::Actor& ActorModel::data() const {
return m_data;
return *m_data;
}

bool ActorModel::IsItemUsable(const lcf::rpg::Item& item) const {
int query_idx = m_data.ID - 1;
int query_idx = m_data->ID - 1;
auto* query_set = &item.actor_set;
/*TODO if (Player::IsRPG2k3() && Data::system.equipment_setting == lcf::rpg::System::EquipmentSetting_class) {
auto* cls = GetClass();
Expand All @@ -69,16 +70,22 @@ bool ActorModel::IsItemUsable(const lcf::rpg::Item& item) const {
return (*query_set)[query_idx];
}

QSortFilterProxyModel* ActorModel::CreateEquipmentFilter(lcf::rpg::Item::Type type) {
std::vector<int> indices;
QAbstractItemModel* ActorModel::CreateEquipmentFilter(lcf::rpg::Item::Type type, QObject* parent) {
std::vector<int> indices = {0}; // Include (None)

for (const auto& item : m_project.database().items) {
for (const auto& item : m_project->database().items) {
if (item.type != type || !IsItemUsable(item)) {
continue;
}

indices.push_back(item.ID);
}

return new SortFilterProxyModelIdFilter(indices);
auto filter = new SortFilterProxyModelIdFilter(indices, parent);

if (!parent) {
QQmlEngine::setObjectOwnership(filter, QQmlEngine::JavaScriptOwnership);
}

return filter;
}
11 changes: 7 additions & 4 deletions src/model/actor.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,17 +20,20 @@
#include <QGraphicsItem>
#include <lcf/rpg/database.h>
#include <lcf/rpg/actor.h>
#include "project.h"
#include "rpg_base.h"

class QSortFilterProxyModel;
class QAbstractItemModel;
class ProjectData;

/**
* A thin wrapper around lcf::rpg::Actor
*/
class ActorModel : public RpgBase
{
Q_GADGET

public:
ActorModel() = default;
ActorModel(ProjectData& project, lcf::rpg::Actor& data);

bool IsItemUsable(const lcf::rpg::Item& item) const;
Expand All @@ -41,7 +44,7 @@ class ActorModel : public RpgBase
* @param type Equipment type
* @return QSortFilterProxyModel
*/
QSortFilterProxyModel* CreateEquipmentFilter(lcf::rpg::Item::Type type);
Q_INVOKABLE QAbstractItemModel* CreateEquipmentFilter(lcf::rpg::Item::Type type, QObject* parent = nullptr);

lcf::rpg::Actor& data();

Expand All @@ -54,6 +57,6 @@ class ActorModel : public RpgBase
QPixmap preview() override;

private:
lcf::rpg::Actor& m_data;
lcf::rpg::Actor* m_data = nullptr;
};

6 changes: 5 additions & 1 deletion src/model/enemy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@
*/

#include "enemy.h"
#include "common/filefinder.h"
#include "common/image_loader.h"
#include "model/project.h"
#include "model/project_data.h"
#include "ui/database/enemy_widget.h"
#include "common/dbstring.h"

Expand All @@ -29,7 +33,7 @@ lcf::rpg::Enemy& EnemyModel::data() {
}

QPixmap EnemyModel::preview() {
QPixmap monster = ImageLoader::Load(m_project.project().findFile("Monster", ToQString(data().battler_name), FileFinder::FileType::Image));
QPixmap monster = ImageLoader::Load(m_project->project().findFile("Monster", ToQString(data().battler_name), FileFinder::FileType::Image));
if (!monster) {
return QPixmap(48, 48);
}
Expand Down
4 changes: 2 additions & 2 deletions src/model/project.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -69,11 +69,11 @@ std::shared_ptr<Project> Project::load(const QDir& dir) {

if (!cfg.isNull()) {
lcf::INIReader ini(cfg.toStdString());
auto title = ini.GetString("RPG_RT", GAMETITLE, tr("Untitled").toStdString());
std::string title = std::string(ini.GetString("RPG_RT", GAMETITLE, tr("Untitled").toStdString()));

if (project_type == FileFinder::ProjectType::Legacy) {
// Check for game encoding
auto enc = ini.GetString("EasyRPG", "Encoding", "");
std::string enc = std::string(ini.GetString("EasyRPG", "Encoding", ""));
if (enc.empty()) {
// Only use the title for encoding detection
// This is called for all games in the "Open Project" list
Expand Down
2 changes: 1 addition & 1 deletion src/model/rpg_base.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,6 @@

#include "rpg_base.h"

RpgBase::RpgBase(ProjectData &project) : m_project(project) {
RpgBase::RpgBase(ProjectData &project) : m_project(&project) {

}
12 changes: 7 additions & 5 deletions src/model/rpg_base.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,22 +19,24 @@

#include <QPixmap>
#include <QMessageBox>
#include "common/image_loader.h"
#include "project.h"
#include "core.h"

class ProjectData;

class RpgBase {
Q_GADGET

public:
RpgBase() = default;
explicit RpgBase(ProjectData& project);

virtual QPixmap preview() {
return QPixmap();
}

ProjectData& project() const {
return m_project;
return *m_project;
}

protected:
ProjectData& m_project;
ProjectData* m_project = nullptr;
};
1 change: 1 addition & 0 deletions src/qmlbinding/json.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
class Json : public QObject {
Q_OBJECT
QML_ELEMENT
QML_UNCREATABLE("Json is an abstract base class")

public:
explicit Json(QObject* parent = nullptr) : QObject(parent) {}
Expand Down
25 changes: 20 additions & 5 deletions src/qmlbinding/json_internals/json_t_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,10 +47,22 @@ QString JsonT<LCFTYPE>::str(QString jsonPtr) const {

template<typename LCFTYPE>
int JsonT<LCFTYPE>::num(QString jsonPtr) const {
auto res = glz::get<int>(*m_data, jsonPtr.toStdString());
std::string ptr = jsonPtr.toStdString();

if (res) {
return res.value();
if (auto res = glz::get<int32_t>(*m_data, ptr)) {
return res.value().get();
}

if (auto res = glz::get<uint32_t>(*m_data, ptr)) {
return static_cast<int>(res.value().get());
}

if (auto res = glz::get<int16_t>(*m_data, ptr)) {
return static_cast<int>(res.value().get());
}

if (auto res = glz::get<uint16_t>(*m_data, ptr)) {
return static_cast<int>(res.value().get());
}

qDebug() << "Json::num: Not pointing to int: " << jsonPtr;
Expand All @@ -77,6 +89,9 @@ void JsonT<LCFTYPE>::set(QString jsonPtr, const QVariant& value) {
case QMetaType::Int:
glz::set(m_data, jsonPtr.toStdString(), value.toInt());
break;
case QMetaType::Double:
glz::set(m_data, jsonPtr.toStdString(), value.toDouble());
break;
case QMetaType::QString: {
lcf::DBString s = ToDBString(value.value<QString>());
glz::set(m_data, jsonPtr.toStdString(), s);
Expand All @@ -87,14 +102,14 @@ void JsonT<LCFTYPE>::set(QString jsonPtr, const QVariant& value) {
break;
}
default:
assert(false);
qDebug() << "Json::set: Type unsupported: " << value.typeName();
break;
}
}

template <typename T>
concept IsVector = requires {
typename T::value_type;
typename T::value_type;
} && std::is_class_v<typename T::value_type>;

template<typename LCFTYPE>
Expand Down
6 changes: 3 additions & 3 deletions src/qmlbinding/json_list_view.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,11 @@

QHash<int, QByteArray> JsonListView::roleNames() const {
QHash<int, QByteArray> roles;
roles[Qt::DisplayRole] = "display";
roles[Qt::DisplayRole] = "text";
roles[NameRole] = "name";
roles[TitleRole] = "title";
roles[IdRole] = "index";
roles[IndexRole] = "listindex";
roles[IdRole] = "value";
roles[IndexRole] = "index";
return roles;
}

Expand Down
Loading
Loading