This feature to show/hide alpha values and opacity selector (slider) is already implemented under wxGTK and for generic wxColourDialog. For the sake of backward compatibility, this feature is enabled here by default (through the corresponding property of wxColourData).
188 lines
5.1 KiB
C++
188 lines
5.1 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
// Name: src/common/colourdata.cpp
|
|
// Author: Julian Smart
|
|
// Copyright: (c) Julian Smart
|
|
// Licence: wxWindows licence
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "wx/wxprec.h"
|
|
|
|
#ifdef __BORLANDC__
|
|
#pragma hdrstop
|
|
#endif
|
|
|
|
#if wxUSE_COLOURDLG || wxUSE_COLOURPICKERCTRL
|
|
|
|
#include "wx/colourdata.h"
|
|
#include "wx/tokenzr.h"
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// wxColourData
|
|
// ----------------------------------------------------------------------------
|
|
|
|
wxIMPLEMENT_DYNAMIC_CLASS(wxColourData, wxObject);
|
|
|
|
wxColourData::wxColourData()
|
|
{
|
|
m_chooseFull = false;
|
|
#ifdef __WXOSX__
|
|
// Under OSX, legacy wxColourDialog had opacity selector
|
|
// (slider) always enabled, so for backward compatibilty
|
|
// we should tell the dialog to enable it by default.
|
|
m_chooseAlpha = true;
|
|
#else
|
|
m_chooseAlpha = false;
|
|
#endif // __WXOSX__ / !__WXOSX__
|
|
m_dataColour.Set(0,0,0);
|
|
// m_custColours are wxNullColours initially
|
|
}
|
|
|
|
wxColourData::wxColourData(const wxColourData& data)
|
|
: wxObject()
|
|
{
|
|
(*this) = data;
|
|
}
|
|
|
|
wxColourData::~wxColourData()
|
|
{
|
|
}
|
|
|
|
void wxColourData::SetCustomColour(int i, const wxColour& colour)
|
|
{
|
|
wxCHECK_RET( i >= 0 && i < NUM_CUSTOM, wxT("custom colour index out of range") );
|
|
|
|
m_custColours[i] = colour;
|
|
}
|
|
|
|
wxColour wxColourData::GetCustomColour(int i) const
|
|
{
|
|
wxCHECK_MSG( i >= 0 && i < NUM_CUSTOM, wxColour(0,0,0),
|
|
wxT("custom colour index out of range") );
|
|
|
|
return m_custColours[i];
|
|
}
|
|
|
|
wxColourData& wxColourData::operator=(const wxColourData& data)
|
|
{
|
|
for ( int i = 0; i < NUM_CUSTOM; i++)
|
|
m_custColours[i] = data.m_custColours[i];
|
|
|
|
m_dataColour = data.m_dataColour;
|
|
m_chooseFull = data.m_chooseFull;
|
|
m_chooseAlpha = data.m_chooseAlpha;
|
|
|
|
return *this;
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// [de]serialization
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// separator used between different fields
|
|
static const char wxCOL_DATA_SEP = ',';
|
|
|
|
wxString wxColourData::ToString() const
|
|
{
|
|
wxString str(m_chooseFull ? '1' : '0');
|
|
|
|
for ( int i = 0; i < NUM_CUSTOM; i++ )
|
|
{
|
|
str += wxCOL_DATA_SEP;
|
|
|
|
const wxColour& clr = m_custColours[i];
|
|
if ( clr.IsOk() )
|
|
str += clr.GetAsString(wxC2S_HTML_SYNTAX);
|
|
}
|
|
|
|
str.Append(wxCOL_DATA_SEP);
|
|
str.Append(m_chooseAlpha ? '1' : '0');
|
|
|
|
return str;
|
|
}
|
|
|
|
bool wxColourData::FromString(const wxString& str)
|
|
{
|
|
wxStringTokenizer tokenizer(str, wxCOL_DATA_SEP);
|
|
wxString token = tokenizer.GetNextToken();
|
|
m_chooseFull = token == '1';
|
|
bool success = m_chooseFull || token == '0';
|
|
for (int i = 0; success && i < NUM_CUSTOM; i++)
|
|
{
|
|
token = tokenizer.GetNextToken();
|
|
if (token.empty())
|
|
m_custColours[i] = wxColour();
|
|
else
|
|
success = m_custColours[i].Set(token);
|
|
}
|
|
|
|
if ( success )
|
|
{
|
|
token = tokenizer.GetNextToken();
|
|
m_chooseAlpha = token == wxS("1");
|
|
success = m_chooseAlpha || token == wxS("0");
|
|
}
|
|
|
|
return success;
|
|
}
|
|
|
|
#if wxUSE_COLOURDLG
|
|
|
|
#include "wx/colordlg.h"
|
|
|
|
wxColour wxGetColourFromUser(wxWindow *parent,
|
|
const wxColour& colInit,
|
|
const wxString& caption,
|
|
wxColourData *ptrData)
|
|
{
|
|
// contains serialized representation of wxColourData used the last time
|
|
// the dialog was shown: we want to reuse it the next time in order to show
|
|
// the same custom colours to the user (and we can't just have static
|
|
// wxColourData itself because it's a GUI object and so should be destroyed
|
|
// before GUI shutdown and doing it during static cleanup is too late)
|
|
static wxString s_strColourData;
|
|
|
|
wxColourData data;
|
|
if ( !ptrData )
|
|
{
|
|
ptrData = &data;
|
|
if ( !s_strColourData.empty() )
|
|
{
|
|
if ( !data.FromString(s_strColourData) )
|
|
{
|
|
wxFAIL_MSG( "bug in wxColourData::FromString()?" );
|
|
}
|
|
|
|
#ifdef __WXMSW__
|
|
// we don't get back the "choose full" flag value from the native
|
|
// dialog and so we can't preserve it between runs, so we decide to
|
|
// always use it as it seems better than not using it (user can
|
|
// just ignore the extra controls in the dialog but having to click
|
|
// a button each time to show them would be very annoying
|
|
data.SetChooseFull(true);
|
|
#endif // __WXMSW__
|
|
}
|
|
}
|
|
|
|
if ( colInit.IsOk() )
|
|
{
|
|
ptrData->SetColour(colInit);
|
|
}
|
|
|
|
wxColour colRet;
|
|
wxColourDialog dialog(parent, ptrData);
|
|
if (!caption.empty())
|
|
dialog.SetTitle(caption);
|
|
if ( dialog.ShowModal() == wxID_OK )
|
|
{
|
|
*ptrData = dialog.GetColourData();
|
|
colRet = ptrData->GetColour();
|
|
s_strColourData = ptrData->ToString();
|
|
}
|
|
//else: leave colRet invalid
|
|
|
|
return colRet;
|
|
}
|
|
|
|
#endif // wxUSE_COLOURDLG
|
|
#endif // wxUSE_COLOURDLG || wxUSE_COLOURPICKERCTRL
|