aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCharles Kerr <charles.kerr@canonical.com>2014-01-16 16:42:36 -0600
committerCharles Kerr <charles.kerr@canonical.com>2014-01-16 16:42:36 -0600
commit78d0a231c12c159d1130ec080efab472f59851af (patch)
treedba583d436241c1ef9ea18014cb6d3284ff314d5 /src
parentbcff13b6bce18604472e5954eb5ab7af4bb43b0f (diff)
downloadayatana-indicator-datetime-78d0a231c12c159d1130ec080efab472f59851af.tar.gz
ayatana-indicator-datetime-78d0a231c12c159d1130ec080efab472f59851af.tar.bz2
ayatana-indicator-datetime-78d0a231c12c159d1130ec080efab472f59851af.zip
update DesktopFormatter class to use the "Settings" class instead of using GSettings directly.
Diffstat (limited to 'src')
-rw-r--r--src/formatter-desktop.cpp186
-rw-r--r--src/formatter.cpp49
2 files changed, 92 insertions, 143 deletions
diff --git a/src/formatter-desktop.cpp b/src/formatter-desktop.cpp
index 3f942f4..5efdf8b 100644
--- a/src/formatter-desktop.cpp
+++ b/src/formatter-desktop.cpp
@@ -18,10 +18,6 @@
*/
#include <datetime/formatter.h>
-#include <datetime/settings-shared.h>
-
-#include <glib.h>
-#include <gio/gio.h>
namespace unity {
namespace indicator {
@@ -31,80 +27,108 @@ namespace datetime {
****
***/
-class DesktopFormatter::Impl
+namespace
{
-public:
-Impl(DesktopFormatter * owner, const std::shared_ptr<Clock>& clock):
- m_owner(owner),
- m_clock(clock),
- m_settings(g_settings_new(SETTINGS_INTERFACE))
+std::string joinDateAndTimeFormatStrings(const char* date_string,
+ const char* time_string)
{
- const gchar * const keys[] = { "changed::" SETTINGS_SHOW_SECONDS_S,
- "changed::" SETTINGS_TIME_FORMAT_S,
- "changed::" SETTINGS_TIME_FORMAT_S,
- "changed::" SETTINGS_CUSTOM_TIME_FORMAT_S,
- "changed::" SETTINGS_SHOW_DAY_S,
- "changed::" SETTINGS_SHOW_DATE_S,
- "changed::" SETTINGS_SHOW_YEAR_S };
- for(const auto& key : keys)
- g_signal_connect(m_settings, key, G_CALLBACK(onSettingsChanged), this);
+ std::string str;
- rebuildHeaderFormat();
-}
+ if (date_string && time_string)
+ {
+ /* TRANSLATORS: This is a format string passed to strftime to
+ * combine the date and the time. The value of "%s\u2003%s"
+ * will result in a string like this in US English 12-hour time:
+ * 'Fri Jul 16 11:50 AM'. The space in between date and time is
+ * a Unicode en space (E28082 in UTF-8 hex). */
+ str = date_string;
+ str += "\u2003";
+ str += time_string;
+ }
+ else if (date_string)
+ {
+ str = date_string;
+ }
+ else // time_string
+ {
+ str = time_string;
+ }
-~Impl()
-{
- g_signal_handlers_disconnect_by_data(m_settings, this);
- g_object_unref(m_settings);
+ return str;
}
+} // unnamed namespace
-private:
+/***
+****
+***/
-static void onSettingsChanged(GSettings * /*changed*/,
- const gchar * /*key*/,
- gpointer gself)
+DesktopFormatter::DesktopFormatter(const std::shared_ptr<Clock>& clock_in,
+ const std::shared_ptr<Settings>& settings_in):
+ Formatter(clock_in),
+ m_settings(settings_in)
{
- static_cast<Impl*>(gself)->rebuildHeaderFormat();
+ m_settings->show_day.changed().connect([this](bool){rebuildHeaderFormat();});
+ m_settings->show_date.changed().connect([this](bool){rebuildHeaderFormat();});
+ m_settings->show_year.changed().connect([this](bool){rebuildHeaderFormat();});
+ m_settings->show_seconds.changed().connect([this](bool){rebuildHeaderFormat();});
+ m_settings->time_format_mode.changed().connect([this](TimeFormatMode){rebuildHeaderFormat();});
+ m_settings->custom_time_format.changed().connect([this](const std::string&){rebuildHeaderFormat();});
+
+ rebuildHeaderFormat();
}
-void rebuildHeaderFormat()
+void DesktopFormatter::rebuildHeaderFormat()
{
- auto fmt = getHeaderLabelFormatString(m_settings);
- m_owner->headerFormat.set(fmt);
- g_free(fmt);
+ headerFormat.set(getHeaderLabelFormatString());
}
-private:
-
-gchar* getHeaderLabelFormatString(GSettings* s) const
+std::string DesktopFormatter::getHeaderLabelFormatString() const
{
- char * fmt;
- const auto mode = g_settings_get_enum(s, SETTINGS_TIME_FORMAT_S);
+ std::string fmt;
+ const auto mode = m_settings->time_format_mode.get();
if (mode == TIME_FORMAT_MODE_CUSTOM)
{
- fmt = g_settings_get_string(s, SETTINGS_CUSTOM_TIME_FORMAT_S);
+ fmt = m_settings->custom_time_format.get();
}
else
{
- const auto show_day = g_settings_get_boolean(s, SETTINGS_SHOW_DAY_S);
- const auto show_date = g_settings_get_boolean(s, SETTINGS_SHOW_DATE_S);
- const auto show_year = show_date && g_settings_get_boolean(s, SETTINGS_SHOW_YEAR_S);
+ const auto show_day = m_settings->show_day.get();
+ const auto show_date = m_settings->show_date.get();
+ const auto show_year = show_date && m_settings->show_year.get();
const auto date_fmt = getDateFormat(show_day, show_date, show_year);
- const auto time_fmt = getFullTimeFormatString(s);
+ const auto time_fmt = getFullTimeFormatString();
fmt = joinDateAndTimeFormatStrings(date_fmt, time_fmt);
}
return fmt;
}
-const gchar* T_(const gchar* in) const
+const gchar* DesktopFormatter::getFullTimeFormatString() const
{
- return m_owner->T_(in);
+ const auto show_seconds = m_settings->show_seconds.get();
+
+ bool twelvehour;
+ switch (m_settings->time_format_mode.get())
+ {
+ case TIME_FORMAT_MODE_LOCALE_DEFAULT:
+ twelvehour = is_locale_12h();
+ break;
+
+ case TIME_FORMAT_MODE_24_HOUR:
+ twelvehour = false;
+ break;
+
+ default:
+ twelvehour = true;
+ break;
+ }
+
+ return getDefaultHeaderTimeFormat(twelvehour, show_seconds);
}
-const gchar* getDateFormat(bool show_day, bool show_date, bool show_year) const
+const gchar* DesktopFormatter::getDateFormat(bool show_day, bool show_date, bool show_year) const
{
const char * fmt;
@@ -135,74 +159,6 @@ const gchar* getDateFormat(bool show_day, bool show_date, bool show_year) const
return fmt;
}
-const gchar* getFullTimeFormatString(GSettings* settings) const
-{
- auto show_seconds = g_settings_get_boolean(settings, SETTINGS_SHOW_SECONDS_S);
-
- bool twelvehour;
- switch (g_settings_get_enum(settings, SETTINGS_TIME_FORMAT_S))
- {
- case TIME_FORMAT_MODE_LOCALE_DEFAULT:
- twelvehour = is_locale_12h();
- break;
-
- case TIME_FORMAT_MODE_24_HOUR:
- twelvehour = false;
- break;
-
- default:
- twelvehour = true;
- break;
- }
-
- return m_owner->getDefaultHeaderTimeFormat(twelvehour, show_seconds);
-}
-
-gchar* joinDateAndTimeFormatStrings(const char* date_string,
- const char* time_string) const
-{
- gchar * str;
-
- if (date_string && time_string)
- {
- /* TRANSLATORS: This is a format string passed to strftime to
- * combine the date and the time. The value of "%s\u2003%s"
- * will result in a string like this in US English 12-hour time:
- * 'Fri Jul 16 11:50 AM'. The space in between date and time is
- * a Unicode en space (E28082 in UTF-8 hex). */
- str = g_strdup_printf("%s\u2003%s", date_string, time_string);
- }
- else if (date_string)
- {
- str = g_strdup(date_string);
- }
- else // time_string
- {
- str = g_strdup(time_string);
- }
-
- return str;
-}
-
-private:
-
-DesktopFormatter * const m_owner;
-std::shared_ptr<Clock> m_clock;
-GSettings * m_settings;
-};
-
-/***
-****
-***/
-
-DesktopFormatter::DesktopFormatter(const std::shared_ptr<Clock>& clock):
- Formatter(clock),
- p(new Impl(this, clock))
-{
-}
-
-DesktopFormatter::~DesktopFormatter() = default;
-
/***
****
***/
diff --git a/src/formatter.cpp b/src/formatter.cpp
index 1f26cc7..88a64df 100644
--- a/src/formatter.cpp
+++ b/src/formatter.cpp
@@ -124,7 +124,7 @@ guint calculate_seconds_until_next_fifteen_minutes(GDateTime * now)
g_date_time_unref(next);
return seconds;
}
-} // anonymous namespace
+} // unnamed namespace
@@ -167,7 +167,7 @@ private:
{
clearTimer(m_header_timer);
- const std::string fmt = m_owner->headerFormat.get();
+ const auto fmt = m_owner->headerFormat.get();
const bool header_shows_seconds = (fmt.find("%s") != std::string::npos)
|| (fmt.find("%S") != std::string::npos)
|| (fmt.find("%T") != std::string::npos)
@@ -214,7 +214,7 @@ private:
}
private:
- Formatter * const m_owner;
+ Formatter* const m_owner;
guint m_header_timer = 0;
guint m_relative_timer = 0;
@@ -248,7 +248,7 @@ Formatter::is_locale_12h()
return true;
}
-const char *
+const char*
Formatter::T_(const char *msg)
{
/* General strategy here is to make sure LANGUAGE is empty (since that
@@ -264,17 +264,16 @@ Formatter::T_(const char *msg)
LC_MESSAGES directory, so we won't find any translation there.
*/
- char *message_locale = g_strdup(setlocale(LC_MESSAGES, nullptr));
- const char *time_locale = setlocale(LC_TIME, nullptr);
- char *language = g_strdup(g_getenv("LANGUAGE"));
- const char *rv;
+ auto message_locale = g_strdup(setlocale(LC_MESSAGES, nullptr));
+ const auto time_locale = setlocale(LC_TIME, nullptr);
+ auto language = g_strdup(g_getenv("LANGUAGE"));
if (language)
g_unsetenv("LANGUAGE");
setlocale(LC_MESSAGES, time_locale);
/* Get the LC_TIME version */
- rv = _(msg);
+ const auto rv = _(msg);
/* Put everything back the way it was */
setlocale(LC_MESSAGES, message_locale);
@@ -286,10 +285,10 @@ Formatter::T_(const char *msg)
return rv;
}
-const char *
+const char*
Formatter::getDefaultHeaderTimeFormat(bool twelvehour, bool show_seconds)
{
- const char * fmt;
+ const char* fmt;
if (twelvehour && show_seconds)
/* TRANSLATORS: a strftime(3) format for 12hr time w/seconds */
@@ -322,9 +321,9 @@ typedef enum
}
date_proximity_t;
-date_proximity_t getDateProximity(GDateTime * now, GDateTime * time)
+date_proximity_t getDateProximity(GDateTime* now, GDateTime* time)
{
- date_proximity_t prox = DATE_PROXIMITY_FAR;
+ auto prox = DATE_PROXIMITY_FAR;
gint now_year, now_month, now_day;
gint time_year, time_month, time_day;
@@ -337,10 +336,9 @@ date_proximity_t getDateProximity(GDateTime * now, GDateTime * time)
// does it happen tomorrow?
if (prox == DATE_PROXIMITY_FAR)
{
- GDateTime * tomorrow;
- gint tom_year, tom_month, tom_day;
+ auto tomorrow = g_date_time_add_days(now, 1);
- tomorrow = g_date_time_add_days(now, 1);
+ gint tom_year, tom_month, tom_day;
g_date_time_get_ymd(tomorrow, &tom_year, &tom_month, &tom_day);
if ((tom_year == time_year) && (tom_month == time_month) && (tom_day == time_day))
prox = DATE_PROXIMITY_TOMORROW;
@@ -351,14 +349,11 @@ date_proximity_t getDateProximity(GDateTime * now, GDateTime * time)
// does it happen this week?
if (prox == DATE_PROXIMITY_FAR)
{
- GDateTime * week;
- GDateTime * week_bound;
-
- week = g_date_time_add_days(now, 6);
- week_bound = g_date_time_new_local(g_date_time_get_year(week),
- g_date_time_get_month(week),
- g_date_time_get_day_of_month(week),
- 23, 59, 59.9);
+ auto week = g_date_time_add_days(now, 6);
+ auto week_bound = g_date_time_new_local(g_date_time_get_year(week),
+ g_date_time_get_month(week),
+ g_date_time_get_day_of_month(week),
+ 23, 59, 59.9);
if (g_date_time_compare(time, week_bound) <= 0)
prox = DATE_PROXIMITY_WEEK;
@@ -369,7 +364,7 @@ date_proximity_t getDateProximity(GDateTime * now, GDateTime * time)
return prox;
}
-} // anonymous namespace
+} // unnamed namespace
/**
* _ a time today should be shown as just the time (e.g. “3:55 PM”)
@@ -391,7 +386,7 @@ std::string
Formatter::getRelativeFormat(GDateTime* then, GDateTime* then_end) const
{
std::string ret;
- auto now = p->m_clock->localtime().get();
+ const auto now = p->m_clock->localtime().get();
if (then != nullptr)
{
@@ -448,7 +443,5 @@ Formatter::getRelativeFormat(GDateTime* then, GDateTime* then_end) const
***/
} // namespace datetime
-
} // namespace indicator
-
} // namespace unity