wxRibbonButtonBarButton: Implemented mutable lables and minimum label width

Added new function SetButtonText() which modifies labels of
existing ribbon button bar buttons.
The new function SetButtonTextMinWidth() is used to specify the
label width in advance so that lables can be changed without
recalculating the layout.
wxRibbonArtProvider is modified to support these operation.
This commit is contained in:
Max Maisel
2018-03-14 16:55:58 +01:00
parent 5d6ba5d335
commit 7aed0e547b
6 changed files with 221 additions and 5 deletions

View File

@@ -381,12 +381,18 @@ public:
wxRibbonButtonKind kind,
wxRibbonButtonBarButtonState size,
const wxString& label,
wxCoord text_min_width,
wxSize bitmap_size_large,
wxSize bitmap_size_small,
wxSize* button_size,
wxRect* normal_region,
wxRect* dropdown_region) = 0;
virtual wxCoord GetButtonBarButtonTextWidth(
wxDC& dc, const wxString& label,
wxRibbonButtonKind kind,
wxRibbonButtonBarButtonState size) = 0;
virtual wxSize GetMinimisedPanelMinimumSize(
wxDC& dc,
const wxRibbonPanel* wnd,
@@ -584,12 +590,18 @@ public:
wxRibbonButtonKind kind,
wxRibbonButtonBarButtonState size,
const wxString& label,
wxCoord text_min_width,
wxSize bitmap_size_large,
wxSize bitmap_size_small,
wxSize* button_size,
wxRect* normal_region,
wxRect* dropdown_region) wxOVERRIDE;
wxCoord GetButtonBarButtonTextWidth(
wxDC& dc, const wxString& label,
wxRibbonButtonKind kind,
wxRibbonButtonBarButtonState size) wxOVERRIDE;
wxSize GetMinimisedPanelMinimumSize(
wxDC& dc,
const wxRibbonPanel* wnd,

View File

@@ -146,6 +146,11 @@ public:
const wxBitmap& bitmap_disabled = wxNullBitmap,
const wxBitmap& bitmap_small_disabled = wxNullBitmap);
virtual void SetButtonText(int button_id, const wxString& label);
virtual void SetButtonTextMinWidth(int button_id,
int min_width_medium, int min_width_large);
virtual void SetButtonTextMinWidth(int button_id, const wxString& label);
virtual wxRibbonButtonBarButtonBase *GetActiveItem() const;
virtual wxRibbonButtonBarButtonBase *GetHoveredItem() const;

View File

@@ -934,6 +934,9 @@ public:
be returned.
@param label
The label of the button.
@param text_min_width
The minimum width of the button label.
Set this to 0 if it is not used.
@param bitmap_size_large
The size of all "large" bitmaps on the button bar.
@param bitmap_size_small
@@ -953,12 +956,39 @@ public:
wxRibbonButtonKind kind,
wxRibbonButtonBarButtonState size,
const wxString& label,
wxCoord text_min_width,
wxSize bitmap_size_large,
wxSize bitmap_size_small,
wxSize* button_size,
wxRect* normal_region,
wxRect* dropdown_region) = 0;
/**
Gets the width of the string if it is used as
a wxRibbonButtonBar button label.
@param dc
A device context to use when one is required for size calculations.
@param label
The string whose width shall be calculated.
@param kind
The kind of button.
@param size
The size-class to calculate the size for. Buttons on a button bar
can have three distinct sizes: wxRIBBON_BUTTONBAR_BUTTON_SMALL,
wxRIBBON_BUTTONBAR_BUTTON_MEDIUM, and wxRIBBON_BUTTONBAR_BUTTON_LARGE.
If the requested size-class is not applicable, then NULL should
be returned.
@return Width of the given label text in pixel.
@note This function only works with single-line strings.
*/
virtual wxCoord GetButtonBarButtonTextWidth(
wxDC& dc, const wxString& label,
wxRibbonButtonKind kind,
wxRibbonButtonBarButtonState size) = 0;
/**
Calculate the size of a minimised ribbon panel.
@@ -1208,6 +1238,7 @@ public:
wxRibbonButtonKind kind,
wxRibbonButtonBarButtonState size,
const wxString& label,
wxCoord text_min_width,
wxSize bitmap_size_large,
wxSize bitmap_size_small,
wxSize* button_size,

View File

@@ -503,6 +503,71 @@ public:
const wxBitmap& bitmap_disabled = wxNullBitmap,
const wxBitmap& bitmap_small_disabled = wxNullBitmap);
/**
Changes the label text of an existing button.
@param button_id
ID of the button to manipulate.
@param label
New label of the button.
@remarks
If text size has changed, Realize() must be called
on the top level wxRibbonBar object to recalculate panel sizes.
Use SetButtonTextMinWidth() to avoid calling Realize()
after every change.
@see SetButtonTextMinWidth
*/
virtual void SetButtonText(int button_id, const wxString& label);
/**
Sets the minimum width of the button label, to indicate to
the wxRibbonArtProvider layout mechanism that this is the
minimum required size.
You have to call Realize() after calling this function to
apply the given minimum width.
@param button_id
ID of the button to manipulate.
@param min_width_medium
Requested minimum width of the button text in pixel
if the button is medium size.
@param min_width_medium
Requested minimum width of the button text in pixel
if the button is large size.
@remarks
This function is used together with SetButtonText() to change
button labels on the fly without modifying the button bar layout.
@see SetButtonText()
*/
virtual void SetButtonTextMinWidth(int button_id,
int min_width_medium, int min_width_large);
/**
Sets the minimum width of the button label, to indicate to
the wxRibbonArtProvider layout mechanism that this is the
minimum required size.
You have to call Realize() after calling this function to
apply the given minimum width.
@param button_id
ID of the button to manipulate.
@param label
The minimum width is set to the width of this label.
@remarks
This function is used together with SetButtonText() to change
button labels on the fly without modifying the button bar layout.
@see SetButtonText()
*/
virtual void SetButtonTextMinWidth(int button_id, const wxString& label);
/**
Returns the active item of the button bar or NULL if there is none.
The active button is the one being clicked.

View File

@@ -3036,6 +3036,7 @@ bool wxRibbonMSWArtProvider::GetButtonBarButtonSize(
wxRibbonButtonKind kind,
wxRibbonButtonBarButtonState size,
const wxString& label,
wxCoord text_min_width,
wxSize bitmap_size_large,
wxSize bitmap_size_small,
wxSize* button_size,
@@ -3074,9 +3075,11 @@ bool wxRibbonMSWArtProvider::GetButtonBarButtonSize(
// Small bitmap, with label to the right
{
GetButtonBarButtonSize(dc, wnd, kind, wxRIBBON_BUTTONBAR_BUTTON_SMALL,
label, bitmap_size_large, bitmap_size_small, button_size,
normal_region, dropdown_region);
label, text_min_width, bitmap_size_large, bitmap_size_small,
button_size, normal_region, dropdown_region);
int text_size = dc.GetTextExtent(label).GetWidth();
if(text_size < text_min_width)
text_size = text_min_width;
button_size->SetWidth(button_size->GetWidth() + text_size);
switch(kind)
{
@@ -3101,6 +3104,8 @@ bool wxRibbonMSWArtProvider::GetButtonBarButtonSize(
wxCoord label_height;
wxCoord best_width;
dc.GetTextExtent(label, &best_width, &label_height);
if(best_width < text_min_width)
best_width = text_min_width;
int last_line_extra_width = 0;
if(kind != wxRIBBON_BUTTON_NORMAL && kind != wxRIBBON_BUTTON_TOGGLE)
{
@@ -3114,6 +3119,8 @@ bool wxRibbonMSWArtProvider::GetButtonBarButtonSize(
int width = wxMax(
dc.GetTextExtent(label.Left(i)).GetWidth(),
dc.GetTextExtent(label.Mid(i + 1)).GetWidth() + last_line_extra_width);
if(best_width < text_min_width)
best_width = text_min_width;
if(width < best_width)
{
best_width = width;
@@ -3149,6 +3156,47 @@ bool wxRibbonMSWArtProvider::GetButtonBarButtonSize(
return true;
}
wxCoord wxRibbonMSWArtProvider::GetButtonBarButtonTextWidth(
wxDC& dc, const wxString& label,
wxRibbonButtonKind kind,
wxRibbonButtonBarButtonState size)
{
wxCoord best_width = 0;
dc.SetFont(m_button_bar_label_font);
if((size & wxRIBBON_BUTTONBAR_BUTTON_SIZE_MASK)
== wxRIBBON_BUTTONBAR_BUTTON_LARGE)
{
best_width = dc.GetTextExtent(label).GetWidth();
int last_line_extra_width = 0;
if(kind != wxRIBBON_BUTTON_NORMAL && kind != wxRIBBON_BUTTON_TOGGLE)
{
last_line_extra_width += 8;
}
size_t i;
for(i = 0; i < label.Len(); ++i)
{
if(wxRibbonCanLabelBreakAtPosition(label, i))
{
int width = wxMax(
dc.GetTextExtent(label.Left(i)).GetWidth(),
dc.GetTextExtent(label.Mid(i + 1)).GetWidth() + last_line_extra_width);
if(width < best_width)
{
best_width = width;
}
}
}
}
else if((size & wxRIBBON_BUTTONBAR_BUTTON_SIZE_MASK)
== wxRIBBON_BUTTONBAR_BUTTON_MEDIUM)
{
best_width = dc.GetTextExtent(label).GetWidth();
}
return best_width;
}
wxSize wxRibbonMSWArtProvider::GetMinimisedPanelMinimumSize(
wxDC& dc,
const wxRibbonPanel* wnd,

View File

@@ -118,6 +118,7 @@ public:
wxBitmap bitmap_large_disabled;
wxBitmap bitmap_small;
wxBitmap bitmap_small_disabled;
wxCoord text_min_width[3];
wxRibbonButtonBarButtonSizeInfo sizes[3];
wxClientDataContainer client_data;
int id;
@@ -328,6 +329,9 @@ wxRibbonButtonBarButtonBase* wxRibbonButtonBar::InsertButton(
base->kind = kind;
base->help_string = help_string;
base->state = 0;
base->text_min_width[0] = 0;
base->text_min_width[1] = 0;
base->text_min_width[2] = 0;
wxClientDC temp_dc(this);
FetchButtonSizeInfo(base, wxRIBBON_BUTTONBAR_BUTTON_SMALL, temp_dc);
@@ -427,9 +431,9 @@ void wxRibbonButtonBar::FetchButtonSizeInfo(wxRibbonButtonBarButtonBase* button,
if(m_art)
{
info.is_supported = m_art->GetButtonBarButtonSize(dc, this,
button->kind, size, button->label, m_bitmap_size_large,
m_bitmap_size_small, &info.size, &info.normal_region,
&info.dropdown_region);
button->kind, size, button->label, button->text_min_width[size],
m_bitmap_size_large, m_bitmap_size_small, &info.size,
&info.normal_region, &info.dropdown_region);
}
else
info.is_supported = false;
@@ -580,6 +584,57 @@ void wxRibbonButtonBar::SetButtonIcon(
Refresh();
}
void wxRibbonButtonBar::SetButtonText(int button_id, const wxString& label)
{
wxRibbonButtonBarButtonBase* base = GetItemById(button_id);
if(base == NULL)
return;
base->label = label;
wxClientDC temp_dc(this);
FetchButtonSizeInfo(base, wxRIBBON_BUTTONBAR_BUTTON_SMALL, temp_dc);
FetchButtonSizeInfo(base, wxRIBBON_BUTTONBAR_BUTTON_MEDIUM, temp_dc);
FetchButtonSizeInfo(base, wxRIBBON_BUTTONBAR_BUTTON_LARGE, temp_dc);
m_layouts_valid = false;
Refresh();
}
void wxRibbonButtonBar::SetButtonTextMinWidth(int button_id,
int min_width_medium, int min_width_large)
{
wxRibbonButtonBarButtonBase* base = GetItemById(button_id);
if(base == NULL)
return;
base->text_min_width[0] = 0;
base->text_min_width[1] = min_width_medium;
base->text_min_width[2] = min_width_large;
wxClientDC temp_dc(this);
FetchButtonSizeInfo(base, wxRIBBON_BUTTONBAR_BUTTON_SMALL, temp_dc);
FetchButtonSizeInfo(base, wxRIBBON_BUTTONBAR_BUTTON_MEDIUM, temp_dc);
FetchButtonSizeInfo(base, wxRIBBON_BUTTONBAR_BUTTON_LARGE, temp_dc);
m_layouts_valid = false;
}
void wxRibbonButtonBar::SetButtonTextMinWidth(
int button_id, const wxString& label)
{
wxRibbonButtonBarButtonBase* base = GetItemById(button_id);
if(base == NULL)
return;
wxClientDC temp_dc(this);
base->text_min_width[wxRIBBON_BUTTONBAR_BUTTON_MEDIUM] =
m_art->GetButtonBarButtonTextWidth(
temp_dc, label, base->kind, wxRIBBON_BUTTONBAR_BUTTON_MEDIUM);
base->text_min_width[wxRIBBON_BUTTONBAR_BUTTON_LARGE] =
m_art->GetButtonBarButtonTextWidth(
temp_dc, label, base->kind, wxRIBBON_BUTTONBAR_BUTTON_LARGE);
FetchButtonSizeInfo(base, wxRIBBON_BUTTONBAR_BUTTON_SMALL, temp_dc);
FetchButtonSizeInfo(base, wxRIBBON_BUTTONBAR_BUTTON_MEDIUM, temp_dc);
FetchButtonSizeInfo(base, wxRIBBON_BUTTONBAR_BUTTON_LARGE, temp_dc);
m_layouts_valid = false;
}
void wxRibbonButtonBar::SetArtProvider(wxRibbonArtProvider* art)
{
if(art == m_art)