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"
static GtkWidget *window = NULL;
static GtkWidget *infobar = NULL;
static GtkWidget *messagelabel = NULL;
static void
activate_action (GtkAction *action)
@ -43,23 +45,15 @@ activate_radio_action (GtkAction *action, GtkRadioAction *current)
if (active)
{
GtkWidget *dialog;
gchar *text;
dialog = gtk_message_dialog_new (GTK_WINDOW (window),
GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_INFO,
GTK_BUTTONS_CLOSE,
"You activated radio action: \"%s\" of type \"%s\".\n"
text = g_strdup_printf ("You activated radio action: \"%s\" of type \"%s\".\n"
"Current value: %d",
name, typename, value);
/* Close dialog on user response */
g_signal_connect (dialog,
"response",
G_CALLBACK (gtk_widget_destroy),
NULL);
gtk_widget_show (dialog);
gtk_label_set_text (GTK_LABEL (messagelabel), text);
gtk_info_bar_set_message_type (GTK_INFO_BAR (infobar), (GtkMessageType)value);
gtk_widget_show (infobar);
g_free (text);
}
}
@ -68,7 +62,10 @@ activate_email (GtkAboutDialog *about,
const gchar *link,
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
@ -453,7 +450,7 @@ do_appwindow (GtkWidget *do_widget)
G_CALLBACK (gtk_widget_destroyed),
&window);
table = gtk_table_new (1, 4, FALSE);
table = gtk_table_new (1, 5, FALSE);
gtk_container_add (GTK_CONTAINER (window), table);
@ -520,6 +517,25 @@ do_appwindow (GtkWidget *do_widget)
/* 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);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
@ -532,7 +548,7 @@ do_appwindow (GtkWidget *do_widget)
gtk_table_attach (GTK_TABLE (table),
sw,
/* X direction */ /* Y direction */
0, 1, 2, 3,
0, 1, 3, 4,
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
0, 0);
@ -551,7 +567,7 @@ do_appwindow (GtkWidget *do_widget)
gtk_table_attach (GTK_TABLE (table),
statusbar,
/* X direction */ /* Y direction */
0, 1, 3, 4,
0, 1, 4, 5,
GTK_EXPAND | GTK_FILL, 0,
0, 0);
@ -587,6 +603,8 @@ do_appwindow (GtkWidget *do_widget)
{
gtk_widget_destroy (window);
window = NULL;
infobar = NULL;
messagelabel = NULL;
}
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/gtkprogressbar.xml" />
<xi:include href="xml/gtkstatusbar.xml" />
<xi:include href="xml/gtkinfobar.xml" />
<xi:include href="xml/gtkstatusicon.xml" />
</chapter>

View File

@ -2588,6 +2588,35 @@ GTK_MESSAGE_DIALOG_GET_CLASS
gtk_message_dialog_get_type
</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>
<FILE>gtkmisc</FILE>
<TITLE>GtkMisc</TITLE>

View File

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

View File

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

View File

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

View File

@ -5155,6 +5155,23 @@ gtk_win32_embed_widget_get_type G_GNUC_CONST
#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
gtk_binary_age
gtk_interface_age

View File

@ -206,6 +206,15 @@ typedef enum
GTK_MENU_DIR_PREV
} GtkMenuDirectionType;
typedef enum
{
GTK_MESSAGE_INFO,
GTK_MESSAGE_WARNING,
GTK_MESSAGE_QUESTION,
GTK_MESSAGE_ERROR,
GTK_MESSAGE_OTHER
} GtkMessageType;
typedef enum
{
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__
#include <gtk/gtkdialog.h>
#include <gtk/gtkenums.h>
G_BEGIN_DECLS
typedef enum
{
GTK_MESSAGE_INFO,
GTK_MESSAGE_WARNING,
GTK_MESSAGE_QUESTION,
GTK_MESSAGE_ERROR,
GTK_MESSAGE_OTHER
} GtkMessageType;
typedef enum
{
GTK_BUTTONS_NONE,

View File

@ -2483,6 +2483,56 @@ test_file (const gchar *filename)
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
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/AddObjects", test_add_objects);
g_test_add_func ("/Builder/Menus", test_menus);
g_test_add_func ("/Builder/MessageArea", test_message_area);
return g_test_run();
}