From: Jeffrey D. <ha...@us...> - 2003-09-23 05:18:46
|
Log Message: ----------- Sliders need love too.. try properties mincolor and maxcolor in XML for fun. Modified Files: -------------- /cvsroot/decaldev/source/DecalControls: Slider.cpp Slider.h StdAfx.h Revision Data ------------- Index: Slider.cpp =================================================================== RCS file: /cvsroot/decaldev/source/DecalControls/Slider.cpp,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- Slider.cpp 24 Aug 2002 02:29:43 -0000 1.5 +++ Slider.cpp 23 Sep 2003 05:18:30 -0000 1.6 @@ -11,6 +11,8 @@ m_bGrappled(VARIANT_FALSE), m_nMinimum(0), m_nMaximum(100), + m_nMinSliderColor( RGB(200,0,0) ), + m_nMaxSliderColor( RGB(0,200,0) ), m_nSliderPos(0), m_strTextLeft(NULL), m_strTextRight(NULL), @@ -130,7 +132,8 @@ return S_OK; } -STDMETHODIMP cSlider::SchemaLoad(IView *pView, IUnknown *pSchema) { +STDMETHODIMP cSlider::SchemaLoad(IView *pView, IUnknown *pSchema) +{ // First attempt to load the font CComPtr< IPluginSite > pPlugin; m_pSite->get_PluginSite( &pPlugin ); @@ -140,9 +143,12 @@ MSXML::IXMLDOMElementPtr pElement = pSchema; _variant_t vTextColor = pElement->getAttribute(_T("textcolor")), + vMinSliderColor = pElement->getAttribute(_T("mincolor")), + vMaxSliderColor = pElement->getAttribute(_T("maxcolor")), vVertical = pElement->getAttribute(_T("vertical")), vMaximum = pElement->getAttribute(_T("maximum")), - vMinimum = pElement->getAttribute(_T("minimum")); + vMinimum = pElement->getAttribute(_T("minimum")), + vName = pElement->getAttribute(_T("name")); // Maximum must exist _ASSERTE(vMaximum.vt == VT_INT); @@ -156,6 +162,26 @@ } } + if (vMinSliderColor.vt != VT_NULL) { + try { + _bstr_t szWhat = vMinSliderColor.bstrVal; + m_nMinSliderColor = wcstoul( szWhat, 0, 16 ); + } catch( ... ) { + // Type conversion error + _ASSERTE(FALSE); + } + } + + if (vMaxSliderColor.vt != VT_NULL) { + try { + _bstr_t szWhat = vMaxSliderColor.bstrVal; + m_nMaxSliderColor = wcstoul( szWhat, 0, 16 ); + } catch( ... ) { + // Type conversion error + _ASSERTE(FALSE); + } + } + if (vVertical.vt != VT_NULL) { try { m_bVertical = (static_cast<bool>(vVertical)) ? VARIANT_TRUE : VARIANT_FALSE; @@ -167,7 +193,7 @@ if (vMaximum.vt != VT_NULL) { try { - m_nMaximum = vMaximum.lVal; + m_nMaximum = static_cast<long>(vMaximum); } catch( ... ) { // Type conversion error _ASSERTE(FALSE); @@ -176,13 +202,66 @@ if (vMinimum.vt != VT_NULL) { try { - m_nMinimum = vMinimum.lVal; + m_nMinimum = static_cast<long>(vMinimum); } catch( ... ) { // Type conversion error _ASSERTE(FALSE); } } +/* fprintf( f, "name - %s\n", OLE2A(vName.bstrVal) ); + fprintf( f, "textcolor - %08X\n", m_nTextColor ); + fprintf( f, "mincolor - %08X\n", m_nMinSliderColor ); + fprintf( f, "maxcolor - %08X\n", m_nMaxSliderColor ); + fprintf( f, "vertical - %X\n", m_bVertical ); + fprintf( f, "maximum - %08X\n", m_nMaximum ); + fprintf( f, "minimum - %08X\n\n", m_nMinimum ); */ + +/* // it's a pain in the ass that we need set the min and max for them to work, aye? let's fix it + RECT rc; + m_pSite->get_Position(&rc); + + long siteHHalf = (rc.bottom - rc.top) / 2; + + // The background bar + m_rcBackground.left = 0; + m_rcBackground.top = siteHHalf - 4; + m_rcBackground.bottom = siteHHalf + 6; + m_rcBackground.right = rc.right - rc.left; + + // The middle bar + m_rcBar.top = siteHHalf; + m_rcBar.left = 0; + m_rcBar.bottom = siteHHalf + 3; + m_rcBar.right = rc.right - rc.left; + + // Ensure sane slider position + if (m_nSliderPos < m_nMinimum) + m_nSliderPos = m_nMinimum; + + if (m_nSliderPos > m_nMaximum) + m_nSliderPos = m_nMaximum; + + long siteDiff = abs(m_rcBar.right - m_rcBar.left); + long extentDiff = abs(m_nMaximum - m_nMinimum); + long valDiff = m_nSliderPos - m_nMinimum; + + if (valDiff == 0) { + m_ptSlider.x = m_rcBar.left; + + } else { + long diff = (long)(((float)valDiff / (float)extentDiff) * (float)siteDiff); + + m_ptSlider.x = m_rcBar.left + diff; + + if (m_ptSlider.x >= m_rcBar.right - 6) + m_ptSlider.x = m_rcBar.right - 6; + } + + m_ptSlider.y = siteHHalf - 5; +*/ + +// fclose( f ); return S_OK; } @@ -267,7 +346,12 @@ return S_OK; } -STDMETHODIMP cSlider::Render(ICanvas *pCanvas) { +STDMETHODIMP cSlider::Render(ICanvas *pCanvas) +{ + // intensity to lose or gain for 3d effect + #define COLOR_BAND 20 + + USES_CONVERSION; CComPtr<IPluginSite> pPlugin; m_pSite->get_PluginSite(&pPlugin); @@ -276,19 +360,74 @@ SIZE szIcon = {7, 12}; pPlugin->GetIconCache(&szIcon, &pIcon); -// pCanvas->Fill(&m_rcBackground, RGB(3, 3, 3)); - + // we're averaging color differences w/bias... float fractional = m_nSliderPos / m_nMaximum; - long greenFraction = 80 + (120 * (1 - fractional)); - long redFration = 80 + (120 * fractional); + float lFraction = (1 - fractional) * 2; + float rFraction = fractional * 2; - pCanvas->Fill(&m_rcBar, RGB(redFration, greenFraction, 0)); + long lMinSliderRed = lFraction * (BYTE) m_nMinSliderColor; + long lMinSliderGreen = lFraction * (BYTE) (m_nMinSliderColor >> 8); + long lMinSliderBlue = lFraction * (BYTE) (m_nMinSliderColor >> 16); + + long lMaxSliderRed = rFraction * (BYTE) m_nMaxSliderColor; + long lMaxSliderGreen = rFraction * (BYTE) (m_nMaxSliderColor >> 8); + long lMaxSliderBlue = rFraction * (BYTE) (m_nMaxSliderColor >> 16); + + long lFillColorTop, lFillColorMiddle, lFillColorBottom; + + long lFillColorRed = (lMinSliderRed + lMaxSliderRed) / 2, + lFillColorGreen = (lMinSliderGreen + lMaxSliderGreen) / 2, + lFillColorBlue = (lMinSliderBlue + lMaxSliderBlue) / 2; + + if( m_nMinSliderColor && m_nMaxSliderColor ) // not black .. who would choose all black for both bars anyway? grr. + { + // find the most intense color channel to maul for our evil purposes (we're using std::max here) + long lMax = max( max( lFillColorRed, lFillColorGreen ), lFillColorBlue ); + + // if we're dark, don't overflow + long lOffset = lMax > (COLOR_BAND - 1) ? COLOR_BAND : 0; + long lOffset2 = lMax > (COLOR_BAND - 1) ? 0 : COLOR_BAND; + + // red + if( lMax == lFillColorRed ) + { + lFillColorTop = RGB( lFillColorRed - lOffset, lFillColorGreen, lFillColorBlue ); + lFillColorMiddle = RGB( lFillColorRed + lOffset2, lFillColorGreen, lFillColorBlue ); + lFillColorBottom = RGB( lFillColorRed - lOffset, lFillColorGreen, lFillColorBlue ); + } + + // green + else if( lMax == lFillColorGreen ) + { + lFillColorTop = RGB( lFillColorRed, lFillColorGreen - lOffset, lFillColorBlue ); + lFillColorMiddle = RGB( lFillColorRed, lFillColorGreen + lOffset2, lFillColorBlue ); + lFillColorBottom = RGB( lFillColorRed, lFillColorGreen - lOffset, lFillColorBlue ); + } + + // has to be blue + else + { + lFillColorTop = RGB( lFillColorRed, lFillColorGreen, lFillColorBlue - lOffset ); + lFillColorMiddle = RGB( lFillColorRed, lFillColorGreen, lFillColorBlue + lOffset2 ); + lFillColorBottom = RGB( lFillColorRed, lFillColorGreen, lFillColorBlue - lOffset ); + } + } + + // someone's a GOTH + else + { + lFillColorTop = 0; + lFillColorMiddle = 0x00161616; + lFillColorBottom = 0; + } + + pCanvas->Fill( &m_rcBar, lFillColorMiddle ); RECT topBar = {m_rcBar.left, m_rcBar.top, m_rcBar.right, m_rcBar.top + 1}; - pCanvas->Fill(&topBar, RGB(redFration + 30, greenFraction + 30, 0)); + pCanvas->Fill( &topBar, lFillColorTop ); RECT bottomBar = {m_rcBar.left, m_rcBar.bottom - 1, m_rcBar.right, m_rcBar.bottom}; - pCanvas->Fill(&bottomBar, RGB(redFration - 30, greenFraction - 30, 0)); + pCanvas->Fill( &bottomBar, lFillColorBottom ); pIcon->DrawIcon(&m_ptSlider, 0x06001286, 0, pCanvas); @@ -348,6 +487,11 @@ float pixelValue = (float)((float)(m_nMaximum - m_nMinimum) / (float)(m_rcBar.right - m_rcBar.left)); m_nSliderPos -= ((float)dx * pixelValue); + + // I personally like being able to drag the slider + // PAST THE EDGE OF THE SLIDE BAR without needing pixel accuracy... + if( pt.x > m_rcBar.right ) + m_nSliderPos = m_nMaximum; Reformat(); m_pSite->Invalidate(); Index: Slider.h =================================================================== RCS file: /cvsroot/decaldev/source/DecalControls/Slider.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- Slider.h 17 Jan 2002 00:09:50 -0000 1.1 +++ Slider.h 23 Sep 2003 05:18:30 -0000 1.2 @@ -35,6 +35,7 @@ long m_nTextColor; float m_nSliderPos; long m_nMinimum, m_nMaximum; + long m_nMinSliderColor, m_nMaxSliderColor; char *m_strTextLeft, *m_strTextRight; Index: StdAfx.h =================================================================== RCS file: /cvsroot/decaldev/source/DecalControls/StdAfx.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- StdAfx.h 23 May 2003 02:20:46 -0000 1.5 +++ StdAfx.h 23 Sep 2003 05:18:30 -0000 1.6 @@ -21,11 +21,13 @@ #include <list> #include <vector> +#include <algorithm> #include <deque> #include <map> #include <string> #include "..\Inject\Inject.h" #import <msxml.dll> +using std::max; #ifdef _CHECKMEM #define _ASSERTMEM(a) _ASSERTE(a) |