X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d2a82a6f7d2034cf8b2fd624b80515cd7248b11f..9914bfbb77f48baf869b63aff58feb2b145ff4d3:/src/propgrid/propgrid.cpp diff --git a/src/propgrid/propgrid.cpp b/src/propgrid/propgrid.cpp index 7e38cfb439..e98e86097c 100644 --- a/src/propgrid/propgrid.cpp +++ b/src/propgrid/propgrid.cpp @@ -328,6 +328,7 @@ void wxPropertyGrid::Init1() if ( wxPGGlobalVars->m_mapEditorClasses.empty() ) wxPropertyGrid::RegisterDefaultEditors(); + m_validatingEditor = 0; m_iFlags = 0; m_pState = NULL; m_wndEditor = m_wndEditor2 = NULL; @@ -1071,11 +1072,17 @@ void wxPropertyGrid::DoEndLabelEdit( bool commit, int selFlags ) } m_selColumn = 1; + int wasFocused = m_iFlags & wxPG_FL_FOCUSED; DestroyEditorWnd(m_labelEditor); + m_labelEditor = NULL; m_labelEditorProperty = NULL; + // Fix focus (needed at least on wxGTK) + if ( wasFocused ) + SetFocusOnCanvas(); + DrawItem(prop); } @@ -2530,6 +2537,8 @@ wxRect wxPropertyGrid::GetPropertyRect( const wxPGProperty* p1, const wxPGProper // // Return rect which encloses the given property range + // (in logical grid coordinates) + // int visTop = p1->GetY(); int visBottom; @@ -2572,6 +2581,13 @@ void wxPropertyGrid::DrawItems( const wxPGProperty* p1, const wxPGProperty* p2 ) wxRect r = GetPropertyRect(p1, p2); if ( r.width > 0 ) { + // Convert rectangle from logical grid coordinates to physical ones + int vx, vy; + GetViewStart(&vx, &vy); + vx *= wxPG_PIXELS_PER_UNIT; + vy *= wxPG_PIXELS_PER_UNIT; + r.x -= vx; + r.y -= vy; RefreshRect(r); } } @@ -3396,6 +3412,25 @@ wxVariant wxPropertyGrid::GetUncommittedPropertyValue() // Runs wxValidator for the selected property bool wxPropertyGrid::DoEditorValidate() { +#if wxUSE_VALIDATORS + wxRecursionGuard guard(m_validatingEditor); + if ( guard.IsInside() ) + return false; + + wxPGProperty* selected = GetSelection(); + if ( selected ) + { + wxWindow* wnd = GetEditorControl(); + + wxValidator* validator = selected->GetValidator(); + if ( validator && wnd ) + { + validator->SetWindow(wnd); + if ( !validator->Validate(this) ) + return false; + } + } +#endif return true; } @@ -3409,6 +3444,15 @@ void wxPropertyGrid::HandleCustomEditorEvent( wxEvent &event ) if ( !m_pState ) return; + // Don't care about the event if it originated from the + // 'label editor'. In this function we only care about the + // property value editor. + if ( m_labelEditor && event.GetId() == m_labelEditor->GetId() ) + { + event.Skip(); + return; + } + wxPGProperty* selected = GetSelection(); // Somehow, event is handled after property has been deselected. @@ -3434,7 +3478,7 @@ void wxPropertyGrid::HandleCustomEditorEvent( wxEvent &event ) m_chgInfo_changedProperty = NULL; - m_iFlags &= ~(wxPG_FL_VALIDATION_FAILED|wxPG_FL_VALUE_CHANGE_IN_EVENT); + m_iFlags &= ~wxPG_FL_VALUE_CHANGE_IN_EVENT; // // Filter out excess wxTextCtrl modified events @@ -3580,14 +3624,21 @@ wxRect wxPropertyGrid::GetEditorWidgetRect( wxPGProperty* p, int column ) const GetViewStart(&vx, &vy); vy *= wxPG_PIXELS_PER_UNIT; - // TODO: If custom image detection changes from current, change this. - if ( m_iFlags & wxPG_FL_CUR_USES_CUSTOM_IMAGE ) + if ( column == 1 ) + { + // TODO: If custom image detection changes from current, change this. + if ( m_iFlags & wxPG_FL_CUR_USES_CUSTOM_IMAGE ) + { + //m_iFlags |= wxPG_FL_CUR_USES_CUSTOM_IMAGE; + int iw = p->OnMeasureImage().x; + if ( iw < 1 ) + iw = wxPG_CUSTOM_IMAGE_WIDTH; + imageOffset = p->GetImageOffset(iw); + } + } + else if ( column == 0 ) { - //m_iFlags |= wxPG_FL_CUR_USES_CUSTOM_IMAGE; - int iw = p->OnMeasureImage().x; - if ( iw < 1 ) - iw = wxPG_CUSTOM_IMAGE_WIDTH; - imageOffset = p->GetImageOffset(iw); + splitterX += (p->m_depth - 1) * m_subgroup_extramargin; } return wxRect @@ -3970,8 +4021,6 @@ bool wxPropertyGrid::DoSelectProperty( wxPGProperty* p, unsigned int flags ) int splitterX = GetSplitterPosition(); m_editorFocused = 0; m_iFlags |= wxPG_FL_PRIMARY_FILLS_ENTIRE; - if ( p != prevFirstSel ) - m_iFlags &= ~(wxPG_FL_VALIDATION_FAILED); wxASSERT( m_wndEditor == NULL ); @@ -4821,7 +4870,6 @@ bool wxPropertyGrid::HandleMouseMove( int x, unsigned int y, { int newSplitterX = x - m_dragOffset; - int splitterX = x - splitterHitOffset; // Splitter redraw required? if ( newSplitterX != splitterX )