Add /Widgets
- LightViewWidget: used for LightEditor - DynamicMouseWidget: used for overrided the cursor shape
This commit is contained in:
28
src/noggit/ui/widgets/DynamicMouseWidget.cpp
Normal file
28
src/noggit/ui/widgets/DynamicMouseWidget.cpp
Normal file
@@ -0,0 +1,28 @@
|
||||
#include "DynamicMouseWidget.h"
|
||||
|
||||
DynamicMouseWidget::DynamicMouseWidget(QWidget* parent)
|
||||
: QWidget(parent)
|
||||
{ }
|
||||
|
||||
DynamicMouseWidget::~DynamicMouseWidget()
|
||||
{ }
|
||||
|
||||
void DynamicMouseWidget::enterEvent(QEvent* event)
|
||||
{
|
||||
QApplication::setOverrideCursor(Qt::PointingHandCursor);
|
||||
}
|
||||
|
||||
void DynamicMouseWidget::leaveEvent(QEvent* event)
|
||||
{
|
||||
QApplication::restoreOverrideCursor();
|
||||
}
|
||||
|
||||
void DynamicMouseWidget::mousePressEvent(QMouseEvent* event)
|
||||
{
|
||||
QApplication::setOverrideCursor(Qt::CursorShape::ClosedHandCursor);
|
||||
}
|
||||
|
||||
void DynamicMouseWidget::mouseReleaseEvent(QMouseEvent* event)
|
||||
{
|
||||
QApplication::restoreOverrideCursor();
|
||||
}
|
||||
22
src/noggit/ui/widgets/DynamicMouseWidget.h
Normal file
22
src/noggit/ui/widgets/DynamicMouseWidget.h
Normal file
@@ -0,0 +1,22 @@
|
||||
#pragma once
|
||||
|
||||
#include <QApplication>
|
||||
#include <QMouseEvent>
|
||||
#include <QWidget>
|
||||
#include <QEvent>
|
||||
|
||||
class DynamicMouseWidget : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
DynamicMouseWidget(QWidget* parent = nullptr);
|
||||
virtual ~DynamicMouseWidget();
|
||||
|
||||
protected:
|
||||
void enterEvent(QEvent* event) override;
|
||||
void leaveEvent(QEvent* event) override;
|
||||
void mousePressEvent(QMouseEvent* event) override;
|
||||
void mouseReleaseEvent(QMouseEvent* event) override;
|
||||
};
|
||||
|
||||
803
src/noggit/ui/widgets/LightViewWidget.cpp
Normal file
803
src/noggit/ui/widgets/LightViewWidget.cpp
Normal file
@@ -0,0 +1,803 @@
|
||||
#include "LightViewWidget.h"
|
||||
|
||||
LightViewWidget::LightViewWidget(QWidget* parent)
|
||||
: QWidget(parent)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
QColor LightViewWidget::InterpolateColor(QColor& a, QColor& b, float t)
|
||||
{
|
||||
QColor Color;
|
||||
|
||||
Color.setRgb(
|
||||
ClampColor(a.red() * (1 - t) + b.red() * t),
|
||||
ClampColor(a.green() * (1 - t) + b.green() * t),
|
||||
ClampColor(a.blue() * (1 - t) + b.blue() * t)
|
||||
);
|
||||
|
||||
return Color;
|
||||
}
|
||||
|
||||
QImage LightViewWidget::FillImagePart(QImage Image, int X, QColor Color)
|
||||
{
|
||||
if (X == Image.width() || X < 0)
|
||||
return Image;
|
||||
|
||||
for (int Y = 0; Y < Image.height(); ++Y)
|
||||
Image.setPixelColor(QPoint(X, Y), Color);
|
||||
|
||||
return Image;
|
||||
}
|
||||
|
||||
int LightViewWidget::ClampColor(int Value)
|
||||
{
|
||||
if (Value < 0) Value == 0;
|
||||
if (Value > 255) Value == 255;
|
||||
|
||||
return Value;
|
||||
}
|
||||
|
||||
QColor LightViewWidget::GetColorFromStyleSheet()
|
||||
{
|
||||
const QString SearchPattern = ".*qmainwindow{background-color:(#[A-Fa-f0-9]{3-6});}.*";
|
||||
QString StyleSheet = qApp->styleSheet().simplified().toLower().remove(R"( )");
|
||||
|
||||
QRegularExpression Regex = QRegularExpression(SearchPattern);
|
||||
auto Match = Regex.match(StyleSheet);
|
||||
QStringList HexColor = Match.capturedTexts();
|
||||
|
||||
if (HexColor.size() > 0)
|
||||
return QColor(HexColor.at(0));
|
||||
|
||||
return Qt::transparent;
|
||||
}
|
||||
|
||||
void LightViewWidget::SortSkyColorVector(std::vector<SkyColor>& Vector)
|
||||
{
|
||||
std::sort(Vector.begin(), Vector.end(), [](const auto& a, const auto& b)
|
||||
{
|
||||
return (a.time < b.time);
|
||||
});
|
||||
}
|
||||
|
||||
// use for access to the editor and for view
|
||||
LightViewPreview::LightViewPreview(QString LightName, QSize Size, QWidget* parent)
|
||||
: DynamicMouseWidget(parent), MainLayout(new QVBoxLayout(this)), Name(new QLabel(this)),
|
||||
Preview(new LightViewPixmap(Size, this))
|
||||
{
|
||||
Name->setText(LightName);
|
||||
|
||||
MainLayout->addWidget(Name);
|
||||
MainLayout->addWidget(Preview);
|
||||
MainLayout->setSpacing(0);
|
||||
MainLayout->setMargin(0);
|
||||
}
|
||||
|
||||
LightViewPreview::LightViewPreview(QSize Size, QWidget* parent)
|
||||
: DynamicMouseWidget(parent), MainLayout(new QVBoxLayout(this)), Name(new QLabel(this)),
|
||||
Preview(new LightViewPixmap(Size, this))
|
||||
{
|
||||
MainLayout->addWidget(Preview);
|
||||
MainLayout->setSpacing(0);
|
||||
MainLayout->setMargin(0);
|
||||
}
|
||||
|
||||
void LightViewPreview::mousePressEvent(QMouseEvent* event)
|
||||
{
|
||||
if (event->button() == Qt::LeftButton)
|
||||
emit LeftClicked();
|
||||
}
|
||||
|
||||
void LightViewPreview::ShowLines(bool Show)
|
||||
{
|
||||
Preview->ShowLines(Show);
|
||||
}
|
||||
|
||||
void LightViewPreview::SetPreview(std::vector<SkyColor>& data)
|
||||
{
|
||||
Preview->SetPreview(data);
|
||||
}
|
||||
|
||||
void LightViewPreview::UpdatePixmap(const QPixmap Updated)
|
||||
{
|
||||
Preview->setPixmap(Updated.scaled(Preview->pixmap()->size(), Qt::IgnoreAspectRatio));
|
||||
}
|
||||
|
||||
LightViewPixmap::LightViewPixmap(QSize Size, QWidget* parent)
|
||||
: QLabel(parent), PixmapSize(Size)
|
||||
{
|
||||
Image = QImage(PixmapSize, QImage::Format_ARGB32);
|
||||
Base = QPixmap(PixmapSize);
|
||||
}
|
||||
|
||||
void LightViewPixmap::mousePressEvent(QMouseEvent* event)
|
||||
{
|
||||
if (!bEvent)
|
||||
{
|
||||
QWidget::mousePressEvent(event);
|
||||
return;
|
||||
}
|
||||
|
||||
if (event->modifiers() & Qt::CTRL && event->button() == Qt::LeftButton)
|
||||
{
|
||||
int Time = event->pos().x() * MAX_TIME_VALUE / width();
|
||||
emit CreateValue(Time);
|
||||
}
|
||||
}
|
||||
|
||||
void LightViewPixmap::ShowLines(bool Show)
|
||||
{
|
||||
bShowLines = Show;
|
||||
SetPreview(Data);
|
||||
}
|
||||
|
||||
void LightViewPixmap::SetPreview(std::vector<SkyColor>& data, int Index)
|
||||
{
|
||||
Data = data;
|
||||
if (Data.size() == 0)
|
||||
return;
|
||||
|
||||
for (int i = 0; i < Data.size(); ++i)
|
||||
Data[i].color *= 255.f;
|
||||
|
||||
LightViewWidget::SortSkyColorVector(Data);
|
||||
|
||||
if (Data.size() == 1)
|
||||
{
|
||||
Image.fill(qRgba(Data[0].color.r, Data[0].color.g, Data[0].color.b, 255));
|
||||
|
||||
QPainter Painter(&Base);
|
||||
Painter.drawImage(QPoint(0, 0), Image);
|
||||
emit UpdatePixmap(Base);
|
||||
|
||||
if (DrawLines())
|
||||
return;
|
||||
|
||||
setPixmap(Base);
|
||||
return;
|
||||
}
|
||||
|
||||
Image.fill(qRgba(0, 0, 0, 0));
|
||||
|
||||
QPainter Painter(&Base);
|
||||
for (int i = 0; i < Data.size(); ++i)
|
||||
{
|
||||
QColor PreColor = nullptr;
|
||||
QColor CurrentColor(Data[i].color.r, Data[i].color.g, Data[i].color.b);
|
||||
QColor NextColor = nullptr;
|
||||
|
||||
if (i == 0)
|
||||
{
|
||||
glm::vec3 Color = Data[Data.size() - 1].color;
|
||||
PreColor = QColor(Color.r, Color.g, Color.b);
|
||||
|
||||
int LastTimeOffset = Data[Data.size() - 1].time - MAX_TIME_VALUE;
|
||||
int DistanceWithFirstTime = Data[i].time - LastTimeOffset;
|
||||
|
||||
for (int time = 0; time <= Data[i].time; ++time)
|
||||
{
|
||||
float t = 1.f;
|
||||
if (DistanceWithFirstTime != 0)
|
||||
t = (float(time) + float(abs(LastTimeOffset))) / float(DistanceWithFirstTime);
|
||||
|
||||
QColor Calculated = LightViewWidget::InterpolateColor(PreColor, CurrentColor, t);
|
||||
|
||||
int X = time * Image.width() / MAX_TIME_VALUE;
|
||||
Image = LightViewWidget::FillImagePart(Image, X, Calculated);
|
||||
}
|
||||
}
|
||||
else if (i == Data.size() - 1)
|
||||
{
|
||||
glm::vec3 Color = Data[i - 1].color;
|
||||
PreColor = QColor(Color.r, Color.g, Color.b);
|
||||
|
||||
Color = Data[0].color;
|
||||
NextColor = QColor(Color.r, Color.g, Color.b);
|
||||
|
||||
int FirstTimeOffset = Data[0].time + MAX_TIME_VALUE;
|
||||
int DistanceWithFirstTime = FirstTimeOffset - Data[i].time;
|
||||
|
||||
for (int time = Data[i].time; time <= MAX_TIME_VALUE; ++time)
|
||||
{
|
||||
float t = 1.f;
|
||||
if (DistanceWithFirstTime != 0)
|
||||
t = (float(time) - float(Data[i].time)) / float(DistanceWithFirstTime);
|
||||
|
||||
QColor Calculated = LightViewWidget::InterpolateColor(CurrentColor, NextColor, t);
|
||||
|
||||
int X = time * Image.width() / MAX_TIME_VALUE;
|
||||
Image = LightViewWidget::FillImagePart(Image, X, Calculated);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
glm::vec3 Color = Data[i + 1].color;
|
||||
NextColor = QColor(Color.r, Color.g, Color.b);
|
||||
|
||||
for (int time = Data[i].time; time <= Data[i + 1].time; ++time)
|
||||
{
|
||||
float t = 1.f;
|
||||
if (Data[i + 1].time != Data[i].time)
|
||||
t = (float(time) - float(Data[i].time)) / (float(Data[i + 1].time) - float(Data[i].time));
|
||||
|
||||
QColor Calculated = LightViewWidget::InterpolateColor(CurrentColor, NextColor, t);
|
||||
|
||||
int X = time * Image.width() / MAX_TIME_VALUE;
|
||||
Image = LightViewWidget::FillImagePart(Image, X, Calculated);
|
||||
}
|
||||
}
|
||||
|
||||
Painter.drawImage(QPoint(0, 0), Image);
|
||||
emit UpdatePixmap(Base);
|
||||
|
||||
if (DrawLines())
|
||||
return;
|
||||
|
||||
setPixmap(Base);
|
||||
}
|
||||
|
||||
bool LightViewPixmap::DrawLines()
|
||||
{
|
||||
if (!bShowLines) return bShowLines;
|
||||
|
||||
QImage Final = Image;
|
||||
QPixmap ResultPixmap = QPixmap(Final.size());
|
||||
|
||||
QPainter Painter(&ResultPixmap);
|
||||
for (int i = 0; i < Data.size(); ++i)
|
||||
{
|
||||
for (int y = 0; y < LIGHT_VIEW_PREVIEW_LINE_SIZE; ++y)
|
||||
{
|
||||
int X = Data[i].time * Final.width() / MAX_TIME_VALUE - LIGHT_VIEW_PREVIEW_LINE_SIZE / 2 + y;
|
||||
Final = LightViewWidget::FillImagePart(Final, X, QColor(LIGHT_VIEW_PREVIEW_LINE_COLOR));
|
||||
}
|
||||
}
|
||||
|
||||
Painter.drawImage(QPoint(0, 0), Final);
|
||||
setPixmap(ResultPixmap);
|
||||
return bShowLines;
|
||||
}
|
||||
|
||||
LightViewEditor::LightViewEditor(MapView* Map, SkyParam* Sky, SkyColorNames eSkyColor, QWidget* parent)
|
||||
: QWidget(parent), _World(Map->getWorld()), _Map(Map), _Sky(Sky), _eSkyColorIndex(eSkyColor)
|
||||
{
|
||||
setWindowFlags(Qt::Tool | Qt::WindowStaysOnTopHint);
|
||||
|
||||
MainLayout = new QVBoxLayout(this);
|
||||
MainLayout->setContentsMargins(0, 0, 0, 0);
|
||||
MainLayout->setSpacing(0);
|
||||
|
||||
_ColorName = SkyColorNameByIndex.at(_eSkyColorIndex);
|
||||
setWindowTitle(QString(tr("Light Color Editor - %1 Color")).arg(_ColorName.c_str()));
|
||||
|
||||
Indicator = new LightViewDayIndicator(QSize(LIGHT_VIEW_PREVIEW_WIDTH * 2 + 30, LIGHT_VIEW_PREVIEW_HEIGHT), this);
|
||||
|
||||
QHBoxLayout* PreviewLayout = new QHBoxLayout(this);
|
||||
|
||||
Preview = new LightViewPixmap(QSize(LIGHT_VIEW_PREVIEW_WIDTH * 2, LIGHT_VIEW_PREVIEW_HEIGHT * 2), this);
|
||||
Preview->ShowLines(true);
|
||||
Preview->EnableEvent();
|
||||
Preview->SetPreview(_Sky->colorRows[_eSkyColorIndex]);
|
||||
|
||||
Arrow = new LightViewArrow(QSize(LIGHT_VIEW_PREVIEW_WIDTH * 2 + 30, LIGHT_VIEW_PREVIEW_HEIGHT * 2), this);
|
||||
Arrow->UpdateData(_Sky->colorRows[_eSkyColorIndex]);
|
||||
|
||||
connect(Preview, &LightViewPixmap::UpdatePixmap, this, [=](const QPixmap Updated)
|
||||
{
|
||||
emit UpdatePixmap(Updated);
|
||||
});
|
||||
|
||||
connect(Preview, SIGNAL(CreateValue(int)), this, SLOT(CreateValue(int)));
|
||||
|
||||
connect(Arrow, &LightViewArrow::ChangeTime, this, [=](int Index, int Time)
|
||||
{
|
||||
if (Index > 0 && Index <= _Sky->colorRows[_eSkyColorIndex].size() - 1)
|
||||
{
|
||||
if (Time < _Sky->colorRows[_eSkyColorIndex][Index - 1].time)
|
||||
{
|
||||
Arrow->CurrentHover--;
|
||||
Arrow->CurrentSelected--;
|
||||
}
|
||||
}
|
||||
|
||||
if (Index >= 0 && Index < _Sky->colorRows[_eSkyColorIndex].size() - 1)
|
||||
{
|
||||
if (Time > _Sky->colorRows[_eSkyColorIndex][Index + 1].time)
|
||||
{
|
||||
Arrow->CurrentHover++;
|
||||
Arrow->CurrentSelected++;
|
||||
}
|
||||
}
|
||||
|
||||
_Sky->colorRows[_eSkyColorIndex][Index].time = Time;
|
||||
|
||||
LightViewWidget::SortSkyColorVector(_Sky->colorRows[_eSkyColorIndex]);
|
||||
UpdateSkyColorRowsValue();
|
||||
});
|
||||
|
||||
connect(Arrow, &LightViewArrow::ReleaseArrow, this, [=]()
|
||||
{ LightViewWidget::SortSkyColorVector(_Sky->colorRows[_eSkyColorIndex]); });
|
||||
|
||||
connect(Arrow, SIGNAL(SelectValue(int)), this, SLOT(UpdateWidgetEdition(int)));
|
||||
connect(Arrow, SIGNAL(DeleteValue(int)), this, SLOT(DeleteValue(int)));
|
||||
|
||||
PreviewLayout->addSpacerItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Expanding));
|
||||
PreviewLayout->addWidget(Preview);
|
||||
PreviewLayout->addSpacerItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Expanding));
|
||||
|
||||
QFrame* Line = new QFrame();
|
||||
Line->setFrameShape(QFrame::HLine);
|
||||
Line->setFrameShadow(QFrame::Sunken);
|
||||
|
||||
// Other widget for display
|
||||
QHBoxLayout* SecLayout = new QHBoxLayout(this);
|
||||
{
|
||||
ColorPicker = new color_widgets::ColorSelector(this);
|
||||
ColorPicker->setDisplayMode(color_widgets::ColorSelector::NoAlpha);
|
||||
ColorPicker->setColor(Qt::gray);
|
||||
|
||||
connect(ColorPicker, &color_widgets::ColorSelector::colorChanged, this, [=](QColor Changed)
|
||||
{
|
||||
if (!ValidCurrentIndex())
|
||||
return;
|
||||
|
||||
_Sky->colorRows[_eSkyColorIndex][CurrentIndex].color = glm::vec3(Changed.redF(), Changed.greenF(), Changed.blueF());
|
||||
UpdateSkyColorRowsValue();
|
||||
});
|
||||
|
||||
TimeSelectorHour = new QSpinBox(this);
|
||||
TimeSelectorHour->setMinimum(0);
|
||||
TimeSelectorHour->setMaximum(23);
|
||||
|
||||
TimeSelectorMin = new QSpinBox(this);
|
||||
TimeSelectorMin->setMinimum(0);
|
||||
TimeSelectorMin->setMaximum(59);
|
||||
|
||||
connect(TimeSelectorHour, &QSpinBox::textChanged, [=](QString)
|
||||
{
|
||||
if (!ValidCurrentIndex())
|
||||
return;
|
||||
|
||||
int Time = ((TimeSelectorHour->value() * 60) + TimeSelectorMin->value()) * MAX_TIME_VALUE / (23 * 60 + 59);
|
||||
_Sky->colorRows[_eSkyColorIndex][CurrentIndex].time = Time;
|
||||
UpdateSkyColorRowsValue();
|
||||
});
|
||||
|
||||
connect(TimeSelectorMin, &QSpinBox::textChanged, [=](QString)
|
||||
{
|
||||
if (!ValidCurrentIndex())
|
||||
return;
|
||||
|
||||
int Time = ((TimeSelectorHour->value() * 60) + TimeSelectorMin->value()) * MAX_TIME_VALUE / (23 * 60 + 59);
|
||||
_Sky->colorRows[_eSkyColorIndex][CurrentIndex].time = Time;
|
||||
UpdateSkyColorRowsValue();
|
||||
});
|
||||
|
||||
TimeSelectorHour->setEnabled(false);
|
||||
TimeSelectorMin->setEnabled(false);
|
||||
ColorPicker->setEnabled(false);
|
||||
|
||||
SecLayout->addSpacerItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Expanding));
|
||||
SecLayout->addWidget(new QLabel(tr("Color"), this));
|
||||
SecLayout->addWidget(ColorPicker);
|
||||
SecLayout->addSpacerItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Expanding));
|
||||
SecLayout->addWidget(new QLabel(tr("Hours"), this));
|
||||
SecLayout->addWidget(TimeSelectorHour);
|
||||
SecLayout->addWidget(new QLabel(tr("Minutes"), this));
|
||||
SecLayout->addWidget(TimeSelectorMin);
|
||||
SecLayout->addSpacerItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Expanding));
|
||||
}
|
||||
|
||||
QHBoxLayout* ThirdLayout = new QHBoxLayout(this);
|
||||
{
|
||||
Remove = new QPushButton(tr("Delete Selected"), this);
|
||||
connect(Remove, &QPushButton::clicked, this, [=]()
|
||||
{
|
||||
DeleteValue(CurrentIndex);
|
||||
});
|
||||
|
||||
ThirdLayout->addSpacerItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Expanding));
|
||||
ThirdLayout->addWidget(Remove);
|
||||
ThirdLayout->addSpacerItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Expanding));
|
||||
|
||||
Remove->setEnabled(false);
|
||||
}
|
||||
|
||||
QHBoxLayout* PreLayout = new QHBoxLayout(this);
|
||||
{
|
||||
Add = new QPushButton(tr("Insert Value"), this);
|
||||
|
||||
AddHour = new QSpinBox(this);
|
||||
AddHour->setMinimum(0);
|
||||
AddHour->setMaximum(23);
|
||||
|
||||
AddMin = new QSpinBox(this);
|
||||
AddMin->setMinimum(0);
|
||||
AddMin->setMaximum(59);
|
||||
|
||||
connect(Add, &QPushButton::clicked, this, [=]()
|
||||
{
|
||||
int Time = ((AddHour->value() * 60) + AddMin->value()) * MAX_TIME_VALUE / (24 * 60);
|
||||
CreateValue(Time);
|
||||
});
|
||||
|
||||
PreLayout->addSpacerItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Expanding));
|
||||
PreLayout->addWidget(Add);
|
||||
PreLayout->addSpacerItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Expanding));
|
||||
PreLayout->addWidget(new QLabel(tr("Time"), this));
|
||||
PreLayout->addWidget(AddHour);
|
||||
PreLayout->addWidget(new QLabel(tr("Minutes"), this));
|
||||
PreLayout->addWidget(AddMin);
|
||||
PreLayout->addSpacerItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Expanding));
|
||||
}
|
||||
|
||||
MainLayout->addSpacerItem(new QSpacerItem(0, 8, QSizePolicy::Expanding, QSizePolicy::Fixed));
|
||||
MainLayout->addLayout(PreLayout);
|
||||
MainLayout->addSpacerItem(new QSpacerItem(0, 8, QSizePolicy::Expanding, QSizePolicy::Fixed));
|
||||
MainLayout->addWidget(Indicator);
|
||||
MainLayout->addLayout(PreviewLayout);
|
||||
MainLayout->addWidget(Arrow);
|
||||
MainLayout->addSpacerItem(new QSpacerItem(0, 16, QSizePolicy::Expanding, QSizePolicy::Fixed));
|
||||
MainLayout->addWidget(Line);
|
||||
MainLayout->addSpacerItem(new QSpacerItem(0, 16, QSizePolicy::Expanding, QSizePolicy::Fixed));
|
||||
MainLayout->addLayout(SecLayout);
|
||||
MainLayout->addSpacerItem(new QSpacerItem(0, 8, QSizePolicy::Expanding, QSizePolicy::Fixed));
|
||||
MainLayout->addLayout(ThirdLayout);
|
||||
MainLayout->addSpacerItem(new QSpacerItem(0, 16, QSizePolicy::Expanding, QSizePolicy::Fixed));
|
||||
|
||||
setFixedSize(sizeHint());
|
||||
}
|
||||
|
||||
void LightViewEditor::closeEvent(QCloseEvent* event)
|
||||
{
|
||||
emit Delete(this);
|
||||
event->accept();
|
||||
}
|
||||
|
||||
void LightViewEditor::UpdateSkyColorRowsValue()
|
||||
{
|
||||
UpdateWidgetEdition(CurrentIndex);
|
||||
_World->renderer()->skies()->update_sky_colors(_Map->getCamera()->position, static_cast<int>(_World->time) % MAX_TIME_VALUE);
|
||||
|
||||
Arrow->UpdateData(_Sky->colorRows[_eSkyColorIndex]);
|
||||
Preview->SetPreview(_Sky->colorRows[_eSkyColorIndex]);
|
||||
}
|
||||
|
||||
bool LightViewEditor::ValidCurrentIndex()
|
||||
{
|
||||
return (CurrentIndex >= 0 && CurrentIndex < _Sky->colorRows[_eSkyColorIndex].size());
|
||||
}
|
||||
|
||||
void LightViewEditor::UpdateWorldTime()
|
||||
{
|
||||
Indicator->UpdateWorldTime(static_cast<int>(_World->time) % MAX_TIME_VALUE);
|
||||
}
|
||||
|
||||
void LightViewEditor::UpdateWidgetEdition(int Index)
|
||||
{
|
||||
CurrentIndex = Index;
|
||||
if (CurrentIndex < 0 || CurrentIndex >= _Sky->colorRows[_eSkyColorIndex].size())
|
||||
{
|
||||
TimeSelectorHour->setEnabled(false);
|
||||
TimeSelectorMin->setEnabled(false);
|
||||
ColorPicker->setEnabled(false);
|
||||
Remove->setEnabled(false);
|
||||
|
||||
QSignalBlocker TimeHourBlocker(TimeSelectorHour);
|
||||
QSignalBlocker TimeMinBlocker(TimeSelectorMin);
|
||||
QSignalBlocker ColorBlocker(ColorPicker);
|
||||
|
||||
TimeSelectorHour->setValue(0);
|
||||
TimeSelectorMin->setValue(0);
|
||||
ColorPicker->setColor(Qt::gray);
|
||||
|
||||
TimeHourBlocker.unblock();
|
||||
TimeMinBlocker.unblock();
|
||||
ColorBlocker.unblock();
|
||||
return;
|
||||
}
|
||||
|
||||
TimeSelectorHour->setEnabled(true);
|
||||
TimeSelectorMin->setEnabled(true);
|
||||
ColorPicker->setEnabled(true);
|
||||
Remove->setEnabled(true);
|
||||
|
||||
QSignalBlocker TimeHourBlocker(TimeSelectorHour);
|
||||
QSignalBlocker TimeMinBlocker(TimeSelectorMin);
|
||||
QSignalBlocker ColorBlocker(ColorPicker);
|
||||
|
||||
int Time = _Sky->colorRows[_eSkyColorIndex][CurrentIndex].time;
|
||||
int ConvertedTime = Time * (24 * 60) / MAX_TIME_VALUE;
|
||||
|
||||
int Hour = floor(ConvertedTime / 60);
|
||||
int Min = ConvertedTime % 60;
|
||||
|
||||
TimeSelectorHour->setValue(Hour);
|
||||
TimeSelectorMin->setValue(Min);
|
||||
|
||||
auto Color = _Sky->colorRows[_eSkyColorIndex][CurrentIndex].color * 255.f;
|
||||
ColorPicker->setColor(QColor(Color.r, Color.g, Color.b));
|
||||
|
||||
TimeHourBlocker.unblock();
|
||||
TimeMinBlocker.unblock();
|
||||
ColorBlocker.unblock();
|
||||
}
|
||||
|
||||
void LightViewEditor::CreateValue(int Time)
|
||||
{
|
||||
if (_Sky->colorRows[_eSkyColorIndex].size() == 16)
|
||||
return;
|
||||
|
||||
SkyColor NewValue(Time, 0);
|
||||
_Sky->colorRows[_eSkyColorIndex].push_back(NewValue);
|
||||
LightViewWidget::SortSkyColorVector(_Sky->colorRows[_eSkyColorIndex]);
|
||||
|
||||
for (int i = 0; i < _Sky->colorRows[_eSkyColorIndex].size(); ++i)
|
||||
{
|
||||
if (_Sky->colorRows[_eSkyColorIndex][i].time == Time)
|
||||
{
|
||||
auto Vec = _Sky->colorRows[_eSkyColorIndex];
|
||||
|
||||
if (Vec.size() == 1)
|
||||
{
|
||||
Vec[i].color = glm::vec3(.2f, .2f, .2f);
|
||||
UpdateSkyColorRowsValue();
|
||||
return;
|
||||
}
|
||||
|
||||
if (Vec.size() == 2)
|
||||
{
|
||||
glm::vec3 Color = Vec[0].color * 255.f;
|
||||
|
||||
if (i == 0)
|
||||
Color = Vec[i + 1].color * 255.f;
|
||||
|
||||
Vec[i].color = Color;
|
||||
UpdateSkyColorRowsValue();
|
||||
return;
|
||||
}
|
||||
|
||||
QColor Color;
|
||||
if (i == 0)
|
||||
{
|
||||
glm::vec3 Vec3A = Vec[Vec.size() - 1].color * 255.f;
|
||||
glm::vec3 Vec3B = Vec[i + 1].color * 255.f;
|
||||
|
||||
QColor ColorA(Vec3A.r, Vec3A.g, Vec3A.b);
|
||||
QColor ColorB(Vec3B.r, Vec3B.g, Vec3B.b);
|
||||
|
||||
int OffsetTime = abs(Vec[Vec.size() - 1].time - MAX_TIME_VALUE);
|
||||
int TimeRef = Vec[i + 1].time + OffsetTime;
|
||||
|
||||
float t = float(Time + OffsetTime) / float(TimeRef);
|
||||
Color = LightViewWidget::InterpolateColor(ColorA, ColorB, t);
|
||||
}
|
||||
else if (i == _Sky->colorRows[_eSkyColorIndex].size() - 1)
|
||||
{
|
||||
glm::vec3 Vec3A = Vec[i - 1].color * 255.f;
|
||||
glm::vec3 Vec3B = Vec[0].color * 255.f;
|
||||
|
||||
QColor ColorA(Vec3A.r, Vec3A.g, Vec3A.b);
|
||||
QColor ColorB(Vec3B.r, Vec3B.g, Vec3B.b);
|
||||
|
||||
int OffsetTime = abs(Vec[i - 1].time - MAX_TIME_VALUE);
|
||||
int TimeRef = Vec[0].time + OffsetTime;
|
||||
|
||||
float t = float(Time - Vec[i - 1].time) / float(TimeRef);
|
||||
Color = LightViewWidget::InterpolateColor(ColorA, ColorB, t);
|
||||
}
|
||||
else
|
||||
{
|
||||
glm::vec3 Vec3A = Vec[i - 1].color * 255.f;
|
||||
glm::vec3 Vec3B = Vec[i + 1].color * 255.f;
|
||||
|
||||
QColor ColorA(Vec3A.r, Vec3A.g, Vec3A.b);
|
||||
QColor ColorB(Vec3B.r, Vec3B.g, Vec3B.b);
|
||||
|
||||
int OffsetTime = Vec[i - 1].time;
|
||||
int TimeRef = Vec[i + 1].time - OffsetTime;
|
||||
|
||||
float t = float(Time - OffsetTime) / float(TimeRef);
|
||||
Color = LightViewWidget::InterpolateColor(ColorA, ColorB, t);
|
||||
}
|
||||
|
||||
_Sky->colorRows[_eSkyColorIndex][i].color = glm::vec3(Color.redF(), Color.greenF(), Color.blueF());
|
||||
Arrow->CurrentSelected = i;
|
||||
CurrentIndex = i;
|
||||
UpdateSkyColorRowsValue();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LightViewEditor::DeleteValue(int Index)
|
||||
{
|
||||
if (_Sky->colorRows[_eSkyColorIndex].size() == 1)
|
||||
return;
|
||||
|
||||
QSignalBlocker Blocker(Arrow);
|
||||
if (Index >= 0 && Index < _Sky->colorRows[_eSkyColorIndex].size())
|
||||
{
|
||||
_Sky->colorRows[_eSkyColorIndex].erase(_Sky->colorRows[_eSkyColorIndex].begin() + Index);
|
||||
|
||||
Arrow->CurrentHover = -1;
|
||||
Arrow->CurrentSelected = -1;
|
||||
CurrentIndex = -1;
|
||||
UpdateSkyColorRowsValue();
|
||||
Blocker.unblock();
|
||||
return;
|
||||
}
|
||||
Blocker.unblock();
|
||||
}
|
||||
|
||||
LightViewDayIndicator::LightViewDayIndicator(QSize Size, QWidget* parent)
|
||||
: QLabel(parent), PixmapSize(Size)
|
||||
{
|
||||
ColorFromStyleSheet = LightViewWidget::GetColorFromStyleSheet();
|
||||
}
|
||||
|
||||
void LightViewDayIndicator::UpdateWorldTime(int Time)
|
||||
{
|
||||
Base = QPixmap(PixmapSize);
|
||||
Base.fill(ColorFromStyleSheet);
|
||||
QPainter Painter(&Base);
|
||||
|
||||
const int PixelPointing = Time * (PixmapSize.width() - 30) / MAX_TIME_VALUE + 15;
|
||||
|
||||
QPainterPath Triangle;
|
||||
Triangle.moveTo(QPoint(PixelPointing, PixmapSize.height() - 5));
|
||||
Triangle.lineTo(QPoint(PixelPointing + 10, PixmapSize.height() - 15));
|
||||
Triangle.lineTo(QPoint(PixelPointing - 10, PixmapSize.height() - 15));
|
||||
Triangle.lineTo(QPoint(PixelPointing, PixmapSize.height() - 5));
|
||||
|
||||
Painter.setPen(Qt::NoPen);
|
||||
Painter.fillPath(Triangle, QBrush(Qt::white));
|
||||
|
||||
setPixmap(Base);
|
||||
}
|
||||
|
||||
LightViewArrow::LightViewArrow(QSize Size, QWidget* parent)
|
||||
: QLabel(parent), PixmapSize(Size)
|
||||
{
|
||||
setMouseTracking(true);
|
||||
ColorFromStyleSheet = LightViewWidget::GetColorFromStyleSheet();
|
||||
}
|
||||
|
||||
void LightViewArrow::UpdateData(std::vector<SkyColor>& data, bool UpdateDataColor)
|
||||
{
|
||||
Data = data;
|
||||
if (Data.size() == 0)
|
||||
return;
|
||||
|
||||
if (UpdateDataColor)
|
||||
for (int i = 0; i < Data.size(); ++i)
|
||||
Data[i].color *= 255.f;
|
||||
|
||||
LightViewWidget::SortSkyColorVector(Data);
|
||||
|
||||
Base = QPixmap(PixmapSize);
|
||||
Base.fill(ColorFromStyleSheet);
|
||||
QPainter Painter(&Base);
|
||||
|
||||
for (int i = 0; i < Data.size(); ++i)
|
||||
{
|
||||
// this is where the value is exactly on the Pixmap
|
||||
const int PixelPointing = Data[i].time * (PixmapSize.width() - 30) / MAX_TIME_VALUE + 15;
|
||||
QColor ColorCadre = (i == CurrentSelected) ? Qt::black : Qt::white;
|
||||
|
||||
// draw triangle pointing exactly where it's needed
|
||||
{
|
||||
QPainterPath Triangle;
|
||||
Triangle.moveTo(QPoint(PixelPointing, 5));
|
||||
Triangle.lineTo(QPoint(PixelPointing + 10, 15));
|
||||
Triangle.lineTo(QPoint(PixelPointing - 10, 15));
|
||||
Triangle.lineTo(QPoint(PixelPointing, 5));
|
||||
|
||||
Painter.setPen(Qt::NoPen);
|
||||
Painter.fillPath(Triangle, QBrush(ColorCadre));
|
||||
}
|
||||
|
||||
// draw rectangle preview with correct color
|
||||
{
|
||||
QPainterPath Cadre;
|
||||
Cadre.moveTo(QPoint(PixelPointing - 10, 15));
|
||||
Cadre.lineTo(QPoint(PixelPointing + 10, 15));
|
||||
Cadre.lineTo(QPoint(PixelPointing + 10, 35));
|
||||
Cadre.lineTo(QPoint(PixelPointing - 10, 35));
|
||||
Cadre.lineTo(QPoint(PixelPointing - 10, 15));
|
||||
|
||||
Painter.setPen(Qt::NoPen);
|
||||
Painter.fillPath(Cadre, QBrush(ColorCadre));
|
||||
|
||||
QPainterPath Color;
|
||||
Color.moveTo(QPoint(PixelPointing - 8, 17));
|
||||
Color.lineTo(QPoint(PixelPointing + 8, 17));
|
||||
Color.lineTo(QPoint(PixelPointing + 8, 33));
|
||||
Color.lineTo(QPoint(PixelPointing - 8, 33));
|
||||
Color.lineTo(QPoint(PixelPointing - 8, 17));
|
||||
|
||||
Painter.setPen(Qt::NoPen);
|
||||
Painter.fillPath(Color, QColor(Data[i].color.r, Data[i].color.g, Data[i].color.b));
|
||||
}
|
||||
}
|
||||
|
||||
setPixmap(Base);
|
||||
}
|
||||
|
||||
void LightViewArrow::mousePressEvent(QMouseEvent* event)
|
||||
{
|
||||
if (event->button() == Qt::LeftButton)
|
||||
{
|
||||
if (CurrentHover < 0)
|
||||
return;
|
||||
|
||||
CurrentSelected = CurrentHover;
|
||||
UpdateData(Data, false);
|
||||
emit SelectValue(CurrentSelected);
|
||||
|
||||
bDragging = true;
|
||||
QApplication::setOverrideCursor(Qt::ClosedHandCursor);
|
||||
}
|
||||
|
||||
if (event->modifiers() & Qt::CTRL && event->button() == Qt::RightButton)
|
||||
{
|
||||
if (CurrentHover < 0)
|
||||
return;
|
||||
|
||||
emit DeleteValue(CurrentHover);
|
||||
QApplication::restoreOverrideCursor();
|
||||
}
|
||||
}
|
||||
|
||||
void LightViewArrow::mouseReleaseEvent(QMouseEvent* event)
|
||||
{
|
||||
if (!bDragging)
|
||||
return;
|
||||
|
||||
CurrentHover = -1;
|
||||
bDragging = false;
|
||||
QApplication::restoreOverrideCursor();
|
||||
emit ReleaseArrow();
|
||||
}
|
||||
|
||||
void LightViewArrow::mouseMoveEvent(QMouseEvent* event)
|
||||
{
|
||||
if (!bDragging)
|
||||
{
|
||||
QApplication::restoreOverrideCursor();
|
||||
CurrentHover = -1;
|
||||
|
||||
if (event->pos().y() >= 10 && event->pos().y() <= 30)
|
||||
{
|
||||
for (int i = 0; i < Data.size(); ++i)
|
||||
{
|
||||
const int PixelPointing = Data[i].time * (PixmapSize.width() - 30) / MAX_TIME_VALUE + 20;
|
||||
|
||||
if (event->pos().x() >= PixelPointing - 10 && event->pos().x() <= PixelPointing + 10)
|
||||
{
|
||||
QApplication::setOverrideCursor(Qt::PointingHandCursor);
|
||||
CurrentHover = i;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (event->pos().x() < 15)
|
||||
{
|
||||
emit ChangeTime(CurrentHover, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
if (event->pos().x() > PixmapSize.width() - 15)
|
||||
{
|
||||
emit ChangeTime(CurrentHover, MAX_TIME_VALUE);
|
||||
return;
|
||||
}
|
||||
|
||||
int Time = (event->pos().x() - 15) * MAX_TIME_VALUE / (PixmapSize.width() - 30);
|
||||
emit ChangeTime(CurrentHover, Time);
|
||||
}
|
||||
}
|
||||
224
src/noggit/ui/widgets/LightViewWidget.h
Normal file
224
src/noggit/ui/widgets/LightViewWidget.h
Normal file
@@ -0,0 +1,224 @@
|
||||
#pragma once
|
||||
|
||||
#include <noggit/Sky.h>
|
||||
#include <noggit/MapView.h>
|
||||
#include <QApplication>
|
||||
#include <QMouseEvent>
|
||||
#include <QPainterPath>
|
||||
#include <QFrame>
|
||||
#include <QEvent>
|
||||
#include <QLayout>
|
||||
#include <QLabel>
|
||||
#include <QPixmap>
|
||||
#include "DynamicMouseWidget.h"
|
||||
|
||||
#define MAX_TIME_VALUE 2880
|
||||
|
||||
#define LIGHT_VIEW_PREVIEW_WIDTH 340
|
||||
#define LIGHT_VIEW_PREVIEW_HEIGHT 20
|
||||
|
||||
#define LIGHT_VIEW_PREVIEW_LINE_SIZE 1
|
||||
#define LIGHT_VIEW_PREVIEW_LINE_COLOR 0xFFFFFF
|
||||
#define LIGHT_VIEW_PREVIEW_LINE_DAY_CYCLE_COLOR 0x000000
|
||||
|
||||
static std::map <int, std::string> SkyColorNameByIndex = {
|
||||
{0 , "Direct"},
|
||||
{1 , "Ambiant"},
|
||||
{2 , "Sky Top"},
|
||||
{3 , "Sky Midle"},
|
||||
{4 , "Sky Band 1"},
|
||||
{5 , "Sky Band 2"},
|
||||
{6 , "Sky Smog"},
|
||||
{7 , "Sky Fog"},
|
||||
{8 , "Sun"},
|
||||
{9 , "Cloud Sun"},
|
||||
{10 , "Cloud Emissive"},
|
||||
{11 , "Cloud Layer 1 Ambian"},
|
||||
{12 , "Cloud Layer 2 Ambiant"},
|
||||
{13 , "Unknown/Unused"},
|
||||
{14 , "Ocean Close"},
|
||||
{15 , "Ocean Far"},
|
||||
{16 , "River Close"},
|
||||
{17 , "River Far"}
|
||||
};
|
||||
|
||||
/*
|
||||
* PIXMAP
|
||||
*/
|
||||
class LightViewPixmap : public QLabel
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
LightViewPixmap(QSize Size = QSize(LIGHT_VIEW_PREVIEW_WIDTH, LIGHT_VIEW_PREVIEW_HEIGHT), QWidget* parent = nullptr);
|
||||
void ShowLines(bool show);
|
||||
void EnableEvent() { bEvent = true; };
|
||||
void DisableEvent() { bEvent = false; };
|
||||
void SetPreview(std::vector<SkyColor>& data, int Index = -1);
|
||||
|
||||
protected:
|
||||
void mousePressEvent(QMouseEvent* event) override;
|
||||
|
||||
signals:
|
||||
void UpdatePixmap(const QPixmap Updated);
|
||||
void CreateValue(int Time);
|
||||
|
||||
private:
|
||||
bool bShowLines = false;
|
||||
bool bEvent = false;
|
||||
std::vector<SkyColor> Data;
|
||||
|
||||
bool DrawLines();
|
||||
|
||||
QImage Image;
|
||||
QPixmap Base;
|
||||
QSize PixmapSize;
|
||||
};
|
||||
|
||||
/*
|
||||
* ARROW
|
||||
*/
|
||||
class LightViewArrow : public QLabel
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
LightViewArrow(QSize Size = QSize(LIGHT_VIEW_PREVIEW_WIDTH, LIGHT_VIEW_PREVIEW_HEIGHT), QWidget* parent = nullptr);
|
||||
void UpdateData(std::vector<SkyColor>& data, bool UpdateDataColor = true);
|
||||
int CurrentHover = -1;
|
||||
int CurrentSelected = -1;
|
||||
|
||||
protected:
|
||||
void mousePressEvent(QMouseEvent* event) override;
|
||||
void mouseReleaseEvent(QMouseEvent* event) override;
|
||||
void mouseMoveEvent(QMouseEvent* event) override;
|
||||
|
||||
signals:
|
||||
void DeleteValue(int Index);
|
||||
void SelectValue(int Index);
|
||||
void ChangeTime(int Index, int Time);
|
||||
void ReleaseArrow();
|
||||
|
||||
private:
|
||||
std::vector<SkyColor> Data;
|
||||
|
||||
QPixmap Base;
|
||||
QSize PixmapSize;
|
||||
QColor ColorFromStyleSheet;
|
||||
|
||||
bool bDragging = false;
|
||||
bool bUpdateMouse = false;
|
||||
};
|
||||
|
||||
/*
|
||||
* DAY INDICATOR
|
||||
*/
|
||||
class LightViewDayIndicator : public QLabel
|
||||
{
|
||||
public:
|
||||
LightViewDayIndicator(QSize Size = QSize(LIGHT_VIEW_PREVIEW_WIDTH, LIGHT_VIEW_PREVIEW_HEIGHT), QWidget* parent = nullptr);
|
||||
void UpdateWorldTime(int Iime);
|
||||
|
||||
private:
|
||||
QPixmap Base;
|
||||
QSize PixmapSize;
|
||||
QColor ColorFromStyleSheet;
|
||||
};
|
||||
|
||||
/*
|
||||
* EDITOR
|
||||
*/
|
||||
class LightViewEditor : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
LightViewEditor(MapView* Map, SkyParam* Sky, SkyColorNames eSkyColor, QWidget* parent = nullptr);
|
||||
void UpdateWorldTime();
|
||||
|
||||
protected:
|
||||
void closeEvent(QCloseEvent* event) override;
|
||||
|
||||
private slots:
|
||||
void UpdateWidgetEdition(int Index);
|
||||
void DeleteValue(int Index);
|
||||
void CreateValue(int Time = 0);
|
||||
|
||||
private:
|
||||
void UpdateSkyColorRowsValue();
|
||||
bool ValidCurrentIndex();
|
||||
|
||||
signals:
|
||||
void Delete(LightViewEditor* self);
|
||||
void UpdatePixmap(const QPixmap Updated);
|
||||
|
||||
private:
|
||||
World* _World;
|
||||
MapView* _Map;
|
||||
SkyParam* _Sky;
|
||||
SkyColorNames _eSkyColorIndex;
|
||||
std::string _ColorName;
|
||||
|
||||
QVBoxLayout* MainLayout;
|
||||
|
||||
int CurrentIndex = -1;
|
||||
|
||||
LightViewDayIndicator* Indicator;
|
||||
LightViewPixmap* Preview;
|
||||
LightViewArrow* Arrow;
|
||||
|
||||
QPushButton* Add;
|
||||
QSpinBox* AddHour;
|
||||
QSpinBox* AddMin;
|
||||
|
||||
QPushButton* Remove;
|
||||
|
||||
color_widgets::ColorSelector* ColorPicker;
|
||||
QSpinBox* TimeSelectorHour;
|
||||
QSpinBox* TimeSelectorMin;
|
||||
};
|
||||
|
||||
/*
|
||||
* PREVIEW
|
||||
*/
|
||||
class LightViewPreview : public DynamicMouseWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
LightViewPreview(QSize Size = QSize(LIGHT_VIEW_PREVIEW_WIDTH, LIGHT_VIEW_PREVIEW_HEIGHT), QWidget* parent = nullptr);
|
||||
LightViewPreview(QString LightName, QSize Size = QSize(LIGHT_VIEW_PREVIEW_WIDTH, LIGHT_VIEW_PREVIEW_HEIGHT), QWidget* parent = nullptr);
|
||||
void ShowLines(bool show);
|
||||
void SetPreview(std::vector<SkyColor>& data);
|
||||
void UpdatePixmap(const QPixmap Updated);
|
||||
|
||||
protected:
|
||||
void mousePressEvent(QMouseEvent* event) override;
|
||||
|
||||
signals:
|
||||
void LeftClicked();
|
||||
|
||||
private:
|
||||
QVBoxLayout* MainLayout;
|
||||
|
||||
QLabel* Name;
|
||||
LightViewPixmap* Preview;
|
||||
};
|
||||
|
||||
/*
|
||||
* WIDGET BASE
|
||||
*/
|
||||
class LightViewWidget : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
LightViewWidget(QWidget* parent = nullptr);
|
||||
|
||||
static QColor InterpolateColor(QColor& a, QColor& b, float t);
|
||||
static QImage FillImagePart(QImage Image, int X, QColor Color);
|
||||
static inline int ClampColor(int Value);
|
||||
static QColor GetColorFromStyleSheet();
|
||||
static void SortSkyColorVector(std::vector<SkyColor>& Vector);
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user