diff options
| author | isanae <14251494+isanae@users.noreply.github.com> | 2019-06-27 01:58:13 -0400 |
|---|---|---|
| committer | isanae <14251494+isanae@users.noreply.github.com> | 2019-07-02 10:10:19 -0400 |
| commit | 9cce32f19f435570b94c6f65c2bc6eb99bd542ac (patch) | |
| tree | 9978d6e12fa2583ec660ee5f77a0c55092494f36 /src | |
| parent | cac0fb710c48fa55c6e7303485adf9f4f3364682 (diff) | |
dds toggle for images
Diffstat (limited to 'src')
| -rw-r--r-- | src/modinfodialog.ui | 10 | ||||
| -rw-r--r-- | src/modinfodialogimages.cpp | 108 | ||||
| -rw-r--r-- | src/modinfodialogimages.h | 6 |
3 files changed, 104 insertions, 20 deletions
diff --git a/src/modinfodialog.ui b/src/modinfodialog.ui index 56c97c34..3ea0a27b 100644 --- a/src/modinfodialog.ui +++ b/src/modinfodialog.ui @@ -173,6 +173,9 @@ </property>
<widget class="QWidget" name="widget_8" native="true">
<layout class="QVBoxLayout" name="verticalLayout_2">
+ <property name="spacing">
+ <number>3</number>
+ </property>
<property name="leftMargin">
<number>0</number>
</property>
@@ -203,6 +206,13 @@ </widget>
</item>
<item>
+ <widget class="QCheckBox" name="imagesShowDDS">
+ <property name="text">
+ <string>Show .dds files</string>
+ </property>
+ </widget>
+ </item>
+ <item>
<widget class="QLineEdit" name="imagesFilter"/>
</item>
</layout>
diff --git a/src/modinfodialogimages.cpp b/src/modinfodialogimages.cpp index 08fd5c5b..e25fd838 100644 --- a/src/modinfodialogimages.cpp +++ b/src/modinfodialogimages.cpp @@ -1,5 +1,6 @@ #include "modinfodialogimages.h" #include "ui_modinfodialog.h" +#include "settings.h" #include "utility.h" ImagesTab::ImagesTab( @@ -7,8 +8,10 @@ ImagesTab::ImagesTab( QWidget* parent, Ui::ModInfoDialog* ui, int id) : ModInfoDialogTab(oc, plugin, parent, ui, id), m_image(new ScalableImage), m_margins(3), m_padding(5), m_border(1), - m_selection(nullptr) + m_selection(nullptr), m_ddsAvailable(false), m_ddsEnabled(false) { + getSupportedFormats(); + auto* ly = new QVBoxLayout(ui->imagesImage); ly->setContentsMargins({0, 0, 0, 0}); ly->addWidget(m_image); @@ -23,12 +26,15 @@ ImagesTab::ImagesTab( ui->imagesScrollArea->setTab(this); ui->imagesThumbnails->setTab(this); + ui->imagesShowDDS->setEnabled(m_ddsAvailable); + m_filter.setEdit(ui->imagesFilter); connect(&m_filter, &FilterWidget::changed, [&]{ onFilterChanged(); }); connect(ui->imagesExplore, &QAbstractButton::clicked, [&]{ onExplore(); }); + connect(ui->imagesShowDDS, &QCheckBox::toggled, [&]{ onShowDDS(); }); - getSupportedFormats(); + ui->imagesShowDDS->setEnabled(m_ddsAvailable); } void ImagesTab::clear() @@ -54,55 +60,88 @@ bool ImagesTab::feedFile(const QString& rootPath, const QString& fullPath) void ImagesTab::update() { - setHasData(!m_files.empty()); - filterImages(); resizeWidget(); ui->imagesThumbnails->update(); + + setHasData(fileCount() > 0); } -void ImagesTab::filterImages() +void ImagesTab::saveState(Settings& s) { - m_filteredFiles.clear(); + s.directInterface().setValue( + "mod_info_dialog_images_show_dds", m_ddsEnabled); +} - if (m_filter.empty()) { +void ImagesTab::restoreState(const Settings& s) +{ + ui->imagesShowDDS->setChecked(s.directInterface() + .value("mod_info_dialog_images_show_dds", false).toBool()); +} + +void ImagesTab::filterImages() +{ + if (!needsFiltering()) { return; } + m_filteredFiles.clear(); + + bool hasTextFilter = !m_filter.empty(); + bool sawSelection = false; + for (auto& f : m_files) { - const auto m = m_filter.matches([&](auto&& what) { - return f.path.contains(what, Qt::CaseInsensitive); - }); + if (hasTextFilter) { + const auto m = m_filter.matches([&](auto&& what) { + return f.path.contains(what, Qt::CaseInsensitive); + }); + + if (!m) { + continue; + } + } + + if (!m_ddsEnabled) { + if (f.path.endsWith(".dds", Qt::CaseInsensitive)) { + continue; + } + } - if (m) { - m_filteredFiles.push_back(&f); + if (&f == m_selection) { + sawSelection = true; } + + m_filteredFiles.push_back(&f); + } + + if (!sawSelection) { + select(nullptr); } } std::size_t ImagesTab::fileCount() const { - if (m_filter.empty()) { - return m_files.size(); - } else { + if (needsFiltering()) { return m_filteredFiles.size(); + } else { + return m_files.size(); } } const ImagesTab::File* ImagesTab::getFile(std::size_t i) const { - if (m_filter.empty()) { - if (i >= m_files.size()) { + if (needsFiltering()) { + if (i >= m_filteredFiles.size()) { return nullptr; } - return &m_files[i]; + return m_filteredFiles[i]; } else { - if (i >= m_filteredFiles.size()) { + if (i >= m_files.size()) { return nullptr; } - return m_filteredFiles[i]; + return &m_files[i]; } } @@ -111,14 +150,34 @@ ImagesTab::File* ImagesTab::getFile(std::size_t i) return const_cast<File*>(std::as_const(*this).getFile(i)); } +bool ImagesTab::needsFiltering() const +{ + if (!m_filter.empty()) { + return true; + } + + if (!m_ddsEnabled) { + return true; + } + + return false; +} + void ImagesTab::getSupportedFormats() { + m_ddsAvailable = false; + for (const auto& entry : QImageReader::supportedImageFormats()) { QString s(entry); if (s.isNull() || s.isEmpty()) { continue; } + // used to enable the checkbox + if (s.compare("dds", Qt::CaseInsensitive) == 0) { + m_ddsAvailable = true; + } + // make sure it starts with a dot if (s[0] != ".") { s = "." + s; @@ -337,6 +396,15 @@ void ImagesTab::onExplore() MOBase::shell::ExploreFile(m_selection->path); } +void ImagesTab::onShowDDS() +{ + const auto b = ui->imagesShowDDS->isChecked(); + if (b != m_ddsEnabled) { + m_ddsEnabled = b; + update(); + } +} + void ImagesTab::onFilterChanged() { update(); diff --git a/src/modinfodialogimages.h b/src/modinfodialogimages.h index bd404801..fa7115b0 100644 --- a/src/modinfodialogimages.h +++ b/src/modinfodialogimages.h @@ -79,6 +79,8 @@ public: void clear() override; bool feedFile(const QString& rootPath, const QString& fullPath) override; void update() override; + void saveState(Settings& s) override; + void restoreState(const Settings& s) override; private: struct File @@ -112,15 +114,19 @@ private: int m_margins, m_padding, m_border; const File* m_selection; FilterWidget m_filter; + bool m_ddsAvailable, m_ddsEnabled; void getSupportedFormats(); + void enableDDS(bool b); void select(const File* file); + bool needsFiltering() const; void scrollAreaResized(const QSize& s); void paintThumbnails(QPaintEvent* e); void thumbnailsMouseEvent(QMouseEvent* e); void showTooltip(QHelpEvent* e); void onExplore(); + void onShowDDS(); void onFilterChanged(); int calcThumbSize(int availableWidth) const; |
