/* * 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 */ #include #include #include #include namespace unity { namespace indicator { namespace datetime { /*** **** ***/ class DesktopFormatter::Impl { public: Impl(DesktopFormatter * owner, const std::shared_ptr& clock): m_owner(owner), m_clock(clock), m_settings(g_settings_new(SETTINGS_INTERFACE)) { 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); rebuildHeaderFormat(); } ~Impl() { g_signal_handlers_disconnect_by_data(m_settings, this); g_object_unref(m_settings); } private: static void onSettingsChanged(GSettings * /*changed*/, const gchar * /*key*/, gpointer gself) { static_cast(gself)->rebuildHeaderFormat(); } void rebuildHeaderFormat() { auto fmt = getHeaderLabelFormatString(m_settings); m_owner->headerFormat.set(fmt); g_free(fmt); } private: gchar* getHeaderLabelFormatString(GSettings* s) const { char * fmt; const auto mode = g_settings_get_enum(s, SETTINGS_TIME_FORMAT_S); if (mode == TIME_FORMAT_MODE_CUSTOM) { fmt = g_settings_get_string(s, SETTINGS_CUSTOM_TIME_FORMAT_S); } 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 date_fmt = getDateFormat(show_day, show_date, show_year); const auto time_fmt = getFullTimeFormatString(s); fmt = joinDateAndTimeFormatStrings(date_fmt, time_fmt); } return fmt; } const gchar* T_(const gchar* in) const { return m_owner->T_(in); } const gchar* getDateFormat(bool show_day, bool show_date, bool show_year) const { const char * fmt; if (show_day && show_date && show_year) /* TRANSLATORS: a strftime(3) format showing the weekday, date, and year */ fmt = T_("%a %b %e %Y"); else if (show_day && show_date) /* TRANSLATORS: a strftime(3) format showing the weekday and date */ fmt = T_("%a %b %e"); else if (show_day && show_year) /* TRANSLATORS: a strftime(3) format showing the weekday and year. */ fmt = T_("%a %Y"); else if (show_day) /* TRANSLATORS: a strftime(3) format showing the weekday. */ fmt = T_("%a"); else if (show_date && show_year) /* TRANSLATORS: a strftime(3) format showing the date and year */ fmt = T_("%b %e %Y"); else if (show_date) /* TRANSLATORS: a strftime(3) format showing the date */ fmt = T_("%b %e"); else if (show_year) /* TRANSLATORS: a strftime(3) format showing the year */ fmt = T_("%Y"); else fmt = nullptr; 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 m_clock; GSettings * m_settings; }; /*** **** ***/ DesktopFormatter::DesktopFormatter(const std::shared_ptr& clock): Formatter(clock), p(new Impl(this, clock)) { } DesktopFormatter::~DesktopFormatter() = default; /*** **** ***/ } // namespace datetime } // namespace indicator } // namespace unity