[ 1498016 ] 'Add wxUniv toolbar support wxTB_TEXT style' - with modifications.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@39486 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Włodzimierz Skiba
2006-05-31 18:15:42 +00:00
parent cf26ac62e3
commit 370efbe741
6 changed files with 151 additions and 24 deletions

View File

@@ -297,6 +297,7 @@ wxUniv:
- Send wxEVT_SCROLL_XXX events from wxSlider (Danny Raynor). - Send wxEVT_SCROLL_XXX events from wxSlider (Danny Raynor).
- Implemented wxToggleButton (David Bjorkevik). - Implemented wxToggleButton (David Bjorkevik).
- Label in Toolbar tools implemented (Danny Raynor).
wxX11: wxX11:

View File

@@ -206,7 +206,8 @@ public:
const wxBitmap& bitmap, const wxBitmap& bitmap,
const wxRect& rect, const wxRect& rect,
int flags = 0, int flags = 0,
long style = 0) = 0; long style = 0,
int tbarStyle = 0) = 0;
// draw a (part of) line in the text control // draw a (part of) line in the text control
virtual void DrawTextLine(wxDC& dc, virtual void DrawTextLine(wxDC& dc,
@@ -626,8 +627,9 @@ public:
const wxBitmap& bitmap, const wxBitmap& bitmap,
const wxRect& rect, const wxRect& rect,
int flags = 0, int flags = 0,
long style = 0) long style = 0,
{ m_renderer->DrawToolBarButton(dc, label, bitmap, rect, flags, style); } int tbarStyle = 0)
{ m_renderer->DrawToolBarButton(dc, label, bitmap, rect, flags, style, tbarStyle); }
virtual void DrawTextLine(wxDC& dc, virtual void DrawTextLine(wxDC& dc,
const wxString& text, const wxString& text,
const wxRect& rect, const wxRect& rect,
@@ -902,4 +904,3 @@ private:
}; };
#endif // _WX_UNIV_RENDERER_H_ #endif // _WX_UNIV_RENDERER_H_

View File

@@ -59,6 +59,8 @@ public:
virtual bool Realize(); virtual bool Realize();
virtual void SetWindowStyleFlag( long style );
virtual wxToolBarToolBase *FindToolForPosition(wxCoord x, wxCoord y) const; virtual wxToolBarToolBase *FindToolForPosition(wxCoord x, wxCoord y) const;
virtual void SetToolShortHelp(int id, const wxString& helpString); virtual void SetToolShortHelp(int id, const wxString& helpString);

View File

@@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
// Name: univ/themes/gtk.cpp // Name: src/univ/themes/gtk.cpp
// Purpose: wxUniversal theme implementing GTK-like LNF // Purpose: wxUniversal theme implementing GTK-like LNF
// Author: Vadim Zeitlin // Author: Vadim Zeitlin
// Modified by: // Modified by:
@@ -171,7 +171,8 @@ public:
const wxBitmap& bitmap, const wxBitmap& bitmap,
const wxRect& rect, const wxRect& rect,
int flags = 0, int flags = 0,
long style = 0); long style = 0,
int tbarStyle = 0);
virtual void DrawTextLine(wxDC& dc, virtual void DrawTextLine(wxDC& dc,
const wxString& text, const wxString& text,
@@ -1683,7 +1684,8 @@ void wxGTKRenderer::DrawToolBarButton(wxDC& dc,
const wxBitmap& bitmap, const wxBitmap& bitmap,
const wxRect& rectOrig, const wxRect& rectOrig,
int flags, int flags,
long WXUNUSED(style)) long WXUNUSED(style),
int tbarStyle)
{ {
// we don't draw the separators at all // we don't draw the separators at all
if ( !label.empty() || bitmap.Ok() ) if ( !label.empty() || bitmap.Ok() )
@@ -1704,7 +1706,23 @@ void wxGTKRenderer::DrawToolBarButton(wxDC& dc,
DrawBackground(dc, wxSCHEME_COLOUR(m_scheme, CONTROL_CURRENT), rect); DrawBackground(dc, wxSCHEME_COLOUR(m_scheme, CONTROL_CURRENT), rect);
} }
dc.DrawLabel(label, bitmap, rect, wxALIGN_CENTRE); if(tbarStyle & wxTB_TEXT)
{
if(tbarStyle & wxTB_HORIZONTAL)
{
dc.DrawLabel(label, bitmap, rect, wxALIGN_CENTRE);
}
else
{
dc.DrawLabel(label, bitmap, rect, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL);
}
}
else
{
int xpoint = (rect.GetLeft() + rect.GetRight() + 1 - bitmap.GetWidth()) / 2;
int ypoint = (rect.GetTop() + rect.GetBottom() + 1 - bitmap.GetHeight()) / 2;
dc.DrawBitmap(bitmap, xpoint, ypoint);
}
} }
} }
@@ -2819,12 +2837,12 @@ void wxGTKRenderer::AdjustSize(wxSize *size, const wxWindow *window)
} else } else
#endif // wxUSE_BMPBUTTON #endif // wxUSE_BMPBUTTON
#if wxUSE_BUTTON || wxUSE_TOGGLEBTN #if wxUSE_BUTTON || wxUSE_TOGGLEBTN
if ( 0 if ( 0
# if wxUSE_BUTTON # if wxUSE_BUTTON
|| wxDynamicCast(window, wxButton) || wxDynamicCast(window, wxButton)
# endif // wxUSE_BUTTON # endif // wxUSE_BUTTON
# if wxUSE_TOGGLEBTN # if wxUSE_TOGGLEBTN
|| wxDynamicCast(window, wxToggleButton) || wxDynamicCast(window, wxToggleButton)
# endif // wxUSE_TOGGLEBTN # endif // wxUSE_TOGGLEBTN
) )
{ {

View File

@@ -249,7 +249,8 @@ public:
const wxBitmap& bitmap, const wxBitmap& bitmap,
const wxRect& rect, const wxRect& rect,
int flags = 0, int flags = 0,
long style = 0); long style = 0,
int tbarStyle = 0);
virtual void DrawTextLine(wxDC& dc, virtual void DrawTextLine(wxDC& dc,
const wxString& text, const wxString& text,
const wxRect& rect, const wxRect& rect,
@@ -2480,7 +2481,8 @@ void wxWin32Renderer::DrawToolBarButton(wxDC& dc,
const wxBitmap& bitmap, const wxBitmap& bitmap,
const wxRect& rectOrig, const wxRect& rectOrig,
int flags, int flags,
long style) long style,
int tbarStyle)
{ {
if (style == wxTOOL_STYLE_BUTTON) if (style == wxTOOL_STYLE_BUTTON)
{ {
@@ -2496,7 +2498,23 @@ void wxWin32Renderer::DrawToolBarButton(wxDC& dc,
DrawBorder(dc, wxBORDER_RAISED, rect, flags); DrawBorder(dc, wxBORDER_RAISED, rect, flags);
} }
dc.DrawLabel(label, bitmap, rect, wxALIGN_CENTRE); if(tbarStyle & wxTB_TEXT)
{
if(tbarStyle & wxTB_HORIZONTAL)
{
dc.DrawLabel(label, bitmap, rect, wxALIGN_CENTRE);
}
else
{
dc.DrawLabel(label, bitmap, rect, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL);
}
}
else
{
int xpoint = (rect.GetLeft() + rect.GetRight() + 1 - bitmap.GetWidth()) / 2;
int ypoint = (rect.GetTop() + rect.GetBottom() + 1 - bitmap.GetHeight()) / 2;
dc.DrawBitmap(bitmap, xpoint, ypoint);
}
} }
else if (style == wxTOOL_STYLE_SEPARATOR) else if (style == wxTOOL_STYLE_SEPARATOR)
{ {

View File

@@ -34,6 +34,7 @@
#include "wx/app.h" #include "wx/app.h"
#include "wx/log.h" #include "wx/log.h"
#include "wx/frame.h" #include "wx/frame.h"
#include "wx/dc.h"
#endif #endif
#include "wx/univ/renderer.h" #include "wx/univ/renderer.h"
@@ -375,8 +376,17 @@ wxRect wxToolBar::GetToolRect(wxToolBarToolBase *toolBase) const
{ {
if (tool->IsButton()) if (tool->IsButton())
{ {
rect.width = m_defaultWidth; if(!HasFlag(wxTB_TEXT))
rect.height = m_defaultHeight; {
rect.width = m_defaultWidth;
rect.height = m_defaultHeight;
}
else
{
rect.width = m_defaultWidth +
GetFont().GetPointSize() * tool->GetLabel().length();
rect.height = m_defaultHeight;
}
} }
else if (tool->IsSeparator()) else if (tool->IsSeparator())
{ {
@@ -393,8 +403,17 @@ wxRect wxToolBar::GetToolRect(wxToolBarToolBase *toolBase) const
{ {
if (tool->IsButton()) if (tool->IsButton())
{ {
rect.width = m_defaultWidth; if(!HasFlag(wxTB_TEXT))
rect.height = m_defaultHeight; {
rect.width = m_defaultWidth;
rect.height = m_defaultHeight;
}
else
{
rect.width = m_defaultWidth +
GetFont().GetPointSize() * tool->GetLabel().length();
rect.height = m_defaultHeight;
}
} }
else if (tool->IsSeparator()) else if (tool->IsSeparator())
{ {
@@ -427,6 +446,15 @@ bool wxToolBar::Realize()
return true; return true;
} }
void wxToolBar::SetWindowStyleFlag( long style )
{
wxToolBarBase::SetWindowStyleFlag(style);
m_needsLayout = true;
Refresh();
}
void wxToolBar::DoLayout() void wxToolBar::DoLayout()
{ {
wxASSERT_MSG( m_needsLayout, _T("why are we called?") ); wxASSERT_MSG( m_needsLayout, _T("why are we called?") );
@@ -436,7 +464,8 @@ void wxToolBar::DoLayout()
wxCoord x = m_xMargin, wxCoord x = m_xMargin,
y = m_yMargin; y = m_yMargin;
const wxCoord widthTool = IsVertical() ? m_defaultHeight : m_defaultWidth; wxCoord widthTool = 0, maxWidthTool = 0;
wxCoord heightTool = 0, maxHeightTool = 0;
wxCoord margin = IsVertical() ? m_xMargin : m_yMargin; wxCoord margin = IsVertical() ? m_xMargin : m_yMargin;
wxCoord *pCur = IsVertical() ? &y : &x; wxCoord *pCur = IsVertical() ? &y : &x;
@@ -453,6 +482,32 @@ void wxToolBar::DoLayout()
// TODO ugly number fiddling // TODO ugly number fiddling
if (tool->IsButton()) if (tool->IsButton())
{ {
if (IsVertical())
{
widthTool = m_defaultHeight;
heightTool = m_defaultWidth;
if(HasFlag(wxTB_TEXT))
heightTool += GetFont().GetPointSize() * tool->GetLabel().length();
}
else
{
widthTool = m_defaultWidth;
if(HasFlag(wxTB_TEXT))
widthTool += GetFont().GetPointSize() * tool->GetLabel().length();
heightTool = m_defaultHeight;
}
if(widthTool > maxWidthTool) // Record max width of tool
{
maxWidthTool = widthTool;
}
if(heightTool > maxHeightTool) // Record max width of tool
{
maxHeightTool = heightTool;
}
*pCur += widthTool; *pCur += widthTool;
} }
else if (tool->IsSeparator()) else if (tool->IsSeparator())
@@ -473,8 +528,26 @@ void wxToolBar::DoLayout()
} }
// calculate the total toolbar size // calculate the total toolbar size
wxCoord xMin = m_defaultWidth + 2*m_xMargin, wxCoord xMin, yMin;
yMin = m_defaultHeight + 2*m_yMargin;
if(!HasFlag(wxTB_TEXT))
{
xMin = m_defaultWidth + 2*m_xMargin;
yMin = m_defaultHeight + 2*m_yMargin;
}
else
{
if (IsVertical())
{
xMin = heightTool + 2*m_xMargin;
yMin = widthTool + 2*m_xMargin;
}
else
{
xMin = maxWidthTool + 2*m_xMargin;
yMin = heightTool + 2*m_xMargin;
}
}
m_maxWidth = x < xMin ? xMin : x; m_maxWidth = x < xMin ? xMin : x;
m_maxHeight = y < yMin ? yMin : y; m_maxHeight = y < yMin ? yMin : y;
@@ -550,7 +623,7 @@ void wxToolBar::DoDraw(wxControlRenderer *renderer)
// prepare the variables used below // prepare the variables used below
wxDC& dc = renderer->GetDC(); wxDC& dc = renderer->GetDC();
wxRenderer *rend = renderer->GetRenderer(); wxRenderer *rend = renderer->GetRenderer();
// dc.SetFont(GetFont()); -- uncomment when we support labels dc.SetFont(GetFont());
// draw the border separating us from the menubar (if there is no menubar // draw the border separating us from the menubar (if there is no menubar
// we probably shouldn't draw it?) // we probably shouldn't draw it?)
@@ -616,14 +689,28 @@ void wxToolBar::DoDraw(wxControlRenderer *renderer)
wxBitmap bitmap; wxBitmap bitmap;
if ( !tool->IsSeparator() ) if ( !tool->IsSeparator() )
{ {
// label = tool->GetLabel(); label = tool->GetLabel();
bitmap = tool->GetBitmap(); bitmap = tool->GetBitmap();
} }
//else: leave both the label and the bitmap invalid to draw a separator //else: leave both the label and the bitmap invalid to draw a separator
if ( !tool->IsControl() ) if ( !tool->IsControl() )
{ {
rend->DrawToolBarButton(dc, label, bitmap, rectTool, flags, tool->GetStyle()); int tbStyle = 0;
if(HasFlag(wxTB_TEXT))
{
tbStyle |= wxTB_TEXT;
}
if(HasFlag(wxTB_VERTICAL))
{
tbStyle |= wxTB_VERTICAL;
}
else
{
tbStyle |= wxTB_HORIZONTAL;
}
rend->DrawToolBarButton(dc, label, bitmap, rectTool, flags, tool->GetStyle(), tbStyle);
} }
else // control else // control
{ {