--- a/src/colorSelectDialog.cpp Thu Jul 04 03:42:55 2013 +0300 +++ b/src/colorSelectDialog.cpp Thu Jul 04 16:19:50 2013 +0300 @@ -1,29 +1,25 @@ /* * 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 <http://www.gnu.org/licenses/>. */ #include <QGraphicsScene> -#include <QGraphicsView> -#include <QBoxLayout> #include <QGraphicsItem> #include <QMouseEvent> #include <QScrollBar> -#include <QLabel> -#include <QDialogButtonBox> #include "common.h" #include "gui.h" @@ -31,99 +27,99 @@ #include "colors.h" #include "config.h" #include "misc.h" +#include "ui_colorsel.h" -static const short g_numCols = 8; -static const short g_numRows = 10; +static const int g_numColumns = 16; static const short g_squareSize = 32; -static const long g_width = (g_numCols * g_squareSize); -static const long g_height = (g_numRows * g_squareSize); -static const long g_maxHeight = ((MAX_COLORS / g_numCols) * g_squareSize); -extern_cfg (str, gl_maincolor); -extern_cfg (float, gl_maincolor_alpha); +extern_cfg( str, gl_maincolor ); +extern_cfg( float, gl_maincolor_alpha ); // ============================================================================= // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // ============================================================================= -ColorSelectDialog::ColorSelectDialog (short int defval, QWidget* parent) : QDialog (parent) { +ColorSelector::ColorSelector( short defval, QWidget* parent ) : QDialog( parent ) +{ // Remove the default color if it's invalid - if (!getColor (defval)) + if( !::getColor( defval )) defval = -1; - gs_scene = new QGraphicsScene; - gv_view = new QGraphicsView (gs_scene); - selColor = defval; + 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 - gs_scene->setBackgroundBrush (getIcon ("checkerboard")); - - gs_scene->setSceneRect (0, 0, g_width, g_maxHeight); - gv_view->setSceneRect (0, 0, g_width, g_maxHeight); - - drawScene (); + m_scene->setBackgroundBrush( getIcon( "checkerboard" )); - // Set the size of the view - const long viewWidth = g_width + 21; // HACK: 21 for scrollbar - gv_view->setMaximumWidth (viewWidth); - gv_view->setMinimumWidth (viewWidth); - gv_view->setMaximumHeight (g_height); - gv_view->setMinimumHeight (g_height); - gv_view->setHorizontalScrollBarPolicy (Qt::ScrollBarAlwaysOff); + drawScene(); - // If we have a default color selected, scroll down so that it is visible. - // HACK: find a better way to do this - if (defval >= ((g_numCols * g_numRows) - 2)) { - ulong ulNewY = ((defval / g_numCols) - 3) * g_squareSize; - gv_view->verticalScrollBar ()->setSliderPosition (ulNewY); - } + int width = viewportWidth(); + ui->viewport->setMinimumWidth( width ); + ui->viewport->setMaximumWidth( width ); - lb_colorInfo = new QLabel; - drawColorInfo (); - - QVBoxLayout* layout = new QVBoxLayout; - layout->addWidget (gv_view); - layout->addWidget (lb_colorInfo); - layout->addWidget (makeButtonBox (*this)); - setLayout (layout); - - setWindowIcon (getIcon ("palette")); - setWindowTitle (APPNAME); + drawColorInfo(); } // ============================================================================= // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // ============================================================================= -void ColorSelectDialog::drawScene () { +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; - QPen pen (Qt::black, penWidth, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin); + QPen pen( Qt::black, penWidth, 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) + m_scene->clear(); + + for( short i = 0; i < MAX_COLORS; ++i ) + { + color* info = ::getColor( i ); + + if( !info ) continue; - const double x = (i % g_numCols) * g_squareSize; - const double y = (i / g_numCols) * g_squareSize; - const double w = (g_squareSize) - (penWidth / 2); + const double x = ( i % numCols ) * square; + const double y = ( i / numCols ) * square; + const double w = square - ( penWidth / 2 ); + + QColor col = info->faceColor; - QColor col = meta->faceColor; - - if (i == maincolor) { + if( i == maincolor ) + { // Use the user preferences for main color here - col = gl_maincolor.value; - col.setAlpha (gl_maincolor_alpha * 255.0f); + col = QColor( gl_maincolor ); + col.setAlpha( gl_maincolor_alpha * 255.0f ); } - gs_scene->addRect (x, y, w, w, pen, col); - QGraphicsTextItem* numtext = gs_scene->addText (fmt ("%1", i)); - numtext->setDefaultTextColor ((luma (col) < 80) ? Qt::white : Qt::black); - numtext->setPos (x, y); + m_scene->addRect( x, y, w, w, pen, col ); + QGraphicsTextItem* numtext = m_scene->addText( fmt( "%1", i )); + numtext->setDefaultTextColor(( luma( col ) < 80 ) ? Qt::white : Qt::black ); + numtext->setPos( x, y ); - if (i == selColor) { - auto curspic = gs_scene->addPixmap (getIcon ("colorcursor")); - curspic->setPos (x, y); + if( i == sel()->index ) + { + auto curspic = m_scene->addPixmap( getIcon( "colorcursor" )); + curspic->setPos( x, y ); } } } @@ -131,47 +127,90 @@ // ============================================================================= // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // ============================================================================= -void ColorSelectDialog::drawColorInfo () { - color* col = getColor (selColor); - - if (selColor == -1 || !col) { - lb_colorInfo->setText ("---"); +int ColorSelector::numRows() const +{ + return ( MAX_COLORS / g_numColumns ); +} + +// ============================================================================= +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +// ============================================================================= +int ColorSelector::viewportWidth() const +{ + return g_numColumns * g_squareSize + 21; +} + +// ============================================================================= +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +// ============================================================================= +void ColorSelector::drawColorInfo() +{ + if( !sel() ) + { + ui->colorLabel->setText( "---" ); return; } - lb_colorInfo->setText (fmt ("%1 - %2", - selColor, col->name)); + ui->colorLabel->setText( fmt( "%1 - %2", sel()->index, sel()->name )); } // ============================================================================= // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // ============================================================================= -void ColorSelectDialog::mousePressEvent (QMouseEvent* event) { - QPointF scenepos = gv_view->mapToScene (event->pos ()); - - ulong x = ((ulong) scenepos.x () - (g_squareSize / 2)) / g_squareSize; - ulong y = ((ulong) scenepos.y () - (g_squareSize / 2)) / g_squareSize; - ulong idx = (y * g_numCols) + x; +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( sel() && sel()->index >= visibleColors ) + { + int y = ( sel()->index / g_numColumns ) * g_squareSize; + ui->viewport->verticalScrollBar()->setValue( y ); + } + + m_firstResize = false; + } - color* col = getColor (idx); - if (!col) - return; - - selColor = idx; - drawScene (); - drawColorInfo (); + drawScene(); } // ============================================================================= // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // ============================================================================= -bool ColorSelectDialog::staticDialog (short& val, short int defval, QWidget* parent) { - ColorSelectDialog dlg (defval, parent); +void ColorSelector::mousePressEvent( QMouseEvent* event ) +{ + QPointF scenepos = ui->viewport->mapToScene( event->pos() ); + + ulong x = (( ulong ) scenepos.x() - ( g_squareSize / 2 )) / g_squareSize; + ulong y = (( ulong ) scenepos.y() - ( g_squareSize / 2 )) / g_squareSize; + ulong idx = ( y * g_numColumns ) + x; + + color* col = ::getColor( idx ); + + if( !col ) + return; - if (dlg.exec () && dlg.selColor != -1) { - val = dlg.selColor; + setSelection( col ); + drawScene(); + drawColorInfo(); +} + +// ============================================================================= +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +// ============================================================================= +bool ColorSelector::getColor( short& val, short int defval, QWidget* parent ) +{ + ColorSelector dlg( defval, parent ); + + if( dlg.exec() && dlg.sel() != null ) + { + val = dlg.sel()->index; return true; } return false; -} \ No newline at end of file +}