From 283daa0f3a68f6cf839dafe8b398f925613c40ee Mon Sep 17 00:00:00 2001 From: fs3o5 Date: Sun, 1 Nov 2020 00:09:36 +0000 Subject: [PATCH 01/10] libhandy fixes Committer: fs3o5 --- src/Indicator.vala | 1 + src/Widgets/calendar/CalendarView.vala | 109 +++++++++++++++++-------- src/Widgets/calendar/Grid.vala | 12 ++- src/Widgets/calendar/GridDay.vala | 5 +- 4 files changed, 89 insertions(+), 38 deletions(-) diff --git a/src/Indicator.vala b/src/Indicator.vala index ea391718..810dc130 100644 --- a/src/Indicator.vala +++ b/src/Indicator.vala @@ -220,6 +220,7 @@ public class DateTime.Indicator : Wingpanel.Indicator { Widgets.CalendarModel.get_default ().events_added.disconnect (update_events_model); Widgets.CalendarModel.get_default ().events_updated.disconnect (update_events_model); Widgets.CalendarModel.get_default ().events_removed.disconnect (update_events_model); + calendar.clear (); } } diff --git a/src/Widgets/calendar/CalendarView.vala b/src/Widgets/calendar/CalendarView.vala index 21ecd00a..6a3dfc4d 100644 --- a/src/Widgets/calendar/CalendarView.vala +++ b/src/Widgets/calendar/CalendarView.vala @@ -32,6 +32,12 @@ public class DateTime.Widgets.CalendarView : Gtk.Grid { private GLib.DateTime start_month; private Gtk.Label label; private bool showtoday; + private List gridlist = new List (); + private DateTime.Widgets.Grid current_grid; + + private DateTime.Widgets.Grid center_grid; + private DateTime.Widgets.Grid left_grid; + private DateTime.Widgets.Grid right_grid; construct { label = new Gtk.Label (new GLib.DateTime.now_local ().format (_("%OB, %Y"))); @@ -62,22 +68,6 @@ public class DateTime.Widgets.CalendarView : Gtk.Grid { box_buttons.add (right_button); calmodel = CalendarModel.get_default (); - start_month = Util.get_start_of_month (); - - var center_grid = create_grid (); - center_grid.set_range (calmodel.data_range, calmodel.month_start); - center_grid.update_weeks (calmodel.data_range.first_dt, calmodel.num_weeks); - - calmodel.change_month (-1); - var left_grid = create_grid (); - left_grid.set_range (calmodel.data_range, calmodel.month_start); - left_grid.update_weeks (calmodel.data_range.first_dt, calmodel.num_weeks); - - calmodel.change_month (2); - var right_grid = create_grid (); - right_grid.set_range (calmodel.data_range, calmodel.month_start); - right_grid.update_weeks (calmodel.data_range.first_dt, calmodel.num_weeks); - calmodel.change_month (-1); carousel = new Hdy.Carousel () { interactive = true, @@ -85,10 +75,7 @@ public class DateTime.Widgets.CalendarView : Gtk.Grid { spacing = 15 }; - carousel.add (left_grid); - carousel.add (center_grid); - carousel.add (right_grid); - carousel.scroll_to (center_grid); + set_carousel_grids (); position = 1; rel_postion = 0; @@ -103,12 +90,20 @@ public class DateTime.Widgets.CalendarView : Gtk.Grid { attach (box_buttons, 1, 0); attach (carousel, 0, 1, 2); + bool page_changed = false; + left_button.clicked.connect (() => { - carousel.switch_child ((int) carousel.get_position () - 1, carousel.get_animation_duration ()); + if (page_changed) { + page_changed = false; + carousel.switch_child ((int) carousel.get_position () - 1, carousel.get_animation_duration ()); + } }); right_button.clicked.connect (() => { - carousel.switch_child ((int) carousel.get_position () + 1, carousel.get_animation_duration ()); + if (page_changed) { + page_changed = false; + carousel.switch_child ((int) carousel.get_position () + 1, carousel.get_animation_duration ()); + } }); center_button.clicked.connect (() => { @@ -116,47 +111,57 @@ public class DateTime.Widgets.CalendarView : Gtk.Grid { }); carousel.page_changed.connect ((index) => { - calmodel.change_month (-rel_postion); + page_changed = true; if (position > index) { + calmodel.change_month (-1); rel_postion--; position--; } else if (position < index) { + calmodel.change_month (1); rel_postion++; position++; } else if (showtoday) { + calmodel.change_month (-rel_postion); showtoday = false; rel_postion = 0; - position = (int) carousel.get_position (); + current_grid.remove_day_focus_in (); + current_grid = center_grid; label.label = calmodel.month_start.format (_("%OB, %Y")); + current_grid.set_focus_to_today (); return; } else { - calmodel.change_month (rel_postion); return; } - calmodel.change_month (rel_postion); + current_grid.remove_day_focus_in (); + current_grid = gridlist.nth_data (index); selected_date = null; selection_changed (selected_date); /* creates a new Grid, when the Hdy.Carousel is on it's first/last page*/ - if (index + 1 == (int) carousel.get_n_pages ()) { + if (index + 1 == (int) gridlist.length ()) { calmodel.change_month (1); var grid = create_grid (); grid.set_range (calmodel.data_range, calmodel.month_start); grid.update_weeks (calmodel.data_range.first_dt, calmodel.num_weeks); carousel.add (grid); + gridlist.append (grid); calmodel.change_month (-1); } else if (index == 0) { calmodel.change_month (-1); var grid = create_grid (); grid.set_range (calmodel.data_range, calmodel.month_start); + grid.set_range (calmodel.data_range, calmodel.month_start); grid.update_weeks (calmodel.data_range.first_dt, calmodel.num_weeks); carousel.prepend (grid); + gridlist.prepend (grid); calmodel.change_month (1); position++; } label.label = calmodel.month_start.format (_("%OB, %Y")); }); + + show_today (); } private DateTime.Widgets.Grid create_grid () { @@ -182,28 +187,39 @@ public class DateTime.Widgets.CalendarView : Gtk.Grid { var start = Util.get_start_of_month (today); selected_date = today; if (start.equal (start_month)) { + if (gridlist.length () == 0) { + carousel.no_show_all = true; + set_carousel_grids (); + return; + } position -= rel_postion; carousel.switch_child (position, carousel.get_animation_duration ()); + center_grid.update_today (); } else { /*reset Carousel if center_child != the grid of the month of today*/ carousel.no_show_all = true; - foreach (unowned Gtk.Widget grid in carousel.get_children ()) { - carousel.remove (grid); - } + clear (); + set_carousel_grids (); + } + } + private void set_carousel_grids () { + rel_postion = 0; + position = 1; start_month = Util.get_start_of_month (); calmodel.month_start = start_month; - var center_grid = create_grid (); + + center_grid = create_grid (); center_grid.set_range (calmodel.data_range, calmodel.month_start); center_grid.update_weeks (calmodel.data_range.first_dt, calmodel.num_weeks); calmodel.change_month (-1); - var left_grid = create_grid (); + left_grid = create_grid (); left_grid.set_range (calmodel.data_range, calmodel.month_start); left_grid.update_weeks (calmodel.data_range.first_dt, calmodel.num_weeks); calmodel.change_month (2); - var right_grid = create_grid (); + right_grid = create_grid (); right_grid.set_range (calmodel.data_range, calmodel.month_start); right_grid.update_weeks (calmodel.data_range.first_dt, calmodel.num_weeks); calmodel.change_month (-1); @@ -211,12 +227,35 @@ public class DateTime.Widgets.CalendarView : Gtk.Grid { carousel.add (left_grid); carousel.add (center_grid); carousel.add (right_grid); + + gridlist.append (left_grid); + gridlist.append (center_grid); + gridlist.append (right_grid); + carousel.scroll_to (center_grid); label.label = calmodel.month_start.format (_("%OB, %Y")); - carousel.no_show_all = false; - } + current_grid = center_grid; } + public void clear () { + + foreach (unowned Gtk.Widget grid in carousel.get_children ()) { + carousel.remove (grid); + gridlist.remove ((DateTime.Widgets.Grid) grid); + grid.destroy (); + } + //calmodel.source_events.remove_all (); /* foreach (unowned Grid grid in gridlist) { + /* if ((grid != right_grid && grid != center_grid && grid != left_grid)) { + carousel.remove (grid); + gridlist.remove (grid); + grid.destroy (); + } + } + calmodel.change_month (-rel_postion); + carousel.switch_child (position, carousel.get_animation_duration ()); + rel_postion = 0; + position = 1;*/ + } // TODO: As far as maya supports it use the Dbus Activation feature to run the calendar-app. public void show_date_in_maya (GLib.DateTime date) { var command = "io.elementary.calendar --show-day %s".printf (date.format ("%F")); diff --git a/src/Widgets/calendar/Grid.vala b/src/Widgets/calendar/Grid.vala index 04298451..43ec1148 100644 --- a/src/Widgets/calendar/Grid.vala +++ b/src/Widgets/calendar/Grid.vala @@ -115,7 +115,12 @@ namespace DateTime.Widgets { day.set_selected (true); day.set_state_flags (Gtk.StateFlags.FOCUSED, false); selection_changed (selected_date); + } + public void remove_day_focus_in () { + if (selected_gridday != null) { + selected_gridday.set_selected (false); + } } public void set_focus_to_today () { @@ -127,7 +132,10 @@ namespace DateTime.Widgets { var date = dates[i]; GridDay? day = data[day_hash (date)]; if (day != null && day.name == "today") { - day.grab_focus_force (); + if (selected_gridday != day) { + day.grab_focus_force (); + } + day.set_selected (true); return; } } @@ -180,7 +188,7 @@ namespace DateTime.Widgets { /* Still update_day to get the color of etc. right */ day = update_day (new GridDay (new_date), new_date, today, month_start); day.on_event_add.connect ((date) => on_event_add (date)); - day.focus_in_event.connect ((event) => { + day.focus_grabbed.connect (() => { on_day_focus_in (day); return false; diff --git a/src/Widgets/calendar/GridDay.vala b/src/Widgets/calendar/GridDay.vala index 0d6ba92a..ba92c841 100644 --- a/src/Widgets/calendar/GridDay.vala +++ b/src/Widgets/calendar/GridDay.vala @@ -26,6 +26,7 @@ public class DateTime.Widgets.GridDay : Gtk.EventBox { * Event emitted when the day is double clicked or the ENTER key is pressed. */ public signal void on_event_add (GLib.DateTime date); + public signal bool focus_grabbed (); public GLib.DateTime date { get; construct set; } @@ -79,6 +80,8 @@ public class DateTime.Widgets.GridDay : Gtk.EventBox { label.label = date.get_day_of_month ().to_string (); }); + focus_in_event.connect (() => focus_grabbed ()); + event_dots = new Gee.HashMap (); } @@ -129,7 +132,7 @@ public class DateTime.Widgets.GridDay : Gtk.EventBox { public override void grab_focus () { if (valid_grab) { - base.grab_focus (); + focus_grabbed (); valid_grab = false; } } From 094ea33449285a1fac6b74453e7aef780d6c0734 Mon Sep 17 00:00:00 2001 From: fs3o5 Date: Sun, 1 Nov 2020 00:24:15 +0000 Subject: [PATCH 02/10] libhandy-fixes --- src/Widgets/calendar/CalendarView.vala | 85 +++++++++++--------------- 1 file changed, 36 insertions(+), 49 deletions(-) diff --git a/src/Widgets/calendar/CalendarView.vala b/src/Widgets/calendar/CalendarView.vala index 6a3dfc4d..e8e037bb 100644 --- a/src/Widgets/calendar/CalendarView.vala +++ b/src/Widgets/calendar/CalendarView.vala @@ -151,7 +151,6 @@ public class DateTime.Widgets.CalendarView : Gtk.Grid { calmodel.change_month (-1); var grid = create_grid (); grid.set_range (calmodel.data_range, calmodel.month_start); - grid.set_range (calmodel.data_range, calmodel.month_start); grid.update_weeks (calmodel.data_range.first_dt, calmodel.num_weeks); carousel.prepend (grid); gridlist.prepend (grid); @@ -160,7 +159,6 @@ public class DateTime.Widgets.CalendarView : Gtk.Grid { } label.label = calmodel.month_start.format (_("%OB, %Y")); }); - show_today (); } @@ -204,58 +202,47 @@ public class DateTime.Widgets.CalendarView : Gtk.Grid { } private void set_carousel_grids () { - rel_postion = 0; - position = 1; - start_month = Util.get_start_of_month (); - calmodel.month_start = start_month; - - center_grid = create_grid (); - center_grid.set_range (calmodel.data_range, calmodel.month_start); - center_grid.update_weeks (calmodel.data_range.first_dt, calmodel.num_weeks); - - calmodel.change_month (-1); - left_grid = create_grid (); - left_grid.set_range (calmodel.data_range, calmodel.month_start); - left_grid.update_weeks (calmodel.data_range.first_dt, calmodel.num_weeks); - - calmodel.change_month (2); - right_grid = create_grid (); - right_grid.set_range (calmodel.data_range, calmodel.month_start); - right_grid.update_weeks (calmodel.data_range.first_dt, calmodel.num_weeks); - calmodel.change_month (-1); - - carousel.add (left_grid); - carousel.add (center_grid); - carousel.add (right_grid); - - gridlist.append (left_grid); - gridlist.append (center_grid); - gridlist.append (right_grid); - - carousel.scroll_to (center_grid); - label.label = calmodel.month_start.format (_("%OB, %Y")); - current_grid = center_grid; + rel_postion = 0; + position = 1; + start_month = Util.get_start_of_month (); + calmodel.month_start = start_month; + + center_grid = create_grid (); + center_grid.set_range (calmodel.data_range, calmodel.month_start); + center_grid.update_weeks (calmodel.data_range.first_dt, calmodel.num_weeks); + + calmodel.change_month (-1); + left_grid = create_grid (); + left_grid.set_range (calmodel.data_range, calmodel.month_start); + left_grid.update_weeks (calmodel.data_range.first_dt, calmodel.num_weeks); + + calmodel.change_month (2); + right_grid = create_grid (); + right_grid.set_range (calmodel.data_range, calmodel.month_start); + right_grid.update_weeks (calmodel.data_range.first_dt, calmodel.num_weeks); + calmodel.change_month (-1); + + carousel.add (left_grid); + carousel.add (center_grid); + carousel.add (right_grid); + + gridlist.append (left_grid); + gridlist.append (center_grid); + gridlist.append (right_grid); + + carousel.scroll_to (center_grid); + label.label = calmodel.month_start.format (_("%OB, %Y")); + current_grid = center_grid; } public void clear () { - - foreach (unowned Gtk.Widget grid in carousel.get_children ()) { - carousel.remove (grid); - gridlist.remove ((DateTime.Widgets.Grid) grid); - grid.destroy (); - } - //calmodel.source_events.remove_all (); /* foreach (unowned Grid grid in gridlist) { - /* if ((grid != right_grid && grid != center_grid && grid != left_grid)) { - carousel.remove (grid); - gridlist.remove (grid); - grid.destroy (); - } + foreach (unowned Gtk.Widget grid in carousel.get_children ()) { + carousel.remove (grid); + gridlist.remove ((DateTime.Widgets.Grid) grid); + grid.destroy (); } - calmodel.change_month (-rel_postion); - carousel.switch_child (position, carousel.get_animation_duration ()); - rel_postion = 0; - position = 1;*/ } + // TODO: As far as maya supports it use the Dbus Activation feature to run the calendar-app. public void show_date_in_maya (GLib.DateTime date) { var command = "io.elementary.calendar --show-day %s".printf (date.format ("%F")); From 3e66a4cc271f0b44a834943af99a4257f5506357 Mon Sep 17 00:00:00 2001 From: fs3o5 Date: Wed, 18 Nov 2020 20:17:46 +0000 Subject: [PATCH 03/10] libhandy-fixes --- src/Indicator.vala | 3 +++ src/Widgets/calendar/CalendarView.vala | 20 ++++++++------------ 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/Indicator.vala b/src/Indicator.vala index 810dc130..137f9331 100644 --- a/src/Indicator.vala +++ b/src/Indicator.vala @@ -49,6 +49,9 @@ public class DateTime.Indicator : Wingpanel.Indicator { } public override Gtk.Widget? get_widget () { + + Hdy.init (); + if (main_grid == null) { calendar = new Widgets.CalendarView (); calendar.margin_bottom = 6; diff --git a/src/Widgets/calendar/CalendarView.vala b/src/Widgets/calendar/CalendarView.vala index e8e037bb..d7e6e25a 100644 --- a/src/Widgets/calendar/CalendarView.vala +++ b/src/Widgets/calendar/CalendarView.vala @@ -32,7 +32,6 @@ public class DateTime.Widgets.CalendarView : Gtk.Grid { private GLib.DateTime start_month; private Gtk.Label label; private bool showtoday; - private List gridlist = new List (); private DateTime.Widgets.Grid current_grid; private DateTime.Widgets.Grid center_grid; @@ -90,7 +89,7 @@ public class DateTime.Widgets.CalendarView : Gtk.Grid { attach (box_buttons, 1, 0); attach (carousel, 0, 1, 2); - bool page_changed = false; + bool page_changed = false; left_button.clicked.connect (() => { if (page_changed) { @@ -133,18 +132,17 @@ public class DateTime.Widgets.CalendarView : Gtk.Grid { return; } current_grid.remove_day_focus_in (); - current_grid = gridlist.nth_data (index); + current_grid = (DateTime.Widgets.Grid) carousel.get_children ().nth_data (index); selected_date = null; selection_changed (selected_date); /* creates a new Grid, when the Hdy.Carousel is on it's first/last page*/ - if (index + 1 == (int) gridlist.length ()) { + if (index + 1 == (int) carousel.n_pages) { calmodel.change_month (1); var grid = create_grid (); grid.set_range (calmodel.data_range, calmodel.month_start); grid.update_weeks (calmodel.data_range.first_dt, calmodel.num_weeks); carousel.add (grid); - gridlist.append (grid); calmodel.change_month (-1); } else if (index == 0) { @@ -153,7 +151,6 @@ public class DateTime.Widgets.CalendarView : Gtk.Grid { grid.set_range (calmodel.data_range, calmodel.month_start); grid.update_weeks (calmodel.data_range.first_dt, calmodel.num_weeks); carousel.prepend (grid); - gridlist.prepend (grid); calmodel.change_month (1); position++; } @@ -185,7 +182,7 @@ public class DateTime.Widgets.CalendarView : Gtk.Grid { var start = Util.get_start_of_month (today); selected_date = today; if (start.equal (start_month)) { - if (gridlist.length () == 0) { + if (carousel.n_pages == 0) { carousel.no_show_all = true; set_carousel_grids (); return; @@ -226,11 +223,10 @@ public class DateTime.Widgets.CalendarView : Gtk.Grid { carousel.add (center_grid); carousel.add (right_grid); - gridlist.append (left_grid); - gridlist.append (center_grid); - gridlist.append (right_grid); - + carousel.animation_duration = 0; carousel.scroll_to (center_grid); + carousel.animation_duration = 250; + label.label = calmodel.month_start.format (_("%OB, %Y")); current_grid = center_grid; } @@ -238,7 +234,7 @@ public class DateTime.Widgets.CalendarView : Gtk.Grid { public void clear () { foreach (unowned Gtk.Widget grid in carousel.get_children ()) { carousel.remove (grid); - gridlist.remove ((DateTime.Widgets.Grid) grid); + ((DateTime.Widgets.Grid) grid).foreach ((day_grid) => ((DateTime.Widgets.Grid) grid).remove (day_grid)); grid.destroy (); } } From 15e08bc9e753c9711e36ae3daed69ffb3c94a131 Mon Sep 17 00:00:00 2001 From: fs3o5 Date: Wed, 18 Nov 2020 20:52:09 +0000 Subject: [PATCH 04/10] libhandy-fixes --- src/Indicator.vala | 3 --- src/Widgets/calendar/CalendarModel.vala | 10 +--------- src/Widgets/calendar/Grid.vala | 5 +---- 3 files changed, 2 insertions(+), 16 deletions(-) diff --git a/src/Indicator.vala b/src/Indicator.vala index 137f9331..810dc130 100644 --- a/src/Indicator.vala +++ b/src/Indicator.vala @@ -49,9 +49,6 @@ public class DateTime.Indicator : Wingpanel.Indicator { } public override Gtk.Widget? get_widget () { - - Hdy.init (); - if (main_grid == null) { calendar = new Widgets.CalendarView (); calendar.margin_bottom = 6; diff --git a/src/Widgets/calendar/CalendarModel.vala b/src/Widgets/calendar/CalendarModel.vala index 9462d68f..3aac0340 100644 --- a/src/Widgets/calendar/CalendarModel.vala +++ b/src/Widgets/calendar/CalendarModel.vala @@ -58,7 +58,7 @@ namespace DateTime.Widgets { return calendar_model; } - construct { + public CalendarModel calendar_model (GLib.DateTime date) { open.begin (); source_client = new HashTable (str_hash, str_equal); @@ -134,14 +134,6 @@ namespace DateTime.Widgets { source_events.remove (source); } - public void change_month (int relative) { - month_start = month_start.add_months (relative); - } - - public void change_year (int relative) { - month_start = month_start.add_years (relative); - } - /* --- Helper Methods ---// */ private void compute_ranges () { diff --git a/src/Widgets/calendar/Grid.vala b/src/Widgets/calendar/Grid.vala index 43ec1148..9ba22b73 100644 --- a/src/Widgets/calendar/Grid.vala +++ b/src/Widgets/calendar/Grid.vala @@ -41,11 +41,8 @@ namespace DateTime.Widgets { private static Widgets.CalendarModel calendar_model; - static construct { - calendar_model = Widgets.CalendarModel.get_default (); - } - construct { + calendar_model = new Widgets.CalendarModel (); header_labels = new Gtk.Label[7]; for (int c = 0; c < 7; c++) { header_labels[c] = new Gtk.Label (null); From cc9dfee7c3da62dd1349590d1fab0ae79db6e9ad Mon Sep 17 00:00:00 2001 From: fs3o5 Date: Thu, 26 Nov 2020 22:19:24 +0000 Subject: [PATCH 05/10] libhandy-fixes --- src/Indicator.vala | 13 ++--- src/Widgets/calendar/CalendarModel.vala | 28 ++------- src/Widgets/calendar/CalendarView.vala | 78 ++++++++++++------------- src/Widgets/calendar/Grid.vala | 30 ++++++---- 4 files changed, 67 insertions(+), 82 deletions(-) diff --git a/src/Indicator.vala b/src/Indicator.vala index 810dc130..7b477196 100644 --- a/src/Indicator.vala +++ b/src/Indicator.vala @@ -161,7 +161,7 @@ public class DateTime.Indicator : Wingpanel.Indicator { return 0; } - private void update_events_model (E.Source source, Gee.Collection events) { + private void update_events_model () { idle_update_events (); } @@ -185,7 +185,7 @@ public class DateTime.Indicator : Wingpanel.Indicator { var date = calendar.selected_date; - var model = Widgets.CalendarModel.get_default (); + var model = calendar.current_calmodel; var events_on_day = new Gee.TreeMap (); @@ -210,16 +210,11 @@ public class DateTime.Indicator : Wingpanel.Indicator { public override void opened () { calendar.show_today (); - - Widgets.CalendarModel.get_default ().events_added.connect (update_events_model); - Widgets.CalendarModel.get_default ().events_updated.connect (update_events_model); - Widgets.CalendarModel.get_default ().events_removed.connect (update_events_model); + calendar.events_changed.connect (update_events_model); } public override void closed () { - Widgets.CalendarModel.get_default ().events_added.disconnect (update_events_model); - Widgets.CalendarModel.get_default ().events_updated.disconnect (update_events_model); - Widgets.CalendarModel.get_default ().events_removed.disconnect (update_events_model); + calendar.events_changed.disconnect (update_events_model); calendar.clear (); } } diff --git a/src/Widgets/calendar/CalendarModel.vala b/src/Widgets/calendar/CalendarModel.vala index 3aac0340..9465f0bf 100644 --- a/src/Widgets/calendar/CalendarModel.vala +++ b/src/Widgets/calendar/CalendarModel.vala @@ -27,7 +27,7 @@ namespace DateTime.Widgets { public Util.DateRange data_range { get; private set; } /* The first day of the month */ - public GLib.DateTime month_start { get; set; } + public GLib.DateTime month_start { get; private set; } /* The number of weeks to show in this model */ public int num_weeks { get; private set; default = 6; } @@ -46,21 +46,10 @@ namespace DateTime.Widgets { private HashTable source_client; private HashTable source_view; - private static CalendarModel? calendar_model = null; + public CalendarModel (GLib.DateTime date) { + month_start = date; - public static CalendarModel get_default () { - lock (calendar_model) { - if (calendar_model == null) { - calendar_model = new CalendarModel (); - } - } - - return calendar_model; - } - - public CalendarModel calendar_model (GLib.DateTime date) { open.begin (); - source_client = new HashTable (str_hash, str_equal); source_events = new HashTable > (Util.source_hash_func, Util.source_equal_func); source_view = new HashTable (str_hash, str_equal); @@ -69,10 +58,8 @@ namespace DateTime.Widgets { if (week_start >= 1 && week_start <= 7) { week_starts_on = (GLib.DateWeekday) (week_start - 1); } - - month_start = Util.get_start_of_month (); compute_ranges (); - notify["month-start"].connect (on_parameter_changed); + load_all_sources (); } private async void open () { @@ -86,6 +73,7 @@ namespace DateTime.Widgets { E.SourceCalendar cal = (E.SourceCalendar)source.get_extension (E.SOURCE_EXTENSION_CALENDAR); if (cal.selected == true && source.enabled == true) { add_source_async.begin (source); + add_source_async.begin (source); } }); @@ -233,12 +221,6 @@ namespace DateTime.Widgets { debug (@"Event ['$(comp.get_summary())', $(source.dup_display_name()), $(comp.get_uid()))]"); } - /* --- Signal Handlers ---// */ - private void on_parameter_changed () { - compute_ranges (); - load_all_sources (); - } - private ECal.ClientView on_client_view_received (AsyncResult results, E.Source source, ECal.Client client) { ECal.ClientView view; try { diff --git a/src/Widgets/calendar/CalendarView.vala b/src/Widgets/calendar/CalendarView.vala index d7e6e25a..4c48d97a 100644 --- a/src/Widgets/calendar/CalendarView.vala +++ b/src/Widgets/calendar/CalendarView.vala @@ -23,12 +23,14 @@ public class DateTime.Widgets.CalendarView : Gtk.Grid { public signal void event_updates (); public signal void selection_changed (GLib.DateTime? new_date); + public signal void events_changed (); + public GLib.DateTime? selected_date { get; private set; } private Hdy.Carousel carousel; private uint position; private int rel_postion; - private CalendarModel calmodel; + public CalendarModel current_calmodel {get; private set;} private GLib.DateTime start_month; private Gtk.Label label; private bool showtoday; @@ -66,19 +68,13 @@ public class DateTime.Widgets.CalendarView : Gtk.Grid { box_buttons.add (center_button); box_buttons.add (right_button); - calmodel = CalendarModel.get_default (); - carousel = new Hdy.Carousel () { interactive = true, expand = true, spacing = 15 }; - set_carousel_grids (); - - position = 1; - rel_postion = 0; - showtoday = false; + show_today (); carousel.show_all (); @@ -112,55 +108,59 @@ public class DateTime.Widgets.CalendarView : Gtk.Grid { carousel.page_changed.connect ((index) => { page_changed = true; if (position > index) { - calmodel.change_month (-1); rel_postion--; position--; } else if (position < index) { - calmodel.change_month (1); rel_postion++; position++; } else if (showtoday) { - calmodel.change_month (-rel_postion); showtoday = false; rel_postion = 0; current_grid.remove_day_focus_in (); + current_grid.events_changed.disconnect (events_changed_sig); current_grid = center_grid; - label.label = calmodel.month_start.format (_("%OB, %Y")); + current_calmodel = center_grid.calmodel; + label.label = current_calmodel.month_start.format (_("%OB, %Y")); + current_grid.events_changed.connect (events_changed_sig); + selected_date = null; current_grid.set_focus_to_today (); + selection_changed (selected_date); return; } else { return; } current_grid.remove_day_focus_in (); - current_grid = (DateTime.Widgets.Grid) carousel.get_children ().nth_data (index); selected_date = null; + current_grid.events_changed.disconnect (events_changed_sig); + current_grid = (DateTime.Widgets.Grid) carousel.get_children ().nth_data (index); + print("test"); + current_calmodel = current_grid.calmodel; + current_grid.events_changed.connect (events_changed_sig); selection_changed (selected_date); - /* creates a new Grid, when the Hdy.Carousel is on it's first/last page*/ + //creates a new Grid, when the Hdy.Carousel is on it's first/last page // if (index + 1 == (int) carousel.n_pages) { - calmodel.change_month (1); + rel_postion++; var grid = create_grid (); - grid.set_range (calmodel.data_range, calmodel.month_start); - grid.update_weeks (calmodel.data_range.first_dt, calmodel.num_weeks); carousel.add (grid); - calmodel.change_month (-1); - + rel_postion--; } else if (index == 0) { - calmodel.change_month (-1); + rel_postion--; var grid = create_grid (); - grid.set_range (calmodel.data_range, calmodel.month_start); - grid.update_weeks (calmodel.data_range.first_dt, calmodel.num_weeks); carousel.prepend (grid); - calmodel.change_month (1); position++; + rel_postion++; } - label.label = calmodel.month_start.format (_("%OB, %Y")); + label.label = current_calmodel.month_start.format (_("%OB, %Y")); }); - show_today (); + } + private void events_changed_sig () { + events_changed (); } private DateTime.Widgets.Grid create_grid () { - var grid = new DateTime.Widgets.Grid (); + var grid = new DateTime.Widgets.Grid (Util.get_start_of_month ().add_months (rel_postion)); + grid.show_all (); grid.on_event_add.connect ((date) => { @@ -202,22 +202,15 @@ public class DateTime.Widgets.CalendarView : Gtk.Grid { rel_postion = 0; position = 1; start_month = Util.get_start_of_month (); - calmodel.month_start = start_month; center_grid = create_grid (); - center_grid.set_range (calmodel.data_range, calmodel.month_start); - center_grid.update_weeks (calmodel.data_range.first_dt, calmodel.num_weeks); - - calmodel.change_month (-1); + rel_postion = -1; + print (center_grid.calmodel.month_start.format (_("%OB, %Y"))); left_grid = create_grid (); - left_grid.set_range (calmodel.data_range, calmodel.month_start); - left_grid.update_weeks (calmodel.data_range.first_dt, calmodel.num_weeks); - - calmodel.change_month (2); + rel_postion = 1; + print (center_grid.calmodel.month_start.format (_("%OB, %Y"))); right_grid = create_grid (); - right_grid.set_range (calmodel.data_range, calmodel.month_start); - right_grid.update_weeks (calmodel.data_range.first_dt, calmodel.num_weeks); - calmodel.change_month (-1); + rel_postion = 0; carousel.add (left_grid); carousel.add (center_grid); @@ -227,13 +220,20 @@ public class DateTime.Widgets.CalendarView : Gtk.Grid { carousel.scroll_to (center_grid); carousel.animation_duration = 250; - label.label = calmodel.month_start.format (_("%OB, %Y")); current_grid = center_grid; + current_calmodel = center_grid.calmodel; + current_grid.events_changed.connect (events_changed_sig); + label.label = center_grid.calmodel.month_start.format (_("%OB, %Y")); + print(label.label); + + carousel.show_all (); } public void clear () { foreach (unowned Gtk.Widget grid in carousel.get_children ()) { carousel.remove (grid); + // ((DateTime.Widgets.Grid) grid).on_event_add.disconnect (); + //grid.selection_changed.disconnect (); ((DateTime.Widgets.Grid) grid).foreach ((day_grid) => ((DateTime.Widgets.Grid) grid).remove (day_grid)); grid.destroy (); } diff --git a/src/Widgets/calendar/Grid.vala b/src/Widgets/calendar/Grid.vala index 9ba22b73..77ddb7d0 100644 --- a/src/Widgets/calendar/Grid.vala +++ b/src/Widgets/calendar/Grid.vala @@ -34,15 +34,17 @@ namespace DateTime.Widgets { public signal void selection_changed (GLib.DateTime new_date); + public signal void events_changed (); + private Gee.HashMap data; private GridDay selected_gridday; private Gtk.Label[] header_labels; private Gtk.Revealer[] week_labels; - private static Widgets.CalendarModel calendar_model; + public Widgets.CalendarModel calmodel {get; private set;} - construct { - calendar_model = new Widgets.CalendarModel (); + public Grid (GLib.DateTime datetime) { + calmodel = new Widgets.CalendarModel (Util.get_start_of_month (datetime)); header_labels = new Gtk.Label[7]; for (int c = 0; c < 7; c++) { header_labels[c] = new Gtk.Label (null); @@ -66,8 +68,14 @@ namespace DateTime.Widgets { data = new Gee.HashMap (); - calendar_model.events_added.connect (add_event_dots); - calendar_model.events_removed.connect (remove_event_dots); + calmodel.events_added.connect (add_event_dots); + calmodel.events_removed.connect (remove_event_dots); + + calmodel.events_added.connect (() => (events_changed ())); + calmodel.events_removed.connect (() => (events_changed ())); + calmodel.events_updated.connect (() => (events_changed ())); + + set_range (); } private void add_event_dots (E.Source source, Gee.Collection events) { @@ -142,7 +150,7 @@ namespace DateTime.Widgets { * Sets the given range to be displayed in the grid. Note that the number of days * must remain the same. */ - public void set_range (Util.DateRange new_range, GLib.DateTime month_start) { + private void set_range () { var today = new GLib.DateTime.now_local (); Gee.List old_dates; @@ -153,7 +161,7 @@ namespace DateTime.Widgets { old_dates = grid_range.to_list (); } - var new_dates = new_range.to_list (); + var new_dates = calmodel.data_range.to_list (); var data_new = new Gee.HashMap (); @@ -163,7 +171,7 @@ namespace DateTime.Widgets { /* Create new widgets for the new range */ var date = Util.strip_time (today); - date = date.add_days (CalendarModel.get_default ().week_starts_on - date.get_day_of_week ()); + date = date.add_days (calmodel.week_starts_on - date.get_day_of_week ()); foreach (var label in header_labels) { label.label = date.format ("%a"); date = date.add_days (1); @@ -180,10 +188,10 @@ namespace DateTime.Widgets { /* A widget already exists for this date, just change it */ var old_date = old_dates[i]; - day = update_day (data[day_hash (old_date)], new_date, today, month_start); + day = update_day (data[day_hash (old_date)], new_date, today, calmodel.month_start); } else { /* Still update_day to get the color of etc. right */ - day = update_day (new GridDay (new_date), new_date, today, month_start); + day = update_day (new GridDay (new_date), new_date, today,calmodel.month_start); day.on_event_add.connect ((date) => on_event_add (date)); day.focus_grabbed.connect (() => { on_day_focus_in (day); @@ -213,7 +221,7 @@ namespace DateTime.Widgets { data.clear (); data.set_all (data_new); - grid_range = new_range; + grid_range = calmodel.data_range; } /** From 1bc59d8f2e3460186eb934136f8a50ba072d0e7d Mon Sep 17 00:00:00 2001 From: fs3o5 Date: Thu, 26 Nov 2020 22:47:07 +0000 Subject: [PATCH 06/10] libhandy-fixes --- src/Widgets/calendar/CalendarView.vala | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/Widgets/calendar/CalendarView.vala b/src/Widgets/calendar/CalendarView.vala index 4c48d97a..5a50ff90 100644 --- a/src/Widgets/calendar/CalendarView.vala +++ b/src/Widgets/calendar/CalendarView.vala @@ -133,7 +133,6 @@ public class DateTime.Widgets.CalendarView : Gtk.Grid { selected_date = null; current_grid.events_changed.disconnect (events_changed_sig); current_grid = (DateTime.Widgets.Grid) carousel.get_children ().nth_data (index); - print("test"); current_calmodel = current_grid.calmodel; current_grid.events_changed.connect (events_changed_sig); selection_changed (selected_date); @@ -205,10 +204,8 @@ public class DateTime.Widgets.CalendarView : Gtk.Grid { center_grid = create_grid (); rel_postion = -1; - print (center_grid.calmodel.month_start.format (_("%OB, %Y"))); left_grid = create_grid (); rel_postion = 1; - print (center_grid.calmodel.month_start.format (_("%OB, %Y"))); right_grid = create_grid (); rel_postion = 0; @@ -224,7 +221,6 @@ public class DateTime.Widgets.CalendarView : Gtk.Grid { current_calmodel = center_grid.calmodel; current_grid.events_changed.connect (events_changed_sig); label.label = center_grid.calmodel.month_start.format (_("%OB, %Y")); - print(label.label); carousel.show_all (); } From be96680c98aee7b65d590f718a82540dd0b63911 Mon Sep 17 00:00:00 2001 From: fs3o5 Date: Thu, 26 Nov 2020 23:45:26 +0000 Subject: [PATCH 07/10] libhandy-fixes --- src/Widgets/calendar/CalendarView.vala | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/Widgets/calendar/CalendarView.vala b/src/Widgets/calendar/CalendarView.vala index 5a50ff90..d54ea4eb 100644 --- a/src/Widgets/calendar/CalendarView.vala +++ b/src/Widgets/calendar/CalendarView.vala @@ -106,7 +106,6 @@ public class DateTime.Widgets.CalendarView : Gtk.Grid { }); carousel.page_changed.connect ((index) => { - page_changed = true; if (position > index) { rel_postion--; position--; @@ -151,8 +150,10 @@ public class DateTime.Widgets.CalendarView : Gtk.Grid { rel_postion++; } label.label = current_calmodel.month_start.format (_("%OB, %Y")); + page_changed = true; }); } + private void events_changed_sig () { events_changed (); } @@ -162,17 +163,21 @@ public class DateTime.Widgets.CalendarView : Gtk.Grid { grid.show_all (); - grid.on_event_add.connect ((date) => { + grid.on_event_add.connect (on_event_add_callback); + + grid.selection_changed.connect (selection_changed_callback); + + return grid; + } + + private void on_event_add_callback (GLib.DateTime date) { show_date_in_maya (date); day_double_click (); - }); - - grid.selection_changed.connect ((date) => { + } + + private void selection_changed_callback (GLib.DateTime date) { selected_date = date; selection_changed (date); - }); - - return grid; } public void show_today () { @@ -228,8 +233,8 @@ public class DateTime.Widgets.CalendarView : Gtk.Grid { public void clear () { foreach (unowned Gtk.Widget grid in carousel.get_children ()) { carousel.remove (grid); - // ((DateTime.Widgets.Grid) grid).on_event_add.disconnect (); - //grid.selection_changed.disconnect (); + ((DateTime.Widgets.Grid) grid).on_event_add.disconnect (on_event_add_callback); + ((DateTime.Widgets.Grid) grid).selection_changed.disconnect (selection_changed_callback); ((DateTime.Widgets.Grid) grid).foreach ((day_grid) => ((DateTime.Widgets.Grid) grid).remove (day_grid)); grid.destroy (); } From cf3d9edf67261822657b410aacdd428a823b3330 Mon Sep 17 00:00:00 2001 From: fs3o5 Date: Fri, 27 Nov 2020 00:32:25 +0000 Subject: [PATCH 08/10] libhandy-fixes --- src/Widgets/calendar/CalendarModel.vala | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Widgets/calendar/CalendarModel.vala b/src/Widgets/calendar/CalendarModel.vala index 9465f0bf..e9315b24 100644 --- a/src/Widgets/calendar/CalendarModel.vala +++ b/src/Widgets/calendar/CalendarModel.vala @@ -73,7 +73,6 @@ namespace DateTime.Widgets { E.SourceCalendar cal = (E.SourceCalendar)source.get_extension (E.SOURCE_EXTENSION_CALENDAR); if (cal.selected == true && source.enabled == true) { add_source_async.begin (source); - add_source_async.begin (source); } }); From b426228e822b2d4f2e6c792f5338c56a1b52e52c Mon Sep 17 00:00:00 2001 From: fs3o5 Date: Fri, 27 Nov 2020 01:01:37 +0000 Subject: [PATCH 09/10] libhandy-fixes --- src/Widgets/calendar/CalendarView.vala | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/Widgets/calendar/CalendarView.vala b/src/Widgets/calendar/CalendarView.vala index d54ea4eb..b5f4f774 100644 --- a/src/Widgets/calendar/CalendarView.vala +++ b/src/Widgets/calendar/CalendarView.vala @@ -121,9 +121,8 @@ public class DateTime.Widgets.CalendarView : Gtk.Grid { current_calmodel = center_grid.calmodel; label.label = current_calmodel.month_start.format (_("%OB, %Y")); current_grid.events_changed.connect (events_changed_sig); - selected_date = null; - current_grid.set_focus_to_today (); selection_changed (selected_date); + current_grid.set_focus_to_today (); return; } else { return; @@ -169,12 +168,12 @@ public class DateTime.Widgets.CalendarView : Gtk.Grid { return grid; } - + private void on_event_add_callback (GLib.DateTime date) { show_date_in_maya (date); day_double_click (); } - + private void selection_changed_callback (GLib.DateTime date) { selected_date = date; selection_changed (date); From 401b0bb206f6a7b571fb5edaaa891a986a9e77e7 Mon Sep 17 00:00:00 2001 From: fs3o5 Date: Fri, 27 Nov 2020 01:06:34 +0000 Subject: [PATCH 10/10] libhandy-fixes --- src/Widgets/calendar/Grid.vala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Widgets/calendar/Grid.vala b/src/Widgets/calendar/Grid.vala index 77ddb7d0..5c6fbf58 100644 --- a/src/Widgets/calendar/Grid.vala +++ b/src/Widgets/calendar/Grid.vala @@ -191,7 +191,7 @@ namespace DateTime.Widgets { day = update_day (data[day_hash (old_date)], new_date, today, calmodel.month_start); } else { /* Still update_day to get the color of etc. right */ - day = update_day (new GridDay (new_date), new_date, today,calmodel.month_start); + day = update_day (new GridDay (new_date), new_date, today, calmodel.month_start); day.on_event_add.connect ((date) => on_event_add (date)); day.focus_grabbed.connect (() => { on_day_focus_in (day);