diff --git a/QtGameMaker.pro b/QtGameMaker.pro index 9090134..dd36d89 100644 --- a/QtGameMaker.pro +++ b/QtGameMaker.pro @@ -38,6 +38,7 @@ HEADERS += \ src/editor/editorguiutils.h \ src/editor/roomscene.h \ src/editor/widgets/actiondragwidget.h \ + src/editor/widgets/colorwidget.h \ src/editor/widgets/draggabletreeview.h \ src/editor/widgets/objectparentselectorwidget.h \ src/editor/widgets/objectselectorwidget.h \ @@ -108,6 +109,7 @@ SOURCES += \ src/editor/editorguiutils.cpp \ src/editor/roomscene.cpp \ src/editor/widgets/actiondragwidget.cpp \ + src/editor/widgets/colorwidget.cpp \ src/editor/widgets/draggabletreeview.cpp \ src/editor/widgets/objectparentselectorwidget.cpp \ src/editor/widgets/objectselectorwidget.cpp \ diff --git a/src/editor/dialogs/editspritedialog.cpp b/src/editor/dialogs/editspritedialog.cpp index a94a2b8..7e7f633 100644 --- a/src/editor/dialogs/editspritedialog.cpp +++ b/src/editor/dialogs/editspritedialog.cpp @@ -89,7 +89,7 @@ void EditSpriteDialog::newSprite() if (dialog.exec() == QDialog::Accepted) { QPixmap pixmap{dialog.spriteSize()}; - pixmap.fill(Qt::white); + pixmap.fill(Qt::transparent); m_model->beginResetModel(); m_pixmaps = std::vector { std::move(pixmap) }; @@ -110,8 +110,11 @@ void EditSpriteDialog::doubleClicked(const QModelIndex &index) ImageEditorDialog dialog{m_model->pixmap(index), tr("Image Editor: %0").arg(m_spriteName), this}; if (dialog.exec() == QDialog::Accepted) { + qDebug() << "apply pixmap?!"; + emit m_model->beginResetModel(); m_pixmaps[index.row()] = dialog.pixmap(); - emit m_model->dataChanged(index, index, {Qt::DecorationRole}); + emit m_model->endResetModel(); + //emit m_model->dataChanged(index, index, {Qt::DecorationRole}); changed(); } } diff --git a/src/editor/dialogs/imageeditordialog.cpp b/src/editor/dialogs/imageeditordialog.cpp index 42c52a9..f38cd2b 100644 --- a/src/editor/dialogs/imageeditordialog.cpp +++ b/src/editor/dialogs/imageeditordialog.cpp @@ -4,6 +4,8 @@ #include #include #include +#include +#include ImageEditorDialog::ImageEditorDialog(const QPixmap &pixmap, const QString &title, QWidget *parent) : QDialog{parent}, @@ -24,6 +26,21 @@ ImageEditorDialog::ImageEditorDialog(const QPixmap &pixmap, const QString &title m_ui->scrollArea->setBackgroundRole(QPalette::Dark); + connect(m_ui->pushButtonSelectFont, &QAbstractButton::pressed, + this, &ImageEditorDialog::selectFont); + + connect(m_ui->pushButtonLeftButtonColor, &QAbstractButton::pressed, + this, &ImageEditorDialog::selectLeftButtonColor); + connect(m_ui->pushButtonRightButtonColor, &QAbstractButton::pressed, + this, &ImageEditorDialog::selectRightButtonColor); + + connect(m_ui->canvas, &DrawingCanvasWidget::changed, + this, &ImageEditorDialog::changed); + connect(m_ui->canvas, &DrawingCanvasWidget::leftButtonColorChanged, + this, &ImageEditorDialog::updateLeftButtonColor); + connect(m_ui->canvas, &DrawingCanvasWidget::rightButtonColorChanged, + this, &ImageEditorDialog::updateRightButtonColor); + { auto group = new QButtonGroup{this}; group->setExclusive(true); @@ -71,6 +88,9 @@ ImageEditorDialog::ImageEditorDialog(const QPixmap &pixmap, const QString &title m_ui->toolButtonDraw->click(); + updateLeftButtonColor(m_ui->canvas->leftButtonColor()); + updateRightButtonColor(m_ui->canvas->rightButtonColor()); + m_ui->canvas->setPixmap(m_pixmap); } @@ -78,12 +98,6 @@ ImageEditorDialog::~ImageEditorDialog() = default; void ImageEditorDialog::accept() { - if (!m_unsavedChanges) - { - QDialog::reject(); - return; - } - // TODO QDialog::accept(); @@ -128,6 +142,45 @@ void ImageEditorDialog::changed() } } +void ImageEditorDialog::selectFont() +{ + QFontDialog dialog{m_ui->pushButtonSelectFont->font(), this}; + if (dialog.exec() == QDialog::Accepted) + m_ui->pushButtonSelectFont->setFont(dialog.selectedFont()); +} + +void ImageEditorDialog::selectLeftButtonColor() +{ + QColorDialog dialog{m_ui->canvas->leftButtonColor(), this}; + if (dialog.exec() == QDialog::Accepted) + m_ui->canvas->setLeftButtonColor(dialog.selectedColor()); +} + +void ImageEditorDialog::selectRightButtonColor() +{ + QColorDialog dialog{m_ui->canvas->rightButtonColor(), this}; + if (dialog.exec() == QDialog::Accepted) + m_ui->canvas->setRightButtonColor(dialog.selectedColor()); +} + +void ImageEditorDialog::updateLeftButtonColor(const QColor &leftButtonColor) +{ + auto frame = m_ui->pushButtonLeftButtonColor; + auto palette = frame->palette(); + auto role = frame->backgroundRole(); + palette.setBrush(role, leftButtonColor); + frame->setPalette(palette); +} + +void ImageEditorDialog::updateRightButtonColor(const QColor &rightButtonColor) +{ + auto frame = m_ui->pushButtonRightButtonColor; + auto palette = frame->palette(); + auto role = frame->backgroundRole(); + palette.setBrush(role, rightButtonColor); + frame->setPalette(palette); +} + void ImageEditorDialog::updateTitle() { setWindowTitle(tr("%0%1") diff --git a/src/editor/dialogs/imageeditordialog.h b/src/editor/dialogs/imageeditordialog.h index d2a114c..08f61c9 100644 --- a/src/editor/dialogs/imageeditordialog.h +++ b/src/editor/dialogs/imageeditordialog.h @@ -23,6 +23,11 @@ public: private slots: void changed(); + void selectFont(); + void selectLeftButtonColor(); + void selectRightButtonColor(); + void updateLeftButtonColor(const QColor &leftButtonColor); + void updateRightButtonColor(const QColor &rightButtonColor); private: void updateTitle(); diff --git a/src/editor/dialogs/imageeditordialog.ui b/src/editor/dialogs/imageeditordialog.ui index 42e5e9b..9519e39 100644 --- a/src/editor/dialogs/imageeditordialog.ui +++ b/src/editor/dialogs/imageeditordialog.ui @@ -631,6 +631,12 @@ + + + 0 + 64 + + Aa @@ -704,7 +710,7 @@ 0 0 - 759 + 741 1042 @@ -731,19 +737,13 @@ - + 0 40 - - QFrame::Shape::StyledPanel - - - QFrame::Shadow::Raised - @@ -758,19 +758,13 @@ - + 0 40 - - QFrame::Shape::StyledPanel - - - QFrame::Shadow::Raised - @@ -778,10 +772,10 @@ - + - 0 + 75 100 @@ -794,10 +788,10 @@ - + - 0 + 75 100 @@ -878,6 +872,9 @@ + + false + Preview @@ -1114,6 +1111,12 @@ QWidget
widgets/drawingcanvaswidget.h
+ + ColorWidget + QFrame +
widgets/colorwidget.h
+ 1 +
diff --git a/src/editor/widgets/colorwidget.cpp b/src/editor/widgets/colorwidget.cpp new file mode 100644 index 0000000..cad627a --- /dev/null +++ b/src/editor/widgets/colorwidget.cpp @@ -0,0 +1,88 @@ +#include "colorwidget.h" + +#include +#include +#include + +ColorWidget::ColorWidget(QWidget *parent) + : QFrame{parent} +{ + setCol(150, 255); + setAttribute(Qt::WA_NoSystemBackground); + setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed) ); +} + +ColorWidget::~ColorWidget() = default; + +void ColorWidget::setCol(int h, int s) +{ + int nhue = qMin(qMax(0,h), 359); + int nsat = qMin(qMax(0,s), 255); + if (nhue == m_hue && nsat == m_sat) + return; + QRect r(colPt(), QSize(20,20)); + m_hue = nhue; + m_sat = nsat; + r = r.united(QRect(colPt(), QSize(20,20))); + r.translate(contentsRect().x()-9, contentsRect().y()-9); +// update(r); + repaint(r); +} + +void ColorWidget::paintEvent(QPaintEvent *event) +{ + Q_UNUSED(event) + + QPainter p(this); + drawFrame(&p); + QRect r = contentsRect(); + p.drawPixmap(r.topLeft(), m_pixmap); +} + +void ColorWidget::resizeEvent(QResizeEvent *event) +{ + Q_UNUSED(event) + + int w = width() - frameWidth() * 2; + int h = height() - frameWidth() * 2; + QImage img(w, h, QImage::Format_RGB32); + int x, y; + uint *pixel = (uint *) img.scanLine(0); + for (y = 0; y < h; y++) + { + const uint *end = pixel + w; + x = 0; + while (pixel < end) { + QPoint p(x, y); + QColor c; + c.setHsv(huePt(p), satPt(p), 200); + *pixel = c.rgb(); + ++pixel; + ++x; + } + } + m_pixmap = QPixmap::fromImage(img); +} + +QPoint ColorWidget::colPt() +{ + QRect r = contentsRect(); + return QPoint((360 - m_hue) * (r.width() - 1) / 360, (255 - m_sat) * (r.height() - 1) / 255); +} + +int ColorWidget::huePt(const QPoint &pt) +{ + QRect r = contentsRect(); + return 360 - pt.x() * 360 / (r.width() - 1); +} + +int ColorWidget::satPt(const QPoint &pt) +{ + QRect r = contentsRect(); + return 255 - pt.y() * 255 / (r.height() - 1); +} + +void ColorWidget::setCol(const QPoint &pt) +{ + setCol(huePt(pt), satPt(pt)); +} diff --git a/src/editor/widgets/colorwidget.h b/src/editor/widgets/colorwidget.h new file mode 100644 index 0000000..593842a --- /dev/null +++ b/src/editor/widgets/colorwidget.h @@ -0,0 +1,31 @@ +#pragma once + +#include +#include + +class ColorWidget : public QFrame +{ + Q_OBJECT + +public: + explicit ColorWidget(QWidget *parent = nullptr); + ~ColorWidget() override; + +public slots: + void setCol(int h, int s); + +protected: + void paintEvent(QPaintEvent *event) override; + void resizeEvent(QResizeEvent *event) override; + +private: + QPoint colPt(); + int huePt(const QPoint &pt); + int satPt(const QPoint &pt); + void setCol(const QPoint &pt); + + int m_hue{}; + int m_sat{}; + + QPixmap m_pixmap; +}; diff --git a/src/editor/widgets/drawingcanvaswidget.cpp b/src/editor/widgets/drawingcanvaswidget.cpp index d8043b4..149d53c 100644 --- a/src/editor/widgets/drawingcanvaswidget.cpp +++ b/src/editor/widgets/drawingcanvaswidget.cpp @@ -26,6 +26,20 @@ void DrawingCanvasWidget::setScale(float scale) update(); } +void DrawingCanvasWidget::setLeftButtonColor(const QColor &leftButtonColor) +{ + if (m_leftButtonColor == leftButtonColor) + return; + emit leftButtonColorChanged(m_leftButtonColor = leftButtonColor); +} + +void DrawingCanvasWidget::setRightButtonColor(const QColor &rightButtonColor) +{ + if (m_rightButtonColor == rightButtonColor) + return; + emit rightButtonColorChanged(m_rightButtonColor = rightButtonColor); +} + void DrawingCanvasWidget::paintEvent(QPaintEvent *ev) { if (!m_pixmap) @@ -63,9 +77,20 @@ void DrawingCanvasWidget::mousePressEvent(QMouseEvent *event) { QWidget::mousePressEvent(event); - if (event->button() == Qt::LeftButton) + switch (event->button()) { + case Qt::LeftButton: + case Qt::RightButton: + { + m_currentlyDrawing = event->button() == Qt::LeftButton; + setMouseTracking(true); + + setPixel(event->pos() / m_scale, event->button() == Qt::LeftButton); + + break; + } + default:; } } @@ -73,13 +98,34 @@ void DrawingCanvasWidget::mouseReleaseEvent(QMouseEvent *event) { QWidget::mouseReleaseEvent(event); - if (event->button() == Qt::LeftButton) + switch (event->button()) { + case Qt::LeftButton: + case Qt::RightButton: + { + m_currentlyDrawing = std::nullopt; + setMouseTracking(false); + + break; + } + default:; } } void DrawingCanvasWidget::mouseMoveEvent(QMouseEvent *event) { QWidget::mouseMoveEvent(event); + + if (m_currentlyDrawing) + setPixel(event->pos() / m_scale, *m_currentlyDrawing); +} + +void DrawingCanvasWidget::setPixel(QPoint pos, bool leftColor) +{ + auto image = m_pixmap->toImage(); + image.setPixelColor(pos.x(), pos.y(), leftColor ? m_leftButtonColor : m_rightButtonColor); + *m_pixmap = QPixmap::fromImage(image); + repaint(); + emit changed(); } diff --git a/src/editor/widgets/drawingcanvaswidget.h b/src/editor/widgets/drawingcanvaswidget.h index 2a0cf6c..d89e11a 100644 --- a/src/editor/widgets/drawingcanvaswidget.h +++ b/src/editor/widgets/drawingcanvaswidget.h @@ -8,6 +8,11 @@ class DrawingCanvasWidget : public QWidget { Q_OBJECT + Q_PROPERTY(float scale READ scale WRITE setScale NOTIFY scaleChanged FINAL) + + Q_PROPERTY(QColor leftButtonColor READ leftButtonColor WRITE setLeftButtonColor NOTIFY leftButtonColorChanged FINAL) + Q_PROPERTY(QColor rightButtonColor READ rightButtonColor WRITE setRightButtonColor NOTIFY rightButtonColorChanged FINAL) + public: explicit DrawingCanvasWidget(QWidget *parent = nullptr); @@ -18,8 +23,17 @@ public: float scale() const { return m_scale; } void setScale(float scale); + QColor leftButtonColor() const { return m_leftButtonColor; } + void setLeftButtonColor(const QColor &LeftButtonColor); + QColor rightButtonColor() const { return m_rightButtonColor; } + void setRightButtonColor(const QColor &rightButtonColor); + signals: + void changed(); + void scaleChanged(float scale); + void leftButtonColorChanged(const QColor &LeftButtonColor); + void rightButtonColorChanged(const QColor &rightButtonColor); protected: void paintEvent(QPaintEvent *ev) override; @@ -28,7 +42,14 @@ protected: void mouseMoveEvent(QMouseEvent *event) override; private: + void setPixel(QPoint pos, bool leftColor); + QPixmap *m_pixmap{}; float m_scale{4.f}; + + QColor m_leftButtonColor{Qt::white}; + QColor m_rightButtonColor{Qt::black}; + + std::optional m_currentlyDrawing; }; diff --git a/src/stdserialization.h b/src/stdserialization.h index 7697af5..1bd6b99 100644 --- a/src/stdserialization.h +++ b/src/stdserialization.h @@ -148,6 +148,7 @@ QDataStream &operator>>(QDataStream &ds, std::variant &variant) static constexpr func_t *funcs[] = { detail::variantUnpacker... }; + assert(index >= 0 && size_t(index) < std::size(funcs)); variant = funcs[index](ds); return ds;