improve palette editor ui
- remove redundant RGB label - in color picker, instruct user to press SPACE - add toggle between 15 and 24 bit depth displaying
This commit is contained in:
parent
ab6aa01973
commit
12d5f22475
4 changed files with 1019 additions and 987 deletions
|
@ -6,13 +6,22 @@
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>357</width>
|
<width>383</width>
|
||||||
<height>186</height>
|
<height>243</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
<string>Color Picker</string>
|
<string>Color Picker</string>
|
||||||
</property>
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_3">
|
||||||
|
<item>
|
||||||
|
<widget class="QFrame" name="frame_2">
|
||||||
|
<property name="frameShape">
|
||||||
|
<enum>QFrame::Box</enum>
|
||||||
|
</property>
|
||||||
|
<property name="frameShadow">
|
||||||
|
<enum>QFrame::Plain</enum>
|
||||||
|
</property>
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QFrame" name="frame_4">
|
<widget class="QFrame" name="frame_4">
|
||||||
|
@ -187,6 +196,24 @@
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="label_SPACE">
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<family>Courier</family>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>press [SPACE] to capture color</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignCenter</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
<resources/>
|
<resources/>
|
||||||
<connections/>
|
<connections/>
|
||||||
</ui>
|
</ui>
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -36,7 +36,6 @@ private:
|
||||||
QList<QList<QSlider*>> sliders;
|
QList<QList<QSlider*>> sliders;
|
||||||
QList<QList<QSpinBox *>> spinners;
|
QList<QList<QSpinBox *>> spinners;
|
||||||
QList<QFrame*> frames;
|
QList<QFrame*> frames;
|
||||||
QList<QLabel*> rgbLabels;
|
|
||||||
QList<QToolButton *> pickButtons;
|
QList<QToolButton *> pickButtons;
|
||||||
QList<QLineEdit *> hexEdits;
|
QList<QLineEdit *> hexEdits;
|
||||||
|
|
||||||
|
@ -59,6 +58,9 @@ private:
|
||||||
void setRgbFromHexEdit(int colorIndex);
|
void setRgbFromHexEdit(int colorIndex);
|
||||||
void setRgbFromSpinners(int colorIndex);
|
void setRgbFromSpinners(int colorIndex);
|
||||||
|
|
||||||
|
void setBitDepth(int bits);
|
||||||
|
int bitDepth = 24;
|
||||||
|
|
||||||
class HexCodeValidator : public QValidator {
|
class HexCodeValidator : public QValidator {
|
||||||
virtual QValidator::State validate(QString &input, int &) const override {
|
virtual QValidator::State validate(QString &input, int &) const override {
|
||||||
input = input.toUpper();
|
input = input.toUpper();
|
||||||
|
|
|
@ -10,6 +10,10 @@
|
||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
|
|
||||||
static inline int rgb5(int rgb) { return round(static_cast<double>(rgb * 31) / 255.0); }
|
static inline int rgb5(int rgb) { return round(static_cast<double>(rgb * 31) / 255.0); }
|
||||||
|
static inline int rgb8(int rgb) { return round(rgb * 255. / 31.); }
|
||||||
|
static inline int gbaRed(int rgb) { return rgb & 0x1f; }
|
||||||
|
static inline int gbaGreen(int rgb) { return (rgb >> 5) & 0x1f; }
|
||||||
|
static inline int gbaBlue(int rgb) { return (rgb >> 10) & 0x1f; }
|
||||||
|
|
||||||
PaletteEditor::PaletteEditor(Project *project, Tileset *primaryTileset, Tileset *secondaryTileset, int paletteId, QWidget *parent) :
|
PaletteEditor::PaletteEditor(Project *project, Tileset *primaryTileset, Tileset *secondaryTileset, int paletteId, QWidget *parent) :
|
||||||
QMainWindow(parent),
|
QMainWindow(parent),
|
||||||
|
@ -51,13 +55,7 @@ PaletteEditor::PaletteEditor(Project *project, Tileset *primaryTileset, Tileset
|
||||||
this->frames.clear();
|
this->frames.clear();
|
||||||
for (int i = 0; i < 16; i++) {
|
for (int i = 0; i < 16; i++) {
|
||||||
this->frames.append(this->ui->container->findChild<QFrame *>("colorFrame_" + QString::number(i)));
|
this->frames.append(this->ui->container->findChild<QFrame *>("colorFrame_" + QString::number(i)));
|
||||||
this->frames[i]->setFrameStyle(QFrame::Box | QFrame::Plain);
|
this->frames[i]->setFrameStyle(QFrame::NoFrame);
|
||||||
}
|
|
||||||
|
|
||||||
this->rgbLabels.clear();
|
|
||||||
for (int i = 0; i < 16; i++) {
|
|
||||||
this->rgbLabels.append(this->ui->container->findChild<QLabel *>("rgb_" + QString::number(i)));
|
|
||||||
this->rgbLabels[i]->setStyleSheet("QLabel { font-family: \"Courier\" }");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this->pickButtons.clear();
|
this->pickButtons.clear();
|
||||||
|
@ -70,8 +68,6 @@ PaletteEditor::PaletteEditor(Project *project, Tileset *primaryTileset, Tileset
|
||||||
for (int i = 0; i < 16; i++) {
|
for (int i = 0; i < 16; i++) {
|
||||||
this->hexEdits.append(this->ui->container->findChild<QLineEdit *>("hex_" + QString::number(i)));
|
this->hexEdits.append(this->ui->container->findChild<QLineEdit *>("hex_" + QString::number(i)));
|
||||||
this->hexEdits[i]->setValidator(hexValidator);
|
this->hexEdits[i]->setValidator(hexValidator);
|
||||||
this->hexEdits[i]->setInputMask("HHHHHH");
|
|
||||||
this->hexEdits[i]->setMaxLength(6);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Connect to function that will update color when hex edit is changed
|
// Connect to function that will update color when hex edit is changed
|
||||||
|
@ -91,6 +87,12 @@ PaletteEditor::PaletteEditor(Project *project, Tileset *primaryTileset, Tileset
|
||||||
connect(this->pickButtons[i], &QToolButton::clicked, [this, i](){ this->pickColor(i); });
|
connect(this->pickButtons[i], &QToolButton::clicked, [this, i](){ this->pickColor(i); });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setBitDepth(24);
|
||||||
|
|
||||||
|
// Connect bit depth buttons
|
||||||
|
connect(this->ui->bit_depth_15, &QRadioButton::toggled, [this](bool checked){ if (checked) this->setBitDepth(15); });
|
||||||
|
connect(this->ui->bit_depth_24, &QRadioButton::toggled, [this](bool checked){ if (checked) this->setBitDepth(24); });
|
||||||
|
|
||||||
this->setPaletteId(paletteId);
|
this->setPaletteId(paletteId);
|
||||||
this->commitEditHistory(this->ui->spinBox_PaletteId->value());
|
this->commitEditHistory(this->ui->spinBox_PaletteId->value());
|
||||||
this->restoreWindowState();
|
this->restoreWindowState();
|
||||||
|
@ -109,11 +111,26 @@ void PaletteEditor::updateColorUi(int colorIndex, QRgb rgb) {
|
||||||
int green = qGreen(rgb);
|
int green = qGreen(rgb);
|
||||||
int blue = qBlue(rgb);
|
int blue = qBlue(rgb);
|
||||||
|
|
||||||
|
if (this->bitDepth == 15) {
|
||||||
// sliders
|
// sliders
|
||||||
this->sliders[colorIndex][0]->setValue(rgb5(red));
|
this->sliders[colorIndex][0]->setValue(rgb5(red));
|
||||||
this->sliders[colorIndex][1]->setValue(rgb5(green));
|
this->sliders[colorIndex][1]->setValue(rgb5(green));
|
||||||
this->sliders[colorIndex][2]->setValue(rgb5(blue));
|
this->sliders[colorIndex][2]->setValue(rgb5(blue));
|
||||||
|
|
||||||
|
// hex
|
||||||
|
int hex15 = (rgb5(blue) << 10) | (rgb5(green) << 5) | rgb5(red);
|
||||||
|
QString hexcode = QString::number(hex15, 16).toUpper();
|
||||||
|
|
||||||
|
// spinners
|
||||||
|
this->spinners[colorIndex][0]->setValue(rgb5(red));
|
||||||
|
this->spinners[colorIndex][1]->setValue(rgb5(green));
|
||||||
|
this->spinners[colorIndex][2]->setValue(rgb5(blue));
|
||||||
|
} else {
|
||||||
|
// sliders
|
||||||
|
this->sliders[colorIndex][0]->setValue(red);
|
||||||
|
this->sliders[colorIndex][1]->setValue(green);
|
||||||
|
this->sliders[colorIndex][2]->setValue(blue);
|
||||||
|
|
||||||
// hex
|
// hex
|
||||||
QColor color(red, green, blue);
|
QColor color(red, green, blue);
|
||||||
QString hexcode = color.name().remove(0, 1).toUpper();
|
QString hexcode = color.name().remove(0, 1).toUpper();
|
||||||
|
@ -123,17 +140,12 @@ void PaletteEditor::updateColorUi(int colorIndex, QRgb rgb) {
|
||||||
this->spinners[colorIndex][0]->setValue(red);
|
this->spinners[colorIndex][0]->setValue(red);
|
||||||
this->spinners[colorIndex][1]->setValue(green);
|
this->spinners[colorIndex][1]->setValue(green);
|
||||||
this->spinners[colorIndex][2]->setValue(blue);
|
this->spinners[colorIndex][2]->setValue(blue);
|
||||||
|
}
|
||||||
|
|
||||||
// frame
|
// frame
|
||||||
QString stylesheet = QString("background-color: rgb(%1, %2, %3);").arg(red).arg(green).arg(blue);
|
QString stylesheet = QString("background-color: rgb(%1, %2, %3);").arg(red).arg(green).arg(blue);
|
||||||
this->frames[colorIndex]->setStyleSheet(stylesheet);
|
this->frames[colorIndex]->setStyleSheet(stylesheet);
|
||||||
|
|
||||||
// rgb label
|
|
||||||
int w = 3;
|
|
||||||
QChar spc = ' ';
|
|
||||||
int base = 10;
|
|
||||||
this->rgbLabels[colorIndex]->setText(QString(" RGB(%1, %2, %3)").arg(red, w, base, spc).arg(green, w, base, spc).arg(blue, w, base, spc));
|
|
||||||
|
|
||||||
setSignalsEnabled(true);
|
setSignalsEnabled(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -156,6 +168,68 @@ void PaletteEditor::setSignalsEnabled(bool enabled) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PaletteEditor::setBitDepth(int bits) {
|
||||||
|
setSignalsEnabled(false);
|
||||||
|
switch (bits) {
|
||||||
|
case 15:
|
||||||
|
for (int i = 0; i < 16; i++) {
|
||||||
|
// sliders ranged [0, 31] with 1 single step and 4 page step
|
||||||
|
this->sliders[i][0]->setSingleStep(1);
|
||||||
|
this->sliders[i][1]->setSingleStep(1);
|
||||||
|
this->sliders[i][2]->setSingleStep(1);
|
||||||
|
this->sliders[i][0]->setPageStep(4);
|
||||||
|
this->sliders[i][1]->setPageStep(4);
|
||||||
|
this->sliders[i][2]->setPageStep(4);
|
||||||
|
this->sliders[i][0]->setMaximum(31);
|
||||||
|
this->sliders[i][1]->setMaximum(31);
|
||||||
|
this->sliders[i][2]->setMaximum(31);
|
||||||
|
|
||||||
|
// spinners limited [0, 31] with 1 step
|
||||||
|
this->spinners[i][0]->setSingleStep(1);
|
||||||
|
this->spinners[i][1]->setSingleStep(1);
|
||||||
|
this->spinners[i][2]->setSingleStep(1);
|
||||||
|
this->spinners[i][0]->setMaximum(31);
|
||||||
|
this->spinners[i][1]->setMaximum(31);
|
||||||
|
this->spinners[i][2]->setMaximum(31);
|
||||||
|
|
||||||
|
// hex box now 4 digits
|
||||||
|
this->hexEdits[i]->setInputMask("HHHH");
|
||||||
|
this->hexEdits[i]->setMaxLength(4);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 24:
|
||||||
|
default:
|
||||||
|
for (int i = 0; i < 16; i++) {
|
||||||
|
// sliders ranged [0, 31] with 1 single step and 4 page step
|
||||||
|
this->sliders[i][0]->setSingleStep(8);
|
||||||
|
this->sliders[i][1]->setSingleStep(8);
|
||||||
|
this->sliders[i][2]->setSingleStep(8);
|
||||||
|
this->sliders[i][0]->setPageStep(24);
|
||||||
|
this->sliders[i][1]->setPageStep(24);
|
||||||
|
this->sliders[i][2]->setPageStep(24);
|
||||||
|
this->sliders[i][0]->setMaximum(255);
|
||||||
|
this->sliders[i][1]->setMaximum(255);
|
||||||
|
this->sliders[i][2]->setMaximum(255);
|
||||||
|
|
||||||
|
// spinners limited [0, 31] with 1 step
|
||||||
|
this->spinners[i][0]->setSingleStep(8);
|
||||||
|
this->spinners[i][1]->setSingleStep(8);
|
||||||
|
this->spinners[i][2]->setSingleStep(8);
|
||||||
|
this->spinners[i][0]->setMaximum(255);
|
||||||
|
this->spinners[i][1]->setMaximum(255);
|
||||||
|
this->spinners[i][2]->setMaximum(255);
|
||||||
|
|
||||||
|
// hex box now 4 digits
|
||||||
|
this->hexEdits[i]->setInputMask("HHHHHH");
|
||||||
|
this->hexEdits[i]->setMaxLength(6);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
this->bitDepth = bits;
|
||||||
|
refreshColorUis();
|
||||||
|
setSignalsEnabled(true);
|
||||||
|
}
|
||||||
|
|
||||||
void PaletteEditor::setRgb(int colorIndex, QRgb rgb) {
|
void PaletteEditor::setRgb(int colorIndex, QRgb rgb) {
|
||||||
int paletteNum = this->ui->spinBox_PaletteId->value();
|
int paletteNum = this->ui->spinBox_PaletteId->value();
|
||||||
|
|
||||||
|
@ -172,24 +246,46 @@ void PaletteEditor::setRgb(int colorIndex, QRgb rgb) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void PaletteEditor::setRgbFromSliders(int colorIndex) {
|
void PaletteEditor::setRgbFromSliders(int colorIndex) {
|
||||||
setRgb(colorIndex, qRgb(round(this->sliders[colorIndex][0]->value() * 255. / 31.),
|
if (this->bitDepth == 15) {
|
||||||
round(this->sliders[colorIndex][1]->value() * 255. / 31.),
|
setRgb(colorIndex, qRgb(rgb8(this->sliders[colorIndex][0]->value()),
|
||||||
round(this->sliders[colorIndex][2]->value() * 255. / 31.)));
|
rgb8(this->sliders[colorIndex][1]->value()),
|
||||||
|
rgb8(this->sliders[colorIndex][2]->value())));
|
||||||
|
} else {
|
||||||
|
setRgb(colorIndex, qRgb(this->sliders[colorIndex][0]->value(),
|
||||||
|
this->sliders[colorIndex][1]->value(),
|
||||||
|
this->sliders[colorIndex][2]->value()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void PaletteEditor::setRgbFromHexEdit(int colorIndex) {
|
void PaletteEditor::setRgbFromHexEdit(int colorIndex) {
|
||||||
QString text = this->hexEdits[colorIndex]->text();
|
QString text = this->hexEdits[colorIndex]->text();
|
||||||
bool ok = false;
|
bool ok = false;
|
||||||
|
if (this->bitDepth == 15) {
|
||||||
|
int rgb15 = text.toInt(&ok, 16);
|
||||||
|
int rc = gbaRed(rgb15);
|
||||||
|
int gc = gbaGreen(rgb15);
|
||||||
|
int bc = gbaBlue(rgb15);
|
||||||
|
QRgb rgb = qRgb(rc, gc, bc);
|
||||||
|
if (!ok) rgb = 0xFFFFFFFF;
|
||||||
|
setRgb(colorIndex, rgb);
|
||||||
|
} else {
|
||||||
QRgb rgb = text.toInt(&ok, 16);
|
QRgb rgb = text.toInt(&ok, 16);
|
||||||
if (!ok) rgb = 0xFFFFFFFF;
|
if (!ok) rgb = 0xFFFFFFFF;
|
||||||
setRgb(colorIndex, rgb);
|
setRgb(colorIndex, rgb);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void PaletteEditor::setRgbFromSpinners(int colorIndex) {
|
void PaletteEditor::setRgbFromSpinners(int colorIndex) {
|
||||||
|
if (this->bitDepth == 15) {
|
||||||
|
setRgb(colorIndex, qRgb(rgb8(this->spinners[colorIndex][0]->value()),
|
||||||
|
rgb8(this->spinners[colorIndex][1]->value()),
|
||||||
|
rgb8(this->spinners[colorIndex][2]->value())));
|
||||||
|
} else {
|
||||||
setRgb(colorIndex, qRgb(this->spinners[colorIndex][0]->value(),
|
setRgb(colorIndex, qRgb(this->spinners[colorIndex][0]->value(),
|
||||||
this->spinners[colorIndex][1]->value(),
|
this->spinners[colorIndex][1]->value(),
|
||||||
this->spinners[colorIndex][2]->value()));
|
this->spinners[colorIndex][2]->value()));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void PaletteEditor::refreshColorUis() {
|
void PaletteEditor::refreshColorUis() {
|
||||||
int paletteNum = this->ui->spinBox_PaletteId->value();
|
int paletteNum = this->ui->spinBox_PaletteId->value();
|
||||||
|
|
Loading…
Reference in a new issue