diff --git a/qrenderdoc/Widgets/ResourcePreview.cpp b/qrenderdoc/Widgets/ResourcePreview.cpp index 232bd3654..ebb81251a 100644 --- a/qrenderdoc/Widgets/ResourcePreview.cpp +++ b/qrenderdoc/Widgets/ResourcePreview.cpp @@ -10,3 +10,11 @@ ResourcePreview::~ResourcePreview() { delete ui; } + +void ResourcePreview::SetSize(QSize s) +{ + setFixedWidth(s.width()); + setFixedHeight(s.height()); + setMinimumSize(s); + setMaximumSize(s); +} diff --git a/qrenderdoc/Widgets/ResourcePreview.h b/qrenderdoc/Widgets/ResourcePreview.h index c2a79de3c..19130d220 100644 --- a/qrenderdoc/Widgets/ResourcePreview.h +++ b/qrenderdoc/Widgets/ResourcePreview.h @@ -16,8 +16,21 @@ public: explicit ResourcePreview(QWidget *parent = 0); ~ResourcePreview(); + void setActive(bool b) + { + m_Active = b; + if(b) + show(); + else + hide(); + } + bool isActive() { return m_Active; } + void SetSize(QSize s); + private: Ui::ResourcePreview *ui; + + bool m_Active; }; #endif // RESOURCEPREVIEW_H diff --git a/qrenderdoc/Widgets/ThumbnailStrip.cpp b/qrenderdoc/Widgets/ThumbnailStrip.cpp new file mode 100644 index 000000000..d66c39d4b --- /dev/null +++ b/qrenderdoc/Widgets/ThumbnailStrip.cpp @@ -0,0 +1,147 @@ +#include "ThumbnailStrip.h" +#include +#include +#include "Widgets/ResourcePreview.h" +#include "ui_ThumbnailStrip.h" + +ThumbnailStrip::ThumbnailStrip(QWidget *parent) : QWidget(parent), ui(new Ui::ThumbnailStrip) +{ + ui->setupUi(this); + + layout = new QVBoxLayout(ui->scrollAreaWidgetContents); + layout->setSpacing(6); + layout->setContentsMargins(6, 6, 6, 6); + layout->setAlignment(Qt::AlignTop); +} + +ThumbnailStrip::~ThumbnailStrip() +{ + delete layout; + delete ui; +} + +void ThumbnailStrip::AddPreview(ResourcePreview *prev) +{ + layout->addWidget(prev); + m_Thumbnails.push_back(prev); +} + +void ThumbnailStrip::ClearThumbnails() +{ + for(ResourcePreview *p : m_Thumbnails) + { + layout->removeWidget(p); + delete p; + } + + m_Thumbnails.clear(); +} + +void ThumbnailStrip::resizeEvent(QResizeEvent *event) +{ + RefreshLayout(); +} + +void ThumbnailStrip::mousePressEvent(QMouseEvent *event) +{ + emit(mouseClick(event)); +} + +void ThumbnailStrip::RefreshLayout() +{ + QRect avail = geometry(); + avail.adjust(6, 6, -6, -6); + + int numActive = 0; + for(ResourcePreview *c : m_Thumbnails) + if(c->isActive()) + numActive++; + + // depending on overall aspect ratio, we either lay out the strip horizontally or + // vertically. This tries to account for whether the strip is docked along one side + // or another of the texture viewer + if(avail.width() > avail.height()) + { + avail.setWidth(avail.width() + 6); // controls implicitly have a 6 margin on the right + + int aspectWidth = (int)((float)avail.height() * 1.3f); + + ui->scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + + delete layout; + layout = new QHBoxLayout(ui->scrollAreaWidgetContents); + for(ResourcePreview *w : m_Thumbnails) + layout->addWidget(w); + layout->setSpacing(6); + layout->setContentsMargins(6, 6, 6, 6); + layout->setAlignment(Qt::AlignTop); + + int noscrollWidth = numActive * (aspectWidth + 20); + + if(noscrollWidth <= avail.width()) + { + ui->scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + + for(ResourcePreview *c : m_Thumbnails) + c->SetSize(QSize(aspectWidth, avail.height())); + } + else + { + ui->scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn); + + QScrollBar *hs = ui->scrollArea->horizontalScrollBar(); + + avail.setHeight(avail.height() - hs->geometry().height()); + + aspectWidth = (int)((float)avail.height() * 1.3f); + + int totalWidth = numActive * (aspectWidth + 20); + hs->setEnabled(totalWidth > avail.width()); + + for(ResourcePreview *c : m_Thumbnails) + c->SetSize(QSize(aspectWidth, avail.height())); + } + } + else + { + avail.setHeight(avail.height() + 6); // controls implicitly have a 6 margin on the bottom + + int aspectHeight = (int)((float)avail.width() / 1.3f); + + ui->scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + + delete layout; + layout = new QVBoxLayout(ui->scrollAreaWidgetContents); + for(ResourcePreview *w : m_Thumbnails) + layout->addWidget(w); + layout->setSpacing(6); + layout->setContentsMargins(6, 6, 6, 6); + layout->setAlignment(Qt::AlignTop); + + int noscrollHeight = numActive * (aspectHeight + 6); + + if(noscrollHeight <= avail.height()) + { + ui->scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + + for(ResourcePreview *c : m_Thumbnails) + c->SetSize(QSize(avail.width(), aspectHeight)); + } + else + { + ui->scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); + + QScrollBar *vs = ui->scrollArea->verticalScrollBar(); + + avail.setWidth(avail.width() - vs->geometry().width()); + + aspectHeight = (int)((float)avail.width() / 1.3f); + + int totalHeight = numActive * (aspectHeight + 6); + vs->setEnabled(totalHeight > avail.height()); + + for(ResourcePreview *c : m_Thumbnails) + c->SetSize(QSize(avail.width(), aspectHeight)); + } + } +} \ No newline at end of file diff --git a/qrenderdoc/Widgets/ThumbnailStrip.h b/qrenderdoc/Widgets/ThumbnailStrip.h new file mode 100644 index 000000000..a8f55dc80 --- /dev/null +++ b/qrenderdoc/Widgets/ThumbnailStrip.h @@ -0,0 +1,42 @@ +#ifndef THUMBNAILSTRIP_H +#define THUMBNAILSTRIP_H + +#include + +namespace Ui +{ +class ThumbnailStrip; +} + +class ResourcePreview; +class QBoxLayout; + +class ThumbnailStrip : public QWidget +{ + Q_OBJECT + +public: + explicit ThumbnailStrip(QWidget *parent = 0); + ~ThumbnailStrip(); + + void AddPreview(ResourcePreview *prev); + + void ClearThumbnails(); + const QVector &GetThumbs() { return m_Thumbnails; } + void RefreshLayout(); + +signals: + void mouseClick(QMouseEvent *event); + +private: + void resizeEvent(QResizeEvent *event) override; + void mousePressEvent(QMouseEvent *event) override; + + QVector m_Thumbnails; + + QBoxLayout *layout; + + Ui::ThumbnailStrip *ui; +}; + +#endif // THUMBNAILSTRIP_H diff --git a/qrenderdoc/Widgets/ThumbnailStrip.ui b/qrenderdoc/Widgets/ThumbnailStrip.ui new file mode 100644 index 000000000..15c3f9b18 --- /dev/null +++ b/qrenderdoc/Widgets/ThumbnailStrip.ui @@ -0,0 +1,74 @@ + + + ThumbnailStrip + + + + 0 + 0 + 159 + 440 + + + + + 0 + 0 + + + + + 0 + 0 + + + + Form + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + QFrame::NoFrame + + + Qt::ScrollBarAsNeeded + + + true + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + + + 0 + 0 + 159 + 440 + + + + + + + + + + diff --git a/qrenderdoc/Windows/TextureViewer.ui b/qrenderdoc/Windows/TextureViewer.ui index 3471ec80f..d54d6384b 100644 --- a/qrenderdoc/Windows/TextureViewer.ui +++ b/qrenderdoc/Windows/TextureViewer.ui @@ -1066,86 +1066,25 @@ - + - 430 - 460 - 121 - 81 - - - - QFrame::Panel - - - QFrame::Plain - - - Qt::ScrollBarAlwaysOff - - - true - - - - - 0 - 0 - 119 - 79 - - - - - 10 - - - 5 - - - 5 - - - 5 - - - 5 - - - - - - - - 290 + 300 460 120 80 - - QFrame::Panel + + + + + 440 + 460 + 120 + 80 + - - QFrame::Plain - - - Qt::ScrollBarAlwaysOff - - - true - - - - - 0 - 0 - 118 - 78 - - - @@ -1159,6 +1098,12 @@ QWidget
ToolWindowManager.h
+ + ThumbnailStrip + QWidget +
Widgets/ThumbnailStrip.h
+ 1 +
diff --git a/qrenderdoc/qrenderdoc.pro b/qrenderdoc/qrenderdoc.pro index cf011818d..7c79172cb 100644 --- a/qrenderdoc/qrenderdoc.pro +++ b/qrenderdoc/qrenderdoc.pro @@ -93,7 +93,8 @@ SOURCES += Code/main.cpp \ Widgets/RDLineEdit.cpp \ 3rdparty/flowlayout/FlowLayout.cpp \ Widgets/ResourcePreview.cpp \ - Widgets/RDLabel.cpp + Widgets/RDLabel.cpp \ + Widgets/ThumbnailStrip.cpp HEADERS += Windows/MainWindow.h \ Windows/EventBrowser.h \ @@ -108,13 +109,15 @@ HEADERS += Windows/MainWindow.h \ Widgets/RDLineEdit.h \ 3rdparty/flowlayout/FlowLayout.h \ Widgets/ResourcePreview.h \ - Widgets/RDLabel.h + Widgets/RDLabel.h \ + Widgets/ThumbnailStrip.h FORMS += Windows/MainWindow.ui \ Windows/EventBrowser.ui \ Windows/TextureViewer.ui \ Windows/AboutDialog.ui \ - Widgets/ResourcePreview.ui + Widgets/ResourcePreview.ui \ + Widgets/ThumbnailStrip.ui RESOURCES += \ resources.qrc diff --git a/qrenderdoc/qrenderdoc_local.vcxproj b/qrenderdoc/qrenderdoc_local.vcxproj index 0e55e67ac..e89b44d1f 100644 --- a/qrenderdoc/qrenderdoc_local.vcxproj +++ b/qrenderdoc/qrenderdoc_local.vcxproj @@ -285,12 +285,14 @@ + - + + @@ -319,8 +321,10 @@ - + + + @@ -336,6 +340,7 @@ + diff --git a/qrenderdoc/qrenderdoc_local.vcxproj.filters b/qrenderdoc/qrenderdoc_local.vcxproj.filters index a9aa5ba2f..e22b0a2d2 100644 --- a/qrenderdoc/qrenderdoc_local.vcxproj.filters +++ b/qrenderdoc/qrenderdoc_local.vcxproj.filters @@ -1,11 +1,6 @@  - - {99349809-55BA-4b9d-BF79-8FDBB0286EB3} - ui - false - {71ED8ED8-ACB9-4CE9-BBE1-E00B30144E11} cpp;c;cxx;moc;h;def;odl;idl;res; @@ -14,24 +9,6 @@ {71ED8ED8-ACB9-4CE9-BBE1-E00B30144E11} cpp;c;cxx;moc;h;def;odl;idl;res; - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - - - {D9D6E242-F8AF-46E4-B9FD-80ECBC20BA3E} - qrc;* - false - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {99349809-55BA-4b9d-BF79-8FDBB0286EB3} - ui - false - {D9D6E242-F8AF-46E4-B9FD-80ECBC20BA3E} qrc;* @@ -147,6 +124,12 @@ Generated Files + + Widgets + + + Generated Files + @@ -188,11 +171,17 @@ Widgets + + Widgets + + + Widgets + Generated Files - - Widgets + + Generated Files @@ -392,6 +381,9 @@ Widgets + + Widgets +