📄 advprops.cpp
字号:
(int)m_value.m_colour.Red(),
(int)m_value.m_colour.Green(),
(int)m_value.m_colour.Blue());
}
return m_choices.GetLabel(m_index);
}
wxSize wxSystemColourPropertyClass::GetImageSize() const
{
return wxSize(-1,-1);
}
bool wxSystemColourPropertyClass::QueryColourFromUser( wxPropertyGrid* propgrid, wxWindow* primary )
{
bool res = false;
m_value.m_type = wxPG_COLOUR_CUSTOM;
wxColourData data;
data.SetChooseFull(true);
data.SetColour(m_value.m_colour);
int i;
for ( i = 0; i < 16; i++)
{
wxColour colour(i*16, i*16, i*16);
data.SetCustomColour(i, colour);
}
wxColourDialog dialog(propgrid, &data);
if ( dialog.ShowModal() == wxID_OK )
{
wxColourData retData = dialog.GetColourData();
m_value.m_colour = retData.GetColour();
wxSystemColourPropertyClass::DoSetValue(&m_value);
res = true;
}
// Update text in combo box (so it is "(R,G,B)" not "Custom").
if ( primary )
GetEditorClass()->SetControlStringValue(primary,GetValueAsString(0));
return res;
}
// Need to do some extra event handling.
bool wxSystemColourPropertyClass::OnEvent( wxPropertyGrid* propgrid, wxWindow* primary, wxEvent& event )
{
if ( event.GetEventType() == wxEVT_COMMAND_COMBOBOX_SELECTED )
{
int index = m_index; // m_index has already been updated.
int type = wxEnumPropertyClass::DoGetValue().GetLong();
const wxArrayInt& arrValues = m_choices.GetValues();
if ( ( arrValues.GetCount() && type == wxPG_COLOUR_CUSTOM ) ||
( !arrValues.GetCount() && (index == (int)(m_choices.GetCount()-1) &&
!(m_flags & wxPG_PROP_HIDE_CUSTOM_COLOUR))
)
)
{
QueryColourFromUser(propgrid,primary);
return true;
}
else
{
m_value.m_type = type;
m_value.m_colour = GetColour( type );
}
}
else if ( event.GetEventType() == wxEVT_COMMAND_BUTTON_CLICKED )
{
// We need to handle button click in case editor has been
// switched to one that has wxButton as well.
return QueryColourFromUser(propgrid,primary);
}
return false;
}
void wxSystemColourPropertyClass::OnCustomPaint( wxDC& dc, const wxRect& rect,
wxPGPaintData& paintdata )
{
if ( paintdata.m_choiceItem >= 0 &&
( paintdata.m_choiceItem < (int)(GetItemCount()-1) || (m_flags & wxPG_PROP_HIDE_CUSTOM_COLOUR))
)
{
int colInd;
const wxArrayInt& values = m_choices.GetValues();
if ( values.GetCount() )
colInd = values[paintdata.m_choiceItem];
else
colInd = paintdata.m_choiceItem;
dc.SetBrush ( wxColour ( GetColour ( colInd ) ) );
}
else if ( !(m_flags & wxPG_PROP_UNSPECIFIED) )
dc.SetBrush ( m_value.m_colour );
else
dc.SetBrush ( *wxWHITE );
dc.DrawRectangle ( rect );
}
bool wxSystemColourPropertyClass::SetValueFromString( const wxString& text, int flags )
{
wxColourPropertyValue val;
if ( text[0] == wxT('(') )
{
// Custom colour.
val.m_type = wxPG_COLOUR_CUSTOM;
int r, g, b;
wxSscanf(text.c_str(),wxT("(%i,%i,%i)"),&r,&g,&b);
val.m_colour.Set(r,g,b);
wxSystemColourPropertyClass::DoSetValue( &val );
return true;
}
else
{
// Predefined colour.
bool res = wxEnumPropertyClass::SetValueFromString(text,flags);
if ( res )
{
val.m_type = m_index;
const wxArrayInt& values = GetValues();
if ( values.GetCount() )
val.m_type = values[m_index];
// Get proper colour for type.
val.m_colour = wxColourFromPGLong(GetColour(val.m_type));
wxSystemColourPropertyClass::DoSetValue( &val );
return true;
}
}
return false;
}
void wxSystemColourPropertyClass::SetAttribute( int id, wxVariant& value )
{
if ( id == wxPG_COLOUR_ALLOW_CUSTOM )
{
int ival = value.GetLong();
SetChoicesExclusive(); // Make sure we don't corrupt colour lists of other properties
if ( ival && (m_flags & wxPG_PROP_HIDE_CUSTOM_COLOUR) )
{
// Show custom choice
m_choices.Add(wxT("Custom"),wxPG_COLOUR_CUSTOM);
m_flags &= ~(wxPG_PROP_HIDE_CUSTOM_COLOUR);
}
else if ( !ival && !(m_flags & wxPG_PROP_HIDE_CUSTOM_COLOUR) )
{
// Hide custom choice
m_choices.RemoveAt(m_choices.GetCount()-1);
m_flags |= wxPG_PROP_HIDE_CUSTOM_COLOUR;
}
}
}
// -----------------------------------------------------------------------
// wxColourProperty
// -----------------------------------------------------------------------
static const wxChar* gs_cp_es_normcolour_labels[] = {
wxT("Black"),
wxT("Maroon"),
wxT("Navy"),
wxT("Purple"),
wxT("Teal"),
wxT("Gray"),
wxT("Green"),
wxT("Olive"),
wxT("Brown"),
wxT("Blue"),
wxT("Fuchsia"),
wxT("Red"),
wxT("Orange"),
wxT("Silver"),
wxT("Lime"),
wxT("Aqua"),
wxT("Yellow"),
wxT("White"),
wxT("Custom"),
(const wxChar*) NULL
};
static unsigned long gs_cp_es_normcolour_colours[] = {
wxPG_COLOUR(0,0,0),
wxPG_COLOUR(128,0,0),
wxPG_COLOUR(0,0,128),
wxPG_COLOUR(128,0,128),
wxPG_COLOUR(0,128,128),
wxPG_COLOUR(128,128,128),
wxPG_COLOUR(0,128,0),
wxPG_COLOUR(128,128,0),
wxPG_COLOUR(166,124,81),
wxPG_COLOUR(0,0,255),
wxPG_COLOUR(255,0,255),
wxPG_COLOUR(255,0,0),
wxPG_COLOUR(247,148,28),
wxPG_COLOUR(192,192,192),
wxPG_COLOUR(0,255,0),
wxPG_COLOUR(0,255,255),
wxPG_COLOUR(255,255,0),
wxPG_COLOUR(255,255,255),
wxPG_COLOUR(0,0,0)
};
WX_PG_IMPLEMENT_CUSTOM_COLOUR_PROPERTY_USES_WXCOLOUR2(wxColourProperty,
wxColourPropertyClass,
gs_cp_es_normcolour_labels,
(const long*)NULL,
gs_cp_es_normcolour_colours,
TextCtrlAndButton)
// -----------------------------------------------------------------------
// wxCursorProperty
// -----------------------------------------------------------------------
#define wxPG_CURSOR_IMAGE_WIDTH 32
//#define wx_cp_es_syscursors_len 28
static const wxChar* gs_cp_es_syscursors_labels[] = {
wxT("Default"),
wxT("Arrow"),
wxT("Right Arrow"),
wxT("Blank"),
wxT("Bullseye"),
wxT("Character"),
wxT("Cross"),
wxT("Hand"),
wxT("I-Beam"),
wxT("Left Button"),
wxT("Magnifier"),
wxT("Middle Button"),
wxT("No Entry"),
wxT("Paint Brush"),
wxT("Pencil"),
wxT("Point Left"),
wxT("Point Right"),
wxT("Question Arrow"),
wxT("Right Button"),
wxT("Sizing NE-SW"),
wxT("Sizing N-S"),
wxT("Sizing NW-SE"),
wxT("Sizing W-E"),
wxT("Sizing"),
wxT("Spraycan"),
wxT("Wait"),
wxT("Watch"),
wxT("Wait Arrow"),
(const wxChar*) NULL
};
static long gs_cp_es_syscursors_values[] = {
wxCURSOR_NONE,
wxCURSOR_ARROW,
wxCURSOR_RIGHT_ARROW,
wxCURSOR_BLANK,
wxCURSOR_BULLSEYE,
wxCURSOR_CHAR,
wxCURSOR_CROSS,
wxCURSOR_HAND,
wxCURSOR_IBEAM,
wxCURSOR_LEFT_BUTTON,
wxCURSOR_MAGNIFIER,
wxCURSOR_MIDDLE_BUTTON,
wxCURSOR_NO_ENTRY,
wxCURSOR_PAINT_BRUSH,
wxCURSOR_PENCIL,
wxCURSOR_POINT_LEFT,
wxCURSOR_POINT_RIGHT,
wxCURSOR_QUESTION_ARROW,
wxCURSOR_RIGHT_BUTTON,
wxCURSOR_SIZENESW,
wxCURSOR_SIZENS,
wxCURSOR_SIZENWSE,
wxCURSOR_SIZEWE,
wxCURSOR_SIZING,
wxCURSOR_SPRAYCAN,
wxCURSOR_WAIT,
wxCURSOR_WATCH,
wxCURSOR_ARROWWAIT
};
WX_PG_IMPLEMENT_DERIVED_PROPERTY_CLASS(wxCursorProperty,wxEnumProperty,int)
wxCursorPropertyClass::wxCursorPropertyClass( const wxString& label, const wxString& name,
int value )
: wxEnumPropertyClass( label,
name,
gs_cp_es_syscursors_labels,
gs_cp_es_syscursors_values,
value )
{
m_flags |= wxPG_PROP_STATIC_CHOICES; // Cursor selection cannot be changed.
//wxEnumPropertyClass::DoSetValue ( (void*)&value, NULL );
}
wxCursorPropertyClass::~wxCursorPropertyClass()
{
}
wxSize wxCursorPropertyClass::GetImageSize() const
{
#if wxPG_CAN_DRAW_CURSOR
return wxSize(wxPG_CURSOR_IMAGE_WIDTH,wxPG_CURSOR_IMAGE_WIDTH);
#else
return wxSize(0,0);
#endif
}
#if wxPG_CAN_DRAW_CURSOR
void wxCursorPropertyClass::OnCustomPaint( wxDC& dc,
const wxRect& rect,
wxPGPaintData& paintdata )
{
// Background brush
dc.SetBrush( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
if ( paintdata.m_choiceItem >= 0 )
{
dc.DrawRectangle( rect );
int cursorindex = gs_cp_es_syscursors_values[paintdata.m_choiceItem];
/*
if ( cursorindex == wxPG_CURSOR_FROM_FILE )
{
wxFAIL_MSG(wxT("not implemented"));
}
else if ( cursorindex == wxPG_CURSOR_FROM_RESOURCE )
{
wxFAIL_MSG(wxT("not implemented"));
}
else
*/
{
if ( cursorindex == wxCURSOR_NONE )
cursorindex = wxCURSOR_ARROW;
wxCursor cursor( cursorindex );
#ifdef __WXMSW__
::DrawIconEx( (HDC)dc.GetHDC(),
rect.x,
rect.y,
(HICON)cursor.GetHandle(),
0,
0,
0,
NULL,
DI_COMPAT | DI_DEFAULTSIZE | DI_NORMAL
);
#endif
}
}
}
#else
void wxCursorPropertyClass::OnCustomPaint( wxDC&, const wxRect&, wxPGPaintData& ) { }
#endif
// -----------------------------------------------------------------------
// wxImageFileProperty
// -----------------------------------------------------------------------
#if wxUSE_IMAGE
const wxString& wxPGGetDefaultImageWildcard()
{
WX_PG_GLOBALS_LOCKER()
// Form the wildcard, if not done yet
if ( !wxPGGlobalVars->m_pDefaultImageWildcard.length() )
{
wxString str;
// TODO: This section may require locking (using global).
wxList& handlers = wxImage::GetHandlers();
wxList::iterator node;
// Let's iterate over the image handler list.
//for ( wxList::Node *node = handlers.GetFirst(); node; node = node->GetNext() )
for ( node = handlers.begin(); node != handlers.end(); node++ )
{
wxImageHandler *handler = (wxImageHandler*)*node;
wxString ext_lo = handler->GetExtension();
wxString ext_up = ext_lo.Upper();
str.append( ext_up );
str.append( wxT(" files (*.") );
str.append( ext_up );
str.append( wxT(")|*.") );
str.append( ext_lo );
str.append( wxT("|") );
}
str.append ( wxT("All files (*.*)|*.*") );
wxPGGlobalVars->m_pDefaultImageWildcard = str;
}
return wxPGGlobalVars->m_pDefaultImageWildcard;
}
WX_PG_IMPLEMENT_DERIVED_PROPERTY_CLASS(wxImageFileProperty,
wxFileProperty,
const wxString&)
wxImageFilePropertyClass::wxImageFilePropertyClass( const wxString& label, const wxString& name,
const wxString& value )
: wxFilePropertyClass(label,name,value)
{
m_wildcard = wxPGGetDefaultImageWildcard();
m_pImage = (wxImage*) NULL;
m_pBitmap = (wxBitmap*) NULL;
}
wxImageFilePropertyClass::~wxImageFilePropertyClass()
{
if ( m_pBitmap )
delete m_pBitmap;
if ( m_pImage )
delete m_pImage;
}
void wxImageFilePropertyClass::DoSetValue( wxPGVariant value )
{
wxFilePropertyClass::DoSetValue(value);
// Delete old image
if ( m_pImage )
{
delete m_pImage;
m_pImage = NULL;
}
if ( m_pBitmap )
{
delete m_pBitmap;
m_pBitmap = NULL;
}
// Create the image thumbnail
if ( m_filename.FileExists() )
{
m_pImage = new wxImage ( m_filename.GetFullPath() );
}
}
wxSize wxImageFilePropertyClass::GetImageSize() const
{
return wxSize(-1,-1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -