300 lines
8.4 KiB
C
300 lines
8.4 KiB
C
/* -*- mode: c; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/*
|
|
* gcal-new-event-widget.c
|
|
* Copyright (C) 2012 Erick Pérez Castellanos <erickpc@gnome.org>
|
|
* Copyright (C) 2014 Georges Basile Stavracas Neto <georges.stavracas@gmail.com>
|
|
*
|
|
* gnome-calendar is free software: you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License as published by the
|
|
* Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* gnome-calendar 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 General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along
|
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#include "gcal-new-event-widget.h"
|
|
#include "gcal-utils.h"
|
|
|
|
typedef struct
|
|
{
|
|
GtkWidget *title_label;
|
|
GtkWidget *what_entry;
|
|
GtkWidget *calendar_button;
|
|
GtkWidget *create_button;
|
|
GtkWidget *details_button;
|
|
} GcalNewEventWidgetPrivate;
|
|
|
|
static void item_activated (GtkWidget *item,
|
|
gpointer user_data);
|
|
|
|
G_DEFINE_TYPE_WITH_PRIVATE (GcalNewEventWidget, gcal_new_event_widget, GTK_TYPE_GRID)
|
|
|
|
static void
|
|
item_activated (GtkWidget *item,
|
|
gpointer user_data)
|
|
{
|
|
GcalNewEventWidgetPrivate *priv;
|
|
|
|
gchar *uid;
|
|
gchar *color_name;
|
|
GdkRGBA color;
|
|
|
|
GdkPixbuf *pix;
|
|
GtkWidget *image;
|
|
|
|
priv = gcal_new_event_widget_get_instance_private (
|
|
GCAL_NEW_EVENT_WIDGET (user_data));
|
|
|
|
uid = g_object_get_data (G_OBJECT (item), "calendar-uid");
|
|
color_name = g_object_get_data (G_OBJECT (item), "color");
|
|
gdk_rgba_parse (&color, color_name);
|
|
|
|
pix = gcal_get_pixbuf_from_color (&color, 16);
|
|
image = gtk_image_new_from_pixbuf (pix);
|
|
gtk_button_set_image (GTK_BUTTON (priv->calendar_button), image);
|
|
|
|
/* saving the value */
|
|
g_object_set_data (G_OBJECT (priv->calendar_button),
|
|
"calendar-uid", uid);
|
|
g_object_unref (pix);
|
|
}
|
|
|
|
static void
|
|
gcal_new_event_widget_class_init (GcalNewEventWidgetClass *klass)
|
|
{
|
|
GtkWidgetClass *widget_class;
|
|
|
|
widget_class = GTK_WIDGET_CLASS (klass);
|
|
|
|
/* Setup the template GtkBuilder xml for this class */
|
|
gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/calendar/new-event.ui");
|
|
|
|
/* Bind internals widgets */
|
|
gtk_widget_class_bind_template_child_private (widget_class, GcalNewEventWidget, title_label);
|
|
gtk_widget_class_bind_template_child_private (widget_class, GcalNewEventWidget, what_entry);
|
|
gtk_widget_class_bind_template_child_private (widget_class, GcalNewEventWidget, calendar_button);
|
|
gtk_widget_class_bind_template_child_private (widget_class, GcalNewEventWidget, create_button);
|
|
gtk_widget_class_bind_template_child_private (widget_class, GcalNewEventWidget, details_button);
|
|
|
|
}
|
|
|
|
static void
|
|
gcal_new_event_widget_init (GcalNewEventWidget *self)
|
|
{
|
|
gtk_widget_init_template (GTK_WIDGET (self));
|
|
}
|
|
|
|
/* Public API */
|
|
GtkWidget*
|
|
gcal_new_event_widget_new (void)
|
|
{
|
|
return g_object_new (GCAL_TYPE_NEW_EVENT_WIDGET, NULL);
|
|
}
|
|
|
|
void
|
|
gcal_new_event_widget_set_title (GcalNewEventWidget *widget,
|
|
const gchar *title)
|
|
{
|
|
GcalNewEventWidgetPrivate *priv;
|
|
|
|
priv = gcal_new_event_widget_get_instance_private (widget);
|
|
gtk_label_set_text (GTK_LABEL (priv->title_label), title);
|
|
}
|
|
|
|
void
|
|
gcal_new_event_widget_set_calendars (GcalNewEventWidget *widget,
|
|
GtkTreeModel *sources_model)
|
|
{
|
|
GcalNewEventWidgetPrivate *priv;
|
|
GtkWidget *menu;
|
|
GtkWidget *item;
|
|
|
|
gboolean valid;
|
|
GtkTreeIter iter;
|
|
|
|
priv = gcal_new_event_widget_get_instance_private (widget);
|
|
|
|
valid = gtk_tree_model_get_iter_first (sources_model, &iter);
|
|
if (! valid)
|
|
return;
|
|
|
|
menu = gtk_menu_new ();
|
|
gtk_menu_button_set_popup (GTK_MENU_BUTTON (priv->calendar_button), menu);
|
|
|
|
while (valid)
|
|
{
|
|
/* Walk through the list, reading each row */
|
|
gchar *uid;
|
|
gchar *name;
|
|
gboolean active;
|
|
GdkRGBA *color;
|
|
|
|
GtkWidget *box;
|
|
GtkWidget *name_label;
|
|
GtkWidget *cal_image;
|
|
GdkPixbuf *pix;
|
|
|
|
gtk_tree_model_get (sources_model, &iter,
|
|
0, &uid,
|
|
1, &name,
|
|
2, &active,
|
|
3, &color,
|
|
-1);
|
|
|
|
if (! active)
|
|
{
|
|
valid = gtk_tree_model_iter_next (sources_model, &iter);
|
|
continue;
|
|
}
|
|
|
|
item = gtk_menu_item_new ();
|
|
g_object_set_data_full (G_OBJECT (item),
|
|
"calendar-uid", uid, g_free);
|
|
g_object_set_data_full (G_OBJECT (item),
|
|
"color", gdk_rgba_to_string (color), g_free);
|
|
g_signal_connect (item,
|
|
"activate",
|
|
G_CALLBACK (item_activated),
|
|
widget);
|
|
|
|
pix = gcal_get_pixbuf_from_color (color, 16);
|
|
cal_image = gtk_image_new_from_pixbuf (pix);
|
|
name_label = gtk_label_new (name);
|
|
box = gtk_grid_new ();
|
|
gtk_grid_set_column_spacing (GTK_GRID (box), 6);
|
|
gtk_container_add (GTK_CONTAINER (box), cal_image);
|
|
gtk_container_add (GTK_CONTAINER (box), name_label);
|
|
gtk_container_add (GTK_CONTAINER (item), box);
|
|
|
|
gtk_container_add (GTK_CONTAINER (menu), item);
|
|
|
|
g_object_unref (pix);
|
|
g_free (name);
|
|
gdk_rgba_free (color);
|
|
|
|
valid = gtk_tree_model_iter_next (sources_model, &iter);
|
|
}
|
|
|
|
gtk_widget_show_all (GTK_WIDGET (menu));
|
|
}
|
|
|
|
void
|
|
gcal_new_event_widget_set_default_calendar (GcalNewEventWidget *widget,
|
|
const gchar *source_uid)
|
|
{
|
|
GcalNewEventWidgetPrivate *priv;
|
|
|
|
GList *l;
|
|
GtkMenu *menu;
|
|
|
|
gchar *uid;
|
|
gchar *color_name;
|
|
GdkRGBA color;
|
|
GdkPixbuf *pix;
|
|
GtkWidget *image;
|
|
|
|
priv = gcal_new_event_widget_get_instance_private (widget);
|
|
|
|
menu = gtk_menu_button_get_popup (GTK_MENU_BUTTON (priv->calendar_button));
|
|
for (l = gtk_container_get_children (GTK_CONTAINER (menu));
|
|
l != NULL;
|
|
l = l->next)
|
|
{
|
|
GObject *item = l->data;
|
|
uid = g_object_get_data (item, "calendar-uid");
|
|
if (g_strcmp0 (source_uid, uid) == 0)
|
|
{
|
|
color_name = g_object_get_data (item, "color");
|
|
break;
|
|
}
|
|
}
|
|
|
|
gdk_rgba_parse (&color, color_name);
|
|
pix = gcal_get_pixbuf_from_color (&color, 16);
|
|
image = gtk_image_new_from_pixbuf (pix);
|
|
gtk_button_set_image (GTK_BUTTON (priv->calendar_button), image);
|
|
|
|
/* saving the value */
|
|
g_object_set_data (G_OBJECT (priv->calendar_button),
|
|
"calendar-uid", uid);
|
|
g_object_unref (pix);
|
|
}
|
|
|
|
/**
|
|
* gcal_new_event_widget_get_entry:
|
|
* @widget:
|
|
*
|
|
* Get a reference to the summanry entry
|
|
*
|
|
* Returns: (transfer none) a #GtkWidget
|
|
**/
|
|
GtkWidget*
|
|
gcal_new_event_widget_get_entry (GcalNewEventWidget *widget)
|
|
{
|
|
GcalNewEventWidgetPrivate *priv;
|
|
|
|
priv = gcal_new_event_widget_get_instance_private (widget);
|
|
return priv->what_entry;
|
|
}
|
|
|
|
GtkWidget*
|
|
gcal_new_event_widget_get_create_button (GcalNewEventWidget *widget)
|
|
{
|
|
GcalNewEventWidgetPrivate *priv;
|
|
|
|
priv = gcal_new_event_widget_get_instance_private (widget);
|
|
return priv->create_button;
|
|
}
|
|
|
|
GtkWidget*
|
|
gcal_new_event_widget_get_details_button (GcalNewEventWidget *widget)
|
|
{
|
|
GcalNewEventWidgetPrivate *priv;
|
|
|
|
priv = gcal_new_event_widget_get_instance_private (widget);
|
|
return priv->details_button;
|
|
}
|
|
|
|
/**
|
|
* gcal_new_event_widget_get_calendar_uid:
|
|
* @widget: a #GcalNewEventWidget
|
|
*
|
|
* Returns the selected calendar uid.
|
|
*
|
|
* Returns: (transfer full) a c-string
|
|
**/
|
|
gchar*
|
|
gcal_new_event_widget_get_calendar_uid (GcalNewEventWidget *widget)
|
|
{
|
|
GcalNewEventWidgetPrivate *priv;
|
|
|
|
priv = gcal_new_event_widget_get_instance_private (widget);
|
|
|
|
return g_strdup (g_object_get_data (G_OBJECT (priv->calendar_button),
|
|
"calendar-uid"));
|
|
}
|
|
|
|
/**
|
|
* gcal_new_event_widget_get_summary:
|
|
* @widget: a #GcalNewEventWidget
|
|
*
|
|
* Return the summary written down in the entry
|
|
*
|
|
* Returns: (transfer full) a c-string
|
|
**/
|
|
gchar*
|
|
gcal_new_event_widget_get_summary (GcalNewEventWidget *widget)
|
|
{
|
|
GcalNewEventWidgetPrivate *priv;
|
|
|
|
priv = gcal_new_event_widget_get_instance_private (widget);
|
|
|
|
return g_strdup (gtk_entry_get_text (GTK_ENTRY (priv->what_entry)));
|
|
}
|