[gnome-calendar/new-year-view: 1/4] year-view: initial commit
- From: Erick Pérez Castellanos <erickpc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-calendar/new-year-view: 1/4] year-view: initial commit
- Date: Thu, 15 Jan 2015 13:52:34 +0000 (UTC)
commit 7fea029aa90f26ec5d4e31c04cb9a3f11b73d6e9
Author: Erick Pérez Castellanos <erick red gmail com>
Date: Thu Jan 15 00:45:54 2015 -0500
year-view: initial commit
Dropped almost everything. Started using an ui file and using a GtkBox
as a parent.
data/Makefile.am | 1 +
data/calendar.gresource.xml | 1 +
data/ui/year-view.ui | 41 ++
src/gcal-window.c | 8 +-
src/gcal-year-view.c | 1009 +++++--------------------------------------
src/gcal-year-view.h | 50 ++-
6 files changed, 181 insertions(+), 929 deletions(-)
---
diff --git a/data/Makefile.am b/data/Makefile.am
index d3240cd..2cd4cee 100644
--- a/data/Makefile.am
+++ b/data/Makefile.am
@@ -40,6 +40,7 @@ EXTRA_DIST= \
ui/search-view.ui \
ui/time-selector.ui \
ui/window.ui \
+ ui/year-view.ui \
theme/gtk-styles.css \
$(desktop_in_files) \
$(gsettingsschema_in_files)
diff --git a/data/calendar.gresource.xml b/data/calendar.gresource.xml
index 5b2ba2f..c6712ad 100644
--- a/data/calendar.gresource.xml
+++ b/data/calendar.gresource.xml
@@ -8,6 +8,7 @@
<file alias="search-view.ui" compressed="true" preprocess="xml-stripblanks">ui/search-view.ui</file>
<file alias="time-selector.ui" compressed="true" preprocess="xml-stripblanks">ui/time-selector.ui</file>
<file alias="window.ui" compressed="true" preprocess="xml-stripblanks">ui/window.ui</file>
+ <file alias="year-view.ui" compressed="true" preprocess="xml-stripblanks">ui/year-view.ui</file>
<file alias="gtk-styles.css" compressed="true">theme/gtk-styles.css</file>
</gresource>
</gresources>
diff --git a/data/ui/year-view.ui b/data/ui/year-view.ui
new file mode 100644
index 0000000..3654386
--- /dev/null
+++ b/data/ui/year-view.ui
@@ -0,0 +1,41 @@
+<?xml version="1.0"?>
+<interface>
+ <!-- interface-requires gtk+ 3.10 -->
+ <template class="GcalYearView" parent="GtkBox">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkDrawingArea" id="year_view_navigator">
+ <property name="visible">True</property>
+ <signal name="draw" handler="draw_navigator" object="GcalYearView" swapped="yes" />
+ <!-- FIXME: add some other necessary signals -->
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkOverlay" id="sidebar">
+ <property name="visible">True</property>
+ <child type="overlay">
+ <object class="GtkButton" id="add_event_button">
+ <property name="visible">True</property>
+ <property name="valign">end</property>
+ <property name="label" translatable="yes">Add new event...</property>
+ <signal name="clicked" handler="add_event_clicked_cb" object="GcalYearView" swapped="yes" />
+ </object>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkListBox" id="events_listbox">
+ <property name="visible">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
+
diff --git a/src/gcal-window.c b/src/gcal-window.c
index 5487793..65c8fcd 100644
--- a/src/gcal-window.c
+++ b/src/gcal-window.c
@@ -1294,11 +1294,9 @@ gcal_window_constructed (GObject *object)
gcal_month_view_set_use_24h_format (GCAL_MONTH_VIEW (priv->views[GCAL_WINDOW_VIEW_MONTH]), use_24h_format);
gtk_stack_add_titled (GTK_STACK (priv->views_stack), priv->views[GCAL_WINDOW_VIEW_MONTH], "month",
_("Month"));
- priv->views[GCAL_WINDOW_VIEW_YEAR] =
- gcal_year_view_new (priv->manager);
- gtk_stack_add_titled (GTK_STACK (priv->views_stack),
- priv->views[GCAL_WINDOW_VIEW_YEAR],
- "year", _("Year"));
+ priv->views[GCAL_WINDOW_VIEW_YEAR] = GTK_WIDGET (gcal_year_view_new ());
+ gcal_year_view_set_manager (GCAL_YEAR_VIEW (priv->views[GCAL_WINDOW_VIEW_YEAR]), priv->manager);
+ gtk_stack_add_titled (GTK_STACK (priv->views_stack), priv->views[GCAL_WINDOW_VIEW_YEAR], "year",
_("Year"));
/* search view */
gcal_search_view_connect (GCAL_SEARCH_VIEW (priv->search_view), priv->manager);
diff --git a/src/gcal-year-view.c b/src/gcal-year-view.c
index 1136fd0..9dd66d4 100644
--- a/src/gcal-year-view.c
+++ b/src/gcal-year-view.c
@@ -1,12 +1,11 @@
/* -*- mode: c; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/*
- * gcal-year-view.c
+/* gcal-year-view.c
*
- * Copyright (C) 2012 - Erick Pérez Castellanos
+ * Copyright (C) 2015 Erick Pérez Castellanos <erick red gmail com>
*
- * This program is free software; you can redistribute it and/or modify
+ * This program 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 2 of the License, or
+ * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
@@ -19,978 +18,186 @@
*/
#include "gcal-year-view.h"
-#include "gcal-subscriber-view-private.h"
-#include "gcal-utils.h"
#include "gcal-view.h"
-#include <glib/gi18n.h>
-
-typedef struct
+struct _GcalYearViewPrivate
{
- /* overflow buttons */
- GHashTable *internal_children;
-
- GdkWindow *event_window;
+ /* composite, GtkBuilder's widgets */
+ GtkWidget *year_view_navigator;
+ GtkWidget *sidebar;
+ GtkWidget *add_event_button;
+ GtkWidget *events_listbox;
- /* input events flags */
- gint clicked_cell;
- gint start_mark_cell;
- gint end_mark_cell;
+ /* manager singleton */
+ GcalManager *manager;
- /* text direction factors */
- gint k;
-
- /* property */
- icaltimetype *date;
- GcalManager *manager; /* weak reference */
-} GcalYearViewPrivate;
+ /* date property */
+ icaltimetype *date;
+};
-enum
-{
+enum {
PROP_0,
- PROP_DATE, //active-date inherited property
- PROP_MANAGER //manager inherited property
+ PROP_DATE,
+ LAST_PROP
};
-static gboolean get_widget_parts (gint first_cell,
- gint last_cell,
- gint natural_height,
- gdouble vertical_cell_space,
- gdouble *size_left,
- GArray *cells,
- GArray *lengths);
-
-static void gcal_view_interface_init (GcalViewIface *iface);
-
-static void gcal_year_view_set_property (GObject *object,
- guint property_id,
- const GValue *value,
- GParamSpec *pspec);
-
-static void gcal_year_view_get_property (GObject *object,
- guint property_id,
- GValue *value,
- GParamSpec *pspec);
-
-static void gcal_year_view_finalize (GObject *object);
-
-static void gcal_year_view_realize (GtkWidget *widget);
-
-static void gcal_year_view_unrealize (GtkWidget *widget);
-
-static void gcal_year_view_map (GtkWidget *widget);
-
-static void gcal_year_view_unmap (GtkWidget *widget);
-
-static void gcal_year_view_size_allocate (GtkWidget *widget,
- GtkAllocation *allocation);
-
-static gboolean gcal_year_view_draw (GtkWidget *widget,
- cairo_t *cr);
+static void gcal_view_interface_init (GcalViewIface *iface);
+static void gcal_data_model_subscriber_interface_init (ECalDataModelSubscriberInterface *iface);
-static gboolean gcal_year_view_button_press (GtkWidget *widget,
- GdkEventButton *event);
-
-static gboolean gcal_year_view_motion_notify_event (GtkWidget *widget,
- GdkEventMotion *event);
-
-static gboolean gcal_year_view_button_release (GtkWidget *widget,
- GdkEventButton *event);
-
-static void gcal_year_view_direction_changed (GtkWidget *widget,
- GtkTextDirection previous_direction);
-
-static gboolean gcal_year_view_is_child_multimonth (GcalSubscriberView *subscriber,
- GcalEventWidget *child);
-
-static guint gcal_year_view_get_child_cell (GcalSubscriberView *subscriber,
- GcalEventWidget *child);
-
-static icaltimetype* gcal_year_view_get_initial_date (GcalView *view);
-
-static icaltimetype* gcal_year_view_get_final_date (GcalView *view);
-
-static void gcal_year_view_clear_marks (GcalView *view);
-
-static gchar* gcal_year_view_get_left_header (GcalView *view);
-
-static gchar* gcal_year_view_get_right_header (GcalView *view);
-
-G_DEFINE_TYPE_WITH_CODE (GcalYearView, gcal_year_view, GCAL_TYPE_SUBSCRIBER_VIEW,
+G_DEFINE_TYPE_WITH_CODE (GcalYearView, gcal_year_view, GTK_TYPE_BOX,
G_ADD_PRIVATE (GcalYearView)
- G_IMPLEMENT_INTERFACE (GCAL_TYPE_VIEW,gcal_view_interface_init));
-
-static gboolean
-get_widget_parts (gint first_cell,
- gint last_cell,
- gint natural_height,
- gdouble vertical_cell_space,
- gdouble *size_left,
- GArray *cells,
- GArray *lengths)
-{
- gint i;
- gint current_part_length;
- gdouble y, old_y = - 1.0;
-
- if (last_cell < first_cell)
- {
- gint swap = last_cell;
- last_cell = first_cell;
- first_cell = swap;
- }
-
- for (i = first_cell; i <= last_cell; i++)
- {
- if (size_left[i] < natural_height)
- {
- return FALSE;
- }
- else
- {
- y = vertical_cell_space - size_left[i];
- if (y != old_y)
- {
- current_part_length = 1;
- g_array_append_val (cells, i);
- g_array_append_val (lengths, current_part_length);
- old_y = y;
- }
- else
- {
- current_part_length++;
- g_array_index (lengths, gint, lengths->len - 1) = current_part_length;
- }
- }
- }
-
- return TRUE;
-}
+ G_IMPLEMENT_INTERFACE (GCAL_TYPE_VIEW, gcal_view_interface_init)
+ G_IMPLEMENT_INTERFACE (E_TYPE_CAL_DATA_MODEL_SUBSCRIBER,
+ gcal_data_model_subscriber_interface_init));
static void
-gcal_year_view_class_init (GcalYearViewClass *klass)
+update_date (GcalYearView *year_view,
+ icaltimetype *new_date)
{
- GcalSubscriberViewClass *subscriber_view_class;
- GtkWidgetClass *widget_class;
- GObjectClass *object_class;
-
- subscriber_view_class = GCAL_SUBSCRIBER_VIEW_CLASS (klass);
- subscriber_view_class->is_child_multicell = gcal_year_view_is_child_multimonth;
- subscriber_view_class->get_child_cell = gcal_year_view_get_child_cell;
-
- widget_class = GTK_WIDGET_CLASS (klass);
- widget_class->realize = gcal_year_view_realize;
- widget_class->unrealize = gcal_year_view_unrealize;
- widget_class->map = gcal_year_view_map;
- widget_class->unmap = gcal_year_view_unmap;
- widget_class->size_allocate = gcal_year_view_size_allocate;
- widget_class->draw = gcal_year_view_draw;
- widget_class->button_press_event = gcal_year_view_button_press;
- widget_class->motion_notify_event = gcal_year_view_motion_notify_event;
- widget_class->button_release_event = gcal_year_view_button_release;
- widget_class->direction_changed = gcal_year_view_direction_changed;
-
- object_class = G_OBJECT_CLASS (klass);
- object_class->set_property = gcal_year_view_set_property;
- object_class->get_property = gcal_year_view_get_property;
- object_class->finalize = gcal_year_view_finalize;
+ GcalYearViewPrivate *priv = year_view->priv;
- g_object_class_override_property (object_class, PROP_DATE, "active-date");
- g_object_class_override_property (object_class, PROP_MANAGER, "manager");
+ /* FIXME: add updating subscribe range */
+ if (priv->date != NULL)
+ g_free (priv->date);
+ priv->date = new_date;
}
-static void
-gcal_year_view_init (GcalYearView *self)
+static gboolean
+draw_navigator (GcalYearView *year_view,
+ cairo_t *cr,
+ GtkWidget *widget)
{
- GcalYearViewPrivate *priv;
-
- gtk_widget_set_has_window (GTK_WIDGET (self), FALSE);
+ /* FIXME: draw navigator */
+ guint width, height;
+ GdkRGBA color;
- priv = gcal_year_view_get_instance_private (self);
+ width = gtk_widget_get_allocated_width (widget);
+ height = gtk_widget_get_allocated_height (widget);
+ cairo_arc (cr, width / 2.0, height / 2.0, MIN (width, height) / 2.0, 0, 2 * G_PI);
- priv->clicked_cell = -1;
- priv->start_mark_cell = -1;
- priv->end_mark_cell = -1;
+ gtk_style_context_get_color (gtk_widget_get_style_context (widget), 0, &color);
+ gdk_cairo_set_source_rgba (cr, &color);
- if (gtk_widget_get_direction (GTK_WIDGET (self)) == GTK_TEXT_DIR_LTR)
- priv->k = 0;
- else if (gtk_widget_get_direction (GTK_WIDGET (self)) == GTK_TEXT_DIR_RTL)
- priv->k = 1;
+ cairo_fill (cr);
- gtk_style_context_add_class (gtk_widget_get_style_context (GTK_WIDGET (self)), "calendar-view");
+ return FALSE;
}
static void
-gcal_view_interface_init (GcalViewIface *iface)
+add_event_clicked_cb (GcalYearView *year_view,
+ GtkButton *button)
{
- /* New API */
- iface->get_initial_date = gcal_year_view_get_initial_date;
- iface->get_final_date = gcal_year_view_get_final_date;
-
- iface->clear_marks = gcal_year_view_clear_marks;
-
- iface->get_left_header = gcal_year_view_get_left_header;
- iface->get_right_header = gcal_year_view_get_right_header;
+ /* FIXME: implement send detailed signal */
}
static void
-gcal_year_view_set_property (GObject *object,
- guint property_id,
- const GValue *value,
- GParamSpec *pspec)
+gcal_year_view_finalize (GObject *object)
{
- GcalYearViewPrivate *priv;
+ GcalYearViewPrivate *priv = GCAL_YEAR_VIEW (object)->priv;
- priv = gcal_year_view_get_instance_private (GCAL_YEAR_VIEW (object));
+ if (priv->date != NULL)
+ g_free (priv->date);
- switch (property_id)
- {
- case PROP_DATE:
- {
- time_t range_start, range_end;
- icaltimetype *date;
- icaltimezone* default_zone;
-
- if (priv->date != NULL)
- g_free (priv->date);
-
- priv->date = g_value_dup_boxed (value);
-
- default_zone =
- gcal_manager_get_system_timezone (priv->manager);
- date = gcal_view_get_initial_date (GCAL_VIEW (object));
- range_start = icaltime_as_timet_with_zone (*date,
- default_zone);
- g_free (date);
- date = gcal_view_get_final_date (GCAL_VIEW (object));
- range_end = icaltime_as_timet_with_zone (*date,
- default_zone);
- g_free (date);
- gcal_manager_set_subscriber (priv->manager,
- E_CAL_DATA_MODEL_SUBSCRIBER (object),
- range_start,
- range_end);
- gtk_widget_queue_draw (GTK_WIDGET (object));
- break;
- }
- case PROP_MANAGER:
- {
- priv->manager = g_value_get_pointer (value);
- break;
- }
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
- break;
- }
+ G_OBJECT_CLASS (gcal_year_view_parent_class)->finalize (object);
}
static void
-gcal_year_view_get_property (GObject *object,
- guint property_id,
- GValue *value,
- GParamSpec *pspec)
+gcal_year_view_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
{
- GcalYearViewPrivate *priv;
+ GcalYearViewPrivate *priv = GCAL_YEAR_VIEW (object)->priv;
- priv = gcal_year_view_get_instance_private (GCAL_YEAR_VIEW (object));
-
- switch (property_id)
+ switch (prop_id)
{
case PROP_DATE:
g_value_set_boxed (value, priv->date);
break;
+
default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
- break;
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
}
static void
-gcal_year_view_finalize (GObject *object)
+gcal_year_view_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
{
- GcalYearViewPrivate *priv;
- priv = gcal_year_view_get_instance_private (GCAL_YEAR_VIEW (object));
-
- if (priv->date != NULL)
- g_free (priv->date);
-
- /* Chain up to parent's finalize() method. */
- G_OBJECT_CLASS (gcal_year_view_parent_class)->finalize (object);
-}
-
-static void
-gcal_year_view_realize (GtkWidget *widget)
-{
- GcalYearViewPrivate *priv;
- GdkWindow *parent_window;
- GdkWindowAttr attributes;
- gint attributes_mask;
- GtkAllocation allocation;
-
- priv = gcal_year_view_get_instance_private (GCAL_YEAR_VIEW (widget));
- gtk_widget_set_realized (widget, TRUE);
-
- parent_window = gtk_widget_get_parent_window (widget);
- gtk_widget_set_window (widget, parent_window);
- g_object_ref (parent_window);
-
- gtk_widget_get_allocation (widget, &allocation);
-
- attributes.window_type = GDK_WINDOW_CHILD;
- attributes.wclass = GDK_INPUT_ONLY;
- attributes.x = allocation.x;
- attributes.y = allocation.y;
- attributes.width = allocation.width;
- attributes.height = allocation.height;
- attributes.event_mask = gtk_widget_get_events (widget);
- attributes.event_mask |= (GDK_BUTTON_PRESS_MASK |
- GDK_BUTTON_RELEASE_MASK |
- GDK_BUTTON1_MOTION_MASK |
- GDK_POINTER_MOTION_HINT_MASK |
- GDK_POINTER_MOTION_MASK |
- GDK_ENTER_NOTIFY_MASK |
- GDK_LEAVE_NOTIFY_MASK);
- attributes_mask = GDK_WA_X | GDK_WA_Y;
-
- priv->event_window = gdk_window_new (parent_window,
- &attributes,
- attributes_mask);
- gtk_widget_register_window (widget, priv->event_window);
-}
-
-static void
-gcal_year_view_unrealize (GtkWidget *widget)
-{
- GcalYearViewPrivate *priv;
-
- priv = gcal_year_view_get_instance_private (GCAL_YEAR_VIEW (widget));
- if (priv->event_window != NULL)
+ switch (prop_id)
{
- gtk_widget_unregister_window (widget, priv->event_window);
- gdk_window_destroy (priv->event_window);
- priv->event_window = NULL;
- }
+ case PROP_DATE:
+ update_date (GCAL_YEAR_VIEW (object), g_value_dup_boxed (value));
+ break;
- GTK_WIDGET_CLASS (gcal_year_view_parent_class)->unrealize (widget);
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ }
}
static void
-gcal_year_view_map (GtkWidget *widget)
+gcal_year_view_class_init (GcalYearViewClass *klass)
{
- GcalYearViewPrivate *priv;
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
- priv = gcal_year_view_get_instance_private (GCAL_YEAR_VIEW (widget));
- if (priv->event_window)
- gdk_window_show (priv->event_window);
+ object_class->finalize = gcal_year_view_finalize;
+ object_class->get_property = gcal_year_view_get_property;
+ object_class->set_property = gcal_year_view_set_property;
- GTK_WIDGET_CLASS (gcal_year_view_parent_class)->map (widget);
-}
+ g_object_class_override_property (object_class, PROP_DATE, "active-date");
-static void
-gcal_year_view_unmap (GtkWidget *widget)
-{
- GcalYearViewPrivate *priv;
+ gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/calendar/year-view.ui");
- priv = gcal_year_view_get_instance_private (GCAL_YEAR_VIEW (widget));
- if (priv->event_window)
- gdk_window_hide (priv->event_window);
+ gtk_widget_class_bind_template_child_private (widget_class, GcalYearView, year_view_navigator);
+ gtk_widget_class_bind_template_child_private (widget_class, GcalYearView, sidebar);
+ gtk_widget_class_bind_template_child_private (widget_class, GcalYearView, add_event_button);
+ gtk_widget_class_bind_template_child_private (widget_class, GcalYearView, events_listbox);
- GTK_WIDGET_CLASS (gcal_year_view_parent_class)->unmap (widget);
+ gtk_widget_class_bind_template_callback (widget_class, draw_navigator);
+ gtk_widget_class_bind_template_callback (widget_class, add_event_clicked_cb);
}
static void
-gcal_year_view_size_allocate (GtkWidget *widget,
- GtkAllocation *allocation)
-{
- GcalYearViewPrivate *priv;
- GcalSubscriberViewPrivate *ppriv;
- gint i, j, sw;
-
- gint padding_bottom;
- PangoLayout *layout;
- PangoFontDescription *font_desc;
- gint font_height;
-
- gdouble cell_width, cell_height, vertical_cell_space;
- gdouble pos_x, pos_y;
- gdouble size_left [12];
-
- const gchar *uuid;
- GtkWidget *child_widget;
- GtkAllocation child_allocation;
- gint natural_height;
-
- GList *widgets, *l, *aux, *l2 = NULL;
- GHashTableIter iter;
- gpointer key, value;
-
- priv = gcal_year_view_get_instance_private (GCAL_YEAR_VIEW (widget));
- ppriv = GCAL_SUBSCRIBER_VIEW (widget)->priv;
-
- if (!ppriv->children_changed &&
- allocation->height == gtk_widget_get_allocated_height (widget) &&
- allocation->width == gtk_widget_get_allocated_width (widget))
- {
- return;
- }
-
- /* remove every widget' parts, but the master widget */
- widgets = g_hash_table_get_values (ppriv->children);
- for (aux = widgets; aux != NULL; aux = g_list_next (aux))
- {
- l = g_list_next ((GList*) aux->data);
- for (; l != NULL; l = g_list_next (l))
- l2 = g_list_append (l2, l->data);
- }
- g_list_free (widgets);
-
- g_list_foreach (l2, (GFunc) gtk_widget_destroy, NULL);
- g_list_free (l2);
-
- /* clean overflow information */
- g_hash_table_remove_all (ppriv->overflow_cells);
-
- gtk_widget_set_allocation (widget, allocation);
- if (gtk_widget_get_realized (widget))
- gdk_window_move_resize (priv->event_window, allocation->x, allocation->y, allocation->width,
allocation->height);
-
- gtk_style_context_get (gtk_widget_get_style_context (widget), gtk_widget_get_state_flags (widget),
- "font", &font_desc, "padding-bottom", &padding_bottom, NULL);
-
- layout = gtk_widget_create_pango_layout (widget, _("Other events"));
- pango_layout_set_font_description (layout, font_desc);
- pango_layout_get_pixel_size (layout, NULL, &font_height);
- pango_font_description_free (font_desc);
- g_object_unref (layout);
-
- cell_width = allocation->width / 6.0;
- cell_height = allocation->height / 2.0;
- vertical_cell_space = cell_height - (padding_bottom + font_height);
-
- for (i = 0; i < 12; i++)
- size_left[i] = vertical_cell_space;
-
- sw = 1 - 2 * priv->k;
-
- /* allocate multimonth events */
- for (l = ppriv->multi_cell_children; l != NULL; l = g_list_next (l))
- {
- gint first_cell, last_cell, first_row, last_row, start, end;
- gboolean visible;
-
- const icaltimetype *date;
- GArray *cells, *lengths;
-
- child_widget = (GtkWidget*) l->data;
- uuid = gcal_event_widget_peek_uuid (GCAL_EVENT_WIDGET (child_widget));
- if (!gtk_widget_is_visible (child_widget) && !g_hash_table_contains (ppriv->hidden_as_overflow, uuid))
- continue;
-
- gtk_widget_show (child_widget);
- gtk_widget_get_preferred_height (child_widget, NULL, &natural_height);
-
- j = 1;
- date = gcal_event_widget_peek_start_date (GCAL_EVENT_WIDGET (child_widget));
- if (date->year == priv->date->year)
- j = date->month;
- first_cell = 6 * ((j - 1) / 6) + 6 * priv->k + sw * ((j - 1) % 6) - (1 * priv->k);
-
- j = 12;
- date = gcal_event_widget_peek_end_date (GCAL_EVENT_WIDGET (child_widget));
- if (date->year == priv->date->year)
- j = date->month;
- last_cell = 6 * ((j - 1) / 6) + 6 * priv->k + sw * ((j - 1) % 6) - (1 * priv->k);
-
- /* FIXME missing mark widgets with continuos tags */
-
- first_row = first_cell / 6;
- last_row = last_cell / 6;
- visible = TRUE;
- cells = g_array_sized_new (TRUE, TRUE, sizeof (gint), 16);
- lengths = g_array_sized_new (TRUE, TRUE, sizeof (gint), 16);
- for (i = first_row; i <= last_row && visible; i++)
- {
- start = i * 6 + priv->k * 5;
- end = i * 6 + (1 - priv->k) * 5;
-
- if (i == first_row)
- {
- start = first_cell;
- }
- if (i == last_row)
- {
- end = last_cell;
- }
-
- visible = get_widget_parts (start, end, natural_height, vertical_cell_space, size_left, cells,
lengths);
- }
-
- if (visible)
- {
- for (i = 0; i < cells->len; i++)
- {
- gint cell_idx = g_array_index (cells, gint, i);
- gint row = cell_idx / 6;
- gint column = cell_idx % 6;
- pos_x = cell_width * column;
- pos_y = cell_height * row;
-
- child_allocation.x = pos_x;
- child_allocation.y = pos_y + vertical_cell_space - size_left[cell_idx];
- child_allocation.width = cell_width * g_array_index (lengths, gint, i);
- child_allocation.height = natural_height;
-
- if (i != 0)
- {
- child_widget = gcal_event_widget_clone (GCAL_EVENT_WIDGET (child_widget));
-
- _gcal_subscriber_view_setup_child (GCAL_SUBSCRIBER_VIEW (widget), child_widget);
- gtk_widget_show (child_widget);
-
- aux = g_hash_table_lookup (ppriv->children, uuid);
- aux = g_list_append (aux, child_widget);
- }
- gtk_widget_size_allocate (child_widget, &child_allocation);
- g_hash_table_remove (ppriv->hidden_as_overflow, uuid);
-
- /* update size_left */
- for (j = 0; j < g_array_index (lengths, gint, i); j++)
- size_left[cell_idx + j] -= natural_height;
- }
- }
- else
- {
- gtk_widget_hide (child_widget);
- g_hash_table_add (ppriv->hidden_as_overflow, g_strdup (uuid));
-
- for (i = first_cell; i <= last_cell; i++)
- {
- aux = g_hash_table_lookup (ppriv->overflow_cells, GINT_TO_POINTER (i));
- aux = g_list_append (aux, child_widget);
-
- if (g_list_length (aux) == 1)
- g_hash_table_insert (ppriv->overflow_cells, GINT_TO_POINTER (i), aux);
- else
- g_hash_table_replace (ppriv->overflow_cells, GINT_TO_POINTER (i), g_list_copy (aux));
- }
- }
-
- g_array_free (cells, TRUE);
- g_array_free (lengths, TRUE);
- }
-
- g_hash_table_iter_init (&iter, ppriv->single_cell_children);
- while (g_hash_table_iter_next (&iter, &key, &value))
- {
- j = GPOINTER_TO_INT (key);
- i = 6 * ((j - 1) / 6) + 6 * priv->k + sw * ((j - 1) % 6) - (1 * priv->k);
-
- l = (GList*) value;
- for (aux = l; aux != NULL; aux = g_list_next (aux))
- {
- child_widget = (GtkWidget*) aux->data;
-
- uuid = gcal_event_widget_peek_uuid (GCAL_EVENT_WIDGET (child_widget));
- if (!gtk_widget_is_visible (child_widget) && !g_hash_table_contains (ppriv->hidden_as_overflow,
uuid))
- continue;
-
- gtk_widget_show (child_widget);
- gtk_widget_get_preferred_height (child_widget, NULL, &natural_height);
-
- if (size_left[i] > natural_height)
- {
- pos_x = cell_width * (i % 6);
- pos_y = cell_height * (i / 6);
-
- child_allocation.x = pos_x;
- child_allocation.y = pos_y + vertical_cell_space - size_left[i];
- child_allocation.width = cell_width;
- child_allocation.height = natural_height;
- gtk_widget_show (child_widget);
- gtk_widget_size_allocate (child_widget, &child_allocation);
- g_hash_table_remove (ppriv->hidden_as_overflow, uuid);
-
- size_left[i] -= natural_height;
- }
- else
- {
- gtk_widget_hide (child_widget);
- g_hash_table_add (ppriv->hidden_as_overflow, g_strdup (uuid));
-
- l = g_hash_table_lookup (ppriv->overflow_cells, GINT_TO_POINTER (i));
- l = g_list_append (l, child_widget);
-
- if (g_list_length (l) == 1)
- g_hash_table_insert (ppriv->overflow_cells, GINT_TO_POINTER (i), l);
- else
- g_hash_table_replace (ppriv->overflow_cells, GINT_TO_POINTER (i), g_list_copy (l));
- }
- }
- }
-
- /* FIXME: remove on Gtk+ 3.15.4 release */
- if (g_hash_table_size (ppriv->overflow_cells) != 0)
- gtk_widget_queue_draw_area (widget, allocation->x, allocation->y, allocation->width, allocation->height);
-
- ppriv->children_changed = FALSE;
-}
-
-static gboolean
-gcal_year_view_draw (GtkWidget *widget,
- cairo_t *cr)
-{
- GcalYearViewPrivate *priv;
-
- GtkStyleContext *context;
- GtkStateFlags state;
-
- GtkBorder padding;
- GtkAllocation alloc;
-
- /* new declares */
- PangoLayout *layout;
- PangoFontDescription *font_desc;
- GdkRGBA color;
-
- gdouble cell_width, cell_height, sw;
- gint i, j, pos_x, pos_y;
- int font_width, font_height;
-
- priv = gcal_year_view_get_instance_private (GCAL_YEAR_VIEW (widget));
- gtk_widget_get_allocation (widget, &alloc);
- context = gtk_widget_get_style_context (widget);
- state = gtk_widget_get_state_flags (widget);
- layout = gtk_widget_create_pango_layout (widget, NULL);
-
- /* calculations */
- cell_width = alloc.width / 6.0;
- cell_height = alloc.height / 2.0;
- sw = 1 - 2 * priv->k;
-
- gtk_style_context_get_padding (context, state, &padding);
- gtk_style_context_get (context, state, "font", &font_desc, NULL);
-
- pango_layout_set_font_description (layout, font_desc);
- for (i = 0; i < 12; i++)
- {
- gint column = i % 6;
- gint row = i / 6;
-
- j = 6 * ((i + 6 * priv->k) / 6) + sw * (i % 6) + (1 - priv->k);
-
- if (priv->date->month == j)
- {
- PangoLayout *clayout;
- PangoFontDescription *cfont_desc;
-
- gtk_style_context_save (context);
- gtk_style_context_add_class (context, "current");
-
- clayout = gtk_widget_create_pango_layout (widget, gcal_get_month_name (j - 1));
- gtk_style_context_get (context, state, "font", &cfont_desc, NULL);
- pango_layout_set_font_description (clayout, cfont_desc);
- pango_layout_get_pixel_size (clayout, &font_width, &font_height);
-
- /* FIXME: hardcoded padding of the number background */
- gtk_render_background (context, cr,
- cell_width * (column + 1 - priv->k) - sw * padding.right + (priv->k - 1) *
font_width - 2.0,
- cell_height * (row + 1) - font_height - padding.bottom,
- font_width + 4, font_height + 2);
- gtk_render_layout (context, cr,
- cell_width * (column + 1 - priv->k) - sw * padding.right + (priv->k - 1) *
font_width,
- cell_height * (row + 1) - font_height - padding.bottom,
- clayout);
-
- gtk_style_context_restore (context);
- pango_font_description_free (cfont_desc);
- g_object_unref (clayout);
- }
- else
- {
- pango_layout_set_text (layout, gcal_get_month_name (j - 1), -1);
- pango_layout_get_pixel_size (layout, &font_width, &font_height);
-
- gtk_render_layout (context, cr,
- cell_width * (column + 1 - priv->k) - sw * padding.right + (priv->k - 1) *
font_width,
- cell_height * (row + 1) - font_height - padding.bottom,
- layout);
-
- }
- }
- pango_font_description_free (font_desc);
-
- /* FIXME: missing selected months lines */
-
- /* drawing grid skel */
- gtk_style_context_save (context);
- gtk_style_context_add_class (context, "lines");
-
- gtk_style_context_get_color (context, state, &color);
- gdk_cairo_set_source_rgba (cr, &color);
- cairo_set_line_width (cr, 0.2);
-
- /* vertical lines */
- for (i = 0; i < 5; i++)
- {
- pos_x = cell_width * (i + 1);
- cairo_move_to (cr, pos_x + 0.4, 0);
- cairo_rel_line_to (cr, 0, alloc.height);
- }
-
- for (i = 0; i < 2; i++)
- {
- pos_y = (alloc.height / 2) * i;
- cairo_move_to (cr, 0, pos_y + 0.4);
- cairo_rel_line_to (cr, alloc.width, 0);
- }
- cairo_stroke (cr);
- gtk_style_context_restore (context);
-
- if (GTK_WIDGET_CLASS (gcal_year_view_parent_class)->draw != NULL)
- GTK_WIDGET_CLASS (gcal_year_view_parent_class)->draw (widget, cr);
-
- return FALSE;
-}
-
-static gboolean
-gcal_year_view_button_press (GtkWidget *widget,
- GdkEventButton *event)
-{
- GcalYearViewPrivate *priv;
-
- gdouble x, y;
- gint width, height;
-
- priv = gcal_year_view_get_instance_private (GCAL_YEAR_VIEW (widget));
-
- x = event->x;
- y = event->y;
-
- width = gtk_widget_get_allocated_width (widget);
- height = gtk_widget_get_allocated_height (widget);
-
- priv->clicked_cell = 6 * ( (gint ) ( y / (height / 2) )) + ((gint) ( x / (width / 6) ));
- priv->start_mark_cell = priv->clicked_cell;
-
- return TRUE;
-}
-
-static gboolean
-gcal_year_view_motion_notify_event (GtkWidget *widget,
- GdkEventMotion *event)
-{
- GcalYearViewPrivate *priv;
-
- gint width, height;
- gint y;
-
- priv = gcal_year_view_get_instance_private (GCAL_YEAR_VIEW (widget));
-
- if (priv->clicked_cell == -1)
- return FALSE;
-
- width = gtk_widget_get_allocated_width (widget);
- height = gtk_widget_get_allocated_height (widget);
-
- y = event->y;
-
- if (y < 0)
- return FALSE;
-
- priv->end_mark_cell = 6 * ( (gint ) ( y / (height / 2) )) + ((gint) ( event->x / (width / 6) ));
-
- gtk_widget_queue_draw (widget);
-
- return TRUE;
-}
-
-static gboolean
-gcal_year_view_button_release (GtkWidget *widget,
- GdkEventButton *event)
+gcal_year_view_init (GcalYearView *self)
{
- GcalYearViewPrivate *priv;
-
- gdouble x, y;
- gint width, height;
-
- icaltimetype *start_date;
- icaltimetype *end_date;
-
- priv = gcal_year_view_get_instance_private (GCAL_YEAR_VIEW (widget));
-
- if (priv->clicked_cell == -1)
- return FALSE;
-
- x = event->x;
- y = event->y;
-
- width = gtk_widget_get_allocated_width (widget);
- height = gtk_widget_get_allocated_height (widget);
-
- priv->end_mark_cell = 6 * ( (gint ) ( y / (height / 2) )) + ((gint) ( x / (width / 6) ));
-
- x = (width / 6) * (( priv->end_mark_cell % 6) + 0.5);
- y = (height / 2) * (( priv->end_mark_cell / 6) + 0.5);
+ self->priv = gcal_year_view_get_instance_private (self);
- start_date = gcal_dup_icaltime (priv->date);
- start_date->day = 1;
- start_date->month = priv->start_mark_cell + 1;
- start_date->is_date = 1;
-
- end_date = gcal_dup_icaltime (priv->date);
- end_date->day = icaltime_days_in_month (priv->end_mark_cell + 1,
- end_date->year);
- end_date->month = priv->end_mark_cell + 1;
- end_date->is_date = 1;
-
- if (priv->start_mark_cell > priv->end_mark_cell)
- {
- start_date->month = priv->end_mark_cell + 1;
- end_date->day = icaltime_days_in_month (priv->start_mark_cell + 1,
- end_date->year);
- end_date->month = priv->start_mark_cell + 1;
- }
-
- g_signal_emit_by_name (GCAL_VIEW (widget),
- "create-event",
- start_date, end_date,
- x, y);
- g_free (start_date);
- g_free (end_date);
-
- priv->clicked_cell = -1;
- return TRUE;
+ gtk_widget_init_template (GTK_WIDGET (self));
+ gtk_style_context_add_class (gtk_widget_get_style_context (GTK_WIDGET (self)), "calendar-view");
}
static void
-gcal_year_view_direction_changed (GtkWidget *widget,
- GtkTextDirection previous_direction)
-{
- GcalYearViewPrivate *priv;
- priv = gcal_year_view_get_instance_private (GCAL_YEAR_VIEW (widget));
-
- if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR)
- priv->k = 0;
- else if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL)
- priv->k = 1;
-}
-
-static gboolean
-gcal_year_view_is_child_multimonth (GcalSubscriberView *subscriber,
- GcalEventWidget *child)
-{
- const icaltimetype *dt_start, *dt_end;
-
- dt_start = gcal_event_widget_peek_start_date (child);
- dt_end = gcal_event_widget_peek_end_date (child);
- if (dt_end == NULL)
- return FALSE;
-
- return dt_start->month != dt_end->month || dt_start->year != dt_end->year;
-}
-
-static guint
-gcal_year_view_get_child_cell (GcalSubscriberView *subscriber,
- GcalEventWidget *child)
-{
- const icaltimetype *dt_start = gcal_event_widget_peek_start_date (child);
- return dt_start->month;
-}
-
-/* GcalView Interface API */
-/**
- * gcal_year_view_get_initial_date:
- *
- * Since: 0.1
- * Return value: the January first of the current year.
- * Returns: (transfer full): Release with g_free()
- **/
-static icaltimetype*
-gcal_year_view_get_initial_date (GcalView *view)
-{
- GcalYearViewPrivate *priv;
- icaltimetype *new_date;
-
- g_return_val_if_fail (GCAL_IS_YEAR_VIEW (view), NULL);
- priv = gcal_year_view_get_instance_private (GCAL_YEAR_VIEW (view));
-
- new_date = gcal_dup_icaltime (priv->date);
- new_date->day = 1;
- new_date->month = 1;
- new_date->is_date = 0;
- new_date->hour = 0;
- new_date->minute = 0;
- new_date->second = 0;
-
- return new_date;
-}
-
-/**
- * gcal_year_view_get_final_date:
- *
- * Since: 0.1
- * Return value: the last day of the month
- * Returns: (transfer full): Release with g_free()
- **/
-static icaltimetype*
-gcal_year_view_get_final_date (GcalView *view)
+gcal_view_interface_init (GcalViewIface *iface)
{
- GcalYearViewPrivate *priv;
- icaltimetype *new_date;
-
- g_return_val_if_fail (GCAL_IS_YEAR_VIEW (view), NULL);
- priv = gcal_year_view_get_instance_private (GCAL_YEAR_VIEW (view));
-
- new_date = gcal_dup_icaltime (priv->date);
- new_date->day = 31;
- new_date->month = 12;
- new_date->is_date = 0;
- new_date->hour = 23;
- new_date->minute = 59;
- new_date->second = 0;
-
- return new_date;
+ /* FIXME: implement what's needed */
}
static void
-gcal_year_view_clear_marks (GcalView *view)
+gcal_data_model_subscriber_interface_init (ECalDataModelSubscriberInterface *iface)
{
- GcalYearViewPrivate *priv;
-
- priv = gcal_year_view_get_instance_private (GCAL_YEAR_VIEW (view));
-
- priv->start_mark_cell = -1;
- priv->end_mark_cell = -1;
- gtk_widget_queue_draw (GTK_WIDGET (view));
+ /* FIXME: implement this */
+ iface->component_added = NULL;
+ iface->component_modified = NULL;
+ iface->component_removed = NULL;
+ iface->freeze = NULL;
+ iface->thaw = NULL;
}
-static gchar*
-gcal_year_view_get_left_header (GcalView *view)
+/* Public API */
+GcalYearView *
+gcal_year_view_new (void)
{
- GcalYearViewPrivate *priv;
-
- priv = gcal_year_view_get_instance_private (GCAL_YEAR_VIEW (view));
-
- return g_strdup_printf ("%d", priv->date->year);
+ return g_object_new (GCAL_TYPE_YEAR_VIEW, NULL);
}
-static gchar*
-gcal_year_view_get_right_header (GcalView *view)
+void
+gcal_year_view_set_manager (GcalYearView *year_view,
+ GcalManager *manager)
{
- return g_strdup ("");
-}
+ GcalYearViewPrivate *priv = year_view->priv;
-/* Public API */
-/**
- * gcal_year_view_new:
- * @manager: App singleton #GcalManager instance
- *
- * Create the year view
- *
- * Returns: (transfer full):
- **/
-GtkWidget*
-gcal_year_view_new (GcalManager *manager)
-{
- return g_object_new (GCAL_TYPE_YEAR_VIEW, "manager", manager, NULL);
+ priv->manager = manager;
}
diff --git a/src/gcal-year-view.h b/src/gcal-year-view.h
index 51b73e5..68acf1a 100644
--- a/src/gcal-year-view.h
+++ b/src/gcal-year-view.h
@@ -1,11 +1,10 @@
-/*
- * gcal-year-view.h
+/* gcal-year-view.h
*
- * Copyright (C) 2012 - Erick Pérez Castellanos
+ * Copyright (C) 2015 Erick Pérez Castellanos <erick red gmail com>
*
- * This program is free software; you can redistribute it and/or modify
+ * This program 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 2 of the License, or
+ * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
@@ -17,39 +16,44 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef __GCAL_YEAR_VIEW_H__
-#define __GCAL_YEAR_VIEW_H__
+#ifndef GCAL_YEAR_VIEW_H
+#define GCAL_YEAR_VIEW_H
#include "gcal-manager.h"
-#include "gcal-subscriber-view.h"
+#include <gtk/gtk.h>
G_BEGIN_DECLS
-#define GCAL_TYPE_YEAR_VIEW (gcal_year_view_get_type ())
-#define GCAL_YEAR_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GCAL_TYPE_YEAR_VIEW,
GcalYearView))
-#define GCAL_YEAR_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GCAL_TYPE_YEAR_VIEW,
GcalYearViewClass))
-#define GCAL_IS_YEAR_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GCAL_TYPE_YEAR_VIEW))
-#define GCAL_IS_YEAR_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GCAL_TYPE_YEAR_VIEW))
-#define GCAL_YEAR_VIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GCAL_TYPE_YEAR_VIEW,
GcalYearViewClass))
+#define GCAL_TYPE_YEAR_VIEW (gcal_year_view_get_type())
+#define GCAL_YEAR_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCAL_TYPE_YEAR_VIEW,
GcalYearView))
+#define GCAL_YEAR_VIEW_CONST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCAL_TYPE_YEAR_VIEW, GcalYearView
const))
+#define GCAL_YEAR_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCAL_TYPE_YEAR_VIEW,
GcalYearViewClass))
+#define GCAL_IS_YEAR_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCAL_TYPE_YEAR_VIEW))
+#define GCAL_IS_YEAR_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCAL_TYPE_YEAR_VIEW))
+#define GCAL_YEAR_VIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCAL_TYPE_YEAR_VIEW,
GcalYearViewClass))
-typedef struct _GcalYearView GcalYearView;
-typedef struct _GcalYearViewClass GcalYearViewClass;
+typedef struct _GcalYearView GcalYearView;
+typedef struct _GcalYearViewClass GcalYearViewClass;
+typedef struct _GcalYearViewPrivate GcalYearViewPrivate;
struct _GcalYearView
{
- GcalSubscriberView parent;
+ GtkBox parent;
+
+ /*< private >*/
+ GcalYearViewPrivate *priv;
};
struct _GcalYearViewClass
{
- GcalSubscriberViewClass parent_class;
+ GtkBoxClass parent;
};
-GType gcal_year_view_get_type (void);
-
-GtkWidget* gcal_year_view_new (GcalManager *manager);
-
+GType gcal_year_view_get_type (void);
+GcalYearView *gcal_year_view_new (void);
+void gcal_year_view_set_manager (GcalYearView *year_view,
+ GcalManager *manager);
G_END_DECLS
-#endif /* __GCAL_YEAR_VIEW_H__ */
+#endif /* GCAL_YEAR_VIEW_H */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]