diff -r 9374fea8f77f -r f1b8cb53d2a2 src/colorSelectDialog.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/colorSelectDialog.cpp Wed May 08 15:19:06 2013 +0300
@@ -0,0 +1,179 @@
+/*
+ * LDForge: LDraw parts authoring CAD
+ * Copyright (C) 2013 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 .
+ */
+
+#include "common.h"
+#include "gui.h"
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include "colorSelectDialog.h"
+#include "colors.h"
+#include "config.h"
+#include "misc.h"
+
+static const short g_dNumColumns = 8;
+static const short g_dNumRows = 10;
+static const short g_dSquareSize = 32;
+static const long g_lWidth = (g_dNumColumns * g_dSquareSize);
+static const long g_lHeight = (g_dNumRows * g_dSquareSize);
+static const long g_lMaxHeight = ((MAX_COLORS / g_dNumColumns) * g_dSquareSize);
+
+extern_cfg (str, gl_maincolor);
+extern_cfg (float, gl_maincolor_alpha);
+
+// =============================================================================
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+// =============================================================================
+ColorSelectDialog::ColorSelectDialog (short int defval, QWidget* parent) : QDialog (parent) {
+ // Remove the default color if it's invalid
+ if (!getColor (defval))
+ defval = -1;
+
+ gs_scene = new QGraphicsScene;
+ gv_view = new QGraphicsView (gs_scene);
+ selColor = defval;
+
+ // not really an icon but eh
+ gs_scene->setBackgroundBrush (getIcon ("checkerboard"));
+
+ gs_scene->setSceneRect (0, 0, g_lWidth, g_lMaxHeight);
+ gv_view->setSceneRect (0, 0, g_lWidth, g_lMaxHeight);
+
+ drawScene ();
+
+ IMPLEMENT_DIALOG_BUTTONS
+
+ // Set the size of the view
+ const long lWidth = g_lWidth + 21; // HACK
+ gv_view->setMaximumWidth (lWidth);
+ gv_view->setMinimumWidth (lWidth);
+ gv_view->setMaximumHeight (g_lHeight);
+ gv_view->setMinimumHeight (g_lHeight);
+ gv_view->setHorizontalScrollBarPolicy (Qt::ScrollBarAlwaysOff);
+
+ // If we have a default color selected, scroll down so that it is visible.
+ // TODO: find a better way to do this
+ if (defval >= ((g_dNumColumns * g_dNumRows) - 2)) {
+ ulong ulNewY = ((defval / g_dNumColumns) - 3) * g_dSquareSize;
+ gv_view->verticalScrollBar ()->setSliderPosition (ulNewY);
+ }
+
+ lb_colorInfo = new QLabel;
+ drawColorInfo ();
+
+ QVBoxLayout* qLayout = new QVBoxLayout;
+ qLayout->addWidget (gv_view);
+ qLayout->addWidget (lb_colorInfo);
+ qLayout->addWidget (bbx_buttons);
+ setLayout (qLayout);
+
+ setWindowIcon (getIcon ("palette"));
+ setWindowTitle (APPNAME);
+}
+
+// =============================================================================
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+// =============================================================================
+void ColorSelectDialog::drawScene () {
+ const double fPenWidth = 1.0f;
+ QPen qPen (Qt::black, fPenWidth, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin);
+
+ // Draw the color rectangles.
+ gs_scene->clear ();
+ for (short i = 0; i < MAX_COLORS; ++i) {
+ color* meta = getColor (i);
+ if (!meta)
+ continue;
+
+ const double x = (i % g_dNumColumns) * g_dSquareSize;
+ const double y = (i / g_dNumColumns) * g_dSquareSize;
+ const double w = (g_dSquareSize) - (fPenWidth / 2);
+
+ QColor col = meta->qColor;
+
+ if (i == maincolor) {
+ // Use the user preferences for main color here
+ col = gl_maincolor.value.chars ();
+ col.setAlpha (gl_maincolor_alpha * 255.0f);
+ }
+
+ bool dark = (luma (col) < 80);
+
+ gs_scene->addRect (x, y, w, w, qPen, col);
+ QGraphicsTextItem* qText = gs_scene->addText (fmt ("%lu", i).chars());
+ qText->setDefaultTextColor ((dark) ? Qt::white : Qt::black);
+ qText->setPos (x, y);
+
+ if (i == selColor) {
+ auto curspic = gs_scene->addPixmap (getIcon ("colorcursor"));
+ curspic->setPos (x, y);
+ }
+ }
+}
+
+// =============================================================================
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+// =============================================================================
+void ColorSelectDialog::drawColorInfo () {
+ color* col = getColor (selColor);
+
+ if (selColor == -1 || !col) {
+ lb_colorInfo->setText ("---");
+ return;
+ }
+
+ lb_colorInfo->setText (fmt ("%d - %s",
+ selColor, col->zName.chars()));
+}
+
+// =============================================================================
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+// =============================================================================
+void ColorSelectDialog::mousePressEvent (QMouseEvent* event) {
+ QPointF qPoint = gv_view->mapToScene (event->pos ());
+
+ ulong x = ((ulong)qPoint.x () - (g_dSquareSize / 2)) / g_dSquareSize;
+ ulong y = ((ulong)qPoint.y () - (g_dSquareSize / 2)) / g_dSquareSize;
+ ulong idx = (y * g_dNumColumns) + x;
+
+ color* col = getColor (idx);
+ if (!col)
+ return;
+
+ selColor = idx;
+ drawScene ();
+ drawColorInfo ();
+}
+
+// =============================================================================
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+// =============================================================================
+bool ColorSelectDialog::staticDialog (short& val, short int defval, QWidget* parent) {
+ ColorSelectDialog dlg (defval, parent);
+
+ if (dlg.exec () && dlg.selColor != -1) {
+ val = dlg.selColor;
+ return true;
+ }
+
+ return false;
+}
\ No newline at end of file