-
Notifications
You must be signed in to change notification settings - Fork 13
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
10 changed files
with
293 additions
and
9 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,136 @@ | ||
// Copyright (C) 2016 The Qt Company Ltd. | ||
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause | ||
|
||
#include <QtWidgets> | ||
|
||
#include "flowlayout.h" | ||
|
||
FlowLayout::FlowLayout(QWidget *parent, int margin, int hSpacing, int vSpacing) | ||
: QLayout(parent), m_hSpace(hSpacing), m_vSpace(vSpacing) { | ||
setContentsMargins(margin, margin, margin, margin); | ||
} | ||
|
||
FlowLayout::FlowLayout(int margin, int hSpacing, int vSpacing) | ||
: m_hSpace(hSpacing), m_vSpace(vSpacing) { | ||
setContentsMargins(margin, margin, margin, margin); | ||
} | ||
|
||
FlowLayout::~FlowLayout() { | ||
QLayoutItem *item; | ||
while ((item = takeAt(0))) | ||
delete item; | ||
} | ||
|
||
void FlowLayout::addItem(QLayoutItem *item) { | ||
itemList.append(item); | ||
} | ||
|
||
int FlowLayout::horizontalSpacing() const { | ||
if (m_hSpace >= 0) { | ||
return m_hSpace; | ||
} else { | ||
return smartSpacing(QStyle::PM_LayoutHorizontalSpacing); | ||
} | ||
} | ||
|
||
int FlowLayout::verticalSpacing() const { | ||
if (m_vSpace >= 0) { | ||
return m_vSpace; | ||
} else { | ||
return smartSpacing(QStyle::PM_LayoutVerticalSpacing); | ||
} | ||
} | ||
|
||
int FlowLayout::count() const { | ||
return itemList.size(); | ||
} | ||
|
||
QLayoutItem *FlowLayout::itemAt(int index) const { | ||
return itemList.value(index); | ||
} | ||
|
||
QLayoutItem *FlowLayout::takeAt(int index) { | ||
if (index >= 0 && index < itemList.size()) | ||
return itemList.takeAt(index); | ||
return nullptr; | ||
} | ||
|
||
Qt::Orientations FlowLayout::expandingDirections() const { | ||
return { }; | ||
} | ||
|
||
bool FlowLayout::hasHeightForWidth() const { | ||
return true; | ||
} | ||
|
||
int FlowLayout::heightForWidth(int width) const { | ||
int height = doLayout(QRect(0, 0, width, 0), true); | ||
return height; | ||
} | ||
|
||
void FlowLayout::setGeometry(const QRect &rect) { | ||
QLayout::setGeometry(rect); | ||
doLayout(rect, false); | ||
} | ||
|
||
QSize FlowLayout::sizeHint() const { | ||
return minimumSize(); | ||
} | ||
|
||
QSize FlowLayout::minimumSize() const { | ||
QSize size; | ||
for (const QLayoutItem *item : itemList) | ||
size = size.expandedTo(item->minimumSize()); | ||
|
||
const QMargins margins = contentsMargins(); | ||
size += QSize(margins.left() + margins.right(), margins.top() + margins.bottom()); | ||
return size; | ||
} | ||
|
||
int FlowLayout::doLayout(const QRect &rect, bool testOnly) const { | ||
int left, top, right, bottom; | ||
getContentsMargins(&left, &top, &right, &bottom); | ||
QRect effectiveRect = rect.adjusted(+left, +top, -right, -bottom); | ||
int x = effectiveRect.x(); | ||
int y = effectiveRect.y(); | ||
int lineHeight = 0; | ||
|
||
for (QLayoutItem *item : itemList) { | ||
const QWidget *wid = item->widget(); | ||
int spaceX = horizontalSpacing(); | ||
if (spaceX == -1) | ||
spaceX = wid->style()->layoutSpacing( | ||
QSizePolicy::PushButton, QSizePolicy::PushButton, Qt::Horizontal); | ||
int spaceY = verticalSpacing(); | ||
if (spaceY == -1) | ||
spaceY = wid->style()->layoutSpacing( | ||
QSizePolicy::PushButton, QSizePolicy::PushButton, Qt::Vertical); | ||
|
||
int nextX = x + item->sizeHint().width() + spaceX; | ||
if (nextX - spaceX > effectiveRect.right() && lineHeight > 0) { | ||
x = effectiveRect.x(); | ||
y = y + lineHeight + spaceY; | ||
nextX = x + item->sizeHint().width() + spaceX; | ||
lineHeight = 0; | ||
} | ||
|
||
if (!testOnly) | ||
item->setGeometry(QRect(QPoint(x, y), item->sizeHint())); | ||
|
||
x = nextX; | ||
lineHeight = qMax(lineHeight, item->sizeHint().height()); | ||
} | ||
return y + lineHeight - rect.y() + bottom; | ||
} | ||
|
||
int FlowLayout::smartSpacing(QStyle::PixelMetric pm) const { | ||
QObject *parent = this->parent(); | ||
if (!parent) { | ||
return -1; | ||
} else if (parent->isWidgetType()) { | ||
QWidget *pw = static_cast<QWidget *>(parent); | ||
return pw->style()->pixelMetric(pm, nullptr, pw); | ||
} else { | ||
return static_cast<QLayout *>(parent)->spacing(); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
// Copyright (C) 2016 The Qt Company Ltd. | ||
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause | ||
|
||
#ifndef FLOWLAYOUT_H | ||
#define FLOWLAYOUT_H | ||
|
||
#include <QLayout> | ||
#include <QRect> | ||
#include <QStyle> | ||
|
||
class FlowLayout : public QLayout | ||
{ | ||
public: | ||
explicit FlowLayout(QWidget *parent, int margin = -1, int hSpacing = -1, int vSpacing = -1); | ||
explicit FlowLayout(int margin = -1, int hSpacing = -1, int vSpacing = -1); | ||
~FlowLayout(); | ||
|
||
void addItem(QLayoutItem *item) override; | ||
int horizontalSpacing() const; | ||
int verticalSpacing() const; | ||
Qt::Orientations expandingDirections() const override; | ||
bool hasHeightForWidth() const override; | ||
int heightForWidth(int) const override; | ||
int count() const override; | ||
QLayoutItem *itemAt(int index) const override; | ||
QSize minimumSize() const override; | ||
void setGeometry(const QRect &rect) override; | ||
QSize sizeHint() const override; | ||
QLayoutItem *takeAt(int index) override; | ||
|
||
private: | ||
int doLayout(const QRect &rect, bool testOnly) const; | ||
int smartSpacing(QStyle::PixelMetric pm) const; | ||
|
||
QList<QLayoutItem *> itemList; | ||
int m_hSpace; | ||
int m_vSpace; | ||
}; | ||
|
||
|
||
#endif // FLOWLAYOUT_H |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
#include "imagegrid.h" | ||
#include "relightapp.h" | ||
#include "flowlayout.h" | ||
|
||
#include <QLabel> | ||
#include <QLabel> | ||
#include <QVBoxLayout> | ||
#include <QHBoxLayout> | ||
#include <QCheckBox> | ||
|
||
|
||
ImageThumb::ImageThumb(const QString& imagePath, const QString& text, QWidget* parent): QWidget(parent) { | ||
|
||
QVBoxLayout* layout = new QVBoxLayout(this); | ||
|
||
QLabel* thumb = new QLabel; | ||
QImage img(imagePath); | ||
img = img.scaledToHeight(256); | ||
thumb->setPixmap(QPixmap::fromImage(img)); | ||
layout->addWidget(thumb); | ||
|
||
QCheckBox *checkbox = new QCheckBox(text); | ||
layout->addWidget(checkbox); | ||
|
||
layout->setSpacing(5); | ||
layout->setContentsMargins(5, 5, 5, 5); | ||
} | ||
|
||
ImageGrid::ImageGrid(QWidget *parent): QScrollArea(parent) { | ||
|
||
flowlayout = new FlowLayout(); | ||
setWidgetResizable(true); | ||
setWidget(new QWidget); | ||
widget()->setLayout(flowlayout); | ||
setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); | ||
} | ||
|
||
void ImageGrid::init() { | ||
Project &project = qRelightApp->project(); | ||
|
||
for(Image &img: project.images) { | ||
QFileInfo info(img.filename); | ||
ImageThumb *thumb = new ImageThumb(img.filename, info.fileName()); | ||
flowlayout->addWidget(thumb); | ||
} | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
#ifndef IMAGEGRID_H | ||
#define IMAGEGRID_H | ||
|
||
#include<QScrollArea> | ||
#include <QWidget> | ||
|
||
|
||
class FlowLayout; | ||
|
||
|
||
class ImageThumb : public QWidget { | ||
public: | ||
ImageThumb(const QString& imagePath, const QString& text, QWidget* parent = nullptr); | ||
}; | ||
|
||
|
||
class ImageGrid: public QScrollArea { | ||
public: | ||
ImageGrid(QWidget *parent = nullptr); | ||
|
||
void init(); | ||
private: | ||
FlowLayout *flowlayout = nullptr; | ||
}; | ||
|
||
#endif // IMAGEGRID_H |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.