summaryrefslogtreecommitdiff
path: root/src/modinfodialogimages.h
diff options
context:
space:
mode:
authorisanae <14251494+isanae@users.noreply.github.com>2019-06-27 10:27:02 -0400
committerisanae <14251494+isanae@users.noreply.github.com>2019-07-02 10:10:19 -0400
commit1c0024b2feda8b5c152d2e211205601ee807e517 (patch)
tree41c54eea23eb434c8dfd94ceb4fd6a81d8a6dec0 /src/modinfodialogimages.h
parent933a2c7d1086ebc87ee2d214deaa3752ea8c6cf1 (diff)
moved all images classes into a namespace with shorter names
split theme and metrics into their own class added filename to thumbs
Diffstat (limited to 'src/modinfodialogimages.h')
-rw-r--r--src/modinfodialogimages.h251
1 files changed, 144 insertions, 107 deletions
diff --git a/src/modinfodialogimages.h b/src/modinfodialogimages.h
index 5ce66d5d..0d34b46a 100644
--- a/src/modinfodialogimages.h
+++ b/src/modinfodialogimages.h
@@ -7,10 +7,15 @@
class ImagesTab;
+namespace ImagesTabHelpers
+{
+
+static constexpr std::size_t BadIndex = std::numeric_limits<std::size_t>::max();
+
// vertical scrollbar, this is only to handle wheel events to scroll by one
// instead of the system's scroll setting
//
-class ImagesScrollbar : public QScrollBar
+class Scrollbar : public QScrollBar
{
public:
using QScrollBar::QScrollBar;
@@ -29,7 +34,7 @@ private:
// widget inside the scroller, calls ImagesTab::paintThumbnailArea() when
// needed and also forwards mouse clicks and tooltip events
//
-class ImagesThumbnails : public QWidget
+class ThumbnailsWidget : public QWidget
{
Q_OBJECT;
@@ -101,15 +106,47 @@ private:
};
+struct Theme
+{
+ QColor borderColor, backgroundColor, textColor;
+ QColor highlightBackgroundColor, highlightTextColor;
+ QFont font;
+};
+
+
+struct Metrics
+{
+ // space outside the thumbnail border
+ int margins;
+
+ // size of the border
+ int border;
+
+ // space between the border and the image
+ int padding;
+
+ // spacing between the thumbnail and the text
+ int textSpacing;
+
+ // height of the text
+ int textHeight;
+
+ // spacing between thumbnails
+ int spacing;
+
+ Metrics();
+};
+
+
// handles all the geometry calculations by ImagesTab for painting or handling
// mouse clicks
//
// a thumbnail looks like this:
//
-// +-----------------------+ <-- thumb rect
+// +-----------------------+ <--- thumb rect
// | margins |
// | |
-// | +-border--------+ <------ border rect
+// | +-border--------+ <------- border rect
// | | padding | |
// | | | |
// | | +-------+ <----------- image rect
@@ -119,6 +156,10 @@ private:
// | | +-------+ | |
// | | | |
// | +---------------+ |
+// | text spacing |
+// | +---------------+ <------- text rect
+// | | text | |
+// | +---------------+ |
// | |
// +-----------------------+
//
@@ -130,15 +171,10 @@ private:
// ....
//
//
-class ImagesGeometry
+class Geometry
{
public:
- // returned by indexAt() if the point is outside any possible thumbnail
- static constexpr std::size_t BadIndex =
- std::numeric_limits<std::size_t>::max();
-
- ImagesGeometry(
- const QSize& widgetSize, int margins, int border, int padding, int spacing);
+ Geometry(QSize widgetSize, Metrics metrics);
// returns the number of images fully visible in the widget
//
@@ -156,9 +192,20 @@ public:
//
QRect imageRect(std::size_t i) const;
+ // rectangle of the text for the given thumbnail
+ //
+ QRect textRect(std::size_t i) const;
+
+ // rectangle that responds to selection: includes the border and extends down
+ // to the text
+ //
+ QRect selectionRect(std::size_t i) const;
+
// returns the index of the image at the given point; this does not take into
// account any scrolling, the image at the top of widget is always 0
//
+ // returns BadIndex if there's no thumbnail at this point
+ //
std::size_t indexAt(const QPoint& p) const;
// returns the size of the image that fits in imageRect() while keeping the
@@ -166,25 +213,12 @@ public:
//
QSize scaledImageSize(const QSize& originalSize) const;
- // dumps stuff to qDebug()
- //
- void dump() const;
-
private:
// size of the widget containing all the thumbnails
const QSize m_widgetSize;
- // space outside the thumbnail border
- const int m_margins;
-
- // size of the border
- const int m_border;
-
- // space between the border and the image
- const int m_padding;
-
- // spacing between thumbnails
- const int m_spacing;
+ // metrics
+ const Metrics m_metrics;
// rectangle of the first thumbnail on top
const QRect m_topRect;
@@ -196,112 +230,116 @@ private:
};
-class ImagesTab : public ModInfoDialogTab
+class File
{
- Q_OBJECT;
- friend class ImagesScrollbar;
- friend class ImagesThumbnails;
-
public:
- ImagesTab(
- OrganizerCore& oc, PluginContainer& plugin,
- QWidget* parent, Ui::ModInfoDialog* ui, int id);
+ File(QString path);
- 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;
+ void ensureOriginalLoaded();
+
+ const QString& path() const;
+ const QString& filename() const;
+ const QImage& original() const;
+ const QImage& thumbnail() const;
+ bool failed() const;
+
+ void loadIfNeeded(const Geometry& geo);
private:
- static constexpr std::size_t BadIndex =
- std::numeric_limits<std::size_t>::max();
+ QString m_path;
+ mutable QString m_filename;
+ QImage m_original, m_thumbnail;
+ bool m_failed;
+
+ bool needsLoad(const Geometry& geo) const;
+ void load(const Geometry& geo);
+};
+
+
+class Files
+{
+public:
+ Files();
+
+ void clear();
- struct File
- {
- QString path;
- QImage original, thumbnail;
- bool failed = false;
+ void add(File f);
+ void addFiltered(File* f);
- File(QString path)
- : path(std::move(path))
- {
- }
+ bool empty() const;
+ std::size_t size() const;
- void ensureOriginalLoaded()
- {
- if (original.isNull()) {
- if (!original.load(path)) {
- qCritical() << "failed to load image from " << path;
- failed = true;
- }
- }
- }
- };
+ void switchToAll();
+ void switchToFiltered();
- struct Colors
- {
- QColor border, background, selection;
- };
+ const File* get(std::size_t i) const;
+ File* get(std::size_t i);
+ std::size_t indexOf(const File* f) const;
- struct PaintContext
- {
- mutable QPainter painter;
- ImagesGeometry geo;
- File* file;
- std::size_t thumbIndex;
- std::size_t fileIndex;
+ const File* selectedFile() const;
+ File* selectedFile();
+ std::size_t selectedIndex() const;
+ void select(std::size_t i);
- PaintContext(QWidget* w, ImagesGeometry geo)
- : painter(w), geo(geo), file(nullptr), thumbIndex(0), fileIndex(0)
- {
- }
- };
+ std::vector<File>& allFiles();
- class Files
- {
- public:
- Files();
+ bool isFiltered() const;
- void clear();
+private:
+ std::vector<File> m_allFiles;
+ std::vector<File*> m_filteredFiles;
+ std::size_t m_selection;
+ bool m_filtered;
+};
- void add(File f);
- void addFiltered(File* f);
- bool empty() const;
- std::size_t size() const;
+struct PaintContext
+{
+ mutable QPainter painter;
+ Geometry geo;
+ File* file;
+ std::size_t thumbIndex;
+ std::size_t fileIndex;
- void switchToAll();
- void switchToFiltered();
+ PaintContext(QWidget* w, Geometry geo);
+};
- const File* get(std::size_t i) const;
- File* get(std::size_t i);
- std::size_t indexOf(const File* f) const;
+} // namespace
- const File* selectedFile() const;
- File* selectedFile();
- std::size_t selectedIndex() const;
- void select(std::size_t i);
- std::vector<File>& allFiles();
+class ImagesTab : public ModInfoDialogTab
+{
+ Q_OBJECT;
+ friend class ImagesTabHelpers::Scrollbar;
+ friend class ImagesTabHelpers::ThumbnailsWidget;
- bool isFiltered() const;
+public:
+ ImagesTab(
+ OrganizerCore& oc, PluginContainer& plugin,
+ QWidget* parent, Ui::ModInfoDialog* ui, int id);
- private:
- std::vector<File> m_allFiles;
- std::vector<File*> m_filteredFiles;
- std::size_t m_selection;
- bool m_filtered;
- };
+ 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:
+ using ScalableImage = ImagesTabHelpers::ScalableImage;
+ using Files = ImagesTabHelpers::Files;
+ using File = ImagesTabHelpers::File;
+ using Theme = ImagesTabHelpers::Theme;
+ using Metrics = ImagesTabHelpers::Metrics;
+ using PaintContext = ImagesTabHelpers::PaintContext;
+ using Geometry = ImagesTabHelpers::Geometry;
ScalableImage* m_image;
std::vector<QString> m_supportedFormats;
Files m_files;
- int m_margins, m_border, m_padding, m_spacing;
FilterWidget m_filter;
bool m_ddsAvailable, m_ddsEnabled;
- Colors m_colors;
+ Theme m_theme;
+ Metrics m_metrics;
void getSupportedFormats();
void enableDDS(bool b);
@@ -325,18 +363,17 @@ private:
std::size_t fileIndexAtPos(const QPoint& p) const;
const File* fileAtPos(const QPoint& p) const;
- ImagesGeometry makeGeometry() const;
+ Geometry makeGeometry() const;
void paintThumbnail(const PaintContext& cx);
void paintThumbnailBackground(const PaintContext& cx);
void paintThumbnailBorder(const PaintContext& cx);
void paintThumbnailImage(const PaintContext& cx);
+ void paintThumbnailText(const PaintContext& cx);
void checkFiltering();
void switchToAll();
void switchToFiltered();
- bool needsReload(const ImagesGeometry& geo, const File& file) const;
- void reload(const ImagesGeometry& geo, File& file);
void updateScrollbar();
};