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