# HG changeset patch # User Teemu Piippo # Date 1410007507 -10800 # Node ID 945e44575b3e73d6233bb3a39fa030ca0651151b # Parent 7c50b61ad5b655978f0fe6976b0b3bb46ed229c2 - changed the unorthodox color selection grid into a push button grid diff -r 7c50b61ad5b6 -r 945e44575b3e changelog.txt --- a/changelog.txt Thu Sep 04 11:48:05 2014 +0300 +++ b/changelog.txt Sat Sep 06 15:45:07 2014 +0300 @@ -83,6 +83,7 @@ color/type of the existing selection does not need to be uniform anymore. ! - Removed the Non-CA license option. The CA license option is now a checkbox (disabling it means no license at all). +! - The color selection prompt now uses a grid of pushbuttons instead of an unorthodox grid of colors diff -r 7c50b61ad5b6 -r 945e44575b3e src/colorSelector.cc --- a/src/colorSelector.cc Thu Sep 04 11:48:05 2014 +0300 +++ b/src/colorSelector.cc Sat Sep 06 15:45:07 2014 +0300 @@ -33,33 +33,70 @@ #include "ui_colorsel.h" static const int g_numColumns = 16; -static const int g_squareSize = 32; EXTERN_CFGENTRY (String, MainColor) EXTERN_CFGENTRY (Float, MainColorAlpha) // ============================================================================= // -ColorSelector::ColorSelector (LDColor defval, QWidget* parent) : QDialog (parent) +ColorSelector::ColorSelector (LDColor defaultvalue, QWidget* parent) : + QDialog (parent) { m_firstResize = true; ui = new Ui_ColorSelUI; ui->setupUi (this); + setSelection (defaultvalue); - m_scene = new QGraphicsScene; - ui->viewport->setScene (m_scene); - setSelection (defval); + QGridLayout* layout = new QGridLayout (this); + + // Spawn color selector buttons + for (int i = 0; i < CountLDConfigColors(); ++i) + { + LDColor ldcolor = LDColor::fromIndex (i); + QPushButton* button = new QPushButton (this); + button->setMinimumSize (QSize (32, 32)); + button->setMaximumSize (button->minimumSize()); + + if (ldcolor != null) + { + QString colorname; + QColor color (ldcolor.faceColor()); + + if (i == MainColorIndex) + { + color = QColor (cfg::MainColor); + color.setAlphaF (cfg::MainColorAlpha); + } - // not really an icon but eh - m_scene->setBackgroundBrush (GetIcon ("checkerboard")); - drawScene(); + QString color2name (Luma (color) < 80 ? "white" : "black"); + button->setAutoFillBackground (true); + button->setStyleSheet (format ("background-color: rgba(%1, %2, %3, %4); color: %5", + color.red(), color.green(), color.blue(), color.alpha(), color2name)); + button->setCheckable (true); + button->setText (QString::number (ldcolor.index())); + button->setToolTip (format ("%1: %2", ldcolor.index(), ldcolor.name())); + m_buttons[i] = button; + m_buttonsReversed[button] = i; + connect (button, SIGNAL (clicked(bool)), this, SLOT (colorButtonClicked())); - int width = viewportWidth(); - ui->viewport->setMinimumWidth (width); - ui->viewport->setMaximumWidth (width); + if (ldcolor == selection()) + button->setChecked (true); + } + else + { + button->setEnabled (false); + } + layout->addWidget (button, i / g_numColumns, i % g_numColumns); + } + + QWidget* widget = new QWidget(); + widget->setLayout (layout); + ui->definedColors->setWidget (widget); connect (ui->directColor, SIGNAL (clicked (bool)), this, SLOT (chooseDirectColor())); + ui->definedColors->setMinimumWidth (ui->definedColors->widget()->width() + 16); + #ifdef TRANSPARENT_DIRECT_COLORS connect (ui->transparentDirectColor, SIGNAL (clicked (bool)), this, SLOT (transparentCheckboxClicked())); #else @@ -78,67 +115,30 @@ // ============================================================================= // -void ColorSelector::drawScene() +void ColorSelector::colorButtonClicked() { - const int numCols = g_numColumns; - const int square = g_squareSize; - const int g_maxHeight = (numRows() * square); - QRect sceneRect (0, 0, viewportWidth(), g_maxHeight); - - m_scene->setSceneRect (sceneRect); - ui->viewport->setSceneRect (sceneRect); - - const double penWidth = 1.0f; - - // Draw the color rectangles. - m_scene->clear(); - - for (int i = 0; i < CountLDConfigColors(); ++i) - { - LDColor info = LDColor::fromIndex (i); - - if (info == null) - continue; - - const double x = (i % numCols) * square; - const double y = (i / numCols) * square; - const double w = square - (penWidth / 2); - - QColor col (info.faceColor()); + QPushButton* button = qobject_cast (sender()); + auto it = m_buttonsReversed.find (button); + LDColor color; - if (i == MainColorIndex) - { - // Use the user preferences for main color here - col = QColor (cfg::MainColor); - col.setAlpha (cfg::MainColorAlpha * 255.0f); - } - - QPen pen (info.edgeColor(), penWidth, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin); - m_scene->addRect (x, y, w, w, pen, col); - QGraphicsTextItem* numtext = m_scene->addText (format ("%1", i)); - numtext->setDefaultTextColor ((Luma (col) < 80) ? Qt::white : Qt::black); - numtext->setPos (x, y); + if (Q_UNLIKELY (button == null or it == m_buttonsReversed.end() + or (color = LDColor::fromIndex (*it)) == null)) + { + print ("colorButtonClicked() called with invalid sender"); + return; + } - if (selection() and i == selection().index()) - { - auto curspic = m_scene->addPixmap (GetIcon ("colorcursor")); - curspic->setPos (x, y); - } - } -} + if (selection() != null) + { + auto it2 = m_buttons.find (selection().index()); -// ============================================================================= -// -int ColorSelector::numRows() const -{ - return (CountLDConfigColors() / g_numColumns); -} + if (it2 != m_buttons.end()) + (*it2)->setChecked (false); + } -// ============================================================================= -// -int ColorSelector::viewportWidth() const -{ - return g_numColumns * g_squareSize + 21; + setSelection (color); + button->setChecked (true); + drawColorInfo(); } // ============================================================================= @@ -168,49 +168,6 @@ // ============================================================================= // -void ColorSelector::resizeEvent (QResizeEvent*) -{ - // If this is the first resize, check if we need to scroll down to see the - // currently selected color. We cannot do this in the constructor because the - // height is not set properly there. Though don't do this if we selected a - // direct color. - if (m_firstResize and selection().index() >= CountLDConfigColors()) - { - int visibleColors = (ui->viewport->height() / g_squareSize) * g_numColumns; - - if (selection() and selection().index() >= visibleColors) - { - int y = (selection().index() / g_numColumns) * g_squareSize; - ui->viewport->verticalScrollBar()->setValue (y); - } - } - - m_firstResize = false; - drawScene(); -} - -// ============================================================================= -// -void ColorSelector::mousePressEvent (QMouseEvent* event) -{ - QPointF scenepos = ui->viewport->mapToScene (event->pos()); - - int x = (scenepos.x() - (g_squareSize / 2)) / g_squareSize; - int y = (scenepos.y() - (g_squareSize / 2)) / g_squareSize; - int idx = (y * g_numColumns) + x; - - LDColor col = LDColor::fromIndex (idx); - - if (not col) - return; - - setSelection (col); - drawScene(); - drawColorInfo(); -} - -// ============================================================================= -// void ColorSelector::selectDirectColor (QColor col) { int32 idx = (ui->transparentDirectColor->isChecked() ? 0x03000000 : 0x02000000); diff -r 7c50b61ad5b6 -r 945e44575b3e src/colorSelector.h --- a/src/colorSelector.h Thu Sep 04 11:48:05 2014 +0300 +++ b/src/colorSelector.h Sat Sep 06 15:45:07 2014 +0300 @@ -30,26 +30,21 @@ PROPERTY (private, LDColor, selection, setSelection, STOCK_WRITE) public: - explicit ColorSelector (LDColor defval = null, QWidget* parent = null); + explicit ColorSelector (LDColor defaultvalue = null, QWidget* parent = null); virtual ~ColorSelector(); static bool selectColor (LDColor& val, LDColor defval = null, QWidget* parent = null); -protected: - void mousePressEvent (QMouseEvent* event); - void resizeEvent (QResizeEvent* ev); - private: Ui_ColorSelUI* ui; - QGraphicsScene* m_scene; + QMap m_buttons; + QMap m_buttonsReversed; bool m_firstResize; - int numRows() const; - int viewportWidth() const; - void drawScene(); void drawColorInfo(); void selectDirectColor (QColor col); private slots: + void colorButtonClicked(); void chooseDirectColor(); void transparentCheckboxClicked(); }; diff -r 7c50b61ad5b6 -r 945e44575b3e ui/colorsel.ui --- a/ui/colorsel.ui Thu Sep 04 11:48:05 2014 +0300 +++ b/ui/colorsel.ui Sat Sep 06 15:45:07 2014 +0300 @@ -6,25 +6,35 @@ 0 0 - 402 - 539 + 588 + 404 Select Color - - - + + + Qt::ScrollBarAlwaysOn Qt::ScrollBarAlwaysOff + + + + 0 + 0 + 384 + 287 + + + - + @@ -76,7 +86,7 @@ - + Qt::Horizontal