mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-07-19 00:42:14 -07:00
More sort options, sort widgets directly.
This commit is contained in:
parent
11f92bf101
commit
30bafe6348
5 changed files with 41 additions and 23 deletions
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue