diff -r a74f2ff353b8 -r b376645315ab src/colorSelector.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/colorSelector.cc Sat Mar 29 05:26:10 2014 +0200 @@ -0,0 +1,210 @@ +/* + * LDForge: LDraw parts authoring CAD + * Copyright (C) 2013, 2014 Santeri Piippo + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * ===================================================================== + * + * colorSelectDialog.cxx: Color selector box. + */ + +#include +#include +#include +#include + +#include "main.h" +#include "mainWindow.h" +#include "colorSelector.h" +#include "colors.h" +#include "configuration.h" +#include "miscallenous.h" +#include "ui_colorsel.h" + +static const int g_numColumns = 16; +static const int g_squareSize = 32; + +extern_cfg (String, gl_maincolor); +extern_cfg (Float, gl_maincolor_alpha); + +// ============================================================================= +// ============================================================================= +ColorSelector::ColorSelector (int defval, QWidget* parent) : QDialog (parent) +{ + // Remove the default color if it's invalid + if (!getColor (defval)) + defval = -1; + + m_firstResize = true; + ui = new Ui_ColorSelUI; + ui->setupUi (this); + + m_scene = new QGraphicsScene; + ui->viewport->setScene (m_scene); + setSelection (getColor (defval)); + + // not really an icon but eh + m_scene->setBackgroundBrush (getIcon ("checkerboard")); + drawScene(); + + int width = viewportWidth(); + ui->viewport->setMinimumWidth (width); + ui->viewport->setMaximumWidth (width); + + drawColorInfo(); +} + +// ============================================================================= +// ============================================================================= +ColorSelector::~ColorSelector() +{ + delete ui; +} + +// ============================================================================= +// ============================================================================= +void ColorSelector::drawScene() +{ + 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 < MAX_COLORS; ++i) + { + LDColor* info = ::getColor (i); + + if (!info) + continue; + + const double x = (i % numCols) * square; + const double y = (i / numCols) * square; + const double w = square - (penWidth / 2); + + QColor col = info->faceColor; + + if (i == maincolor) + { + // Use the user preferences for main color here + col = QColor (gl_maincolor); + col.setAlpha (gl_maincolor_alpha * 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 (selection() && i == selection()->index) + { + auto curspic = m_scene->addPixmap (getIcon ("colorcursor")); + curspic->setPos (x, y); + } + } +} + +// ============================================================================= +// ============================================================================= +int ColorSelector::numRows() const +{ + return (MAX_COLORS / g_numColumns); +} + +// ============================================================================= +// ============================================================================= +int ColorSelector::viewportWidth() const +{ + return g_numColumns * g_squareSize + 21; +} + +// ============================================================================= +// ============================================================================= +void ColorSelector::drawColorInfo() +{ + if (!selection()) + { + ui->colorLabel->setText ("---"); + return; + } + + ui->colorLabel->setText (format ("%1 - %2", selection()->index, selection()->name)); +} + +// ============================================================================= +// ============================================================================= +void ColorSelector::resizeEvent (QResizeEvent* ev) +{ + // 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. + if (m_firstResize) + { + int visibleColors = (ui->viewport->height() / g_squareSize) * g_numColumns; + + if (selection() && selection()->index >= visibleColors) + { + int y = (selection()->index / g_numColumns) * g_squareSize; + ui->viewport->verticalScrollBar()->setValue (y); + } + + m_firstResize = false; + } + + (void) ev; + 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 = ::getColor (idx); + + if (!col) + return; + + setSelection (col); + drawScene(); + drawColorInfo(); +} + +// ============================================================================= +// ============================================================================= +bool ColorSelector::selectColor (int& val, int defval, QWidget* parent) +{ + ColorSelector dlg (defval, parent); + + if (dlg.exec() && dlg.selection() != null) + { + val = dlg.selection()->index; + return true; + } + + return false; +} \ No newline at end of file