Add metallic and roughness settings for part
Part deform painter got removed. Experiment color painter introduced, but not enabled yet.master
|
@ -1346,3 +1346,21 @@ https://www.reddit.com/r/gamedev/comments/5iuf3h/i_am_writting_a_3d_monster_mode
|
|||
**
|
||||
****************************************************************************/
|
||||
</pre>
|
||||
|
||||
<h1>Qt-Color-Widgets</h1>
|
||||
<pre>
|
||||
Linking this library statically or dynamically with other modules is making a
|
||||
combined work based on this library. Thus, the terms and conditions of the
|
||||
GNU Lesser General Public License version 3 cover the whole combination.
|
||||
|
||||
As a special exception, the copyright holders of this library give you
|
||||
permission to combine this library with independent
|
||||
modules to produce an executable, and to copy and distribute the resulting
|
||||
executable under terms of any of the GNU General Public licenses, as published
|
||||
by the Free Software Foundation, provided that you also meet,
|
||||
for each linked independent module, the terms and conditions of the license of
|
||||
that module. An independent module is a module which is not derived from or
|
||||
based on this library. If you modify this library, you may extend this
|
||||
exception to your version of the library, but you are not obliged to do so.
|
||||
If you do not wish to do so, delete this exception statement from your version.
|
||||
</pre>
|
||||
|
|
|
@ -132,6 +132,7 @@ DEFINES += NOMINMAX
|
|||
|
||||
include(thirdparty/QtAwesome/QtAwesome/QtAwesome.pri)
|
||||
include(thirdparty/qtsingleapplication/src/qtsingleapplication.pri)
|
||||
include(thirdparty/Qt-Color-Widgets/color_widgets.pri)
|
||||
|
||||
INCLUDEPATH += src
|
||||
|
||||
|
@ -443,8 +444,11 @@ HEADERS += src/intnumberwidget.h
|
|||
SOURCES += src/imagepreviewwidget.cpp
|
||||
HEADERS += src/imagepreviewwidget.h
|
||||
|
||||
SOURCES += src/mousepicker.cpp
|
||||
HEADERS += src/mousepicker.h
|
||||
SOURCES += src/vertexcolorpainter.cpp
|
||||
HEADERS += src/vertexcolorpainter.h
|
||||
|
||||
SOURCES += src/voxelgrid.cpp
|
||||
HEADERS += src/voxelgrid.h
|
||||
|
||||
SOURCES += src/paintmode.cpp
|
||||
HEADERS += src/paintmode.h
|
||||
|
|
|
@ -573,16 +573,16 @@ void main()
|
|||
lights[0].type = TYPE_POINT;
|
||||
lights[0].position = firstLightPos;
|
||||
lights[0].color = vec3(1.0, 1.0, 1.0);
|
||||
lights[0].intensity = 3.0;
|
||||
lights[0].constantAttenuation = 0.0;
|
||||
lights[0].intensity = 1.0;
|
||||
lights[0].constantAttenuation = 1.0;
|
||||
lights[0].linearAttenuation = 0.0;
|
||||
lights[0].quadraticAttenuation = 0.0;
|
||||
lights[0].quadraticAttenuation = 0.0025;
|
||||
|
||||
// Fill light
|
||||
lights[1].type = TYPE_POINT;
|
||||
lights[1].position = secondLightPos;
|
||||
lights[1].color = vec3(1.0, 1.0, 1.0);
|
||||
lights[1].intensity = 1.0;
|
||||
lights[1].intensity = 0.1;
|
||||
lights[1].constantAttenuation = 0.0;
|
||||
lights[1].linearAttenuation = 0.0;
|
||||
lights[1].quadraticAttenuation = 0.0;
|
||||
|
@ -591,7 +591,7 @@ void main()
|
|||
lights[2].type = TYPE_POINT;
|
||||
lights[2].position = thirdLightPos;
|
||||
lights[2].color = vec3(1.0, 1.0, 1.0);
|
||||
lights[2].intensity = 0.5;
|
||||
lights[2].intensity = 0.05;
|
||||
lights[2].constantAttenuation = 0.0;
|
||||
lights[2].linearAttenuation = 0.0;
|
||||
lights[2].quadraticAttenuation = 0.0;
|
||||
|
@ -635,8 +635,8 @@ void main()
|
|||
ambientOcclusion = texture(metalnessRoughnessAmbientOcclusionMapId, vertTexCoord).r;
|
||||
}
|
||||
|
||||
roughness = min(0.99, roughness);
|
||||
if (environmentIrradianceMapEnabled != 1) {
|
||||
roughness = min(0.99, roughness);
|
||||
metalness = min(0.99, metalness);
|
||||
}
|
||||
|
||||
|
|
132
src/document.cpp
|
@ -17,7 +17,6 @@
|
|||
#include "motionsgenerator.h"
|
||||
#include "skeletonside.h"
|
||||
#include "scriptrunner.h"
|
||||
#include "mousepicker.h"
|
||||
#include "imageforever.h"
|
||||
#include "contourtopartconverter.h"
|
||||
|
||||
|
@ -41,10 +40,12 @@ Document::Document() :
|
|||
rigType(RigType::None),
|
||||
weldEnabled(true),
|
||||
polyCount(PolyCount::Original),
|
||||
brushColor(Qt::white),
|
||||
// private
|
||||
m_isResultMeshObsolete(false),
|
||||
m_meshGenerator(nullptr),
|
||||
m_resultMesh(nullptr),
|
||||
m_paintedMesh(nullptr),
|
||||
m_resultMeshCutFaceTransforms(nullptr),
|
||||
m_resultMeshNodesCutFaces(nullptr),
|
||||
m_isMeshGenerationSucceed(true),
|
||||
|
@ -73,11 +74,12 @@ Document::Document() :
|
|||
m_nextMeshGenerationId(1),
|
||||
m_scriptRunner(nullptr),
|
||||
m_isScriptResultObsolete(false),
|
||||
m_mousePicker(nullptr),
|
||||
m_vertexColorPainter(nullptr),
|
||||
m_isMouseTargetResultObsolete(false),
|
||||
m_paintMode(PaintMode::None),
|
||||
m_mousePickRadius(0.2),
|
||||
m_saveNextPaintSnapshot(false)
|
||||
m_mousePickRadius(0.05),
|
||||
m_saveNextPaintSnapshot(false),
|
||||
m_vertexColorVoxelGrid(nullptr)
|
||||
{
|
||||
connect(&Preferences::instance(), &Preferences::partColorChanged, this, &Document::applyPreferencePartColorChange);
|
||||
connect(&Preferences::instance(), &Preferences::flatShadingChanged, this, &Document::applyPreferenceFlatShadingChange);
|
||||
|
@ -103,6 +105,7 @@ void Document::applyPreferenceTextureSizeChange()
|
|||
Document::~Document()
|
||||
{
|
||||
delete m_resultMesh;
|
||||
delete m_paintedMesh;
|
||||
delete m_resultMeshCutFaceTransforms;
|
||||
delete m_resultMeshNodesCutFaces;
|
||||
delete m_postProcessedOutcome;
|
||||
|
@ -1029,7 +1032,7 @@ void Document::setPaintMode(PaintMode mode)
|
|||
m_paintMode = mode;
|
||||
emit paintModeChanged();
|
||||
|
||||
doPickMouseTarget();
|
||||
paintVertexColors();
|
||||
}
|
||||
|
||||
void Document::joinNodeAndNeiborsToGroup(std::vector<QUuid> *group, QUuid nodeId, std::set<QUuid> *visitMap, QUuid noUseEdgeId)
|
||||
|
@ -1170,6 +1173,10 @@ void Document::toSnapshot(Snapshot *snapshot, const std::set<QUuid> &limitNodeId
|
|||
part["color"] = partIt.second.color.name(QColor::HexArgb);
|
||||
if (partIt.second.colorSolubilityAdjusted())
|
||||
part["colorSolubility"] = QString::number(partIt.second.colorSolubility);
|
||||
if (partIt.second.metalnessAdjusted())
|
||||
part["metalness"] = QString::number(partIt.second.metalness);
|
||||
if (partIt.second.roughnessAdjusted())
|
||||
part["roughness"] = QString::number(partIt.second.roughness);
|
||||
if (partIt.second.deformThicknessAdjusted())
|
||||
part["deformThickness"] = QString::number(partIt.second.deformThickness);
|
||||
if (partIt.second.deformWidthAdjusted())
|
||||
|
@ -1590,6 +1597,12 @@ void Document::addFromSnapshot(const Snapshot &snapshot, enum SnapshotSource sou
|
|||
const auto &colorSolubilityIt = partKv.second.find("colorSolubility");
|
||||
if (colorSolubilityIt != partKv.second.end())
|
||||
part.colorSolubility = colorSolubilityIt->second.toFloat();
|
||||
const auto &metalnessIt = partKv.second.find("metalness");
|
||||
if (metalnessIt != partKv.second.end())
|
||||
part.metalness = metalnessIt->second.toFloat();
|
||||
const auto &roughnessIt = partKv.second.find("roughness");
|
||||
if (roughnessIt != partKv.second.end())
|
||||
part.roughness = roughnessIt->second.toFloat();
|
||||
const auto &deformThicknessIt = partKv.second.find("deformThickness");
|
||||
if (deformThicknessIt != partKv.second.end())
|
||||
part.setDeformThickness(deformThicknessIt->second.toFloat());
|
||||
|
@ -1905,6 +1918,14 @@ Model *Document::takeResultMesh()
|
|||
return resultMesh;
|
||||
}
|
||||
|
||||
Model *Document::takePaintedMesh()
|
||||
{
|
||||
if (nullptr == m_paintedMesh)
|
||||
return nullptr;
|
||||
Model *paintedMesh = new Model(*m_paintedMesh);
|
||||
return paintedMesh;
|
||||
}
|
||||
|
||||
bool Document::isMeshGenerationSucceed()
|
||||
{
|
||||
return m_isMeshGenerationSucceed;
|
||||
|
@ -2205,12 +2226,12 @@ void Document::pickMouseTarget(const QVector3D &nearPosition, const QVector3D &f
|
|||
m_mouseRayNear = nearPosition;
|
||||
m_mouseRayFar = farPosition;
|
||||
|
||||
doPickMouseTarget();
|
||||
paintVertexColors();
|
||||
}
|
||||
|
||||
void Document::doPickMouseTarget()
|
||||
void Document::paintVertexColors()
|
||||
{
|
||||
if (nullptr != m_mousePicker) {
|
||||
if (nullptr != m_vertexColorPainter) {
|
||||
m_isMouseTargetResultObsolete = true;
|
||||
return;
|
||||
}
|
||||
|
@ -2225,44 +2246,41 @@ void Document::doPickMouseTarget()
|
|||
//qDebug() << "Mouse picking..";
|
||||
|
||||
QThread *thread = new QThread;
|
||||
m_mousePicker = new MousePicker(*m_currentOutcome, m_mouseRayNear, m_mouseRayFar);
|
||||
|
||||
std::map<QUuid, QUuid> paintImages;
|
||||
for (const auto &it: partMap) {
|
||||
if (!it.second.deformMapImageId.isNull()) {
|
||||
paintImages[it.first] = it.second.deformMapImageId;
|
||||
}
|
||||
}
|
||||
m_vertexColorPainter = new VertexColorPainter(*m_currentOutcome, m_mouseRayNear, m_mouseRayFar);
|
||||
m_vertexColorPainter->setBrushColor(brushColor);
|
||||
m_vertexColorPainter->setBrushMetalness(brushMetalness);
|
||||
m_vertexColorPainter->setBrushRoughness(brushRoughness);
|
||||
if (SkeletonDocumentEditMode::Paint == editMode) {
|
||||
m_mousePicker->setPaintImages(paintImages);
|
||||
m_mousePicker->setPaintMode(m_paintMode);
|
||||
m_mousePicker->setRadius(m_mousePickRadius);
|
||||
m_mousePicker->setMaskNodeIds(m_mousePickMaskNodeIds);
|
||||
if (nullptr == m_vertexColorVoxelGrid) {
|
||||
m_vertexColorVoxelGrid = new VoxelGrid<PaintColor>();
|
||||
}
|
||||
m_vertexColorPainter->setVoxelGrid(m_vertexColorVoxelGrid);
|
||||
m_vertexColorPainter->setPaintMode(m_paintMode);
|
||||
m_vertexColorPainter->setRadius(m_mousePickRadius);
|
||||
m_vertexColorPainter->setMaskNodeIds(m_mousePickMaskNodeIds);
|
||||
}
|
||||
|
||||
m_mousePicker->moveToThread(thread);
|
||||
connect(thread, &QThread::started, m_mousePicker, &MousePicker::process);
|
||||
connect(m_mousePicker, &MousePicker::finished, this, &Document::mouseTargetReady);
|
||||
connect(m_mousePicker, &MousePicker::finished, thread, &QThread::quit);
|
||||
m_vertexColorPainter->moveToThread(thread);
|
||||
connect(thread, &QThread::started, m_vertexColorPainter, &VertexColorPainter::process);
|
||||
connect(m_vertexColorPainter, &VertexColorPainter::finished, this, &Document::vertexColorsReady);
|
||||
connect(m_vertexColorPainter, &VertexColorPainter::finished, thread, &QThread::quit);
|
||||
connect(thread, &QThread::finished, thread, &QThread::deleteLater);
|
||||
thread->start();
|
||||
}
|
||||
|
||||
void Document::mouseTargetReady()
|
||||
void Document::vertexColorsReady()
|
||||
{
|
||||
m_mouseTargetPosition = m_mousePicker->targetPosition();
|
||||
const auto &changedPartIds = m_mousePicker->changedPartIds();
|
||||
for (const auto &it: m_mousePicker->resultPaintImages()) {
|
||||
const auto &partId = it.first;
|
||||
if (changedPartIds.find(partId) == changedPartIds.end())
|
||||
continue;
|
||||
const auto &imageId = it.second;
|
||||
m_intermediatePaintImageIds.insert(imageId);
|
||||
setPartDeformMapImageId(partId, imageId);
|
||||
m_mouseTargetPosition = m_vertexColorPainter->targetPosition();
|
||||
|
||||
Model *model = m_vertexColorPainter->takePaintedModel();
|
||||
if (nullptr != model) {
|
||||
delete m_paintedMesh;
|
||||
m_paintedMesh = model;
|
||||
emit paintedMeshChanged();
|
||||
}
|
||||
|
||||
delete m_mousePicker;
|
||||
m_mousePicker = nullptr;
|
||||
delete m_vertexColorPainter;
|
||||
m_vertexColorPainter = nullptr;
|
||||
|
||||
if (!m_isMouseTargetResultObsolete && m_saveNextPaintSnapshot) {
|
||||
m_saveNextPaintSnapshot = false;
|
||||
|
@ -3064,6 +3082,36 @@ void Document::setPartColorSolubility(QUuid partId, float solubility)
|
|||
emit skeletonChanged();
|
||||
}
|
||||
|
||||
void Document::setPartMetalness(QUuid partId, float metalness)
|
||||
{
|
||||
auto part = partMap.find(partId);
|
||||
if (part == partMap.end()) {
|
||||
qDebug() << "Part not found:" << partId;
|
||||
return;
|
||||
}
|
||||
if (qFuzzyCompare(part->second.metalness, metalness))
|
||||
return;
|
||||
part->second.metalness = metalness;
|
||||
part->second.dirty = true;
|
||||
emit partMetalnessChanged(partId);
|
||||
emit skeletonChanged();
|
||||
}
|
||||
|
||||
void Document::setPartRoughness(QUuid partId, float roughness)
|
||||
{
|
||||
auto part = partMap.find(partId);
|
||||
if (part == partMap.end()) {
|
||||
qDebug() << "Part not found:" << partId;
|
||||
return;
|
||||
}
|
||||
if (qFuzzyCompare(part->second.roughness, roughness))
|
||||
return;
|
||||
part->second.roughness = roughness;
|
||||
part->second.dirty = true;
|
||||
emit partRoughnessChanged(partId);
|
||||
emit skeletonChanged();
|
||||
}
|
||||
|
||||
void Document::setPartHollowThickness(QUuid partId, float hollowThickness)
|
||||
{
|
||||
auto part = partMap.find(partId);
|
||||
|
@ -4086,19 +4134,11 @@ void Document::startPaint(void)
|
|||
|
||||
void Document::stopPaint(void)
|
||||
{
|
||||
if (m_mousePicker || m_isMouseTargetResultObsolete) {
|
||||
if (m_vertexColorPainter || m_isMouseTargetResultObsolete) {
|
||||
m_saveNextPaintSnapshot = true;
|
||||
return;
|
||||
}
|
||||
saveSnapshot();
|
||||
for (const auto &it: partMap) {
|
||||
m_intermediatePaintImageIds.erase(it.second.deformMapImageId);
|
||||
}
|
||||
for (const auto &it: m_intermediatePaintImageIds) {
|
||||
//qDebug() << "Remove intermediate image:" << it;
|
||||
ImageForever::remove(it);
|
||||
}
|
||||
m_intermediatePaintImageIds.clear();
|
||||
//saveSnapshot();
|
||||
}
|
||||
|
||||
void Document::setMousePickMaskNodeIds(const std::set<QUuid> &nodeIds)
|
||||
|
|
|
@ -31,11 +31,12 @@
|
|||
#include "proceduralanimation.h"
|
||||
#include "componentlayer.h"
|
||||
#include "clothforce.h"
|
||||
#include "voxelgrid.h"
|
||||
#include "vertexcolorpainter.h"
|
||||
|
||||
class MaterialPreviewsGenerator;
|
||||
class MotionsGenerator;
|
||||
class ScriptRunner;
|
||||
class MousePicker;
|
||||
|
||||
class HistoryItem
|
||||
{
|
||||
|
@ -437,6 +438,7 @@ signals:
|
|||
void edgeReversed(QUuid edgeId);
|
||||
void partPreviewChanged(QUuid partId);
|
||||
void resultMeshChanged();
|
||||
void paintedMeshChanged();
|
||||
void turnaroundChanged();
|
||||
void editModeChanged();
|
||||
void paintModeChanged();
|
||||
|
@ -466,6 +468,8 @@ signals:
|
|||
void partChamferStateChanged(QUuid partId);
|
||||
void partTargetChanged(QUuid partId);
|
||||
void partColorSolubilityChanged(QUuid partId);
|
||||
void partMetalnessChanged(QUuid partId);
|
||||
void partRoughnessChanged(QUuid partId);
|
||||
void partHollowThicknessChanged(QUuid partId);
|
||||
void partCountershadeStateChanged(QUuid partId);
|
||||
void partGridStateChanged(QUuid partId);
|
||||
|
@ -537,6 +541,9 @@ public: // need initialize
|
|||
RigType rigType;
|
||||
bool weldEnabled;
|
||||
PolyCount polyCount;
|
||||
QColor brushColor;
|
||||
float brushMetalness = Model::m_defaultMetalness;
|
||||
float brushRoughness = Model::m_defaultRoughness;
|
||||
public:
|
||||
Document();
|
||||
~Document();
|
||||
|
@ -576,6 +583,7 @@ public:
|
|||
const Pose *findPose(QUuid poseId) const;
|
||||
const Motion *findMotion(QUuid motionId) const;
|
||||
Model *takeResultMesh();
|
||||
Model *takePaintedMesh();
|
||||
bool isMeshGenerationSucceed();
|
||||
Model *takeResultTextureMesh();
|
||||
Model *takeResultRigWeightMesh();
|
||||
|
@ -646,8 +654,8 @@ public slots:
|
|||
void generateMotions();
|
||||
void motionsReady();
|
||||
void pickMouseTarget(const QVector3D &nearPosition, const QVector3D &farPosition);
|
||||
void doPickMouseTarget();
|
||||
void mouseTargetReady();
|
||||
void paintVertexColors();
|
||||
void vertexColorsReady();
|
||||
void setPartLockState(QUuid partId, bool locked);
|
||||
void setPartVisibleState(QUuid partId, bool visible);
|
||||
void setPartSubdivState(QUuid partId, bool subdived);
|
||||
|
@ -668,6 +676,8 @@ public slots:
|
|||
void setPartChamferState(QUuid partId, bool chamfered);
|
||||
void setPartTarget(QUuid partId, PartTarget target);
|
||||
void setPartColorSolubility(QUuid partId, float solubility);
|
||||
void setPartMetalness(QUuid partId, float metalness);
|
||||
void setPartRoughness(QUuid partId, float roughness);
|
||||
void setPartHollowThickness(QUuid partId, float hollowThickness);
|
||||
void setPartCountershaded(QUuid partId, bool countershaded);
|
||||
void setComponentCombineMode(QUuid componentId, CombineMode combineMode);
|
||||
|
@ -774,6 +784,7 @@ private: // need initialize
|
|||
bool m_isResultMeshObsolete;
|
||||
MeshGenerator *m_meshGenerator;
|
||||
Model *m_resultMesh;
|
||||
Model *m_paintedMesh;
|
||||
std::map<QUuid, StrokeMeshBuilder::CutFaceTransform> *m_resultMeshCutFaceTransforms;
|
||||
std::map<QUuid, std::map<QString, QVector2D>> *m_resultMeshNodesCutFaces;
|
||||
bool m_isMeshGenerationSucceed;
|
||||
|
@ -805,11 +816,12 @@ private: // need initialize
|
|||
std::map<QString, std::map<QString, QString>> m_mergedVariables;
|
||||
ScriptRunner *m_scriptRunner;
|
||||
bool m_isScriptResultObsolete;
|
||||
MousePicker *m_mousePicker;
|
||||
VertexColorPainter *m_vertexColorPainter;
|
||||
bool m_isMouseTargetResultObsolete;
|
||||
PaintMode m_paintMode;
|
||||
float m_mousePickRadius;
|
||||
bool m_saveNextPaintSnapshot;
|
||||
VoxelGrid<PaintColor> *m_vertexColorVoxelGrid;
|
||||
private:
|
||||
static unsigned long m_maxSnapshot;
|
||||
std::deque<HistoryItem> m_undoItems;
|
||||
|
@ -823,7 +835,6 @@ private:
|
|||
QString m_scriptConsoleLog;
|
||||
QString m_script;
|
||||
std::set<QUuid> m_mousePickMaskNodeIds;
|
||||
std::set<QUuid> m_intermediatePaintImageIds;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -162,7 +162,8 @@ DocumentWindow::DocumentWindow() :
|
|||
m_exportPreviewWidget(nullptr),
|
||||
m_preferencesWidget(nullptr),
|
||||
m_isLastMeshGenerationSucceed(true),
|
||||
m_currentUpdatedMeshId(0)
|
||||
m_currentUpdatedMeshId(0),
|
||||
m_colorWheelWidget(nullptr)
|
||||
{
|
||||
QObject::connect((QtSingleApplication *)QGuiApplication::instance(),
|
||||
&QtSingleApplication::messageReceived, this, [this](const QString &message) {
|
||||
|
@ -201,9 +202,9 @@ DocumentWindow::DocumentWindow() :
|
|||
//markerButton->setToolTip(tr("Marker pen"));
|
||||
//Theme::initAwesomeButton(markerButton);
|
||||
|
||||
QPushButton *paintButton = new QPushButton(QChar(fa::paintbrush));
|
||||
paintButton->setToolTip(tr("Paint brush"));
|
||||
Theme::initAwesomeButton(paintButton);
|
||||
//QPushButton *paintButton = new QPushButton(QChar(fa::paintbrush));
|
||||
//paintButton->setToolTip(tr("Paint brush"));
|
||||
//Theme::initAwesomeButton(paintButton);
|
||||
|
||||
//QPushButton *dragButton = new QPushButton(QChar(fa::handrocko));
|
||||
//dragButton->setToolTip(tr("Enter drag mode"));
|
||||
|
@ -269,6 +270,10 @@ DocumentWindow::DocumentWindow() :
|
|||
updateRegenerateIconAndTips(regenerateButton, m_document->isMeshGenerationSucceed());
|
||||
generatePartPreviewImages();
|
||||
});
|
||||
connect(m_document, &Document::paintedMeshChanged, [=]() {
|
||||
auto paintedMesh = m_document->takePaintedMesh();
|
||||
m_modelRenderWidget->updateMesh(paintedMesh);
|
||||
});
|
||||
connect(m_document, &Document::postProcessing, this, [=]() {
|
||||
regenerateButton->showSpinner(true);
|
||||
});
|
||||
|
@ -287,7 +292,7 @@ DocumentWindow::DocumentWindow() :
|
|||
toolButtonLayout->addWidget(addButton);
|
||||
toolButtonLayout->addWidget(selectButton);
|
||||
//toolButtonLayout->addWidget(markerButton);
|
||||
toolButtonLayout->addWidget(paintButton);
|
||||
//toolButtonLayout->addWidget(paintButton);
|
||||
//toolButtonLayout->addWidget(dragButton);
|
||||
toolButtonLayout->addWidget(zoomInButton);
|
||||
toolButtonLayout->addWidget(zoomOutButton);
|
||||
|
@ -392,16 +397,80 @@ DocumentWindow::DocumentWindow() :
|
|||
|
||||
setTabPosition(Qt::RightDockWidgetArea, QTabWidget::East);
|
||||
|
||||
QDockWidget *partTreeDocker = new QDockWidget(tr("Parts"), this);
|
||||
partTreeDocker->setAllowedAreas(Qt::RightDockWidgetArea);
|
||||
m_partTreeWidget = new PartTreeWidget(m_document, partTreeDocker);
|
||||
partTreeDocker->setWidget(m_partTreeWidget);
|
||||
addDockWidget(Qt::RightDockWidgetArea, partTreeDocker);
|
||||
//connect(partTreeDocker, &QDockWidget::topLevelChanged, [=](bool topLevel) {
|
||||
// Q_UNUSED(topLevel);
|
||||
// for (const auto &part: m_document->partMap)
|
||||
// m_partTreeWidget->partPreviewChanged(part.first);
|
||||
//});
|
||||
QDockWidget *partsDocker = new QDockWidget(tr("Parts"), this);
|
||||
partsDocker->setAllowedAreas(Qt::RightDockWidgetArea);
|
||||
m_colorWheelWidget = new color_widgets::ColorWheel(nullptr);
|
||||
m_colorWheelWidget->setContentsMargins(0, 5, 0, 5);
|
||||
m_colorWheelWidget->hide();
|
||||
m_document->brushColor = m_colorWheelWidget->color();
|
||||
connect(m_colorWheelWidget, &color_widgets::ColorWheel::colorChanged, this, [=](QColor color) {
|
||||
m_document->brushColor = color;
|
||||
});
|
||||
|
||||
FloatNumberWidget *metalnessWidget = new FloatNumberWidget;
|
||||
metalnessWidget->setSliderFixedWidth(Theme::sidebarPreferredWidth * 0.4);
|
||||
metalnessWidget->setItemName(tr("Metallic"));
|
||||
metalnessWidget->setRange(0.0, 1.0);
|
||||
metalnessWidget->setValue(m_document->brushMetalness);
|
||||
|
||||
connect(metalnessWidget, &FloatNumberWidget::valueChanged, [=](float value) {
|
||||
m_document->brushMetalness = value;
|
||||
});
|
||||
|
||||
QPushButton *metalnessEraser = new QPushButton(QChar(fa::eraser));
|
||||
Theme::initAwesomeToolButtonWithoutFont(metalnessEraser);
|
||||
|
||||
connect(metalnessEraser, &QPushButton::clicked, [=]() {
|
||||
metalnessWidget->setValue(Model::m_defaultMetalness);
|
||||
});
|
||||
|
||||
QHBoxLayout *metalnessLayout = new QHBoxLayout;
|
||||
metalnessLayout->addWidget(metalnessEraser);
|
||||
metalnessLayout->addWidget(metalnessWidget);
|
||||
|
||||
FloatNumberWidget *roughnessWidget = new FloatNumberWidget;
|
||||
roughnessWidget->setSliderFixedWidth(Theme::sidebarPreferredWidth * 0.35);
|
||||
roughnessWidget->setItemName(tr("Roughness"));
|
||||
roughnessWidget->setRange(0.0, 1.0);
|
||||
roughnessWidget->setValue(m_document->brushRoughness);
|
||||
|
||||
connect(roughnessWidget, &FloatNumberWidget::valueChanged, [=](float value) {
|
||||
m_document->brushRoughness = value;
|
||||
});
|
||||
|
||||
QPushButton *roughnessEraser = new QPushButton(QChar(fa::eraser));
|
||||
Theme::initAwesomeToolButtonWithoutFont(roughnessEraser);
|
||||
|
||||
connect(roughnessEraser, &QPushButton::clicked, [=]() {
|
||||
roughnessWidget->setValue(Model::m_defaultRoughness);
|
||||
});
|
||||
|
||||
QHBoxLayout *roughnessLayout = new QHBoxLayout;
|
||||
roughnessLayout->addWidget(roughnessEraser);
|
||||
roughnessLayout->addWidget(roughnessWidget);
|
||||
|
||||
QWidget *metalnessAndRoughnessWidget = new QWidget;
|
||||
QVBoxLayout *metalnessAndRoughnessLayout = new QVBoxLayout;
|
||||
metalnessAndRoughnessLayout->addLayout(metalnessLayout);
|
||||
metalnessAndRoughnessLayout->addLayout(roughnessLayout);
|
||||
metalnessAndRoughnessWidget->setLayout(metalnessAndRoughnessLayout);
|
||||
metalnessAndRoughnessWidget->hide();
|
||||
|
||||
connect(m_document, &Document::editModeChanged, this, [=]() {
|
||||
m_colorWheelWidget->setVisible(SkeletonDocumentEditMode::Paint == m_document->editMode);
|
||||
metalnessAndRoughnessWidget->setVisible(SkeletonDocumentEditMode::Paint == m_document->editMode);
|
||||
});
|
||||
|
||||
m_partTreeWidget = new PartTreeWidget(m_document, nullptr);
|
||||
QWidget *partsWidget = new QWidget(partsDocker);
|
||||
QVBoxLayout *partsLayout = new QVBoxLayout;
|
||||
partsLayout->setContentsMargins(0, 0, 0, 0);
|
||||
partsLayout->addWidget(m_colorWheelWidget);
|
||||
partsLayout->addWidget(metalnessAndRoughnessWidget);
|
||||
partsLayout->addWidget(m_partTreeWidget);
|
||||
partsWidget->setLayout(partsLayout);
|
||||
partsDocker->setWidget(partsWidget);
|
||||
addDockWidget(Qt::RightDockWidgetArea, partsDocker);
|
||||
|
||||
QDockWidget *materialDocker = new QDockWidget(tr("Materials"), this);
|
||||
materialDocker->setAllowedAreas(Qt::RightDockWidgetArea);
|
||||
|
@ -453,13 +522,13 @@ DocumentWindow::DocumentWindow() :
|
|||
scriptDocker->setWidget(scriptWidget);
|
||||
addDockWidget(Qt::RightDockWidgetArea, scriptDocker);
|
||||
|
||||
tabifyDockWidget(partTreeDocker, materialDocker);
|
||||
tabifyDockWidget(partsDocker, materialDocker);
|
||||
tabifyDockWidget(materialDocker, rigDocker);
|
||||
tabifyDockWidget(rigDocker, poseDocker);
|
||||
tabifyDockWidget(poseDocker, motionDocker);
|
||||
tabifyDockWidget(motionDocker, scriptDocker);
|
||||
|
||||
partTreeDocker->raise();
|
||||
partsDocker->raise();
|
||||
|
||||
QHBoxLayout *mainLayout = new QHBoxLayout;
|
||||
mainLayout->setSpacing(0);
|
||||
|
@ -829,8 +898,8 @@ DocumentWindow::DocumentWindow() :
|
|||
|
||||
m_showPartsListAction = new QAction(tr("Parts"), this);
|
||||
connect(m_showPartsListAction, &QAction::triggered, [=]() {
|
||||
partTreeDocker->show();
|
||||
partTreeDocker->raise();
|
||||
partsDocker->show();
|
||||
partsDocker->raise();
|
||||
});
|
||||
m_windowMenu->addAction(m_showPartsListAction);
|
||||
|
||||
|
@ -955,9 +1024,9 @@ DocumentWindow::DocumentWindow() :
|
|||
// m_document->setEditMode(SkeletonDocumentEditMode::Mark);
|
||||
//});
|
||||
|
||||
connect(paintButton, &QPushButton::clicked, [=]() {
|
||||
m_document->setEditMode(SkeletonDocumentEditMode::Paint);
|
||||
});
|
||||
//connect(paintButton, &QPushButton::clicked, [=]() {
|
||||
// m_document->setEditMode(SkeletonDocumentEditMode::Paint);
|
||||
//});
|
||||
|
||||
//connect(dragButton, &QPushButton::clicked, [=]() {
|
||||
// m_document->setEditMode(SkeletonDocumentEditMode::Drag);
|
||||
|
@ -992,8 +1061,8 @@ DocumentWindow::DocumentWindow() :
|
|||
|
||||
m_partListDockerVisibleSwitchConnection = connect(m_document, &Document::skeletonChanged, [=]() {
|
||||
if (m_graphicsWidget->hasItems()) {
|
||||
if (partTreeDocker->isHidden())
|
||||
partTreeDocker->show();
|
||||
if (partsDocker->isHidden())
|
||||
partsDocker->show();
|
||||
disconnect(m_partListDockerVisibleSwitchConnection);
|
||||
}
|
||||
});
|
||||
|
@ -1147,6 +1216,8 @@ DocumentWindow::DocumentWindow() :
|
|||
connect(m_document, &Document::partHollowThicknessChanged, m_partTreeWidget, &PartTreeWidget::partHollowThicknessChanged);
|
||||
connect(m_document, &Document::partMaterialIdChanged, m_partTreeWidget, &PartTreeWidget::partMaterialIdChanged);
|
||||
connect(m_document, &Document::partColorSolubilityChanged, m_partTreeWidget, &PartTreeWidget::partColorSolubilityChanged);
|
||||
connect(m_document, &Document::partMetalnessChanged, m_partTreeWidget, &PartTreeWidget::partMetalnessChanged);
|
||||
connect(m_document, &Document::partRoughnessChanged, m_partTreeWidget, &PartTreeWidget::partRoughnessChanged);
|
||||
connect(m_document, &Document::partCountershadeStateChanged, m_partTreeWidget, &PartTreeWidget::partCountershadeStateChanged);
|
||||
|
||||
connect(m_document, &Document::partTargetChanged, m_partTreeWidget, &PartTreeWidget::partXmirrorStateChanged);
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
#include "normalanddepthmapsgenerator.h"
|
||||
#include "autosaver.h"
|
||||
#include "partpreviewimagesgenerator.h"
|
||||
#include "QtColorWidgets/ColorWheel"
|
||||
|
||||
class SkeletonGraphicsWidget;
|
||||
class PartTreeWidget;
|
||||
|
@ -116,6 +117,7 @@ private:
|
|||
bool m_isLastMeshGenerationSucceed;
|
||||
quint64 m_currentUpdatedMeshId;
|
||||
QStringList m_waitingForExportToFilenames;
|
||||
color_widgets::ColorWheel *m_colorWheelWidget;
|
||||
private:
|
||||
QString m_currentFilename;
|
||||
|
||||
|
|
|
@ -34,6 +34,11 @@ FloatNumberWidget::FloatNumberWidget(QWidget *parent, bool singleLine) :
|
|||
}
|
||||
}
|
||||
|
||||
void FloatNumberWidget::setSliderFixedWidth(float width)
|
||||
{
|
||||
m_slider->setFixedWidth(width);
|
||||
}
|
||||
|
||||
void FloatNumberWidget::updateValueLabel(float value)
|
||||
{
|
||||
QString valueString = QString().sprintf("%.2f", value);
|
||||
|
|
|
@ -9,10 +9,11 @@ class FloatNumberWidget : public QWidget
|
|||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit FloatNumberWidget(QWidget *parent = nullptr, bool singleLine=true);
|
||||
explicit FloatNumberWidget(QWidget *parent=nullptr, bool singleLine=true);
|
||||
void setRange(float min, float max);
|
||||
float value() const;
|
||||
void setItemName(const QString &name);
|
||||
void setSliderFixedWidth(float width);
|
||||
|
||||
public slots:
|
||||
void increaseValue();
|
||||
|
|
|
@ -416,6 +416,16 @@ MeshCombiner::Mesh *MeshGenerator::combinePartMesh(const QString &partIdString,
|
|||
if (!colorSolubilityString.isEmpty())
|
||||
colorSolubility = colorSolubilityString.toFloat();
|
||||
|
||||
float metalness = 0;
|
||||
QString metalnessString = valueOfKeyInMapOrEmpty(part, "metalness");
|
||||
if (!metalnessString.isEmpty())
|
||||
metalness = metalnessString.toFloat();
|
||||
|
||||
float roughness = 1.0;
|
||||
QString roughnessString = valueOfKeyInMapOrEmpty(part, "roughness");
|
||||
if (!roughnessString.isEmpty())
|
||||
roughness = roughnessString.toFloat();
|
||||
|
||||
QUuid fillMeshFileId;
|
||||
QString fillMeshString = valueOfKeyInMapOrEmpty(part, "fillMesh");
|
||||
if (!fillMeshString.isEmpty()) {
|
||||
|
@ -538,6 +548,8 @@ MeshCombiner::Mesh *MeshGenerator::combinePartMesh(const QString &partIdString,
|
|||
outcomeNode.materialId = materialId;
|
||||
outcomeNode.countershaded = countershaded;
|
||||
outcomeNode.colorSolubility = colorSolubility;
|
||||
outcomeNode.metalness = metalness;
|
||||
outcomeNode.roughness = roughness;
|
||||
outcomeNode.boneMark = nodeInfo.boneMark;
|
||||
if (!__mirroredByPartId.isEmpty())
|
||||
outcomeNode.mirroredByPartId = QUuid(__mirroredByPartId);
|
||||
|
|
|
@ -5,8 +5,6 @@
|
|||
#include "model.h"
|
||||
#include "version.h"
|
||||
|
||||
#define MAX_VERTICES_PER_FACE 100
|
||||
|
||||
float Model::m_defaultMetalness = 0.0;
|
||||
float Model::m_defaultRoughness = 1.0;
|
||||
|
||||
|
|
|
@ -156,18 +156,22 @@ void ModelMeshBinder::paint(ModelShaderProgram *program)
|
|||
(m_hasMetalnessMap || m_hasRoughnessMap || m_hasAmbientOcclusionMap))
|
||||
m_metalnessRoughnessAmbientOcclusionMap = new QOpenGLTexture(*m_mesh->metalnessRoughnessAmbientOcclusionImage());
|
||||
|
||||
delete m_environmentIrradianceMap;
|
||||
m_environmentIrradianceMap = nullptr;
|
||||
delete m_environmentSpecularMap;
|
||||
m_environmentSpecularMap = nullptr;
|
||||
//delete m_environmentIrradianceMap;
|
||||
//m_environmentIrradianceMap = nullptr;
|
||||
//delete m_environmentSpecularMap;
|
||||
//m_environmentSpecularMap = nullptr;
|
||||
if (program->isCoreProfile() &&
|
||||
m_environmentLightEnabled &&
|
||||
(m_hasMetalnessMap || m_hasRoughnessMap)) {
|
||||
DdsFileReader irradianceFile(":/resources/cedar_bridge_irradiance.dds");
|
||||
m_environmentIrradianceMap = irradianceFile.createOpenGLTexture();
|
||||
m_environmentLightEnabled/* &&
|
||||
(m_hasMetalnessMap || m_hasRoughnessMap)*/) {
|
||||
if (nullptr == m_environmentIrradianceMap) {
|
||||
DdsFileReader irradianceFile(":/resources/cedar_bridge_irradiance.dds");
|
||||
m_environmentIrradianceMap = irradianceFile.createOpenGLTexture();
|
||||
}
|
||||
|
||||
DdsFileReader specularFile(":/resources/cedar_bridge_specular.dds");
|
||||
m_environmentSpecularMap = specularFile.createOpenGLTexture();
|
||||
if (nullptr == m_environmentSpecularMap) {
|
||||
DdsFileReader specularFile(":/resources/cedar_bridge_specular.dds");
|
||||
m_environmentSpecularMap = specularFile.createOpenGLTexture();
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
|
|
|
@ -1,217 +0,0 @@
|
|||
#include <QDebug>
|
||||
#include <QQuaternion>
|
||||
#include <QRadialGradient>
|
||||
#include <QBrush>
|
||||
#include <QPainter>
|
||||
#include <QGuiApplication>
|
||||
#include "mousepicker.h"
|
||||
#include "util.h"
|
||||
#include "imageforever.h"
|
||||
|
||||
MousePicker::MousePicker(const Outcome &outcome, const QVector3D &mouseRayNear, const QVector3D &mouseRayFar) :
|
||||
m_outcome(outcome),
|
||||
m_mouseRayNear(mouseRayNear),
|
||||
m_mouseRayFar(mouseRayFar)
|
||||
{
|
||||
}
|
||||
|
||||
const std::set<QUuid> &MousePicker::changedPartIds()
|
||||
{
|
||||
return m_changedPartIds;
|
||||
}
|
||||
|
||||
void MousePicker::setPaintMode(PaintMode paintMode)
|
||||
{
|
||||
m_paintMode = paintMode;
|
||||
}
|
||||
|
||||
void MousePicker::setMaskNodeIds(const std::set<QUuid> &nodeIds)
|
||||
{
|
||||
m_mousePickMaskNodeIds = nodeIds;
|
||||
}
|
||||
|
||||
void MousePicker::setRadius(float radius)
|
||||
{
|
||||
m_radius = radius;
|
||||
}
|
||||
|
||||
MousePicker::~MousePicker()
|
||||
{
|
||||
}
|
||||
|
||||
bool MousePicker::calculateMouseModelPosition(QVector3D &mouseModelPosition)
|
||||
{
|
||||
bool foundPosition = false;
|
||||
auto ray = (m_mouseRayNear - m_mouseRayFar).normalized();
|
||||
float minDistance2 = std::numeric_limits<float>::max();
|
||||
for (size_t i = 0; i < m_outcome.triangles.size(); ++i) {
|
||||
const auto &triangleIndices = m_outcome.triangles[i];
|
||||
std::vector<QVector3D> triangle = {
|
||||
m_outcome.vertices[triangleIndices[0]],
|
||||
m_outcome.vertices[triangleIndices[1]],
|
||||
m_outcome.vertices[triangleIndices[2]],
|
||||
};
|
||||
const auto &triangleNormal = m_outcome.triangleNormals[i];
|
||||
if (QVector3D::dotProduct(triangleNormal, ray) <= 0)
|
||||
continue;
|
||||
QVector3D intersection;
|
||||
if (intersectSegmentAndTriangle(m_mouseRayNear, m_mouseRayFar,
|
||||
triangle,
|
||||
triangleNormal,
|
||||
&intersection)) {
|
||||
float distance2 = (intersection - m_mouseRayNear).lengthSquared();
|
||||
if (distance2 < minDistance2) {
|
||||
mouseModelPosition = intersection;
|
||||
minDistance2 = distance2;
|
||||
foundPosition = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return foundPosition;
|
||||
}
|
||||
|
||||
void MousePicker::pick()
|
||||
{
|
||||
if (!calculateMouseModelPosition(m_targetPosition))
|
||||
return;
|
||||
|
||||
if (PaintMode::None == m_paintMode)
|
||||
return;
|
||||
|
||||
float distance2 = m_radius * m_radius;
|
||||
|
||||
for (const auto &map: m_outcome.paintMaps) {
|
||||
for (const auto &node: map.paintNodes) {
|
||||
if (!m_mousePickMaskNodeIds.empty() && m_mousePickMaskNodeIds.find(node.originNodeId) == m_mousePickMaskNodeIds.end())
|
||||
continue;
|
||||
size_t intersectedNum = 0;
|
||||
QVector3D sumOfDirection;
|
||||
QVector3D referenceDirection = (m_targetPosition - node.origin).normalized();
|
||||
float sumOfRadius = 0;
|
||||
for (const auto &vertexPosition: node.vertices) {
|
||||
// >0.866 = <30 degrees
|
||||
auto direction = (vertexPosition - node.origin).normalized();
|
||||
if (QVector3D::dotProduct(referenceDirection, direction) > 0.866 &&
|
||||
(vertexPosition - m_targetPosition).lengthSquared() <= distance2) {
|
||||
float distance = vertexPosition.distanceToPoint(m_targetPosition);
|
||||
float radius = (m_radius - distance) / node.radius;
|
||||
sumOfRadius += radius;
|
||||
sumOfDirection += direction * radius;
|
||||
++intersectedNum;
|
||||
}
|
||||
}
|
||||
if (intersectedNum > 0) {
|
||||
float paintRadius = sumOfRadius / intersectedNum;
|
||||
QVector3D paintDirection = sumOfDirection.normalized();
|
||||
float degrees = angleInRangle360BetweenTwoVectors(node.baseNormal, paintDirection, node.direction);
|
||||
float offset = (float)node.order / map.paintNodes.size();
|
||||
m_changedPartIds.insert(map.partId);
|
||||
paintToImage(map.partId, offset, degrees / 360.0, paintRadius, PaintMode::Push == m_paintMode);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void MousePicker::process()
|
||||
{
|
||||
pick();
|
||||
emit finished();
|
||||
}
|
||||
|
||||
void MousePicker::paintToImage(const QUuid &partId, float x, float y, float radius, bool inverted)
|
||||
{
|
||||
QUuid oldImageId;
|
||||
QImage image(72, 36, QImage::Format_Grayscale8);
|
||||
image.fill(QColor(127, 127, 127));
|
||||
const auto &findImageId = m_paintImages.find(partId);
|
||||
if (findImageId != m_paintImages.end()) {
|
||||
const QImage *oldImage = ImageForever::get(findImageId->second);
|
||||
if (nullptr != oldImage) {
|
||||
if (oldImage->size() == image.size() &&
|
||||
oldImage->format() == image.format()) {
|
||||
image = *oldImage;
|
||||
}
|
||||
}
|
||||
}
|
||||
float destX = image.width() * x;
|
||||
float destY = image.height() * y;
|
||||
float destRadius = image.height() * radius;
|
||||
{
|
||||
QRadialGradient gradient(destX, destY, destRadius / 2);
|
||||
if (inverted) {
|
||||
gradient.setColorAt(0, QColor(0, 0, 0, 3));
|
||||
gradient.setColorAt(1, Qt::transparent);
|
||||
} else {
|
||||
gradient.setColorAt(0, QColor(255, 255, 255, 3));
|
||||
gradient.setColorAt(1, Qt::transparent);
|
||||
}
|
||||
QBrush brush(gradient);
|
||||
QPainter paint(&image);
|
||||
paint.setRenderHint(QPainter::HighQualityAntialiasing);
|
||||
paint.setBrush(brush);
|
||||
paint.setPen(Qt::NoPen);
|
||||
paint.drawEllipse(destX - destRadius / 2, destY - destRadius / 2, destRadius, destRadius);
|
||||
}
|
||||
QUuid imageId = ImageForever::add(&image);
|
||||
m_paintImages[partId] = imageId;
|
||||
}
|
||||
|
||||
const QVector3D &MousePicker::targetPosition()
|
||||
{
|
||||
return m_targetPosition;
|
||||
}
|
||||
|
||||
bool MousePicker::intersectSegmentAndPlane(const QVector3D &segmentPoint0, const QVector3D &segmentPoint1,
|
||||
const QVector3D &pointOnPlane, const QVector3D &planeNormal,
|
||||
QVector3D *intersection)
|
||||
{
|
||||
auto u = segmentPoint1 - segmentPoint0;
|
||||
auto w = segmentPoint0 - pointOnPlane;
|
||||
auto d = QVector3D::dotProduct(planeNormal, u);
|
||||
auto n = QVector3D::dotProduct(-planeNormal, w);
|
||||
if (qAbs(d) < 0.00000001)
|
||||
return false;
|
||||
auto s = n / d;
|
||||
if (s < 0 || s > 1 || qIsNaN(s) || qIsInf(s))
|
||||
return false;
|
||||
if (nullptr != intersection)
|
||||
*intersection = segmentPoint0 + s * u;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool MousePicker::intersectSegmentAndTriangle(const QVector3D &segmentPoint0, const QVector3D &segmentPoint1,
|
||||
const std::vector<QVector3D> &triangle,
|
||||
const QVector3D &triangleNormal,
|
||||
QVector3D *intersection)
|
||||
{
|
||||
QVector3D possibleIntersection;
|
||||
if (!intersectSegmentAndPlane(segmentPoint0, segmentPoint1,
|
||||
triangle[0], triangleNormal, &possibleIntersection)) {
|
||||
return false;
|
||||
}
|
||||
auto ray = (segmentPoint0 - segmentPoint1).normalized();
|
||||
std::vector<QVector3D> normals;
|
||||
for (size_t i = 0; i < 3; ++i) {
|
||||
size_t j = (i + 1) % 3;
|
||||
normals.push_back(QVector3D::normal(possibleIntersection, triangle[i], triangle[j]));
|
||||
}
|
||||
if (QVector3D::dotProduct(normals[0], ray) <= 0)
|
||||
return false;
|
||||
if (QVector3D::dotProduct(normals[0], normals[1]) <= 0)
|
||||
return false;
|
||||
if (QVector3D::dotProduct(normals[0], normals[2]) <= 0)
|
||||
return false;
|
||||
if (nullptr != intersection)
|
||||
*intersection = possibleIntersection;
|
||||
return true;
|
||||
}
|
||||
|
||||
void MousePicker::setPaintImages(const std::map<QUuid, QUuid> &paintImages)
|
||||
{
|
||||
m_paintImages = paintImages;
|
||||
}
|
||||
|
||||
const std::map<QUuid, QUuid> &MousePicker::resultPaintImages()
|
||||
{
|
||||
return m_paintImages;
|
||||
}
|
|
@ -1,52 +0,0 @@
|
|||
#ifndef DUST3D_MOUSE_PICKER_H
|
||||
#define DUST3D_MOUSE_PICKER_H
|
||||
#include <QObject>
|
||||
#include <QVector3D>
|
||||
#include <vector>
|
||||
#include <map>
|
||||
#include <set>
|
||||
#include "outcome.h"
|
||||
#include "paintmode.h"
|
||||
|
||||
class MousePicker : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
MousePicker(const Outcome &outcome, const QVector3D &mouseRayNear, const QVector3D &mouseRayFar);
|
||||
void setRadius(float radius);
|
||||
void setPaintImages(const std::map<QUuid, QUuid> &paintImages);
|
||||
void setPaintMode(PaintMode paintMode);
|
||||
void setMaskNodeIds(const std::set<QUuid> &nodeIds);
|
||||
const std::map<QUuid, QUuid> &resultPaintImages();
|
||||
const std::set<QUuid> &changedPartIds();
|
||||
|
||||
~MousePicker();
|
||||
const QVector3D &targetPosition();
|
||||
signals:
|
||||
void finished();
|
||||
public slots:
|
||||
void process();
|
||||
void pick();
|
||||
private:
|
||||
float m_radius = 0.0;
|
||||
std::map<QUuid, QUuid> m_paintImages;
|
||||
PaintMode m_paintMode = PaintMode::None;
|
||||
std::set<QUuid> m_changedPartIds;
|
||||
std::set<QUuid> m_mousePickMaskNodeIds;
|
||||
bool m_enablePaint = false;
|
||||
Outcome m_outcome;
|
||||
QVector3D m_mouseRayNear;
|
||||
QVector3D m_mouseRayFar;
|
||||
QVector3D m_targetPosition;
|
||||
static bool intersectSegmentAndPlane(const QVector3D &segmentPoint0, const QVector3D &segmentPoint1,
|
||||
const QVector3D &pointOnPlane, const QVector3D &planeNormal,
|
||||
QVector3D *intersection=nullptr);
|
||||
static bool intersectSegmentAndTriangle(const QVector3D &segmentPoint0, const QVector3D &segmentPoint1,
|
||||
const std::vector<QVector3D> &triangle,
|
||||
const QVector3D &triangleNormal,
|
||||
QVector3D *intersection=nullptr);
|
||||
bool calculateMouseModelPosition(QVector3D &mouseModelPosition);
|
||||
void paintToImage(const QUuid &partId, float x, float y, float radius, bool inverted=false);
|
||||
};
|
||||
|
||||
#endif
|
|
@ -19,6 +19,8 @@ struct OutcomeNode
|
|||
float radius = 0;
|
||||
QColor color;
|
||||
float colorSolubility = 0;
|
||||
float metalness = 0;
|
||||
float roughness = 1.0;
|
||||
QUuid materialId;
|
||||
bool countershaded = false;
|
||||
QUuid mirrorFromPartId;
|
||||
|
|
|
@ -28,6 +28,7 @@ void PartPreviewImagesGenerator::generate()
|
|||
|
||||
m_offscreenRender->setZRotation(0);
|
||||
m_offscreenRender->setEyePosition(QVector3D(0, 0, -4.0));
|
||||
m_offscreenRender->enableEnvironmentLight();
|
||||
m_offscreenRender->setRenderPurpose(0);
|
||||
for (auto &it: m_partPreviews) {
|
||||
if (it.second.isCutFace) {
|
||||
|
|
|
@ -1442,6 +1442,28 @@ void PartTreeWidget::partColorSolubilityChanged(QUuid partId)
|
|||
widget->updateColorButton();
|
||||
}
|
||||
|
||||
void PartTreeWidget::partMetalnessChanged(QUuid partId)
|
||||
{
|
||||
auto item = m_partItemMap.find(partId);
|
||||
if (item == m_partItemMap.end()) {
|
||||
qDebug() << "Part item not found:" << partId;
|
||||
return;
|
||||
}
|
||||
PartWidget *widget = (PartWidget *)itemWidget(item->second, 0);
|
||||
widget->updateColorButton();
|
||||
}
|
||||
|
||||
void PartTreeWidget::partRoughnessChanged(QUuid partId)
|
||||
{
|
||||
auto item = m_partItemMap.find(partId);
|
||||
if (item == m_partItemMap.end()) {
|
||||
qDebug() << "Part item not found:" << partId;
|
||||
return;
|
||||
}
|
||||
PartWidget *widget = (PartWidget *)itemWidget(item->second, 0);
|
||||
widget->updateColorButton();
|
||||
}
|
||||
|
||||
void PartTreeWidget::partCountershadeStateChanged(QUuid partId)
|
||||
{
|
||||
auto item = m_partItemMap.find(partId);
|
||||
|
|
|
@ -79,6 +79,8 @@ public slots:
|
|||
void partHollowThicknessChanged(QUuid partId);
|
||||
void partMaterialIdChanged(QUuid partId);
|
||||
void partColorSolubilityChanged(QUuid partId);
|
||||
void partMetalnessChanged(QUuid partId);
|
||||
void partRoughnessChanged(QUuid partId);
|
||||
void partCountershadeStateChanged(QUuid partId);
|
||||
void partChecked(QUuid partId);
|
||||
void partUnchecked(QUuid partId);
|
||||
|
|
|
@ -177,6 +177,8 @@ PartWidget::PartWidget(const Document *document, QUuid partId) :
|
|||
connect(this, &PartWidget::setPartColorState, m_document, &Document::setPartColorState);
|
||||
connect(this, &PartWidget::setPartMaterialId, m_document, &Document::setPartMaterialId);
|
||||
connect(this, &PartWidget::setPartColorSolubility, m_document, &Document::setPartColorSolubility);
|
||||
connect(this, &PartWidget::setPartMetalness, m_document, &Document::setPartMetalness);
|
||||
connect(this, &PartWidget::setPartRoughness, m_document, &Document::setPartRoughness);
|
||||
connect(this, &PartWidget::setPartHollowThickness, m_document, &Document::setPartHollowThickness);
|
||||
connect(this, &PartWidget::setPartCountershaded, m_document, &Document::setPartCountershaded);
|
||||
connect(this, &PartWidget::checkPart, m_document, &Document::checkPart);
|
||||
|
@ -469,10 +471,57 @@ void PartWidget::showColorSettingPopup(const QPoint &pos)
|
|||
colorSolubilityLayout->addWidget(colorSolubilityEraser);
|
||||
colorSolubilityLayout->addWidget(colorSolubilityWidget);
|
||||
|
||||
FloatNumberWidget *metalnessWidget = new FloatNumberWidget;
|
||||
metalnessWidget->setItemName(tr("Metallic"));
|
||||
metalnessWidget->setRange(0.0, 1.0);
|
||||
metalnessWidget->setValue(part->metalness);
|
||||
|
||||
connect(metalnessWidget, &FloatNumberWidget::valueChanged, [=](float value) {
|
||||
emit setPartMetalness(m_partId, value);
|
||||
emit groupOperationAdded();
|
||||
});
|
||||
|
||||
QPushButton *metalnessEraser = new QPushButton(QChar(fa::eraser));
|
||||
initToolButton(metalnessEraser);
|
||||
|
||||
connect(metalnessEraser, &QPushButton::clicked, [=]() {
|
||||
metalnessWidget->setValue(0.0);
|
||||
emit groupOperationAdded();
|
||||
});
|
||||
|
||||
QHBoxLayout *metalnessLayout = new QHBoxLayout;
|
||||
metalnessLayout->addWidget(metalnessEraser);
|
||||
metalnessLayout->addWidget(metalnessWidget);
|
||||
|
||||
FloatNumberWidget *roughnessWidget = new FloatNumberWidget;
|
||||
roughnessWidget->setItemName(tr("Roughness"));
|
||||
roughnessWidget->setRange(0.0, 1.0);
|
||||
roughnessWidget->setValue(part->roughness);
|
||||
|
||||
connect(roughnessWidget, &FloatNumberWidget::valueChanged, [=](float value) {
|
||||
emit setPartRoughness(m_partId, value);
|
||||
emit groupOperationAdded();
|
||||
});
|
||||
|
||||
QPushButton *roughnessEraser = new QPushButton(QChar(fa::eraser));
|
||||
initToolButton(roughnessEraser);
|
||||
|
||||
connect(roughnessEraser, &QPushButton::clicked, [=]() {
|
||||
roughnessWidget->setValue(1.0);
|
||||
emit groupOperationAdded();
|
||||
});
|
||||
|
||||
QHBoxLayout *roughnessLayout = new QHBoxLayout;
|
||||
roughnessLayout->addWidget(roughnessEraser);
|
||||
roughnessLayout->addWidget(roughnessWidget);
|
||||
|
||||
QVBoxLayout *mainLayout = new QVBoxLayout;
|
||||
mainLayout->addLayout(colorLayout);
|
||||
mainLayout->addLayout(colorTransparencyLayout);
|
||||
mainLayout->addLayout(colorSolubilityLayout);
|
||||
mainLayout->addWidget(Theme::createHorizontalLineWidget());
|
||||
mainLayout->addLayout(metalnessLayout);
|
||||
mainLayout->addLayout(roughnessLayout);
|
||||
|
||||
if (m_document->materialIdList.empty()) {
|
||||
InfoLabel *infoLabel = new InfoLabel;
|
||||
|
@ -861,10 +910,16 @@ void PartWidget::updateColorButton()
|
|||
qDebug() << "Part not found:" << m_partId;
|
||||
return;
|
||||
}
|
||||
if (part->hasColor || part->materialAdjusted() || part->colorSolubilityAdjusted() || part->countershaded)
|
||||
if (part->hasColor ||
|
||||
part->materialAdjusted() ||
|
||||
part->colorSolubilityAdjusted() ||
|
||||
part->countershaded ||
|
||||
part->metalnessAdjusted() ||
|
||||
part->roughnessAdjusted()) {
|
||||
updateButton(m_colorButton, QChar(fa::eyedropper), true, part->hasColorFunction());
|
||||
else
|
||||
} else {
|
||||
updateButton(m_colorButton, QChar(fa::eyedropper), false, part->hasColorFunction());
|
||||
}
|
||||
}
|
||||
|
||||
void PartWidget::updateCutRotationButton()
|
||||
|
|
|
@ -28,6 +28,8 @@ signals:
|
|||
void setPartCutFaceLinkedId(QUuid partId, QUuid linkedId);
|
||||
void setPartMaterialId(QUuid partId, QUuid materialId);
|
||||
void setPartColorSolubility(QUuid partId, float colorSolubility);
|
||||
void setPartMetalness(QUuid partId, float metalness);
|
||||
void setPartRoughness(QUuid partId, float roughness);
|
||||
void setPartHollowThickness(QUuid partId, float hollowThickness);
|
||||
void setPartCountershaded(QUuid partId, bool countershaded);
|
||||
void movePartUp(QUuid partId);
|
||||
|
|
|
@ -27,7 +27,7 @@ void initShortCuts(QWidget *widget, SkeletonGraphicsWidget *graphicsWidget)
|
|||
defineKey(Qt::CTRL + Qt::Key_C, &SkeletonGraphicsWidget::shortcutCopy);
|
||||
defineKey(Qt::CTRL + Qt::Key_V, &SkeletonGraphicsWidget::shortcutPaste);
|
||||
defineKey(Qt::Key_S, &SkeletonGraphicsWidget::shortcutSelectMode);
|
||||
defineKey(Qt::Key_D, &SkeletonGraphicsWidget::shortcutPaintMode);
|
||||
//defineKey(Qt::Key_D, &SkeletonGraphicsWidget::shortcutPaintMode);
|
||||
defineKey(Qt::ALT + Qt::Key_Minus, &SkeletonGraphicsWidget::shortcutZoomRenderedModelByMinus10);
|
||||
defineKey(Qt::Key_Minus, &SkeletonGraphicsWidget::shortcutZoomSelectedByMinus1);
|
||||
defineKey(Qt::ALT + Qt::Key_Equal, &SkeletonGraphicsWidget::shortcutZoomRenderedModelBy10);
|
||||
|
|
|
@ -177,6 +177,8 @@ public:
|
|||
QUuid materialId;
|
||||
PartTarget target;
|
||||
float colorSolubility;
|
||||
float metalness;
|
||||
float roughness;
|
||||
float deformMapScale;
|
||||
QUuid deformMapImageId;
|
||||
float hollowThickness;
|
||||
|
@ -204,6 +206,8 @@ public:
|
|||
cutFace(CutFace::Quad),
|
||||
target(PartTarget::Model),
|
||||
colorSolubility(0.0),
|
||||
metalness(0.0),
|
||||
roughness(1.0),
|
||||
deformMapScale(1.0),
|
||||
hollowThickness(0.0),
|
||||
countershaded(false),
|
||||
|
@ -334,6 +338,14 @@ public:
|
|||
{
|
||||
return fabs(colorSolubility - 0.0) >= 0.01;
|
||||
}
|
||||
bool metalnessAdjusted() const
|
||||
{
|
||||
return fabs(metalness - 0.0) >= 0.01;
|
||||
}
|
||||
bool roughnessAdjusted() const
|
||||
{
|
||||
return fabs(roughness - 1.0) >= 0.01;
|
||||
}
|
||||
bool cutRotationAdjusted() const
|
||||
{
|
||||
return fabs(cutRotation - 0.0) >= 0.01;
|
||||
|
|
|
@ -248,6 +248,8 @@ void TextureGenerator::generate()
|
|||
std::map<QUuid, QColor> partColorMap;
|
||||
std::map<std::pair<QUuid, QUuid>, const OutcomeNode *> nodeMap;
|
||||
std::map<QUuid, float> partColorSolubilityMap;
|
||||
std::map<QUuid, float> partMetalnessMap;
|
||||
std::map<QUuid, float> partRoughnessMap;
|
||||
for (const auto &item: m_outcome->nodes) {
|
||||
if (!m_hasTransparencySettings) {
|
||||
if (!qFuzzyCompare(1.0, item.color.alphaF()))
|
||||
|
@ -256,6 +258,8 @@ void TextureGenerator::generate()
|
|||
nodeMap.insert({{item.partId, item.nodeId}, &item});
|
||||
partColorMap.insert({item.partId, item.color});
|
||||
partColorSolubilityMap.insert({item.partId, item.colorSolubility});
|
||||
partMetalnessMap.insert({item.partId, item.metalness});
|
||||
partRoughnessMap.insert({item.partId, item.roughness});
|
||||
}
|
||||
|
||||
auto createImageBeginTime = countTimeConsumed.elapsed();
|
||||
|
@ -339,6 +343,56 @@ void TextureGenerator::generate()
|
|||
}
|
||||
}
|
||||
|
||||
for (const auto &it: partUvRects) {
|
||||
const auto &partId = it.first;
|
||||
const auto &rects = it.second;
|
||||
auto findMetalnessResult = partMetalnessMap.find(partId);
|
||||
if (findMetalnessResult != partMetalnessMap.end()) {
|
||||
if (qFuzzyCompare(findMetalnessResult->second, (float)0.0))
|
||||
continue;
|
||||
const auto &color = QColor(findMetalnessResult->second * 255,
|
||||
findMetalnessResult->second * 255,
|
||||
findMetalnessResult->second * 255);
|
||||
QBrush brush(color);
|
||||
float fillExpandSize = 2;
|
||||
for (const auto &rect: rects) {
|
||||
QRectF translatedRect = {
|
||||
rect.left() * TextureGenerator::m_textureSize - fillExpandSize,
|
||||
rect.top() * TextureGenerator::m_textureSize - fillExpandSize,
|
||||
rect.width() * TextureGenerator::m_textureSize + fillExpandSize * 2,
|
||||
rect.height() * TextureGenerator::m_textureSize + fillExpandSize * 2
|
||||
};
|
||||
textureMetalnessPainter.fillRect(translatedRect, brush);
|
||||
hasMetalnessMap = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (const auto &it: partUvRects) {
|
||||
const auto &partId = it.first;
|
||||
const auto &rects = it.second;
|
||||
auto findRoughnessResult = partRoughnessMap.find(partId);
|
||||
if (findRoughnessResult != partRoughnessMap.end()) {
|
||||
if (qFuzzyCompare(findRoughnessResult->second, (float)1.0))
|
||||
continue;
|
||||
const auto &color = QColor(findRoughnessResult->second * 255,
|
||||
findRoughnessResult->second * 255,
|
||||
findRoughnessResult->second * 255);
|
||||
QBrush brush(color);
|
||||
float fillExpandSize = 2;
|
||||
for (const auto &rect: rects) {
|
||||
QRectF translatedRect = {
|
||||
rect.left() * TextureGenerator::m_textureSize - fillExpandSize,
|
||||
rect.top() * TextureGenerator::m_textureSize - fillExpandSize,
|
||||
rect.width() * TextureGenerator::m_textureSize + fillExpandSize * 2,
|
||||
rect.height() * TextureGenerator::m_textureSize + fillExpandSize * 2
|
||||
};
|
||||
textureRoughnessPainter.fillRect(translatedRect, brush);
|
||||
hasRoughnessMap = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
auto drawTexture = [&](const std::map<QUuid, std::pair<QPixmap, QPixmap>> &map, QPainter &painter, bool useAlpha) {
|
||||
for (const auto &it: partUvRects) {
|
||||
const auto &partId = it.first;
|
||||
|
@ -629,8 +683,10 @@ void TextureGenerator::generate()
|
|||
}
|
||||
|
||||
hasNormalMap = !m_partNormalTextureMap.empty();
|
||||
hasMetalnessMap = !m_partMetalnessTextureMap.empty();
|
||||
hasRoughnessMap = !m_partRoughnessTextureMap.empty();
|
||||
if (!m_partMetalnessTextureMap.empty())
|
||||
hasMetalnessMap = true;
|
||||
if (!m_partRoughnessTextureMap.empty())
|
||||
hasRoughnessMap = true;
|
||||
hasAmbientOcclusionMap = !m_partAmbientOcclusionTextureMap.empty();
|
||||
|
||||
auto paintTextureEndTime = countTimeConsumed.elapsed();
|
||||
|
|
|
@ -25,7 +25,7 @@ QString TextureTypeToDispName(TextureType type) \
|
|||
case TextureType::Normal: \
|
||||
return QObject::tr("Normal Map"); \
|
||||
case TextureType::Metalness: \
|
||||
return QObject::tr("Metalness"); \
|
||||
return QObject::tr("Metallic"); \
|
||||
case TextureType::Roughness: \
|
||||
return QObject::tr("Roughness"); \
|
||||
case TextureType::AmbientOcclusion: \
|
||||
|
|
84
src/util.cpp
|
@ -510,3 +510,87 @@ void saveAsObj(const char *filename, const std::vector<QVector3D> &vertices,
|
|||
stream << endl;
|
||||
}
|
||||
}
|
||||
|
||||
bool intersectSegmentAndPlane(const QVector3D &segmentPoint0, const QVector3D &segmentPoint1,
|
||||
const QVector3D &pointOnPlane, const QVector3D &planeNormal,
|
||||
QVector3D *intersection)
|
||||
{
|
||||
auto u = segmentPoint1 - segmentPoint0;
|
||||
auto w = segmentPoint0 - pointOnPlane;
|
||||
auto d = QVector3D::dotProduct(planeNormal, u);
|
||||
auto n = QVector3D::dotProduct(-planeNormal, w);
|
||||
if (qAbs(d) < 0.00000001)
|
||||
return false;
|
||||
auto s = n / d;
|
||||
if (s < 0 || s > 1 || qIsNaN(s) || qIsInf(s))
|
||||
return false;
|
||||
if (nullptr != intersection)
|
||||
*intersection = segmentPoint0 + s * u;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool intersectSegmentAndTriangle(const QVector3D &segmentPoint0, const QVector3D &segmentPoint1,
|
||||
const std::vector<QVector3D> &triangle,
|
||||
const QVector3D &triangleNormal,
|
||||
QVector3D *intersection)
|
||||
{
|
||||
QVector3D possibleIntersection;
|
||||
if (!intersectSegmentAndPlane(segmentPoint0, segmentPoint1,
|
||||
triangle[0], triangleNormal, &possibleIntersection)) {
|
||||
return false;
|
||||
}
|
||||
auto ray = (segmentPoint0 - segmentPoint1).normalized();
|
||||
std::vector<QVector3D> normals;
|
||||
for (size_t i = 0; i < 3; ++i) {
|
||||
size_t j = (i + 1) % 3;
|
||||
normals.push_back(QVector3D::normal(possibleIntersection, triangle[i], triangle[j]));
|
||||
}
|
||||
if (QVector3D::dotProduct(normals[0], ray) <= 0)
|
||||
return false;
|
||||
if (QVector3D::dotProduct(normals[0], normals[1]) <= 0)
|
||||
return false;
|
||||
if (QVector3D::dotProduct(normals[0], normals[2]) <= 0)
|
||||
return false;
|
||||
if (nullptr != intersection)
|
||||
*intersection = possibleIntersection;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool intersectRayAndPolyhedron(const QVector3D &rayNear,
|
||||
const QVector3D &rayFar,
|
||||
const std::vector<QVector3D> &vertices,
|
||||
const std::vector<std::vector<size_t>> &triangles,
|
||||
const std::vector<QVector3D> &triangleNormals,
|
||||
QVector3D *intersection)
|
||||
{
|
||||
bool foundPosition = false;
|
||||
auto ray = (rayNear - rayFar).normalized();
|
||||
float minDistance2 = std::numeric_limits<float>::max();
|
||||
for (size_t i = 0; i < triangles.size(); ++i) {
|
||||
const auto &triangleIndices = triangles[i];
|
||||
std::vector<QVector3D> triangle = {
|
||||
vertices[triangleIndices[0]],
|
||||
vertices[triangleIndices[1]],
|
||||
vertices[triangleIndices[2]],
|
||||
};
|
||||
const auto &triangleNormal = triangleNormals[i];
|
||||
if (QVector3D::dotProduct(triangleNormal, ray) <= 0)
|
||||
continue;
|
||||
QVector3D point;
|
||||
if (intersectSegmentAndTriangle(rayNear, rayFar,
|
||||
triangle,
|
||||
triangleNormal,
|
||||
&point)) {
|
||||
float distance2 = (point - rayNear).lengthSquared();
|
||||
if (distance2 < minDistance2) {
|
||||
if (nullptr != intersection)
|
||||
*intersection = point;
|
||||
minDistance2 = distance2;
|
||||
foundPosition = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return foundPosition;
|
||||
}
|
||||
|
||||
|
||||
|
|
13
src/util.h
|
@ -47,5 +47,18 @@ void subdivideFace2D(std::vector<QVector2D> *face);
|
|||
QVector3D choosenBaseAxis(const QVector3D &layoutDirection);
|
||||
void saveAsObj(const char *filename, const std::vector<QVector3D> &vertices,
|
||||
const std::vector<std::vector<size_t>> &faces);
|
||||
bool intersectSegmentAndPlane(const QVector3D &segmentPoint0, const QVector3D &segmentPoint1,
|
||||
const QVector3D &pointOnPlane, const QVector3D &planeNormal,
|
||||
QVector3D *intersection=nullptr);
|
||||
bool intersectSegmentAndTriangle(const QVector3D &segmentPoint0, const QVector3D &segmentPoint1,
|
||||
const std::vector<QVector3D> &triangle,
|
||||
const QVector3D &triangleNormal,
|
||||
QVector3D *intersection=nullptr);
|
||||
bool intersectRayAndPolyhedron(const QVector3D &rayNear,
|
||||
const QVector3D &rayFar,
|
||||
const std::vector<QVector3D> &vertices,
|
||||
const std::vector<std::vector<size_t>> &triangles,
|
||||
const std::vector<QVector3D> &triangleNormals,
|
||||
QVector3D *intersection=nullptr);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -0,0 +1,227 @@
|
|||
#include <QDebug>
|
||||
#include <QQuaternion>
|
||||
#include <QRadialGradient>
|
||||
#include <QBrush>
|
||||
#include <QPainter>
|
||||
#include <QGuiApplication>
|
||||
#include "vertexcolorpainter.h"
|
||||
#include "util.h"
|
||||
#include "imageforever.h"
|
||||
|
||||
const int VertexColorPainter::m_gridSize = 4096;
|
||||
|
||||
PaintColor operator+(const PaintColor &first, const PaintColor &second)
|
||||
{
|
||||
float total = first.alphaF() + second.alphaF();
|
||||
if (qFuzzyIsNull(total))
|
||||
return PaintColor(255, 255, 255, 255);
|
||||
float remaining = second.alphaF() / total;
|
||||
float rate = 1.0 - remaining;
|
||||
PaintColor color(first.red() * rate + second.red() * remaining,
|
||||
first.green() * rate + second.green() * remaining,
|
||||
first.blue() * rate + second.blue() * remaining);
|
||||
color.metalness = first.metalness * rate + second.metalness * remaining;
|
||||
color.roughness = first.roughness * rate + second.roughness * remaining;
|
||||
return color;
|
||||
}
|
||||
|
||||
PaintColor operator-(const PaintColor &first, const PaintColor &second)
|
||||
{
|
||||
PaintColor color = first;
|
||||
color.setAlphaF(std::max(color.alphaF() - second.alphaF(), 0.0));
|
||||
return color;
|
||||
}
|
||||
|
||||
VertexColorPainter::VertexColorPainter(const Outcome &m_outcome, const QVector3D &mouseRayNear, const QVector3D &mouseRayFar) :
|
||||
m_outcome(m_outcome),
|
||||
m_mouseRayNear(mouseRayNear),
|
||||
m_mouseRayFar(mouseRayFar)
|
||||
{
|
||||
}
|
||||
|
||||
Model *VertexColorPainter::takePaintedModel()
|
||||
{
|
||||
Model *paintedModel = m_model;
|
||||
m_model = nullptr;
|
||||
return paintedModel;
|
||||
}
|
||||
|
||||
void VertexColorPainter::setVoxelGrid(VoxelGrid<PaintColor> *voxelGrid)
|
||||
{
|
||||
m_voxelGrid = voxelGrid;
|
||||
m_voxelGrid->setNullValue(PaintColor(255, 255, 255, 255));
|
||||
}
|
||||
|
||||
void VertexColorPainter::setPaintMode(PaintMode paintMode)
|
||||
{
|
||||
m_paintMode = paintMode;
|
||||
}
|
||||
|
||||
void VertexColorPainter::setMaskNodeIds(const std::set<QUuid> &nodeIds)
|
||||
{
|
||||
m_mousePickMaskNodeIds = nodeIds;
|
||||
}
|
||||
|
||||
void VertexColorPainter::setRadius(float radius)
|
||||
{
|
||||
m_radius = radius;
|
||||
}
|
||||
|
||||
void VertexColorPainter::setBrushColor(const QColor &color)
|
||||
{
|
||||
m_brushColor = color;
|
||||
}
|
||||
|
||||
void VertexColorPainter::setBrushMetalness(float value)
|
||||
{
|
||||
m_brushMetalness = value;
|
||||
}
|
||||
|
||||
void VertexColorPainter::setBrushRoughness(float value)
|
||||
{
|
||||
m_brushRoughness = value;
|
||||
}
|
||||
|
||||
VertexColorPainter::~VertexColorPainter()
|
||||
{
|
||||
delete m_model;
|
||||
}
|
||||
|
||||
bool VertexColorPainter::calculateMouseModelPosition(QVector3D &mouseModelPosition)
|
||||
{
|
||||
return intersectRayAndPolyhedron(m_mouseRayNear,
|
||||
m_mouseRayFar,
|
||||
m_outcome.vertices,
|
||||
m_outcome.triangles,
|
||||
m_outcome.triangleNormals,
|
||||
&mouseModelPosition);
|
||||
}
|
||||
|
||||
void VertexColorPainter::paintToVoxelGrid()
|
||||
{
|
||||
int voxelX = toVoxelLength(m_targetPosition.x());
|
||||
int voxelY = toVoxelLength(m_targetPosition.y());
|
||||
int voxelZ = toVoxelLength(m_targetPosition.z());
|
||||
int voxelRadius = toVoxelLength(m_radius);
|
||||
int range2 = voxelRadius * voxelRadius;
|
||||
PaintColor paintColor(m_brushColor);
|
||||
paintColor.metalness = m_brushMetalness;
|
||||
paintColor.roughness = m_brushRoughness;
|
||||
m_voxelGrid->add(voxelX, voxelY, voxelZ, paintColor);
|
||||
for (int i = -voxelRadius; i <= voxelRadius; ++i) {
|
||||
qint8 x = voxelX + i;
|
||||
int i2 = i * i;
|
||||
for (int j = -voxelRadius; j <= voxelRadius; ++j) {
|
||||
qint8 y = voxelY + j;
|
||||
int j2 = j * j;
|
||||
for (int k = -voxelRadius; k <= voxelRadius; ++k) {
|
||||
qint8 z = voxelZ + k;
|
||||
int k2 = k * k;
|
||||
int dist2 = i2 + j2 + k2;
|
||||
if (dist2 <= range2) {
|
||||
int dist = std::sqrt(dist2);
|
||||
float alpha = 1.0 - (float)dist / voxelRadius;
|
||||
qDebug() << "alpha:" << alpha;
|
||||
PaintColor color = paintColor;
|
||||
color.setAlphaF(alpha);
|
||||
m_voxelGrid->add(x, y, z, color);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void VertexColorPainter::createPaintedModel()
|
||||
{
|
||||
std::vector<PaintColor> vertexColors(m_outcome.vertices.size());
|
||||
for (size_t i = 0; i < m_outcome.vertices.size(); ++i) {
|
||||
const auto &position = m_outcome.vertices[i];
|
||||
int voxelX = toVoxelLength(position.x());
|
||||
int voxelY = toVoxelLength(position.y());
|
||||
int voxelZ = toVoxelLength(position.z());
|
||||
vertexColors[i] = m_voxelGrid->query(voxelX, voxelY, voxelZ);
|
||||
}
|
||||
|
||||
int triangleVertexCount = m_outcome.triangles.size() * 3;
|
||||
ShaderVertex *triangleVertices = new ShaderVertex[triangleVertexCount];
|
||||
int destIndex = 0;
|
||||
const auto triangleVertexNormals = m_outcome.triangleVertexNormals();
|
||||
const auto triangleVertexUvs = m_outcome.triangleVertexUvs();
|
||||
const auto triangleTangents = m_outcome.triangleTangents();
|
||||
const QVector3D defaultNormal = QVector3D(0, 0, 0);
|
||||
const QVector2D defaultUv = QVector2D(0, 0);
|
||||
const QVector3D defaultTangent = QVector3D(0, 0, 0);
|
||||
for (size_t i = 0; i < m_outcome.triangles.size(); ++i) {
|
||||
for (auto j = 0; j < 3; j++) {
|
||||
int vertexIndex = m_outcome.triangles[i][j];
|
||||
const auto &vertexColor = &vertexColors[vertexIndex];
|
||||
const QVector3D *srcVert = &m_outcome.vertices[vertexIndex];
|
||||
const QVector3D *srcNormal = &defaultNormal;
|
||||
if (triangleVertexNormals)
|
||||
srcNormal = &(*triangleVertexNormals)[i][j];
|
||||
const QVector2D *srcUv = &defaultUv;
|
||||
if (triangleVertexUvs)
|
||||
srcUv = &(*triangleVertexUvs)[i][j];
|
||||
const QVector3D *srcTangent = &defaultTangent;
|
||||
if (triangleTangents)
|
||||
srcTangent = &(*triangleTangents)[i];
|
||||
ShaderVertex *dest = &triangleVertices[destIndex];
|
||||
dest->colorR = vertexColor->redF();
|
||||
dest->colorG = vertexColor->greenF();
|
||||
dest->colorB = vertexColor->blueF();
|
||||
dest->alpha = vertexColor->alphaF();
|
||||
dest->posX = srcVert->x();
|
||||
dest->posY = srcVert->y();
|
||||
dest->posZ = srcVert->z();
|
||||
dest->texU = srcUv->x();
|
||||
dest->texV = srcUv->y();
|
||||
dest->normX = srcNormal->x();
|
||||
dest->normY = srcNormal->y();
|
||||
dest->normZ = srcNormal->z();
|
||||
dest->metalness = vertexColor->metalness;
|
||||
dest->roughness = vertexColor->roughness;
|
||||
dest->tangentX = srcTangent->x();
|
||||
dest->tangentY = srcTangent->y();
|
||||
dest->tangentZ = srcTangent->z();
|
||||
destIndex++;
|
||||
}
|
||||
}
|
||||
m_model = new Model(triangleVertices, triangleVertexCount);
|
||||
}
|
||||
|
||||
int VertexColorPainter::toVoxelLength(float length)
|
||||
{
|
||||
int voxelLength = length * 100;
|
||||
if (voxelLength > m_gridSize)
|
||||
voxelLength = m_gridSize;
|
||||
else if (voxelLength < -m_gridSize)
|
||||
voxelLength = -m_gridSize;
|
||||
return voxelLength;
|
||||
}
|
||||
|
||||
void VertexColorPainter::paint()
|
||||
{
|
||||
if (!calculateMouseModelPosition(m_targetPosition))
|
||||
return;
|
||||
|
||||
if (PaintMode::None == m_paintMode)
|
||||
return;
|
||||
|
||||
if (nullptr == m_voxelGrid)
|
||||
return;
|
||||
|
||||
paintToVoxelGrid();
|
||||
createPaintedModel();
|
||||
}
|
||||
|
||||
void VertexColorPainter::process()
|
||||
{
|
||||
paint();
|
||||
|
||||
emit finished();
|
||||
}
|
||||
|
||||
const QVector3D &VertexColorPainter::targetPosition()
|
||||
{
|
||||
return m_targetPosition;
|
||||
}
|
|
@ -0,0 +1,81 @@
|
|||
#ifndef DUST3D_VERTEX_COLOR_PAINTER_H
|
||||
#define DUST3D_VERTEX_COLOR_PAINTER_H
|
||||
#include <QObject>
|
||||
#include <QVector3D>
|
||||
#include <vector>
|
||||
#include <map>
|
||||
#include <set>
|
||||
#include <QColor>
|
||||
#include "outcome.h"
|
||||
#include "paintmode.h"
|
||||
#include "voxelgrid.h"
|
||||
#include "model.h"
|
||||
|
||||
class PaintColor : public QColor
|
||||
{
|
||||
public:
|
||||
float metalness = Model::m_defaultMetalness;
|
||||
float roughness = Model::m_defaultRoughness;
|
||||
|
||||
PaintColor() :
|
||||
QColor()
|
||||
{
|
||||
}
|
||||
|
||||
PaintColor(int r, int g, int b, int a = 255) :
|
||||
QColor(r, g, b, a)
|
||||
{
|
||||
}
|
||||
|
||||
PaintColor(const QColor &color) :
|
||||
QColor(color)
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
PaintColor operator+(const PaintColor &first, const PaintColor &second);
|
||||
PaintColor operator-(const PaintColor &first, const PaintColor &second);
|
||||
|
||||
class VertexColorPainter : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
VertexColorPainter(const Outcome &outcome, const QVector3D &mouseRayNear, const QVector3D &mouseRayFar);
|
||||
void setRadius(float radius);
|
||||
void setBrushColor(const QColor &color);
|
||||
void setBrushMetalness(float value);
|
||||
void setBrushRoughness(float value);
|
||||
void setPaintMode(PaintMode paintMode);
|
||||
void setMaskNodeIds(const std::set<QUuid> &nodeIds);
|
||||
void setVoxelGrid(VoxelGrid<PaintColor> *voxelGrid);
|
||||
|
||||
~VertexColorPainter();
|
||||
Model *takePaintedModel();
|
||||
const QVector3D &targetPosition();
|
||||
signals:
|
||||
void finished();
|
||||
public slots:
|
||||
void process();
|
||||
void paint();
|
||||
private:
|
||||
float m_radius = 0.0;
|
||||
PaintMode m_paintMode = PaintMode::None;
|
||||
std::set<QUuid> m_mousePickMaskNodeIds;
|
||||
Outcome m_outcome;
|
||||
QVector3D m_mouseRayNear;
|
||||
QVector3D m_mouseRayFar;
|
||||
QVector3D m_targetPosition;
|
||||
QColor m_brushColor;
|
||||
float m_brushMetalness = Model::m_defaultMetalness;
|
||||
float m_brushRoughness = Model::m_defaultRoughness;
|
||||
VoxelGrid<PaintColor> *m_voxelGrid = nullptr;
|
||||
Model *m_model = nullptr;
|
||||
bool calculateMouseModelPosition(QVector3D &mouseModelPosition);
|
||||
void paintToVoxelGrid();
|
||||
int toVoxelLength(float length);
|
||||
void createPaintedModel();
|
||||
public:
|
||||
static const int m_gridSize;
|
||||
};
|
||||
|
||||
#endif
|
|
@ -0,0 +1 @@
|
|||
#include "voxelgrid.h"
|
|
@ -0,0 +1,85 @@
|
|||
#ifndef DUST3D_VOXEL_GRID_H
|
||||
#define DUST3D_VOXEL_GRID_H
|
||||
#include <QtGlobal>
|
||||
#include <unordered_map>
|
||||
|
||||
template<typename T>
|
||||
class VoxelGrid
|
||||
{
|
||||
public:
|
||||
struct Voxel
|
||||
{
|
||||
qint16 x;
|
||||
qint16 y;
|
||||
qint16 z;
|
||||
};
|
||||
|
||||
struct VoxelHash
|
||||
{
|
||||
size_t operator()(const Voxel &voxel) const
|
||||
{
|
||||
return ((size_t)voxel.x ^ ((size_t)voxel.y << 1)) ^ (size_t)voxel.z;
|
||||
}
|
||||
};
|
||||
|
||||
struct VoxelEqual
|
||||
{
|
||||
bool operator()(const Voxel &left, const Voxel &right) const
|
||||
{
|
||||
return (left.x == right.x) &&
|
||||
(left.y == right.y) &&
|
||||
(left.z == right.z);
|
||||
}
|
||||
};
|
||||
|
||||
T query(qint16 x, qint16 y, qint16 z)
|
||||
{
|
||||
auto findResult = m_grid.find({x, y, z});
|
||||
if (findResult == m_grid.end())
|
||||
return m_nullValue;
|
||||
return findResult->second;
|
||||
}
|
||||
|
||||
T add(qint16 x, qint16 y, qint16 z, T value)
|
||||
{
|
||||
auto insertResult = m_grid.insert(std::make_pair(Voxel {x, y, z}, value));
|
||||
if (insertResult.second) {
|
||||
insertResult.first->second = m_nullValue + value;
|
||||
return insertResult.first->second;
|
||||
}
|
||||
insertResult.first->second = insertResult.first->second + value;
|
||||
return insertResult.first->second;
|
||||
}
|
||||
|
||||
T sub(qint16 x, qint16 y, qint16 z, T value)
|
||||
{
|
||||
auto findResult = m_grid.find({x, y, z});
|
||||
if (findResult == m_grid.end())
|
||||
return m_nullValue;
|
||||
findResult->second = findResult->second - value;
|
||||
if (findResult->second == m_nullValue) {
|
||||
m_grid.erase(findResult);
|
||||
return m_nullValue;
|
||||
}
|
||||
return findResult->second;
|
||||
}
|
||||
|
||||
void reset(qint16 x, qint16 y, qint16 z)
|
||||
{
|
||||
auto findResult = m_grid.find({x, y, z});
|
||||
if (findResult == m_grid.end())
|
||||
return;
|
||||
m_grid.erase(findResult);
|
||||
}
|
||||
|
||||
void setNullValue(const T &nullValue)
|
||||
{
|
||||
m_nullValue = nullValue;
|
||||
}
|
||||
|
||||
private:
|
||||
std::unordered_map<Voxel, T, VoxelHash, VoxelEqual> m_grid;
|
||||
T m_nullValue = T();
|
||||
};
|
||||
|
||||
#endif
|
|
@ -0,0 +1 @@
|
|||
build/
|
|
@ -0,0 +1,171 @@
|
|||
#
|
||||
# Copyright (C) 2013-2020 Mattia Basaglia
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Lesser General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
|
||||
cmake_minimum_required (VERSION 3.1 FATAL_ERROR)
|
||||
|
||||
set(COLORWIDGET_PROJECT_NAME QtColorWidgets)
|
||||
project(${COLORWIDGET_PROJECT_NAME} CXX)
|
||||
|
||||
|
||||
set (CMAKE_MODULE_PATH
|
||||
${CMAKE_MODULE_PATH}
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules
|
||||
${CMAKE_CURRENT_LIST_DIR})
|
||||
|
||||
|
||||
include (CheckCXXCompilerFlag)
|
||||
|
||||
include (cmake/install.cmake)
|
||||
include (cmake/qt-configuration.cmake)
|
||||
include (cmake/versioning.cmake)
|
||||
|
||||
|
||||
SET (${COLORWIDGET_PROJECT_NAME}_VERSION_MAJOR 2)
|
||||
SET (${COLORWIDGET_PROJECT_NAME}_VERSION_MINOR 1)
|
||||
SET (${COLORWIDGET_PROJECT_NAME}_VERSION_PATCH 0)
|
||||
SET (${COLORWIDGET_PROJECT_NAME}_VERSION "${${COLORWIDGET_PROJECT_NAME}_VERSION_MAJOR}.${${COLORWIDGET_PROJECT_NAME}_VERSION_MINOR}.${${COLORWIDGET_PROJECT_NAME}_VERSION_PATCH}")
|
||||
|
||||
|
||||
set (QT_SUPPORTED_VERSIONS 5)
|
||||
|
||||
select_qt (
|
||||
QT_SUPPORTED_VERSIONS "${QT_SUPPORTED_VERSIONS}"
|
||||
QT_DEFAULT_VERSION 5)
|
||||
|
||||
set (REQUIRED_QT_COMPONENTS
|
||||
Widgets
|
||||
)
|
||||
find_qt (
|
||||
QT_SUPPORTED_VERSIONS "${QT_SUPPORTED_VERSIONS}"
|
||||
REQUIRED_COMPONENTS "${REQUIRED_QT_COMPONENTS}"
|
||||
OPTIONAL_COMPONENTS "")
|
||||
|
||||
# Auto generate moc files
|
||||
set(CMAKE_AUTOMOC ON)
|
||||
# Auto generate moc files
|
||||
set(CMAKE_AUTOUIC ON)
|
||||
# Auto generate moc files
|
||||
set(CMAKE_AUTORCC ON)
|
||||
|
||||
|
||||
option(BUILD_SHARED_LIBS "Build the shared library" ON)
|
||||
option(BUILD_STATIC_LIBS "Build the static library" OFF)
|
||||
|
||||
set (TARGET_NAME ${COLORWIDGET_PROJECT_NAME})
|
||||
set (TARGET_OUTPUT_SUFFIX "-Qt${QT_VERSION}${${COLORWIDGET_PROJECT_NAME}_VERSION_MAJOR}")
|
||||
set (INCLUDE_PREFIX "QtColorWidgets")
|
||||
set (COLOR_WIDGETS_LIBRARY "${TARGET_NAME}")
|
||||
|
||||
if ( ${BUILD_STATIC_LIBS} )
|
||||
add_definitions(-DQTCOLORWIDGETS_STATICALLY_LINKED)
|
||||
endif()
|
||||
|
||||
|
||||
add_library (${TARGET_NAME} "")
|
||||
set_target_properties(${TARGET_NAME}
|
||||
PROPERTIES
|
||||
EXPORT_NAME "${TARGET_NAME}${TARGET_OUTPUT_SUFFIX}")
|
||||
|
||||
|
||||
set_target_properties (${TARGET_NAME}
|
||||
PROPERTIES
|
||||
CXX_STANDARD 11
|
||||
CXX_STANDARD_REQUIRED ON
|
||||
VERSION ${${COLORWIDGET_PROJECT_NAME}_VERSION}
|
||||
SOVERSION ${${COLORWIDGET_PROJECT_NAME}_VERSION_MAJOR}
|
||||
"INTERFACE_${COLORWIDGET_PROJECT_NAME}_MAJOR_VERSION" ${${COLORWIDGET_PROJECT_NAME}_VERSION_MAJOR}
|
||||
COMPATIBLE_INTERFACE_STRING "${COLORWIDGET_PROJECT_NAME}_MAJOR_VERSION"
|
||||
COMPILE_DEFINITIONS QTCOLORWIDGETS_LIBRARY
|
||||
OUTPUT_NAME "${TARGET_NAME}${TARGET_OUTPUT_SUFFIX}")
|
||||
|
||||
check_cxx_compiler_flag ("-Wall" Wall_FLAG_SUPPORTED)
|
||||
|
||||
if (Wall_FLAG_SUPPORTED)
|
||||
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall")
|
||||
endif (Wall_FLAG_SUPPORTED)
|
||||
|
||||
check_cxx_compiler_flag ("-pedantic" pedantic_FLAG_SUPPORTED)
|
||||
|
||||
if (pedantic_FLAG_SUPPORTED)
|
||||
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -pedantic")
|
||||
endif (pedantic_FLAG_SUPPORTED)
|
||||
|
||||
check_cxx_compiler_flag ("-Wextra" Wextra_FLAG_SUPPORTED)
|
||||
|
||||
if (Wextra_FLAG_SUPPORTED)
|
||||
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wextra")
|
||||
endif (Wextra_FLAG_SUPPORTED)
|
||||
|
||||
|
||||
set (EXPORT_HEADER "${INCLUDE_PREFIX}/colorwidgets_global.hpp")
|
||||
|
||||
|
||||
generate_versioning_information (
|
||||
TARGET_NAME ${TARGET_NAME}
|
||||
EXPORT_HEADER ${EXPORT_HEADER}
|
||||
EXPORT_MACRO QCP_EXPORT
|
||||
VERSIONED_ENTITY ${COLORWIDGET_PROJECT_NAME}
|
||||
INCLUDE_PREFIX ${INCLUDE_PREFIX}
|
||||
COMPANY_NAME "Mattia Basaglia"
|
||||
COMPANY_COPYRIGHT "Mattia Basaglia Copyright (C) 2013-2017"
|
||||
FILE_DESCRIPTION "Color wheel widget and dialog for Qt${QT_VERSION}"
|
||||
)
|
||||
|
||||
|
||||
target_include_directories(${TARGET_NAME}
|
||||
PUBLIC
|
||||
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
|
||||
$<INSTALL_INTERFACE:include>
|
||||
PUBLIC
|
||||
$<BUILD_INTERFACE:${PROJECT_BINARY_DIR}>
|
||||
$<INSTALL_INTERFACE:include>
|
||||
)
|
||||
|
||||
|
||||
add_subdirectory (${CMAKE_CURRENT_SOURCE_DIR}/include/${INCLUDE_PREFIX})
|
||||
add_subdirectory (${CMAKE_CURRENT_SOURCE_DIR}/resources/${INCLUDE_PREFIX})
|
||||
add_subdirectory (${CMAKE_CURRENT_SOURCE_DIR}/src/${INCLUDE_PREFIX})
|
||||
|
||||
|
||||
use_qt (
|
||||
TARGET_NAME ${TARGET_NAME}
|
||||
QT_SUPPORTED_VERSIONS "${QT_SUPPORTED_VERSIONS}"
|
||||
REQUIRED_COMPONENTS "${REQUIRED_QT_COMPONENTS}"
|
||||
OPTIONAL_COMPONENTS "")
|
||||
|
||||
|
||||
install_project (
|
||||
PROJECT_NAME ${COLORWIDGET_PROJECT_NAME}
|
||||
TARGET_NAME ${TARGET_NAME}
|
||||
TARGET_OUTPUT_SUFFIX ${TARGET_OUTPUT_SUFFIX}
|
||||
EXPORT_HEADER ${EXPORT_HEADER}
|
||||
INCLUDE_PREFIX ${INCLUDE_PREFIX}
|
||||
HEADER_MATCHING_REGEX "^.*\.h$|^.*\.hpp$|^.*$"
|
||||
VERSION_HEADER ${CMAKE_CURRENT_BINARY_DIR}/${COLORWIDGET_PROJECT_NAME}_version.h
|
||||
NAMESPACE "")
|
||||
|
||||
|
||||
add_subdirectory (gallery)
|
||||
|
||||
option(QTCOLORWIDGETS_DESIGNER_PLUGIN "Build QtDesigner plugin" ON)
|
||||
if (${QTCOLORWIDGETS_DESIGNER_PLUGIN})
|
||||
find_package (Qt5Designer QUIET)
|
||||
if (Qt5Designer_FOUND)
|
||||
add_subdirectory (color_widgets_designer_plugin)
|
||||
endif(Qt5Designer_FOUND)
|
||||
endif()
|
|
@ -0,0 +1,165 @@
|
|||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
|
||||
This version of the GNU Lesser General Public License incorporates
|
||||
the terms and conditions of version 3 of the GNU General Public
|
||||
License, supplemented by the additional permissions listed below.
|
||||
|
||||
0. Additional Definitions.
|
||||
|
||||
As used herein, "this License" refers to version 3 of the GNU Lesser
|
||||
General Public License, and the "GNU GPL" refers to version 3 of the GNU
|
||||
General Public License.
|
||||
|
||||
"The Library" refers to a covered work governed by this License,
|
||||
other than an Application or a Combined Work as defined below.
|
||||
|
||||
An "Application" is any work that makes use of an interface provided
|
||||
by the Library, but which is not otherwise based on the Library.
|
||||
Defining a subclass of a class defined by the Library is deemed a mode
|
||||
of using an interface provided by the Library.
|
||||
|
||||
A "Combined Work" is a work produced by combining or linking an
|
||||
Application with the Library. The particular version of the Library
|
||||
with which the Combined Work was made is also called the "Linked
|
||||
Version".
|
||||
|
||||
The "Minimal Corresponding Source" for a Combined Work means the
|
||||
Corresponding Source for the Combined Work, excluding any source code
|
||||
for portions of the Combined Work that, considered in isolation, are
|
||||
based on the Application, and not on the Linked Version.
|
||||
|
||||
The "Corresponding Application Code" for a Combined Work means the
|
||||
object code and/or source code for the Application, including any data
|
||||
and utility programs needed for reproducing the Combined Work from the
|
||||
Application, but excluding the System Libraries of the Combined Work.
|
||||
|
||||
1. Exception to Section 3 of the GNU GPL.
|
||||
|
||||
You may convey a covered work under sections 3 and 4 of this License
|
||||
without being bound by section 3 of the GNU GPL.
|
||||
|
||||
2. Conveying Modified Versions.
|
||||
|
||||
If you modify a copy of the Library, and, in your modifications, a
|
||||
facility refers to a function or data to be supplied by an Application
|
||||
that uses the facility (other than as an argument passed when the
|
||||
facility is invoked), then you may convey a copy of the modified
|
||||
version:
|
||||
|
||||
a) under this License, provided that you make a good faith effort to
|
||||
ensure that, in the event an Application does not supply the
|
||||
function or data, the facility still operates, and performs
|
||||
whatever part of its purpose remains meaningful, or
|
||||
|
||||
b) under the GNU GPL, with none of the additional permissions of
|
||||
this License applicable to that copy.
|
||||
|
||||
3. Object Code Incorporating Material from Library Header Files.
|
||||
|
||||
The object code form of an Application may incorporate material from
|
||||
a header file that is part of the Library. You may convey such object
|
||||
code under terms of your choice, provided that, if the incorporated
|
||||
material is not limited to numerical parameters, data structure
|
||||
layouts and accessors, or small macros, inline functions and templates
|
||||
(ten or fewer lines in length), you do both of the following:
|
||||
|
||||
a) Give prominent notice with each copy of the object code that the
|
||||
Library is used in it and that the Library and its use are
|
||||
covered by this License.
|
||||
|
||||
b) Accompany the object code with a copy of the GNU GPL and this license
|
||||
document.
|
||||
|
||||
4. Combined Works.
|
||||
|
||||
You may convey a Combined Work under terms of your choice that,
|
||||
taken together, effectively do not restrict modification of the
|
||||
portions of the Library contained in the Combined Work and reverse
|
||||
engineering for debugging such modifications, if you also do each of
|
||||
the following:
|
||||
|
||||
a) Give prominent notice with each copy of the Combined Work that
|
||||
the Library is used in it and that the Library and its use are
|
||||
covered by this License.
|
||||
|
||||
b) Accompany the Combined Work with a copy of the GNU GPL and this license
|
||||
document.
|
||||
|
||||
c) For a Combined Work that displays copyright notices during
|
||||
execution, include the copyright notice for the Library among
|
||||
these notices, as well as a reference directing the user to the
|
||||
copies of the GNU GPL and this license document.
|
||||
|
||||
d) Do one of the following:
|
||||
|
||||
0) Convey the Minimal Corresponding Source under the terms of this
|
||||
License, and the Corresponding Application Code in a form
|
||||
suitable for, and under terms that permit, the user to
|
||||
recombine or relink the Application with a modified version of
|
||||
the Linked Version to produce a modified Combined Work, in the
|
||||
manner specified by section 6 of the GNU GPL for conveying
|
||||
Corresponding Source.
|
||||
|
||||
1) Use a suitable shared library mechanism for linking with the
|
||||
Library. A suitable mechanism is one that (a) uses at run time
|
||||
a copy of the Library already present on the user's computer
|
||||
system, and (b) will operate properly with a modified version
|
||||
of the Library that is interface-compatible with the Linked
|
||||
Version.
|
||||
|
||||
e) Provide Installation Information, but only if you would otherwise
|
||||
be required to provide such information under section 6 of the
|
||||
GNU GPL, and only to the extent that such information is
|
||||
necessary to install and execute a modified version of the
|
||||
Combined Work produced by recombining or relinking the
|
||||
Application with a modified version of the Linked Version. (If
|
||||
you use option 4d0, the Installation Information must accompany
|
||||
the Minimal Corresponding Source and Corresponding Application
|
||||
Code. If you use option 4d1, you must provide the Installation
|
||||
Information in the manner specified by section 6 of the GNU GPL
|
||||
for conveying Corresponding Source.)
|
||||
|
||||
5. Combined Libraries.
|
||||
|
||||
You may place library facilities that are a work based on the
|
||||
Library side by side in a single library together with other library
|
||||
facilities that are not Applications and are not covered by this
|
||||
License, and convey such a combined library under terms of your
|
||||
choice, if you do both of the following:
|
||||
|
||||
a) Accompany the combined library with a copy of the same work based
|
||||
on the Library, uncombined with any other library facilities,
|
||||
conveyed under the terms of this License.
|
||||
|
||||
b) Give prominent notice with the combined library that part of it
|
||||
is a work based on the Library, and explaining where to find the
|
||||
accompanying uncombined form of the same work.
|
||||
|
||||
6. Revised Versions of the GNU Lesser General Public License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions
|
||||
of the GNU Lesser General Public License from time to time. Such new
|
||||
versions will be similar in spirit to the present version, but may
|
||||
differ in detail to address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Library as you received it specifies that a certain numbered version
|
||||
of the GNU Lesser General Public License "or any later version"
|
||||
applies to it, you have the option of following the terms and
|
||||
conditions either of that published version or of any later version
|
||||
published by the Free Software Foundation. If the Library as you
|
||||
received it does not specify a version number of the GNU Lesser
|
||||
General Public License, you may choose any version of the GNU Lesser
|
||||
General Public License ever published by the Free Software Foundation.
|
||||
|
||||
If the Library as you received it specifies that a proxy can decide
|
||||
whether future versions of the GNU Lesser General Public License shall
|
||||
apply, that proxy's public statement of acceptance of any version is
|
||||
permanent authorization for you to choose that version for the
|
||||
Library.
|
|
@ -0,0 +1,14 @@
|
|||
Linking this library statically or dynamically with other modules is making a
|
||||
combined work based on this library. Thus, the terms and conditions of the
|
||||
GNU Lesser General Public License version 3 cover the whole combination.
|
||||
|
||||
As a special exception, the copyright holders of this library give you
|
||||
permission to combine this library with independent
|
||||
modules to produce an executable, and to copy and distribute the resulting
|
||||
executable under terms of any of the GNU General Public licenses, as published
|
||||
by the Free Software Foundation, provided that you also meet,
|
||||
for each linked independent module, the terms and conditions of the license of
|
||||
that module. An independent module is a module which is not derived from or
|
||||
based on this library. If you modify this library, you may extend this
|
||||
exception to your version of the library, but you are not obliged to do so.
|
||||
If you do not wish to do so, delete this exception statement from your version.
|
|
@ -0,0 +1,10 @@
|
|||
prefix=@CMAKE_INSTALL_PREFIX@
|
||||
exec_prefix=${prefix}
|
||||
libdir=@CMAKE_INSTALL_LIBDIR@
|
||||
includedir=${prefix}/include
|
||||
|
||||
Name: QtColorWidgets
|
||||
Description: Color wheel widget and dialog for Qt
|
||||
Version: @QtColorWidgets_VERSION@
|
||||
Libs: -L${libdir} -l@i_target_name@@i_target_output_suffix@
|
||||
Cflags: -I${includedir}/@i_project_name@ -I${includedir}
|
|
@ -0,0 +1,66 @@
|
|||
Color Widgets
|
||||
=============
|
||||
|
||||
Here is a color dialog that is more user-friendly than the default QColorDialog
|
||||
and several other color-related widgets
|
||||
|
||||
The provided widgets are:
|
||||
|
||||
* ColorWheel, An analog widget used to select a color
|
||||
* ColorPreview, A simple widget that displays a color
|
||||
* GradientSlider, A slider that has a gradient background
|
||||
* HueSlider, A variant of GradientSlider that has a rainbow background
|
||||
* ColorSelector, A ColorPreview that shows a ColorDialog when clicked
|
||||
* ColorDialog, A dialog that uses the above widgets to provide a better user experience than QColorDialog
|
||||
* ColorListWidget, A widget to edit a list of colors
|
||||
* Swatch, A widget to display a color palette
|
||||
* ColorPaletteWidget, A widget to use and manage a list of palettes
|
||||
* Color2DSlider, An analog widget used to select 2 color components
|
||||
* ColorLineEdit, A widget to manipulate a string representing a color
|
||||
* HarmonyColorWheel, A ColorWheel which allows defining multiple colors, separated by hue
|
||||
* GradientListModel, A QAbstractListModel used to list gradients (useful for combo boxes, list views and the like)
|
||||
|
||||
they are all in the color_widgets namespace.
|
||||
|
||||
See [the gallery](gallery/README.md) for more information and screenshots.
|
||||
|
||||
|
||||
Using it in a project
|
||||
---------------------
|
||||
|
||||
For QMake-based projects, include color_widgets.pri in the QMake project file.
|
||||
For CMake-based projects, add this as subdirectory, it will be compiled as a
|
||||
library and you can link the required targets to ColorWidgets.
|
||||
All the required files are in ./src and ./include.
|
||||
|
||||
|
||||
Installing as a Qt Designer/Creator Plugin
|
||||
------------------------------------------
|
||||
|
||||
The sources for the designer plugin are in ./color_widgets_designer_plugin
|
||||
|
||||
Compile the library and install in
|
||||
(Qt SDK)/Tools/QtCreator/bin/designer/
|
||||
(Qt SDK)/(Qt Version)/(Toolchain)/plugins/designer
|
||||
|
||||
mkdir build && cd build && cmake .. && make QtColorWidgetsPlugin && make install
|
||||
|
||||
|
||||
Latest Version
|
||||
--------------
|
||||
|
||||
The latest version of the sources can be found at the following locations:
|
||||
|
||||
* https://gitlab.com/mattia.basaglia/Qt-Color-Widgets
|
||||
* git://gitlab.com/mattia.basaglia/Qt-Color-Widgets.git
|
||||
|
||||
|
||||
License
|
||||
-------
|
||||
|
||||
LGPLv3+, See COPYING.
|
||||
As a special exception, this library can be included in any project under the
|
||||
terms of any of the GNU liceses, distributing the whole project under a
|
||||
different GNU license, see LICENSE-EXCEPTION for details.
|
||||
|
||||
Copyright (C) 2013-2020 Mattia Basaglia <dev@dragon.best>
|
|
@ -0,0 +1 @@
|
|||
include("${CMAKE_CURRENT_LIST_DIR}/@CMAKE_BASE_FILE_NAME@@CMAKE_FILE_OUTPUT_SUFFIX@-targets.cmake")
|
|
@ -0,0 +1,88 @@
|
|||
function (install_project
|
||||
PROJECT_NAME i_project_name
|
||||
TARGET_NAME i_target_name
|
||||
TARGET_OUTPUT_SUFFIX i_target_output_suffix
|
||||
EXPORT_HEADER i_export_header
|
||||
INCLUDE_PREFIX i_include_prefix
|
||||
HEADER_MATCHING_REGEX i_header_matching_regex
|
||||
VERSION_HEADER i_version_header
|
||||
NAMESPACE i_namespace)
|
||||
install (TARGETS ${i_target_name}
|
||||
EXPORT ${i_target_name}
|
||||
RUNTIME DESTINATION bin
|
||||
INCLUDES DESTINATION include
|
||||
ARCHIVE DESTINATION lib
|
||||
LIBRARY DESTINATION lib)
|
||||
|
||||
install (DIRECTORY include/
|
||||
DESTINATION include
|
||||
FILES_MATCHING
|
||||
REGEX ${i_header_matching_regex}
|
||||
REGEX "CMakeLists\.txt" EXCLUDE)
|
||||
|
||||
install (FILES ${i_version_header}
|
||||
DESTINATION include/${i_include_prefix}
|
||||
COMPONENT Devel)
|
||||
|
||||
install (FILES include/${i_export_header}
|
||||
DESTINATION include/${i_include_prefix}
|
||||
COMPONENT Devel)
|
||||
|
||||
install(
|
||||
EXPORT ${i_target_name}
|
||||
DESTINATION lib/cmake/${i_target_name}${i_target_output_suffix}
|
||||
FILE "${i_target_name}${i_target_output_suffix}.cmake"
|
||||
COMPONENT Devel)
|
||||
|
||||
|
||||
include(CMakePackageConfigHelpers)
|
||||
|
||||
string (TOLOWER ${i_target_name} CMAKE_BASE_FILE_NAME)
|
||||
string (TOLOWER ${i_target_output_suffix} CMAKE_FILE_OUTPUT_SUFFIX)
|
||||
|
||||
write_basic_package_version_file(
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/${i_target_name}/${CMAKE_BASE_FILE_NAME}${CMAKE_FILE_OUTPUT_SUFFIX}-config-version.cmake"
|
||||
VERSION ${${i_project_name}_VERSION}
|
||||
COMPATIBILITY SameMajorVersion
|
||||
)
|
||||
|
||||
export(EXPORT ${i_target_name}
|
||||
FILE "${CMAKE_CURRENT_BINARY_DIR}/${i_target_name}/${CMAKE_BASE_FILE_NAME}${CMAKE_FILE_OUTPUT_SUFFIX}-targets.cmake"
|
||||
)
|
||||
|
||||
configure_file("cmake/${i_project_name}-config.cmake"
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/${i_target_name}/${CMAKE_BASE_FILE_NAME}${CMAKE_FILE_OUTPUT_SUFFIX}-config.cmake"
|
||||
@ONLY
|
||||
)
|
||||
|
||||
set(ConfigPackageLocation "lib/cmake/${i_target_name}${i_target_output_suffix}")
|
||||
install(EXPORT ${i_target_name}
|
||||
FILE
|
||||
"${CMAKE_BASE_FILE_NAME}${CMAKE_FILE_OUTPUT_SUFFIX}-targets.cmake"
|
||||
NAMESPACE
|
||||
"${i_namespace}"
|
||||
DESTINATION
|
||||
${ConfigPackageLocation}
|
||||
)
|
||||
install(
|
||||
FILES
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/${i_target_name}/${CMAKE_BASE_FILE_NAME}${CMAKE_FILE_OUTPUT_SUFFIX}-config.cmake"
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/${i_target_name}/${CMAKE_BASE_FILE_NAME}${CMAKE_FILE_OUTPUT_SUFFIX}-config-version.cmake"
|
||||
DESTINATION
|
||||
${ConfigPackageLocation}
|
||||
COMPONENT
|
||||
Devel
|
||||
)
|
||||
|
||||
configure_file(
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/${i_project_name}.pc.in
|
||||
${CMAKE_CURRENT_BINARY_DIR}/${i_target_name}${i_target_output_suffix}.pc
|
||||
@ONLY
|
||||
)
|
||||
|
||||
install(FILES
|
||||
${CMAKE_CURRENT_BINARY_DIR}/${i_target_name}${i_target_output_suffix}.pc
|
||||
DESTINATION
|
||||
lib/pkgconfig
|
||||
)
|
||||
endfunction (install_project)
|
|
@ -0,0 +1,80 @@
|
|||
define_property (TARGET
|
||||
PROPERTY GIT_DESCRIBE
|
||||
BRIEF_DOCS "Advanced version info for developers"
|
||||
FULL_DOCS "String with information that is important for developers during
|
||||
development process. This information includes git commit hash, durty status
|
||||
of repo, distance from the last tag.")
|
||||
|
||||
define_property (TARGET
|
||||
PROPERTY GIT_UNTRACKED_FILES
|
||||
BRIEF_DOCS "Information about presence of untracked files"
|
||||
FULL_DOCS "Used in helper functions generation to add .with-untracked suffix
|
||||
to version string. Suffix is only added if there are some untracked not
|
||||
ignored files in repository.")
|
||||
|
||||
set(HERE_DIR ${CMAKE_CURRENT_LIST_DIR})
|
||||
|
||||
|
||||
function (target_version_information
|
||||
TARGET_NAME i_target_name
|
||||
EXPORT_HEADER i_export_header
|
||||
EXPORT_MACRO i_export_macro
|
||||
VERSIONED_ENTITY i_versioned_entity)
|
||||
|
||||
find_file (
|
||||
headerFileTemplate
|
||||
"ProjectVersioning/version.h.in"
|
||||
PATHS ${CMAKE_MODULE_PATH})
|
||||
|
||||
if ( NOT ${headerFileTemplate} )
|
||||
set(headerFileTemplate "${HERE_DIR}/ProjectVersioning/version.h.in")
|
||||
endif()
|
||||
|
||||
find_file (
|
||||
sourceFileTemplate
|
||||
"ProjectVersioning/version.c.in"
|
||||
PATHS ${CMAKE_MODULE_PATH})
|
||||
|
||||
if ( NOT ${sourceFileTemplate} )
|
||||
set(sourceFileTemplate "${HERE_DIR}/ProjectVersioning/version.c.in")
|
||||
endif()
|
||||
|
||||
exec_program (
|
||||
"git"
|
||||
${CMAKE_SOURCE_DIR}
|
||||
ARGS "describe --always --dirty --long --tags"
|
||||
OUTPUT_VARIABLE gitDescribe)
|
||||
|
||||
exec_program (
|
||||
"git"
|
||||
${CMAKE_SOURCE_DIR}
|
||||
ARGS "ls-files --others --exclude-standard"
|
||||
OUTPUT_VARIABLE gitUntracked)
|
||||
|
||||
if (gitUntracked)
|
||||
set (gitUntracked ".with-untracked")
|
||||
endif (gitUntracked)
|
||||
|
||||
configure_file (
|
||||
"${headerFileTemplate}"
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/${i_versioned_entity}_version.h")
|
||||
|
||||
configure_file(
|
||||
"${sourceFileTemplate}"
|
||||
"${CMAKE_BINARY_DIR}/${i_versioned_entity}_version.c")
|
||||
|
||||
target_sources ("${i_target_name}"
|
||||
PRIVATE
|
||||
$<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/${i_versioned_entity}_version.h>
|
||||
$<INSTALL_INTERFACE:include/${i_include_prefix}/${i_versioned_entity}_version.h>
|
||||
PRIVATE
|
||||
"${CMAKE_BINARY_DIR}/${i_versioned_entity}_version.c")
|
||||
|
||||
set_target_properties (${i_target_name}
|
||||
PROPERTIES
|
||||
GIT_DESCRIBE "${gitDescribe}"
|
||||
GIT_UNTRACKED_FILES "${gitUntracked}")
|
||||
|
||||
unset (headerFileTemplate PARENT_SCOPE)
|
||||
unset (sourceFileTemplate PARENT_SCOPE)
|
||||
endfunction (target_version_information)
|
|
@ -0,0 +1,34 @@
|
|||
#include "${i_versioned_entity}_version.h"
|
||||
|
||||
|
||||
unsigned int @i_versioned_entity@_versionMajor () {
|
||||
return ${${i_versioned_entity}_VERSION_MAJOR};
|
||||
}
|
||||
|
||||
|
||||
unsigned int @i_versioned_entity@_versionMinor () {
|
||||
return ${${i_versioned_entity}_VERSION_MINOR};
|
||||
}
|
||||
|
||||
|
||||
unsigned int @i_versioned_entity@_versionPatch () {
|
||||
return ${${i_versioned_entity}_VERSION_PATCH};
|
||||
}
|
||||
|
||||
|
||||
const char* @i_versioned_entity@_versionGitInfo () {
|
||||
return
|
||||
"${gitDescribe}"
|
||||
"${gitUntracked}";
|
||||
}
|
||||
|
||||
|
||||
const char* @i_versioned_entity@_versionFullString () {
|
||||
return
|
||||
"${${i_versioned_entity}_VERSION_MAJOR}."
|
||||
"${${i_versioned_entity}_VERSION_MINOR}."
|
||||
"${${i_versioned_entity}_VERSION_PATCH}"
|
||||
"${${i_versioned_entity}_VERSION_PRE_RELEASE}"
|
||||
"+${gitDescribe}"
|
||||
"${gitUntracked}";
|
||||
}
|
|
@ -0,0 +1,23 @@
|
|||
#ifndef @CMAKE_PROJECT_NAME@_VERSION_H
|
||||
#define @CMAKE_PROJECT_NAME@_VERSION_H
|
||||
|
||||
|
||||
#include "@i_export_header@"
|
||||
|
||||
|
||||
@i_export_macro@ unsigned int @i_versioned_entity@_versionMajor ();
|
||||
|
||||
|
||||
@i_export_macro@ unsigned int @i_versioned_entity@_versionMinor ();
|
||||
|
||||
|
||||
@i_export_macro@ unsigned int @i_versioned_entity@_versionPatch ();
|
||||
|
||||
|
||||
@i_export_macro@ const char* @i_versioned_entity@_versionGitInfo ();
|
||||
|
||||
|
||||
@i_export_macro@ const char* @i_versioned_entity@_versionFullString ();
|
||||
|
||||
|
||||
#endif /* @CMAKE_PROJECT_NAME@_VERSION_H */
|
|
@ -0,0 +1,113 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2015, by [halex2005](mailto:akharlov@gmail.com)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
*/
|
||||
|
||||
|
||||
#pragma once
|
||||
|
||||
#ifndef PRODUCT_VERSION_MAJOR
|
||||
#define PRODUCT_VERSION_MAJOR @PRODUCT_VERSION_MAJOR@
|
||||
#endif
|
||||
|
||||
#ifndef PRODUCT_VERSION_MINOR
|
||||
#define PRODUCT_VERSION_MINOR @PRODUCT_VERSION_MINOR@
|
||||
#endif
|
||||
|
||||
#ifndef PRODUCT_VERSION_PATCH
|
||||
#define PRODUCT_VERSION_PATCH @PRODUCT_VERSION_PATCH@
|
||||
#endif
|
||||
|
||||
#ifndef PRODUCT_VERSION_BUILD
|
||||
#define PRODUCT_VERSION_BUILD @PRODUCT_VERSION_REVISION@
|
||||
#endif
|
||||
|
||||
#ifndef FILE_VERSION_MAJOR
|
||||
#define FILE_VERSION_MAJOR @PRODUCT_VERSION_MAJOR@
|
||||
#endif
|
||||
|
||||
#ifndef FILE_VERSION_MINOR
|
||||
#define FILE_VERSION_MINOR @PRODUCT_VERSION_MINOR@
|
||||
#endif
|
||||
|
||||
#ifndef FILE_VERSION_PATCH
|
||||
#define FILE_VERSION_PATCH @PRODUCT_VERSION_PATCH@
|
||||
#endif
|
||||
|
||||
#ifndef FILE_VERSION_BUILD
|
||||
#define FILE_VERSION_BUILD @PRODUCT_VERSION_REVISION@
|
||||
#endif
|
||||
|
||||
#ifndef __TO_STRING
|
||||
#define __TO_STRING_IMPL(x) #x
|
||||
#define __TO_STRING(x) __TO_STRING_IMPL(x)
|
||||
#endif
|
||||
|
||||
#define PRODUCT_VERSION_MAJOR_MINOR_STR __TO_STRING(PRODUCT_VERSION_MAJOR) "." __TO_STRING(PRODUCT_VERSION_MINOR)
|
||||
#define PRODUCT_VERSION_MAJOR_MINOR_PATCH_STR PRODUCT_VERSION_MAJOR_MINOR_STR "." __TO_STRING(PRODUCT_VERSION_PATCH)
|
||||
#define PRODUCT_VERSION_FULL_STR PRODUCT_VERSION_MAJOR_MINOR_PATCH_STR "." __TO_STRING(PRODUCT_VERSION_BUILD)
|
||||
#define PRODUCT_VERSION_RESOURCE PRODUCT_VERSION_MAJOR,PRODUCT_VERSION_MINOR,PRODUCT_VERSION_PATCH,PRODUCT_VERSION_BUILD
|
||||
#define PRODUCT_VERSION_RESOURCE_STR PRODUCT_VERSION_FULL_STR "\0"
|
||||
|
||||
#define FILE_VERSION_MAJOR_MINOR_STR __TO_STRING(FILE_VERSION_MAJOR) "." __TO_STRING(FILE_VERSION_MINOR)
|
||||
#define FILE_VERSION_MAJOR_MINOR_PATCH_STR FILE_VERSION_MAJOR_MINOR_STR "." __TO_STRING(FILE_VERSION_PATCH)
|
||||
#define FILE_VERSION_FULL_STR FILE_VERSION_MAJOR_MINOR_PATCH_STR "." __TO_STRING(FILE_VERSION_BUILD)
|
||||
#define FILE_VERSION_RESOURCE FILE_VERSION_MAJOR,FILE_VERSION_MINOR,FILE_VERSION_PATCH,FILE_VERSION_BUILD
|
||||
#define FILE_VERSION_RESOURCE_STR FILE_VERSION_FULL_STR "\0"
|
||||
|
||||
#ifndef USE_ICON
|
||||
#define USE_ICON @USE_ICON@
|
||||
#endif
|
||||
|
||||
#if USE_ICON
|
||||
#ifndef PRODUCT_ICON
|
||||
#define PRODUCT_ICON "@PRODUCT_ICON@"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef PRODUCT_COMMENTS
|
||||
#define PRODUCT_COMMENTS "@PRODUCT_COMMENTS@\0"
|
||||
#endif
|
||||
|
||||
#ifndef PRODUCT_COMPANY_NAME
|
||||
#define PRODUCT_COMPANY_NAME "@PRODUCT_COMPANY_NAME@\0"
|
||||
#endif
|
||||
|
||||
#ifndef PRODUCT_COMPANY_COPYRIGHT
|
||||
#define PRODUCT_COMPANY_COPYRIGHT "@PRODUCT_COMPANY_COPYRIGHT@\0"
|
||||
#endif
|
||||
|
||||
#ifndef PRODUCT_FILE_DESCRIPTION
|
||||
#define PRODUCT_FILE_DESCRIPTION "@PRODUCT_FILE_DESCRIPTION@\0"
|
||||
#endif
|
||||
|
||||
#ifndef PRODUCT_INTERNAL_NAME
|
||||
#define PRODUCT_INTERNAL_NAME "@PRODUCT_NAME@\0"
|
||||
#endif
|
||||
|
||||
#ifndef PRODUCT_ORIGINAL_FILENAME
|
||||
#define PRODUCT_ORIGINAL_FILENAME "@PRODUCT_ORIGINAL_FILENAME@\0"
|
||||
#endif
|
||||
|
||||
#ifndef PRODUCT_BUNDLE
|
||||
#define PRODUCT_BUNDLE "@PRODUCT_BUNDLE@\0"
|
||||
#endif
|
|
@ -0,0 +1,66 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2015, by [halex2005](mailto:akharlov@gmail.com)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "VersionInfo.h"
|
||||
#include "winresrc.h"
|
||||
|
||||
#if USE_ICON
|
||||
IDI_ICON1 ICON PRODUCT_ICON
|
||||
#endif
|
||||
|
||||
LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION FILE_VERSION_RESOURCE
|
||||
PRODUCTVERSION PRODUCT_VERSION_RESOURCE
|
||||
FILEFLAGSMASK 0x3fL
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS 0x1L
|
||||
#else
|
||||
FILEFLAGS 0x0L
|
||||
#endif
|
||||
FILEOS 0x4L
|
||||
FILETYPE 0x1L
|
||||
FILESUBTYPE 0x0L
|
||||
BEGIN
|
||||
BLOCK "StringFileInfo"
|
||||
BEGIN
|
||||
BLOCK "041904b0"
|
||||
BEGIN
|
||||
VALUE "Comments", PRODUCT_COMMENTS
|
||||
VALUE "CompanyName", PRODUCT_COMPANY_NAME
|
||||
VALUE "FileDescription", PRODUCT_FILE_DESCRIPTION
|
||||
VALUE "FileVersion", FILE_VERSION_RESOURCE_STR
|
||||
VALUE "InternalName", PRODUCT_INTERNAL_NAME
|
||||
VALUE "LegalCopyright", PRODUCT_COMPANY_COPYRIGHT
|
||||
VALUE "OriginalFilename", PRODUCT_ORIGINAL_FILENAME
|
||||
VALUE "ProductName", PRODUCT_BUNDLE
|
||||
VALUE "ProductVersion", PRODUCT_VERSION_RESOURCE_STR
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
BEGIN
|
||||
VALUE "Translation", 0x419, 1200
|
||||
END
|
||||
END
|
|
@ -0,0 +1,136 @@
|
|||
# The MIT License (MIT)
|
||||
|
||||
# Copyright (c) 2015, by [halex2005](mailto:akharlov@gmail.com)
|
||||
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
|
||||
# The above copyright notice and this permission notice shall be included in all
|
||||
# copies or substantial portions of the Software.
|
||||
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
# SOFTWARE.
|
||||
|
||||
include (CMakeParseArguments)
|
||||
|
||||
set (GenerateProductVersionCurrentDir ${CMAKE_CURRENT_LIST_DIR})
|
||||
|
||||
# generate_product_version() function
|
||||
#
|
||||
# This function uses VersionInfo.in template file and VersionResource.rc file
|
||||
# to generate WIN32 resource with version information and general resource strings.
|
||||
#
|
||||
# Usage:
|
||||
# generate_product_version(
|
||||
# SomeOutputResourceVariable
|
||||
# NAME MyGreatProject
|
||||
# ICON ${PATH_TO_APP_ICON}
|
||||
# VERSION_MAJOR 2
|
||||
# VERSION_MINOR 3
|
||||
# VERSION_PATH ${BUILD_COUNTER}
|
||||
# VERSION_REVISION ${BUILD_REVISION}
|
||||
# )
|
||||
# where BUILD_COUNTER and BUILD_REVISION could be values from your CI server.
|
||||
#
|
||||
# You can use generated resource for your executable targets:
|
||||
# add_executable(target-name ${target-files} ${SomeOutputResourceVariable})
|
||||
#
|
||||
# You can specify resource strings in arguments:
|
||||
# NAME - name of executable (no defaults, ex: Microsoft Word)
|
||||
# BUNDLE - bundle (${NAME} is default, ex: Microsoft Office)
|
||||
# USE_ICON - flag that shows whether icon is used or not
|
||||
# ICON - path to application icon (${CMAKE_SOURCE_DIR}/product.ico by default)
|
||||
# VERSION_MAJOR - 1 is default
|
||||
# VERSION_MINOR - 0 is default
|
||||
# VERSION_PATCH - 0 is default
|
||||
# VERSION_REVISION - 0 is default
|
||||
# COMPANY_NAME - your company name (no defaults)
|
||||
# COMPANY_COPYRIGHT - ${COMPANY_NAME} (C) Copyright ${CURRENT_YEAR} is default
|
||||
# COMMENTS - ${NAME} v${VERSION_MAJOR}.${VERSION_MINOR} is default
|
||||
# ORIGINAL_FILENAME - ${NAME} is default
|
||||
# INTERNAL_NAME - ${NAME} is default
|
||||
# FILE_DESCRIPTION - ${NAME} is default
|
||||
function(generate_product_version outfiles)
|
||||
set (options)
|
||||
set (oneValueArgs
|
||||
NAME
|
||||
BUNDLE
|
||||
USE_ICON
|
||||
ICON
|
||||
VERSION_MAJOR
|
||||
VERSION_MINOR
|
||||
VERSION_PATCH
|
||||
VERSION_REVISION
|
||||
COMPANY_NAME
|
||||
COMPANY_COPYRIGHT
|
||||
COMMENTS
|
||||
ORIGINAL_FILENAME
|
||||
INTERNAL_NAME
|
||||
FILE_DESCRIPTION)
|
||||
set (multiValueArgs)
|
||||
cmake_parse_arguments(PRODUCT "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
|
||||
|
||||
if (NOT PRODUCT_BUNDLE OR "${PRODUCT_BUNDLE}" STREQUAL "")
|
||||
set(PRODUCT_BUNDLE "${PRODUCT_NAME}")
|
||||
endif()
|
||||
|
||||
if (USE_ICON)
|
||||
if (NOT PRODUCT_ICON OR "${PRODUCT_ICON}" STREQUAL "")
|
||||
set(PRODUCT_ICON "${CMAKE_SOURCE_DIR}/product.ico")
|
||||
endif()
|
||||
else ()
|
||||
set (USE_ICON 0)
|
||||
endif ()
|
||||
|
||||
if (NOT PRODUCT_VERSION_MAJOR EQUAL 0 AND (NOT PRODUCT_VERSION_MAJOR OR "${PRODUCT_VERSION_MAJOR}" STREQUAL ""))
|
||||
set(PRODUCT_VERSION_MAJOR 1)
|
||||
endif()
|
||||
if (NOT PRODUCT_VERSION_MINOR EQUAL 0 AND (NOT PRODUCT_VERSION_MINOR OR "${PRODUCT_VERSION_MINOR}" STREQUAL ""))
|
||||
set(PRODUCT_VERSION_MINOR 0)
|
||||
endif()
|
||||
if (NOT PRODUCT_VERSION_PATCH EQUAL 0 AND (NOT PRODUCT_VERSION_PATCH OR "${PRODUCT_VERSION_PATCH}" STREQUAL ""))
|
||||
set(PRODUCT_VERSION_PATCH 0)
|
||||
endif()
|
||||
if (NOT PRODUCT_VERSION_REVISION EQUAL 0 AND (NOT PRODUCT_VERSION_REVISION OR "${PRODUCT_VERSION_REVISION}" STREQUAL ""))
|
||||
set(PRODUCT_VERSION_REVISION 0)
|
||||
endif()
|
||||
|
||||
if (NOT PRODUCT_COMPANY_COPYRIGHT OR "${PRODUCT_COMPANY_COPYRIGHT}" STREQUAL "")
|
||||
string(TIMESTAMP PRODUCT_CURRENT_YEAR "%Y")
|
||||
set(PRODUCT_COMPANY_COPYRIGHT "${PRODUCT_COMPANY_NAME} (C) Copyright ${PRODUCT_CURRENT_YEAR}")
|
||||
endif()
|
||||
if (NOT PRODUCT_COMMENTS OR "${PRODUCT_COMMENTS}" STREQUAL "")
|
||||
set(PRODUCT_COMMENTS "${PRODUCT_NAME} v${PRODUCT_VERSION_MAJOR}.${PRODUCT_VERSION_MINOR}")
|
||||
endif()
|
||||
if (NOT PRODUCT_ORIGINAL_FILENAME OR "${PRODUCT_ORIGINAL_FILENAME}" STREQUAL "")
|
||||
set(PRODUCT_ORIGINAL_FILENAME "${PRODUCT_NAME}")
|
||||
endif()
|
||||
if (NOT PRODUCT_INTERNAL_NAME OR "${PRODUCT_INTERNAL_NAME}" STREQUAL "")
|
||||
set(PRODUCT_INTERNAL_NAME "${PRODUCT_NAME}")
|
||||
endif()
|
||||
if (NOT PRODUCT_FILE_DESCRIPTION OR "${PRODUCT_FILE_DESCRIPTION}" STREQUAL "")
|
||||
set(PRODUCT_FILE_DESCRIPTION "${PRODUCT_NAME}")
|
||||
endif()
|
||||
|
||||
set (_VersionInfoFile ${CMAKE_CURRENT_BINARY_DIR}/VersionInfo.h)
|
||||
set (_VersionResourceFile ${CMAKE_CURRENT_BINARY_DIR}/VersionResource.rc)
|
||||
configure_file(
|
||||
${GenerateProductVersionCurrentDir}/VersionInfo.in
|
||||
${_VersionInfoFile}
|
||||
@ONLY)
|
||||
configure_file(
|
||||
${GenerateProductVersionCurrentDir}/VersionResource.rc
|
||||
${_VersionResourceFile}
|
||||
COPYONLY)
|
||||
list(APPEND ${outfiles} ${_VersionInfoFile} ${_VersionResourceFile})
|
||||
set (${outfiles} ${${outfiles}} PARENT_SCOPE)
|
||||
endfunction()
|
|
@ -0,0 +1,58 @@
|
|||
function (select_qt
|
||||
QT_SUPPORTED_VERSIONS i_qt_supported_versions
|
||||
QT_DEFAULT_VERSION i_default_qt_version)
|
||||
set (QT_VERSION ${i_default_qt_version} CACHE STRING
|
||||
"Qt version to build against")
|
||||
|
||||
set_property (
|
||||
CACHE QT_VERSION
|
||||
PROPERTY STRINGS ${i_qt_supported_versions})
|
||||
endfunction (select_qt)
|
||||
|
||||
|
||||
macro (find_qt
|
||||
QT_SUPPORTED_VERSIONS i_qt_supported_versions
|
||||
REQUIRED_COMPONENTS i_required_components
|
||||
OPTIONAL_COMPONENTS i_optional_components)
|
||||
# Auto generate moc files
|
||||
if (4 EQUAL QT_VERSION)
|
||||
find_package (Qt4 4.8 REQUIRED
|
||||
COMPONENTS
|
||||
${i_required_components}
|
||||
OPTIONAL_COMPONENTS
|
||||
${i_optional_components})
|
||||
elseif (5 EQUAL QT_VERSION)
|
||||
find_package (Qt5 5.9 REQUIRED
|
||||
COMPONENTS
|
||||
${i_required_components}
|
||||
OPTIONAL_COMPONENTS
|
||||
${i_optional_components})
|
||||
else (5 EQUAL QT_VERSION)
|
||||
message (FATAL_ERROR "Unsupported version of Qt: ${QT_VERSION}")
|
||||
endif (4 EQUAL QT_VERSION)
|
||||
endmacro (find_qt)
|
||||
|
||||
|
||||
function (use_qt
|
||||
TARGET_NAME i_target_name
|
||||
QT_SUPPORTED_VERSIONS i_qt_supported_versions
|
||||
REQUIRED_COMPONENTS i_required_components
|
||||
OPTIONAL_COMPONENTS i_optional_components)
|
||||
if (4 EQUAL QT_VERSION)
|
||||
foreach (COMPONENT IN LISTS i_required_components, i_optional_components)
|
||||
target_link_libraries (${i_target_name}
|
||||
PRIVATE
|
||||
Qt4::${COMPONENT}
|
||||
)
|
||||
endforeach (COMPONENT IN LISTS i_required_components, i_optional_components)
|
||||
elseif (5 EQUAL QT_VERSION)
|
||||
foreach (COMPONENT IN LISTS i_required_components)
|
||||
target_link_libraries (${i_target_name}
|
||||
PRIVATE
|
||||
Qt5::${COMPONENT}
|
||||
)
|
||||
endforeach (COMPONENT IN LISTS i_required_components, i_optional_components)
|
||||
else (5 EQUAL QT_VERSION)
|
||||
message (FATAL_ERROR "Unsupported version of Qt: ${QT_VERSION}")
|
||||
endif (4 EQUAL QT_VERSION)
|
||||
endfunction (use_qt)
|
|
@ -0,0 +1,43 @@
|
|||
include (ProjectVersioning)
|
||||
|
||||
function (generate_versioning_information
|
||||
TARGET_NAME i_target_name
|
||||
EXPORT_HEADER i_export_header
|
||||
EXPORT_MACRO i_export_macro
|
||||
VERSIONED_ENTITY i_versioned_entity
|
||||
INCLUDE_PREFIX i_include_prefix
|
||||
COMPANY_NAME i_company_name
|
||||
COMPANY_COPYRIGHT i_company_copyright
|
||||
FILE_DESCRIPTION i_file_description
|
||||
)
|
||||
target_version_information (
|
||||
TARGET_NAME ${i_target_name}
|
||||
EXPORT_HEADER ${i_export_header}
|
||||
EXPORT_MACRO ${i_export_macro}
|
||||
VERSIONED_ENTITY ${i_versioned_entity}
|
||||
)
|
||||
|
||||
if (WIN32)
|
||||
include (generate_product_version)
|
||||
|
||||
get_target_property (gitDescribe
|
||||
${i_target_name} GIT_DESCRIBE)
|
||||
|
||||
get_target_property (gitUntracked
|
||||
${i_target_name} GIT_UNTRACKED_FILES)
|
||||
|
||||
generate_product_version (
|
||||
win32VersionInfoFiles
|
||||
NAME ${i_versioned_entity}
|
||||
VERSION_MAJOR ${${i_versioned_entity}_VERSION_MAJOR}
|
||||
VERSION_MINOR ${${i_versioned_entity}_VERSION_MINOR}
|
||||
VERSION_PATCH ${${i_versioned_entity}_VERSION_PATCH}
|
||||
COMPANY_NAME ${i_company_name}
|
||||
COMPANY_COPYRIGHT ${i_company_copyright}
|
||||
COMMENTS "${gitDescribe}${gitUntracked}"
|
||||
FILE_DESCRIPTION ${i_file_description}
|
||||
)
|
||||
|
||||
target_sources (${i_target_name} PRIVATE ${win32VersionInfoFiles})
|
||||
endif (WIN32)
|
||||
endfunction (generate_versioning_information)
|
|
@ -0,0 +1,77 @@
|
|||
# Copyright (C) 2013-2019 Mattia Basaglia
|
||||
#
|
||||
#
|
||||
# This software is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Lesser General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This software is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License
|
||||
# along with Color Widgets. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
CONFIG += c++11
|
||||
|
||||
INCLUDEPATH += $$PWD/src $$PWD/include
|
||||
|
||||
SOURCES += \
|
||||
$$PWD/src/QtColorWidgets/abstract_widget_list.cpp \
|
||||
$$PWD/src/QtColorWidgets/bound_color_selector.cpp \
|
||||
$$PWD/src/QtColorWidgets/color_2d_slider.cpp \
|
||||
$$PWD/src/QtColorWidgets/color_delegate.cpp \
|
||||
$$PWD/src/QtColorWidgets/color_dialog.cpp \
|
||||
$$PWD/src/QtColorWidgets/color_line_edit.cpp \
|
||||
$$PWD/src/QtColorWidgets/color_list_widget.cpp \
|
||||
$$PWD/src/QtColorWidgets/color_names.cpp \
|
||||
$$PWD/src/QtColorWidgets/color_palette.cpp \
|
||||
$$PWD/src/QtColorWidgets/color_palette_model.cpp \
|
||||
$$PWD/src/QtColorWidgets/color_palette_widget.cpp \
|
||||
$$PWD/src/QtColorWidgets/color_preview.cpp \
|
||||
$$PWD/src/QtColorWidgets/color_selector.cpp \
|
||||
$$PWD/src/QtColorWidgets/color_utils.cpp \
|
||||
$$PWD/src/QtColorWidgets/color_wheel.cpp \
|
||||
$$PWD/src/QtColorWidgets/gradient_editor.cpp \
|
||||
$$PWD/src/QtColorWidgets/gradient_list_model.cpp \
|
||||
$$PWD/src/QtColorWidgets/gradient_slider.cpp \
|
||||
$$PWD/src/QtColorWidgets/harmony_color_wheel.cpp \
|
||||
$$PWD/src/QtColorWidgets/hue_slider.cpp \
|
||||
$$PWD/src/QtColorWidgets/swatch.cpp
|
||||
|
||||
HEADERS += \
|
||||
$$PWD/include/QtColorWidgets/abstract_widget_list.hpp \
|
||||
$$PWD/include/QtColorWidgets/bound_color_selector.hpp \
|
||||
$$PWD/include/QtColorWidgets/color_2d_slider.hpp \
|
||||
$$PWD/include/QtColorWidgets/color_delegate.hpp \
|
||||
$$PWD/include/QtColorWidgets/color_dialog.hpp \
|
||||
$$PWD/include/QtColorWidgets/color_line_edit.hpp \
|
||||
$$PWD/include/QtColorWidgets/color_list_widget.hpp \
|
||||
$$PWD/include/QtColorWidgets/color_names.hpp \
|
||||
$$PWD/include/QtColorWidgets/color_palette.hpp \
|
||||
$$PWD/include/QtColorWidgets/color_palette_model.hpp \
|
||||
$$PWD/include/QtColorWidgets/color_palette_widget.hpp \
|
||||
$$PWD/include/QtColorWidgets/color_preview.hpp \
|
||||
$$PWD/include/QtColorWidgets/color_selector.hpp \
|
||||
$$PWD/include/QtColorWidgets/color_utils.hpp \
|
||||
$$PWD/include/QtColorWidgets/color_wheel.hpp \
|
||||
$$PWD/include/QtColorWidgets/color_wheel_private.hpp \
|
||||
$$PWD/include/QtColorWidgets/colorwidgets_global.hpp \
|
||||
$$PWD/include/QtColorWidgets/gradient_delegate.hpp \
|
||||
$$PWD/include/QtColorWidgets/gradient_editor.hpp \
|
||||
$$PWD/include/QtColorWidgets/gradient_helper.hpp \
|
||||
$$PWD/include/QtColorWidgets/gradient_list_model.hpp \
|
||||
$$PWD/include/QtColorWidgets/gradient_slider.hpp \
|
||||
$$PWD/include/QtColorWidgets/harmony_color_wheel.hpp \
|
||||
$$PWD/include/QtColorWidgets/hue_slider.hpp \
|
||||
$$PWD/include/QtColorWidgets/swatch.hpp
|
||||
|
||||
FORMS += \
|
||||
$$PWD/src/QtColorWidgets/color_dialog.ui \
|
||||
$$PWD/src/QtColorWidgets/color_palette_widget.ui
|
||||
|
||||
RESOURCES += \
|
||||
$$PWD/resources/QtColorWidgets/color_widgets.qrc
|
||||
|
|
@ -0,0 +1,53 @@
|
|||
#
|
||||
# Copyright (C) 2013-2020 Mattia Basaglia
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Lesser General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
TEMPLATE=lib
|
||||
CONFIG += dll
|
||||
QT += core gui widgets
|
||||
DEFINES += QTCOLORWIDGETS_LIBRARY
|
||||
|
||||
TARGET=QtColorWidgets-Qt5
|
||||
|
||||
VERSION=2.0.0
|
||||
|
||||
OBJECTS_DIR = out/obj
|
||||
MOC_DIR = out/generated
|
||||
UI_DIR = out/generated
|
||||
RCC_DIR = out/generated
|
||||
|
||||
include(color_widgets.pri)
|
||||
|
||||
build_all:!build_pass {
|
||||
CONFIG -= build_all
|
||||
CONFIG += release
|
||||
}
|
||||
|
||||
unix {
|
||||
LIB_TARGET = lib$${TARGET}.so
|
||||
}
|
||||
win32 {
|
||||
LIB_TARGET = $${TARGET}.dll
|
||||
}
|
||||
|
||||
isEmpty(PREFIX) {
|
||||
PREFIX = /usr/local
|
||||
}
|
||||
target.path = $$PREFIX/lib
|
||||
headers.path = $$PREFIX/include/QtColorWidgets
|
||||
headers.files = $$HEADERS
|
||||
|
||||
INSTALLS += target headers
|
||||
|
|
@ -0,0 +1,178 @@
|
|||
# Copyright (C) 2013-2020 Mattia Basaglia
|
||||
#
|
||||
#
|
||||
# This software is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Lesser General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This software is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License
|
||||
# along with Color Widgets. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
cmake_minimum_required (VERSION 3.1 FATAL_ERROR)
|
||||
|
||||
project(QtColorWidgetsPlugin CXX)
|
||||
|
||||
|
||||
set (CMAKE_MODULE_PATH
|
||||
${CMAKE_MODULE_PATH}
|
||||
${CMAKE_SOURCE_DIR}/cmake/modules
|
||||
${CMAKE_CURRENT_LIST_DIR}/..)
|
||||
|
||||
|
||||
include (CheckCXXCompilerFlag)
|
||||
|
||||
include (../cmake/qt-configuration.cmake)
|
||||
include (../cmake/versioning.cmake)
|
||||
|
||||
|
||||
SET (${PROJECT_NAME}_VERSION_MAJOR 2)
|
||||
SET (${PROJECT_NAME}_VERSION_MINOR 0)
|
||||
SET (${PROJECT_NAME}_VERSION_PATCH 0)
|
||||
SET (${PROJECT_NAME}_VERSION "${${PROJECT_NAME}_VERSION_MAJOR}.${${PROJECT_NAME}_VERSION_MINOR}.${${PROJECT_NAME}_VERSION_PATCH}")
|
||||
|
||||
|
||||
set (QT_SUPPORTED_VERSIONS 5)
|
||||
|
||||
select_qt (
|
||||
QT_SUPPORTED_VERSIONS "${QT_SUPPORTED_VERSIONS}"
|
||||
QT_DEFAULT_VERSION 5)
|
||||
|
||||
set (REQUIRED_QT_COMPONENTS
|
||||
Designer
|
||||
)
|
||||
find_qt (
|
||||
QT_SUPPORTED_VERSIONS "${QT_SUPPORTED_VERSIONS}"
|
||||
REQUIRED_COMPONENTS "${REQUIRED_QT_COMPONENTS}"
|
||||
OPTIONAL_COMPONENTS "")
|
||||
|
||||
# Auto generate moc files
|
||||
set(CMAKE_AUTOMOC ON)
|
||||
# Auto generate moc files
|
||||
set(CMAKE_AUTOUIC ON)
|
||||
# Auto generate moc files
|
||||
set(CMAKE_AUTORCC ON)
|
||||
|
||||
check_cxx_compiler_flag ("-Wall" Wall_FLAG_SUPPORTED)
|
||||
|
||||
if (Wall_FLAG_SUPPORTED)
|
||||
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall")
|
||||
endif (Wall_FLAG_SUPPORTED)
|
||||
|
||||
check_cxx_compiler_flag ("-pedantic" pedantic_FLAG_SUPPORTED)
|
||||
|
||||
if (pedantic_FLAG_SUPPORTED)
|
||||
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -pedantic")
|
||||
endif (pedantic_FLAG_SUPPORTED)
|
||||
|
||||
check_cxx_compiler_flag ("-Wextra" Wextra_FLAG_SUPPORTED)
|
||||
|
||||
if (Wextra_FLAG_SUPPORTED)
|
||||
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wextra")
|
||||
endif (Wextra_FLAG_SUPPORTED)
|
||||
|
||||
# Library
|
||||
set (TARGET_NAME ${PROJECT_NAME})
|
||||
set (TARGET_OUTPUT_SUFFIX "-Qt${QT_VERSION}${${PROJECT_NAME}_VERSION_MAJOR}")
|
||||
|
||||
add_library (${TARGET_NAME} SHARED "")
|
||||
set_target_properties(${TARGET_NAME}
|
||||
PROPERTIES
|
||||
EXPORT_NAME "${TARGET_NAME}${TARGET_OUTPUT_SUFFIX}")
|
||||
|
||||
set_target_properties (${TARGET_NAME}
|
||||
PROPERTIES
|
||||
CXX_STANDARD 11
|
||||
CXX_STANDARD_REQUIRED ON
|
||||
VERSION ${${PROJECT_NAME}_VERSION}
|
||||
SOVERSION ${${PROJECT_NAME}_VERSION_MAJOR}
|
||||
"INTERFACE_${PROJECT_NAME}_MAJOR_VERSION" ${${PROJECT_NAME}_VERSION_MAJOR}
|
||||
COMPATIBLE_INTERFACE_STRING "${PROJECT_NAME}_MAJOR_VERSION"
|
||||
OUTPUT_NAME "${TARGET_NAME}${TARGET_OUTPUT_SUFFIX}")
|
||||
|
||||
|
||||
target_link_libraries(${TARGET_NAME}
|
||||
PRIVATE
|
||||
${COLOR_WIDGETS_LIBRARY})
|
||||
|
||||
use_qt (
|
||||
TARGET_NAME ${TARGET_NAME}
|
||||
QT_SUPPORTED_VERSIONS "${QT_SUPPORTED_VERSIONS}"
|
||||
REQUIRED_COMPONENTS "${REQUIRED_QT_COMPONENTS}"
|
||||
OPTIONAL_COMPONENTS "")
|
||||
|
||||
|
||||
# Sources
|
||||
set(SOURCES
|
||||
color_preview_plugin.cpp
|
||||
color_wheel_plugin.cpp
|
||||
color_widget_plugin_collection.cpp
|
||||
gradient_slider_plugin.cpp
|
||||
hue_slider_plugin.cpp
|
||||
color_selector_plugin.cpp
|
||||
color_list_plugin.cpp
|
||||
swatch_plugin.cpp
|
||||
color_palette_widget_plugin.cpp
|
||||
color_2d_slider_plugin.cpp
|
||||
color_line_edit_plugin.cpp
|
||||
gradient_editor_plugin.cpp
|
||||
# add new sources above this line
|
||||
)
|
||||
|
||||
foreach (SOURCE IN LISTS SOURCES)
|
||||
target_sources (${TARGET_NAME}
|
||||
PRIVATE
|
||||
$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/${SOURCE}>)
|
||||
endforeach (SOURCE IN SOURCES)
|
||||
|
||||
set(HEADERS
|
||||
color_preview_plugin.hpp
|
||||
color_wheel_plugin.hpp
|
||||
color_widget_plugin_collection.hpp
|
||||
gradient_slider_plugin.hpp
|
||||
hue_slider_plugin.hpp
|
||||
color_selector_plugin.hpp
|
||||
color_list_plugin.hpp
|
||||
swatch_plugin.hpp
|
||||
color_palette_widget_plugin.hpp
|
||||
color_2d_slider_plugin.hpp
|
||||
color_line_edit_plugin.hpp
|
||||
gradient_editor_plugin.hpp
|
||||
# add new headers above this line
|
||||
)
|
||||
|
||||
foreach (HEADER IN LISTS HEADERS)
|
||||
target_sources (${TARGET_NAME}
|
||||
PRIVATE
|
||||
$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/${HEADER}>)
|
||||
endforeach (HEADER IN HEADERS)
|
||||
|
||||
|
||||
# install
|
||||
get_target_property (QT_QMAKE_EXECUTABLE
|
||||
Qt5::qmake LOCATION)
|
||||
|
||||
execute_process (
|
||||
COMMAND ${QT_QMAKE_EXECUTABLE} -query QT_INSTALL_PLUGINS
|
||||
OUTPUT_VARIABLE QT_INSTALL_PLUGINS
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
|
||||
# install(TARGETS ${COLOR_WIDGETS_PLUGIN} DESTINATION ${QT_INSTALL_PLUGINS}/designer OPTIONAL)
|
||||
|
||||
execute_process (
|
||||
COMMAND ${QT_QMAKE_EXECUTABLE} -query QT_INSTALL_LIBS
|
||||
OUTPUT_VARIABLE QT_INSTALL_LIBS
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
|
||||
# install(TARGETS ${COLOR_WIDGETS_PLUGIN} DESTINATION ${QT_INSTALL_LIBS}/qtcreator/plugins OPTIONAL)
|
||||
|
||||
add_custom_target(${TARGET_NAME}_install
|
||||
COMMAND cp $<TARGET_FILE:${TARGET_NAME}> ${QT_INSTALL_PLUGINS}/designer
|
||||
COMMAND cp $<TARGET_FILE:${TARGET_NAME}> ${QT_INSTALL_LIBS}/qtcreator/plugins
|
||||
DEPENDS ${TARGET_NAME}
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
|
90
thirdparty/Qt-Color-Widgets/color_widgets_designer_plugin/color_2d_slider_plugin.cpp
vendored
Normal file
|
@ -0,0 +1,90 @@
|
|||
/**
|
||||
* \file
|
||||
*
|
||||
* \author Mattia Basaglia
|
||||
*
|
||||
* \copyright Copyright (C) 2013-2020 Mattia Basaglia
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
#include "color_2d_slider_plugin.hpp"
|
||||
#include "QtColorWidgets/color_2d_slider.hpp"
|
||||
|
||||
Color2DSlider_Plugin::Color2DSlider_Plugin(QObject *parent) :
|
||||
QObject(parent), initialized(false)
|
||||
{
|
||||
}
|
||||
|
||||
void Color2DSlider_Plugin::initialize(QDesignerFormEditorInterface *)
|
||||
{
|
||||
initialized = true;
|
||||
}
|
||||
|
||||
bool Color2DSlider_Plugin::isInitialized() const
|
||||
{
|
||||
return initialized;
|
||||
}
|
||||
|
||||
QWidget *Color2DSlider_Plugin::createWidget(QWidget *parent)
|
||||
{
|
||||
return new color_widgets::Color2DSlider(parent);
|
||||
}
|
||||
|
||||
QString Color2DSlider_Plugin::name() const
|
||||
{
|
||||
return "color_widgets::Color2DSlider";
|
||||
}
|
||||
|
||||
QString Color2DSlider_Plugin::group() const
|
||||
{
|
||||
return "Color Widgets";
|
||||
}
|
||||
|
||||
QIcon Color2DSlider_Plugin::icon() const
|
||||
{
|
||||
color_widgets::Color2DSlider w;
|
||||
w.resize(64,64);
|
||||
QPixmap pix(64,64);
|
||||
w.render(&pix);
|
||||
return QIcon(pix);
|
||||
}
|
||||
|
||||
QString Color2DSlider_Plugin::toolTip() const
|
||||
{
|
||||
return "An analog widget to select 2 color components at the same time";
|
||||
}
|
||||
|
||||
QString Color2DSlider_Plugin::whatsThis() const
|
||||
{
|
||||
return toolTip();
|
||||
}
|
||||
|
||||
bool Color2DSlider_Plugin::isContainer() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
QString Color2DSlider_Plugin::domXml() const
|
||||
{
|
||||
return "<ui language=\"c++\">\n"
|
||||
" <widget class=\"color_widgets::Color2DSlider\" name=\"color2DSlider\">\n"
|
||||
" </widget>\n"
|
||||
"</ui>\n";
|
||||
}
|
||||
|
||||
QString Color2DSlider_Plugin::includeFile() const
|
||||
{
|
||||
return "QtColorWidgets/color_2d_slider.hpp";
|
||||
}
|
57
thirdparty/Qt-Color-Widgets/color_widgets_designer_plugin/color_2d_slider_plugin.hpp
vendored
Normal file
|
@ -0,0 +1,57 @@
|
|||
/**
|
||||
* \file
|
||||
*
|
||||
* \author Mattia Basaglia
|
||||
*
|
||||
* \copyright Copyright (C) 2013-2020 Mattia Basaglia
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
#ifndef COLOR_WIDGETS_COLOR_2D_SLIDER_PLUGIN_HPP
|
||||
#define COLOR_WIDGETS_COLOR_2D_SLIDER_PLUGIN_HPP
|
||||
|
||||
#include <QObject>
|
||||
#include <QtUiPlugin/QDesignerCustomWidgetInterface>
|
||||
|
||||
class Color2DSlider_Plugin : public QObject, public QDesignerCustomWidgetInterface
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_INTERFACES(QDesignerCustomWidgetInterface)
|
||||
|
||||
public:
|
||||
Color2DSlider_Plugin(QObject *parent = 0);
|
||||
|
||||
void initialize(QDesignerFormEditorInterface *core);
|
||||
bool isInitialized() const;
|
||||
|
||||
QWidget *createWidget(QWidget *parent);
|
||||
|
||||
QString name() const;
|
||||
QString group() const;
|
||||
QIcon icon() const;
|
||||
QString toolTip() const;
|
||||
QString whatsThis() const;
|
||||
bool isContainer() const;
|
||||
|
||||
QString domXml() const;
|
||||
|
||||
QString includeFile() const;
|
||||
|
||||
private:
|
||||
bool initialized;
|
||||
};
|
||||
|
||||
|
||||
#endif // COLOR_WIDGETS_COLOR_2D_SLIDER_PLUGIN_HPP
|
87
thirdparty/Qt-Color-Widgets/color_widgets_designer_plugin/color_line_edit_plugin.cpp
vendored
Normal file
|
@ -0,0 +1,87 @@
|
|||
/**
|
||||
* \file
|
||||
*
|
||||
* \author Mattia Basaglia
|
||||
*
|
||||
* \copyright Copyright (C) 2013-2020 Mattia Basaglia
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
#include "color_line_edit_plugin.hpp"
|
||||
#include "QtColorWidgets/color_line_edit.hpp"
|
||||
|
||||
QWidget* ColorLineEdit_Plugin::createWidget(QWidget *parent)
|
||||
{
|
||||
color_widgets::ColorLineEdit *widget = new color_widgets::ColorLineEdit(parent);
|
||||
return widget;
|
||||
}
|
||||
|
||||
QIcon ColorLineEdit_Plugin::icon() const
|
||||
{
|
||||
return QIcon::fromTheme("edit-rename");
|
||||
}
|
||||
|
||||
QString ColorLineEdit_Plugin::domXml() const
|
||||
{
|
||||
return "<ui language=\"c++\">\n"
|
||||
" <widget class=\"color_widgets::ColorLineEdit\" name=\"color_line_edit\">\n"
|
||||
" </widget>\n"
|
||||
"</ui>\n";
|
||||
}
|
||||
|
||||
bool ColorLineEdit_Plugin::isContainer() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
ColorLineEdit_Plugin::ColorLineEdit_Plugin(QObject *parent) :
|
||||
QObject(parent), initialized(false)
|
||||
{
|
||||
}
|
||||
|
||||
void ColorLineEdit_Plugin::initialize(QDesignerFormEditorInterface *)
|
||||
{
|
||||
initialized = true;
|
||||
}
|
||||
|
||||
bool ColorLineEdit_Plugin::isInitialized() const
|
||||
{
|
||||
return initialized;
|
||||
}
|
||||
|
||||
QString ColorLineEdit_Plugin::name() const
|
||||
{
|
||||
return "color_widgets::ColorLineEdit";
|
||||
}
|
||||
|
||||
QString ColorLineEdit_Plugin::group() const
|
||||
{
|
||||
return "Color Widgets";
|
||||
}
|
||||
|
||||
QString ColorLineEdit_Plugin::toolTip() const
|
||||
{
|
||||
return "A widget to manipulate a string representing a color";
|
||||
}
|
||||
|
||||
QString ColorLineEdit_Plugin::whatsThis() const
|
||||
{
|
||||
return toolTip();
|
||||
}
|
||||
|
||||
QString ColorLineEdit_Plugin::includeFile() const
|
||||
{
|
||||
return "QtColorWidgets/color_line_edit.hpp";
|
||||
}
|
58
thirdparty/Qt-Color-Widgets/color_widgets_designer_plugin/color_line_edit_plugin.hpp
vendored
Normal file
|
@ -0,0 +1,58 @@
|
|||
/**
|
||||
* \file
|
||||
*
|
||||
* \author Mattia Basaglia
|
||||
*
|
||||
* \copyright Copyright (C) 2013-2020 Mattia Basaglia
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
#ifndef COLOR_WIDGETS_COLOR_LINE_EDIT_PLUGIN_HPP
|
||||
#define COLOR_WIDGETS_COLOR_LINE_EDIT_PLUGIN_HPP
|
||||
|
||||
#include <QObject>
|
||||
#include <QtUiPlugin/QDesignerCustomWidgetInterface>
|
||||
|
||||
class ColorLineEdit_Plugin : public QObject, public QDesignerCustomWidgetInterface
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_INTERFACES(QDesignerCustomWidgetInterface)
|
||||
|
||||
public:
|
||||
explicit ColorLineEdit_Plugin(QObject *parent = nullptr);
|
||||
|
||||
void initialize(QDesignerFormEditorInterface *core) Q_DECL_OVERRIDE;
|
||||
bool isInitialized() const Q_DECL_OVERRIDE;
|
||||
|
||||
QWidget *createWidget(QWidget *parent) Q_DECL_OVERRIDE;
|
||||
|
||||
QString name() const Q_DECL_OVERRIDE;
|
||||
QString group() const Q_DECL_OVERRIDE;
|
||||
QIcon icon() const Q_DECL_OVERRIDE;
|
||||
QString toolTip() const Q_DECL_OVERRIDE;
|
||||
QString whatsThis() const Q_DECL_OVERRIDE;
|
||||
bool isContainer() const Q_DECL_OVERRIDE;
|
||||
|
||||
QString domXml() const Q_DECL_OVERRIDE;
|
||||
|
||||
QString includeFile() const Q_DECL_OVERRIDE;
|
||||
|
||||
private:
|
||||
bool initialized;
|
||||
};
|
||||
|
||||
|
||||
#endif // COLOR_WIDGETS_COLOR_LINE_EDIT_PLUGIN_HPP
|
||||
|
88
thirdparty/Qt-Color-Widgets/color_widgets_designer_plugin/color_list_plugin.cpp
vendored
Normal file
|
@ -0,0 +1,88 @@
|
|||
/**
|
||||
* \file
|
||||
*
|
||||
* \author Mattia Basaglia
|
||||
*
|
||||
* \copyright Copyright (C) 2013-2020 Mattia Basaglia
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
#include "color_list_plugin.hpp"
|
||||
#include "QtColorWidgets/color_list_widget.hpp"
|
||||
|
||||
ColorListWidget_Plugin::ColorListWidget_Plugin(QObject *parent) :
|
||||
QObject(parent)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void ColorListWidget_Plugin::initialize(QDesignerFormEditorInterface *)
|
||||
{
|
||||
initialized = true;
|
||||
}
|
||||
|
||||
bool ColorListWidget_Plugin::isInitialized() const
|
||||
{
|
||||
return initialized;
|
||||
}
|
||||
|
||||
QWidget *ColorListWidget_Plugin::createWidget(QWidget *parent)
|
||||
{
|
||||
return new color_widgets::ColorListWidget(parent);
|
||||
}
|
||||
|
||||
QString ColorListWidget_Plugin::name() const
|
||||
{
|
||||
return "color_widgets::ColorListWidget";
|
||||
}
|
||||
|
||||
QString ColorListWidget_Plugin::group() const
|
||||
{
|
||||
return "Color Widgets";
|
||||
}
|
||||
|
||||
QIcon ColorListWidget_Plugin::icon() const
|
||||
{
|
||||
return QIcon::fromTheme("format-stroke-color");
|
||||
}
|
||||
|
||||
QString ColorListWidget_Plugin::toolTip() const
|
||||
{
|
||||
return "An editable list of colors";
|
||||
}
|
||||
|
||||
QString ColorListWidget_Plugin::whatsThis() const
|
||||
{
|
||||
return toolTip();
|
||||
}
|
||||
|
||||
bool ColorListWidget_Plugin::isContainer() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
QString ColorListWidget_Plugin::domXml() const
|
||||
{
|
||||
|
||||
return "<ui language=\"c++\">\n"
|
||||
" <widget class=\"color_widgets::ColorListWidget\" name=\"ColorListWidget\">\n"
|
||||
" </widget>\n"
|
||||
"</ui>\n";
|
||||
}
|
||||
|
||||
QString ColorListWidget_Plugin::includeFile() const
|
||||
{
|
||||
return "QtColorWidgets/color_list_widget.hpp";
|
||||
}
|
56
thirdparty/Qt-Color-Widgets/color_widgets_designer_plugin/color_list_plugin.hpp
vendored
Normal file
|
@ -0,0 +1,56 @@
|
|||
/**
|
||||
* \file
|
||||
*
|
||||
* \author Mattia Basaglia
|
||||
*
|
||||
* \copyright Copyright (C) 2013-2020 Mattia Basaglia
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
#ifndef COLOR_LIST_PLUGIN_HPP
|
||||
#define COLOR_LIST_PLUGIN_HPP
|
||||
|
||||
#include <QtUiPlugin/QDesignerCustomWidgetInterface>
|
||||
|
||||
class ColorListWidget_Plugin : public QObject, public QDesignerCustomWidgetInterface
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_INTERFACES(QDesignerCustomWidgetInterface)
|
||||
|
||||
public:
|
||||
explicit ColorListWidget_Plugin(QObject *parent = 0);
|
||||
|
||||
void initialize(QDesignerFormEditorInterface *core);
|
||||
bool isInitialized() const;
|
||||
|
||||
QWidget *createWidget(QWidget *parent);
|
||||
|
||||
QString name() const;
|
||||
QString group() const;
|
||||
QIcon icon() const;
|
||||
QString toolTip() const;
|
||||
QString whatsThis() const;
|
||||
bool isContainer() const;
|
||||
|
||||
QString domXml() const;
|
||||
|
||||
QString includeFile() const;
|
||||
|
||||
private:
|
||||
bool initialized;
|
||||
|
||||
};
|
||||
|
||||
#endif // COLOR_LIST_PLUGIN_HPP
|
120
thirdparty/Qt-Color-Widgets/color_widgets_designer_plugin/color_palette_widget_plugin.cpp
vendored
Normal file
|
@ -0,0 +1,120 @@
|
|||
/**
|
||||
* \file
|
||||
*
|
||||
* \author Mattia Basaglia
|
||||
*
|
||||
* \copyright Copyright (C) 2013-2020 Mattia Basaglia
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
#include "color_palette_widget_plugin.hpp"
|
||||
#include "QtColorWidgets/color_palette_widget.hpp"
|
||||
|
||||
ColorPaletteWidget_Plugin::ColorPaletteWidget_Plugin(QObject *parent) :
|
||||
QObject(parent), initialized(false)
|
||||
{
|
||||
}
|
||||
|
||||
void ColorPaletteWidget_Plugin::initialize(QDesignerFormEditorInterface *)
|
||||
{
|
||||
initialized = true;
|
||||
}
|
||||
|
||||
bool ColorPaletteWidget_Plugin::isInitialized() const
|
||||
{
|
||||
return initialized;
|
||||
}
|
||||
|
||||
QWidget* ColorPaletteWidget_Plugin::createWidget(QWidget *parent)
|
||||
{
|
||||
color_widgets::ColorPaletteWidget *wid = new color_widgets::ColorPaletteWidget(parent);
|
||||
|
||||
color_widgets::ColorPalette palette1;
|
||||
color_widgets::ColorPalette palette2;
|
||||
int columns = 12;
|
||||
palette1.setName("Palette 1");
|
||||
palette2.setName("Palette 2");
|
||||
palette1.setColumns(columns);
|
||||
palette2.setColumns(columns);
|
||||
for ( int i = 0; i < 6; i++ )
|
||||
{
|
||||
for ( int j = 0; j < columns; j++ )
|
||||
{
|
||||
float f = float(j)/columns;
|
||||
palette1.appendColor(QColor::fromHsvF(i/8.0,1-f,0.5+f/2));
|
||||
palette2.appendColor(QColor::fromHsvF(i/8.0,1-f,1-f));
|
||||
}
|
||||
}
|
||||
color_widgets::ColorPaletteModel *model = new color_widgets::ColorPaletteModel;
|
||||
model->setParent(wid);
|
||||
model->addPalette(palette1, false);
|
||||
model->addPalette(palette2, false);
|
||||
wid->setModel(model);
|
||||
|
||||
return wid;
|
||||
}
|
||||
|
||||
QString ColorPaletteWidget_Plugin::name() const
|
||||
{
|
||||
return "color_widgets::ColorPaletteWidget";
|
||||
}
|
||||
|
||||
QString ColorPaletteWidget_Plugin::group() const
|
||||
{
|
||||
return "Color Widgets";
|
||||
}
|
||||
|
||||
QIcon ColorPaletteWidget_Plugin::icon() const
|
||||
{
|
||||
color_widgets::ColorPalette w;
|
||||
w.setColumns(6);
|
||||
for ( int i = 0; i < 4; i++ )
|
||||
{
|
||||
for ( int j = 0; j < w.columns(); j++ )
|
||||
{
|
||||
float f = float(j)/w.columns();
|
||||
w.appendColor(QColor::fromHsvF(i/5.0,1-f,0.5+f/2));
|
||||
}
|
||||
}
|
||||
return QIcon(w.preview(QSize(64,64)));
|
||||
}
|
||||
|
||||
QString ColorPaletteWidget_Plugin::toolTip() const
|
||||
{
|
||||
return "A widget that displays a color palette";
|
||||
}
|
||||
|
||||
QString ColorPaletteWidget_Plugin::whatsThis() const
|
||||
{
|
||||
return toolTip();
|
||||
}
|
||||
|
||||
bool ColorPaletteWidget_Plugin::isContainer() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
QString ColorPaletteWidget_Plugin::domXml() const
|
||||
{
|
||||
return "<ui language=\"c++\">\n"
|
||||
" <widget class=\"color_widgets::ColorPaletteWidget\" name=\"palette_widget\">\n"
|
||||
" </widget>\n"
|
||||
"</ui>\n";
|
||||
}
|
||||
|
||||
QString ColorPaletteWidget_Plugin::includeFile() const
|
||||
{
|
||||
return "QtColorWidgets/color_palette_widget.hpp";
|
||||
}
|
57
thirdparty/Qt-Color-Widgets/color_widgets_designer_plugin/color_palette_widget_plugin.hpp
vendored
Normal file
|
@ -0,0 +1,57 @@
|
|||
/**
|
||||
* \file
|
||||
*
|
||||
* \author Mattia Basaglia
|
||||
*
|
||||
* \copyright Copyright (C) 2013-2020 Mattia Basaglia
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
#ifndef COLOR_WIDGETS_COLOR_PALETTE_WIDGET_PLUGIN_HPP
|
||||
#define COLOR_WIDGETS_COLOR_PALETTE_WIDGET_PLUGIN_HPP
|
||||
|
||||
#include <QObject>
|
||||
#include <QtUiPlugin/QDesignerCustomWidgetInterface>
|
||||
|
||||
class ColorPaletteWidget_Plugin : public QObject, public QDesignerCustomWidgetInterface
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_INTERFACES(QDesignerCustomWidgetInterface)
|
||||
|
||||
public:
|
||||
ColorPaletteWidget_Plugin(QObject *parent = 0);
|
||||
|
||||
void initialize(QDesignerFormEditorInterface *core);
|
||||
bool isInitialized() const;
|
||||
|
||||
QWidget *createWidget(QWidget *parent);
|
||||
|
||||
QString name() const;
|
||||
QString group() const;
|
||||
QIcon icon() const;
|
||||
QString toolTip() const;
|
||||
QString whatsThis() const;
|
||||
bool isContainer() const;
|
||||
|
||||
QString domXml() const;
|
||||
|
||||
QString includeFile() const;
|
||||
|
||||
private:
|
||||
bool initialized;
|
||||
};
|
||||
|
||||
|
||||
#endif // COLOR_WIDGETS_COLOR_PALETTE_WIDGET_PLUGIN_HPP
|
95
thirdparty/Qt-Color-Widgets/color_widgets_designer_plugin/color_preview_plugin.cpp
vendored
Normal file
|
@ -0,0 +1,95 @@
|
|||
/**
|
||||
* \file
|
||||
*
|
||||
* \author Mattia Basaglia
|
||||
*
|
||||
* \copyright Copyright (C) 2013-2020 Mattia Basaglia
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
#include "color_preview_plugin.hpp"
|
||||
#include "QtColorWidgets/color_preview.hpp"
|
||||
#include <QtPlugin>
|
||||
|
||||
|
||||
ColorPreview_Plugin::ColorPreview_Plugin(QObject *parent)
|
||||
: QObject(parent), initialized(false)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void ColorPreview_Plugin::initialize(QDesignerFormEditorInterface *)
|
||||
{
|
||||
if (initialized)
|
||||
return;
|
||||
|
||||
initialized = true;
|
||||
}
|
||||
|
||||
bool ColorPreview_Plugin::isInitialized() const
|
||||
{
|
||||
return initialized;
|
||||
}
|
||||
|
||||
QWidget *ColorPreview_Plugin::createWidget(QWidget *parent)
|
||||
{
|
||||
return new color_widgets::ColorPreview(parent);
|
||||
}
|
||||
|
||||
QString ColorPreview_Plugin::name() const
|
||||
{
|
||||
return "color_widgets::ColorPreview";
|
||||
}
|
||||
|
||||
QString ColorPreview_Plugin::group() const
|
||||
{
|
||||
return "Color Widgets";
|
||||
}
|
||||
|
||||
QIcon ColorPreview_Plugin::icon() const
|
||||
{
|
||||
return QIcon();
|
||||
}
|
||||
|
||||
QString ColorPreview_Plugin::toolTip() const
|
||||
{
|
||||
return "Display a color";
|
||||
}
|
||||
|
||||
QString ColorPreview_Plugin::whatsThis() const
|
||||
{
|
||||
return toolTip();
|
||||
}
|
||||
|
||||
bool ColorPreview_Plugin::isContainer() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
QString ColorPreview_Plugin::domXml() const
|
||||
{
|
||||
|
||||
return "<ui language=\"c++\">\n"
|
||||
" <widget class=\"color_widgets::ColorPreview\" name=\"colorPreview\">\n"
|
||||
" </widget>\n"
|
||||
"</ui>\n";
|
||||
}
|
||||
|
||||
QString ColorPreview_Plugin::includeFile() const
|
||||
{
|
||||
return "QtColorWidgets/color_preview.hpp";
|
||||
}
|
||||
|
||||
//Q_EXPORT_PLUGIN2(color_widgets, ColorPreview_Plugin);
|
55
thirdparty/Qt-Color-Widgets/color_widgets_designer_plugin/color_preview_plugin.hpp
vendored
Normal file
|
@ -0,0 +1,55 @@
|
|||
/**
|
||||
* \file
|
||||
*
|
||||
* \author Mattia Basaglia
|
||||
*
|
||||
* \copyright Copyright (C) 2013-2020 Mattia Basaglia
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
#ifndef COLOR_PREVIEW_PLUGIN_HPP
|
||||
#define COLOR_PREVIEW_PLUGIN_HPP
|
||||
|
||||
#include <QtUiPlugin/QDesignerCustomWidgetInterface>
|
||||
|
||||
class ColorPreview_Plugin : public QObject, public QDesignerCustomWidgetInterface
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_INTERFACES(QDesignerCustomWidgetInterface)
|
||||
|
||||
public:
|
||||
ColorPreview_Plugin(QObject *parent = 0);
|
||||
|
||||
void initialize(QDesignerFormEditorInterface *core);
|
||||
bool isInitialized() const;
|
||||
|
||||
QWidget *createWidget(QWidget *parent);
|
||||
|
||||
QString name() const;
|
||||
QString group() const;
|
||||
QIcon icon() const;
|
||||
QString toolTip() const;
|
||||
QString whatsThis() const;
|
||||
bool isContainer() const;
|
||||
|
||||
QString domXml() const;
|
||||
|
||||
QString includeFile() const;
|
||||
|
||||
private:
|
||||
bool initialized;
|
||||
};
|
||||
|
||||
#endif // COLOR_PREVIEW_PLUGIN_HPP
|
92
thirdparty/Qt-Color-Widgets/color_widgets_designer_plugin/color_selector_plugin.cpp
vendored
Normal file
|
@ -0,0 +1,92 @@
|
|||
/**
|
||||
* \file
|
||||
*
|
||||
* \author Mattia Basaglia
|
||||
*
|
||||
* \copyright Copyright (C) 2013-2020 Mattia Basaglia
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
#include "color_selector_plugin.hpp"
|
||||
#include "QtColorWidgets/color_selector.hpp"
|
||||
#include <QtPlugin>
|
||||
|
||||
ColorSelector_Plugin::ColorSelector_Plugin(QObject *parent)
|
||||
: QObject(parent), initialized(false)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void ColorSelector_Plugin::initialize(QDesignerFormEditorInterface *)
|
||||
{
|
||||
if (initialized)
|
||||
return;
|
||||
|
||||
initialized = true;
|
||||
}
|
||||
|
||||
bool ColorSelector_Plugin::isInitialized() const
|
||||
{
|
||||
return initialized;
|
||||
}
|
||||
|
||||
QWidget *ColorSelector_Plugin::createWidget(QWidget *parent)
|
||||
{
|
||||
return new color_widgets::ColorSelector(parent);
|
||||
}
|
||||
|
||||
QString ColorSelector_Plugin::name() const
|
||||
{
|
||||
return "color_widgets::ColorSelector";
|
||||
}
|
||||
|
||||
QString ColorSelector_Plugin::group() const
|
||||
{
|
||||
return "Color Widgets";
|
||||
}
|
||||
|
||||
QIcon ColorSelector_Plugin::icon() const
|
||||
{
|
||||
return QIcon();
|
||||
}
|
||||
|
||||
QString ColorSelector_Plugin::toolTip() const
|
||||
{
|
||||
return "Display a color and opens a color dialog on click";
|
||||
}
|
||||
|
||||
QString ColorSelector_Plugin::whatsThis() const
|
||||
{
|
||||
return toolTip();
|
||||
}
|
||||
|
||||
bool ColorSelector_Plugin::isContainer() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
QString ColorSelector_Plugin::domXml() const
|
||||
{
|
||||
|
||||
return "<ui language=\"c++\">\n"
|
||||
" <widget class=\"color_widgets::ColorSelector\" name=\"ColorSelector\">\n"
|
||||
" </widget>\n"
|
||||
"</ui>\n";
|
||||
}
|
||||
|
||||
QString ColorSelector_Plugin::includeFile() const
|
||||
{
|
||||
return "QtColorWidgets/color_selector.hpp";
|
||||
}
|
55
thirdparty/Qt-Color-Widgets/color_widgets_designer_plugin/color_selector_plugin.hpp
vendored
Normal file
|
@ -0,0 +1,55 @@
|
|||
/**
|
||||
* \file
|
||||
*
|
||||
* \author Mattia Basaglia
|
||||
*
|
||||
* \copyright Copyright (C) 2013-2020 Mattia Basaglia
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
#ifndef COLOR_SELECTOR_PLUGIN_HPP
|
||||
#define COLOR_SELECTOR_PLUGIN_HPP
|
||||
|
||||
#include <QtUiPlugin/QDesignerCustomWidgetInterface>
|
||||
|
||||
class ColorSelector_Plugin : public QObject, public QDesignerCustomWidgetInterface
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_INTERFACES(QDesignerCustomWidgetInterface)
|
||||
|
||||
public:
|
||||
ColorSelector_Plugin(QObject *parent = 0);
|
||||
|
||||
void initialize(QDesignerFormEditorInterface *core);
|
||||
bool isInitialized() const;
|
||||
|
||||
QWidget *createWidget(QWidget *parent);
|
||||
|
||||
QString name() const;
|
||||
QString group() const;
|
||||
QIcon icon() const;
|
||||
QString toolTip() const;
|
||||
QString whatsThis() const;
|
||||
bool isContainer() const;
|
||||
|
||||
QString domXml() const;
|
||||
|
||||
QString includeFile() const;
|
||||
|
||||
private:
|
||||
bool initialized;
|
||||
};
|
||||
|
||||
#endif // COLOR_SELECTOR_PLUGIN_HPP
|
97
thirdparty/Qt-Color-Widgets/color_widgets_designer_plugin/color_wheel_plugin.cpp
vendored
Normal file
|
@ -0,0 +1,97 @@
|
|||
/**
|
||||
* \file
|
||||
*
|
||||
* \author Mattia Basaglia
|
||||
*
|
||||
* \copyright Copyright (C) 2013-2020 Mattia Basaglia
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
#include "color_wheel_plugin.hpp"
|
||||
#include "QtColorWidgets/color_wheel.hpp"
|
||||
|
||||
ColorWheel_Plugin::ColorWheel_Plugin(QObject *parent) :
|
||||
QObject(parent), initialized(false)
|
||||
{
|
||||
}
|
||||
|
||||
void ColorWheel_Plugin::initialize(QDesignerFormEditorInterface *)
|
||||
{
|
||||
initialized = true;
|
||||
}
|
||||
|
||||
bool ColorWheel_Plugin::isInitialized() const
|
||||
{
|
||||
return initialized;
|
||||
}
|
||||
|
||||
QWidget *ColorWheel_Plugin::createWidget(QWidget *parent)
|
||||
{
|
||||
return new color_widgets::ColorWheel(parent);
|
||||
}
|
||||
|
||||
QString ColorWheel_Plugin::name() const
|
||||
{
|
||||
return "color_widgets::ColorWheel";
|
||||
}
|
||||
|
||||
QString ColorWheel_Plugin::group() const
|
||||
{
|
||||
return "Color Widgets";
|
||||
}
|
||||
|
||||
QIcon ColorWheel_Plugin::icon() const
|
||||
{
|
||||
color_widgets::ColorWheel w;
|
||||
w.resize(64,64);
|
||||
w.setWheelWidth(8);
|
||||
QPixmap pix(64,64);
|
||||
w.render(&pix);
|
||||
return QIcon(pix);
|
||||
}
|
||||
|
||||
QString ColorWheel_Plugin::toolTip() const
|
||||
{
|
||||
return "A widget that allows an intuitive selection of HSL parameters for a QColor";
|
||||
}
|
||||
|
||||
QString ColorWheel_Plugin::whatsThis() const
|
||||
{
|
||||
return toolTip();
|
||||
}
|
||||
|
||||
bool ColorWheel_Plugin::isContainer() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
QString ColorWheel_Plugin::domXml() const
|
||||
{
|
||||
return "<ui language=\"c++\">\n"
|
||||
" <widget class=\"color_widgets::ColorWheel\" name=\"colorWheel\">\n"
|
||||
" <property name=\"sizePolicy\">\n"
|
||||
" <sizepolicy hsizetype=\"Minimum\" vsizetype=\"Minimum\">\n"
|
||||
" <horstretch>0</horstretch>\n"
|
||||
" <verstretch>0</verstretch>\n"
|
||||
" </sizepolicy>\n"
|
||||
" </property>\n"
|
||||
" </widget>\n"
|
||||
"</ui>\n";
|
||||
}
|
||||
|
||||
QString ColorWheel_Plugin::includeFile() const
|
||||
{
|
||||
return "QtColorWidgets/color_wheel.hpp";
|
||||
}
|
57
thirdparty/Qt-Color-Widgets/color_widgets_designer_plugin/color_wheel_plugin.hpp
vendored
Normal file
|
@ -0,0 +1,57 @@
|
|||
/**
|
||||
* \file
|
||||
*
|
||||
* \author Mattia Basaglia
|
||||
*
|
||||
* \copyright Copyright (C) 2013-2020 Mattia Basaglia
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
#ifndef COLOR_WHEEL_PLUGIN_HPP
|
||||
#define COLOR_WHEEL_PLUGIN_HPP
|
||||
|
||||
#include <QObject>
|
||||
#include <QtUiPlugin/QDesignerCustomWidgetInterface>
|
||||
|
||||
class ColorWheel_Plugin : public QObject, public QDesignerCustomWidgetInterface
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_INTERFACES(QDesignerCustomWidgetInterface)
|
||||
|
||||
public:
|
||||
ColorWheel_Plugin(QObject *parent = 0);
|
||||
|
||||
void initialize(QDesignerFormEditorInterface *core);
|
||||
bool isInitialized() const;
|
||||
|
||||
QWidget *createWidget(QWidget *parent);
|
||||
|
||||
QString name() const;
|
||||
QString group() const;
|
||||
QIcon icon() const;
|
||||
QString toolTip() const;
|
||||
QString whatsThis() const;
|
||||
bool isContainer() const;
|
||||
|
||||
QString domXml() const;
|
||||
|
||||
QString includeFile() const;
|
||||
|
||||
private:
|
||||
bool initialized;
|
||||
};
|
||||
|
||||
|
||||
#endif // COLOR_WHEEL_PLUGIN_HPP
|
56
thirdparty/Qt-Color-Widgets/color_widgets_designer_plugin/color_widget_plugin_collection.cpp
vendored
Normal file
|
@ -0,0 +1,56 @@
|
|||
/**
|
||||
* \file
|
||||
*
|
||||
* \author Mattia Basaglia
|
||||
*
|
||||
* \copyright Copyright (C) 2013-2020 Mattia Basaglia
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
#include "color_widget_plugin_collection.hpp"
|
||||
#include "color_preview_plugin.hpp"
|
||||
#include "color_wheel_plugin.hpp"
|
||||
#include "gradient_slider_plugin.hpp"
|
||||
#include "hue_slider_plugin.hpp"
|
||||
#include "color_selector_plugin.hpp"
|
||||
#include "color_list_plugin.hpp"
|
||||
#include "swatch_plugin.hpp"
|
||||
#include "color_palette_widget_plugin.hpp"
|
||||
#include "color_2d_slider_plugin.hpp"
|
||||
#include "color_line_edit_plugin.hpp"
|
||||
#include "gradient_editor_plugin.hpp"
|
||||
// add new plugin headers above this line
|
||||
|
||||
ColorWidgets_PluginCollection::ColorWidgets_PluginCollection(QObject *parent) :
|
||||
QObject(parent)
|
||||
{
|
||||
widgets.push_back(new ColorPreview_Plugin(this));
|
||||
widgets.push_back(new ColorWheel_Plugin(this));
|
||||
widgets.push_back(new GradientSlider_Plugin(this));
|
||||
widgets.push_back(new HueSlider_Plugin(this));
|
||||
widgets.push_back(new ColorSelector_Plugin(this));
|
||||
widgets.push_back(new ColorListWidget_Plugin(this));
|
||||
widgets.push_back(new Swatch_Plugin(this));
|
||||
widgets.push_back(new ColorPaletteWidget_Plugin(this));
|
||||
widgets.push_back(new Color2DSlider_Plugin(this));
|
||||
widgets.push_back(new ColorLineEdit_Plugin(this));
|
||||
widgets.push_back(new GradientEditor_Plugin(this));
|
||||
// add new plugins above this line
|
||||
}
|
||||
|
||||
QList<QDesignerCustomWidgetInterface *> ColorWidgets_PluginCollection::customWidgets() const
|
||||
{
|
||||
return widgets;
|
||||
}
|
43
thirdparty/Qt-Color-Widgets/color_widgets_designer_plugin/color_widget_plugin_collection.hpp
vendored
Normal file
|
@ -0,0 +1,43 @@
|
|||
/**
|
||||
* \file
|
||||
*
|
||||
* \author Mattia Basaglia
|
||||
*
|
||||
* \copyright Copyright (C) 2013-2020 Mattia Basaglia
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
#ifndef COLOR_WIDGET_PLUGIN_COLLECTION_HPP
|
||||
#define COLOR_WIDGET_PLUGIN_COLLECTION_HPP
|
||||
|
||||
#include <QtUiPlugin/QDesignerCustomWidgetCollectionInterface>
|
||||
|
||||
class ColorWidgets_PluginCollection : public QObject, public QDesignerCustomWidgetCollectionInterface
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_PLUGIN_METADATA(IID "mattia.basaglia.ColorWidgetsPlugin")
|
||||
Q_INTERFACES(QDesignerCustomWidgetCollectionInterface)
|
||||
|
||||
public:
|
||||
explicit ColorWidgets_PluginCollection(QObject *parent = 0);
|
||||
|
||||
QList<QDesignerCustomWidgetInterface*> customWidgets() const;
|
||||
|
||||
private:
|
||||
QList<QDesignerCustomWidgetInterface*> widgets;
|
||||
|
||||
};
|
||||
|
||||
#endif // COLOR_WIDGET_PLUGIN_COLLECTION_HPP
|
98
thirdparty/Qt-Color-Widgets/color_widgets_designer_plugin/gradient_editor_plugin.cpp
vendored
Normal file
|
@ -0,0 +1,98 @@
|
|||
/**
|
||||
* \file
|
||||
*
|
||||
* \author Mattia Basaglia
|
||||
*
|
||||
* \copyright Copyright (C) 2013-2020 Mattia Basaglia
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
#include "gradient_editor_plugin.hpp"
|
||||
#include "QtColorWidgets/gradient_editor.hpp"
|
||||
|
||||
QWidget* GradientEditor_Plugin::createWidget(QWidget *parent)
|
||||
{
|
||||
color_widgets::GradientEditor *widget = new color_widgets::GradientEditor(parent);
|
||||
return widget;
|
||||
}
|
||||
|
||||
QIcon GradientEditor_Plugin::icon() const
|
||||
{
|
||||
color_widgets::GradientEditor w;
|
||||
w.resize(64,16);
|
||||
QGradientStops cols;
|
||||
cols.push_back({0.2, Qt::green});
|
||||
cols.push_back({0.5, Qt::yellow});
|
||||
cols.push_back({0.8, Qt::red});
|
||||
w.setStops(cols);
|
||||
QPixmap pix(64,64);
|
||||
pix.fill(Qt::transparent);
|
||||
w.render(&pix, QPoint(0,16));
|
||||
return QIcon(pix);
|
||||
}
|
||||
|
||||
QString GradientEditor_Plugin::domXml() const
|
||||
{
|
||||
return "<ui language=\"c++\">\n"
|
||||
" <widget class=\"color_widgets::GradientEditor\" name=\"gradient_editor\">\n"
|
||||
" </widget>\n"
|
||||
"</ui>\n";
|
||||
}
|
||||
|
||||
bool GradientEditor_Plugin::isContainer() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
GradientEditor_Plugin::GradientEditor_Plugin(QObject *parent) :
|
||||
QObject(parent), initialized(false)
|
||||
{
|
||||
}
|
||||
|
||||
void GradientEditor_Plugin::initialize(QDesignerFormEditorInterface *)
|
||||
{
|
||||
initialized = true;
|
||||
}
|
||||
|
||||
bool GradientEditor_Plugin::isInitialized() const
|
||||
{
|
||||
return initialized;
|
||||
}
|
||||
|
||||
QString GradientEditor_Plugin::name() const
|
||||
{
|
||||
return "color_widgets::GradientEditor";
|
||||
}
|
||||
|
||||
QString GradientEditor_Plugin::group() const
|
||||
{
|
||||
return "Color Widgets";
|
||||
}
|
||||
|
||||
QString GradientEditor_Plugin::toolTip() const
|
||||
{
|
||||
return "Widget to edit gradient stops";
|
||||
}
|
||||
|
||||
QString GradientEditor_Plugin::whatsThis() const
|
||||
{
|
||||
return toolTip();
|
||||
}
|
||||
|
||||
QString GradientEditor_Plugin::includeFile() const
|
||||
{
|
||||
return "QtColorWidgets/gradient_editor.hpp";
|
||||
}
|
||||
|
58
thirdparty/Qt-Color-Widgets/color_widgets_designer_plugin/gradient_editor_plugin.hpp
vendored
Normal file
|
@ -0,0 +1,58 @@
|
|||
/**
|
||||
* \file
|
||||
*
|
||||
* \author Mattia Basaglia
|
||||
*
|
||||
* \copyright Copyright (C) 2013-2020 Mattia Basaglia
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
#ifndef COLOR_WIDGETS_GRADIENT_EDITOR_PLUGIN_HPP
|
||||
#define COLOR_WIDGETS_GRADIENT_EDITOR_PLUGIN_HPP
|
||||
|
||||
#include <QObject>
|
||||
#include <QtUiPlugin/QDesignerCustomWidgetInterface>
|
||||
|
||||
class GradientEditor_Plugin : public QObject, public QDesignerCustomWidgetInterface
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_INTERFACES(QDesignerCustomWidgetInterface)
|
||||
|
||||
public:
|
||||
explicit GradientEditor_Plugin(QObject *parent = nullptr);
|
||||
|
||||
void initialize(QDesignerFormEditorInterface *core) Q_DECL_OVERRIDE;
|
||||
bool isInitialized() const Q_DECL_OVERRIDE;
|
||||
|
||||
QWidget *createWidget(QWidget *parent) Q_DECL_OVERRIDE;
|
||||
|
||||
QString name() const Q_DECL_OVERRIDE;
|
||||
QString group() const Q_DECL_OVERRIDE;
|
||||
QIcon icon() const Q_DECL_OVERRIDE;
|
||||
QString toolTip() const Q_DECL_OVERRIDE;
|
||||
QString whatsThis() const Q_DECL_OVERRIDE;
|
||||
bool isContainer() const Q_DECL_OVERRIDE;
|
||||
|
||||
QString domXml() const Q_DECL_OVERRIDE;
|
||||
|
||||
QString includeFile() const Q_DECL_OVERRIDE;
|
||||
|
||||
private:
|
||||
bool initialized;
|
||||
};
|
||||
|
||||
|
||||
#endif // COLOR_WIDGETS_GRADIENT_EDITOR_PLUGIN_HPP
|
||||
|
102
thirdparty/Qt-Color-Widgets/color_widgets_designer_plugin/gradient_slider_plugin.cpp
vendored
Normal file
|
@ -0,0 +1,102 @@
|
|||
/**
|
||||
* \file
|
||||
*
|
||||
* \author Mattia Basaglia
|
||||
*
|
||||
* \copyright Copyright (C) 2013-2020 Mattia Basaglia
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
#include "gradient_slider_plugin.hpp"
|
||||
#include "QtColorWidgets/gradient_slider.hpp"
|
||||
#include <QtPlugin>
|
||||
|
||||
GradientSlider_Plugin::GradientSlider_Plugin(QObject *parent)
|
||||
: QObject(parent), initialized(false)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void GradientSlider_Plugin::initialize(QDesignerFormEditorInterface *)
|
||||
{
|
||||
if (initialized)
|
||||
return;
|
||||
|
||||
initialized = true;
|
||||
}
|
||||
|
||||
bool GradientSlider_Plugin::isInitialized() const
|
||||
{
|
||||
return initialized;
|
||||
}
|
||||
|
||||
QWidget *GradientSlider_Plugin::createWidget(QWidget *parent)
|
||||
{
|
||||
return new color_widgets::GradientSlider(parent);
|
||||
}
|
||||
|
||||
QString GradientSlider_Plugin::name() const
|
||||
{
|
||||
return "color_widgets::GradientSlider";
|
||||
}
|
||||
|
||||
QString GradientSlider_Plugin::group() const
|
||||
{
|
||||
return "Color Widgets";
|
||||
}
|
||||
|
||||
QIcon GradientSlider_Plugin::icon() const
|
||||
{
|
||||
color_widgets::GradientSlider w;
|
||||
w.resize(64,16);
|
||||
QVector<QColor> cols;
|
||||
cols.push_back(Qt::green);
|
||||
cols.push_back(Qt::yellow);
|
||||
cols.push_back(Qt::red);
|
||||
w.setColors(cols);
|
||||
QPixmap pix(64,64);
|
||||
pix.fill(Qt::transparent);
|
||||
w.render(&pix,QPoint(0,16));
|
||||
return QIcon(pix);
|
||||
}
|
||||
|
||||
QString GradientSlider_Plugin::toolTip() const
|
||||
{
|
||||
return "Slider over a gradient";
|
||||
}
|
||||
|
||||
QString GradientSlider_Plugin::whatsThis() const
|
||||
{
|
||||
return toolTip();
|
||||
}
|
||||
|
||||
bool GradientSlider_Plugin::isContainer() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
QString GradientSlider_Plugin::domXml() const
|
||||
{
|
||||
|
||||
return "<ui language=\"c++\">\n"
|
||||
" <widget class=\"color_widgets::GradientSlider\" name=\"GradientSlider\">\n"
|
||||
" </widget>\n"
|
||||
"</ui>\n";
|
||||
}
|
||||
|
||||
QString GradientSlider_Plugin::includeFile() const
|
||||
{
|
||||
return "QtColorWidgets/gradient_slider.hpp";
|
||||
}
|
34
thirdparty/Qt-Color-Widgets/color_widgets_designer_plugin/gradient_slider_plugin.hpp
vendored
Normal file
|
@ -0,0 +1,34 @@
|
|||
#ifndef GRADIENT_SLIDER_PLUGIN_HPP
|
||||
#define GRADIENT_SLIDER_PLUGIN_HPP
|
||||
|
||||
#include <QtUiPlugin/QDesignerCustomWidgetInterface>
|
||||
|
||||
class GradientSlider_Plugin : public QObject, public QDesignerCustomWidgetInterface
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_INTERFACES(QDesignerCustomWidgetInterface)
|
||||
|
||||
public:
|
||||
GradientSlider_Plugin(QObject *parent = 0);
|
||||
|
||||
void initialize(QDesignerFormEditorInterface *core);
|
||||
bool isInitialized() const;
|
||||
|
||||
QWidget *createWidget(QWidget *parent);
|
||||
|
||||
QString name() const;
|
||||
QString group() const;
|
||||
QIcon icon() const;
|
||||
QString toolTip() const;
|
||||
QString whatsThis() const;
|
||||
bool isContainer() const;
|
||||
|
||||
QString domXml() const;
|
||||
|
||||
QString includeFile() const;
|
||||
|
||||
private:
|
||||
bool initialized;
|
||||
};
|
||||
|
||||
#endif // GRADIENT_SLIDER_PLUGIN_HPP
|
98
thirdparty/Qt-Color-Widgets/color_widgets_designer_plugin/hue_slider_plugin.cpp
vendored
Normal file
|
@ -0,0 +1,98 @@
|
|||
/**
|
||||
* \file
|
||||
*
|
||||
* \author Mattia Basaglia
|
||||
*
|
||||
* \copyright Copyright (C) 2013-2020 Mattia Basaglia
|
||||
* \copyright Copyright (C) 2014 Calle Laakkonen
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
#include "hue_slider_plugin.hpp"
|
||||
#include "QtColorWidgets/hue_slider.hpp"
|
||||
#include <QtPlugin>
|
||||
|
||||
HueSlider_Plugin::HueSlider_Plugin(QObject *parent)
|
||||
: QObject(parent), initialized(false)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void HueSlider_Plugin::initialize(QDesignerFormEditorInterface *)
|
||||
{
|
||||
if (initialized)
|
||||
return;
|
||||
|
||||
initialized = true;
|
||||
}
|
||||
|
||||
bool HueSlider_Plugin::isInitialized() const
|
||||
{
|
||||
return initialized;
|
||||
}
|
||||
|
||||
QWidget *HueSlider_Plugin::createWidget(QWidget *parent)
|
||||
{
|
||||
return new color_widgets::HueSlider(parent);
|
||||
}
|
||||
|
||||
QString HueSlider_Plugin::name() const
|
||||
{
|
||||
return "color_widgets::HueSlider";
|
||||
}
|
||||
|
||||
QString HueSlider_Plugin::group() const
|
||||
{
|
||||
return "Color Widgets";
|
||||
}
|
||||
|
||||
QIcon HueSlider_Plugin::icon() const
|
||||
{
|
||||
color_widgets::HueSlider w;
|
||||
w.resize(64,16);
|
||||
QPixmap pix(64,64);
|
||||
pix.fill(Qt::transparent);
|
||||
w.render(&pix,QPoint(0,16));
|
||||
return QIcon(pix);
|
||||
}
|
||||
|
||||
QString HueSlider_Plugin::toolTip() const
|
||||
{
|
||||
return "Slider over a hue gradient";
|
||||
}
|
||||
|
||||
QString HueSlider_Plugin::whatsThis() const
|
||||
{
|
||||
return toolTip();
|
||||
}
|
||||
|
||||
bool HueSlider_Plugin::isContainer() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
QString HueSlider_Plugin::domXml() const
|
||||
{
|
||||
|
||||
return "<ui language=\"c++\">\n"
|
||||
" <widget class=\"color_widgets::HueSlider\" name=\"HueSlider\">\n"
|
||||
" </widget>\n"
|
||||
"</ui>\n";
|
||||
}
|
||||
|
||||
QString HueSlider_Plugin::includeFile() const
|
||||
{
|
||||
return "QtColorWidgets/hue_slider.hpp";
|
||||
}
|
34
thirdparty/Qt-Color-Widgets/color_widgets_designer_plugin/hue_slider_plugin.hpp
vendored
Normal file
|
@ -0,0 +1,34 @@
|
|||
#ifndef HUE_SLIDER_PLUGIN_HPP
|
||||
#define HUE_SLIDER_PLUGIN_HPP
|
||||
|
||||
#include <QtUiPlugin/QDesignerCustomWidgetInterface>
|
||||
|
||||
class HueSlider_Plugin : public QObject, public QDesignerCustomWidgetInterface
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_INTERFACES(QDesignerCustomWidgetInterface)
|
||||
|
||||
public:
|
||||
HueSlider_Plugin(QObject *parent = 0);
|
||||
|
||||
void initialize(QDesignerFormEditorInterface *core);
|
||||
bool isInitialized() const;
|
||||
|
||||
QWidget *createWidget(QWidget *parent);
|
||||
|
||||
QString name() const;
|
||||
QString group() const;
|
||||
QIcon icon() const;
|
||||
QString toolTip() const;
|
||||
QString whatsThis() const;
|
||||
bool isContainer() const;
|
||||
|
||||
QString domXml() const;
|
||||
|
||||
QString includeFile() const;
|
||||
|
||||
private:
|
||||
bool initialized;
|
||||
};
|
||||
|
||||
#endif // HUE_SLIDER_PLUGIN_HPP
|
|
@ -0,0 +1,236 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# Copyright (C) 2013-2020 Mattia Basaglia
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Lesser General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
SELFDIR=$(dirname $(readlink -se "${BASH_SOURCE[0]}"))
|
||||
|
||||
function class_to_underscore()
|
||||
{
|
||||
echo "$1" | sed -r -e 's/([a-z])([A-Z])/\1_\L\2/g' -e 's/[A-Z]/\L\0/g'
|
||||
}
|
||||
|
||||
function class_to_header()
|
||||
{
|
||||
echo "$(class_to_underscore "$1").hpp"
|
||||
}
|
||||
|
||||
function header_to_source()
|
||||
{
|
||||
echo "$1" | sed -r -e 's/\.h(pp)?$/.cpp/i'
|
||||
}
|
||||
|
||||
function read_arg()
|
||||
{
|
||||
varname=$1
|
||||
prompt="$2"
|
||||
default="$3"
|
||||
[ "$default" ] && prompt="${prompt} [$default]"
|
||||
read -p "$prompt: " -i "$default" $varname
|
||||
[ -z "${!varname}" ] && eval "$varname=\"$default\""
|
||||
}
|
||||
|
||||
function header_to_guard()
|
||||
{
|
||||
echo "$1" | tr [:lower:] [:upper:] | tr /. _
|
||||
}
|
||||
|
||||
read_arg class "Class name"
|
||||
[ -z "$class" ] && exit 1
|
||||
read_arg description "Description"
|
||||
read_arg header "Header" "$(class_to_header "$class")"
|
||||
|
||||
read_arg plugin "Plugin Class" "${class}_Plugin"
|
||||
read_arg plugin_header "Plugin Header" "$(class_to_header "$plugin")"
|
||||
read_arg plugin_source "Plugin Source" "$(header_to_source "$plugin_header")"
|
||||
read_arg plugin_path "Plugin Path" "$SELFDIR"
|
||||
read_arg plugin_author "Author" "$(git config user.name)"
|
||||
read_arg plugin_copyright "Copyright" "2013-$(date +%Y) $plugin_author"
|
||||
|
||||
echo "Summary:"
|
||||
echo " Class: $class"
|
||||
echo " Description: $description"
|
||||
echo " Header: $header"
|
||||
echo " Plugin Class: $plugin"
|
||||
echo " Plugin Header: $plugin_header"
|
||||
echo " Plugin Source: $plugin_source"
|
||||
echo " Plugin Path: $plugin_path"
|
||||
echo " Author: $plugin_author"
|
||||
echo " Copyright: $plugin_copyright"
|
||||
|
||||
object_name="$(class_to_underscore $class)"
|
||||
|
||||
cat >"$plugin_path/$plugin_source" <<PLUGIN
|
||||
/**
|
||||
* \file
|
||||
*
|
||||
* \author $plugin_author
|
||||
*
|
||||
* \copyright Copyright (C) $plugin_copyright
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
#include "$plugin_header"
|
||||
#include "QtColorWidgets/$header"
|
||||
|
||||
QWidget* $plugin::createWidget(QWidget *parent)
|
||||
{
|
||||
color_widgets::$class *widget = new color_widgets::$class(parent);
|
||||
return widget;
|
||||
}
|
||||
|
||||
QIcon $plugin::icon() const
|
||||
{
|
||||
return QIcon();
|
||||
}
|
||||
|
||||
QString $plugin::domXml() const
|
||||
{
|
||||
return "<ui language=\"c++\">\n"
|
||||
" <widget class=\"color_widgets::$class\" name=\"$object_name\">\n"
|
||||
" </widget>\n"
|
||||
"</ui>\n";
|
||||
}
|
||||
|
||||
bool $plugin::isContainer() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
$plugin::$plugin(QObject *parent) :
|
||||
QObject(parent), initialized(false)
|
||||
{
|
||||
}
|
||||
|
||||
void $plugin::initialize(QDesignerFormEditorInterface *)
|
||||
{
|
||||
initialized = true;
|
||||
}
|
||||
|
||||
bool $plugin::isInitialized() const
|
||||
{
|
||||
return initialized;
|
||||
}
|
||||
|
||||
QString $plugin::name() const
|
||||
{
|
||||
return "color_widgets::$class";
|
||||
}
|
||||
|
||||
QString $plugin::group() const
|
||||
{
|
||||
return "Color Widgets";
|
||||
}
|
||||
|
||||
QString $plugin::toolTip() const
|
||||
{
|
||||
return "$description";
|
||||
}
|
||||
|
||||
QString $plugin::whatsThis() const
|
||||
{
|
||||
return toolTip();
|
||||
}
|
||||
|
||||
QString $plugin::includeFile() const
|
||||
{
|
||||
return "QtColorWidgets/$header";
|
||||
}
|
||||
|
||||
PLUGIN
|
||||
|
||||
header_guard="COLOR_WIDGETS_$(header_to_guard "$plugin_header")"
|
||||
cat >"$plugin_path/$plugin_header" <<PLUGIN
|
||||
/**
|
||||
* \file
|
||||
*
|
||||
* \author $plugin_author
|
||||
*
|
||||
* \copyright Copyright (C) $plugin_copyright
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
#ifndef $header_guard
|
||||
#define $header_guard
|
||||
|
||||
#include <QObject>
|
||||
#include <QtUiPlugin/QDesignerCustomWidgetInterface>
|
||||
|
||||
class $plugin : public QObject, public QDesignerCustomWidgetInterface
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_INTERFACES(QDesignerCustomWidgetInterface)
|
||||
|
||||
public:
|
||||
explicit $plugin(QObject *parent = nullptr);
|
||||
|
||||
void initialize(QDesignerFormEditorInterface *core) Q_DECL_OVERRIDE;
|
||||
bool isInitialized() const Q_DECL_OVERRIDE;
|
||||
|
||||
QWidget *createWidget(QWidget *parent) Q_DECL_OVERRIDE;
|
||||
|
||||
QString name() const Q_DECL_OVERRIDE;
|
||||
QString group() const Q_DECL_OVERRIDE;
|
||||
QIcon icon() const Q_DECL_OVERRIDE;
|
||||
QString toolTip() const Q_DECL_OVERRIDE;
|
||||
QString whatsThis() const Q_DECL_OVERRIDE;
|
||||
bool isContainer() const Q_DECL_OVERRIDE;
|
||||
|
||||
QString domXml() const Q_DECL_OVERRIDE;
|
||||
|
||||
QString includeFile() const Q_DECL_OVERRIDE;
|
||||
|
||||
private:
|
||||
bool initialized;
|
||||
};
|
||||
|
||||
|
||||
#endif // $header_guard
|
||||
|
||||
PLUGIN
|
||||
|
||||
sed -i -r \
|
||||
-e "\\~# add new sources above this line~i\\$plugin_source" \
|
||||
-e "\\~# add new headers above this line~i\\$plugin_header" \
|
||||
"$plugin_path/CMakeLists.txt"
|
||||
|
||||
sed -i -r \
|
||||
-e "\\~// add new plugin headers above this line~i#include \"$plugin_header\"" \
|
||||
-e "\\~// add new plugins above this line~i\ widgets.push_back(new $plugin(this));" \
|
||||
"$plugin_path/color_widget_plugin_collection.cpp"
|
106
thirdparty/Qt-Color-Widgets/color_widgets_designer_plugin/swatch_plugin.cpp
vendored
Normal file
|
@ -0,0 +1,106 @@
|
|||
/**
|
||||
* \file
|
||||
*
|
||||
* \author Mattia Basaglia
|
||||
*
|
||||
* \copyright Copyright (C) 2013-2020 Mattia Basaglia
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
#include "swatch_plugin.hpp"
|
||||
#include "QtColorWidgets/swatch.hpp"
|
||||
|
||||
Swatch_Plugin::Swatch_Plugin(QObject *parent) :
|
||||
QObject(parent), initialized(false)
|
||||
{
|
||||
}
|
||||
|
||||
void Swatch_Plugin::initialize(QDesignerFormEditorInterface *)
|
||||
{
|
||||
initialized = true;
|
||||
}
|
||||
|
||||
bool Swatch_Plugin::isInitialized() const
|
||||
{
|
||||
return initialized;
|
||||
}
|
||||
|
||||
QWidget* Swatch_Plugin::createWidget(QWidget *parent)
|
||||
{
|
||||
color_widgets::Swatch *wid = new color_widgets::Swatch(parent);
|
||||
wid->palette().setColumns(12);
|
||||
for ( int i = 0; i < 6; i++ )
|
||||
{
|
||||
for ( int j = 0; j < wid->palette().columns(); j++ )
|
||||
{
|
||||
float f = float(j)/wid->palette().columns();
|
||||
wid->palette().appendColor(QColor::fromHsvF(i/8.0,1-f,0.5+f/2));
|
||||
}
|
||||
}
|
||||
return wid;
|
||||
}
|
||||
|
||||
QString Swatch_Plugin::name() const
|
||||
{
|
||||
return "color_widgets::Swatch";
|
||||
}
|
||||
|
||||
QString Swatch_Plugin::group() const
|
||||
{
|
||||
return "Color Widgets";
|
||||
}
|
||||
|
||||
QIcon Swatch_Plugin::icon() const
|
||||
{
|
||||
color_widgets::ColorPalette w;
|
||||
w.setColumns(6);
|
||||
for ( int i = 0; i < 4; i++ )
|
||||
{
|
||||
for ( int j = 0; j < w.columns(); j++ )
|
||||
{
|
||||
float f = float(j)/w.columns();
|
||||
w.appendColor(QColor::fromHsvF(i/5.0,1-f,0.5+f/2));
|
||||
}
|
||||
}
|
||||
return QIcon(w.preview(QSize(64,64)));
|
||||
}
|
||||
|
||||
QString Swatch_Plugin::toolTip() const
|
||||
{
|
||||
return "A widget that displays a color palette";
|
||||
}
|
||||
|
||||
QString Swatch_Plugin::whatsThis() const
|
||||
{
|
||||
return toolTip();
|
||||
}
|
||||
|
||||
bool Swatch_Plugin::isContainer() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
QString Swatch_Plugin::domXml() const
|
||||
{
|
||||
return "<ui language=\"c++\">\n"
|
||||
" <widget class=\"color_widgets::Swatch\" name=\"swatch\">\n"
|
||||
" </widget>\n"
|
||||
"</ui>\n";
|
||||
}
|
||||
|
||||
QString Swatch_Plugin::includeFile() const
|
||||
{
|
||||
return "QtColorWidgets/swatch.hpp";
|
||||
}
|
|
@ -0,0 +1,57 @@
|
|||
/**
|
||||
* \file
|
||||
*
|
||||
* \author Mattia Basaglia
|
||||
*
|
||||
* \copyright Copyright (C) 2013-2020 Mattia Basaglia
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
#ifndef COLOR_WIDGETS_SWATCH_PLUGIN_HPP
|
||||
#define COLOR_WIDGETS_SWATCH_PLUGIN_HPP
|
||||
|
||||
#include <QObject>
|
||||
#include <QtUiPlugin/QDesignerCustomWidgetInterface>
|
||||
|
||||
class Swatch_Plugin : public QObject, public QDesignerCustomWidgetInterface
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_INTERFACES(QDesignerCustomWidgetInterface)
|
||||
|
||||
public:
|
||||
Swatch_Plugin(QObject *parent = 0);
|
||||
|
||||
void initialize(QDesignerFormEditorInterface *core);
|
||||
bool isInitialized() const;
|
||||
|
||||
QWidget *createWidget(QWidget *parent);
|
||||
|
||||
QString name() const;
|
||||
QString group() const;
|
||||
QIcon icon() const;
|
||||
QString toolTip() const;
|
||||
QString whatsThis() const;
|
||||
bool isContainer() const;
|
||||
|
||||
QString domXml() const;
|
||||
|
||||
QString includeFile() const;
|
||||
|
||||
private:
|
||||
bool initialized;
|
||||
};
|
||||
|
||||
|
||||
#endif // COLOR_WIDGETS_SWATCH_PLUGIN_HPP
|
|
@ -0,0 +1,48 @@
|
|||
#
|
||||
# Copyright (C) 2013-2020 Mattia Basaglia
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Lesser General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
set (QT_SUPPORTED_VERSIONS 5)
|
||||
|
||||
select_qt (
|
||||
QT_SUPPORTED_VERSIONS "${QT_SUPPORTED_VERSIONS}"
|
||||
QT_DEFAULT_VERSION 5)
|
||||
|
||||
set (REQUIRED_QT_COMPONENTS
|
||||
Widgets
|
||||
)
|
||||
find_qt (
|
||||
QT_SUPPORTED_VERSIONS "${QT_SUPPORTED_VERSIONS}"
|
||||
REQUIRED_COMPONENTS "${REQUIRED_QT_COMPONENTS}"
|
||||
OPTIONAL_COMPONENTS "")
|
||||
|
||||
set(SCREENSHOT_SOURCES screenshot.cpp)
|
||||
set(SCREENSHOT_BINARY screenshot_bin)
|
||||
|
||||
add_executable(${SCREENSHOT_BINARY} EXCLUDE_FROM_ALL ${SCREENSHOT_SOURCES})
|
||||
|
||||
use_qt (
|
||||
TARGET_NAME ${SCREENSHOT_BINARY}
|
||||
QT_SUPPORTED_VERSIONS "${QT_SUPPORTED_VERSIONS}"
|
||||
REQUIRED_COMPONENTS "${REQUIRED_QT_COMPONENTS}"
|
||||
OPTIONAL_COMPONENTS "")
|
||||
target_link_libraries(${SCREENSHOT_BINARY}
|
||||
PRIVATE
|
||||
${COLOR_WIDGETS_LIBRARY})
|
||||
|
||||
add_custom_target(gallery
|
||||
COMMAND ${CMAKE_CURRENT_BINARY_DIR}/${SCREENSHOT_BINARY}
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
||||
DEPENDS ${SCREENSHOT_BINARY}
|
||||
)
|
After Width: | Height: | Size: 5.8 KiB |
After Width: | Height: | Size: 44 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 6.0 KiB |
After Width: | Height: | Size: 7.1 KiB |
After Width: | Height: | Size: 3.0 KiB |
After Width: | Height: | Size: 243 B |
After Width: | Height: | Size: 22 KiB |
After Width: | Height: | Size: 230 B |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 4.1 KiB |
After Width: | Height: | Size: 249 B |
|
@ -0,0 +1,91 @@
|
|||
Color Widgets
|
||||
=============
|
||||
|
||||
Color2DSlider
|
||||
-------------
|
||||
![Color2DSlider](Color2DSlider.png)
|
||||
|
||||
This widget allow the user to select 2 HSV color components at the same time,
|
||||
by default that is Saturation and Value but they can be changed.
|
||||
|
||||
ColorDialog
|
||||
-----------
|
||||
![ColorDialog](ColorDialog.png)
|
||||
|
||||
This is a dialog analogous to <tt>QColorDialog</tt> but with a much nicer and friendlier
|
||||
user interface. It uses several of the other widgets.
|
||||
|
||||
ColorLineEdit
|
||||
-------------
|
||||
![ColorLineEdit](ColorLineEdit.png)
|
||||
![ColorLineEdit with color preview](ColorLineEdit_with_color.png)
|
||||
|
||||
This is a <tt>QLineEdit</tt> intended to be used to edit and display color names.
|
||||
It accepts several string formats:
|
||||
* <tt>#f00</tt> (3 hexadecimal rgb digits)
|
||||
* <tt>#ff0000</tt> (6 hexadecimal rgb digits)
|
||||
* <tt>rgb(255,0,0)</tt> (function-like)
|
||||
* <tt>red</tt> (color name)
|
||||
|
||||
It can optionally display the color it represents on its background.
|
||||
|
||||
ColorListWidget
|
||||
---------------
|
||||
![ColorListWidget](ColorListWidget.png)
|
||||
|
||||
It allows to display and edit a list of colors.
|
||||
|
||||
ColorPaletteWidget and Swatch
|
||||
-----------------------------
|
||||
These widgets handle color palettes.
|
||||
|
||||
![Swatch](Swatch.png)
|
||||
|
||||
**Swatch** only handles a single palette, can be used to just select colors from the
|
||||
palette or to modify the palette via drag and drop operations.
|
||||
|
||||
**ColorPaletteModel** is a list model that represents palettes with can be used
|
||||
with the Qt item view widgets, it provides a name and a preview icon for
|
||||
each of the stored palettes.
|
||||
It also has functionality to load and save palettes from the filesystem.
|
||||
|
||||
![Read-only ColorPaletteWidget](ColorPaletteWidget_readonly.png)
|
||||
![ColorPaletteWidget](ColorPaletteWidget.png)
|
||||
|
||||
**ColorPaletteWidget** manages a list of palettes (via **ColorPaletteModel**).
|
||||
Has two modes: read-only only allows to select palettes and colors,
|
||||
otherwise it can be used to modify the list of palettes and the palette itself.
|
||||
|
||||
ColorPreview and ColorSelector
|
||||
------------------------------
|
||||
![ColorPreview](ColorPreview.png)
|
||||
|
||||
**ColorPreview** is a widget that displays a color or compares two colors.
|
||||
|
||||
**ColorSelector** is like **ColorPreview** but when clicked it shows a ColorDialog.
|
||||
|
||||
GradientSlider and HueSlider
|
||||
----------------------------
|
||||
![HueSlider](HueSlider.png)
|
||||
|
||||
**GradientSlider** is a <tt>QSlider</tt> which uses a gradient as its background.
|
||||
|
||||
**HueSlider** is specifically made to select a hue and has more information
|
||||
about the represented color.
|
||||
|
||||
|
||||
GradientEditor
|
||||
--------------
|
||||
![GradientEditor](GradientEditor.png)
|
||||
|
||||
**GradientEditor** is similar in appearance to **GradientSlider** but it's for editing the gradient.
|
||||
|
||||
|
||||
GradientListModel and GradientDelegate
|
||||
--------------------------------------
|
||||
![GradientListModel](GradientListModel_combo.png)
|
||||
![GradientListModel](GradientListModel_view.png)
|
||||
|
||||
**GradientListModel** is a <tt>QAbstractListModel</tt> used to list gradients (useful for combo boxes, item views and the like).
|
||||
|
||||
**GradientDelegate** is an item delegate to edit gradients in an item view.
|
After Width: | Height: | Size: 951 B |
|
@ -0,0 +1,213 @@
|
|||
/**
|
||||
* \file
|
||||
*
|
||||
* \author Mattia Basaglia
|
||||
*
|
||||
* \copyright Copyright (C) 2013-2020 Mattia Basaglia
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
#include <cstring>
|
||||
#include <algorithm>
|
||||
|
||||
#include <QApplication>
|
||||
#include <QCommandLineParser>
|
||||
#include <QComboBox>
|
||||
#include <QListView>
|
||||
#include <QTableWidget>
|
||||
|
||||
#include "QtColorWidgets/color_2d_slider.hpp"
|
||||
#include "QtColorWidgets/color_delegate.hpp" /// \todo show it
|
||||
#include "QtColorWidgets/color_dialog.hpp"
|
||||
#include "QtColorWidgets/color_line_edit.hpp"
|
||||
#include "QtColorWidgets/color_list_widget.hpp"
|
||||
#include "QtColorWidgets/color_palette_widget.hpp"
|
||||
#include "QtColorWidgets/color_preview.hpp"
|
||||
#include "QtColorWidgets/color_wheel.hpp"
|
||||
#include "QtColorWidgets/harmony_color_wheel.hpp"
|
||||
#include "QtColorWidgets/hue_slider.hpp"
|
||||
#include "QtColorWidgets/gradient_editor.hpp"
|
||||
#include "QtColorWidgets/gradient_list_model.hpp"
|
||||
#include "QtColorWidgets/gradient_delegate.hpp"
|
||||
|
||||
bool run = false;
|
||||
QStringList just_these;
|
||||
|
||||
void screenshot(QWidget& widget, QString name = QString())
|
||||
{
|
||||
if ( name.isEmpty() )
|
||||
{
|
||||
name = widget.metaObject()->className();
|
||||
name.remove("color_widgets::");
|
||||
}
|
||||
if ( !just_these.isEmpty() && !just_these.contains(name) )
|
||||
return;
|
||||
|
||||
widget.setWindowTitle(name);
|
||||
QPixmap pic(widget.size());
|
||||
widget.render(&pic);
|
||||
name += ".png";
|
||||
pic.save(name);
|
||||
if ( run )
|
||||
widget.show();
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
QApplication a(argc, argv);
|
||||
|
||||
QCommandLineParser parser;
|
||||
parser.addHelpOption();
|
||||
parser.addPositionalArgument("just_these", "Only these widgets");
|
||||
QCommandLineOption run_option("run", "Show widgets instead of saving to file");
|
||||
parser.addOption(run_option);
|
||||
|
||||
parser.process(a);
|
||||
run = parser.isSet(run_option);
|
||||
just_these = parser.positionalArguments();
|
||||
|
||||
QColor demo_color(64,172,143,128);
|
||||
|
||||
color_widgets::ColorPalette palette1;
|
||||
color_widgets::ColorPalette palette2;
|
||||
int palette_columns = 12;
|
||||
palette1.setName("Palette 1");
|
||||
palette2.setName("Palette 2");
|
||||
palette1.setColumns(palette_columns);
|
||||
palette2.setColumns(palette_columns);
|
||||
for ( int i = 0; i < 6; i++ )
|
||||
{
|
||||
for ( int j = 0; j < palette_columns; j++ )
|
||||
{
|
||||
float f = float(j)/palette_columns;
|
||||
palette1.appendColor(QColor::fromHsvF(i/8.0,1-f,0.5+f/2));
|
||||
palette2.appendColor(QColor::fromHsvF(i/8.0,1-f,1-f));
|
||||
}
|
||||
}
|
||||
color_widgets::ColorPaletteModel palette_model;
|
||||
palette_model.addPalette(palette1, false);
|
||||
palette_model.addPalette(palette2, false);
|
||||
|
||||
|
||||
color_widgets::ColorPreview preview;
|
||||
preview.setColor(demo_color);
|
||||
preview.setDisplayMode(color_widgets::ColorPreview::SplitAlpha);
|
||||
preview.resize(128,32);
|
||||
screenshot(preview);
|
||||
|
||||
color_widgets::ColorDialog dialog;
|
||||
dialog.setColorSpace(color_widgets::ColorWheel::ColorLCH);
|
||||
dialog.setColor(demo_color);
|
||||
screenshot(dialog);
|
||||
|
||||
color_widgets::Color2DSlider slider2d;
|
||||
slider2d.setColor(demo_color);
|
||||
slider2d.resize(128,192);
|
||||
screenshot(slider2d);
|
||||
|
||||
color_widgets::ColorLineEdit line_edit;
|
||||
line_edit.setColor(demo_color);
|
||||
line_edit.resize(line_edit.sizeHint());
|
||||
screenshot(line_edit);
|
||||
line_edit.setPreviewColor(true);
|
||||
screenshot(line_edit, "ColorLineEdit_with_color");
|
||||
|
||||
color_widgets::ColorWheel wheel;
|
||||
wheel.resize(256, 256);
|
||||
wheel.setColor(demo_color);
|
||||
screenshot(wheel);
|
||||
|
||||
color_widgets::HarmonyColorWheel harwheel;
|
||||
harwheel.resize(256, 256);
|
||||
harwheel.setColor(demo_color);
|
||||
harwheel.addHarmony(.333, true);
|
||||
harwheel.addHarmony(.667, true);
|
||||
screenshot(harwheel);
|
||||
|
||||
color_widgets::Swatch swatch;
|
||||
swatch.setPalette(palette1);
|
||||
swatch.resize(swatch.sizeHint());
|
||||
screenshot(swatch);
|
||||
|
||||
color_widgets::ColorPaletteWidget palette_widget;
|
||||
palette_widget.setModel(&palette_model);
|
||||
screenshot(palette_widget);
|
||||
palette_widget.setReadOnly(true);
|
||||
screenshot(palette_widget, "ColorPaletteWidget_readonly");
|
||||
|
||||
color_widgets::HueSlider hue_slider;
|
||||
hue_slider.setColor(demo_color);
|
||||
hue_slider.resize(192, hue_slider.sizeHint().height());
|
||||
// hue_slider.setInvertedAppearance(true);
|
||||
// hue_slider.setOrientation(Qt::Vertical);
|
||||
screenshot(hue_slider);
|
||||
|
||||
color_widgets::ColorListWidget list_widget;
|
||||
list_widget.setColors({
|
||||
demo_color,
|
||||
palette1.colorAt(palette_columns*0),
|
||||
palette1.colorAt(palette_columns*1),
|
||||
palette1.colorAt(palette_columns*3),
|
||||
palette1.colorAt(palette_columns*5),
|
||||
});
|
||||
list_widget.resize(list_widget.sizeHint());
|
||||
screenshot(list_widget);
|
||||
|
||||
color_widgets::GradientEditor editor;
|
||||
QGradientStops gradient_colors;
|
||||
float n_colors = 4;
|
||||
for ( int i = 0; i <= n_colors; ++i )
|
||||
gradient_colors.append(QGradientStop(i/n_colors, QColor::fromHsvF(i/n_colors, 0.5, 1)));
|
||||
editor.setStops(gradient_colors);
|
||||
screenshot(editor);
|
||||
|
||||
QComboBox gradient_list;
|
||||
color_widgets::GradientListModel gradient_model;
|
||||
gradient_model.setGradient("Rainbow", gradient_colors);
|
||||
gradient_model.setGradient("Black to Transparent", QGradientStops{{0, Qt::black}, {1, QColor(0, 0, 0, 0)}});
|
||||
gradient_list.setModel(&gradient_model);
|
||||
gradient_model.setIconSize(QSize(128, 24));
|
||||
gradient_list.setIconSize(gradient_model.iconSize());
|
||||
QObject::connect(&editor, &color_widgets::GradientEditor::stopsChanged, &gradient_model,
|
||||
[&gradient_model](const QGradientStops& stops){ gradient_model.setGradient("Rainbow", stops); });
|
||||
gradient_list.resize(gradient_list.sizeHint());
|
||||
screenshot(gradient_list, "GradientListModel_combo");
|
||||
|
||||
QListView gradient_view;
|
||||
color_widgets::GradientDelegate gradient_delegate;
|
||||
gradient_view.setItemDelegate(&gradient_delegate);
|
||||
gradient_view.setModel(&gradient_model);
|
||||
// gradient_model.setEditMode(color_widgets::GradientListModel::EditName);
|
||||
gradient_model.setEditMode(color_widgets::GradientListModel::EditGradient);
|
||||
gradient_view.resize(QSize(gradient_view.sizeHintForColumn(0) + 4, gradient_view.sizeHint().height()));
|
||||
screenshot(gradient_view, "GradientListModel_view");
|
||||
|
||||
QTableWidget gradient_table;
|
||||
gradient_table.setItemDelegate(&gradient_delegate);
|
||||
gradient_table.setRowCount(2);
|
||||
gradient_table.setColumnCount(2);
|
||||
gradient_table.setItem(0, 0, new QTableWidgetItem());
|
||||
gradient_table.item(0, 0)->setData(Qt::EditRole, QVariant::fromValue(gradient_model.gradientBrush(0)));
|
||||
gradient_table.setItem(0, 1, new QTableWidgetItem(gradient_model.nameFromIndex(0)));
|
||||
gradient_table.setItem(1, 0, new QTableWidgetItem());
|
||||
gradient_table.item(1, 0)->setData(Qt::EditRole, QVariant::fromValue(gradient_model.gradientBrush(1)));
|
||||
gradient_table.setItem(1, 1, new QTableWidgetItem(gradient_model.nameFromIndex(1)));
|
||||
screenshot(gradient_table, "GradientDelegate_table");
|
||||
|
||||
if ( run )
|
||||
return a.exec();
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
#include "abstract_widget_list.hpp"
|
|
@ -0,0 +1 @@
|
|||
#include "bound_color_selector.hpp"
|
|
@ -0,0 +1,37 @@
|
|||
set (HEADERS
|
||||
abstract_widget_list.hpp
|
||||
bound_color_selector.hpp
|
||||
color_2d_slider.hpp
|
||||
color_delegate.hpp
|
||||
color_dialog.hpp
|
||||
color_line_edit.hpp
|
||||
color_list_widget.hpp
|
||||
color_names.hpp
|
||||
color_palette.hpp
|
||||
color_palette_model.hpp
|
||||
color_palette_widget.hpp
|
||||
color_preview.hpp
|
||||
color_selector.hpp
|
||||
color_wheel.hpp
|
||||
colorwidgets_global.hpp
|
||||
gradient_slider.hpp
|
||||
hue_slider.hpp
|
||||
swatch.hpp
|
||||
gradient_editor.hpp
|
||||
harmony_color_wheel.hpp
|
||||
gradient_list_model.hpp
|
||||
gradient_delegate.hpp
|
||||
)
|
||||
|
||||
file(RELATIVE_PATH
|
||||
PREFIX
|
||||
${PROJECT_SOURCE_DIR}
|
||||
${CMAKE_CURRENT_LIST_DIR})
|
||||
|
||||
|
||||
foreach (HEADER IN LISTS HEADERS)
|
||||
target_sources (${TARGET_NAME}
|
||||
PRIVATE
|
||||
$<INSTALL_INTERFACE:${PREFIX}/${HEADER}>
|
||||
$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/${HEADER}>)
|
||||
endforeach (HEADER IN HEADERS)
|
|
@ -0,0 +1 @@
|
|||
#include "color_delegate.hpp"
|
|
@ -0,0 +1 @@
|
|||
#include "color_dialog.hpp"
|
|
@ -0,0 +1 @@
|
|||
#include "color_list_widget.hpp"
|
|
@ -0,0 +1 @@
|
|||
#include "color_preview.hpp"
|
|
@ -0,0 +1 @@
|
|||
#include "color_selector.hpp"
|
|
@ -0,0 +1 @@
|
|||
#include "color_wheel.hpp"
|