Add a message area widget

It is called GtkInfoBar. See bug 555344.
This commit is contained in:
Matthias Clasen
2009-06-05 14:56:08 -04:00
parent 4d7bbd058e
commit a85fac7145
12 changed files with 1596 additions and 97 deletions

View File

@ -8,6 +8,8 @@
#include "demo-common.h" #include "demo-common.h"
static GtkWidget *window = NULL; static GtkWidget *window = NULL;
static GtkWidget *infobar = NULL;
static GtkWidget *messagelabel = NULL;
static void static void
activate_action (GtkAction *action) activate_action (GtkAction *action)
@ -43,23 +45,15 @@ activate_radio_action (GtkAction *action, GtkRadioAction *current)
if (active) if (active)
{ {
GtkWidget *dialog; gchar *text;
dialog = gtk_message_dialog_new (GTK_WINDOW (window), text = g_strdup_printf ("You activated radio action: \"%s\" of type \"%s\".\n"
GTK_DIALOG_DESTROY_WITH_PARENT, "Current value: %d",
GTK_MESSAGE_INFO, name, typename, value);
GTK_BUTTONS_CLOSE, gtk_label_set_text (GTK_LABEL (messagelabel), text);
"You activated radio action: \"%s\" of type \"%s\".\n" gtk_info_bar_set_message_type (GTK_INFO_BAR (infobar), (GtkMessageType)value);
"Current value: %d", gtk_widget_show (infobar);
name, typename, value); g_free (text);
/* Close dialog on user response */
g_signal_connect (dialog,
"response",
G_CALLBACK (gtk_widget_destroy),
NULL);
gtk_widget_show (dialog);
} }
} }
@ -68,7 +62,10 @@ activate_email (GtkAboutDialog *about,
const gchar *link, const gchar *link,
gpointer data) gpointer data)
{ {
g_print ("send mail to %s\n", link); gchar *text;
text = g_strdup_printf ("send mail to %s", link);
g_print ("%s\n", text);
g_free (text);
} }
static void static void
@ -453,7 +450,7 @@ do_appwindow (GtkWidget *do_widget)
G_CALLBACK (gtk_widget_destroyed), G_CALLBACK (gtk_widget_destroyed),
&window); &window);
table = gtk_table_new (1, 4, FALSE); table = gtk_table_new (1, 5, FALSE);
gtk_container_add (GTK_CONTAINER (window), table); gtk_container_add (GTK_CONTAINER (window), table);
@ -520,6 +517,25 @@ do_appwindow (GtkWidget *do_widget)
/* Create document /* Create document
*/ */
infobar = gtk_info_bar_new ();
gtk_widget_set_no_show_all (infobar, TRUE);
messagelabel = gtk_label_new ("");
gtk_widget_show (messagelabel);
gtk_box_pack_start (GTK_BOX (gtk_info_bar_get_content_area (GTK_INFO_BAR (infobar))),
messagelabel,
TRUE, TRUE, 0);
gtk_info_bar_add_button (GTK_INFO_BAR (infobar),
GTK_STOCK_OK, GTK_RESPONSE_OK);
g_signal_connect (infobar, "response",
G_CALLBACK (gtk_widget_hide), NULL);
gtk_table_attach (GTK_TABLE (table),
infobar,
/* X direction */ /* Y direction */
0, 1, 2, 3,
GTK_EXPAND | GTK_FILL, 0,
0, 0);
sw = gtk_scrolled_window_new (NULL, NULL); sw = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
@ -532,7 +548,7 @@ do_appwindow (GtkWidget *do_widget)
gtk_table_attach (GTK_TABLE (table), gtk_table_attach (GTK_TABLE (table),
sw, sw,
/* X direction */ /* Y direction */ /* X direction */ /* Y direction */
0, 1, 2, 3, 0, 1, 3, 4,
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
0, 0); 0, 0);
@ -551,7 +567,7 @@ do_appwindow (GtkWidget *do_widget)
gtk_table_attach (GTK_TABLE (table), gtk_table_attach (GTK_TABLE (table),
statusbar, statusbar,
/* X direction */ /* Y direction */ /* X direction */ /* Y direction */
0, 1, 3, 4, 0, 1, 4, 5,
GTK_EXPAND | GTK_FILL, 0, GTK_EXPAND | GTK_FILL, 0,
0, 0); 0, 0);
@ -587,6 +603,8 @@ do_appwindow (GtkWidget *do_widget)
{ {
gtk_widget_destroy (window); gtk_widget_destroy (window);
window = NULL; window = NULL;
infobar = NULL;
messagelabel = NULL;
} }
return window; return window;

View File

@ -159,6 +159,7 @@ that is, GUI components such as #GtkButton or #GtkTextView.
<xi:include href="xml/gtklabel.xml" /> <xi:include href="xml/gtklabel.xml" />
<xi:include href="xml/gtkprogressbar.xml" /> <xi:include href="xml/gtkprogressbar.xml" />
<xi:include href="xml/gtkstatusbar.xml" /> <xi:include href="xml/gtkstatusbar.xml" />
<xi:include href="xml/gtkinfobar.xml" />
<xi:include href="xml/gtkstatusicon.xml" /> <xi:include href="xml/gtkstatusicon.xml" />
</chapter> </chapter>

View File

@ -2588,6 +2588,35 @@ GTK_MESSAGE_DIALOG_GET_CLASS
gtk_message_dialog_get_type gtk_message_dialog_get_type
</SECTION> </SECTION>
<SECTION>
<FILE>gtkinfobar</FILE>
<TITLE>GtkInfoBar</TITLE>
GtkInfoBar
gtk_info_bar_new
gtk_info_bar_new_with_buttons
gtk_info_bar_set_contents
gtk_info_bar_add_action_widget
gtk_info_bar_add_button
gtk_info_bar_add_buttons
gtk_info_bar_set_response_sensitive
gtk_info_bar_set_default_response
gtk_info_bar_response
gtk_info_bar_set_message_type
gtk_info_bar_get_message_type
<SUBSECTION Standard>
GTK_TYPE_INFO_BAR
GTK_INFO_BAR
GTK_INFO_BAR_CLASS
GTK_IS_INFO_BAR
GTK_IS_INFO_BAR_CLASS
GTK_INFO_BAR_GET_CLASS
<SUBSECTION Private>
gtk_info_bar_get_type
GtkMessageAreaPrivate
</SECTION>
<SECTION> <SECTION>
<FILE>gtkmisc</FILE> <FILE>gtkmisc</FILE>
<TITLE>GtkMisc</TITLE> <TITLE>GtkMisc</TITLE>

View File

@ -81,6 +81,7 @@ gtk_image_menu_item_get_type
gtk_im_context_get_type gtk_im_context_get_type
gtk_im_context_simple_get_type gtk_im_context_simple_get_type
gtk_im_multicontext_get_type gtk_im_multicontext_get_type
gtk_info_bar_get_type
gtk_input_dialog_get_type gtk_input_dialog_get_type
gtk_invisible_get_type gtk_invisible_get_type
gtk_item_factory_get_type gtk_item_factory_get_type

View File

@ -230,6 +230,7 @@ gtk_public_h_sources = \
gtkimcontextsimple.h \ gtkimcontextsimple.h \
gtkimmodule.h \ gtkimmodule.h \
gtkimmulticontext.h \ gtkimmulticontext.h \
gtkinfobar.h \
gtkinputdialog.h \ gtkinputdialog.h \
gtkinvisible.h \ gtkinvisible.h \
gtkitem.h \ gtkitem.h \
@ -486,6 +487,7 @@ gtk_base_c_sources = \
gtkimcontextsimple.c \ gtkimcontextsimple.c \
gtkimmodule.c \ gtkimmodule.c \
gtkimmulticontext.c \ gtkimmulticontext.c \
gtkinfobar.c \
gtkinputdialog.c \ gtkinputdialog.c \
gtkinvisible.c \ gtkinvisible.c \
gtkitem.c \ gtkitem.c \

View File

@ -110,6 +110,7 @@
#include <gtk/gtkimcontext.h> #include <gtk/gtkimcontext.h>
#include <gtk/gtkimcontextsimple.h> #include <gtk/gtkimcontextsimple.h>
#include <gtk/gtkimmulticontext.h> #include <gtk/gtkimmulticontext.h>
#include <gtk/gtkinfobar.h>
#include <gtk/gtkinputdialog.h> #include <gtk/gtkinputdialog.h>
#include <gtk/gtkinvisible.h> #include <gtk/gtkinvisible.h>
#include <gtk/gtkitem.h> #include <gtk/gtkitem.h>

View File

@ -5155,6 +5155,23 @@ gtk_win32_embed_widget_get_type G_GNUC_CONST
#endif #endif
#endif #endif
#if IN_HEADER(__GTK_INFO_BAR_H__)
#if IN_FILE(__GTK_INFO_BAR_C__)
gtk_info_bar_get_type G_GNUC_CONST
gtk_info_bar_new
gtk_info_bar_new_with_buttons
gtk_info_bar_get_action_area
gtk_info_bar_get_content_area
gtk_info_bar_add_action_widget
gtk_info_bar_add_button
gtk_info_bar_add_buttons
gtk_info_bar_set_response_sensitive
gtk_info_bar_set_default_response
gtk_info_bar_set_message_type
gtk_info_bar_get_message_type
#endif
#endif
#ifdef INCLUDE_VARIABLES #ifdef INCLUDE_VARIABLES
gtk_binary_age gtk_binary_age
gtk_interface_age gtk_interface_age

View File

@ -206,6 +206,15 @@ typedef enum
GTK_MENU_DIR_PREV GTK_MENU_DIR_PREV
} GtkMenuDirectionType; } GtkMenuDirectionType;
typedef enum
{
GTK_MESSAGE_INFO,
GTK_MESSAGE_WARNING,
GTK_MESSAGE_QUESTION,
GTK_MESSAGE_ERROR,
GTK_MESSAGE_OTHER
} GtkMessageType;
typedef enum typedef enum
{ {
GTK_PIXELS, GTK_PIXELS,

1262
gtk/gtkinfobar.c Normal file

File diff suppressed because it is too large Load Diff

116
gtk/gtkinfobar.h Normal file
View File

@ -0,0 +1,116 @@
/*
* gtkinfobar.h
* This file is part of GTK+
*
* Copyright (C) 2005 - Paolo Maggi
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
/*
* Modified by the gedit Team, 2005. See the gedit AUTHORS file for a
* list of people on the gedit Team.
* See the gedit ChangeLog files for a list of changes.
*
* Modified by the GTK+ Team, 2008-2009.
*/
#ifndef __GTK_INFO_BAR_H__
#define __GTK_INFO_BAR_H__
#include <gtk/gtkhbox.h>
#include <gtk/gtkenums.h>
G_BEGIN_DECLS
/*
* Type checking and casting macros
*/
#define GTK_TYPE_INFO_BAR (gtk_info_bar_get_type())
#define GTK_INFO_BAR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GTK_TYPE_INFO_BAR, GtkInfoBar))
#define GTK_INFO_BAR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GTK_TYPE_INFO_BAR, GtkInfoBarClass))
#define GTK_IS_INFO_BAR(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GTK_TYPE_INFO_BAR))
#define GTK_IS_INFO_BAR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_INFO_BAR))
#define GTK_INFO_BAR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GTK_TYPE_INFO_BAR, GtkInfoBarClass))
typedef struct _GtkInfoBarPrivate GtkInfoBarPrivate;
typedef struct _GtkInfoBarClass GtkInfoBarClass;
typedef struct _GtkInfoBar GtkInfoBar;
struct _GtkInfoBar
{
GtkHBox parent;
/*< private > */
GtkInfoBarPrivate *priv;
};
struct _GtkInfoBarClass
{
GtkHBoxClass parent_class;
/* Signals */
void (* response) (GtkInfoBar *info_bar, gint response_id);
/* Keybinding signals */
void (* close) (GtkInfoBar *info_bar);
/* Padding for future expansion */
void (*_gtk_reserved1) (void);
void (*_gtk_reserved2) (void);
void (*_gtk_reserved3) (void);
void (*_gtk_reserved4) (void);
void (*_gtk_reserved5) (void);
void (*_gtk_reserved6) (void);
};
GType gtk_info_bar_get_type (void) G_GNUC_CONST;
GtkWidget *gtk_info_bar_new (void);
GtkWidget *gtk_info_bar_new_with_buttons (const gchar *first_button_text,
...);
GtkWidget *gtk_info_bar_get_action_area (GtkInfoBar *info_bar);
GtkWidget *gtk_info_bar_get_content_area (GtkInfoBar *info_bar);
void gtk_info_bar_add_action_widget (GtkInfoBar *info_bar,
GtkWidget *child,
gint response_id);
GtkWidget *gtk_info_bar_add_button (GtkInfoBar *info_bar,
const gchar *button_text,
gint response_id);
void gtk_info_bar_add_buttons (GtkInfoBar *info_bar,
const gchar *first_button_text,
...);
void gtk_info_bar_set_response_sensitive (GtkInfoBar *info_bar,
gint response_id,
gboolean setting);
void gtk_info_bar_set_default_response (GtkInfoBar *info_bar,
gint response_id);
/* Emit response signal */
void gtk_info_bar_response (GtkInfoBar *info_bar,
gint response_id);
void gtk_info_bar_set_message_type (GtkInfoBar *info_bar,
GtkMessageType message_type);
GtkMessageType gtk_info_bar_get_message_type (GtkInfoBar *info_bar);
G_END_DECLS
#endif /* __GTK_INFO_BAR_H__ */

View File

@ -32,18 +32,10 @@
#define __GTK_MESSAGE_DIALOG_H__ #define __GTK_MESSAGE_DIALOG_H__
#include <gtk/gtkdialog.h> #include <gtk/gtkdialog.h>
#include <gtk/gtkenums.h>
G_BEGIN_DECLS G_BEGIN_DECLS
typedef enum
{
GTK_MESSAGE_INFO,
GTK_MESSAGE_WARNING,
GTK_MESSAGE_QUESTION,
GTK_MESSAGE_ERROR,
GTK_MESSAGE_OTHER
} GtkMessageType;
typedef enum typedef enum
{ {
GTK_BUTTONS_NONE, GTK_BUTTONS_NONE,

View File

@ -2483,6 +2483,56 @@ test_file (const gchar *filename)
builder = NULL; builder = NULL;
} }
static void
test_message_area (void)
{
GtkBuilder *builder;
GError *error;
GObject *obj, *obj1;
const gchar buffer[] =
"<interface>"
" <object class=\"GtkInfoBar\" id=\"infobar1\">"
" <child internal-child=\"content_area\">"
" <object class=\"GtkHBox\" id=\"contentarea1\">"
" <child>"
" <object class=\"GtkLabel\" id=\"content\">"
" <property name=\"label\" translatable=\"yes\">Message</property>"
" </object>"
" </child>"
" </object>"
" </child>"
" <child internal-child=\"action_area\">"
" <object class=\"GtkVButtonBox\" id=\"actionarea1\">"
" <child>"
" <object class=\"GtkButton\" id=\"button_ok\">"
" <property name=\"label\">gtk-ok</property>"
" <property name=\"use-stock\">yes</property>"
" </object>"
" </child>"
" </object>"
" </child>"
" <action-widgets>"
" <action-widget response=\"1\">button_ok</action-widget>"
" </action-widgets>"
" </object>"
"</interface>";
error = NULL;
builder = builder_new_from_string (buffer, -1, &error);
g_assert (error == NULL);
obj = gtk_builder_get_object (builder, "infobar1");
g_assert (GTK_IS_INFO_BAR (obj));
obj1 = gtk_builder_get_object (builder, "content");
g_assert (GTK_IS_LABEL (obj1));
g_assert (gtk_widget_get_parent (gtk_widget_get_parent (obj1)) == obj);
obj1 = gtk_builder_get_object (builder, "button_ok");
g_assert (GTK_IS_BUTTON (obj1));
g_assert (gtk_widget_get_parent (gtk_widget_get_parent (obj1)) == obj);
g_object_unref (builder);
}
int int
main (int argc, char **argv) main (int argc, char **argv)
{ {
@ -2525,6 +2575,7 @@ main (int argc, char **argv)
g_test_add_func ("/Builder/Requires", test_requires); g_test_add_func ("/Builder/Requires", test_requires);
g_test_add_func ("/Builder/AddObjects", test_add_objects); g_test_add_func ("/Builder/AddObjects", test_add_objects);
g_test_add_func ("/Builder/Menus", test_menus); g_test_add_func ("/Builder/Menus", test_menus);
g_test_add_func ("/Builder/MessageArea", test_message_area);
return g_test_run(); return g_test_run();
} }