fixes to toolbar, seems to work
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14430 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
parent
cb78397f14
commit
5a73d082f0
@ -129,11 +129,12 @@ private:
|
|||||||
wxCoord m_maxWidth,
|
wxCoord m_maxWidth,
|
||||||
m_maxHeight;
|
m_maxHeight;
|
||||||
|
|
||||||
// the current tool or NULL
|
// the tool over which the mouse currently is or NULL
|
||||||
wxToolBarToolBase *m_toolCurrent;
|
wxToolBarToolBase *m_toolCurrent;
|
||||||
|
|
||||||
// the currently pressed tool or NULL
|
// the tool which currently has the mouse capture (i.e. the one user is
|
||||||
wxToolBarToolBase *m_toolPressed;
|
// pressing) or NULL
|
||||||
|
wxToolBarTool *m_toolPressed;
|
||||||
|
|
||||||
DECLARE_DYNAMIC_CLASS(wxToolBar)
|
DECLARE_DYNAMIC_CLASS(wxToolBar)
|
||||||
};
|
};
|
||||||
|
@ -74,9 +74,7 @@ bool wxToolBarToolBase::Enable(bool enable)
|
|||||||
|
|
||||||
bool wxToolBarToolBase::Toggle(bool toggle)
|
bool wxToolBarToolBase::Toggle(bool toggle)
|
||||||
{
|
{
|
||||||
// wxUniv toolbar toggles even non-checkable tools temporarily - should we
|
wxASSERT_MSG( m_isToggle, _T("can't toggle this tool") );
|
||||||
// change the code there or just allow doing it?
|
|
||||||
//wxASSERT_MSG( m_isToggle, _T("can't toggle this tool") );
|
|
||||||
|
|
||||||
if ( m_toggled == toggle )
|
if ( m_toggled == toggle )
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -67,12 +67,30 @@ public:
|
|||||||
// no position yet
|
// no position yet
|
||||||
m_x =
|
m_x =
|
||||||
m_y = -1;
|
m_y = -1;
|
||||||
|
|
||||||
|
// not pressed yet
|
||||||
|
m_isInverted = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// is this tool pressed, even temporarily? (this is different from being
|
||||||
|
// permanently toggled which is what IsToggled() returns)
|
||||||
|
bool IsPressed() const
|
||||||
|
{ return CanBeToggled() ? IsToggled() != m_isInverted : m_isInverted; }
|
||||||
|
|
||||||
|
// are we temporarily pressed/unpressed?
|
||||||
|
bool IsInverted() const { return m_isInverted; }
|
||||||
|
|
||||||
|
// press the tool temporarily by inverting its toggle state
|
||||||
|
void Invert() { m_isInverted = !m_isInverted; }
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// the tool position (the size is known by the toolbar itself)
|
// the tool position (the size is known by the toolbar itself)
|
||||||
int m_x,
|
int m_x,
|
||||||
m_y;
|
m_y;
|
||||||
|
|
||||||
|
private:
|
||||||
|
// TRUE if the tool is pressed
|
||||||
|
bool m_isInverted;
|
||||||
};
|
};
|
||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
@ -96,7 +114,7 @@ void wxToolBar::Init()
|
|||||||
m_maxWidth =
|
m_maxWidth =
|
||||||
m_maxHeight = 0;
|
m_maxHeight = 0;
|
||||||
|
|
||||||
m_toolPressed =
|
m_toolPressed = NULL;
|
||||||
m_toolCurrent = NULL;
|
m_toolCurrent = NULL;
|
||||||
|
|
||||||
wxRenderer *renderer = GetRenderer();
|
wxRenderer *renderer = GetRenderer();
|
||||||
@ -467,7 +485,10 @@ void wxToolBar::DoDraw(wxControlRenderer *renderer)
|
|||||||
flags |= wxCONTROL_DISABLED;
|
flags |= wxCONTROL_DISABLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( tool->IsToggled() )
|
if ( tool == m_toolPressed )
|
||||||
|
flags |= wxCONTROL_FOCUSED;
|
||||||
|
|
||||||
|
if ( ((wxToolBarTool *)tool)->IsPressed() )
|
||||||
flags |= wxCONTROL_PRESSED;
|
flags |= wxCONTROL_PRESSED;
|
||||||
|
|
||||||
wxString label;
|
wxString label;
|
||||||
@ -491,43 +512,35 @@ void wxToolBar::Press()
|
|||||||
{
|
{
|
||||||
wxCHECK_RET( m_toolCurrent, _T("no tool to press?") );
|
wxCHECK_RET( m_toolCurrent, _T("no tool to press?") );
|
||||||
|
|
||||||
m_toolPressed = m_toolCurrent;
|
// this is the tool whose state is going to change
|
||||||
if ( !m_toolPressed->IsToggled() )
|
m_toolPressed = (wxToolBarTool *)m_toolCurrent;
|
||||||
{
|
|
||||||
m_toolPressed->Toggle(TRUE);
|
|
||||||
|
|
||||||
RefreshTool(m_toolPressed);
|
// we must toggle it regardless of whether it is a checkable tool or not,
|
||||||
}
|
// so use Invert() and not Toggle() here
|
||||||
|
m_toolPressed->Invert();
|
||||||
|
|
||||||
|
RefreshTool(m_toolPressed);
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxToolBar::Release()
|
void wxToolBar::Release()
|
||||||
{
|
{
|
||||||
wxCHECK_RET( m_toolPressed, _T("no tool to release?") );
|
wxCHECK_RET( m_toolPressed, _T("no tool to release?") );
|
||||||
|
|
||||||
if ( m_toolPressed->IsToggled() )
|
wxASSERT_MSG( m_toolPressed->IsInverted(), _T("release unpressed button?") );
|
||||||
{
|
|
||||||
m_toolPressed->Toggle(FALSE);
|
|
||||||
|
|
||||||
RefreshTool(m_toolPressed);
|
m_toolPressed->Invert();
|
||||||
|
|
||||||
m_toolPressed = NULL;
|
RefreshTool(m_toolPressed);
|
||||||
}
|
|
||||||
|
// we're going to lose the mouse capture
|
||||||
|
m_toolPressed = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxToolBar::Toggle()
|
void wxToolBar::Toggle()
|
||||||
{
|
{
|
||||||
wxCHECK_RET( m_toolPressed, _T("no tool to toggle?") );
|
|
||||||
|
|
||||||
// the togglable tools should keep their state when the mouse is released
|
|
||||||
if ( !m_toolPressed->CanBeToggled() )
|
|
||||||
{
|
|
||||||
m_toolPressed->Toggle();
|
|
||||||
}
|
|
||||||
|
|
||||||
RefreshTool(m_toolPressed);
|
|
||||||
|
|
||||||
m_toolCurrent = m_toolPressed;
|
m_toolCurrent = m_toolPressed;
|
||||||
m_toolPressed = NULL;
|
|
||||||
|
Release();
|
||||||
|
|
||||||
Click();
|
Click();
|
||||||
}
|
}
|
||||||
@ -536,7 +549,21 @@ void wxToolBar::Click()
|
|||||||
{
|
{
|
||||||
wxCHECK_RET( m_toolCurrent, _T("no tool to click?") );
|
wxCHECK_RET( m_toolCurrent, _T("no tool to click?") );
|
||||||
|
|
||||||
OnLeftClick(m_toolCurrent->GetId(), m_toolCurrent->IsToggled());
|
bool isToggled;
|
||||||
|
if ( m_toolCurrent->CanBeToggled() )
|
||||||
|
{
|
||||||
|
m_toolCurrent->Toggle();
|
||||||
|
|
||||||
|
RefreshTool(m_toolCurrent);
|
||||||
|
|
||||||
|
isToggled = m_toolCurrent->IsToggled();
|
||||||
|
}
|
||||||
|
else // simple non-checkable tool
|
||||||
|
{
|
||||||
|
isToggled = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
OnLeftClick(m_toolCurrent->GetId(), isToggled);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool wxToolBar::PerformAction(const wxControlAction& action,
|
bool wxToolBar::PerformAction(const wxControlAction& action,
|
||||||
|
Loading…
Reference in New Issue
Block a user