From bcff13b6bce18604472e5954eb5ab7af4bb43b0f Mon Sep 17 00:00:00 2001 From: Charles Kerr Date: Thu, 16 Jan 2014 15:10:39 -0600 Subject: Implement Settings, a properties-cpp wrapper around GSettings --- src/settings-live.cpp | 410 +++++++++++++++++++++++--------------------------- 1 file changed, 187 insertions(+), 223 deletions(-) (limited to 'src') diff --git a/src/settings-live.cpp b/src/settings-live.cpp index 74085a9..2305c93 100644 --- a/src/settings-live.cpp +++ b/src/settings-live.cpp @@ -37,257 +37,221 @@ LiveSettings::LiveSettings(): { g_signal_connect (m_settings, "changed", G_CALLBACK(on_changed), this); + // init the Properties from the GSettings backend + update_custom_time_format(); + update_locations(); + update_show_calendar(); update_show_clock(); + update_show_date(); + update_show_day(); + update_show_detected_locations(); + update_show_events(); + update_show_locations(); + update_show_seconds(); + update_show_week_numbers(); + update_show_year(); + update_time_format_mode(); + update_timezone_name(); + + // now listen for clients to change the properties s.t. we can sync update GSettings + + custom_time_format.changed().connect([this](const std::string& value){ + g_settings_set_string(m_settings, SETTINGS_CUSTOM_TIME_FORMAT_S, value.c_str()); + }); + + locations.changed().connect([this](const std::vector& value){ + const int n = value.size(); + gchar** strv = g_new0(gchar*, n+1); + for(int i=0; i(value[i].c_str()); + g_settings_set_strv(m_settings, SETTINGS_LOCATIONS_S, strv); + g_free(strv); + }); + + show_calendar.changed().connect([this](bool value){ + g_settings_set_boolean(m_settings, SETTINGS_SHOW_CALENDAR_S, value); + }); + + show_clock.changed().connect([this](bool value){ + g_settings_set_boolean(m_settings, SETTINGS_SHOW_CLOCK_S, value); + }); + + show_date.changed().connect([this](bool value){ + g_settings_set_boolean(m_settings, SETTINGS_SHOW_DATE_S, value); + }); + + show_day.changed().connect([this](bool value){ + g_settings_set_boolean(m_settings, SETTINGS_SHOW_DAY_S, value); + }); + + show_detected_location.changed().connect([this](bool value){ + g_settings_set_boolean(m_settings, SETTINGS_SHOW_DETECTED_S, value); + }); + + show_events.changed().connect([this](bool value){ + g_settings_set_boolean(m_settings, SETTINGS_SHOW_EVENTS_S, value); + }); + + show_locations.changed().connect([this](bool value){ + g_settings_set_boolean(m_settings, SETTINGS_SHOW_LOCATIONS_S, value); + }); + + show_seconds.changed().connect([this](bool value){ + g_settings_set_boolean(m_settings, SETTINGS_SHOW_SECONDS_S, value); + }); + + show_week_numbers.changed().connect([this](bool value){ + g_settings_set_boolean(m_settings, SETTINGS_SHOW_WEEK_NUMBERS_S, value); + }); + + show_year.changed().connect([this](bool value){ + g_settings_set_boolean(m_settings, SETTINGS_SHOW_YEAR_S, value); + }); + + time_format_mode.changed().connect([this](TimeFormatMode value){ + g_settings_set_enum(m_settings, SETTINGS_TIME_FORMAT_S, gint(value)); + }); + + timezone_name.changed().connect([this](const std::string& value){ + g_settings_set_string(m_settings, SETTINGS_TIMEZONE_NAME_S, value.c_str()); + }); } -void LiveSettings::update_show_clock() +/*** +**** +***/ + +void LiveSettings::update_custom_time_format() { - auto val = g_settings_get_boolean(m_settings, SETTINGS_SHOW_CLOCK_S); - show_clock.set(val); + auto val = g_settings_get_string(m_settings, SETTINGS_CUSTOM_TIME_FORMAT_S); + custom_time_format.set(val); + g_free(val); } -void LiveSettings::on_changed(GSettings* /*settings*/, - gchar* key, - gpointer gself) +void LiveSettings::update_locations() { - static_cast(gself)->update_key(key); + auto strv = g_settings_get_strv(m_settings, SETTINGS_LOCATIONS_S); + std::vector l; + for(int i=0; strv && strv[i]; i++) + l.push_back(strv[i]); + g_strfreev(strv); + locations.set(l); } -void LiveSettings::update_key(const std::string& key) +void LiveSettings::update_show_calendar() { - if (key == SETTINGS_SHOW_CLOCK_S) - { - update_show_clock(); - } + const auto val = g_settings_get_boolean(m_settings, SETTINGS_SHOW_CALENDAR_S); + show_calendar.set(val); } -/*** -**** -***/ - -} // namespace datetime -} // namespace indicator -} // namespace unity - -#if 0 - else if (!g_strcmp0(key, TIME_FORMAT_S)) - { - } - else if (!g_strcmp0(key, SETTINGS_TIME_FORMAT_S)) - { - } - else if (!g_strcmp0(key, SETTINGS_SHOW_SECONDS_S)) - { - } - else if (!g_strcmp0(key, SETTINGS_SHOW_DAY_S)) - { - } - else if (!g_strcmp0(key, SETTINGS_SHOW_DATE_S)) - { - } - else if (!g_strcmp0(key, SETTINGS_SHOW_YEAR_S)) - { - } - else if (!g_strcmp0(key, SETTINGS_SHOW_CUSTOM_TIME_FORMAT_S)) - { - } - else if (!g_strcmp0(key, SETTINGS_SHOW_CALENDAR_S)) - { - } - else if (!g_strcmp0(key, SETTINGS_SHOW_WEEK_NUMBERS_S)) - { - } - else if (!g_strcmp0(key, SETTINGS_SHOW_EVENTS_S)) - { - } - else if (!g_strcmp0(key, SETTINGS_SHOW_LOCATIONS_S)) - { - } - else if (!g_strcmp0(key, SETTINGS_TIMEZONE_NAME_S)) - { - } - else if (!g_strcmp0(key, SETTINGS_SHOW_DETECTED_S)) - { - } - else if (!g_strcmp0(key, SETTINGS_LOCATIONS_S)) - { - } -#define SETTINGS_SHOW_DETECTED_S "show-auto-detected-location" -#define SETTINGS_LOCATIONS_S "locations" -#define SETTINGS_TIMEZONE_NAME_S "timezone-name" - zzz - "show-clock" - -void user_function (GSettings *settings, - gchar *key, - gpointer user_data) : Has Details - - for (i=0, n=G_N_ELEMENTS(header_settings); isettings, gstr->str, - G_CALLBACK(rebuild_header_soon), self); - } - - - const char * const calendar_settings[] = { - SETTINGS_SHOW_CALENDAR_S, - SETTINGS_SHOW_WEEK_NUMBERS_S - }; - const char * const appointment_settings[] = { - SETTINGS_SHOW_EVENTS_S, - SETTINGS_TIME_FORMAT_S, - SETTINGS_SHOW_SECONDS_S - }; - const char * const location_settings[] = { - SETTINGS_TIME_FORMAT_S, - SETTINGS_SHOW_SECONDS_S, - SETTINGS_CUSTOM_TIME_FORMAT_S, - SETTINGS_SHOW_LOCATIONS_S, - SETTINGS_LOCATIONS_S, - SETTINGS_SHOW_DETECTED_S, - SETTINGS_TIMEZONE_NAME_S - }; - const char * const time_format_string_settings[] = { - SETTINGS_TIME_FORMAT_S, - SETTINGS_SHOW_SECONDS_S, - SETTINGS_CUSTOM_TIME_FORMAT_S - }; - - - /*** - **** Listen for settings changes - ***/ - - for (i=0, n=G_N_ELEMENTS(header_settings); isettings, gstr->str, - G_CALLBACK(rebuild_header_soon), self); - } - +void LiveSettings::update_show_clock() +{ + show_clock.set(g_settings_get_boolean(m_settings, SETTINGS_SHOW_CLOCK_S)); } +void LiveSettings::update_show_date() +{ + show_date.set(g_settings_get_boolean(m_settings, SETTINGS_SHOW_DATE_S)); +} -#ifndef INDICATOR_DATETIME_SETTINGS_LIVE_H -#define INDICATOR_DATETIME_SETTINGS_LIVE_H - -#include // parent class - -#include // GSettings - -namespace unity { -namespace indicator { -namespace datetime { - -/** - * \brief #Settings implementation which uses GSettings. - */ -class LiveSettings +void LiveSettings::update_show_day() { -public: - LiveSettings(); - virtual ~LiveSettings(); + show_day.set(g_settings_get_boolean(m_settings, SETTINGS_SHOW_DAY_S)); +} -private: - GSettings* m_settings; +void LiveSettings::update_show_detected_locations() +{ + const auto val = g_settings_get_boolean(m_settings, SETTINGS_SHOW_DETECTED_S); + show_detected_location.set(val); +} - // we've got a raw pointer here, so disable copying - LiveSettings(const LiveSettings&) =delete; - LiveSettings& operator=(const LiveSettings&) =delete; -}; +void LiveSettings::update_show_events() +{ + const auto val = g_settings_get_boolean(m_settings, SETTINGS_SHOW_EVENTS_S); + show_events.set(val); +} +void LiveSettings::update_show_locations() +{ + const auto val = g_settings_get_boolean(m_settings, SETTINGS_SHOW_LOCATIONS_S); + show_locations.set(val); +} -#endif // INDICATOR_DATETIME_SETTINGS_LIVE_H -/* - * Copyright 2010 Canonical Ltd. - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 3, as published - * by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranties of - * MERCHANTABILITY, SATISFACTORY QUALITY, 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 . - * - * Authors: - * Ted Gould - * Charles Kerr - */ +void LiveSettings::update_show_seconds() +{ + show_seconds.set(g_settings_get_boolean(m_settings, SETTINGS_SHOW_SECONDS_S)); +} -#ifndef INDICATOR_DATETIME_SETTINGS_SHARED -#define INDICATOR_DATETIME_SETTINGS_SHARED +void LiveSettings::update_show_week_numbers() +{ + const auto val = g_settings_get_boolean(m_settings, SETTINGS_SHOW_WEEK_NUMBERS_S); + show_week_numbers.set(val); +} -typedef enum +void LiveSettings::update_show_year() { - TIME_FORMAT_MODE_LOCALE_DEFAULT, - TIME_FORMAT_MODE_12_HOUR, - TIME_FORMAT_MODE_24_HOUR, - TIME_FORMAT_MODE_CUSTOM + show_year.set(g_settings_get_boolean(m_settings, SETTINGS_SHOW_YEAR_S)); } -TimeFormatMode; +void LiveSettings::update_time_format_mode() +{ + time_format_mode.set((TimeFormatMode)g_settings_get_enum(m_settings, SETTINGS_TIME_FORMAT_S)); +} -#endif // INDICATOR_DATETIME_SETTINGS_SHARED -/* - * Copyright 2013 Canonical Ltd. - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 3, as published - * by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranties of - * MERCHANTABILITY, SATISFACTORY QUALITY, 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 . - * - * Authors: - * Charles Kerr - */ +void LiveSettings::update_timezone_name() +{ + auto val = g_settings_get_string(m_settings, SETTINGS_TIMEZONE_NAME_S); + timezone_name.set(val); + g_free(val); +} -#ifndef INDICATOR_DATETIME_SETTINGS_H -#define INDICATOR_DATETIME_SETTINGS_H +/*** +**** +***/ -#include +void LiveSettings::on_changed(GSettings* /*settings*/, + gchar* key, + gpointer gself) +{ + static_cast(gself)->update_key(key); +} -#include +void LiveSettings::update_key(const std::string& key) +{ + if (key == SETTINGS_SHOW_CLOCK_S) + update_show_clock(); + else if (key == SETTINGS_LOCATIONS_S) + update_locations(); + else if (key == SETTINGS_TIME_FORMAT_S) + update_time_format_mode(); + else if (key == SETTINGS_SHOW_SECONDS_S) + update_show_seconds(); + else if (key == SETTINGS_SHOW_DAY_S) + update_show_day(); + else if (key == SETTINGS_SHOW_DATE_S) + update_show_date(); + else if (key == SETTINGS_SHOW_YEAR_S) + update_show_year(); + else if (key == SETTINGS_CUSTOM_TIME_FORMAT_S) + update_custom_time_format(); + else if (key == SETTINGS_SHOW_CALENDAR_S) + update_show_calendar(); + else if (key == SETTINGS_SHOW_WEEK_NUMBERS_S) + update_show_week_numbers(); + else if (key == SETTINGS_SHOW_EVENTS_S) + update_show_events(); + else if (key == SETTINGS_SHOW_LOCATIONS_S) + update_show_locations(); + else if (key == SETTINGS_SHOW_DETECTED_S) + update_show_detected_locations(); + else if (key == SETTINGS_TIMEZONE_NAME_S) + update_timezone_name(); +} -namespace unity { -namespace indicator { -namespace datetime { +/*** +**** +***/ -/** - * \brief Interface that represents user-configurable settings. - * - * See the descriptions in data/com.canonical.indicator.datetime.gschema.xml - * For more information. - */ -class Settings -{ -public: - Settings() =default; - virtual ~Settings =default; - - core::Property time_format_mode; - core::Property show_clock; - core::Property show_day; - core::Property show_year; - core::Property show_seconds; - core::Property custom_time_format; - core::Property show_calendar; - core::Property show_events; - core::Property show_locations; - core::Property show_auto_detected_location; - core::Property> locations; - core::Property timezone_name; -}; - -#endif // INDICATOR_DATETIME_SETTINGS_H -#endif +} // namespace datetime +} // namespace indicator +} // namespace unity -- cgit v1.2.3