radio toolbar buttons finally work

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14795 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2002-03-26 16:09:32 +00:00
parent 705dd80af1
commit 38762f09cd
2 changed files with 144 additions and 52 deletions

View File

@@ -93,6 +93,11 @@ public:
Init();
}
// is this a radio button?
//
// unlike GetKind(), can be called for any kind of tools, not just buttons
bool IsRadio() const { return IsButton() && GetKind() == wxITEM_RADIO; }
// this is only called for the normal buttons, i.e. not separators nor
// controls
GtkToolbarChildType GetGtkChildType() const
@@ -162,6 +167,12 @@ static void gtk_toolbar_callback( GtkWidget *WXUNUSED(widget),
gtk_pixmap_set( pixmap, bitmap.GetPixmap(), mask );
}
if ( tool->IsRadio() && !tool->IsToggled() )
{
// radio button went up, don't report this as a wxWin event
return;
}
}
tbar->OnLeftClick( tool->GetId(), tool->IsToggled() );
@@ -397,35 +408,70 @@ bool wxToolBar::DoInsertTool(size_t pos, wxToolBarToolBase *toolBase)
switch ( tool->GetStyle() )
{
case wxTOOL_STYLE_BUTTON:
tool->m_item = gtk_toolbar_insert_element
(
m_toolbar,
tool->GetGtkChildType(),
(GtkWidget *)NULL,
tool->GetLabel().mbc_str(),
tool->GetShortHelp().mbc_str(),
"", // tooltip_private_text (?)
tool->m_pixmap,
(GtkSignalFunc)gtk_toolbar_callback,
(gpointer)tool,
pos
);
if ( !tool->m_item )
// for a radio button we need the widget which starts the radio
// group it belongs to, i.e. the first radio button immediately
// preceding this one
{
wxFAIL_MSG( _T("gtk_toolbar_insert_element() failed") );
GtkWidget *widget = NULL;
return FALSE;
if ( tool->IsRadio() )
{
wxToolBarToolsList::Node *node = pos ? m_tools.Item(pos - 1)
: NULL;
while ( node )
{
wxToolBarTool *tool = (wxToolBarTool *)node->GetData();
if ( !tool->IsRadio() )
break;
widget = tool->m_item;
node = node->GetPrevious();
}
if ( !widget )
{
// this is the first button in the radio button group,
// it will be toggled automatically by GTK so bring the
// internal flag in sync
tool->Toggle(TRUE);
}
}
tool->m_item = gtk_toolbar_insert_element
(
m_toolbar,
tool->GetGtkChildType(),
widget,
tool->GetLabel().empty()
? NULL
: tool->GetLabel().mbc_str(),
tool->GetShortHelp().empty()
? NULL
: tool->GetShortHelp().mbc_str(),
"", // tooltip_private_text (?)
tool->m_pixmap,
(GtkSignalFunc)gtk_toolbar_callback,
(gpointer)tool,
pos
);
if ( !tool->m_item )
{
wxFAIL_MSG( _T("gtk_toolbar_insert_element() failed") );
return FALSE;
}
gtk_signal_connect( GTK_OBJECT(tool->m_item),
"enter_notify_event",
GTK_SIGNAL_FUNC(gtk_toolbar_tool_callback),
(gpointer)tool );
gtk_signal_connect( GTK_OBJECT(tool->m_item),
"leave_notify_event",
GTK_SIGNAL_FUNC(gtk_toolbar_tool_callback),
(gpointer)tool );
}
gtk_signal_connect( GTK_OBJECT(tool->m_item),
"enter_notify_event",
GTK_SIGNAL_FUNC(gtk_toolbar_tool_callback),
(gpointer)tool );
gtk_signal_connect( GTK_OBJECT(tool->m_item),
"leave_notify_event",
GTK_SIGNAL_FUNC(gtk_toolbar_tool_callback),
(gpointer)tool );
break;
case wxTOOL_STYLE_SEPARATOR: