More sort options, sort widgets directly.

This commit is contained in:
Lukas Brübach 2025-01-08 01:23:21 +01:00
parent 11f92bf101
commit 30bafe6348
5 changed files with 41 additions and 23 deletions

View file

@ -38,22 +38,23 @@ QString VisualDeckStorageSearchWidget::getSearchText()
return searchBar->text(); return searchBar->text();
} }
QStringList VisualDeckStorageSearchWidget::filterFiles(const QStringList &files, const QString &searchText) QList<DeckPreviewWidget *> VisualDeckStorageSearchWidget::filterFiles(QList<DeckPreviewWidget *> &widgets,
const QString &searchText)
{ {
if (searchText.isEmpty() || searchText.isNull()) { if (searchText.isEmpty() || searchText.isNull()) {
return files; return widgets;
} }
QStringList filteredFiles; QList<DeckPreviewWidget *> filteredWidgets;
for (const auto &file : files) { for (const auto &file : widgets) {
QFileInfo fileInfo(file); QFileInfo fileInfo(file->filePath);
QString fileName = fileInfo.fileName().toLower(); QString fileName = fileInfo.fileName().toLower();
if (fileName.contains(searchText.toLower())) { if (fileName.contains(searchText.toLower())) {
filteredFiles << file; filteredWidgets << file;
} }
} }
return filteredFiles; return filteredWidgets;
} }

View file

@ -16,7 +16,7 @@ class VisualDeckStorageSearchWidget : public QWidget
public: public:
explicit VisualDeckStorageSearchWidget(VisualDeckStorageWidget *parent); explicit VisualDeckStorageSearchWidget(VisualDeckStorageWidget *parent);
QString getSearchText(); QString getSearchText();
QStringList filterFiles(const QStringList &files, const QString &searchText); QList<DeckPreviewWidget *> filterFiles(QList<DeckPreviewWidget *> &widgets, const QString &searchText);
private: private:
QHBoxLayout *layout; QHBoxLayout *layout;

View file

@ -18,8 +18,10 @@ VisualDeckStorageSortWidget::VisualDeckStorageSortWidget(VisualDeckStorageWidget
// ComboBox for sorting options // ComboBox for sorting options
sortComboBox = new QComboBox(this); sortComboBox = new QComboBox(this);
sortComboBox->addItem("Sort Alphabetically (Deck Name)", ByName);
sortComboBox->addItem("Sort Alphabetically (Filename)", Alphabetical); sortComboBox->addItem("Sort Alphabetically (Filename)", Alphabetical);
sortComboBox->addItem("Sort by Last Modified", ByLastModified); sortComboBox->addItem("Sort by Last Modified", ByLastModified);
sortComboBox->addItem("Sort by Last Loaded", ByLastLoaded);
// Connect sorting change signal to refresh the file list // Connect sorting change signal to refresh the file list
connect(sortComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), this, connect(sortComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), this,
@ -42,22 +44,30 @@ void VisualDeckStorageSortWidget::updateSortOrder()
emit sortOrderChanged(); emit sortOrderChanged();
} }
QStringList VisualDeckStorageSortWidget::filterFiles(QStringList &files) QList<DeckPreviewWidget *> &VisualDeckStorageSortWidget::filterFiles(QList<DeckPreviewWidget *> &widgets)
{ {
// Sort files based on the current sort order // Sort the widgets list based on the current sort order
std::sort(files.begin(), files.end(), [this](const QString &file1, const QString &file2) { std::sort(widgets.begin(), widgets.end(), [this](DeckPreviewWidget *widget1, DeckPreviewWidget *widget2) {
QFileInfo info1(file1); if (!widget1 || !widget2) {
QFileInfo info2(file2); return false; // Handle null pointers gracefully
}
QFileInfo info1(widget1->filePath);
QFileInfo info2(widget2->filePath);
switch (sortOrder) { switch (sortOrder) {
case ByName:
return widget1->deckLoader->getName() < widget2->deckLoader->getName();
case Alphabetical: case Alphabetical:
return info1.fileName().toLower() < info2.fileName().toLower(); return info1.fileName().toLower() < info2.fileName().toLower();
case ByLastModified: case ByLastModified:
return info1.lastModified() > info2.lastModified(); return info1.lastModified() > info2.lastModified();
case ByLastLoaded:
return widget1->deckLoader->getLastLoadedTimestamp() > widget2->deckLoader->getLastLoadedTimestamp();
} }
return false; // Default case return false; // Default case, no sorting applied
}); });
return files; return widgets;
} }

View file

@ -16,7 +16,7 @@ public:
explicit VisualDeckStorageSortWidget(VisualDeckStorageWidget *parent); explicit VisualDeckStorageSortWidget(VisualDeckStorageWidget *parent);
void updateSortOrder(); void updateSortOrder();
QString getSearchText(); QString getSearchText();
QStringList filterFiles(QStringList &files); QList<DeckPreviewWidget *> &filterFiles(QList<DeckPreviewWidget *> &widgets);
public slots: public slots:
void showEvent(QShowEvent *event) override; void showEvent(QShowEvent *event) override;
@ -28,7 +28,9 @@ private:
enum SortOrder enum SortOrder
{ {
Alphabetical, Alphabetical,
ByLastModified ByLastModified,
ByLastLoaded,
ByName,
}; };
QHBoxLayout *layout; QHBoxLayout *layout;
VisualDeckStorageWidget *parent; VisualDeckStorageWidget *parent;

View file

@ -58,6 +58,7 @@ void VisualDeckStorageWidget::deckPreviewDoubleClickedEvent(QMouseEvent *event,
void VisualDeckStorageWidget::refreshBannerCards() void VisualDeckStorageWidget::refreshBannerCards()
{ {
QStringList allFiles; QStringList allFiles;
QList<DeckPreviewWidget *> allDecks;
// QDirIterator with QDir::Files and QDir::NoSymLinks ensures only files are listed (no directories or symlinks) // QDirIterator with QDir::Files and QDir::NoSymLinks ensures only files are listed (no directories or symlinks)
QDirIterator it(SettingsCache::instance().getDeckPath(), QDir::Files | QDir::NoSymLinks, QDirIterator it(SettingsCache::instance().getDeckPath(), QDir::Files | QDir::NoSymLinks,
@ -67,11 +68,7 @@ void VisualDeckStorageWidget::refreshBannerCards()
allFiles << it.next(); // Add each file path to the list allFiles << it.next(); // Add each file path to the list
} }
auto filteredFiles = searchWidget->filterFiles(sortWidget->filterFiles(allFiles), searchWidget->getSearchText()); foreach (const QString &file, allFiles) {
flowWidget->clearLayout(); // Clear existing widgets in the flow layout
foreach (const QString &file, filteredFiles) {
auto *display = new DeckPreviewWidget(flowWidget, file); auto *display = new DeckPreviewWidget(flowWidget, file);
connect(display, &DeckPreviewWidget::deckPreviewClicked, this, connect(display, &DeckPreviewWidget::deckPreviewClicked, this,
@ -81,6 +78,14 @@ void VisualDeckStorageWidget::refreshBannerCards()
connect(cardSizeWidget->getSlider(), &QSlider::valueChanged, display->bannerCardDisplayWidget, connect(cardSizeWidget->getSlider(), &QSlider::valueChanged, display->bannerCardDisplayWidget,
&CardInfoPictureWidget::setScaleFactor); &CardInfoPictureWidget::setScaleFactor);
display->bannerCardDisplayWidget->setScaleFactor(cardSizeWidget->getSlider()->value()); display->bannerCardDisplayWidget->setScaleFactor(cardSizeWidget->getSlider()->value());
flowWidget->addWidget(display); allDecks.append(display);
}
auto filteredFiles = searchWidget->filterFiles(sortWidget->filterFiles(allDecks), searchWidget->getSearchText());
flowWidget->clearLayout(); // Clear existing widgets in the flow layout
foreach (DeckPreviewWidget *deck, filteredFiles) {
flowWidget->addWidget(deck);
} }
} }