]> git.saurik.com Git - wxWidgets.git/commitdiff
radio toolbar buttons finally work
authorVadim Zeitlin <vadim@wxwidgets.org>
Tue, 26 Mar 2002 16:09:32 +0000 (16:09 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Tue, 26 Mar 2002 16:09:32 +0000 (16:09 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14795 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/gtk/tbargtk.cpp
src/gtk1/tbargtk.cpp

index a311d9aee94b7df36e8269eb19a08ce20dc42243..38a8fde2533d7fcd0c9190d0bbe339e43f2baf5b 100644 (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") );
 
-            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 );
+                    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 );
+            }
             break;
 
         case wxTOOL_STYLE_SEPARATOR:
index a311d9aee94b7df36e8269eb19a08ce20dc42243..38a8fde2533d7fcd0c9190d0bbe339e43f2baf5b 100644 (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") );
 
-            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 );
+                    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 );
+            }
             break;
 
         case wxTOOL_STYLE_SEPARATOR: