From 028eb7b994b35c171638f67d364c5b139ca47d7b Mon Sep 17 00:00:00 2001 From: pandusonu2 Date: Fri, 20 May 2016 22:38:35 +0530 Subject: [PATCH 001/105] window: initialize and include week-view in the main window We add the week-view to the views_stack. Initialize the GtkWidget week_view in the gcal-window.c --- data/ui/window.ui | 13 ++++++++++++- src/gcal-window.c | 16 ++++++++-------- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/data/ui/window.ui b/data/ui/window.ui index 067cb95a..ff2d9937 100644 --- a/data/ui/window.ui +++ b/data/ui/window.ui @@ -52,6 +52,16 @@ + + + True + + + + week + Week + + True @@ -62,6 +72,7 @@ + 1 month Month @@ -75,7 +86,7 @@ - 1 + 2 year Year diff --git a/src/gcal-window.c b/src/gcal-window.c index 5bc2bbbf..58cd3e47 100644 --- a/src/gcal-window.c +++ b/src/gcal-window.c @@ -22,8 +22,8 @@ #include "gcal-manager.h" #include "gcal-view.h" -#include "gcal-month-view.h" #include "gcal-week-view.h" +#include "gcal-month-view.h" #include "gcal-year-view.h" #include "gcal-search-view.h" #include "gcal-event-widget.h" @@ -66,6 +66,7 @@ struct _GcalWindow GtkWidget *search_bar; GtkWidget *views_overlay; GtkWidget *views_stack; + GtkWidget *week_view; GtkWidget *month_view; GtkWidget *year_view; GtkWidget *notification; @@ -1311,6 +1312,7 @@ gcal_window_class_init(GcalWindowClass *klass) gtk_widget_class_bind_template_child (widget_class, GcalWindow, forward_button); gtk_widget_class_bind_template_child (widget_class, GcalWindow, views_overlay); gtk_widget_class_bind_template_child (widget_class, GcalWindow, views_stack); + gtk_widget_class_bind_template_child (widget_class, GcalWindow, week_view); gtk_widget_class_bind_template_child (widget_class, GcalWindow, month_view); gtk_widget_class_bind_template_child (widget_class, GcalWindow, year_view); gtk_widget_class_bind_template_child (widget_class, GcalWindow, views_switcher); @@ -1404,18 +1406,15 @@ gcal_window_constructed (GObject *object) g_object_unref (builder); - /* XXX: Week view disabled until after the release when we restart the work on it*/ - //priv->views[GCAL_WINDOW_VIEW_WEEK] = gcal_week_view_new (); - //gcal_week_view_set_manager (GCAL_WEEK_VIEW (priv->views[GCAL_WINDOW_VIEW_WEEK]), priv->manager); - //gcal_week_view_set_first_weekday (GCAL_WEEK_VIEW (priv->views[GCAL_WINDOW_VIEW_WEEK]), get_first_weekday ()); - //gcal_week_view_set_use_24h_format (GCAL_WEEK_VIEW (priv->views[GCAL_WINDOW_VIEW_WEEK]), use_24h_format); - //gtk_stack_add_titled (GTK_STACK (priv->views_stack), priv->views[GCAL_WINDOW_VIEW_WEEK], "week", _("Week")); - + window->views[GCAL_WINDOW_VIEW_WEEK] = window->week_view; window->views[GCAL_WINDOW_VIEW_MONTH] = window->month_view; window->views[GCAL_WINDOW_VIEW_YEAR] = window->year_view; gcal_edit_dialog_set_time_format (GCAL_EDIT_DIALOG (window->edit_dialog), use_24h_format); + gcal_week_view_set_first_weekday (GCAL_WEEK_VIEW (window->views[GCAL_WINDOW_VIEW_WEEK]), get_first_weekday ()); + gcal_week_view_set_use_24h_format (GCAL_WEEK_VIEW (window->views[GCAL_WINDOW_VIEW_WEEK]), use_24h_format); + gcal_month_view_set_first_weekday (GCAL_MONTH_VIEW (window->views[GCAL_WINDOW_VIEW_MONTH]), get_first_weekday ()); gcal_month_view_set_use_24h_format (GCAL_MONTH_VIEW (window->views[GCAL_WINDOW_VIEW_MONTH]), use_24h_format); @@ -1515,6 +1514,7 @@ gcal_window_set_property (GObject *object, g_signal_connect_swapped (self->manager, "source-changed", G_CALLBACK (source_changed), object); gcal_edit_dialog_set_manager (GCAL_EDIT_DIALOG (self->edit_dialog), self->manager); + gcal_week_view_set_manager (GCAL_WEEK_VIEW (self->week_view), self->manager); gcal_month_view_set_manager (GCAL_MONTH_VIEW (self->month_view), self->manager); gcal_year_view_set_manager (GCAL_YEAR_VIEW (self->year_view), self->manager); gcal_quick_add_popover_set_manager (GCAL_QUICK_ADD_POPOVER (self->quick_add_popover), self->manager); From d31f20ed72bc2e65a8aa943deb94a5bad393d9ed Mon Sep 17 00:00:00 2001 From: pandusonu2 Date: Thu, 16 Jun 2016 02:55:25 +0530 Subject: [PATCH 002/105] window: updated update_active_date() for week-view Added the code required to update_active_date for week-view. --- src/gcal-window.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/gcal-window.c b/src/gcal-window.c index 58cd3e47..73e8f64d 100644 --- a/src/gcal-window.c +++ b/src/gcal-window.c @@ -365,6 +365,7 @@ update_active_date (GcalWindow *window, GDateTime *date_start, *date_end; time_t range_start, range_end; icaltimetype *previous_date; + GDate old_week, new_week; previous_date = window->active_date; window->active_date = new_date; @@ -400,6 +401,26 @@ update_active_date (GcalWindow *window, g_clear_pointer (&date_end, g_date_time_unref); } + /* week_view */ + g_date_set_dmy (&old_week, previous_date->day, previous_date->month, previous_date->year); + g_date_set_dmy (&new_week, new_date->day, new_date->month, new_date->year); + + if (previous_date->year != new_date->year || + g_date_get_iso8601_week_of_year (&old_week) != g_date_get_iso8601_week_of_year(&new_week)) + { + date_start = g_date_time_new_local (new_date->year, new_date->month, new_date->day, 0, 0, 0); + date_start = g_date_time_add_days (date_start, (get_first_weekday() - g_date_time_get_day_of_week (date_start) + 7) % 7 - 8); + range_start = g_date_time_to_unix (date_start); + + date_end = g_date_time_add_days (date_start, 6); + range_end = g_date_time_to_unix (date_end); + + gcal_manager_set_subscriber (window->manager, E_CAL_DATA_MODEL_SUBSCRIBER (window->week_view), range_start, range_end); + + g_clear_pointer (&date_start, g_date_time_unref); + g_clear_pointer (&date_end, g_date_time_unref); + } + update_today_button_sensitive (window); g_free (previous_date); From 3656c781dacd37e03d101f84a0e2e7f1341e1cb4 Mon Sep 17 00:00:00 2001 From: pandusonu2 Date: Sun, 29 May 2016 02:06:04 +0530 Subject: [PATCH 003/105] build: move week view to views/ subfolder Moved the gcal-week-view.{h,c} into views folder. Made changes in the src/Makefile.am and configure.ac to include the views/gcal-week-view.h. --- configure.ac | 2 +- src/Makefile.am | 5 +++-- src/{ => views}/gcal-week-view.c | 0 src/{ => views}/gcal-week-view.h | 0 4 files changed, 4 insertions(+), 3 deletions(-) rename src/{ => views}/gcal-week-view.c (100%) rename src/{ => views}/gcal-week-view.h (100%) diff --git a/configure.ac b/configure.ac index 663570a8..ef32d946 100644 --- a/configure.ac +++ b/configure.ac @@ -12,7 +12,7 @@ AC_CONFIG_AUX_DIR([build-aux]) AM_SILENT_RULES([yes]) # require automake 1.13 -AM_INIT_AUTOMAKE([1.13 dist-xz no-dist-gzip tar-ustar]) +AM_INIT_AUTOMAKE([1.13 dist-xz no-dist-gzip tar-ustar subdir-objects]) AM_MAINTAINER_MODE([enable]) dnl *************************************************************************** diff --git a/src/Makefile.am b/src/Makefile.am index ab79ae70..c7221f1e 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,4 +1,5 @@ AM_CPPFLAGS = \ + -I$(srcdir)/views \ -DPACKAGE_LOCALE_DIR=\""$(localedir)"\" \ -DPACKAGE_SRC_DIR=\""$(srcdir)"\" \ -DPACKAGE_DATA_DIR=\""$(pkgdatadir)"\" \ @@ -66,8 +67,8 @@ gnome_calendar_SOURCES = \ gcal-utils.h \ gcal-view.c \ gcal-view.h \ - gcal-week-view.c \ - gcal-week-view.h \ + views/gcal-week-view.c \ + views/gcal-week-view.h \ gcal-window.h \ gcal-window.c \ gcal-year-view.c \ diff --git a/src/gcal-week-view.c b/src/views/gcal-week-view.c similarity index 100% rename from src/gcal-week-view.c rename to src/views/gcal-week-view.c diff --git a/src/gcal-week-view.h b/src/views/gcal-week-view.h similarity index 100% rename from src/gcal-week-view.h rename to src/views/gcal-week-view.h From 69cade3d77b90c43c8262ea96065982184dace2a Mon Sep 17 00:00:00 2001 From: pandusonu2 Date: Tue, 31 May 2016 05:18:33 +0530 Subject: [PATCH 004/105] week-header: created the basic skeleton of the week-header Created the .h, .c and .ui file of week header. Also made changes in the Makefile.am for it to get built. --- data/Makefile.am | 1 + data/calendar.gresource.xml | 1 + data/ui/week-header.ui | 29 ++++ src/Makefile.am | 2 + src/views/gcal-week-header.c | 293 +++++++++++++++++++++++++++++++++++ src/views/gcal-week-header.h | 45 ++++++ src/views/gcal-week-view.c | 33 ++-- src/views/gcal-week-view.h | 5 +- 8 files changed, 389 insertions(+), 20 deletions(-) create mode 100644 data/ui/week-header.ui create mode 100644 src/views/gcal-week-header.c create mode 100644 src/views/gcal-week-header.h diff --git a/data/Makefile.am b/data/Makefile.am index 046d2404..dfe72104 100644 --- a/data/Makefile.am +++ b/data/Makefile.am @@ -61,6 +61,7 @@ EXTRA_DIST= \ ui/search-view.ui \ ui/source-dialog.ui \ ui/time-selector.ui \ + ui/week-header.ui \ ui/window.ui \ ui/year-view.ui \ theme/gtk-styles.css \ diff --git a/data/calendar.gresource.xml b/data/calendar.gresource.xml index 7c64779b..1542e44c 100644 --- a/data/calendar.gresource.xml +++ b/data/calendar.gresource.xml @@ -12,6 +12,7 @@ ui/search-view.ui ui/source-dialog.ui ui/time-selector.ui + ui/week-header.ui ui/window.ui ui/year-view.ui theme/gtk-styles.css diff --git a/data/ui/week-header.ui b/data/ui/week-header.ui new file mode 100644 index 00000000..5563553c --- /dev/null +++ b/data/ui/week-header.ui @@ -0,0 +1,29 @@ + + + + \ No newline at end of file diff --git a/src/Makefile.am b/src/Makefile.am index c7221f1e..0a583bf3 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -67,6 +67,8 @@ gnome_calendar_SOURCES = \ gcal-utils.h \ gcal-view.c \ gcal-view.h \ + views/gcal-week-header.c \ + views/gcal-week-header.h \ views/gcal-week-view.c \ views/gcal-week-view.h \ gcal-window.h \ diff --git a/src/views/gcal-week-header.c b/src/views/gcal-week-header.c new file mode 100644 index 00000000..aa687065 --- /dev/null +++ b/src/views/gcal-week-header.c @@ -0,0 +1,293 @@ +/* gcal-week-header.c + * + * Copyright (C) 2016 Vamsi Krishna Gollapudi + * + * 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 3 of the License, or + * (at your option) any later version. + * + * This program 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 . + */ + + +#include "gcal-week-header.h" +#include "gcal-week-view.h" +#include "gcal-utils.h" +#include "gcal-view.h" +#include "gcal-event-widget.h" + +#include +#include +#include + +#define ALL_DAY_CELLS_HEIGHT 40 + +struct _GcalWeekHeader +{ + GtkScrolledWindow parent; + + GtkWidget *grid; + + GcalManager *manager; + + gint first_weekday; + + gboolean use_24h_format; + + icaltimetype *current_date; +}; + +static void gcal_week_header_finalize (GObject *object); + +static void gcal_week_header_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *psec); + +static void gcal_week_header_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec); + +static gboolean gcal_week_header_draw (GcalWeekHeader *self, + cairo_t *cr, + GtkWidget *widget); + +G_DEFINE_TYPE (GcalWeekHeader, gcal_week_header, GTK_TYPE_SCROLLED_WINDOW); + +static void +gcal_week_header_finalize (GObject *object) +{ + GcalWeekHeader *self = GCAL_WEEK_HEADER (object); + + g_clear_pointer (&self->current_date, g_free); +} + +static void +gcal_week_header_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GcalWeekHeader *self = GCAL_WEEK_HEADER (object); + + switch (prop_id) + { + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +gcal_week_header_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GcalWeekHeader *self = GCAL_WEEK_HEADER (object); + + switch (prop_id) + { + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static gboolean +gcal_week_header_draw (GcalWeekHeader *self, + cairo_t *cr, + GtkWidget *widget) +{ + GtkStyleContext *context; + GtkStateFlags state; + GdkRGBA color; + GtkAllocation *alloc; + GtkBorder *padding; + + PangoLayout *layout; + PangoFontDescription *bold_font; + + gint i; + gint pos_i; + gint start_grid_y; + gint font_height; + gdouble sidebar_width; + gdouble cell_width; + icaltimetype *start_of_week; + gint current_cell; + + cairo_pattern_t *pattern; + + cairo_save(cr); + start_grid_y = gcal_week_view_get_start_grid_y (widget); + + /* Fonts and colour selection */ + context = gtk_widget_get_style_context (widget); + state = gtk_widget_get_state_flags (widget); + + gtk_style_context_get_padding (context, state, padding); + gtk_widget_get_allocation (widget, alloc); + + pattern = cairo_pattern_create_linear (0, start_grid_y - 18, + 0, start_grid_y + 6); + + cairo_pattern_add_color_stop_rgba (pattern, 0.0, 0, 0, 0, 0.6); + cairo_pattern_add_color_stop_rgba (pattern, 1.0, 0, 0, 0, 0.0); + + cairo_set_source (cr, pattern); + cairo_pattern_destroy (pattern); + + cairo_rectangle (cr, 0, start_grid_y, alloc->width, 6); + cairo_fill (cr); + + gtk_style_context_get_color (context, state, &color); + gdk_cairo_set_source_rgba (cr, &color); + + layout = pango_cairo_create_layout (cr); + gtk_style_context_get (context, state, "font", &bold_font, NULL); + pango_font_description_set_weight (bold_font, PANGO_WEIGHT_SEMIBOLD); + pango_layout_set_font_description (layout, bold_font); + + start_of_week = gcal_week_view_get_initial_date (GCAL_VIEW (widget)); + current_cell = icaltime_day_of_week (*(self->current_date)) - 1; + current_cell = (7 + current_cell - self->first_weekday) % 7; + + sidebar_width = gcal_week_view_get_sidebar_width (widget); + cell_width = (alloc->width - sidebar_width) / 7; + pango_layout_get_pixel_size (layout, NULL, &font_height); + + gtk_style_context_save (context); + gtk_style_context_add_class (context, "current"); + gtk_render_background (context, cr, + cell_width * current_cell + sidebar_width, + font_height + padding->bottom, + cell_width, + ALL_DAY_CELLS_HEIGHT); + gtk_style_context_remove_class (context, "current"); + gtk_style_context_restore (context); + + for (i = 0; i < 7; i++) + { + gchar *weekday_header; + gchar *weekday_abv; + gint n_day; + + n_day = start_of_week->day + i; + if (n_day > icaltime_days_in_month (start_of_week->month, + start_of_week->year)) + { + n_day = n_day - icaltime_days_in_month (start_of_week->month, + start_of_week->year); + } + + /* Draw the week days with dates */ + weekday_abv = gcal_get_weekday ((i + self->first_weekday) % 7); + weekday_header = g_strdup_printf ("%s %d", weekday_abv, n_day); + + pango_layout_set_text (layout, weekday_header, -1); + cairo_move_to (cr, + padding->left + cell_width * i + sidebar_width, + 0.0); + pango_cairo_show_layout (cr, layout); + + /* Draws the lines after each day of the week */ + cairo_save (cr); + cairo_move_to (cr, + cell_width * i + sidebar_width + 0.3, + font_height + padding->bottom); + cairo_rel_line_to (cr, 0.0, ALL_DAY_CELLS_HEIGHT); + cairo_stroke (cr); + cairo_restore (cr); + + g_free (weekday_header); + } + + gtk_style_context_get_color (context, + state | GTK_STATE_FLAG_INSENSITIVE, + &color); + gdk_cairo_set_source_rgba (cr, &color); + pos_i = font_height + padding->bottom; + cairo_move_to (cr, sidebar_width, pos_i + 0.3); + cairo_rel_line_to (cr, alloc->width - sidebar_width, 0); + + cairo_stroke (cr); + + cairo_restore (cr); + + g_free (start_of_week); + pango_font_description_free (bold_font); + g_object_unref (layout); + + return FALSE; +} + +static void +gcal_week_header_class_init (GcalWeekHeaderClass *kclass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (kclass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (kclass); + + object_class->finalize = gcal_week_header_finalize; + object_class->get_property = gcal_week_header_get_property; + object_class->set_property = gcal_week_header_set_property; + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/calendar/week-header.ui"); + + gtk_widget_class_bind_template_child (widget_class, GcalWeekHeader, grid); + + gtk_widget_class_bind_template_callback (widget_class, gcal_week_header_draw); + + gtk_widget_class_set_css_name (widget_class, "calendar-view"); +} + +static void +gcal_week_header_init (GcalWeekHeader *self) +{ + gtk_widget_init_template (GTK_WIDGET (self)); +} + +/* Public API */ +void +gcal_week_header_set_manager (GcalWeekHeader *self, + GcalManager *manager) +{ + g_return_if_fail (GCAL_IS_WEEK_HEADER (self)); + + self->manager = manager; +} + +void +gcal_week_header_set_first_weekday (GcalWeekHeader *self, + gint nr_day) +{ + g_return_if_fail (GCAL_IS_WEEK_HEADER (self)); + + self->first_weekday = nr_day; +} + +void +gcal_week_header_set_use_24h_format (GcalWeekHeader *self, + gboolean use_24h_format) +{ + g_return_if_fail (GCAL_IS_WEEK_HEADER (self)); + + self->use_24h_format = use_24h_format; +} + +void +gcal_week_header_set_current_date (GcalWeekHeader *self, + icaltimetype *current_date) +{ + g_return_if_fail (GCAL_IS_WEEK_HEADER (self)); + + self->current_date = current_date; + + gtk_widget_queue_draw (GTK_WIDGET (self)); +} \ No newline at end of file diff --git a/src/views/gcal-week-header.h b/src/views/gcal-week-header.h new file mode 100644 index 00000000..527876a7 --- /dev/null +++ b/src/views/gcal-week-header.h @@ -0,0 +1,45 @@ +/* gcal-week-header.h + * + * Copyright (C) 2016 Vamsi Krishna Gollapudi + * + * 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 3 of the License, or + * (at your option) any later version. + * + * This program 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 . + */ + +#ifndef GCAL_WEEK_HEADER_H +#define GCAL_WEEK_HEADER_H + +#include "gcal-manager.h" +#include "gcal-event-widget.h" +#include "gcal-subscriber-view.h" + +#include + +G_BEGIN_DECLS + +#define GCAL_TYPE_WEEK_HEADER (gcal_week_header_get_type()) + +G_DECLARE_FINAL_TYPE (GcalWeekHeader, gcal_week_header, GCAL, WEEK_HEADER, GtkScrolledWindow) + +void gcal_week_header_set_manager (GcalWeekHeader *self, + GcalManager *manager); +void gcal_week_header_set_first_weekday (GcalWeekHeader *self, + gint nr_day); +void gcal_week_header_set_use_24h_format (GcalWeekHeader *self, + gboolean use_24h_format); +void gcal_week_header_set_current_date (GcalWeekHeader *self, + icaltimetype *current_date); + +G_END_DECLS + +#endif /* GCAL_WEEK_HEADER_H */ diff --git a/src/views/gcal-week-view.c b/src/views/gcal-week-view.c index 264ab891..8b8e3058 100644 --- a/src/views/gcal-week-view.c +++ b/src/views/gcal-week-view.c @@ -22,6 +22,7 @@ #include "gcal-utils.h" #include "gcal-view.h" #include "gcal-event-widget.h" +#include "gcal-week-header.h" #include @@ -87,8 +88,6 @@ typedef struct gint clicked_cell; } GcalWeekViewPrivate; -static gint get_start_grid_y (GtkWidget *widget); - static void event_opened (GcalEventWidget *event_widget, gpointer user_data); @@ -100,8 +99,6 @@ static void draw_header (GcalWeekView *view static void draw_grid_window (GcalWeekView *view, cairo_t *cr); -static gint get_sidebar_width (GtkWidget *widget); - static void gcal_week_view_constructed (GObject *object); static void gcal_week_view_finalize (GObject *object); @@ -149,8 +146,6 @@ static void gcal_week_view_forall (GtkContainer *cont static void gcal_week_view_scroll_value_changed (GtkAdjustment *adjusment, gpointer user_data); -static icaltimetype* gcal_week_view_get_initial_date (GcalView *view); - static icaltimetype* gcal_week_view_get_final_date (GcalView *view); static GtkWidget* gcal_week_view_get_by_uuid (GcalSubscriberView *view, @@ -163,7 +158,7 @@ G_DEFINE_TYPE_WITH_CODE (GcalWeekView, gcal_week_view, GCAL_TYPE_SUBSCRIBER_VIEW G_IMPLEMENT_INTERFACE (GCAL_TYPE_VIEW, gcal_view_interface_init)); /** - * get_start_grid_y: + * gcal_week_view_get_start_grid_y: * * In GcalMonthView this method returns the height of the headers of the view * and the grid. Here this points just the place where the grid_window hides @@ -173,8 +168,8 @@ G_DEFINE_TYPE_WITH_CODE (GcalWeekView, gcal_week_view, GCAL_TYPE_SUBSCRIBER_VIEW * - The grid header dislaying weekdays * - The cell containing all-day events. */ -static gint -get_start_grid_y (GtkWidget *widget) +gint +gcal_week_view_get_start_grid_y (GtkWidget *widget) { GtkStyleContext *context; GtkStateFlags flags; @@ -250,7 +245,7 @@ draw_header (GcalWeekView *view, widget = GTK_WIDGET (view); cairo_save (cr); - start_grid_y = get_start_grid_y (widget); + start_grid_y = gcal_week_view_get_start_grid_y (widget); context = gtk_widget_get_style_context (widget); state = gtk_widget_get_state_flags (widget); @@ -280,7 +275,7 @@ draw_header (GcalWeekView *view, current_cell = icaltime_day_of_week (*(priv->date)) - 1; current_cell = (7 + current_cell - priv->first_weekday) % 7; - sidebar_width = get_sidebar_width (widget); + sidebar_width = gcal_week_view_get_sidebar_width (widget); cell_width = (alloc->width - sidebar_width) / 7; pango_layout_get_pixel_size (layout, NULL, &font_height); @@ -381,7 +376,7 @@ draw_grid_window (GcalWeekView *view, pango_layout_set_font_description (layout, font_desc); gdk_cairo_set_source_rgba (cr, &color); - sidebar_width = get_sidebar_width (widget); + sidebar_width = gcal_week_view_get_sidebar_width (widget); width = gdk_window_get_width (priv->grid_window); height = gdk_window_get_height (priv->grid_window); @@ -463,8 +458,8 @@ draw_grid_window (GcalWeekView *view, g_object_unref (layout); } -static gint -get_sidebar_width (GtkWidget *widget) +gint +gcal_week_view_get_sidebar_width (GtkWidget *widget) { GtkStyleContext *context; GtkBorder padding; @@ -824,7 +819,7 @@ gcal_week_view_size_allocate (GtkWidget *widget, gtk_widget_get_state_flags (widget), &padding); - start_grid_y = get_start_grid_y (widget); + start_grid_y = gcal_week_view_get_start_grid_y (widget); gdk_window_move_resize (priv->event_window, allocation->x, @@ -890,7 +885,7 @@ gcal_week_view_size_allocate (GtkWidget *widget, gtk_widget_hide (priv->vscrollbar); } - sidebar_width = get_sidebar_width (widget); + sidebar_width = gcal_week_view_get_sidebar_width (widget); horizontal_block = (allocation->width - sidebar_width) / 7.0; vertical_block = gdk_window_get_height (priv->grid_window) / 24.0; @@ -1088,7 +1083,7 @@ gcal_week_view_button_press_event (GtkWidget *widget, y = event->y; - start_grid_y = get_start_grid_y (widget); + start_grid_y = gcal_week_view_get_start_grid_y (widget); if (y - start_grid_y < 0) { @@ -1110,7 +1105,7 @@ gcal_week_view_button_release_event (GtkWidget *widget, y = event->y; - start_grid_y = get_start_grid_y (widget); + start_grid_y = gcal_week_view_get_start_grid_y (widget); if (y - start_grid_y < 0) { @@ -1286,7 +1281,7 @@ gcal_week_view_scroll_value_changed (GtkAdjustment *adjusment, * Return value: the first day of the week * Returns: (transfer full): Release with g_free() **/ -static icaltimetype* +icaltimetype* gcal_week_view_get_initial_date (GcalView *view) { GcalWeekViewPrivate *priv; diff --git a/src/views/gcal-week-view.h b/src/views/gcal-week-view.h index 120abb4a..01bcf61a 100644 --- a/src/views/gcal-week-view.h +++ b/src/views/gcal-week-view.h @@ -21,7 +21,7 @@ #define __GCAL_WEEK_VIEW_H__ #include "gcal-manager.h" - +#include "gcal-view.h" #include "gcal-subscriber-view.h" G_BEGIN_DECLS @@ -54,6 +54,9 @@ void gcal_week_view_set_first_weekday (GcalWeekView *view, gint day_nr); void gcal_week_view_set_use_24h_format (GcalWeekView *view, gboolean use_24h); +gint gcal_week_view_get_sidebar_width (GtkWidget *widget); +icaltimetype* gcal_week_view_get_initial_date (GcalView *view); +gint gcal_week_view_get_start_grid_y (GtkWidget *widget); G_END_DECLS From c658d030b873e039fe7fd247c60c106b763651fc Mon Sep 17 00:00:00 2001 From: pandusonu2 Date: Tue, 7 Jun 2016 19:43:00 +0530 Subject: [PATCH 005/105] week-grid: created the basic skeleton of week-grid Created the .h, .c and .ui file of week grid. Also made changes in the Makefile.am for it to get built. --- src/Makefile.am | 2 + src/views/gcal-week-grid.c | 309 +++++++++++++++++++++++++++++++++++++ src/views/gcal-week-grid.h | 45 ++++++ src/views/gcal-week-view.c | 1 + 4 files changed, 357 insertions(+) create mode 100644 src/views/gcal-week-grid.c create mode 100644 src/views/gcal-week-grid.h diff --git a/src/Makefile.am b/src/Makefile.am index 0a583bf3..d644c642 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -67,6 +67,8 @@ gnome_calendar_SOURCES = \ gcal-utils.h \ gcal-view.c \ gcal-view.h \ + views/gcal-week-grid.c \ + views/gcal-week-grid.h \ views/gcal-week-header.c \ views/gcal-week-header.h \ views/gcal-week-view.c \ diff --git a/src/views/gcal-week-grid.c b/src/views/gcal-week-grid.c new file mode 100644 index 00000000..c19c97fc --- /dev/null +++ b/src/views/gcal-week-grid.c @@ -0,0 +1,309 @@ +/* gcal-week-grid.c + * + * Copyright (C) 2016 Vamsi Krishna Gollapudi + * + * 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 3 of the License, or + * (at your option) any later version. + * + * This program 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 . + */ + +#include "gcal-week-grid.h" +#include "gcal-week-view.h" +#include "gcal-utils.h" +#include "gcal-view.h" +#include "gcal-event-widget.h" + +#include +#include +#include + +static const double dashed [] = +{ + 1.0, + 1.0 +}; + +struct _GcalWeekGrid +{ + GtkContainer parent; + + GtkWidget *hours_sidebar; + + GcalManager *manager; + + gint first_weekday; + + gboolean use_24h_format; + + icaltimetype *active_date; + icaltimetype *current_date; +}; + +static void gcal_week_grid_finalize (GObject *object); + +static void gcal_week_grid_add (GtkContainer *container, + GtkWidget *widget); + +static void gcal_week_grid_remove (GtkContainer *container, + GtkWidget *widget); + +static void gcal_week_grid_forall (GtkContainer *container, + gboolean include_internals, + GtkCallback callback, + gpointer callback_data); + +static void gcal_week_grid_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *psec); + +static void gcal_week_grid_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec); + +static gboolean gcal_week_grid_draw (GtkWidget *widget, + cairo_t *cr); + +G_DEFINE_TYPE (GcalWeekGrid, gcal_week_grid, GTK_TYPE_CONTAINER); + +static void +gcal_week_grid_finalize (GObject *object) +{ + GcalWeekGrid *self = GCAL_WEEK_GRID (object); + + g_clear_pointer (&self->active_date, g_free); + g_clear_pointer (&self->current_date, g_free); +} + +static void +gcal_week_grid_add (GtkContainer *container, + GtkWidget *widget) +{ +} + +static void +gcal_week_grid_remove (GtkContainer *container, + GtkWidget *widget) +{ +} + +static void +gcal_week_grid_forall (GtkContainer *container, + gboolean include_internals, + GtkCallback callback, + gpointer callback_data) +{ +} + +static void +gcal_week_grid_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GcalWeekGrid *self = GCAL_WEEK_GRID (object); + + switch (prop_id) + { + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +gcal_week_grid_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GcalWeekGrid *self = GCAL_WEEK_GRID (object); + + switch (prop_id) + { + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static gboolean +gcal_week_grid_draw (GtkWidget *widget, + cairo_t *cr) +{ + GcalWeekGrid *self; + GtkStyleContext *context; + GtkStateFlags state; + GtkBorder padding; + GdkRGBA color; + + gint i; + gint width; + gint height; + gdouble sidebar_width; + gint current_cell; + + PangoLayout *layout; + PangoFontDescription *font_desc; + + self = GCAL_WEEK_GRID (widget); + + context = gtk_widget_get_style_context (widget); + state = gtk_widget_get_state_flags (widget); + + gtk_style_context_get_color (context, state, &color); + gtk_style_context_get_padding (context, state, &padding); + gtk_style_context_get (context, state, "font", &font_desc, NULL); + + layout = pango_cairo_create_layout (cr); + pango_layout_set_font_description (layout, font_desc); + gdk_cairo_set_source_rgba (cr, &color); + + sidebar_width = gcal_week_view_get_sidebar_width (widget); + width = gtk_widget_get_allocated_width (widget); + height = gtk_widget_get_allocated_height (widget); + + current_cell = icaltime_day_of_week (*(self->current_date)) - 1; + current_cell = (7 + current_cell - self->first_weekday) % 7; + + gtk_style_context_save (context); + gtk_style_context_add_class (context, "current"); + gtk_render_background (context, cr, + ((width - sidebar_width)/ 7.0) * current_cell + sidebar_width, + 0, + ((width - sidebar_width)/ 7.0), + height); + gtk_style_context_remove_class (context, "current"); + gtk_style_context_restore (context); + + for (i = 0; i < 24; i++) + { + gchar *hours; + if (self->use_24h_format) + { + hours = g_strdup_printf ("%02d:00", i); + pango_layout_set_text (layout, hours, -1); + } + else + { + hours = g_strdup_printf ("%02d:00 %s", + i % 12, + i < 12 ? _("AM") : _("PM")); + + if (i == 0) + pango_layout_set_text (layout, _("Midnight"), -1); + else if (i == 12) + pango_layout_set_text (layout, _("Noon"), -1); + else + pango_layout_set_text (layout, hours, -1); + } + + cairo_move_to (cr, padding.left, padding.top + (height / 24) * i); + pango_cairo_show_layout (cr, layout); + + g_free (hours); + } + + for (i = 0; i < 7; i++) + { + cairo_move_to (cr, + sidebar_width + ((width - sidebar_width) / 7) * i + 0.4, + 0); + cairo_rel_line_to (cr, 0, height); + } + + for (i = 0; i < 24; i++) + { + cairo_move_to (cr, 0, (height / 24) * i + 0.4); + cairo_rel_line_to (cr, width, 0); + } + + cairo_stroke (cr); + + cairo_set_dash (cr, dashed, 2, 0); + for (i = 0; i < 24; i++) + { + cairo_move_to (cr, sidebar_width, (height / 24) * i + (height / 48) + 0.4); + cairo_rel_line_to (cr, width - sidebar_width, 0); + } + + cairo_stroke (cr); + + pango_font_description_free (font_desc); + g_object_unref (layout); + + return FALSE; +} + +static void +gcal_week_grid_class_init (GcalWeekGridClass *klass) +{ + GtkContainerClass *contianer_class = GTK_CONTAINER_CLASS (klass); + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + contianer_class->add = gcal_week_grid_add; + contianer_class->remove = gcal_week_grid_remove; + contianer_class->forall = gcal_week_grid_forall; + + object_class->finalize = gcal_week_grid_finalize; + object_class->get_property = gcal_week_grid_get_property; + object_class->set_property = gcal_week_grid_set_property; + + widget_class->draw = gcal_week_grid_draw; + + gtk_widget_class_set_css_name (widget_class, "calendar-view"); +} + +static void +gcal_week_grid_init (GcalWeekGrid *self) +{ + gtk_widget_init_template (GTK_WIDGET (self)); +} + +/* Public API */ +void +gcal_week_grid_set_manager (GcalWeekGrid *self, + GcalManager *manager) +{ + g_return_if_fail (GCAL_IS_WEEK_GRID (self)); + + self->manager = manager; +} + +void +gcal_week_grid_set_first_weekday (GcalWeekGrid *self, + gint nr_day) +{ + g_return_if_fail (GCAL_IS_WEEK_GRID (self)); + + self->first_weekday = nr_day; +} + +void +gcal_week_grid_set_use_24h_format (GcalWeekGrid *self, + gboolean use_24h_format) +{ + g_return_if_fail (GCAL_IS_WEEK_GRID (self)); + + self->use_24h_format = use_24h_format; +} + +void +gcal_week_grid_set_current_date (GcalWeekGrid *self, + icaltimetype *current_date) +{ + g_return_if_fail (GCAL_IS_WEEK_GRID (self)); + + self->current_date = gcal_dup_icaltime (current_date); + + gtk_widget_queue_draw (GTK_WIDGET (self)); +} \ No newline at end of file diff --git a/src/views/gcal-week-grid.h b/src/views/gcal-week-grid.h new file mode 100644 index 00000000..28ca0516 --- /dev/null +++ b/src/views/gcal-week-grid.h @@ -0,0 +1,45 @@ +/* gcal-week-grid.h + * + * Copyright (C) 2016 Vamsi Krishna Gollapudi + * + * 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 3 of the License, or + * (at your option) any later version. + * + * This program 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 . + */ + +#ifndef GCAL_WEEK_GRID_H +#define GCAL_WEEK_GRID_H + +#include "gcal-manager.h" +#include "gcal-event-widget.h" +#include "gcal-subscriber-view.h" + +#include + +G_BEGIN_DECLS + +#define GCAL_TYPE_WEEK_GRID (gcal_week_grid_get_type()) + +G_DECLARE_FINAL_TYPE (GcalWeekGrid, gcal_week_grid, GCAL, WEEK_GRID, GtkContainer) + +void gcal_week_grid_set_manager (GcalWeekGrid *week_grid, + GcalManager *manager); +void gcal_week_grid_set_first_weekday (GcalWeekGrid *week_grid, + gint nr_day); +void gcal_week_grid_set_use_24h_format (GcalWeekGrid *week_grid, + gboolean use_24h_format); +void gcal_week_grid_set_current_date (GcalWeekGrid *week_grid, + icaltimetype *current_date); + +G_END_DECLS + +#endif /* GCAL_WEEK_GRID_H */ \ No newline at end of file diff --git a/src/views/gcal-week-view.c b/src/views/gcal-week-view.c index 8b8e3058..58686712 100644 --- a/src/views/gcal-week-view.c +++ b/src/views/gcal-week-view.c @@ -23,6 +23,7 @@ #include "gcal-view.h" #include "gcal-event-widget.h" #include "gcal-week-header.h" +#include "gcal-week-grid.h" #include From 383cd818e9dd4459ca2de543a958b2533b9cefd3 Mon Sep 17 00:00:00 2001 From: pandusonu2 Date: Mon, 6 Jun 2016 21:55:40 +0530 Subject: [PATCH 006/105] week-view: remove unused code Cleaning up the week-view.c file. Removing the previously written code which won't be required. --- src/views/gcal-week-view.c | 996 +------------------------------------ 1 file changed, 6 insertions(+), 990 deletions(-) diff --git a/src/views/gcal-week-view.c b/src/views/gcal-week-view.c index 58686712..93a06d6f 100644 --- a/src/views/gcal-week-view.c +++ b/src/views/gcal-week-view.c @@ -56,26 +56,15 @@ typedef struct _GcalWeekViewChild GcalWeekViewChild; typedef struct { - /** - * This is where we keep the refs of the child widgets. - * Every child added to the list placed in the position - * of it corresponding cell number. - * The cell number is calculated in _add method. - * day[0] Represents the first_weekday according to locale - */ - GList *days [7]; + GtkBox parent; - GdkWindow *view_window; - GdkWindow *grid_window; - - GtkWidget *vscrollbar; - - /** + /* * first day of the week according to user locale, being - * 0 for Sunday, 1 for Monday and so on */ + * 0 for Sunday, 1 for Monday and so on + */ gint first_weekday; - /** + /* * clock format from GNOME desktop settings */ gboolean use_24h_format; @@ -84,22 +73,9 @@ typedef struct icaltimetype *date; GcalManager *manager; /* weak referenced */ - GdkWindow *event_window; - gint clicked_cell; } GcalWeekViewPrivate; -static void event_opened (GcalEventWidget *event_widget, - gpointer user_data); - -static void draw_header (GcalWeekView *view, - cairo_t *cr, - GtkAllocation *alloc, - GtkBorder *padding); - -static void draw_grid_window (GcalWeekView *view, - cairo_t *cr); - static void gcal_week_view_constructed (GObject *object); static void gcal_week_view_finalize (GObject *object); @@ -114,51 +90,15 @@ static void gcal_week_view_get_property (GObject *obje GValue *value, GParamSpec *pspec); -static void gcal_week_view_realize (GtkWidget *widget); - -static void gcal_week_view_unrealize (GtkWidget *widget); - -static void gcal_week_view_size_allocate (GtkWidget *widget, - GtkAllocation *allocation); - -static gboolean gcal_week_view_draw (GtkWidget *widget, - cairo_t *cr); - -static gboolean gcal_week_view_scroll_event (GtkWidget *widget, - GdkEventScroll *event); - -static gboolean gcal_week_view_button_press_event (GtkWidget *widget, - GdkEventButton *event); - -static gboolean gcal_week_view_button_release_event (GtkWidget *widget, - GdkEventButton *event); - -static void gcal_week_view_add (GtkContainer *constainer, - GtkWidget *widget); - -static void gcal_week_view_remove (GtkContainer *constainer, - GtkWidget *widget); - -static void gcal_week_view_forall (GtkContainer *container, - gboolean include_internals, - GtkCallback callback, - gpointer callback_data); - -static void gcal_week_view_scroll_value_changed (GtkAdjustment *adjusment, - gpointer user_data); - static icaltimetype* gcal_week_view_get_final_date (GcalView *view); -static GtkWidget* gcal_week_view_get_by_uuid (GcalSubscriberView *view, - const gchar *uuid); - static void gcal_view_interface_init (GcalViewInterface *iface); G_DEFINE_TYPE_WITH_CODE (GcalWeekView, gcal_week_view, GCAL_TYPE_SUBSCRIBER_VIEW, G_ADD_PRIVATE (GcalWeekView) G_IMPLEMENT_INTERFACE (GCAL_TYPE_VIEW, gcal_view_interface_init)); -/** +/* * gcal_week_view_get_start_grid_y: * * In GcalMonthView this method returns the height of the headers of the view @@ -206,259 +146,6 @@ gcal_week_view_get_start_grid_y (GtkWidget *widget) return start_grid_y; } -static void -event_opened (GcalEventWidget *event_widget, - gpointer user_data) -{ - g_signal_emit_by_name (GCAL_VIEW (user_data), - "event-activated", - event_widget); -} - -static void -draw_header (GcalWeekView *view, - cairo_t *cr, - GtkAllocation *alloc, - GtkBorder *padding) -{ - GcalWeekViewPrivate *priv; - GtkWidget *widget; - GtkStyleContext *context; - GtkStateFlags state; - GdkRGBA color; - /* GdkRGBA current_color; */ - - PangoLayout *layout; - PangoFontDescription *bold_font; - - gint i; - gint pos_i; - gint start_grid_y; - gint font_height; - gdouble sidebar_width; - gdouble cell_width; - icaltimetype *start_of_week; - gint current_cell; - - cairo_pattern_t *pattern; - - priv = gcal_week_view_get_instance_private (view); - widget = GTK_WIDGET (view); - - cairo_save (cr); - start_grid_y = gcal_week_view_get_start_grid_y (widget); - context = gtk_widget_get_style_context (widget); - state = gtk_widget_get_state_flags (widget); - - /* adding shadow */ - pattern = cairo_pattern_create_linear(0, start_grid_y - 18, - 0, start_grid_y + 6); - - cairo_pattern_add_color_stop_rgba(pattern, 0.0, 0, 0, 0, 0.6); - cairo_pattern_add_color_stop_rgba(pattern, 1.0, 0, 0, 0, 0.0); - - cairo_set_source(cr, pattern); - cairo_pattern_destroy(pattern); - - cairo_rectangle(cr, 0, start_grid_y, alloc->width, 6); - cairo_fill(cr); - - gtk_style_context_get_color (context, state, &color); - gdk_cairo_set_source_rgba (cr, &color); - - /* grid header */ - layout = pango_cairo_create_layout (cr); - gtk_style_context_get (context, state, "font", &bold_font, NULL); - pango_font_description_set_weight (bold_font, PANGO_WEIGHT_SEMIBOLD); - pango_layout_set_font_description (layout, bold_font); - - start_of_week = gcal_week_view_get_initial_date (GCAL_VIEW (view)); - current_cell = icaltime_day_of_week (*(priv->date)) - 1; - current_cell = (7 + current_cell - priv->first_weekday) % 7; - - sidebar_width = gcal_week_view_get_sidebar_width (widget); - cell_width = (alloc->width - sidebar_width) / 7; - pango_layout_get_pixel_size (layout, NULL, &font_height); - - gtk_style_context_save (context); - gtk_style_context_add_class (context, "current"); - gtk_render_background (context, cr, - cell_width * current_cell + sidebar_width, - font_height + padding->bottom, - cell_width, - ALL_DAY_CELLS_HEIGHT); - gtk_style_context_remove_class (context, "current"); - gtk_style_context_restore (context); - - for (i = 0; i < 7; i++) - { - gchar *weekday_header; - gchar *weekday_abv; - gint n_day; - - n_day = start_of_week->day + i; - if (n_day > icaltime_days_in_month (start_of_week->month, - start_of_week->year)) - { - n_day = n_day - icaltime_days_in_month (start_of_week->month, - start_of_week->year); - } - - weekday_abv = gcal_get_weekday ((i + priv->first_weekday) % 7); - weekday_header = g_strdup_printf ("%s %d", weekday_abv, n_day); - - pango_layout_set_text (layout, weekday_header, -1); - cairo_move_to (cr, - padding->left + cell_width * i + sidebar_width, - 0.0); - pango_cairo_show_layout (cr, layout); - - cairo_save (cr); - cairo_move_to (cr, - cell_width * i + sidebar_width + 0.3, - font_height + padding->bottom); - cairo_rel_line_to (cr, 0.0, ALL_DAY_CELLS_HEIGHT); - cairo_stroke (cr); - cairo_restore (cr); - - g_free (weekday_header); - } - - /* horizontal line */ - gtk_style_context_get_color (context, - state | GTK_STATE_FLAG_INSENSITIVE, - &color); - gdk_cairo_set_source_rgba (cr, &color); - pos_i = font_height + padding->bottom; - cairo_move_to (cr, sidebar_width, pos_i + 0.3); - cairo_rel_line_to (cr, alloc->width - sidebar_width, 0); - - cairo_stroke (cr); - - cairo_restore (cr); - - g_free (start_of_week); - pango_font_description_free (bold_font); - g_object_unref (layout); -} - -static void -draw_grid_window (GcalWeekView *view, - cairo_t *cr) -{ - GcalWeekViewPrivate *priv; - GtkWidget *widget; - - GtkStyleContext *context; - GtkStateFlags state; - GtkBorder padding; - GdkRGBA color; - - gint i; - gint width; - gint height; - gdouble sidebar_width; - gint current_cell; - - PangoLayout *layout; - PangoFontDescription *font_desc; - - priv = gcal_week_view_get_instance_private (view); - widget = GTK_WIDGET (view); - - context = gtk_widget_get_style_context (widget); - state = gtk_widget_get_state_flags (widget); - - gtk_style_context_get_color (context, state, &color); - gtk_style_context_get_padding (context, state, &padding); - gtk_style_context_get (context, state, "font", &font_desc, NULL); - - layout = pango_cairo_create_layout (cr); - pango_layout_set_font_description (layout, font_desc); - gdk_cairo_set_source_rgba (cr, &color); - - sidebar_width = gcal_week_view_get_sidebar_width (widget); - width = gdk_window_get_width (priv->grid_window); - height = gdk_window_get_height (priv->grid_window); - - current_cell = icaltime_day_of_week (*(priv->date)) - 1; - current_cell = (7 + current_cell - priv->first_weekday) % 7; - - gtk_cairo_transform_to_window (cr, widget, priv->grid_window); - - gtk_style_context_save (context); - gtk_style_context_add_class (context, "current"); - gtk_render_background ( - context, cr, - ((width - sidebar_width)/ 7.0) * current_cell + sidebar_width, - 0, - ((width - sidebar_width)/ 7.0), - height); - gtk_style_context_remove_class (context, "current"); - gtk_style_context_restore (context); - - /* grid, sidebar hours */ - for (i = 0; i < 24; i++) - { - gchar *hours; - if (priv->use_24h_format) - { - hours = g_strdup_printf ("%02d:00", i); - pango_layout_set_text (layout, hours, -1); - } - else - { - hours = g_strdup_printf ("%02d:00 %s", - i % 12, - i < 12 ? _("AM") : _("PM")); - - if (i == 0) - pango_layout_set_text (layout, _("Midnight"), -1); - else if (i == 12) - pango_layout_set_text (layout, _("Noon"), -1); - else - pango_layout_set_text (layout, hours, -1); - } - - cairo_move_to (cr, padding.left, padding.top + (height / 24) * i); - pango_cairo_show_layout (cr, layout); - - g_free (hours); - } - - /* grid, vertical lines first */ - for (i = 0; i < 7; i++) - { - cairo_move_to (cr, - sidebar_width + ((width - sidebar_width) / 7) * i + 0.4, - 0); - cairo_rel_line_to (cr, 0, height); - } - - /* rest of the lines */ - for (i = 0; i < 24; i++) - { - /* hours lines */ - cairo_move_to (cr, 0, (height / 24) * i + 0.4); - cairo_rel_line_to (cr, width, 0); - } - - cairo_stroke (cr); - - cairo_set_dash (cr, dashed, 2, 0); - for (i = 0; i < 24; i++) - { - /* 30 minutes lines */ - cairo_move_to (cr, sidebar_width, (height / 24) * i + (height / 48) + 0.4); - cairo_rel_line_to (cr, width - sidebar_width, 0); - } - - cairo_stroke (cr); - - pango_font_description_free (font_desc); - g_object_unref (layout); -} - gint gcal_week_view_get_sidebar_width (GtkWidget *widget) { @@ -508,28 +195,10 @@ gcal_week_view_get_sidebar_width (GtkWidget *widget) static void gcal_week_view_class_init (GcalWeekViewClass *klass) { - GcalSubscriberViewClass *subscriber_view_class; - GtkContainerClass *container_class; GtkWidgetClass *widget_class; GObjectClass *object_class; - subscriber_view_class = GCAL_SUBSCRIBER_VIEW_CLASS (klass); - subscriber_view_class->get_child_by_uuid = gcal_week_view_get_by_uuid; - - container_class = GTK_CONTAINER_CLASS (klass); - container_class->add = gcal_week_view_add; - container_class->remove = gcal_week_view_remove; - container_class->forall = gcal_week_view_forall; - gtk_container_class_handle_border_width (container_class); - widget_class = GTK_WIDGET_CLASS (klass); - widget_class->realize = gcal_week_view_realize; - widget_class->unrealize = gcal_week_view_unrealize; - widget_class->size_allocate = gcal_week_view_size_allocate; - widget_class->draw = gcal_week_view_draw; - widget_class->scroll_event = gcal_week_view_scroll_event; - widget_class->button_press_event = gcal_week_view_button_press_event; - widget_class->button_release_event = gcal_week_view_button_release_event; object_class = G_OBJECT_CLASS (klass); object_class->constructed = gcal_week_view_constructed; @@ -567,18 +236,6 @@ gcal_week_view_constructed (GObject *object) if (G_OBJECT_CLASS (gcal_week_view_parent_class)->constructed != NULL) G_OBJECT_CLASS (gcal_week_view_parent_class)->constructed (object); - - priv->vscrollbar = gtk_scrollbar_new (GTK_ORIENTATION_VERTICAL, NULL); - - gtk_widget_set_parent (priv->vscrollbar, GTK_WIDGET (object)); - gtk_widget_show (priv->vscrollbar); - - g_signal_connect (gtk_range_get_adjustment (GTK_RANGE (priv->vscrollbar)), - "value-changed", - G_CALLBACK (gcal_week_view_scroll_value_changed), - object); - - g_object_ref (priv->vscrollbar); } static void @@ -591,12 +248,6 @@ gcal_week_view_finalize (GObject *object) if (priv->date != NULL) g_free (priv->date); - if (priv->vscrollbar != NULL) - { - gtk_widget_unparent (priv->vscrollbar); - g_clear_object (&(priv->vscrollbar)); - } - /* Chain up to parent's finalize() method. */ G_OBJECT_CLASS (gcal_week_view_parent_class)->finalize (object); } @@ -669,611 +320,6 @@ gcal_week_view_get_property (GObject *object, } } -static void -gcal_week_view_realize (GtkWidget *widget) -{ - GcalWeekViewPrivate *priv; - GdkWindow *parent_window; - GdkWindowAttr attributes; - gint attributes_mask; - GtkAllocation allocation; - - gint i; - GList *l; - - priv = gcal_week_view_get_instance_private (GCAL_WEEK_VIEW (widget)); - gtk_widget_set_realized (widget, TRUE); - - gtk_widget_get_allocation (widget, &allocation); - - parent_window = gtk_widget_get_parent_window (widget); - gtk_widget_set_window (widget, parent_window); - g_object_ref (parent_window); - - attributes.window_type = GDK_WINDOW_CHILD; - attributes.wclass = GDK_INPUT_ONLY; - attributes.x = allocation.x; - attributes.y = allocation.y; - attributes.event_mask = gtk_widget_get_events (widget); - attributes.event_mask |= (GDK_BUTTON_PRESS_MASK | - GDK_BUTTON_RELEASE_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); - - attributes.window_type = GDK_WINDOW_CHILD; - attributes.wclass = GDK_INPUT_OUTPUT; - attributes.x = allocation.x; - attributes.y = allocation.y; - attributes.event_mask = gtk_widget_get_events (widget); - attributes.event_mask |= (GDK_EXPOSURE_MASK | - GDK_BUTTON_PRESS_MASK | - GDK_BUTTON_RELEASE_MASK | - GDK_BUTTON_MOTION_MASK | - GDK_POINTER_MOTION_MASK | - GDK_SCROLL_MASK | - GDK_TOUCH_MASK | - GDK_SMOOTH_SCROLL_MASK); - attributes.visual = gtk_widget_get_visual (widget); - attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL; - - priv->view_window = gdk_window_new (parent_window, - &attributes, - attributes_mask); - gtk_widget_register_window (widget, priv->view_window); - - attributes.event_mask = gtk_widget_get_events (widget); - attributes.event_mask |= GDK_EXPOSURE_MASK; - priv->grid_window = gdk_window_new (priv->view_window, - &attributes, - attributes_mask); - gtk_widget_register_window (widget, priv->grid_window); - - gdk_window_show (priv->event_window); - gdk_window_show (priv->grid_window); - gdk_window_show (priv->view_window); - - /* setting parent_window for every event child */ - for (i = 0; i < 7; i++) - { - for (l = priv->days[i]; l != NULL; l = l->next) - { - GcalWeekViewChild *child; - - child = (GcalWeekViewChild*) l->data; - gtk_widget_set_parent_window (child->widget, - priv->grid_window); - } - } -} - -static void -gcal_week_view_unrealize (GtkWidget *widget) -{ - GcalWeekViewPrivate *priv; - - priv = gcal_week_view_get_instance_private (GCAL_WEEK_VIEW (widget)); - if (priv->view_window != NULL) - { - gtk_widget_unregister_window (widget, priv->view_window); - gdk_window_destroy (priv->view_window); - priv->view_window = NULL; - } - - if (priv->grid_window != NULL) - { - gtk_widget_unregister_window (widget, priv->grid_window); - gdk_window_destroy (priv->grid_window); - priv->grid_window = NULL; - } - if (priv->event_window != NULL) - { - gtk_widget_unregister_window (widget, priv->event_window); - gdk_window_destroy (priv->event_window); - priv->event_window = NULL; - } - - GTK_WIDGET_CLASS (gcal_week_view_parent_class)->unrealize (widget); -} - -static void -gcal_week_view_size_allocate (GtkWidget *widget, - GtkAllocation *allocation) -{ - GcalWeekViewPrivate *priv; - - GtkBorder padding; - PangoLayout *layout; - PangoFontDescription *font_desc; - gint font_height; - - gint start_grid_y; - gint sidebar_width; - - GtkAllocation scroll_allocation; - gint min; - gint natural; - - gdouble horizontal_block; - gdouble vertical_block; - gdouble adj_value; - - gint i; - GList *l; - - gboolean scroll_needed; - gint grid_height; - gint view_height; - - priv = gcal_week_view_get_instance_private (GCAL_WEEK_VIEW (widget)); - - gtk_widget_set_allocation (widget, allocation); - - if (! gtk_widget_get_realized (widget)) - return; - - gtk_style_context_get_padding ( - gtk_widget_get_style_context (widget), - gtk_widget_get_state_flags (widget), - &padding); - - start_grid_y = gcal_week_view_get_start_grid_y (widget); - - gdk_window_move_resize (priv->event_window, - allocation->x, - allocation->y, - allocation->width, - start_grid_y); - - /* Estimating cell height */ - layout = pango_layout_new (gtk_widget_get_pango_context (widget)); - gtk_style_context_get (gtk_widget_get_style_context (widget), - gtk_widget_get_state_flags (widget), - "font", &font_desc, - NULL); - pango_layout_set_font_description (layout, font_desc); - pango_layout_get_pixel_size (layout, NULL, &font_height); - pango_font_description_free (font_desc); - - gtk_widget_get_preferred_width (priv->vscrollbar, &min, &natural); - - view_height = allocation->height - start_grid_y; - grid_height = 24 * (padding.top + padding.bottom + 3 * font_height); - scroll_needed = grid_height > allocation->height - start_grid_y ? TRUE : FALSE; - grid_height = scroll_needed ? grid_height : allocation->height - start_grid_y; - - if (scroll_needed) - { - adj_value = gtk_adjustment_get_value ( - gtk_range_get_adjustment (GTK_RANGE (priv->vscrollbar))); - } - else - { - adj_value = 0; - } - - gdk_window_move_resize (priv->view_window, - allocation->x, - allocation->y + start_grid_y, - allocation->width, - allocation->height - start_grid_y); - gdk_window_move_resize (priv->grid_window, - allocation->x, - - adj_value, - allocation->width, - grid_height); - - if (scroll_needed) - { - scroll_allocation.x = allocation->width - natural; - scroll_allocation.y = start_grid_y; - scroll_allocation.width = natural; - scroll_allocation.height = view_height; - gtk_widget_size_allocate (priv->vscrollbar, &scroll_allocation); - - gtk_adjustment_set_page_size ( - gtk_range_get_adjustment (GTK_RANGE (priv->vscrollbar)), - view_height * view_height / grid_height); - gtk_adjustment_set_upper ( - gtk_range_get_adjustment (GTK_RANGE (priv->vscrollbar)), - grid_height - view_height + (view_height * view_height / grid_height)); - } - else - { - gtk_widget_hide (priv->vscrollbar); - } - - sidebar_width = gcal_week_view_get_sidebar_width (widget); - horizontal_block = (allocation->width - sidebar_width) / 7.0; - vertical_block = gdk_window_get_height (priv->grid_window) / 24.0; - - for (i = 0; i < 7; i++) - { - gdouble *added_height; - added_height = g_malloc0 (sizeof (gdouble) * 25); - - for (l = priv->days[i]; l != NULL; l = l->next) - { - GcalWeekViewChild *child; - gint min_height; - gint natural_height; - gdouble vertical_span; - GtkAllocation child_allocation; - - child = (GcalWeekViewChild*) l->data; - - if ((! gtk_widget_get_visible (child->widget)) && - (! child->hidden_by_me)) - { - continue; - } - - gtk_widget_get_preferred_height (child->widget, - &min_height, - &natural_height); - - child_allocation.x = i * horizontal_block + sidebar_width; - if (child->index == -1) - { - vertical_span = 2 * font_height; - child_allocation.y = start_grid_y - vertical_span; - } - else - { - vertical_span = vertical_block; - child_allocation.y = child->index * vertical_block; - } - - child_allocation.width = horizontal_block; - child_allocation.height = MIN (natural_height, vertical_span); - if (added_height[child->index + 1] + child_allocation.height > vertical_span) - { - gtk_widget_hide (child->widget); - child->hidden_by_me = TRUE; - } - else - { - gtk_widget_show (child->widget); - child->hidden_by_me = FALSE; - child_allocation.y = child_allocation.y + added_height[child->index + 1]; - gtk_widget_size_allocate (child->widget, &child_allocation); - added_height[child->index + 1] += child_allocation.height; - } - } - g_free (added_height); - } -} - -static gboolean -gcal_week_view_draw (GtkWidget *widget, - cairo_t *cr) -{ - GcalWeekViewPrivate *priv; - GtkStyleContext *context; - GtkStateFlags state; - GtkBorder padding; - GtkAllocation alloc; - - g_return_val_if_fail (GCAL_IS_WEEK_VIEW (widget), FALSE); - priv = gcal_week_view_get_instance_private (GCAL_WEEK_VIEW (widget)); - - context = gtk_widget_get_style_context (widget); - state = gtk_widget_get_state_flags (widget); - - /* getting padding and allocation */ - gtk_style_context_get_padding (context, state, &padding); - gtk_widget_get_allocation (widget, &alloc); - - if (gtk_cairo_should_draw_window (cr, gtk_widget_get_window (widget))) - { - cairo_save (cr); - cairo_set_line_width (cr, 0.4); - draw_header (GCAL_WEEK_VIEW (widget), cr, &alloc, &padding); - cairo_restore (cr); - } - - if (priv->view_window != NULL && - gtk_cairo_should_draw_window (cr, priv->view_window)) - { - gint y; - - gdk_window_get_position (priv->view_window, NULL, &y); - cairo_rectangle (cr, - alloc.x, - y, - alloc.width, - gdk_window_get_height (priv->view_window)); - cairo_clip (cr); - } - - if (priv->grid_window != NULL && - gtk_cairo_should_draw_window (cr, priv->grid_window)) - { - cairo_save (cr); - cairo_set_line_width (cr, 0.3); - draw_grid_window (GCAL_WEEK_VIEW (widget), cr); - cairo_restore (cr); - } - - GTK_WIDGET_CLASS (gcal_week_view_parent_class)->draw (widget, cr); - - return FALSE; -} - -static gboolean -gcal_week_view_scroll_event (GtkWidget *widget, - GdkEventScroll *event) -{ - GcalWeekViewPrivate *priv; - - gdouble delta_y; - gdouble delta; - - g_return_val_if_fail (GCAL_IS_WEEK_VIEW (widget), FALSE); - g_return_val_if_fail (event != NULL, FALSE); - - priv = gcal_week_view_get_instance_private (GCAL_WEEK_VIEW (widget)); - - if (gdk_event_get_scroll_deltas ((GdkEvent *) event, NULL, &delta_y)) - { - if (delta_y != 0.0 && - priv->vscrollbar != NULL && - gtk_widget_get_visible (priv->vscrollbar)) - { - GtkAdjustment *adj; - gdouble new_value; - gdouble page_size; - gdouble scroll_unit; - - adj = gtk_range_get_adjustment (GTK_RANGE (priv->vscrollbar)); - page_size = gtk_adjustment_get_page_size (adj); - scroll_unit = pow (page_size, 2.0 / 3.0); - - new_value = CLAMP (gtk_adjustment_get_value (adj) + delta_y * scroll_unit, - gtk_adjustment_get_lower (adj), - gtk_adjustment_get_upper (adj) - - gtk_adjustment_get_page_size (adj)); - - gtk_adjustment_set_value (adj, new_value); - - return TRUE; - } - } - else - { - GtkWidget *range = NULL; - - if (event->direction == GDK_SCROLL_UP || - event->direction == GDK_SCROLL_DOWN) - { - range = priv->vscrollbar; - } - - if (range != NULL && gtk_widget_get_visible (range)) - { - GtkAdjustment *adj; - gdouble new_value; - gdouble page_size; - - adj = gtk_range_get_adjustment (GTK_RANGE (range)); - page_size = gtk_adjustment_get_page_size (adj); - delta = pow (page_size, 2.0 / 3.0); - - new_value = CLAMP (gtk_adjustment_get_value (adj) + delta, - gtk_adjustment_get_lower (adj), - gtk_adjustment_get_upper (adj) - - gtk_adjustment_get_page_size (adj)); - - gtk_adjustment_set_value (adj, new_value); - - return TRUE; - } - } - - return FALSE; -} - -static gboolean -gcal_week_view_button_press_event (GtkWidget *widget, - GdkEventButton *event) -{ - gdouble y, start_grid_y; - - y = event->y; - - start_grid_y = gcal_week_view_get_start_grid_y (widget); - - if (y - start_grid_y < 0) - { - /* FIXME: click on the header should create all day events */ - return FALSE; - } - - return FALSE; -} - -static gboolean -gcal_week_view_button_release_event (GtkWidget *widget, - GdkEventButton *event) -{ - GcalWeekViewPrivate *priv; - gdouble y, start_grid_y; - - priv = gcal_week_view_get_instance_private (GCAL_WEEK_VIEW (widget)); - - y = event->y; - - start_grid_y = gcal_week_view_get_start_grid_y (widget); - - if (y - start_grid_y < 0) - { - /* FIXME: click on the header should create all day events */ - priv->clicked_cell = -1; - return FALSE; - } - - priv->clicked_cell = -1; - return FALSE; -} - -static void -gcal_week_view_add (GtkContainer *container, - GtkWidget *widget) -{ - GcalWeekViewPrivate *priv; - GList *l; - - gint day; - - GcalWeekViewChild *new_child; - GDateTime *date; - GcalEvent *event; - - g_return_if_fail (GCAL_IS_WEEK_VIEW (container)); - g_return_if_fail (GCAL_IS_EVENT_WIDGET (widget)); - g_return_if_fail (gtk_widget_get_parent (widget) == NULL); - priv = gcal_week_view_get_instance_private (GCAL_WEEK_VIEW (container)); - - /* Check if it's already added for date */ - event = gcal_event_widget_get_event (GCAL_EVENT_WIDGET (widget)); - date = gcal_event_get_date_start (event); - day = (g_date_time_get_day_of_week (date) - priv->first_weekday + 6) % 7; - - for (l = priv->days[day]; l != NULL; l = l->next) - { - GtkWidget *event_widget; - - event_widget = GTK_WIDGET (((GcalWeekViewChild*) l->data)->widget); - if (gcal_event_widget_equal (GCAL_EVENT_WIDGET (widget), - GCAL_EVENT_WIDGET (event_widget))) - { - //TODO: remove once the main-dev phase its over - g_warning ("Trying to add an event with the same uuid to the view"); - g_free (date); - gtk_widget_destroy (widget); - return; - } - } - - new_child = g_new0 (GcalWeekViewChild, 1); - new_child->widget = widget; - new_child->hidden_by_me = FALSE; - - if (gcal_event_get_all_day (event)) - { - new_child->index = -1; - if (gtk_widget_get_window (widget) != NULL) - gtk_widget_set_parent_window (widget, - gtk_widget_get_window (widget)); - } - else - { - new_child->index = g_date_time_get_hour (date); - if (priv->grid_window != NULL) - gtk_widget_set_parent_window (widget, priv->grid_window); - } - - priv->days[day] = g_list_append (priv->days[day], new_child); - gtk_widget_set_parent (widget, GTK_WIDGET (container)); - - g_signal_connect (widget, - "activate", - G_CALLBACK (event_opened), - container); -} - -static void -gcal_week_view_remove (GtkContainer *container, - GtkWidget *widget) -{ - GcalWeekViewPrivate *priv; - GcalEvent *event; - GDateTime *date; - GList *l; - gint day; - gboolean was_visible; - - g_return_if_fail (GCAL_IS_WEEK_VIEW (container)); - g_return_if_fail (gtk_widget_get_parent (widget) == GTK_WIDGET (container)); - priv = gcal_week_view_get_instance_private (GCAL_WEEK_VIEW (container)); - event = gcal_event_widget_get_event (GCAL_EVENT_WIDGET (widget)); - date = gcal_event_get_date_start (event); - day = (g_date_time_get_day_of_week (date) - priv->first_weekday + 6) % 7; - - for (l = priv->days[day]; l != NULL; l = l->next) - { - GcalWeekViewChild *child; - - child = (GcalWeekViewChild*) l->data; - if (child->widget == widget) - { - priv->days[day] = g_list_remove (priv->days[day], child); - g_free (child); - break; - } - } - - - was_visible = gtk_widget_get_visible (widget); - gtk_widget_unparent (widget); - - if (was_visible) - gtk_widget_queue_resize (GTK_WIDGET (container)); - - g_free (date); -} - -static void -gcal_week_view_forall (GtkContainer *container, - gboolean include_internals, - GtkCallback callback, - gpointer callback_data) -{ - GcalWeekViewPrivate *priv; - gint i; - GList *l; - - priv = gcal_week_view_get_instance_private (GCAL_WEEK_VIEW (container)); - - for (i = 0; i < 7; i++) - { - l = priv->days[i]; - - while (l) - { - GcalWeekViewChild *child; - - child = (GcalWeekViewChild*) l->data; - l = l->next; - - (* callback) (child->widget, callback_data); - } - } - - if (include_internals && priv->vscrollbar != NULL) - (* callback) (priv->vscrollbar, callback_data); -} - -static void -gcal_week_view_scroll_value_changed (GtkAdjustment *adjusment, - gpointer user_data) -{ - GcalWeekViewPrivate *priv; - - g_return_if_fail (GCAL_IS_WEEK_VIEW (user_data)); - priv = gcal_week_view_get_instance_private (GCAL_WEEK_VIEW (user_data)); - - if (priv->grid_window != NULL) - { - gdk_window_move (priv->grid_window, - 0, - - gtk_adjustment_get_value (adjusment)); - } -} - /* GcalView Interface API */ /** * gcal_week_view_get_initial_date: @@ -1329,36 +375,6 @@ gcal_week_view_get_final_date (GcalView *view) return new_date; } -static GtkWidget* -gcal_week_view_get_by_uuid (GcalSubscriberView *subscriber_view, - const gchar *uuid) -{ - GcalWeekViewPrivate *priv; - gint i; - GList *l; - - g_return_val_if_fail (GCAL_IS_WEEK_VIEW (subscriber_view), NULL); - priv = gcal_week_view_get_instance_private (GCAL_WEEK_VIEW(subscriber_view)); - - for (i = 0; i < 7; i++) - { - for (l = priv->days[i]; l != NULL; l = l->next) - { - GcalWeekViewChild *child; - GcalEvent *event; - const gchar* widget_uuid; - - child = (GcalWeekViewChild*) l->data; - event = gcal_event_widget_get_event (GCAL_EVENT_WIDGET (child->widget)); - widget_uuid = gcal_event_get_uid (event); - - if (g_strcmp0 (uuid, widget_uuid) == 0) - return child->widget; - } - } - return NULL; -} - /* Public API */ /** * gcal_week_view_new: From 16fac7c3a043eb04e5b754fcb5839c045185c08e Mon Sep 17 00:00:00 2001 From: pandusonu2 Date: Tue, 7 Jun 2016 03:21:11 +0530 Subject: [PATCH 007/105] week-view: make it a template class Made changes to make the week-view into a template class. --- data/Makefile.am | 1 + data/calendar.gresource.xml | 1 + data/ui/week-view.ui | 28 +++++++++ src/gcal-window.c | 1 + src/views/gcal-week-header.c | 21 ++++++- src/views/gcal-week-view.c | 114 ++++++++++++++++++----------------- src/views/gcal-week-view.h | 24 ++------ 7 files changed, 115 insertions(+), 75 deletions(-) create mode 100644 data/ui/week-view.ui diff --git a/data/Makefile.am b/data/Makefile.am index dfe72104..888b3a1e 100644 --- a/data/Makefile.am +++ b/data/Makefile.am @@ -62,6 +62,7 @@ EXTRA_DIST= \ ui/source-dialog.ui \ ui/time-selector.ui \ ui/week-header.ui \ + ui/week-view.ui \ ui/window.ui \ ui/year-view.ui \ theme/gtk-styles.css \ diff --git a/data/calendar.gresource.xml b/data/calendar.gresource.xml index 1542e44c..6b5397e4 100644 --- a/data/calendar.gresource.xml +++ b/data/calendar.gresource.xml @@ -13,6 +13,7 @@ ui/source-dialog.ui ui/time-selector.ui ui/week-header.ui + ui/week-view.ui ui/window.ui ui/year-view.ui theme/gtk-styles.css diff --git a/data/ui/week-view.ui b/data/ui/week-view.ui new file mode 100644 index 00000000..83a5357b --- /dev/null +++ b/data/ui/week-view.ui @@ -0,0 +1,28 @@ + + + + \ No newline at end of file diff --git a/src/gcal-window.c b/src/gcal-window.c index 73e8f64d..76ca5f29 100644 --- a/src/gcal-window.c +++ b/src/gcal-window.c @@ -437,6 +437,7 @@ update_current_date (GcalWindow *window) *(window->current_date) = icaltime_current_time_with_zone (gcal_manager_get_system_timezone (window->manager)); *(window->current_date) = icaltime_set_timezone (window->current_date, gcal_manager_get_system_timezone (window->manager)); + gcal_week_view_set_current_date (GCAL_WEEK_VIEW (window->week_view), window->current_date); gcal_month_view_set_current_date (GCAL_MONTH_VIEW (window->month_view), window->current_date); gcal_year_view_set_current_date (GCAL_YEAR_VIEW (window->year_view), window->current_date); diff --git a/src/views/gcal-week-header.c b/src/views/gcal-week-header.c index aa687065..6bc266ad 100644 --- a/src/views/gcal-week-header.c +++ b/src/views/gcal-week-header.c @@ -41,6 +41,7 @@ struct _GcalWeekHeader gboolean use_24h_format; + icaltimetype *active_date; icaltimetype *current_date; }; @@ -60,6 +61,12 @@ static gboolean gcal_week_header_draw (GcalWeekHeader *sel cairo_t *cr, GtkWidget *widget); +enum +{ + PROP_0, + PROP_ACTIVE_DATE +}; + G_DEFINE_TYPE (GcalWeekHeader, gcal_week_header, GTK_TYPE_SCROLLED_WINDOW); static void @@ -95,6 +102,10 @@ gcal_week_header_set_property (GObject *object, switch (prop_id) { + case PROP_ACTIVE_DATE: + self->active_date = g_value_dup_boxed (value); + return; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } @@ -155,7 +166,7 @@ gcal_week_header_draw (GcalWeekHeader *self, pango_font_description_set_weight (bold_font, PANGO_WEIGHT_SEMIBOLD); pango_layout_set_font_description (layout, bold_font); - start_of_week = gcal_week_view_get_initial_date (GCAL_VIEW (widget)); + start_of_week = self->active_date; current_cell = icaltime_day_of_week (*(self->current_date)) - 1; current_cell = (7 + current_cell - self->first_weekday) % 7; @@ -240,6 +251,14 @@ gcal_week_header_class_init (GcalWeekHeaderClass *kclass) gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/calendar/week-header.ui"); + g_object_class_install_property (object_class, + PROP_ACTIVE_DATE, + g_param_spec_boxed ("active-date", + "Date", + "The active selected date", + ICAL_TIME_TYPE, + G_PARAM_CONSTRUCT | G_PARAM_READWRITE)); + gtk_widget_class_bind_template_child (widget_class, GcalWeekHeader, grid); gtk_widget_class_bind_template_callback (widget_class, gcal_week_header_draw); diff --git a/src/views/gcal-week-view.c b/src/views/gcal-week-view.c index 93a06d6f..4fe83166 100644 --- a/src/views/gcal-week-view.c +++ b/src/views/gcal-week-view.c @@ -54,7 +54,7 @@ struct _GcalWeekViewChild typedef struct _GcalWeekViewChild GcalWeekViewChild; -typedef struct +struct _GcalWeekView { GtkBox parent; @@ -71,10 +71,11 @@ typedef struct /* property */ icaltimetype *date; + icaltimetype *current_date; GcalManager *manager; /* weak referenced */ gint clicked_cell; -} GcalWeekViewPrivate; +}; static void gcal_week_view_constructed (GObject *object); @@ -94,8 +95,7 @@ static icaltimetype* gcal_week_view_get_final_date (GcalView *view static void gcal_view_interface_init (GcalViewInterface *iface); -G_DEFINE_TYPE_WITH_CODE (GcalWeekView, gcal_week_view, GCAL_TYPE_SUBSCRIBER_VIEW, - G_ADD_PRIVATE (GcalWeekView) +G_DEFINE_TYPE_WITH_CODE (GcalWeekView, gcal_week_view, GTK_TYPE_BOX, G_IMPLEMENT_INTERFACE (GCAL_TYPE_VIEW, gcal_view_interface_init)); /* @@ -195,12 +195,9 @@ gcal_week_view_get_sidebar_width (GtkWidget *widget) static void gcal_week_view_class_init (GcalWeekViewClass *klass) { - GtkWidgetClass *widget_class; - GObjectClass *object_class; + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); - widget_class = GTK_WIDGET_CLASS (klass); - - object_class = G_OBJECT_CLASS (klass); object_class->constructed = gcal_week_view_constructed; object_class->finalize = gcal_week_view_finalize; object_class->set_property = gcal_week_view_set_property; @@ -208,13 +205,16 @@ gcal_week_view_class_init (GcalWeekViewClass *klass) g_object_class_override_property (object_class, PROP_DATE, "active-date"); + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/calendar/week-view.ui"); + + gtk_widget_class_set_css_name (widget_class, "calendar-view"); } static void gcal_week_view_init (GcalWeekView *self) { - gtk_widget_set_has_window (GTK_WIDGET (self), FALSE); - gtk_style_context_add_class (gtk_widget_get_style_context (GTK_WIDGET (self)), "calendar-view"); + gtk_widget_init_template (GTK_WIDGET (self)); } static void @@ -229,10 +229,10 @@ gcal_view_interface_init (GcalViewInterface *iface) static void gcal_week_view_constructed (GObject *object) { - GcalWeekViewPrivate *priv; + GcalWeekView *self; g_return_if_fail (GCAL_IS_WEEK_VIEW (object)); - priv = gcal_week_view_get_instance_private (GCAL_WEEK_VIEW (object)); + self = GCAL_WEEK_VIEW (object); if (G_OBJECT_CLASS (gcal_week_view_parent_class)->constructed != NULL) G_OBJECT_CLASS (gcal_week_view_parent_class)->constructed (object); @@ -241,12 +241,11 @@ gcal_week_view_constructed (GObject *object) static void gcal_week_view_finalize (GObject *object) { - GcalWeekViewPrivate *priv; + GcalWeekView *self; - priv = gcal_week_view_get_instance_private (GCAL_WEEK_VIEW (object)); + self = GCAL_WEEK_VIEW (object); - if (priv->date != NULL) - g_free (priv->date); + g_clear_pointer (&self->date, g_free); /* Chain up to parent's finalize() method. */ G_OBJECT_CLASS (gcal_week_view_parent_class)->finalize (object); @@ -258,9 +257,9 @@ gcal_week_view_set_property (GObject *object, const GValue *value, GParamSpec *pspec) { - GcalWeekViewPrivate *priv; + GcalWeekView *self; - priv = gcal_week_view_get_instance_private (GCAL_WEEK_VIEW (object)); + self = GCAL_WEEK_VIEW (object); switch (property_id) { @@ -270,13 +269,11 @@ gcal_week_view_set_property (GObject *object, icaltimetype *date; icaltimezone* default_zone; - if (priv->date != NULL) - g_free (priv->date); + g_clear_pointer (&self->date, g_free); - priv->date = g_value_dup_boxed (value); + self->date = g_value_dup_boxed (value); - default_zone = - gcal_manager_get_system_timezone (priv->manager); + default_zone = gcal_manager_get_system_timezone (self->manager); date = gcal_view_get_initial_date (GCAL_VIEW (object)); range_start = icaltime_as_timet_with_zone (*date, default_zone); @@ -285,13 +282,14 @@ gcal_week_view_set_property (GObject *object, range_end = icaltime_as_timet_with_zone (*date, default_zone); g_free (date); - gcal_manager_set_subscriber (priv->manager, + gcal_manager_set_subscriber (self->manager, E_CAL_DATA_MODEL_SUBSCRIBER (object), range_start, range_end); gtk_widget_queue_draw (GTK_WIDGET (object)); break; } + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; @@ -300,20 +298,21 @@ gcal_week_view_set_property (GObject *object, static void gcal_week_view_get_property (GObject *object, - guint property_id, - GValue *value, - GParamSpec *pspec) + guint property_id, + GValue *value, + GParamSpec *pspec) { - GcalWeekViewPrivate *priv; + GcalWeekView *self; g_return_if_fail (GCAL_IS_WEEK_VIEW (object)); - priv = gcal_week_view_get_instance_private (GCAL_WEEK_VIEW (object)); + self = GCAL_WEEK_VIEW (object); switch (property_id) { case PROP_DATE: - g_value_set_boxed (value, priv->date); + g_value_set_boxed (value, self->date); break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; @@ -331,20 +330,20 @@ gcal_week_view_get_property (GObject *object, icaltimetype* gcal_week_view_get_initial_date (GcalView *view) { - GcalWeekViewPrivate *priv; + GcalWeekView *self; icaltimetype *new_date; g_return_val_if_fail (GCAL_IS_WEEK_VIEW (view), NULL); - priv = gcal_week_view_get_instance_private (GCAL_WEEK_VIEW(view)); + self = GCAL_WEEK_VIEW(view); new_date = g_new0 (icaltimetype, 1); - *new_date = icaltime_from_day_of_year ( - icaltime_start_doy_week (*(priv->date), priv->first_weekday + 1), - priv->date->year); + *new_date = icaltime_from_day_of_year (icaltime_start_doy_week (*(self->date), + self->first_weekday + 1), + self->date->year); new_date->is_date = 0; new_date->hour = 0; new_date->minute = 0; new_date->second = 0; - *new_date = icaltime_set_timezone (new_date, priv->date->zone); + *new_date = icaltime_set_timezone (new_date, self->date->zone); return new_date; } @@ -358,20 +357,20 @@ gcal_week_view_get_initial_date (GcalView *view) static icaltimetype* gcal_week_view_get_final_date (GcalView *view) { - GcalWeekViewPrivate *priv; + GcalWeekView *self; icaltimetype *new_date; g_return_val_if_fail (GCAL_IS_WEEK_VIEW (view), NULL); - priv = gcal_week_view_get_instance_private (GCAL_WEEK_VIEW(view)); + self = GCAL_WEEK_VIEW(view); new_date = g_new0 (icaltimetype, 1); - *new_date = icaltime_from_day_of_year ( - icaltime_start_doy_week (*(priv->date), priv->first_weekday + 1) + 6, - priv->date->year); + *new_date = icaltime_from_day_of_year (icaltime_start_doy_week (*(self->date), + self->first_weekday + 1) + 6, + self->date->year); new_date->is_date = 0; new_date->hour = 23; new_date->minute = 59; new_date->second = 0; - *new_date = icaltime_set_timezone (new_date, priv->date->zone); + *new_date = icaltime_set_timezone (new_date, self->date->zone); return new_date; } @@ -390,12 +389,12 @@ gcal_week_view_new (void) } void -gcal_week_view_set_manager (GcalWeekView *week_view, +gcal_week_view_set_manager (GcalWeekView *self, GcalManager *manager) { - GcalWeekViewPrivate *priv = gcal_week_view_get_instance_private (week_view); + g_return_if_fail (GCAL_IS_WEEK_VIEW (self)); - priv->manager = manager; + self->manager = manager; } /** @@ -407,13 +406,12 @@ gcal_week_view_set_manager (GcalWeekView *week_view, * 0 for Sunday, 1 for Monday and so on. **/ void -gcal_week_view_set_first_weekday (GcalWeekView *view, +gcal_week_view_set_first_weekday (GcalWeekView *self, gint day_nr) { - GcalWeekViewPrivate *priv; + g_return_if_fail (GCAL_IS_WEEK_VIEW (self)); - priv = gcal_week_view_get_instance_private (view); - priv->first_weekday = day_nr; + self->first_weekday = day_nr; } /** @@ -424,11 +422,19 @@ gcal_week_view_set_first_weekday (GcalWeekView *view, * Whether the view will show time using 24h or 12h format **/ void -gcal_week_view_set_use_24h_format (GcalWeekView *view, +gcal_week_view_set_use_24h_format (GcalWeekView *self, gboolean use_24h) { - GcalWeekViewPrivate *priv; + g_return_if_fail (GCAL_IS_WEEK_VIEW (self)); - priv = gcal_week_view_get_instance_private (view); - priv->use_24h_format = use_24h; + self->use_24h_format = use_24h; } + +void +gcal_week_view_set_current_date (GcalWeekView *self, + icaltimetype *current_date) +{ + g_return_if_fail (GCAL_IS_WEEK_VIEW (self)); + + self->current_date = current_date; +} \ No newline at end of file diff --git a/src/views/gcal-week-view.h b/src/views/gcal-week-view.h index 01bcf61a..a5384f95 100644 --- a/src/views/gcal-week-view.h +++ b/src/views/gcal-week-view.h @@ -22,31 +22,13 @@ #include "gcal-manager.h" #include "gcal-view.h" -#include "gcal-subscriber-view.h" G_BEGIN_DECLS -#define GCAL_TYPE_WEEK_VIEW (gcal_week_view_get_type ()) -#define GCAL_WEEK_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GCAL_TYPE_WEEK_VIEW, GcalWeekView)) -#define GCAL_WEEK_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GCAL_TYPE_WEEK_VIEW, GcalWeekViewClass)) -#define GCAL_IS_WEEK_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GCAL_TYPE_WEEK_VIEW)) -#define GCAL_IS_WEEK_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GCAL_TYPE_WEEK_VIEW)) -#define GCAL_WEEK_VIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GCAL_TYPE_WEEK_VIEW, GcalWeekViewClass)) +#define GCAL_TYPE_WEEK_VIEW (gcal_week_view_get_type ()) -typedef struct _GcalWeekView GcalWeekView; -typedef struct _GcalWeekViewClass GcalWeekViewClass; +G_DECLARE_FINAL_TYPE (GcalWeekView, gcal_week_view, GCAL, WEEK_VIEW, GtkBox) -struct _GcalWeekView -{ - GcalSubscriberView parent; -}; - -struct _GcalWeekViewClass -{ - GcalSubscriberViewClass parent_class; -}; - -GType gcal_week_view_get_type (void); GtkWidget* gcal_week_view_new (void); void gcal_week_view_set_manager (GcalWeekView *view, GcalManager *manager); @@ -54,6 +36,8 @@ void gcal_week_view_set_first_weekday (GcalWeekView *view, gint day_nr); void gcal_week_view_set_use_24h_format (GcalWeekView *view, gboolean use_24h); +void gcal_week_view_set_current_date (GcalWeekView *week_header, + icaltimetype *current_date); gint gcal_week_view_get_sidebar_width (GtkWidget *widget); icaltimetype* gcal_week_view_get_initial_date (GcalView *view); gint gcal_week_view_get_start_grid_y (GtkWidget *widget); From bffaa3bd76ea5d94013d321cbafcdc53a9271cb7 Mon Sep 17 00:00:00 2001 From: pandusonu2 Date: Thu, 9 Jun 2016 18:49:27 +0530 Subject: [PATCH 008/105] week-view: add the EcalDataModelSubscriber functions Added the init, add, modified and removed functions of week-view for data model subscriber. --- src/views/gcal-week-view.c | 111 ++++++++++++++++++++++++++++++++----- 1 file changed, 98 insertions(+), 13 deletions(-) diff --git a/src/views/gcal-week-view.c b/src/views/gcal-week-view.c index 4fe83166..7e96a885 100644 --- a/src/views/gcal-week-view.c +++ b/src/views/gcal-week-view.c @@ -77,26 +77,47 @@ struct _GcalWeekView gint clicked_cell; }; -static void gcal_week_view_constructed (GObject *object); +static void gcal_week_view_component_added (ECalDataModelSubscriber *subscriber, + ECalClient *client, + ECalComponent *comp); -static void gcal_week_view_finalize (GObject *object); +static void gcal_week_view_component_modified (ECalDataModelSubscriber *subscriber, + ECalClient *client, + ECalComponent *comp); -static void gcal_week_view_set_property (GObject *object, - guint property_id, - const GValue *value, - GParamSpec *pspec); +static void gcal_week_view_component_removed (ECalDataModelSubscriber *subscriber, + ECalClient *client, + const gchar *uid, + const gchar *rid); -static void gcal_week_view_get_property (GObject *object, - guint property_id, - GValue *value, - GParamSpec *pspec); +static void gcal_week_view_freeze (ECalDataModelSubscriber *subscriber); -static icaltimetype* gcal_week_view_get_final_date (GcalView *view); +static void gcal_week_view_thaw (ECalDataModelSubscriber *subscriber); -static void gcal_view_interface_init (GcalViewInterface *iface); +static void gcal_view_interface_init (GcalViewInterface *iface); + +static void gcal_data_model_subscriber_interface_init (ECalDataModelSubscriberInterface *iface); + +static void gcal_week_view_constructed (GObject *object); + +static void gcal_week_view_finalize (GObject *object); + +static void gcal_week_view_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec); + +static void gcal_week_view_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec); + +static icaltimetype* gcal_week_view_get_final_date (GcalView *view); G_DEFINE_TYPE_WITH_CODE (GcalWeekView, gcal_week_view, GTK_TYPE_BOX, - G_IMPLEMENT_INTERFACE (GCAL_TYPE_VIEW, gcal_view_interface_init)); + 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)); /* * gcal_week_view_get_start_grid_y: @@ -192,6 +213,60 @@ gcal_week_view_get_sidebar_width (GtkWidget *widget) return sidebar_width; } +static void +gcal_week_view_component_added (ECalDataModelSubscriber *subscriber, + ECalClient *client, + ECalComponent *comp) +{ + GcalWeekView *self = GCAL_WEEK_VIEW (subscriber); + + GcalEvent *event; + + event = gcal_event_new (e_client_get_source (E_CLIENT (client)), comp, NULL); +} + +static void +gcal_week_view_component_modified (ECalDataModelSubscriber *subscriber, + ECalClient *client, + ECalComponent *comp) +{ + GcalWeekView *self = GCAL_WEEK_VIEW (subscriber); + gchar *uuid; + + uuid = get_uuid_from_component (e_client_get_source (E_CLIENT (client)), comp); + /* TODO: Implement for week_header and week_grid with if */ +} + +static void +gcal_week_view_component_removed (ECalDataModelSubscriber *subscriber, + ECalClient *client, + const gchar *uid, + const gchar *rid) +{ + GcalWeekView *week_view = GCAL_WEEK_VIEW (subscriber); + GList *children, *l; + ESource *source; + gchar *uuid; + + source = e_client_get_source (E_CLIENT (client)); + if (rid != NULL) + uuid = g_strdup_printf ("%s:%s:%s", e_source_get_uid (source), uid, rid); + else + uuid = g_strdup_printf ("%s:%s", e_source_get_uid (source), uid); + + /* TODO: Implement for week_header and week_grid with if */ +} + +static void +gcal_week_view_freeze (ECalDataModelSubscriber *subscriber) +{ +} + +static void +gcal_week_view_thaw (ECalDataModelSubscriber *subscriber) +{ +} + static void gcal_week_view_class_init (GcalWeekViewClass *klass) { @@ -226,6 +301,16 @@ gcal_view_interface_init (GcalViewInterface *iface) /* iface->clear_marks = gcal_week_view_clear_marks; */ } +static void +gcal_data_model_subscriber_interface_init (ECalDataModelSubscriberInterface *iface) +{ + iface->component_added = gcal_week_view_component_added; + iface->component_modified = gcal_week_view_component_modified; + iface->component_removed = gcal_week_view_component_removed; + iface->freeze = gcal_week_view_freeze; + iface->thaw = gcal_week_view_thaw; +} + static void gcal_week_view_constructed (GObject *object) { From 9ff7d79d7dbb94422fc6cc0421d8eb0951b77bf9 Mon Sep 17 00:00:00 2001 From: pandusonu2 Date: Fri, 10 Jun 2016 21:23:54 +0530 Subject: [PATCH 009/105] week-header: use stack-allocated structure Using stack allocated structure for certain variable in the draw(). Also disabling the week-grid for now. --- data/ui/week-view.ui | 4 ++-- src/views/gcal-week-header.c | 22 +++++++++++----------- src/views/gcal-week-view.c | 6 ++++++ 3 files changed, 19 insertions(+), 13 deletions(-) diff --git a/data/ui/week-view.ui b/data/ui/week-view.ui index 83a5357b..00bdcd46 100644 --- a/data/ui/week-view.ui +++ b/data/ui/week-view.ui @@ -16,9 +16,9 @@ True - + diff --git a/src/views/gcal-week-header.c b/src/views/gcal-week-header.c index 6bc266ad..0e496776 100644 --- a/src/views/gcal-week-header.c +++ b/src/views/gcal-week-header.c @@ -119,8 +119,8 @@ gcal_week_header_draw (GcalWeekHeader *self, GtkStyleContext *context; GtkStateFlags state; GdkRGBA color; - GtkAllocation *alloc; - GtkBorder *padding; + GtkAllocation alloc; + GtkBorder padding; PangoLayout *layout; PangoFontDescription *bold_font; @@ -143,8 +143,8 @@ gcal_week_header_draw (GcalWeekHeader *self, context = gtk_widget_get_style_context (widget); state = gtk_widget_get_state_flags (widget); - gtk_style_context_get_padding (context, state, padding); - gtk_widget_get_allocation (widget, alloc); + gtk_style_context_get_padding (context, state, &padding); + gtk_widget_get_allocation (widget, &alloc); pattern = cairo_pattern_create_linear (0, start_grid_y - 18, 0, start_grid_y + 6); @@ -155,7 +155,7 @@ gcal_week_header_draw (GcalWeekHeader *self, cairo_set_source (cr, pattern); cairo_pattern_destroy (pattern); - cairo_rectangle (cr, 0, start_grid_y, alloc->width, 6); + cairo_rectangle (cr, 0, start_grid_y, alloc.width, 6); cairo_fill (cr); gtk_style_context_get_color (context, state, &color); @@ -171,14 +171,14 @@ gcal_week_header_draw (GcalWeekHeader *self, current_cell = (7 + current_cell - self->first_weekday) % 7; sidebar_width = gcal_week_view_get_sidebar_width (widget); - cell_width = (alloc->width - sidebar_width) / 7; + cell_width = (alloc.width - sidebar_width) / 7; pango_layout_get_pixel_size (layout, NULL, &font_height); gtk_style_context_save (context); gtk_style_context_add_class (context, "current"); gtk_render_background (context, cr, cell_width * current_cell + sidebar_width, - font_height + padding->bottom, + font_height + padding.bottom, cell_width, ALL_DAY_CELLS_HEIGHT); gtk_style_context_remove_class (context, "current"); @@ -204,7 +204,7 @@ gcal_week_header_draw (GcalWeekHeader *self, pango_layout_set_text (layout, weekday_header, -1); cairo_move_to (cr, - padding->left + cell_width * i + sidebar_width, + padding.left + cell_width * i + sidebar_width, 0.0); pango_cairo_show_layout (cr, layout); @@ -212,7 +212,7 @@ gcal_week_header_draw (GcalWeekHeader *self, cairo_save (cr); cairo_move_to (cr, cell_width * i + sidebar_width + 0.3, - font_height + padding->bottom); + font_height + padding.bottom); cairo_rel_line_to (cr, 0.0, ALL_DAY_CELLS_HEIGHT); cairo_stroke (cr); cairo_restore (cr); @@ -224,9 +224,9 @@ gcal_week_header_draw (GcalWeekHeader *self, state | GTK_STATE_FLAG_INSENSITIVE, &color); gdk_cairo_set_source_rgba (cr, &color); - pos_i = font_height + padding->bottom; + pos_i = font_height + padding.bottom; cairo_move_to (cr, sidebar_width, pos_i + 0.3); - cairo_rel_line_to (cr, alloc->width - sidebar_width, 0); + cairo_rel_line_to (cr, alloc.width - sidebar_width, 0); cairo_stroke (cr); diff --git a/src/views/gcal-week-view.c b/src/views/gcal-week-view.c index 7e96a885..437bf5ce 100644 --- a/src/views/gcal-week-view.c +++ b/src/views/gcal-week-view.c @@ -58,6 +58,8 @@ struct _GcalWeekView { GtkBox parent; + GtkWidget *header; + /* * first day of the week according to user locale, being * 0 for Sunday, 1 for Monday and so on @@ -283,6 +285,8 @@ gcal_week_view_class_init (GcalWeekViewClass *klass) gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/calendar/week-view.ui"); + gtk_widget_class_bind_template_child (widget_class, GcalWeekView, header); + gtk_widget_class_set_css_name (widget_class, "calendar-view"); } @@ -521,5 +525,7 @@ gcal_week_view_set_current_date (GcalWeekView *self, { g_return_if_fail (GCAL_IS_WEEK_VIEW (self)); + gcal_week_header_set_current_date (GCAL_WEEK_HEADER (self->header), current_date); + self->current_date = current_date; } \ No newline at end of file From 1122b24216197bd13b0cf2483e3085b97d268991 Mon Sep 17 00:00:00 2001 From: pandusonu2 Date: Tue, 14 Jun 2016 01:50:23 +0530 Subject: [PATCH 010/105] week-header: modify the draw() to match mockup Made changes in the draw() to match the mockups. --- data/theme/gtk-styles.css | 4 +- data/ui/week-header.ui | 58 +++++++++++++++++--- data/ui/week-view.ui | 2 +- src/views/gcal-week-header.c | 101 ++++++++++++++++++++++++++--------- 4 files changed, 130 insertions(+), 35 deletions(-) diff --git a/data/theme/gtk-styles.css b/data/theme/gtk-styles.css index 89d8e9e3..dd38d3b8 100644 --- a/data/theme/gtk-styles.css +++ b/data/theme/gtk-styles.css @@ -52,14 +52,14 @@ calendar-view.lines { color: alpha(@theme_fg_color, 0.4); } -calendar-view.first-view-header { +calendar-view .first-view-header { font-size: 16pt; font-weight: bold; color: @theme_selected_bg_color; padding: 12px; } -calendar-view.second-view-header { +calendar-view .second-view-header { font-size: 16pt; font-weight: bold; padding: 12px; diff --git a/data/ui/week-header.ui b/data/ui/week-header.ui index 5563553c..2d498aab 100644 --- a/data/ui/week-header.ui +++ b/data/ui/week-header.ui @@ -2,23 +2,67 @@