📄 dyntbar.cpp
字号:
}void wxDynamicToolBar::OnPaint( wxPaintEvent& WXUNUSED(event) ){ // draw separators if any wxPaintDC dc(this); size_t i; for( i = 0; i != mTools.Count(); ++i ) { if ( mTools[i]->mIsSeparator ) { // check if separator doesn't have it's own window // if so, then draw it using built-in drawing method if ( !mTools[i]->mpToolWnd ) DrawSeparator( *mTools[i], dc ); } }}// FOR NOW:: quick fix#include "wx/choice.h"void wxDynamicToolBar::SizeToolWindows(){ bool bStateCheckDone = false; bool bHorzSeparator = false; int maxWidth = 0; int maxHeight = 0; size_t i; for( i = 0; i != mTools.Count(); ++i ) { wxDynToolInfo& info = *mTools[i]; if ( !info.mIsSeparator ) { // center real rectangle within the rectangle // provided by the layout manager int x = info.mRect.x; int y = info.mRect.y + (info.mRect.height - info.mRealSize.y)/2; // FOR NOW FOR NOW:: quick & dirty fix if ( info.mpToolWnd->IsKindOf( CLASSINFO( wxChoice ) ) ) { info.mpToolWnd->SetSize( x, y, info.mRealSize.x - 3, info.mRealSize.y); } else { info.mpToolWnd->SetSize( x, y, info.mRealSize.x, info.mRealSize.y ); } } else { // We performer this code here, so we only execute it when we have // separators and we do it only once (all to do with performance...) if (!bStateCheckDone) { bStateCheckDone = true; size_t j; wxDynToolInfo *pInfo; wxDynToolInfo *pPrevInfo = NULL; int nVertSeparators = 0; for( j = 0; j != mTools.Count(); ++j ) { pInfo = mTools[j]; // Count all Vert Separators. if ( pInfo->mIsSeparator ) nVertSeparators++; // Check if the new row starts with a Separator. if ( pPrevInfo && pInfo->mIsSeparator && // pPrevInfo->mRect.x >= pInfo->mRect.x && pPrevInfo->mRect.y < pInfo->mRect.y) { // If the Separator is shown on the next row and it's // the only object on the row it would mean that the // Separator should be shown as Horizontal one. if (j+1 != mTools.Count()) { if (pInfo->mRect.y < mTools[j+1]->mRect.y) nVertSeparators--; } else { nVertSeparators--; } } pPrevInfo = pInfo; maxWidth = wxMax(pInfo->mRect.width, maxWidth); maxHeight = wxMax(pInfo->mRect.height, maxHeight); } bHorzSeparator = nVertSeparators == 0; } // Check if we should draw Horz or Vert... if ( !bHorzSeparator ) { info.mRect.width = mSepartorSize; info.mRect.height = maxHeight; } else { info.mRect.width = maxWidth; info.mRect.height = mSepartorSize; } // Do we need to set a new size to a separator object? if ( info.mpToolWnd ) { info.mpToolWnd->SetSize( info.mRect.x, info.mRect.y, info.mRect.width, info.mRect.height); } } }}bool wxDynamicToolBar::Layout(){ int x,y; GetSize( &x, &y ); wxSize wndDim(x,y); wxSize result; size_t i; wxDynToolInfo *pInfo; // Reset the size of separators... for( i = 0; i != mTools.Count(); ++i ) { pInfo = mTools[i]; if ( pInfo->mIsSeparator ) { pInfo->mRect.width = mSepartorSize; pInfo->mRect.height = mSepartorSize; } } // Calc and set the best layout GetPreferredDim( wndDim, result ); SizeToolWindows(); return true;}void wxDynamicToolBar::GetPreferredDim( const wxSize& givenDim, wxSize& prefDim ){ if ( !mpLayoutMan ) mpLayoutMan = CreateDefaultLayout(); wxLayoutItemArrayT items; // safe conversion size_t i; for( i = 0; i != mTools.Count(); ++i ) items.Add( mTools[i] ); mpLayoutMan->Layout( givenDim, prefDim, items, mVertGap, mHorizGap );}void wxDynamicToolBar::SetLayout( LayoutManagerBase* pLayout ){ if ( mpLayoutMan ) delete mpLayoutMan; mpLayoutMan = pLayout; Layout();}void wxDynamicToolBar::EnableTool(int toolIndex, bool enable ){ wxDynToolInfo* pInfo = GetToolInfo( toolIndex ); if ( !pInfo ) return; if ( pInfo->mIsSeparator || !pInfo->mpToolWnd ) return; pInfo->mpToolWnd->Enable( enable );}/***** Implementation for class BagLayout *****/void BagLayout::Layout( const wxSize& parentDim, wxSize& resultingDim, wxLayoutItemArrayT& items, int horizGap, int vertGap ){ int maxWidth = 0; int curY = 0; int nRows = 0; size_t i = 0; while( i < items.Count() ) { int curX = 0; int height = 0; // int nItems = 0; // int firstItem = i; int itemsInRow = 0; if ( nRows > 0 ) curY += vertGap; // step #1 - arrange horizontal positions of items in the row do { if ( itemsInRow > 0 ) curX += horizGap; wxRect& r = items[i]->mRect; if ( curX + r.width > parentDim.x ) { if ( itemsInRow > 0 ) break; } r.x = curX; r.y = curY; curX += r.width; height = wxMax( height, r.height ); ++itemsInRow; ++i; } while( i < items.Count() ); curY += height; maxWidth = wxMax( maxWidth, curX ); } resultingDim.x = maxWidth; resultingDim.y = curY;}//////// stuff from 2.1.15 ///////////wxToolBarToolBase* wxDynamicToolBar::FindToolForPosition( wxCoord WXUNUSED(x), wxCoord WXUNUSED(y) ) const{ return NULL;}bool wxDynamicToolBar::DoInsertTool( size_t WXUNUSED(pos), wxToolBarToolBase* WXUNUSED(tool) ){ return true;}bool wxDynamicToolBar::DoDeleteTool( size_t WXUNUSED(pos), wxToolBarToolBase* WXUNUSED(tool) ){ return true;}void wxDynamicToolBar::DoEnableTool( wxToolBarToolBase* WXUNUSED(tool), bool WXUNUSED(enable) ){}void wxDynamicToolBar::DoToggleTool( wxToolBarToolBase* WXUNUSED(tool), bool WXUNUSED(toggle) ){}void wxDynamicToolBar::DoSetToggle( wxToolBarToolBase* WXUNUSED(tool), bool WXUNUSED(toggle) ){}wxToolBarToolBase* wxDynamicToolBar::CreateTool( int WXUNUSED(id), const wxString& WXUNUSED(label), const wxBitmap& WXUNUSED(bmpNormal), const wxBitmap& WXUNUSED(bmpDisabled), wxItemKind WXUNUSED(kind), wxObject *WXUNUSED(clientData), const wxString& WXUNUSED(shortHelp), const wxString& WXUNUSED(longHelp) ){ return NULL;}wxToolBarToolBase* wxDynamicToolBar::CreateTool( wxControl* WXUNUSED(control) ){ return NULL;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -