From: Włodzimierz Skiba Date: Wed, 31 May 2006 18:15:42 +0000 (+0000) Subject: [ 1498016 ] 'Add wxUniv toolbar support wxTB_TEXT style' - with modifications. X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/370efbe74165c03642ea7620d35d9e0be8572d74?ds=inline [ 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 --- diff --git a/docs/changes.txt b/docs/changes.txt index d35ac15380..cf6dd623de 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -297,6 +297,7 @@ wxUniv: - Send wxEVT_SCROLL_XXX events from wxSlider (Danny Raynor). - Implemented wxToggleButton (David Bjorkevik). +- Label in Toolbar tools implemented (Danny Raynor). wxX11: diff --git a/include/wx/univ/renderer.h b/include/wx/univ/renderer.h index 2dc137a9b9..3ca35e91ef 100644 --- a/include/wx/univ/renderer.h +++ b/include/wx/univ/renderer.h @@ -206,7 +206,8 @@ public: const wxBitmap& bitmap, const wxRect& rect, int flags = 0, - long style = 0) = 0; + long style = 0, + int tbarStyle = 0) = 0; // draw a (part of) line in the text control virtual void DrawTextLine(wxDC& dc, @@ -626,8 +627,9 @@ public: const wxBitmap& bitmap, const wxRect& rect, int flags = 0, - long style = 0) - { m_renderer->DrawToolBarButton(dc, label, bitmap, rect, flags, style); } + long style = 0, + int tbarStyle = 0) + { m_renderer->DrawToolBarButton(dc, label, bitmap, rect, flags, style, tbarStyle); } virtual void DrawTextLine(wxDC& dc, const wxString& text, const wxRect& rect, @@ -902,4 +904,3 @@ private: }; #endif // _WX_UNIV_RENDERER_H_ - diff --git a/include/wx/univ/toolbar.h b/include/wx/univ/toolbar.h index 0d350f9ded..feb9ae4bc3 100644 --- a/include/wx/univ/toolbar.h +++ b/include/wx/univ/toolbar.h @@ -59,6 +59,8 @@ public: virtual bool Realize(); + virtual void SetWindowStyleFlag( long style ); + virtual wxToolBarToolBase *FindToolForPosition(wxCoord x, wxCoord y) const; virtual void SetToolShortHelp(int id, const wxString& helpString); diff --git a/src/univ/themes/gtk.cpp b/src/univ/themes/gtk.cpp index fceabaa12a..5d24b5c657 100644 --- a/src/univ/themes/gtk.cpp +++ b/src/univ/themes/gtk.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////////// -// Name: univ/themes/gtk.cpp +// Name: src/univ/themes/gtk.cpp // Purpose: wxUniversal theme implementing GTK-like LNF // Author: Vadim Zeitlin // Modified by: @@ -171,7 +171,8 @@ public: const wxBitmap& bitmap, const wxRect& rect, int flags = 0, - long style = 0); + long style = 0, + int tbarStyle = 0); virtual void DrawTextLine(wxDC& dc, const wxString& text, @@ -1683,7 +1684,8 @@ void wxGTKRenderer::DrawToolBarButton(wxDC& dc, const wxBitmap& bitmap, const wxRect& rectOrig, int flags, - long WXUNUSED(style)) + long WXUNUSED(style), + int tbarStyle) { // we don't draw the separators at all if ( !label.empty() || bitmap.Ok() ) @@ -1704,7 +1706,23 @@ void wxGTKRenderer::DrawToolBarButton(wxDC& dc, 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 #endif // wxUSE_BMPBUTTON #if wxUSE_BUTTON || wxUSE_TOGGLEBTN - if ( 0 + if ( 0 # if wxUSE_BUTTON - || wxDynamicCast(window, wxButton) + || wxDynamicCast(window, wxButton) # endif // wxUSE_BUTTON # if wxUSE_TOGGLEBTN - || wxDynamicCast(window, wxToggleButton) + || wxDynamicCast(window, wxToggleButton) # endif // wxUSE_TOGGLEBTN ) { diff --git a/src/univ/themes/win32.cpp b/src/univ/themes/win32.cpp index 5db2714dce..48959999ee 100644 --- a/src/univ/themes/win32.cpp +++ b/src/univ/themes/win32.cpp @@ -249,7 +249,8 @@ public: const wxBitmap& bitmap, const wxRect& rect, int flags = 0, - long style = 0); + long style = 0, + int tbarStyle = 0); virtual void DrawTextLine(wxDC& dc, const wxString& text, const wxRect& rect, @@ -2480,7 +2481,8 @@ void wxWin32Renderer::DrawToolBarButton(wxDC& dc, const wxBitmap& bitmap, const wxRect& rectOrig, int flags, - long style) + long style, + int tbarStyle) { if (style == wxTOOL_STYLE_BUTTON) { @@ -2496,7 +2498,23 @@ void wxWin32Renderer::DrawToolBarButton(wxDC& dc, 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) { diff --git a/src/univ/toolbar.cpp b/src/univ/toolbar.cpp index 644763e888..bdd436fc04 100644 --- a/src/univ/toolbar.cpp +++ b/src/univ/toolbar.cpp @@ -34,6 +34,7 @@ #include "wx/app.h" #include "wx/log.h" #include "wx/frame.h" + #include "wx/dc.h" #endif #include "wx/univ/renderer.h" @@ -375,8 +376,17 @@ wxRect wxToolBar::GetToolRect(wxToolBarToolBase *toolBase) const { if (tool->IsButton()) { - rect.width = m_defaultWidth; - rect.height = m_defaultHeight; + if(!HasFlag(wxTB_TEXT)) + { + 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()) { @@ -393,8 +403,17 @@ wxRect wxToolBar::GetToolRect(wxToolBarToolBase *toolBase) const { if (tool->IsButton()) { - rect.width = m_defaultWidth; - rect.height = m_defaultHeight; + if(!HasFlag(wxTB_TEXT)) + { + 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()) { @@ -427,6 +446,15 @@ bool wxToolBar::Realize() return true; } +void wxToolBar::SetWindowStyleFlag( long style ) +{ + wxToolBarBase::SetWindowStyleFlag(style); + + m_needsLayout = true; + + Refresh(); +} + void wxToolBar::DoLayout() { wxASSERT_MSG( m_needsLayout, _T("why are we called?") ); @@ -436,7 +464,8 @@ void wxToolBar::DoLayout() wxCoord x = m_xMargin, 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 *pCur = IsVertical() ? &y : &x; @@ -453,6 +482,32 @@ void wxToolBar::DoLayout() // TODO ugly number fiddling 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; } else if (tool->IsSeparator()) @@ -473,8 +528,26 @@ void wxToolBar::DoLayout() } // calculate the total toolbar size - wxCoord xMin = m_defaultWidth + 2*m_xMargin, - yMin = m_defaultHeight + 2*m_yMargin; + wxCoord xMin, yMin; + + 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_maxHeight = y < yMin ? yMin : y; @@ -550,7 +623,7 @@ void wxToolBar::DoDraw(wxControlRenderer *renderer) // prepare the variables used below wxDC& dc = renderer->GetDC(); 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 // we probably shouldn't draw it?) @@ -616,14 +689,28 @@ void wxToolBar::DoDraw(wxControlRenderer *renderer) wxBitmap bitmap; if ( !tool->IsSeparator() ) { - // label = tool->GetLabel(); + label = tool->GetLabel(); bitmap = tool->GetBitmap(); } //else: leave both the label and the bitmap invalid to draw a separator 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 {