1
Fork 0
mirror of https://github.com/redstrate/Novus.git synced 2025-04-23 04:27:45 +00:00

karaku: Add search function to the sheet list

This commit is contained in:
Joshua Goins 2024-02-02 14:28:49 -05:00
parent 5a03fafd3b
commit d58fcf7e98
4 changed files with 85 additions and 14 deletions

View file

@ -5,9 +5,11 @@ add_executable(novus-karuku)
target_sources(novus-karuku target_sources(novus-karuku
PRIVATE PRIVATE
include/mainwindow.h include/mainwindow.h
include/sheetlistwidget.h
src/main.cpp src/main.cpp
src/mainwindow.cpp) src/mainwindow.cpp
src/sheetlistwidget.cpp)
target_include_directories(novus-karuku target_include_directories(novus-karuku
PUBLIC PUBLIC
include) include)

View file

@ -0,0 +1,24 @@
// SPDX-FileCopyrightText: 2024 Joshua Goins <josh@redstrate.com>
// SPDX-License-Identifier: GPL-3.0-or-later
#pragma once
#include <QListView>
#include <QWidget>
#include <physis.hpp>
class SheetListWidget : public QWidget
{
Q_OBJECT
public:
explicit SheetListWidget(GameData *data, QWidget *parent = nullptr);
Q_SIGNALS:
void sheetSelected(const QString &name);
private:
QListView *listWidget = nullptr;
GameData *data = nullptr;
};

View file

@ -12,6 +12,7 @@
#include <physis.hpp> #include <physis.hpp>
#include "exdpart.h" #include "exdpart.h"
#include "sheetlistwidget.h"
MainWindow::MainWindow(GameData *data) MainWindow::MainWindow(GameData *data)
: NovusMainWindow() : NovusMainWindow()
@ -26,29 +27,20 @@ MainWindow::MainWindow(GameData *data)
auto layout = new QHBoxLayout(); auto layout = new QHBoxLayout();
dummyWidget->setLayout(layout); dummyWidget->setLayout(layout);
auto listWidget = new QListWidget(); auto listWidget = new SheetListWidget(data);
auto names = physis_gamedata_get_all_sheet_names(data);
for (uint32_t i = 0; i < names.name_count; i++) {
listWidget->addItem(QString::fromStdString(names.names[i]));
}
listWidget->setMaximumWidth(200); listWidget->setMaximumWidth(200);
listWidget->sortItems();
layout->addWidget(listWidget); layout->addWidget(listWidget);
auto exdPart = new EXDPart(data); auto exdPart = new EXDPart(data);
layout->addWidget(exdPart); layout->addWidget(exdPart);
connect(listWidget, &QListWidget::itemClicked, this, [data, exdPart](QListWidgetItem *item) { connect(listWidget, &SheetListWidget::sheetSelected, this, [data, exdPart](const QString &name) {
auto nameLowercase = item->text().toLower(); auto path = QStringLiteral("exd/%1.exh").arg(name.toLower());
auto path = QStringLiteral("exd/%1.exh").arg(nameLowercase);
auto pathStd = path.toStdString(); auto pathStd = path.toStdString();
auto file = physis_gamedata_extract_file(data, pathStd.c_str()); auto file = physis_gamedata_extract_file(data, pathStd.c_str());
exdPart->loadSheet(item->text(), file); exdPart->loadSheet(name, file);
}); });
} }

View file

@ -0,0 +1,53 @@
// SPDX-FileCopyrightText: 2024 Joshua Goins <josh@redstrate.com>
// SPDX-License-Identifier: GPL-3.0-or-later
#include "sheetlistwidget.h"
#include <QLineEdit>
#include <QSortFilterProxyModel>
#include <QStringListModel>
#include <QVBoxLayout>
SheetListWidget::SheetListWidget(GameData *data, QWidget *parent)
: QWidget(parent)
, data(data)
{
auto layout = new QVBoxLayout();
layout->setContentsMargins(0, 0, 0, 0);
setLayout(layout);
auto searchModel = new QSortFilterProxyModel();
searchModel->setRecursiveFilteringEnabled(true);
searchModel->setFilterCaseSensitivity(Qt::CaseSensitivity::CaseInsensitive);
auto searchEdit = new QLineEdit();
searchEdit->setPlaceholderText(QStringLiteral("Search..."));
searchEdit->setClearButtonEnabled(true);
connect(searchEdit, &QLineEdit::textChanged, this, [=](const QString &text) {
searchModel->setFilterRegularExpression(text);
});
layout->addWidget(searchEdit);
auto originalModel = new QStringListModel();
searchModel->setSourceModel(originalModel);
QStringList list;
auto names = physis_gamedata_get_all_sheet_names(data);
for (uint32_t i = 0; i < names.name_count; i++) {
list.push_back(QString::fromStdString(names.names[i]));
}
originalModel->setStringList(list);
listWidget = new QListView();
listWidget->setModel(searchModel);
connect(listWidget, &QListView::clicked, [this, searchModel](const QModelIndex &index) {
Q_EMIT sheetSelected(searchModel->mapToSource(index).data(Qt::DisplayRole).toString());
});
layout->addWidget(listWidget);
}
#include "moc_sheetlistwidget.cpp"