aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCharles Kerr <charles.kerr@canonical.com>2014-01-16 15:10:39 -0600
committerCharles Kerr <charles.kerr@canonical.com>2014-01-16 15:10:39 -0600
commitbcff13b6bce18604472e5954eb5ab7af4bb43b0f (patch)
tree3490b944b2f8be1e93312b643f21489d97ca84a9 /src
parentee64bb2698adfe27e55615a8856b0e2c78ad8469 (diff)
downloadayatana-indicator-datetime-bcff13b6bce18604472e5954eb5ab7af4bb43b0f.tar.gz
ayatana-indicator-datetime-bcff13b6bce18604472e5954eb5ab7af4bb43b0f.tar.bz2
ayatana-indicator-datetime-bcff13b6bce18604472e5954eb5ab7af4bb43b0f.zip
Implement Settings, a properties-cpp wrapper around GSettings
Diffstat (limited to 'src')
-rw-r--r--src/settings-live.cpp410
1 files changed, 187 insertions, 223 deletions
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<std::string>& value){
+ const int n = value.size();
+ gchar** strv = g_new0(gchar*, n+1);
+ for(int i=0; i<n; i++)
+ strv[i] = const_cast<char*>(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<LiveSettings*>(gself)->update_key(key);
+ auto strv = g_settings_get_strv(m_settings, SETTINGS_LOCATIONS_S);
+ std::vector<std::string> 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); i<n; i++)
- {
- g_string_printf (gstr, "changed::%s", header_settings[i]);
- g_signal_connect_swapped (p->settings, 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); i<n; i++)
- {
- g_string_printf (gstr, "changed::%s", header_settings[i]);
- g_signal_connect_swapped (p->settings, 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 <datetime/settings.h> // parent class
-
-#include <glib.h> // 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 <http://www.gnu.org/licenses/>.
- *
- * Authors:
- * Ted Gould <ted@canonical.com>
- * Charles Kerr <charles.kerr@canonical.com>
- */
+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 <http://www.gnu.org/licenses/>.
- *
- * Authors:
- * Charles Kerr <charles.kerr@canonical.com>
- */
+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 <datetime/settings-shared.h>
+void LiveSettings::on_changed(GSettings* /*settings*/,
+ gchar* key,
+ gpointer gself)
+{
+ static_cast<LiveSettings*>(gself)->update_key(key);
+}
-#include <core/property.h>
+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<TimeFormatMode> time_format_mode;
- core::Property<bool> show_clock;
- core::Property<bool> show_day;
- core::Property<bool> show_year;
- core::Property<bool> show_seconds;
- core::Property<std::string> custom_time_format;
- core::Property<bool> show_calendar;
- core::Property<bool> show_events;
- core::Property<bool> show_locations;
- core::Property<bool> show_auto_detected_location;
- core::Property<std::vector<std::string>> locations;
- core::Property<std::string> timezone_name;
-};
-
-#endif // INDICATOR_DATETIME_SETTINGS_H
-#endif
+} // namespace datetime
+} // namespace indicator
+} // namespace unity