diff --git a/karuku/CMakeLists.txt b/karuku/CMakeLists.txt index 3029bda..f2de2b4 100644 --- a/karuku/CMakeLists.txt +++ b/karuku/CMakeLists.txt @@ -5,9 +5,11 @@ add_executable(novus-karuku) target_sources(novus-karuku PRIVATE include/mainwindow.h + include/sheetlistwidget.h src/main.cpp - src/mainwindow.cpp) + src/mainwindow.cpp + src/sheetlistwidget.cpp) target_include_directories(novus-karuku PUBLIC include) diff --git a/karuku/include/sheetlistwidget.h b/karuku/include/sheetlistwidget.h new file mode 100644 index 0000000..1af62da --- /dev/null +++ b/karuku/include/sheetlistwidget.h @@ -0,0 +1,24 @@ +// SPDX-FileCopyrightText: 2024 Joshua Goins +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include +#include +#include + +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; +}; diff --git a/karuku/src/mainwindow.cpp b/karuku/src/mainwindow.cpp index b474b0b..9838d28 100644 --- a/karuku/src/mainwindow.cpp +++ b/karuku/src/mainwindow.cpp @@ -12,6 +12,7 @@ #include #include "exdpart.h" +#include "sheetlistwidget.h" MainWindow::MainWindow(GameData *data) : NovusMainWindow() @@ -26,29 +27,20 @@ MainWindow::MainWindow(GameData *data) auto layout = new QHBoxLayout(); dummyWidget->setLayout(layout); - auto listWidget = new QListWidget(); - - 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])); - } - + auto listWidget = new SheetListWidget(data); listWidget->setMaximumWidth(200); - listWidget->sortItems(); layout->addWidget(listWidget); auto exdPart = new EXDPart(data); layout->addWidget(exdPart); - connect(listWidget, &QListWidget::itemClicked, this, [data, exdPart](QListWidgetItem *item) { - auto nameLowercase = item->text().toLower(); - - auto path = QStringLiteral("exd/%1.exh").arg(nameLowercase); + connect(listWidget, &SheetListWidget::sheetSelected, this, [data, exdPart](const QString &name) { + auto path = QStringLiteral("exd/%1.exh").arg(name.toLower()); auto pathStd = path.toStdString(); auto file = physis_gamedata_extract_file(data, pathStd.c_str()); - exdPart->loadSheet(item->text(), file); + exdPart->loadSheet(name, file); }); } diff --git a/karuku/src/sheetlistwidget.cpp b/karuku/src/sheetlistwidget.cpp new file mode 100644 index 0000000..640240d --- /dev/null +++ b/karuku/src/sheetlistwidget.cpp @@ -0,0 +1,53 @@ +// SPDX-FileCopyrightText: 2024 Joshua Goins +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "sheetlistwidget.h" + +#include +#include +#include +#include + +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" \ No newline at end of file