aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/actions.cpp20
-rw-r--r--src/menu.cpp2
-rw-r--r--tests/test-actions.cpp54
3 files changed, 73 insertions, 3 deletions
diff --git a/src/actions.cpp b/src/actions.cpp
index a6a7c0b..acf8fd4 100644
--- a/src/actions.cpp
+++ b/src/actions.cpp
@@ -108,9 +108,22 @@ void on_set_location(GSimpleAction * /*action*/,
g_free(zone);
}
-static void on_calendar_activated(GSimpleAction * /*action*/,
- GVariant * state,
- gpointer gself)
+void on_calendar_active_changed(GSimpleAction * /*action*/,
+ GVariant * state,
+ gpointer gself)
+{
+ // reset the date when the menu is shown
+ if (g_variant_get_boolean(state))
+ {
+ auto self = static_cast<Actions*>(gself);
+
+ self->set_calendar_date(self->state()->clock->localtime());
+ }
+}
+
+void on_calendar_activated(GSimpleAction * /*action*/,
+ GVariant * state,
+ gpointer gself)
{
const time_t t = g_variant_get_int64(state);
@@ -175,6 +188,7 @@ Actions::Actions(const std::shared_ptr<State>& state):
{ "activate-phone-clock-app", on_phone_clock_activated },
{ "activate-appointment", on_activate_appointment, "s", nullptr },
{ "activate-planner", on_activate_planner, "x", nullptr },
+ { "calendar-active", nullptr, nullptr, "false", on_calendar_active_changed },
{ "set-location", on_set_location, "s" }
};
diff --git a/src/menu.cpp b/src/menu.cpp
index 390a06f..b0ba79d 100644
--- a/src/menu.cpp
+++ b/src/menu.cpp
@@ -204,6 +204,8 @@ private:
auto header = g_menu_item_new(nullptr, detailed_action.c_str());
g_menu_item_set_attribute(header, "x-canonical-type", "s",
"com.canonical.indicator.root");
+ g_menu_item_set_attribute(header, "submenu-action", "s",
+ "indicator.calendar-active");
g_menu_item_set_submenu(header, G_MENU_MODEL(m_submenu));
g_object_unref(m_submenu);
diff --git a/tests/test-actions.cpp b/tests/test-actions.cpp
index c30d1fb..1865cfd 100644
--- a/tests/test-actions.cpp
+++ b/tests/test-actions.cpp
@@ -156,6 +156,60 @@ TEST_F(ActionsFixture, SetCalendarDate)
EXPECT_EQ (now, m_state->planner->time.get());
}
+TEST_F(ActionsFixture, ActivatingTheCalendarResetsItsDate)
+{
+ // Confirm that the GActions exist
+ auto action_group = m_actions->action_group();
+ EXPECT_TRUE(g_action_group_has_action(action_group, "calendar"));
+ EXPECT_TRUE(g_action_group_has_action(action_group, "calendar-active"));
+
+ ///
+ /// Prerequisite for the test: move calendar-date away from today
+ ///
+
+ // move calendar-date a week into the future...
+ const auto now = m_state->clock->localtime();
+ auto next_week = g_date_time_add_weeks(now.get(), 1);
+ const auto next_week_unix = g_date_time_to_unix(next_week);
+ g_action_group_activate_action (action_group, "calendar", g_variant_new_int64(next_week_unix));
+
+ // confirm the planner and calendar action state moved a week into the future
+ // but that m_state->clock is unchanged
+ EXPECT_EQ(next_week_unix, m_state->planner->time.get().to_unix());
+ EXPECT_EQ(now, m_state->clock->localtime());
+ auto calendar_state = g_action_group_get_action_state(action_group, "calendar");
+ EXPECT_TRUE(calendar_state != nullptr);
+ EXPECT_TRUE(g_variant_is_of_type(calendar_state, G_VARIANT_TYPE_DICTIONARY));
+ auto v = g_variant_lookup_value(calendar_state, "calendar-day", G_VARIANT_TYPE_INT64);
+ EXPECT_TRUE(v != nullptr);
+ EXPECT_EQ(next_week_unix, g_variant_get_int64(v));
+ g_clear_pointer(&v, g_variant_unref);
+ g_clear_pointer(&calendar_state, g_variant_unref);
+
+ ///
+ /// Now the actual test.
+ /// We set the state of 'calendar-active' to true, which should reset the calendar date.
+ /// This is so the calendar always starts on today's date when the indicator's menu is pulled down.
+ ///
+
+ // change the state...
+ g_action_group_change_action_state(action_group, "calendar-active", g_variant_new_boolean(true));
+
+ // confirm the planner and calendar action state were reset back to m_state->clock's time
+ EXPECT_EQ(now.to_unix(), m_state->planner->time.get().to_unix());
+ EXPECT_EQ(now, m_state->clock->localtime());
+ calendar_state = g_action_group_get_action_state(action_group, "calendar");
+ EXPECT_TRUE(calendar_state != nullptr);
+ EXPECT_TRUE(g_variant_is_of_type(calendar_state, G_VARIANT_TYPE_DICTIONARY));
+ v = g_variant_lookup_value(calendar_state, "calendar-day", G_VARIANT_TYPE_INT64);
+ EXPECT_TRUE(v != nullptr);
+ EXPECT_EQ(now.to_unix(), g_variant_get_int64(v));
+ g_clear_pointer(&v, g_variant_unref);
+ g_clear_pointer(&calendar_state, g_variant_unref);
+
+}
+
+
TEST_F(ActionsFixture, OpenAppointment)
{
Appointment appt;