Implement wxComboCtrl::GetSizeFromTextSize().
Improve calculation of wxComboCtrl best size which doesn't work correctly for non-default fonts as shown by r72935. It is still not perfect but better now. Closes #14825. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@72955 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -541,7 +541,10 @@ protected:
|
|||||||
void DestroyPopup();
|
void DestroyPopup();
|
||||||
|
|
||||||
// override the base class virtuals involved in geometry calculations
|
// override the base class virtuals involved in geometry calculations
|
||||||
|
// The common version only sets a default width, so the derived classes
|
||||||
|
// should override it and set the height and change the width as needed.
|
||||||
virtual wxSize DoGetBestSize() const;
|
virtual wxSize DoGetBestSize() const;
|
||||||
|
virtual wxSize DoGetSizeFromTextSize(int xlen, int ylen = -1) const;
|
||||||
|
|
||||||
// also set the embedded wxTextCtrl colours
|
// also set the embedded wxTextCtrl colours
|
||||||
virtual bool SetForegroundColour(const wxColour& colour);
|
virtual bool SetForegroundColour(const wxColour& colour);
|
||||||
|
@@ -355,6 +355,10 @@ protected:
|
|||||||
// Callback for item width, or -1 for default/undetermined
|
// Callback for item width, or -1 for default/undetermined
|
||||||
virtual wxCoord OnMeasureItemWidth( size_t item ) const;
|
virtual wxCoord OnMeasureItemWidth( size_t item ) const;
|
||||||
|
|
||||||
|
// override base implementation so we can return the size for the
|
||||||
|
// largest item
|
||||||
|
virtual wxSize DoGetBestSize() const;
|
||||||
|
|
||||||
// Callback for background drawing. Flags are same as with
|
// Callback for background drawing. Flags are same as with
|
||||||
// OnDrawItem.
|
// OnDrawItem.
|
||||||
virtual void OnDrawBackground( wxDC& dc, const wxRect& rect, int item, int flags ) const;
|
virtual void OnDrawBackground( wxDC& dc, const wxRect& rect, int item, int flags ) const;
|
||||||
|
@@ -1359,20 +1359,34 @@ void wxComboCtrlBase::PositionTextCtrl( int textCtrlXAdjust, int textCtrlYAdjust
|
|||||||
|
|
||||||
wxSize wxComboCtrlBase::DoGetBestSize() const
|
wxSize wxComboCtrlBase::DoGetBestSize() const
|
||||||
{
|
{
|
||||||
wxSize sizeText(150,0);
|
int width = m_text ? m_text->GetBestSize().x : 80;
|
||||||
|
|
||||||
if ( m_text )
|
return GetSizeFromTextSize(width);
|
||||||
sizeText = m_text->GetBestSize();
|
}
|
||||||
|
|
||||||
// TODO: Better method to calculate close-to-native control height.
|
wxSize wxComboCtrlBase::DoGetSizeFromTextSize(int xlen, int ylen) const
|
||||||
|
{
|
||||||
|
// Calculate close-to-native control height
|
||||||
|
|
||||||
int fhei;
|
int fhei;
|
||||||
|
|
||||||
|
#if wxUSE_COMBOBOX && (defined(__WXMSW__) || defined(__WXGTK__)) \
|
||||||
|
&& !defined(__WXUNIVERSAL__)
|
||||||
|
wxComboBox* cb = new wxComboBox;
|
||||||
|
cb->Hide();
|
||||||
|
cb->Create(const_cast<wxComboCtrlBase*>(this), wxID_ANY);
|
||||||
|
if ( m_font.IsOk() )
|
||||||
|
cb->SetFont(m_font);
|
||||||
|
fhei = cb->GetBestSize().y;
|
||||||
|
cb->Destroy();
|
||||||
|
#else
|
||||||
if ( m_font.IsOk() )
|
if ( m_font.IsOk() )
|
||||||
fhei = (m_font.GetPointSize()*2) + 5;
|
fhei = (m_font.GetPointSize()*2) + 5;
|
||||||
else if ( wxNORMAL_FONT->IsOk() )
|
else if ( wxNORMAL_FONT->IsOk() )
|
||||||
fhei = (wxNORMAL_FONT->GetPointSize()*2) + 5;
|
fhei = (wxNORMAL_FONT->GetPointSize()*2) + 5;
|
||||||
else
|
else
|
||||||
fhei = sizeText.y + 4;
|
fhei = 22;
|
||||||
|
#endif // only for wxComboBox on MSW or GTK
|
||||||
|
|
||||||
// Need to force height to accommodate bitmap?
|
// Need to force height to accommodate bitmap?
|
||||||
int btnSizeY = m_btnSize.y;
|
int btnSizeY = m_btnSize.y;
|
||||||
@@ -1392,11 +1406,6 @@ wxSize wxComboCtrlBase::DoGetBestSize() const
|
|||||||
fhei += 4;
|
fhei += 4;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// Final adjustments
|
|
||||||
#ifdef __WXGTK__
|
|
||||||
fhei += 1;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __WXMAC__
|
#ifdef __WXMAC__
|
||||||
// these are the numbers from the HIG:
|
// these are the numbers from the HIG:
|
||||||
switch ( m_windowVariant )
|
switch ( m_windowVariant )
|
||||||
@@ -1415,11 +1424,19 @@ wxSize wxComboCtrlBase::DoGetBestSize() const
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
fhei += 2 * FOCUS_RING;
|
fhei += 2 * FOCUS_RING;
|
||||||
int width = sizeText.x + FOCUS_RING + COMBO_MARGIN + DEFAULT_DROPBUTTON_WIDTH;
|
|
||||||
|
|
||||||
wxSize ret(width, fhei);
|
// Calculate width
|
||||||
CacheBestSize(ret);
|
int fwid = xlen + FOCUS_RING + COMBO_MARGIN + DEFAULT_DROPBUTTON_WIDTH;
|
||||||
return ret;
|
|
||||||
|
// Add the margins we have previously set
|
||||||
|
wxPoint marg( GetMargins() );
|
||||||
|
fwid += wxMax(0, marg.x);
|
||||||
|
fhei += wxMax(0, marg.y);
|
||||||
|
|
||||||
|
if ( ylen > 0 )
|
||||||
|
fhei += ylen - GetCharHeight();
|
||||||
|
|
||||||
|
return wxSize(fwid, fhei);
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxComboCtrlBase::OnSizeEvent( wxSizeEvent& event )
|
void wxComboCtrlBase::OnSizeEvent( wxSizeEvent& event )
|
||||||
@@ -2033,7 +2050,7 @@ void wxComboCtrlBase::OnCharEvent(wxKeyEvent& event)
|
|||||||
|
|
||||||
void wxComboCtrlBase::OnFocusEvent( wxFocusEvent& event )
|
void wxComboCtrlBase::OnFocusEvent( wxFocusEvent& event )
|
||||||
{
|
{
|
||||||
// On Mac, this leads to infinite recursion and eventually a crash
|
// On Mac, this leads to infinite recursion and eventually a crash
|
||||||
#ifndef __WXMAC__
|
#ifndef __WXMAC__
|
||||||
if ( event.GetEventType() == wxEVT_SET_FOCUS )
|
if ( event.GetEventType() == wxEVT_SET_FOCUS )
|
||||||
{
|
{
|
||||||
|
@@ -259,7 +259,7 @@ void wxGenericComboCtrl::OnPaintEvent( wxPaintEvent& WXUNUSED(event) )
|
|||||||
wxPen pen1( wxColour(133,133,133),
|
wxPen pen1( wxColour(133,133,133),
|
||||||
customBorder,
|
customBorder,
|
||||||
wxSOLID );
|
wxSOLID );
|
||||||
#else
|
#else
|
||||||
wxPen pen1( wxSystemSettings::GetColour(wxSYS_COLOUR_GRAYTEXT),
|
wxPen pen1( wxSystemSettings::GetColour(wxSYS_COLOUR_GRAYTEXT),
|
||||||
customBorder,
|
customBorder,
|
||||||
wxPENSTYLE_SOLID);
|
wxPENSTYLE_SOLID);
|
||||||
|
@@ -725,6 +725,8 @@ void wxVListBoxComboPopup::CalcWidths()
|
|||||||
// wxWindow::GetTextExtent (assuming same dc is used
|
// wxWindow::GetTextExtent (assuming same dc is used
|
||||||
// for all calls, as we do here).
|
// for all calls, as we do here).
|
||||||
wxClientDC dc(m_combo);
|
wxClientDC dc(m_combo);
|
||||||
|
if ( !m_useFont.IsOk() )
|
||||||
|
m_useFont = m_combo->GetFont();
|
||||||
dc.SetFont(m_useFont);
|
dc.SetFont(m_useFont);
|
||||||
|
|
||||||
for ( i=0; i<n; i++ )
|
for ( i=0; i<n; i++ )
|
||||||
@@ -1171,6 +1173,22 @@ wxCoord wxOwnerDrawnComboBox::OnMeasureItemWidth( size_t WXUNUSED(item) ) const
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wxSize wxOwnerDrawnComboBox::DoGetBestSize() const
|
||||||
|
{
|
||||||
|
wxSize best( wxComboCtrlBase::DoGetBestSize() );
|
||||||
|
|
||||||
|
if ( GetCount() > 0 )
|
||||||
|
{
|
||||||
|
wxOwnerDrawnComboBox* odc = const_cast<wxOwnerDrawnComboBox*>(this);
|
||||||
|
best.x = odc->GetWidestItemWidth();
|
||||||
|
// TODO: this class may also have GetHightestItemHeight() and
|
||||||
|
// GetHightestItem() methods, and so set the whole (edit part + arrow)
|
||||||
|
// control's height according with this max height, not only max width.
|
||||||
|
}
|
||||||
|
|
||||||
|
return GetSizeFromTextSize(best.x);
|
||||||
|
}
|
||||||
|
|
||||||
void wxOwnerDrawnComboBox::OnDrawBackground(wxDC& dc,
|
void wxOwnerDrawnComboBox::OnDrawBackground(wxDC& dc,
|
||||||
const wxRect& rect,
|
const wxRect& rect,
|
||||||
int WXUNUSED(item),
|
int WXUNUSED(item),
|
||||||
|
@@ -64,10 +64,6 @@
|
|||||||
|
|
||||||
#if wxUSE_RICHEDIT
|
#if wxUSE_RICHEDIT
|
||||||
|
|
||||||
#if wxUSE_INKEDIT
|
|
||||||
#include "wx/dynlib.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// old mingw32 has richedit stuff directly in windows.h and doesn't have
|
// old mingw32 has richedit stuff directly in windows.h and doesn't have
|
||||||
// richedit.h at all
|
// richedit.h at all
|
||||||
#if !defined(__GNUWIN32_OLD__) || defined(__CYGWIN10__)
|
#if !defined(__GNUWIN32_OLD__) || defined(__CYGWIN10__)
|
||||||
|
Reference in New Issue
Block a user