/* * 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 // T_() namespace ayatana { namespace indicator { namespace datetime { /*** **** ***/ namespace { std::string joinDateAndTimeFormatStrings(const char* date_string, const char* time_string) { std::string str; if (date_string && time_string) { str = date_string; str += "\u2003"; str += time_string; } else if (date_string) { str = date_string; } else // time_string { str = time_string; } return str; } } // unnamed namespace /*** **** ***/ DesktopFormatter::DesktopFormatter(const std::shared_ptr& clock_in, const std::shared_ptr& settings_in): Formatter(clock_in), m_settings(settings_in) { 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 DesktopFormatter::rebuildHeaderFormat() { header_format.set(getHeaderLabelFormatString()); } std::string DesktopFormatter::getHeaderLabelFormatString() const { std::string fmt; const auto mode = m_settings->time_format_mode.get(); if (mode == TIME_FORMAT_MODE_CUSTOM) { fmt = m_settings->custom_time_format.get(); } else { 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(); fmt = joinDateAndTimeFormatStrings(date_fmt, time_fmt); } return fmt; } const gchar* DesktopFormatter::getFullTimeFormatString() const { 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 default_header_time_format(twelvehour, show_seconds); } const gchar* DesktopFormatter::getDateFormat(bool show_day, bool show_date, bool show_year) const { const char * fmt; if (show_day && show_date && show_year) /* Translators, please edit/rearrange these strftime(3) tokens to suit your locale! That will fix bug #1001595 for your locale and make the date/time in the upper-right corner of your screen look beautiful :) This format string shows the abbreviated weekday, day, abbreviated month, and year. en_US example: "%a %b %e %Y" --> "Sat Oct 31 2020" en_GB example: "%a %e %b %Y" --> "Sat 31 Oct 2020" zh_CN example(?): "%Y年%m月%d日 周%a" --> "2020年10月31日 周六" */ fmt = T_("%a %b %e %Y"); else if (show_day && show_date) /* Translators, please edit/rearrange these strftime(3) tokens to suit your locale! That will fix bug #1001595 for your locale and make the date/time in the upper-right corner of your screen look beautiful :) This format string shows the abbreviated weekday, day, and abbreviated month. en_US example: "%a %b %e" --> "Sat Oct 31" en_GB example: "%a %e %b" --> "Sat 31 Oct" zh_CN example(?): "%m月%d日 周%a" --> "03月27日 周六" */ fmt = T_("%a %b %e"); else if (show_day) /* Translators, please edit/rearrange these strftime(3) tokens to suit your locale! That will fix bug #1001595 for your locale and make the date/time in the upper-right corner of your screen look beautiful :) This format string shows the abbreviated weekday. zh_CN example(?): "周%a" --> "周六" */ fmt = T_("%a"); else if (show_date && show_year) /* Translators, please edit/rearrange these strftime(3) tokens to suit your locale! That will fix bug #1001595 for your locale and make the date/time in the upper-right corner of your screen look beautiful :) This format string shows the day, abbreviated month, and year. en_US example: "%b %e %Y" --> "Oct 31 2020" en_GB example: "%e %b %Y" --> "31 Oct 2020" zh_CN example(?): "%Y年%m月%d日" --> "2020年10月31日" */ fmt = T_("%b %e %Y"); else if (show_date) /* Translators, please edit/rearrange these strftime(3) tokens to suit your locale! That will fix bug #1001595 for your locale and make the date/time in the upper-right corner of your screen look beautiful :) This format string shows the abbreviated month and day. en_US example: "%b %e" --> "Mar 27" en_GB example: "%e %b" --> "27 Mar" zh_CN example(?): "%m月%d日" --> "03月27日" */ fmt = T_("%b %e"); else if (show_year) /* This strftime(3) format string shows the year. */ fmt = T_("%Y"); else fmt = nullptr; return fmt; } /*** **** ***/ } // namespace datetime } // namespace indicator } // namespace ayatana