Don't update wxDataViewColumn after it was resized interactively
Previously, the column was updated, i.e. wxHeaderCtrl::UpdateColumn() was called, after the column width was changed interactively by the user. This was unnecessary and actually harmful as it resulted in recursion and display corruption. Stop doing this by adding yet another width-related function to the generic wxDataViewColumn called WXOnResize(), which just updates the main window display, but doesn't update the header at all, and calling it instead of SetWidth(), which does both, when the column is resized. Closes #18245.
This commit is contained in:
@@ -150,6 +150,10 @@ public:
|
|||||||
UpdateWidth();
|
UpdateWidth();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This method is also internal and called when the column is resized by
|
||||||
|
// user interactively.
|
||||||
|
void WXOnResize(int width);
|
||||||
|
|
||||||
int WXGetManuallySetWidth() const { return m_manuallySetWidth; }
|
int WXGetManuallySetWidth() const { return m_manuallySetWidth; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -331,7 +335,11 @@ public: // utility functions not part of the API
|
|||||||
// update the display after a change to an individual column
|
// update the display after a change to an individual column
|
||||||
void OnColumnChange(unsigned int idx);
|
void OnColumnChange(unsigned int idx);
|
||||||
|
|
||||||
// update after the column width changes, also calls OnColumnChange()
|
// update after the column width changes due to interactive resizing
|
||||||
|
void OnColumnResized();
|
||||||
|
|
||||||
|
// update after the column width changes because of e.g. title or bitmap
|
||||||
|
// change, invalidates the column best width and calls OnColumnChange()
|
||||||
void OnColumnWidthChange(unsigned int idx);
|
void OnColumnWidthChange(unsigned int idx);
|
||||||
|
|
||||||
// update after a change to the number of columns
|
// update after a change to the number of columns
|
||||||
|
@@ -204,6 +204,14 @@ int wxDataViewColumn::GetWidth() const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void wxDataViewColumn::WXOnResize(int width)
|
||||||
|
{
|
||||||
|
m_width =
|
||||||
|
m_manuallySetWidth = width;
|
||||||
|
|
||||||
|
m_owner->OnColumnResized();
|
||||||
|
}
|
||||||
|
|
||||||
void wxDataViewColumn::UpdateDisplay()
|
void wxDataViewColumn::UpdateDisplay()
|
||||||
{
|
{
|
||||||
if (m_owner)
|
if (m_owner)
|
||||||
@@ -401,7 +409,7 @@ private:
|
|||||||
wxDataViewCtrl * const owner = GetOwner();
|
wxDataViewCtrl * const owner = GetOwner();
|
||||||
|
|
||||||
const unsigned col = event.GetColumn();
|
const unsigned col = event.GetColumn();
|
||||||
owner->GetColumn(col)->SetWidth(event.GetWidth());
|
owner->GetColumn(col)->WXOnResize(event.GetWidth());
|
||||||
}
|
}
|
||||||
|
|
||||||
void OnEndReorder(wxHeaderCtrlEvent& event)
|
void OnEndReorder(wxHeaderCtrlEvent& event)
|
||||||
@@ -5454,6 +5462,11 @@ bool wxDataViewCtrl::InsertColumn( unsigned int pos, wxDataViewColumn *col )
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void wxDataViewCtrl::OnColumnResized()
|
||||||
|
{
|
||||||
|
m_clientArea->UpdateDisplay();
|
||||||
|
}
|
||||||
|
|
||||||
void wxDataViewCtrl::OnColumnWidthChange(unsigned int idx)
|
void wxDataViewCtrl::OnColumnWidthChange(unsigned int idx)
|
||||||
{
|
{
|
||||||
InvalidateColBestWidth(idx);
|
InvalidateColBestWidth(idx);
|
||||||
|
Reference in New Issue
Block a user