X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_ColorDialog.cpp;h=8c6948b9f6d00bf260e56e23de28497e18ddb5bb;hb=116001f1015b8567ac4426e3a13c8cb8a0b32052;hp=9170958f29b3589b392edbf0ab1b13054a0218b3;hpb=c3ae28ba30027cc4a6a757ef623f40adaae96ead;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_ColorDialog.cpp b/src/XGUI/XGUI_ColorDialog.cpp index 9170958f2..8c6948b9f 100644 --- a/src/XGUI/XGUI_ColorDialog.cpp +++ b/src/XGUI/XGUI_ColorDialog.cpp @@ -19,7 +19,7 @@ XGUI_ColorDialog::XGUI_ColorDialog(QWidget* theParent) : QDialog(theParent) { - setWindowTitle("Color"); + setWindowTitle(tr("Color")); QGridLayout* aLay = new QGridLayout(this); QRadioButton* aRandomChoiceBtn = new QRadioButton(this); @@ -37,7 +37,7 @@ XGUI_ColorDialog::XGUI_ColorDialog(QWidget* theParent) myColorButton->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); aLay->addWidget(myColorButton, 0, 1); - QLabel* aRandomLabel = new QLabel("Random", this); + QLabel* aRandomLabel = new QLabel(tr("Random"), this); aLay->addWidget(aRandomLabel, 1, 1); QDialogButtonBox* aButtons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, @@ -73,12 +73,108 @@ std::vector XGUI_ColorDialog::getColor() const return aValues; } +// contains global cash for integer index of the color -> RGB of this color +static std::map > myColorMap; + +void appendValues(std::vector& theRGB, const int theRed, const int theGreen, const int theBlue) +{ + theRGB.push_back(theRed); + theRGB.push_back(theGreen); + theRGB.push_back(theBlue); +} + +bool containsValues(std::map >& theColorMap, std::vector& theValues) +{ + std::map >::const_iterator anIt = theColorMap.begin(), + aLast = theColorMap.end(); + bool isFound = false; + for (; anIt != aLast && !isFound; anIt++) { + std::vector aValues = anIt->second; + isFound = aValues[0] == theValues[0] && + aValues[1] == theValues[1] && + aValues[2] == theValues[2]; + } + return isFound; +} + +std::vector HSVtoRGB(int theH, int theS, int theV) +{ + std::vector aRGB; + if (theH < 0 || theH > 360 || + theS < 0 || theS > 100 || + theV < 0 || theV > 100) + return aRGB; + + int aHi = (int)theH/60; + + double aV = theV; + double aVmin = (100 - theS)*theV/100; + + double anA = (theV - aVmin)* (theH % 60) / 60; + + double aVinc = aVmin + anA; + double aVdec = theV - anA; + + double aPercentToValue = 255./100; + int aV_int = (int)(aV*aPercentToValue); + int aVinc_int = (int)(aVinc*aPercentToValue); + int aVmin_int = (int)(aVmin*aPercentToValue); + int aVdec_int = (int)(aVdec*aPercentToValue); + + switch(aHi) { + case 0: appendValues(aRGB, aV_int, aVinc_int, aVmin_int); break; + case 1: appendValues(aRGB, aVdec_int, aV_int, aVmin_int); break; + case 2: appendValues(aRGB, aVmin_int, aV_int, aVinc_int); break; + case 3: appendValues(aRGB, aVmin_int, aVdec_int, aV_int); break; + case 4: appendValues(aRGB, aVinc_int, aVmin_int, aV_int); break; + case 5: appendValues(aRGB, aV_int, aVmin_int, aVdec_int); break; + default: break; + } + return aRGB; +} + + +void fillColorMap() +{ + if (!myColorMap.empty()) + return; + + int i = 0; + for (int s = 100; s > 0; s = s - 50) + { + for (int v = 100; v >= 40; v = v - 20) + { + for (int h = 0; h < 359 ; h = h + 60) + { + std::vector aColor = HSVtoRGB(h, s, v); + if (containsValues(myColorMap, aColor)) + continue; + myColorMap[i] = aColor; + i++; + } + } + } +} + +void findRandomColor(std::vector& theValues) +{ + theValues.clear(); + if (myColorMap.empty()) { + fillColorMap(); + } + + size_t aSize = myColorMap.size(); + int anIndex = rand() % aSize; + if (myColorMap.find(anIndex) != myColorMap.end()) { + theValues = myColorMap.at(anIndex); + } +} std::vector XGUI_ColorDialog::getRandomColor() const { std::vector aValues; if (isRandomColor()) { - ModelAPI_Tools::findRandomColor(aValues); + findRandomColor(aValues); } return aValues; }