From: Vadim Zeitlin Date: Sun, 8 Oct 2006 13:08:51 +0000 (+0000) Subject: added GTK+ 2.6 implementation of wxAboutBox X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/a11a0ead4aeaf485a7d0ecf4928ee81bd9f9715b added GTK+ 2.6 implementation of wxAboutBox git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@41700 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/build/bakefiles/files.bkl b/build/bakefiles/files.bkl index 354b40d7f9..3dec836a35 100644 --- a/build/bakefiles/files.bkl +++ b/build/bakefiles/files.bkl @@ -2745,6 +2745,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file! + src/gtk/aboutdlg.cpp src/gtk/taskbar.cpp src/gtk/dataview.cpp src/gtk/eggtrayicon.c diff --git a/include/wx/aboutdlg.h b/include/wx/aboutdlg.h index a0342ccde7..3de6e10af8 100644 --- a/include/wx/aboutdlg.h +++ b/include/wx/aboutdlg.h @@ -60,7 +60,7 @@ public: // icon to be shown in the dialog, defaults to the main frame icon void SetIcon(const wxIcon& icon) { m_icon = icon; } bool HasIcon() const { return m_icon.Ok(); } - wxIcon GetIcon() const { return m_icon; } + wxIcon GetIcon() const; // web site for the program and its description (defaults to URL itself if // empty) diff --git a/src/generic/aboutdlgg.cpp b/src/generic/aboutdlgg.cpp index 4616aac0e5..25a324e74b 100644 --- a/src/generic/aboutdlgg.cpp +++ b/src/generic/aboutdlgg.cpp @@ -80,6 +80,20 @@ wxString wxAboutDialogInfo::GetDescriptionAndCredits() const return s; } +wxIcon wxAboutDialogInfo::GetIcon() const +{ + wxIcon icon = m_icon; + if ( !icon.Ok() && wxTheApp ) + { + const wxTopLevelWindow * const + tlw = wxDynamicCast(wxTheApp->GetTopWindow(), wxTopLevelWindow); + if ( tlw ) + icon = tlw->GetIcon(); + } + + return icon; +} + // ---------------------------------------------------------------------------- // wxAboutDialog // ---------------------------------------------------------------------------- @@ -125,14 +139,6 @@ bool wxAboutDialog::Create(const wxAboutDialogInfo& info) wxSizer *sizerIconAndText = new wxBoxSizer(wxHORIZONTAL); #if wxUSE_STATBMP wxIcon icon = info.GetIcon(); - if ( !icon.Ok() && wxTheApp ) - { - const wxTopLevelWindow * const - tlw = wxDynamicCast(wxTheApp->GetTopWindow(), wxTopLevelWindow); - if ( tlw ) - icon = tlw->GetIcon(); - } - if ( icon.Ok() ) { sizerIconAndText->Add(new wxStaticBitmap(this, wxID_ANY, icon), @@ -176,7 +182,7 @@ void wxGenericAboutBox(const wxAboutDialogInfo& info) // currently wxAboutBox is implemented natively only under these platforms, for // the others we provide a generic fallback here -#if !defined(__WXMSW__) && !defined(__WXMAC__) +#if !defined(__WXMSW__) && !defined(__WXMAC__) && !defined(__WXGTK26__) void wxAboutBox(const wxAboutDialogInfo& info) { diff --git a/src/gtk/aboutdlg.cpp b/src/gtk/aboutdlg.cpp new file mode 100644 index 0000000000..e801284c92 --- /dev/null +++ b/src/gtk/aboutdlg.cpp @@ -0,0 +1,113 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/gtk/aboutdlg.cpp +// Purpose: native GTK+ wxAboutBox() implementation +// Author: Vadim Zeitlin +// Created: 2006-10-08 +// RCS-ID: $Id$ +// Copyright: (c) 2006 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// for compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#if wxUSE_ABOUTDLG && defined(__WXGTK26__) + +#ifndef WX_PRECOMP +#endif //WX_PRECOMP + +#include "wx/aboutdlg.h" +#include "wx/generic/aboutdlgg.h" + +#include "wx/gtk/private.h" + +// ---------------------------------------------------------------------------- +// GtkArray: temporary array of GTK strings +// ---------------------------------------------------------------------------- + +class GtkArray +{ +public: + GtkArray(const wxArrayString& a) + { + m_count = a.size(); + m_strings = new const gchar *[m_count + 1]; + for ( size_t n = 0; n < m_count; n++ ) + m_strings[n] = wxGTK_CONV_SYS(a[n]).release(); + + // array must be NULL-terminated + m_strings[m_count] = NULL; + } + + operator const gchar **() const { return m_strings; } + + ~GtkArray() + { + for ( size_t n = 0; n < m_count; n++ ) + free(wx_const_cast(gchar *, m_strings[n])); + + delete [] m_strings; + } + +private: + const gchar **m_strings; + size_t m_count; + + DECLARE_NO_COPY_CLASS(GtkArray) +}; + +// ============================================================================ +// implementation +// ============================================================================ + +void wxAboutBox(const wxAboutDialogInfo& info) +{ + if ( !gtk_check_version(2,6,0) ) + { + GtkAboutDialog * const dlg = GTK_ABOUT_DIALOG(gtk_about_dialog_new()); + gtk_about_dialog_set_name(dlg, info.GetName()); + if ( info.HasVersion() ) + gtk_about_dialog_set_version(dlg, info.GetVersion()); + if ( info.HasCopyright() ) + gtk_about_dialog_set_copyright(dlg, info.GetCopyright()); + if ( info.HasDescription() ) + gtk_about_dialog_set_comments(dlg, info.GetDescription()); + if ( info.HasLicence() ) + gtk_about_dialog_set_license(dlg, info.GetLicence()); + + wxIcon icon = info.GetIcon(); + if ( icon.Ok() ) + gtk_about_dialog_set_logo(dlg, info.GetIcon().GetPixbuf()); + + if ( info.HasWebSite() ) + { + gtk_about_dialog_set_website(dlg, info.GetWebSiteURL()); + gtk_about_dialog_set_website_label(dlg, info.GetWebSiteDescription()); + } + + if ( info.HasDevelopers() ) + gtk_about_dialog_set_authors(dlg, GtkArray(info.GetDevelopers())); + if ( info.HasDocWriters() ) + gtk_about_dialog_set_documenters(dlg, GtkArray(info.GetDocWriters())); + if ( info.HasArtists() ) + gtk_about_dialog_set_artists(dlg, GtkArray(info.GetArtists())); + if ( info.HasTranslators() ) + gtk_about_dialog_set_translator_credits(dlg, _("translator-credits")); + + gtk_widget_show(GTK_WIDGET(dlg)); + return; + } + + // native about dialog not available, fall back to the generic one + wxGenericAboutBox(info); +} + +#endif // wxUSE_ABOUTDLG && GTK+ 2.6+