X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/abdeb9e7006488bf917d90048fcd0cbe22f44a71..233387bdcbb1c4f31c54b0fe6b3f03e8d261cab1:/src/gtk/tbargtk.cpp diff --git a/src/gtk/tbargtk.cpp b/src/gtk/tbargtk.cpp index 61804aa048..05fb57e5e9 100644 --- a/src/gtk/tbargtk.cpp +++ b/src/gtk/tbargtk.cpp @@ -16,10 +16,6 @@ // headers // ---------------------------------------------------------------------------- -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) - #pragma implementation "tbargtk.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -32,8 +28,6 @@ #include #include "wx/gtk/private.h" -extern GdkFont *GtkGetDefaultGuiFont(); - // ---------------------------------------------------------------------------- // globals // ---------------------------------------------------------------------------- @@ -50,7 +44,7 @@ extern wxCursor g_globalCursor; // private functions // ---------------------------------------------------------------------------- -// translate wxWindows toolbar style flags to GTK orientation and style +// translate wxWidgets toolbar style flags to GTK orientation and style static void GetGtkStyle(long style, GtkOrientation *orient, GtkToolbarStyle *gtkStyle) { @@ -63,9 +57,7 @@ static void GetGtkStyle(long style, *gtkStyle = style & wxTB_NOICONS ? GTK_TOOLBAR_TEXT : ( -#ifdef __WXGTK20__ style & wxTB_HORZ_LAYOUT ? GTK_TOOLBAR_BOTH_HORIZ : -#endif // __WXGTK20__ GTK_TOOLBAR_BOTH); } else // no text, hence we must have the icons or what would we show? @@ -128,6 +120,19 @@ public: } } + void SetPixmap(const wxBitmap& bitmap) + { + if (bitmap.Ok()) + { + GdkBitmap *mask = bitmap.GetMask() ? bitmap.GetMask()->GetBitmap() + : (GdkBitmap *)NULL; + if (bitmap.HasPixbuf()) + gtk_image_set_from_pixbuf( GTK_IMAGE(m_pixmap), bitmap.GetPixbuf() ); + else + gtk_pixmap_set( GTK_PIXMAP(m_pixmap), bitmap.GetPixmap(), mask ); + } + } + GtkWidget *m_item; GtkWidget *m_pixmap; @@ -149,6 +154,7 @@ IMPLEMENT_DYNAMIC_CLASS(wxToolBar, wxControl) // "clicked" (internal from gtk_toolbar) //----------------------------------------------------------------------------- +extern "C" { static void gtk_toolbar_callback( GtkWidget *WXUNUSED(widget), wxToolBarTool *tool ) { @@ -166,16 +172,7 @@ static void gtk_toolbar_callback( GtkWidget *WXUNUSED(widget), { tool->Toggle(); - wxBitmap bitmap = tool->GetBitmap(); - if ( bitmap.Ok() ) - { - GtkPixmap *pixmap = GTK_PIXMAP( tool->m_pixmap ); - - GdkBitmap *mask = bitmap.GetMask() ? bitmap.GetMask()->GetBitmap() - : (GdkBitmap *)NULL; - - gtk_pixmap_set( pixmap, bitmap.GetPixmap(), mask ); - } + tool->SetPixmap(tool->GetBitmap()); if ( tool->IsRadio() && !tool->IsToggled() ) { @@ -189,23 +186,16 @@ static void gtk_toolbar_callback( GtkWidget *WXUNUSED(widget), // revert back tool->Toggle(); - wxBitmap bitmap = tool->GetBitmap(); - if ( bitmap.Ok() ) - { - GtkPixmap *pixmap = GTK_PIXMAP( tool->m_pixmap ); - - GdkBitmap *mask = bitmap.GetMask() ? bitmap.GetMask()->GetBitmap() - : (GdkBitmap *)NULL; - - gtk_pixmap_set( pixmap, bitmap.GetPixmap(), mask ); - } + tool->SetPixmap(tool->GetBitmap()); } } +} //----------------------------------------------------------------------------- // "enter_notify_event" / "leave_notify_event" //----------------------------------------------------------------------------- +extern "C" { static gint gtk_toolbar_tool_callback( GtkWidget *WXUNUSED(widget), GdkEventCrossing *gdk_event, wxToolBarTool *tool ) @@ -224,6 +214,7 @@ static gint gtk_toolbar_tool_callback( GtkWidget *WXUNUSED(widget), return FALSE; } +} //----------------------------------------------------------------------------- // InsertChild callback for wxToolBar @@ -269,18 +260,14 @@ wxToolBarToolBase *wxToolBar::CreateTool(wxControl *control) void wxToolBar::Init() { - m_fg = - m_bg = (GdkColor *)NULL; m_toolbar = (GtkToolbar *)NULL; - m_blockEvent = FALSE; + m_blockEvent = false; m_defaultWidth = 32; m_defaultHeight = 32; } wxToolBar::~wxToolBar() { - delete m_fg; - delete m_bg; } bool wxToolBar::Create( wxWindow *parent, @@ -290,7 +277,7 @@ bool wxToolBar::Create( wxWindow *parent, long style, const wxString& name ) { - m_needParent = TRUE; + m_needParent = true; m_insertCallback = (wxInsertChildFunction)wxInsertChildInToolBar; if ( !PreCreation( parent, pos, size ) || @@ -298,23 +285,15 @@ bool wxToolBar::Create( wxWindow *parent, { wxFAIL_MSG( wxT("wxToolBar creation failed") ); - return FALSE; + return false; } -#ifdef __WXGTK20__ m_toolbar = GTK_TOOLBAR( gtk_toolbar_new() ); GtkSetStyle(); // Doesn't work this way. // GtkToolbarSpaceStyle space_style = GTK_TOOLBAR_SPACE_EMPTY; // gtk_widget_style_set (GTK_WIDGET (m_toolbar), "space_style", &space_style, NULL); -#else - GtkOrientation orient; - GtkToolbarStyle gtkStyle; - GetGtkStyle(style, &orient, >kStyle); - - m_toolbar = GTK_TOOLBAR( gtk_toolbar_new(orient, gtkStyle) ); -#endif SetToolSeparation(7); @@ -338,44 +317,16 @@ bool wxToolBar::Create( wxWindow *parent, gtk_toolbar_set_tooltips( GTK_TOOLBAR(m_toolbar), TRUE ); // FIXME: there is no such function for toolbars in 2.0 -#ifndef __WXGTK20__ +#if 0 if (style & wxTB_FLAT) gtk_toolbar_set_button_relief( GTK_TOOLBAR(m_toolbar), GTK_RELIEF_NONE ); #endif - - m_fg = new GdkColor; - m_fg->red = 0; - m_fg->green = 0; - m_fg->blue = 0; - wxColour fg(0,0,0); - fg.CalcPixel( gtk_widget_get_colormap( GTK_WIDGET(m_toolbar) ) ); - m_fg->pixel = fg.GetPixel(); - - m_bg = new GdkColor; - m_bg->red = 65535; - m_bg->green = 65535; - m_bg->blue = 49980; - wxColour bg(255,255,196); - bg.CalcPixel( gtk_widget_get_colormap( GTK_WIDGET(m_toolbar) ) ); - m_bg->pixel = bg.GetPixel(); - - gtk_tooltips_force_window( GTK_TOOLBAR(m_toolbar)->tooltips ); - - GtkStyle *g_style = - gtk_style_copy( - gtk_widget_get_style( - GTK_TOOLBAR(m_toolbar)->tooltips->tip_window ) ); - - g_style->bg[GTK_STATE_NORMAL] = *m_bg; - - gtk_widget_set_style( GTK_TOOLBAR(m_toolbar)->tooltips->tip_window, g_style ); - m_parent->DoAddChild( this ); PostCreation(size); - return TRUE; + return true; } void wxToolBar::GtkSetStyle() @@ -400,13 +351,7 @@ bool wxToolBar::DoInsertTool(size_t pos, wxToolBarToolBase *toolBase) { wxToolBarTool *tool = (wxToolBarTool *)toolBase; -#ifndef __WXGTK20__ - // if we have inserted a space before all the tools we must change the GTK - // index by 1 - size_t posGtk = m_xMargin > 1 ? pos + 1 : pos; -#else size_t posGtk = pos; -#endif if ( tool->IsButton() ) { @@ -414,25 +359,35 @@ bool wxToolBar::DoInsertTool(size_t pos, wxToolBarToolBase *toolBase) { wxBitmap bitmap = tool->GetNormalBitmap(); - wxCHECK_MSG( bitmap.Ok(), FALSE, + wxCHECK_MSG( bitmap.Ok(), false, wxT("invalid bitmap for wxToolBar icon") ); - wxCHECK_MSG( bitmap.GetBitmap() == NULL, FALSE, + wxCHECK_MSG( bitmap.GetBitmap() == NULL, false, wxT("wxToolBar doesn't support GdkBitmap") ); - wxCHECK_MSG( bitmap.GetPixmap() != NULL, FALSE, + wxCHECK_MSG( bitmap.GetPixmap() != NULL, false, wxT("wxToolBar::Add needs a wxBitmap") ); GtkWidget *tool_pixmap = (GtkWidget *)NULL; - GdkPixmap *pixmap = bitmap.GetPixmap(); - GdkBitmap *mask = (GdkBitmap *)NULL; - if ( bitmap.GetMask() ) - mask = bitmap.GetMask()->GetBitmap(); + if (bitmap.HasPixbuf()) + { + tool_pixmap = gtk_image_new(); + tool->m_pixmap = tool_pixmap; + tool->SetPixmap(bitmap); + } + else + { + GdkPixmap *pixmap = bitmap.GetPixmap(); - tool_pixmap = gtk_pixmap_new( pixmap, mask ); - gtk_pixmap_set_build_insensitive( GTK_PIXMAP(tool_pixmap), TRUE ); + GdkBitmap *mask = (GdkBitmap *)NULL; + if ( bitmap.GetMask() ) + mask = bitmap.GetMask()->GetBitmap(); + + tool_pixmap = gtk_pixmap_new( pixmap, mask ); + gtk_pixmap_set_build_insensitive( GTK_PIXMAP(tool_pixmap), TRUE ); + } gtk_misc_set_alignment( GTK_MISC(tool_pixmap), 0.5, 0.5 ); @@ -453,15 +408,16 @@ bool wxToolBar::DoInsertTool(size_t pos, wxToolBarToolBase *toolBase) { wxToolBarToolsList::compatibility_iterator node = wxToolBarToolsList::compatibility_iterator(); - if ( pos ) node = m_tools.Item(pos - 1); + if ( pos ) + node = m_tools.Item(pos - 1); while ( node ) { - wxToolBarTool *tool = (wxToolBarTool *)node->GetData(); - if ( !tool->IsRadio() ) + wxToolBarTool *toolNext = (wxToolBarTool *)node->GetData(); + if ( !toolNext->IsRadio() ) break; - widget = tool->m_item; + widget = toolNext->m_item; node = node->GetPrevious(); } @@ -471,7 +427,7 @@ bool wxToolBar::DoInsertTool(size_t pos, wxToolBarToolBase *toolBase) // 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->Toggle(true); } } @@ -497,17 +453,15 @@ bool wxToolBar::DoInsertTool(size_t pos, wxToolBarToolBase *toolBase) { wxFAIL_MSG( _T("gtk_toolbar_insert_element() failed") ); - return FALSE; + 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 ); + g_signal_connect (tool->m_item, "enter_notify_event", + G_CALLBACK (gtk_toolbar_tool_callback), + tool); + g_signal_connect (tool->m_item, "leave_notify_event", + G_CALLBACK (gtk_toolbar_tool_callback), + tool); } break; @@ -515,7 +469,7 @@ bool wxToolBar::DoInsertTool(size_t pos, wxToolBarToolBase *toolBase) gtk_toolbar_insert_space( m_toolbar, posGtk ); // skip the rest - return TRUE; + return true; case wxTOOL_STYLE_CONTROL: gtk_toolbar_insert_widget( @@ -533,11 +487,12 @@ bool wxToolBar::DoInsertTool(size_t pos, wxToolBarToolBase *toolBase) (m_widget, &req ); m_width = req.width + m_xMargin; m_height = req.height + 2*m_yMargin; + InvalidateBestSize(); - return TRUE; + return true; } -bool wxToolBar::DoDeleteTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolBase) +bool wxToolBar::DoDeleteTool(size_t pos, wxToolBarToolBase *toolBase) { wxToolBarTool *tool = (wxToolBarTool *)toolBase; @@ -551,10 +506,13 @@ bool wxToolBar::DoDeleteTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolBase) gtk_widget_destroy( tool->m_item ); break; - //case wxTOOL_STYLE_SEPARATOR: -- nothing to do + case wxTOOL_STYLE_SEPARATOR: + gtk_toolbar_remove_space( m_toolbar, pos ); + break; } - return TRUE; + InvalidateBestSize(); + return true; } // ---------------------------------------------------------------------------- @@ -578,22 +536,13 @@ void wxToolBar::DoToggleTool( wxToolBarToolBase *toolBase, bool toggle ) GtkWidget *item = tool->m_item; if ( item && GTK_IS_TOGGLE_BUTTON(item) ) { - wxBitmap bitmap = tool->GetBitmap(); - if ( bitmap.Ok() ) - { - GtkPixmap *pixmap = GTK_PIXMAP( tool->m_pixmap ); + tool->SetPixmap(tool->GetBitmap()); - GdkBitmap *mask = bitmap.GetMask() ? bitmap.GetMask()->GetBitmap() - : (GdkBitmap *)NULL; - - gtk_pixmap_set( pixmap, bitmap.GetPixmap(), mask ); - } - - m_blockEvent = TRUE; + m_blockEvent = true; gtk_toggle_button_set_state( GTK_TOGGLE_BUTTON(item), toggle ); - m_blockEvent = FALSE; + m_blockEvent = false; } } @@ -622,11 +571,6 @@ void wxToolBar::SetMargins( int x, int y ) wxCHECK_RET( GetToolsCount() == 0, wxT("wxToolBar::SetMargins must be called before adding tools.") ); -#ifndef __WXGTK20__ - if (x > 1) - gtk_toolbar_append_space( m_toolbar ); // oh well -#endif - m_xMargin = x; m_yMargin = y; } @@ -634,7 +578,7 @@ void wxToolBar::SetMargins( int x, int y ) void wxToolBar::SetToolSeparation( int separation ) { // FIXME: this function disappeared -#ifndef __WXGTK20__ +#if 0 gtk_toolbar_set_space_size( m_toolbar, separation ); #endif @@ -703,4 +647,14 @@ void wxToolBar::OnInternalIdle() UpdateWindowUI(wxUPDATE_UI_FROMIDLE); } + +// ---------------------------------------------------------------------------- + +// static +wxVisualAttributes +wxToolBar::GetClassDefaultAttributes(wxWindowVariant WXUNUSED(variant)) +{ + return GetDefaultAttributesFromGTKWidget(gtk_toolbar_new); +} + #endif // wxUSE_TOOLBAR_NATIVE