aboutsummaryrefslogtreecommitdiffstats
path: root/widgets
diff options
context:
space:
mode:
Diffstat (limited to 'widgets')
-rw-r--r--widgets/misc/ChangeLog14
-rw-r--r--widgets/misc/e-title-bar.c221
-rw-r--r--widgets/misc/e-title-bar.h30
3 files changed, 209 insertions, 56 deletions
diff --git a/widgets/misc/ChangeLog b/widgets/misc/ChangeLog
index 1261de9ef8..a50bbd1dfd 100644
--- a/widgets/misc/ChangeLog
+++ b/widgets/misc/ChangeLog
@@ -1,3 +1,17 @@
+2000-09-29 Ettore Perazzoli <ettore@helixcode.com>
+
+ * e-title-bar.c: New member `pin_gtk_pixmap' in
+ `ETitleBarPrivate'. Signal "close_button_clicked" renamed to
+ "button_clicked". Signal "title_button_press_event" renamed to
+ "label_button_press_event".
+ (init): Init new members.
+ (close_button_realize_cb): Create the pin pixmap. Call
+ `show_and_hide_pixmaps_according_to_mode()'.
+ (e_title_bar_show_close_button): Renamed to
+ `e_title_bar_show_button'.
+ (e_title_bar_get_button_mode): New.
+ (e_title_bar_set_button_mode): New.
+
2000-09-23 Damon Chaplin <damon@helixcode.com>
* e-calendar.c: use pixmaps instead of GtkArrows to look better.
diff --git a/widgets/misc/e-title-bar.c b/widgets/misc/e-title-bar.c
index 613df2dcde..8ca6885ccf 100644
--- a/widgets/misc/e-title-bar.c
+++ b/widgets/misc/e-title-bar.c
@@ -40,14 +40,16 @@
enum {
- TITLE_BUTTON_PRESS_EVENT,
- CLOSE_BUTTON_CLICKED,
+ LABEL_BUTTON_PRESS_EVENT,
+ BUTTON_CLICKED,
LAST_SIGNAL
};
static guint signals[LAST_SIGNAL] = { 0 };
-static char *close_button_xpm[] = {
+/* The pixmaps. */
+
+static char *close_xpm[] = {
"12 12 2 1",
" c none",
". c #000000000000",
@@ -65,54 +67,152 @@ static char *close_button_xpm[] = {
" "
};
+static char *pin_xpm[] = {
+ "16 16 33 1",
+ " c None",
+ ". c #000000",
+ "+ c #74744D",
+ "@ c #B2B279",
+ "# c #6C6C46",
+ "$ c #CACA9C",
+ "% c #F4F4AD",
+ "& c #85855A",
+ "* c #B1B175",
+ "= c #9A9A66",
+ "- c #A9A98A",
+ "; c #B0B07B",
+ "> c #535353",
+ ", c #818181",
+ "' c #B7B7B7",
+ ") c #D8D8D8",
+ "! c #FFFFFF",
+ "~ c #EBEBA1",
+ "{ c #8A8A75",
+ "] c #9F9F76",
+ "^ c #9E9E75",
+ "/ c #8A8A66",
+ "( c #979770",
+ "_ c #6B6B46",
+ ": c #28281A",
+ "< c #505034",
+ "[ c #666645",
+ "} c #61614D",
+ "| c #818155",
+ "1 c #4A4A31",
+ "2 c #4D4D34",
+ "3 c #6C6C48",
+ "4 c #5D5D3E",
+ " ",
+ " ",
+ " ",
+ " . . ",
+ " .. .+. ",
+ " .@...#$. ",
+ " ......%&*=-;. ",
+ ".>,')!.~{]^/(. ",
+ " ......_:<[}|. ",
+ " .1...23. ",
+ " .. .4. ",
+ " . . ",
+ " ",
+ " ",
+ " ",
+ " "
+};
+
+
#define PARENT_TYPE GTK_TYPE_FRAME
static GtkFrameClass *parent_class = NULL;
struct _ETitleBarPrivate {
+ ETitleBarButtonMode button_mode;
GtkWidget *label;
- GtkWidget *close_button;
- GtkWidget *close_button_gtk_pixmap;
+ GtkWidget *button;
+ GtkWidget *close_gtk_pixmap;
+ GtkWidget *pin_gtk_pixmap;
};
+/* Mode handling. We put both the close and pin GtkPixmaps into an hbox in the
+ button, and hide one of them according to the mode. */
+
+static void
+show_and_hide_pixmaps_according_to_mode (ETitleBar *title_bar)
+{
+ ETitleBarPrivate *priv;
+
+ priv = title_bar->priv;
+
+ if (priv->close_gtk_pixmap == NULL || priv->pin_gtk_pixmap == NULL)
+ return;
+
+ switch (priv->button_mode) {
+ case E_TITLE_BAR_BUTTON_MODE_PIN:
+ gtk_widget_hide (priv->close_gtk_pixmap);
+ gtk_widget_show (priv->pin_gtk_pixmap);
+ break;
+ case E_TITLE_BAR_BUTTON_MODE_CLOSE:
+ gtk_widget_hide (priv->pin_gtk_pixmap);
+ gtk_widget_show (priv->close_gtk_pixmap);
+ break;
+ default:
+ g_assert_not_reached ();
+ }
+}
+
+
/* Child signal callbacks. */
static void
-close_button_realize_cb (GtkWidget *widget,
- gpointer data)
+button_realize_cb (GtkWidget *widget,
+ gpointer data)
{
- GdkPixmap *close_button_pixmap;
- GdkBitmap *close_button_mask;
+ GdkPixmap *close_pixmap;
+ GdkBitmap *close_mask;
+ GdkPixmap *pin_pixmap;
+ GdkBitmap *pin_mask;
+ GtkWidget *hbox;
ETitleBar *title_bar;
ETitleBarPrivate *priv;
title_bar = E_TITLE_BAR (data);
priv = title_bar->priv;
- if (priv->close_button_gtk_pixmap != NULL)
+ if (priv->close_gtk_pixmap != NULL)
return;
- close_button_pixmap = gdk_pixmap_create_from_xpm_d (GTK_WIDGET (priv->close_button)->window,
- &close_button_mask,
- NULL, close_button_xpm);
- priv->close_button_gtk_pixmap = gtk_pixmap_new (close_button_pixmap, close_button_mask);
+ close_pixmap = gdk_pixmap_create_from_xpm_d (GTK_WIDGET (priv->button)->window,
+ &close_mask, NULL, close_xpm);
+ priv->close_gtk_pixmap = gtk_pixmap_new (close_pixmap, close_mask);
+
+ pin_pixmap = gdk_pixmap_create_from_xpm_d (GTK_WIDGET (priv->button)->window,
+ &pin_mask, NULL, pin_xpm);
+ priv->pin_gtk_pixmap = gtk_pixmap_new (pin_pixmap, pin_mask);
+
+ hbox = gtk_hbox_new (TRUE, 0);
+ gtk_widget_show (hbox);
+ gtk_box_pack_start (GTK_BOX (hbox), priv->pin_gtk_pixmap, TRUE, TRUE, 0);
+ gtk_box_pack_start (GTK_BOX (hbox), priv->close_gtk_pixmap, TRUE, TRUE, 0);
- gtk_container_add (GTK_CONTAINER (priv->close_button), priv->close_button_gtk_pixmap);
- gtk_widget_show (priv->close_button_gtk_pixmap);
+ gtk_container_add (GTK_CONTAINER (priv->button), hbox);
- gdk_pixmap_unref (close_button_pixmap);
- gdk_bitmap_unref (close_button_mask);
+ gdk_pixmap_unref (close_pixmap);
+ gdk_bitmap_unref (close_mask);
+ gdk_pixmap_unref (pin_pixmap);
+ gdk_bitmap_unref (pin_mask);
+
+ show_and_hide_pixmaps_according_to_mode (title_bar);
}
static void
-close_button_clicked_cb (GtkButton *button,
- gpointer data)
+button_clicked_cb (GtkButton *button,
+ gpointer data)
{
ETitleBar *title_bar;
title_bar = E_TITLE_BAR (data);
- gtk_signal_emit (GTK_OBJECT (title_bar), signals[CLOSE_BUTTON_CLICKED]);
+ gtk_signal_emit (GTK_OBJECT (title_bar), signals[BUTTON_CLICKED]);
}
static void
@@ -124,7 +224,7 @@ label_button_press_event_cb (GtkWidget *widget,
title_bar = E_TITLE_BAR (data);
- gtk_signal_emit (GTK_OBJECT (title_bar), signals[TITLE_BUTTON_PRESS_EVENT], event);
+ gtk_signal_emit (GTK_OBJECT (title_bar), signals[LABEL_BUTTON_PRESS_EVENT], event);
}
@@ -155,20 +255,20 @@ class_init (ETitleBarClass *klass)
parent_class = gtk_type_class (gtk_frame_get_type ());
- signals[TITLE_BUTTON_PRESS_EVENT] =
- gtk_signal_new ("title_button_press_event",
+ signals[LABEL_BUTTON_PRESS_EVENT] =
+ gtk_signal_new ("label_button_press_event",
GTK_RUN_FIRST,
object_class->type,
- GTK_SIGNAL_OFFSET (ETitleBarClass, title_button_press_event),
+ GTK_SIGNAL_OFFSET (ETitleBarClass, label_button_press_event),
gtk_marshal_NONE__POINTER,
GTK_TYPE_NONE, 1,
GTK_TYPE_GDK_EVENT);
- signals[CLOSE_BUTTON_CLICKED] =
- gtk_signal_new ("close_button_clicked",
+ signals[BUTTON_CLICKED] =
+ gtk_signal_new ("button_clicked",
GTK_RUN_FIRST,
object_class->type,
- GTK_SIGNAL_OFFSET (ETitleBarClass, close_button_clicked),
+ GTK_SIGNAL_OFFSET (ETitleBarClass, button_clicked),
gtk_marshal_NONE__NONE,
GTK_TYPE_NONE, 0);
@@ -182,9 +282,11 @@ init (ETitleBar *title_bar)
priv = g_new (ETitleBarPrivate, 1);
- priv->label = NULL;
- priv->close_button = NULL;
- priv->close_button_gtk_pixmap = NULL;
+ priv->button_mode = E_TITLE_BAR_BUTTON_MODE_CLOSE;
+ priv->label = NULL;
+ priv->button = NULL;
+ priv->close_gtk_pixmap = NULL;
+ priv->pin_gtk_pixmap = NULL;
title_bar->priv = priv;
}
@@ -206,23 +308,23 @@ e_title_bar_construct (ETitleBar *title_bar,
gtk_misc_set_alignment (GTK_MISC (priv->label), 0.0, 0.5);
gtk_widget_show (priv->label);
- priv->close_button = gtk_button_new ();
- GTK_WIDGET_UNSET_FLAGS (priv->close_button, GTK_CAN_FOCUS);
- gtk_container_set_border_width (GTK_CONTAINER (priv->close_button), 1);
- gtk_button_set_relief (GTK_BUTTON (priv->close_button), GTK_RELIEF_NONE);
- gtk_widget_show (priv->close_button);
+ priv->button = gtk_button_new ();
+ GTK_WIDGET_UNSET_FLAGS (priv->button, GTK_CAN_FOCUS);
+ gtk_container_set_border_width (GTK_CONTAINER (priv->button), 1);
+ gtk_button_set_relief (GTK_BUTTON (priv->button), GTK_RELIEF_NONE);
+ gtk_widget_show (priv->button);
hbox = gtk_hbox_new (FALSE, 0);
gtk_box_pack_start (GTK_BOX (hbox), priv->label, TRUE, TRUE, 2);
- gtk_box_pack_start (GTK_BOX (hbox), priv->close_button, FALSE, TRUE, 1);
+ gtk_box_pack_start (GTK_BOX (hbox), priv->button, FALSE, TRUE, 1);
gtk_widget_show (hbox);
gtk_container_add (GTK_CONTAINER (title_bar), hbox);
- gtk_signal_connect (GTK_OBJECT (priv->close_button), "realize",
- GTK_SIGNAL_FUNC (close_button_realize_cb), title_bar);
- gtk_signal_connect (GTK_OBJECT (priv->close_button), "clicked",
- GTK_SIGNAL_FUNC (close_button_clicked_cb), title_bar);
+ gtk_signal_connect (GTK_OBJECT (priv->button), "realize",
+ GTK_SIGNAL_FUNC (button_realize_cb), title_bar);
+ gtk_signal_connect (GTK_OBJECT (priv->button), "clicked",
+ GTK_SIGNAL_FUNC (button_clicked_cb), title_bar);
gtk_signal_connect (GTK_OBJECT (priv->label), "button_press_event",
GTK_SIGNAL_FUNC (label_button_press_event_cb), title_bar);
}
@@ -251,8 +353,8 @@ e_title_bar_set_title (ETitleBar *title_bar,
}
void
-e_title_bar_show_close_button (ETitleBar *title_bar,
- gboolean show)
+e_title_bar_show_button (ETitleBar *title_bar,
+ gboolean show)
{
ETitleBarPrivate *priv;
@@ -262,9 +364,38 @@ e_title_bar_show_close_button (ETitleBar *title_bar,
priv = title_bar->priv;
if (show)
- gtk_widget_show (priv->close_button);
+ gtk_widget_show (priv->button);
else
- gtk_widget_hide (priv->close_button);
+ gtk_widget_hide (priv->button);
+}
+
+void
+e_title_bar_set_button_mode (ETitleBar *title_bar,
+ ETitleBarButtonMode button_mode)
+{
+ ETitleBarPrivate *priv;
+
+ g_return_if_fail (title_bar != NULL);
+ g_return_if_fail (E_IS_TITLE_BAR (title_bar));
+ g_return_if_fail (button_mode == E_TITLE_BAR_BUTTON_MODE_CLOSE
+ || button_mode == E_TITLE_BAR_BUTTON_MODE_PIN);
+
+ priv = title_bar->priv;
+
+ if (priv->button_mode == button_mode)
+ return;
+
+ priv->button_mode = button_mode;
+ show_and_hide_pixmaps_according_to_mode (title_bar);
+}
+
+ETitleBarButtonMode
+e_title_bar_get_button_mode (ETitleBar *title_bar)
+{
+ g_return_val_if_fail (title_bar != NULL, E_TITLE_BAR_BUTTON_MODE_CLOSE);
+ g_return_val_if_fail (E_IS_TITLE_BAR (title_bar), E_TITLE_BAR_BUTTON_MODE_CLOSE);
+
+ return title_bar->priv->button_mode;
}
diff --git a/widgets/misc/e-title-bar.h b/widgets/misc/e-title-bar.h
index ce7d23b07b..f91e76c889 100644
--- a/widgets/misc/e-title-bar.h
+++ b/widgets/misc/e-title-bar.h
@@ -42,6 +42,12 @@ extern "C" {
#define E_IS_TITLE_BAR_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_TITLE_BAR))
+enum _ETitleBarButtonMode {
+ E_TITLE_BAR_BUTTON_MODE_PIN,
+ E_TITLE_BAR_BUTTON_MODE_CLOSE
+};
+typedef enum _ETitleBarButtonMode ETitleBarButtonMode;
+
typedef struct _ETitleBar ETitleBar;
typedef struct _ETitleBarPrivate ETitleBarPrivate;
typedef struct _ETitleBarClass ETitleBarClass;
@@ -57,20 +63,22 @@ struct _ETitleBarClass {
/* Signals. */
- void (* title_button_press_event) (ETitleBar *title_bar, GdkEventButton *event);
- void (* close_button_clicked) (ETitleBar *title_bar);
+ void (* label_button_press_event) (ETitleBar *title_bar, GdkEventButton *event);
+ void (* button_clicked) (ETitleBar *title_bar);
};
-GtkType e_title_bar_get_type (void);
-void e_title_bar_construct (ETitleBar *title_bar,
- const char *title);
-GtkWidget *e_title_bar_new (const char *title);
-
-void e_title_bar_set_title (ETitleBar *title_bar,
- const char *title);
-void e_title_bar_show_close_button (ETitleBar *title_bar,
- gboolean show);
+GtkType e_title_bar_get_type (void);
+void e_title_bar_construct (ETitleBar *title_bar,
+ const char *title);
+GtkWidget *e_title_bar_new (const char *title);
+void e_title_bar_set_title (ETitleBar *title_bar,
+ const char *title);
+void e_title_bar_show_button (ETitleBar *title_bar,
+ gboolean show);
+void e_title_bar_set_button_mode (ETitleBar *title_bar,
+ ETitleBarButtonMode button_mode);
+ETitleBarButtonMode e_title_bar_get_button_mode (ETitleBar *title_bar);
#ifdef __cplusplus
}