📄 props.cpp
字号:
const wxArrayInt& values = GetValues();
long val = p->DoGetValue().GetLong(); // bypass type checking
unsigned int iip = p->GetIndexInParent();
unsigned long vi = (1<<iip);
if ( values.GetCount() ) vi = values[iip];
if ( val )
m_value |= vi;
else
m_value &= ~(vi);
}
int wxFlagsPropertyClass::GetChoiceInfo( wxPGChoiceInfo* choiceinfo )
{
if ( choiceinfo )
choiceinfo->m_choices = &m_choices;
return -1;
}
// -----------------------------------------------------------------------
// wxDirProperty
// -----------------------------------------------------------------------
class wxDirPropertyClass : public wxLongStringPropertyClass
{
WX_PG_DECLARE_DERIVED_PROPERTY_CLASS()
public:
wxDirPropertyClass( const wxString& name, const wxString& label, const wxString& value );
virtual ~wxDirPropertyClass();
WX_PG_DECLARE_ATTRIBUTE_METHODS()
WX_PG_DECLARE_VALIDATOR_METHODS()
virtual bool OnButtonClick ( wxPropertyGrid* propGrid, wxString& value );
protected:
wxString m_dlgMessage;
};
WX_PG_IMPLEMENT_DERIVED_PROPERTY_CLASS(wxDirProperty,wxLongStringProperty,const wxString&)
wxDirPropertyClass::wxDirPropertyClass( const wxString& name, const wxString& label, const wxString& value )
: wxLongStringPropertyClass(name,label,value)
{
m_flags |= wxPG_NO_ESCAPE;
}
wxDirPropertyClass::~wxDirPropertyClass() { }
#if wxUSE_VALIDATORS
wxValidator* wxDirPropertyClass::DoGetValidator() const
{
return wxFilePropertyClass::GetClassValidator();
}
#endif
bool wxDirPropertyClass::OnButtonClick( wxPropertyGrid* propGrid, wxString& value )
{
wxSize dlg_sz(300,400);
wxDirDialog dlg( propGrid,
m_dlgMessage.length() ? m_dlgMessage : wxString(_("Choose a directory:")),
value,
0,
#if !wxPG_SMALL_SCREEN
propGrid->GetGoodEditorDialogPosition(this,dlg_sz),
dlg_sz );
#else
wxDefaultPosition,
wxDefaultSize );
#endif
if ( dlg.ShowModal() == wxID_OK )
{
value = dlg.GetPath();
return true;
}
return false;
}
void wxDirPropertyClass::SetAttribute( int id, wxVariant& value )
{
if ( id == wxPG_DIR_DIALOG_MESSAGE )
{
m_dlgMessage = value.GetString();
}
}
// -----------------------------------------------------------------------
// wxFileProperty
// -----------------------------------------------------------------------
// Class body is in propdev.h.
WX_PG_IMPLEMENT_PROPERTY_CLASS(wxFileProperty,wxBaseProperty,
wxString,const wxString&,TextCtrlAndButton)
wxFilePropertyClass::wxFilePropertyClass( const wxString& label, const wxString& name,
const wxString& value ) : wxPGProperty(label,name)
{
m_wildcard = _("All files (*.*)|*.*");
m_flags |= wxPG_PROP_SHOW_FULL_FILENAME;
m_indFilter = -1;
DoSetValue(value);
}
wxFilePropertyClass::~wxFilePropertyClass() {}
#if wxUSE_VALIDATORS
wxValidator* wxFilePropertyClass::GetClassValidator()
{
WX_PG_DOGETVALIDATOR_ENTRY()
// Atleast wxPython 2.6.2.1 required that the string argument is given
static wxString v;
wxTextValidator* validator = new wxTextValidator(wxFILTER_EXCLUDE_CHAR_LIST,&v);
wxArrayString exChars;
exChars.Add(wxT("?"));
exChars.Add(wxT("*"));
exChars.Add(wxT("|"));
exChars.Add(wxT("<"));
exChars.Add(wxT(">"));
exChars.Add(wxT("\""));
validator->SetExcludes(exChars);
WX_PG_DOGETVALIDATOR_EXIT(validator)
}
wxValidator* wxFilePropertyClass::DoGetValidator() const
{
return GetClassValidator();
}
#endif
void wxFilePropertyClass::DoSetValue( wxPGVariant value )
{
const wxString& str = wxPGVariantToString(value);
m_fnstr = str;
m_filename = str;
if ( !m_filename.HasName() )
{
m_fnstr = wxEmptyString;
m_filename.Clear();
}
// Find index for extension.
if ( m_indFilter < 0 && m_fnstr.length() )
{
wxString ext = m_filename.GetExt();
int curind = 0;
size_t pos = 0;
size_t len = m_wildcard.length();
pos = m_wildcard.find(wxT("|"), pos);
while ( pos != wxString::npos && pos < (len-3) )
{
size_t ext_begin = pos + 3;
pos = m_wildcard.find(wxT("|"), ext_begin);
if ( pos == wxString::npos )
pos = len;
wxString found_ext = m_wildcard.substr(ext_begin, pos-ext_begin);
if ( found_ext.length() > 0 )
{
if ( found_ext[0] == wxT('*') )
{
m_indFilter = curind;
break;
}
if ( ext.CmpNoCase(found_ext) == 0 )
{
m_indFilter = curind;
break;
}
}
if ( pos != len )
pos = m_wildcard.find(wxT("|"), pos+1);
curind++;
}
/*
wxChar a = wxT(' ');
const wxChar* p = m_wildcard.c_str();
wxString ext = m_filename.GetExt();
int curind = 0;
do
{
while ( a && a != wxT('|') ) { a = *p; p++; }
if ( !a ) break;
a = *p;
p++;
if ( !a ) break;
a = *p;
p++;
const wxChar* ext_begin = p;
if ( *ext_begin == wxT('*') )
{
m_indFilter = curind;
break;
}
while ( a && a != '|' ) { a = *p; p++; }
a = wxT(' ');
int count = p-ext_begin-1;
if ( count > 0 )
{
wxASSERT( count < 32 );
wxString found_ext = m_wildcard.Mid(ext_begin-m_wildcard.c_str(),count);
if ( ext.CmpNoCase(found_ext) == 0 )
{
m_indFilter = curind;
break;
}
}
curind++;
} while ( a );
*/
}
}
wxPGVariant wxFilePropertyClass::DoGetValue() const
{
return wxPGVariant(m_fnstr);
}
wxString wxFilePropertyClass::GetValueAsString( int argFlags ) const
{
if ( argFlags & wxPG_FULL_VALUE )
{
return m_filename.GetFullPath();
}
else if ( m_flags & wxPG_PROP_SHOW_FULL_FILENAME )
{
if ( m_basePath.Length() )
{
wxFileName fn2(m_filename);
fn2.MakeRelativeTo(m_basePath);
return fn2.GetFullPath();
}
return m_filename.GetFullPath();
}
return m_filename.GetFullName();
}
bool wxFilePropertyClass::OnEvent( wxPropertyGrid* propGrid,
wxWindow* primary,
wxEvent& event )
{
if ( event.GetEventType() == wxEVT_COMMAND_BUTTON_CLICKED )
{
// If text in control is changed, then update it to value.
PrepareValueForDialogEditing(propGrid);
wxString path;
path = m_filename.GetPath();
wxFileDialog dlg( propGrid,
m_dlgTitle.length() ? m_dlgTitle : wxString(_("Choose a file")),
!m_initialPath.empty() ? m_initialPath : m_filename.GetPath(),
wxEmptyString,
m_wildcard,
0,
wxDefaultPosition );
if ( m_indFilter >= 0 )
dlg.SetFilterIndex( m_indFilter );
if ( dlg.ShowModal() == wxID_OK )
{
m_indFilter = dlg.GetFilterIndex();
wxString path = dlg.GetPath();
SetValueFromString( path, wxPG_FULL_VALUE );
if ( primary )
GetEditorClass()->SetControlStringValue( primary, GetValueAsString(0) );
return true;
}
}
return false;
}
bool wxFilePropertyClass::SetValueFromString( const wxString& text, int argFlags )
{
if ( (m_flags & wxPG_PROP_SHOW_FULL_FILENAME) || (argFlags & wxPG_FULL_VALUE) )
{
if ( m_filename != text )
{
return StdValidationProcedure( text );
}
}
else
{
if ( m_filename.GetFullName() != text )
{
wxFileName fn = m_filename;
fn.SetFullName(text);
wxString val = fn.GetFullPath();
return StdValidationProcedure( val );
}
}
return false;
}
void wxFilePropertyClass::SetAttribute( int id, wxVariant& value )
{
if ( id == wxPG_FILE_SHOW_FULL_PATH )
{
if ( value.GetLong() )
m_flags |= wxPG_PROP_SHOW_FULL_FILENAME;
else
m_flags &= ~(wxPG_PROP_SHOW_FULL_FILENAME);
}
else if ( id == wxPG_FILE_WILDCARD )
{
m_wildcard = value.GetString();
}
else if ( id == wxPG_FILE_SHOW_RELATIVE_PATH )
{
m_basePath = value.GetString();
}
else if ( id == wxPG_FILE_INITIAL_PATH )
{
m_initialPath = value.GetString();
}
else if ( id == wxPG_FILE_DIALOG_TITLE )
{
m_dlgTitle = value.GetString();
}
}
// -----------------------------------------------------------------------
// wxLongStringProperty
// -----------------------------------------------------------------------
// Class body is in propdev.h.
WX_PG_IMPLEMENT_PROPERTY_CLASS(wxLongStringProperty,wxBaseProperty,
wxString,const wxString&,TextCtrlAndButton)
wxLongStringPropertyClass::wxLongStringPropertyClass( const wxString& label, const wxString& name,
const wxString& value ) : wxBasePropertyClass(label,name)
{
DoSetValue(value);
}
wxLongStringPropertyClass::~wxLongStringPropertyClass() {}
void wxLongStringPropertyClass::DoSetValue( wxPGVariant value )
{
m_value = wxPGVariantToString(value);
}
wxPGVariant wxLongStringPropertyClass::DoGetValue() const
{
return wxPGVariant(m_value);
}
wxString wxLongStringPropertyClass::GetValueAsString( int ) const
{
return m_value;
}
bool wxLongStringPropertyClass::OnEvent( wxPropertyGrid* propGrid, wxWindow* primary,
wxEvent& event )
{
if ( event.GetEventType() == wxEVT_COMMAND_BUTTON_CLICKED )
{
// Update the value
PrepareValueForDialogEditing(propGrid);
wxString val1 = GetValueAsString(0);
wxString val_orig = val1;
wxString value;
if ( !(m_flags & wxPG_PROP_NO_ESCAPE) )
wxPropertyGrid::ExpandEscapeSequences(value,val1);
else
value = wxString(val1);
// Run editor dialog.
if ( OnButtonClick(propGrid,value) )
{
if ( !(m_flags & wxPG_PROP_NO_ESCAPE) )
wxPropertyGrid::CreateEscapeSequences(val1,value);
else
val1 = value;
if ( val1 != val_orig )
{
SetValueFromString ( val1, 0 );
UpdateControl ( primary );
return true;
}
}
}
return false;
}
bool wxLongStringPropertyClass::OnButtonClick( wxPropertyGrid* propGrid, wxString& value )
{
// launch editor dialog
wxDialog* dlg = new wxDialog(propGrid,-1,m_label,wxDefaultPosition,wxDefaultSize,
wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER|wxCLIP_CHILDREN);
dlg->SetFont(propGrid->GetFont()); // To allow entering chars of the same set as the propGrid
// Multi-line text editor dialog.
#if !wxPG_SMALL_SCREEN
const int spacing = 8;
#else
const int spacing = 4;
#endif
wxBoxSizer* topsizer = new wxBoxSizer( wxVERTICAL );
wxBoxSizer* rowsizer = new wxBoxSizer( wxHORIZONTAL );
wxTextCtrl* ed = new wxTextCtrl(dlg,11,value,
wxDefaultPosition,wxDefaultSize,wxTE_MULTILINE);
rowsizer->Add( ed, 1, wxEXPAND|wxALL, spacing );
topsizer->Add( rowsizer, 1, wxEXPAND, 0 );
rowsizer = new wxBoxSizer( wxHORIZONTAL );
const int but_sz_flags =
wxALIGN_RIGHT|wxALIGN_CENTRE_VERTICAL|wxBOTTOM|wxLEFT|wxRIGHT;
rowsizer->Add( new wxButton(dlg,wxID_OK,_("Ok")),
0, but_sz_flags, spacing );
rowsizer->Add( new wxButton(dlg,wxID_CANCEL,_("Cancel")),
0, but_sz_flags, spacing );
topsizer->Add( rowsizer, 0, wxALIGN_RIGHT|wxALIGN_CENTRE_VERTICAL, 0 );
dlg->SetSizer( topsizer );
topsizer->SetSizeHints( dlg );
#if !wxPG_SMALL_SCREEN
dlg->SetSize(400,300);
dlg->Move( propGrid->GetGoodEditorDialogPosition(this,dlg->GetSize()) );
#endif
int res = dlg->ShowModal();
if ( res == wxID_OK )
{
value = ed->GetValue();
dlg->Destroy();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -