From 191eb5af90ac193dd1c09f908ca6835bb26fa422 Mon Sep 17 00:00:00 2001 From: Radoslaw Czerski Date: Tue, 13 Sep 2016 15:48:32 +0200 Subject: [PATCH] Worldclock Map View and timezone details added. MVP model is not implemented yet and will be added in separate commit. Change-Id: Iad0aa1d8950856f9cfe6810811c4d941c3ddb8cb Signed-off-by: Radoslaw Czerski --- clock/inc/Internal/WorldClockDefs.h | 57 +++ clock/inc/Model/Location.h | 16 +- clock/inc/Model/WordlClock.h | 17 - clock/inc/Model/WorldClock.h | 44 ++ clock/inc/Utils/Time.h | 5 +- clock/inc/View/WorldClockView.h | 45 +- clock/project_def.prop | 16 +- clock/res/edje/WorldClock.edc | 467 +++++++++++++++++++++ clock/res/edje/color_classes.edc | 70 +++ clock/res/edje/images/arrow_bg.png | Bin 0 -> 355 bytes .../images/clock_icon_world_clock_arrow_left.png | Bin 0 -> 3195 bytes .../images/clock_icon_world_clock_arrow_right.png | Bin 0 -> 3226 bytes clock/res/edje/images/clock_world_gmt_area.#.png | Bin 0 -> 1053 bytes clock/res/edje/images/clock_world_location_dot.png | Bin 0 -> 15412 bytes .../res/edje/images/clock_world_location_ring.png | Bin 0 -> 15463 bytes clock/res/edje/images/clock_world_map_01.png | Bin 0 -> 36740 bytes clock/res/po/en_US.po | 15 + clock/src/Model/WorldClock.cpp | 190 +++++++++ clock/src/Utils/Time.cpp | 21 +- clock/src/View/WorldClockView.cpp | 295 ++++++++++++- 20 files changed, 1209 insertions(+), 49 deletions(-) create mode 100644 clock/inc/Internal/WorldClockDefs.h delete mode 100644 clock/inc/Model/WordlClock.h create mode 100644 clock/inc/Model/WorldClock.h create mode 100644 clock/res/edje/WorldClock.edc create mode 100644 clock/res/edje/color_classes.edc create mode 100644 clock/res/edje/images/arrow_bg.png create mode 100644 clock/res/edje/images/clock_icon_world_clock_arrow_left.png create mode 100644 clock/res/edje/images/clock_icon_world_clock_arrow_right.png create mode 100644 clock/res/edje/images/clock_world_gmt_area.#.png create mode 100644 clock/res/edje/images/clock_world_location_dot.png create mode 100644 clock/res/edje/images/clock_world_location_ring.png create mode 100644 clock/res/edje/images/clock_world_map_01.png create mode 100644 clock/res/po/en_US.po create mode 100644 clock/src/Model/WorldClock.cpp diff --git a/clock/inc/Internal/WorldClockDefs.h b/clock/inc/Internal/WorldClockDefs.h new file mode 100644 index 0000000..f2c2995 --- /dev/null +++ b/clock/inc/Internal/WorldClockDefs.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef WORLDCLOCKDEFS_H_ +#define WORLDCLOCKDEFS_H_ + + +/* Messages */ +#define MESSAGE_ID_SET_TIMEZONE 1 +#define MESSAGE_ID_SET_LOCATION_DOT_POSITION 2 + +/* Part visibility*/ +#define PART_VISIBLE 1 +#define PART_NOT_VISIBLE 0 + +#define LOCATION_DOT_SIZE 7 +#define LOCATION_RING_SIZE 9 + +#define STR_HELPER(x) #x +#define STR(x) STR_HELPER(x) + +#define LOCATION_DOT_NAME(x) "dot."#x + +#define QUOTE(hex) #hex +#define TEST(name) QUOTE(name ## foo) + +#define MAX_STYLE_LEN 512 +#define MAX_CITIES_LEN 512 + +/* Parts names */ + +#define TIMEZONE_DETAILS_FIRST_LINE_PART "main.timezone.details:timezone.details.first.line.content" +#define TIMEZONE_DETAILS_SECOND_LINE_PART "main.timezone.details:timezone.details.second.line.cities" + +/* Styles names*/ + +#define TIMEZONE_DETAILS_FIRST_LINE_TIME_STYLE(x) "" x "" +#define TIMEZONE_DETAILS_FIRST_LINE_AMPM_STYLE(x) "" x "" +#define TIMEZONE_DETAILS_FIRST_LINE_RELATIVE_TO_LOCAL_STYLE(x) "" x "" + +#define TIMEZONE_DETAILS_SECOND_LINE_CITIES(x) "" x "" + + +#endif /* WORLDCLOCKDEFS_H_ */ diff --git a/clock/inc/Model/Location.h b/clock/inc/Model/Location.h index e8eefa8..420723c 100644 --- a/clock/inc/Model/Location.h +++ b/clock/inc/Model/Location.h @@ -4,12 +4,16 @@ #include namespace model { - struct Location { - std::string Name; - std::string Country; - std::string Timezone; - std::string TzPath; - }; +struct Location { + std::string name; + std::string country; + + int gmt_offset_; + int x; + int y; + + bool summertime; +}; } /* model */ #endif diff --git a/clock/inc/Model/WordlClock.h b/clock/inc/Model/WordlClock.h deleted file mode 100644 index 7307218..0000000 --- a/clock/inc/Model/WordlClock.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef _CLOCK_WORLDCLOCK_H_ -#define _CLOCK_WORLDCLOCK_H_ - -#include - -namespace model { - class WorldClock { - public: - const std::vector Locations; - const std::vector UserLocations; - - void AddUserLocation(Location loc); - void RemoveUserLocation(Location loc); - }; -} /* model */ - -#endif diff --git a/clock/inc/Model/WorldClock.h b/clock/inc/Model/WorldClock.h new file mode 100644 index 0000000..d560a42 --- /dev/null +++ b/clock/inc/Model/WorldClock.h @@ -0,0 +1,44 @@ +#ifndef _CLOCK_WORLDCLOCK_H_ +#define _CLOCK_WORLDCLOCK_H_ + +#include + +#include "Model/Location.h" + +namespace model { + + struct Timezone{ + int x_coord; + int zone_width; + int gmt_offset; /*minutes*/ + std::vector places; + }; + + class WorldClock { + public: + WorldClock(); + std::vector UserLocations; + + void AddUserLocation(model::Location l); + void RemoveUserLocation(model::Location l); + + void InitTimeZones(); + void InitLocations(); + int GetCurrentTimezoneNo(); + Timezone *GetCurrentTimezone(); + const char *GetCurrentTzString(); + char *OffsetToString(int offset); + void SetCurrentTimezone(int tz); + int GetTimezonesCount(); + int GetLocationsCount(); + const Timezone *GetTimezoneByOffset(int offset); + private: + int current_tz_; + model::Location user_location_; + static std::vector locations_; + static std::vector time_zones_; + + }; +} /* model */ + +#endif diff --git a/clock/inc/Utils/Time.h b/clock/inc/Utils/Time.h index a084658..6172927 100644 --- a/clock/inc/Utils/Time.h +++ b/clock/inc/Utils/Time.h @@ -20,7 +20,10 @@ namespace utils { (a.Min == Min) && (a.Sec == Sec) && (a.Msec == Msec); } std::string Format(enum Format format) const; std::string Meridiem() const; - std::string getFormattedTime(const char *icu_format) const; + std::string GetMeridiemByOffset(int timezone_offset) const; + std::string GetFormattedTime(const char *icu_format) const; + std::string GetFormattedTimeByTimezoneOffset(const char *icu_format, int timezone_offset) const; + int GetLocalTimezoneOffset(void) const; }; } /* utils */ diff --git a/clock/inc/View/WorldClockView.h b/clock/inc/View/WorldClockView.h index f482af6..58af59e 100644 --- a/clock/inc/View/WorldClockView.h +++ b/clock/inc/View/WorldClockView.h @@ -14,21 +14,50 @@ * limitations under the License. */ -#ifndef WORLDCLOCKVIEW_H_ -#define WORLDCLOCKVIEW_H_ +#ifndef _CLOCK_VIEW_WORLDCLOCK_H_ +#define _CLOCK_VIEW_WORLDCLOCK_H_ +#include "Model/WorldClock.h" #include "View/PageView.h" #include "View/View.h" namespace view { - class WorldClockView : public ui::IView { + class WorldClockView: public ui::IView { public: - WorldClockView(); - Evas_Object *GetEvasObject(){return world_clock_;}; + WorldClockView(); - private: - Evas_Object *world_clock_; + Evas_Object *GetEvasObject(){return world_clock_;}; + + void UpdateTimezoneDetails(model::Timezone *timezone); + + private: + //TODO use function + static void ChangeTimezoneCb(void *data, Evas_Object *obj, + const char *emission, const char *source); + + void UpdateTimezoneLocationsDots(); + void UpdateGmtOffset(); + void UpdateTimezoneArea(); + void CreateTimezoneDetails(); + + Evas_Object *CreateTimezoneTime(); + Evas_Object *CreateTimezoneXMeridiem(); + Evas_Object *CreateTimezoneRelativeToLocalObject(); + + Evas_Object *CreatePadding(int width); + void CreateTimezoneCitiesList(); + + void UpdateTimezoneTime(int timezone_offset); + void UpdateTimezoneXMeridiem(int timezone_offset); + void UpdateTimezoneRelativeToLocal(int timezone_offset); + + void UpdateTimezoneCitiesList(model::Timezone *timezone); + + model::WorldClock *world_clock_data_; + Evas_Object *world_clock_; + Evas_Object *timezone_details_; + Evas_Object *timezone_cities_; }; } -#endif /* WORLDCLOCKVIEW_H_ */ +#endif /* _CLOCK_VIEW_WORLDCLOCK_H_ */ diff --git a/clock/project_def.prop b/clock/project_def.prop index 1599857..329162c 100644 --- a/clock/project_def.prop +++ b/clock/project_def.prop @@ -16,7 +16,7 @@ USER_SRCS_ABS = USER_EDCS = # PO Sources -USER_POS = +USER_POS = res/po/*.po # User Defines USER_DEFS = @@ -50,22 +50,22 @@ USER_LIB_DIRS = $(workspace_loc)/common/${BUILD_CONFIG} USER_LIB_DIRS_ABS = # EDC Resource Path -USER_EDCS_IMAGE_DIRS = edje/images +USER_EDCS_IMAGE_DIRS = res/edje/images USER_EDCS_IMAGE_DIRS_ABS = -USER_EDCS_SOUND_DIRS = edje/sounds +USER_EDCS_SOUND_DIRS = res/edje/sounds USER_EDCS_SOUND_DIRS_ABS = -USER_EDCS_FONT_DIRS = edje/fonts +USER_EDCS_FONT_DIRS = res/edje/fonts USER_EDCS_FONT_DIRS_ABS = # EDC Flags USER_EXT_EDC_KEYS = EDC0 -USER_EXT_EDC0_EDCS = res/edje/clock.edc res/edje/alarm.edc res/edje/edit_alarm.edc res/edje/StopWatch.edc res/edje/Counter.edc -USER_EXT_EDC0_EDCS_IMAGE_DIRS = edje/images +USER_EXT_EDC0_EDCS = res/edje/*.edc +USER_EXT_EDC0_EDCS_IMAGE_DIRS = res/edje/images USER_EXT_EDC0_EDCS_IMAGE_DIRS_ABS = -USER_EXT_EDC0_EDCS_SOUND_DIRS = edje/sounds +USER_EXT_EDC0_EDCS_SOUND_DIRS = res/edje/sounds USER_EXT_EDC0_EDCS_SOUND_DIRS_ABS = -USER_EXT_EDC0_EDCS_FONT_DIRS = edje/fonts +USER_EXT_EDC0_EDCS_FONT_DIRS = res/edje/fonts USER_EXT_EDC0_EDCS_FONT_DIRS_ABS = # Resource Filter diff --git a/clock/res/edje/WorldClock.edc b/clock/res/edje/WorldClock.edc new file mode 100644 index 0000000..97e08fc --- /dev/null +++ b/clock/res/edje/WorldClock.edc @@ -0,0 +1,467 @@ +/* +* Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +#include "../../inc/Internal/WorldClockDefs.h" + +#define DOT_SWALLOW( partName, partName2, offset_x, offset_y) \ + image { partName; scale;\ + mouse_events: 0; \ + desc { "default"; \ + min: 10 10; \ + max: 10 10; \ + color_class: "B043P"; \ + rel1 { \ + to: "map"; \ + offset: offset_x offset_y; \ + } \ + rel2 { \ + relative: 0.0 0.0; \ + to: "map"; \ + } \ + align: 0.0 0.0; \ + image.normal: "clock_world_location_dot.png"; \ + } \ + } \ + image { partName2; scale;\ + mouse_events: 0; \ + desc { "default"; \ + min: 10 10; \ + max: 10 10; \ + rel1 { \ + to: "map"; \ + offset: offset_x offset_y; \ + } \ + rel2 { \ + relative: 0.0 0.0; \ + to: "map"; \ + } \ + align: 0.0 0.0; \ + vis; \ + image.normal: "clock_world_location_ring.png"; \ + } \ + } + +collections { + + base_scale: 2.6; + + #include "color_classes.edc" + + images { + image: "clock_world_gmt_area.#.png" COMP; + image: "arrow_bg.png" COMP; + image: "clock_world_map_01.png" COMP; + image: "clock_icon_world_clock_arrow_left.png" COMP; + image: "clock_icon_world_clock_arrow_right.png" COMP; + image: "clock_world_location_dot.png" COMP; + image: "clock_world_location_ring.png" COMP; + } + + group { name: "main"; + parts { + spacer { "main.top"; scale; + desc { "default"; + min: 720 17; + max: 720 17; + align: 0.5 0.0; + } + } + group { "main.world.map"; scale; + source:"world.map"; + desc { "default"; + min: 720 406; + max: 720 406; + rel1 { + relative: 0.0 1.0; + to: "main.top"; + } + rel2.relative: 1.0 1.0; + align: 0.5 0.0; + } + } + group { "main.timezone.details"; scale; + source: "timezone.details"; + desc { "default"; + max: 720 256; + max: 720 256; + rel1 { + relative: 0.0 1.0; + to: "main.world.map"; + } + rel2.relative: 1.0 1.0; + align: 0.5 0.0; + } + } + } + } + + group { name: "world.map"; + styles { + style { + name: "timezone_offset_style"; + base: "font=Tizen:style=Regular color=#fafafa font_size=40"; + } + } + parts { + image { "map"; scale; + desc { "default"; + min: 720 406; + max: 720 406; + fixed: 1 1; + image.normal: "clock_world_map_01.png"; + } + } + + image { "timezone.area"; scale; + desc { "default"; + min: 15 320; + max: 15 320; + align: 0.0 0.5; + rel1 { + relative: -0.2 67/406; + to: "map"; + } + image.normal: "clock_world_gmt_area.#.png"; + color_class: "AO009"; + } + } + + textblock { "timezone_offset"; scale; + desc { "default"; + rel1 { + offset: -30 -60; + to: "timezone.area"; + } + rel2 { + relative: 1.0 0.0; + offset: +30 -5; + to: "timezone.area"; + } + text { + text: "+ 0"; + style: "timezone_offset_style"; + min: 1 1; + max: 1 1; + ellipsis: -1; + } + } + } + DOT_SWALLOW("dot.0","ring.0", -1, -1) + DOT_SWALLOW("dot.1", "ring.1", -1, -1) + DOT_SWALLOW("dot.2", "ring.2", -1, -1) + DOT_SWALLOW("dot.3", "ring.3", -1, -1) + DOT_SWALLOW("dot.4", "ring.4", -1, -1) + DOT_SWALLOW("dot.5", "ring.5", -1, -1) + DOT_SWALLOW("dot.6", "ring.6", -1, -1) + DOT_SWALLOW("dot.7", "ring.7", -1, -1) + + spacer { "arrow.spacer.top"; scale; + desc { "default"; + min: 720 196; + max: 720 196; + align: 0.5 0.0; + rel1.to: "map"; + } + } + + spacer { "arrow.spacer.bottom"; scale; + desc { "default"; + min: 720 130; + max: 720 130; + align: 0.5 1.0; + rel1.to: "map"; + } + } + + image { "arrow.left.bg"; scale; + desc { "default"; + max: 56 80; + hid; + color_class: "B043"; + rel1.to: "arrow.left"; + rel2.to: "arrow.left"; + image { + normal: "arrow_bg.png"; + border: 10 10 10 10; + } + } + desc { "on.click.start"; + inherit: "default"; + vis; + max: (56 * 0.7) (80 * 0.7); + } + desc { "on.click.end"; + inherit: "default"; + vis; + max: 56 80; + } + } + + image { "arrow.left"; scale; + desc { "default"; + max: 56 80; + rel1 { + relative: 0.0 1.0; + to: "arrow.spacer.top"; + offset: 10 0; + } + align: 0.0 0.0; + image.normal: "clock_icon_world_clock_arrow_left.png"; + color_class: "AO010"; + } + } + + image { "arrow.right.bg"; scale; + desc { "default"; + min: 56 80; + max: 56 80; + hid; + color_class: "B043"; + rel1.to: "arrow.right"; + rel2.to: "arrow.right"; + image { + normal: "arrow_bg.png"; + border: 10 10 10 10; + } + } + desc { "on.click.start"; + inherit: "default"; + vis; + min: (56 * 0.7) (80 * 0.7); + max: (56 * 0.7) (80 * 0.7); + } + desc { "on.click.end"; + inherit: "default"; + vis; + min: 56 80; + max: 56 80; + } + } + + image { "arrow.right"; scale; + desc { "default"; + max: 56 80; + rel1 { + relative: 0.0 1.0; + to_y: "arrow.spacer.top"; + } + rel2 { + relative: 1.0 0.0; + to: "arrow.spacer.bottom"; + offset: -10 0; + } + align: 1.0 1.0; + image.normal: "clock_icon_world_clock_arrow_right.png"; + color_class: "AO010"; + } + } + } + + script { + + public set_dot_and_ring_custom_state (dot_nr, Float:x, Float:y, visibility) + { + new dot_id[6], ring_id[7]; + new dot_part_id, ring_part_id; + + snprintf(dot_id, sizeof(dot_id), "dot.%d", dot_nr); + snprintf(ring_id, sizeof(ring_id), "ring.%d", dot_nr); + + dot_part_id = get_part_id(dot_id); + ring_part_id = get_part_id(ring_id); + + new Float:dot_rel1_x; + new Float:dot_rel1_y; + new Float:ring_rel1_x; + new Float:ring_rel1_y; + + dot_rel1_x = (x - (LOCATION_DOT_SIZE / 2)) / 720; + dot_rel1_y = (y - (LOCATION_DOT_SIZE / 2)) / 406; + + custom_state(dot_part_id, "default", 0.0); + set_state_val(dot_part_id, STATE_REL1, dot_rel1_x, dot_rel1_y); + set_state_val(dot_part_id, STATE_VISIBLE, visibility); + set_state(dot_part_id, "custom", 0.0); + + ring_rel1_x = (x - (LOCATION_RING_SIZE / 2)) / 720; + ring_rel1_y = (y - (LOCATION_RING_SIZE / 2)) / 406; + + custom_state(ring_part_id, "default", 0.0); + set_state_val(ring_part_id, STATE_REL1, ring_rel1_x, ring_rel1_y); + set_state_val(ring_part_id, STATE_VISIBLE, visibility); + set_state(ring_part_id, "custom", 0.0); + } + + public message (Msg_Type:type, id, ...) + { + if ((type == MSG_INT_SET) && (id == MESSAGE_ID_SET_TIMEZONE)) { + new timezone_x, timezone_width; + new Float:rel, Float:rel1_x; + + timezone_x = getarg(2); + timezone_width = getarg(3); + + rel1_x = timezone_x + (timezone_width - 15) / 2; + rel = rel1_x / 720; + + custom_state(PART:"timezone.area", "default", 0.0); + set_state_val(PART:"timezone.area", STATE_REL1, rel, 67/406); + set_state(PART:"timezone.area", "custom", 0.0); + } + else if ((type == MSG_INT_SET) && (id == MESSAGE_ID_SET_LOCATION_DOT_POSITION)) { + new Float:x = getarg(2); + new Float:y = getarg(3); + new visibility = getarg(4); + new dot_nr = getarg(5); + + set_dot_and_ring_custom_state(dot_nr, x, y, visibility); + } + } + } + programs { + + //Programs for left arrow click + program { + name: "arrow.left.mouse.down"; + signal: "mouse,down,*"; + source: "arrow.left"; + action: STATE_SET "on.click.start"; + target: "arrow.left.bg"; + sequence { + action: STATE_SET "on.click.end"; + target: "arrow.left.bg"; + transition: LINEAR 0.05; + } + } + + program { + name: "arrow.left.mouse.up"; + signal: "mouse,up,*"; + source: "arrow.left"; + action: SIGNAL_EMIT "timezone,go,left" "arrow.left"; + sequence { + action: STATE_SET "on.click.start"; + target: "arrow.left.bg"; + transition: LINEAR 0.05; + + action: STATE_SET "default"; + target: "arrow.left.bg"; + } + } + + //Programs for right arrow click + program { + name: "arrow.right.mouse.down"; + signal: "mouse,down,*"; + source: "arrow.right"; + action: STATE_SET "on.click.start"; + target: "arrow.right.bg"; + sequence { + action: STATE_SET "on.click.end"; + target: "arrow.right.bg"; + transition: LINEAR 0.05; + } + } + program { + name: "arrow.right.mouse.up"; + signal: "mouse,up,*"; + source: "arrow.right"; + action: SIGNAL_EMIT "timezone,go,right" "arrow.right"; + sequence { + action: STATE_SET "on.click.start"; + target: "arrow.right.bg"; + transition: LINEAR 0.05; + + action: STATE_SET "default"; + target: "arrow.right.bg"; + } + } + } + } + +group { "timezone.details"; + + styles { + style { + name: "time_style"; + base: "font=Tizen:style=Thin color=#fafafa font_size=70 align=right ellipsis=-1.0"; + } + style { + name: "ampm_style"; + base: "font=Tizen:style=Regular color=#fafafa font_size=36"; + } + style { + name: "relative_to_local_style"; + base: "font=Tizen:style=Regular color=#fafafa font_size=36"; + } + style { + name: "timezone_cities_style"; + base: "font=Tizen:style=Regular color=#fafafa font_size=36 wrap=word ellipsis=1.0"; + } + } + + parts { + rect { "timezone.details.container"; scale; + desc { "default"; + color: 0 0 0 0; + } + } + rect { "timezone.details.first.line"; scale; + desc { "default"; + align: 0.5 0.0; + min: 0 94; + max: 720 94; + color: 0 0 0 0; + rel1 { + offset: 0 50; + to: "timezone.details.container"; + } + rel2.to_x: "timezone.details.container"; + } + } + + swallow { "timezone.details.first.line.content"; scale; + desc { "default"; + align: 0.5 1.0; + rel1.to: "timezone.details.first.line"; + rel2.to: "timezone.details.first.line"; + } + } + + rect { "timezone.details.second.line"; scale; + desc { "default"; + align: 0.5 0.0; + min: 0 51; + max: -1 51; + color: 0 0 0 0; + rel1 { + relative: 0.0 1.0; + to_x: "timezone.details.container"; + to_y: "timezone.details.first.line.content"; + } + rel2.to_x: "timezone.details.container"; + } + } + + swallow { "timezone.details.second.line.cities"; scale; + desc { "default"; + rel1.to: "timezone.details.second.line"; + rel2.to: "timezone.details.second.line"; + } + } + } + } +} \ No newline at end of file diff --git a/clock/res/edje/color_classes.edc b/clock/res/edje/color_classes.edc new file mode 100644 index 0000000..a5fbf64 --- /dev/null +++ b/clock/res/edje/color_classes.edc @@ -0,0 +1,70 @@ +/* +* Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +//TODO below valuse are HSBA schem, but need to be converted to RGBA +color_classes { + color_class { + name: "AO009"; + color: 75 75 75 77; + } + color_class { + name: "AO010"; + color: 200 200 200 204; + } + color_class { + name: "AO011"; + color: 200 200 200 204; + } + color_class { + name: "AO041"; + color: 0 0 0 255; + } + color_class { + name: "AO042"; + color: 128 128 128 255; + } + color_class { + name: "AO043"; + color: 0 0 0 255; + } + color_class { + name: "AO044"; + color: 128 128 128 255; + } + color_class { + name: "B043"; + color: 0 0 0 77; + } + color_class { + name: "B043P"; + color: 0 0 0 140; + } + + // For Fonts + + color_class { + name: "ATO017"; + color: 250 250 250 255; + } + color_class { + name: "ATO018"; + color: 250 250 250 255; + } + color_class { + name: "ATO040"; + color: 0 0 0 255; + } +} diff --git a/clock/res/edje/images/arrow_bg.png b/clock/res/edje/images/arrow_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..fb622309845f783c2d1ed7d87ea6973f47d0582d GIT binary patch literal 355 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 literal 0 HcmV?d00001 diff --git a/clock/res/edje/images/clock_icon_world_clock_arrow_right.png b/clock/res/edje/images/clock_icon_world_clock_arrow_right.png new file mode 100644 index 0000000000000000000000000000000000000000..7be0dd3d6a83a00f24e7c6a214ab7cd489544e09 GIT binary patch literal 3226 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 E09Wo?cK`qY literal 0 HcmV?d00001 diff --git a/clock/res/edje/images/clock_world_location_dot.png b/clock/res/edje/images/clock_world_location_dot.png new file mode 100644 index 0000000000000000000000000000000000000000..3af7386a0dac783dd91c340495854d608945cc85 GIT binary patch literal 15412 zcmeI3O^n+_6vqeA0^O=y5CZjNrBH#WV>^lC*iBNU`RJ}h%4)l4cSR*Su_qg=i5+b3 zCcENLl>_416GDg+hzoGzfRGA8fH)M8;84K`FpiVh`;rWM=mCj|l#e%W z-hcdl^XA1DzqWeu!ilAmO9-J8E6cSt`u$+|e&_-E`T5$$_w?&ne|gJC==dYy`#$u> zn~x)Owqvhv2Aj=i4b$zVvE{Z%df4mJ*$5TS4g1)vpNd2#IyK^(p4|^@ z*AYTp+;Vqh-4!IsTX(r6>(?UsBStv>>S2WQX;7b0hs=jl`MFUC>|O z>l0~>`0kEp5<30Vyi4$d`YugrjOY+T^LM*CA zs8&biDLl1dJC-}}pDs!;Brcp-jnr^J%CxZaw4_B@TURnhRyJh)898IfazZ4U2{f9n zWw-a{Xyjx=%_lVyGoc1Oh!zg;p;VG{59&0V#){(y*fGgUtxR)I+qPw>IlYy^xFEKy zY*x&+a~Tom3YMtnWvkG(teh(2QIZG4XQXScxf2!=m5w@y<(gD}S{_D0)3bR?Ges>& zG*MAVUTn3nDPpsoYZVGgL6_CZLJ6_ig@|YG60704z0s-fW6vkyVJf92r)k>>`b)C@#r`!MQLUX&fg6C zc6VnqU(3k!B`M+OI5g>opd92XTr;+A-H!lO}o!%gq?rRmN7%;BH5 z)qD9PPUv2$0xiA>0KzsoE;b+F<+uP4w#jj^`2a7+1%R+kj*HC)csVWrgl%$MY(But zaRDG~ljCCZ0bY&^0AZUP7n=|8a$Eoi+vK>|e1MnZ0zlX%$HnFYyc`z*!ZtZBHXq>S zxBw8g$#Jpy058V{fUr%Di_HgkIW7Q%ZE{>}KETUy0U&IX<6`pxUXBX@VVfKmn-B1E zTmT5$HaRXfAK>M<01&pxak2RTFUJLduuYDO%?Efn zE&zmWGI1@%kIxc^J~KO@565c1own(NwSu|4)G!V)?Z^n-xq^`K zIzo@RH(varLFYDBYL)fjkHI&}!`B3K|EG6;KK^LgxjZ~}=9kY-|McBE_Q@khwZCp% zKl1K}H-5PMk@n{k7jAy}*4yO$qqo29e*N+be_Xls-dAVQ-Quga2PbdRM}HAosb8#p JaQ@2me*kjiug(Af literal 0 HcmV?d00001 diff --git a/clock/res/edje/images/clock_world_location_ring.png b/clock/res/edje/images/clock_world_location_ring.png new file mode 100644 index 0000000000000000000000000000000000000000..7ed221cf4aac063771bd93378fb22904d195d4a8 GIT binary patch literal 15463 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 fH<-dnT`708X5PvAQEfPtf?Z`+95FL}- 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 WorldClock::locations_ = { + { "Midway Atoll", "USA", -11 * 60, 43, 218 }, + { "Pago Pago", "American Samoa", -11 * 60, 54, 230 }, + { "Honolulu", "USA", -10 * 60, 57, 223 }, + { "Anchorage", "USA", -9 * 60, 74, 144 }, + { "Los Angeles", "USA", -8 * 60, 131, 196 }, + { "San Francisco", "USA", -8 * 60, 126, 191 }, + { "Vancouver", "Canada", -8 * 60, 122, 166 }, + { "Denver", "USA", -7 * 60, 156, 185 }, + { "Austin", "USA", -6 * 60, 168, 199 }, + { "Chicago", "USA", -6 * 60, 187, 181 }, + { "Guatemala City", "Guatemala", -6 * 60, 181, 233 }, + { "Mexico City", "Mexico", -6 * 60, 167, 244 }, + { "Bogota", "Colombia" - 5 * 60, 212, 253 }, + { "Lima", "Peru", -5 * 60, 206, 286 }, + { "Miami", "USA", -5 * 60, 200, 211 }, + { "New York", "USA", -5 * 60, 211, 184 }, + { "Ottawa", "Canada", -5 * 60, 208, 173 }, + { "Washington DC", "USA", -5 * 60, 205, 189 }, + { "Santiago", "Chile", -4 * 60, 217, 327 }, + { "Santo Domingo", "Dominican Republic", -4 * 60, 218, 226 }, + { "Brasilia", "Brazil", -3 * 60, 257, 290 }, + { "Buenos Aires", "Argentina", -3 * 60, 239, 329 }, + { "Nuuk", "Greenland", -3 * 60, 256, 143 }, + { "Sao Paulo", "Brazil", -3 * 60, 260, 308 }, + { "Mid-Atlantic", "", -2 * 60, 296, 266 }, + { "Grytvieken", "South Georgia", -2 * 60, 276, 364 }, + { "Azores", "Portugal", -1 * 60, 308, 188 }, + { "Ponta Delaga", "Portugal", -1 * 60, 300, 190 }, + { "Accra", "Ghana", 0, 343, 250 }, + { "Dakar", "Senegal", 0, 314, 234 }, + { "Lisbon", "Portugal", 0, 327, 187 }, + { "London", "United Kingdom", 0, 343, 162 }, + { "Reykjavik", "Iceland", 0, 306, 138 }, + { "Algiers", "Algeria", 1 * 60, 349, 190 }, + { "Bracelona", "Spain", 1 * 60, 346, 181 }, + { "Berlin", "Germany", 1 * 60, 367, 162 }, + { "Luanda", "Angola", 1 * 60, 367, 278 }, + { "Madrid", "Spain", 1 * 60, 337, 185 }, + { "Paris", "France", 1 * 60, 349, 168 }, + { "Rome", "Italy", 1 * 60, 365, 180 }, + { "Stockholm", "Sweden", 1 * 60, 375, 147 }, + { "Athens", "Greece", 2 * 60, 385, 188 }, + { "Cairo", "Egypt", 2 * 60, 400, 205 }, + { "Cape Town", "South Africa", 2 * 60, 376, 326 }, + { "Harare", "Zimbabwe", 2 * 60, 403, 293 }, + { "Istanbul", "Turkey", 2 * 60, 395, 183 }, + { "Doha", "Qatar", 3 * 60, 437, 213 }, + { "Nairobi", "Kenia", 3 * 60, 409, 263 }, + { "Moscow", "Russia", 3 * 60, 410, 155 }, + { "Tehran", "Iran", 210, 435, 192 }, + { "Izhevsk", "Russia", 4 * 60, 437, 152 }, + { "Dubai", "United Arab Emirates", 4 * 60, 441, 213 }, + { "Kabul", "Afghanistan", 270, 464, 194 }, + { "Islamabad", "Pakistan", 5 * 60, 467, 196 }, + { "Tashkent", "Uzbekistan", 5 * 60, 467, 182 }, + { "Delhi", "India", 330, 481, 203 }, + { "Kathmandu", "Nepal", 345, 494, 204 }, + { "Almaty", "Kazakhstan", 6 * 60, 481, 177 }, + { "Bishkek", "Kyrgyzstan", 6 * 60, 477, 179 }, + { "Dhaka", "Bangladesh", 6 * 60, 504, 213 }, + { "Omsk", "Russia", 6 * 60, 474, 156 }, + { "Bangkok", "Thailand", 7 * 60, 522, 235 }, + { "Hanoi", "Vietnam", 7 * 60, 532, 220 }, + { "Jakarta", "Indonesia", 7 * 60, 532, 274 }, + { "Beijing", "China", 8 * 60, 550, 185 }, + { "Kuala Lumpur", "Malaysia", 8 * 60, 523, 255 }, + { "Manila", "Philipines", 8 * 60, 559, 234 }, + { "Perth", "Australia", 8 * 60, 550, 322 }, + { "Singapore", "Republic of Singapore", 8 * 60, 528, 258 }, + { "Ulan Bator", "Mongolia", 8 * 60, 535, 168 }, + { "Seoul", "South Korea", 9 * 60, 570, 190 }, + { "Tokyo", "Japan", 9 * 60, 592, 193 }, + { "Sydney", "Australia", 10 * 60, 613, 326 }, + { "Noumea", "New Caledonia", 11 * 60, 639, 304 }, + { "Khabarowsk", "Russia", 11 * 60, 584, 169 }, + { "Auckland", "New Zealand", 12 * 60, 654, 328 } }; + +std::vector WorldClock::time_zones_ = { + { 44, 24, -11 * 60, {L[0], L[1]}}, + { 44, 24, -10 * 60, {L[2]}}, + { 68, 24, -9 * 60, {L[3]}}, + { 116, 30, -8 * 60, {L[4], L[5], L[6]}}, + { 146, 30, -7 * 60, {L[7]}}, + { 146, 47, -6 * 60, {L[8], L[9], L[10], L[11]}}, + { 193, 32, -5 * 60, {L[12], L[13], L[14], L[15], L[16], L[17]}}, + { 193, 61, -4 * 60, {L[18], L[19]}}, + { 225, 59, -3 * 60, {L[20], L[21], L[22], L[23]}}, + { 254, 54, -2 * 60, {L[24], L[25]}}, + { 284, 24, -1 * 60, {L[26], L[27]}}, + { 308, 41, 0 * 60, {L[28], L[29], L[30], L[31], L[32]}}, + { 332, 45, 1 * 60, {L[33], L[34], L[35], L[36], L[37], L[38], L[39], L[40]}}, + { 349, 85, 2 * 60, {L[41], L[42], L[43], L[44], L[45]}}, + { 377, 81, 3 * 60, {L[46], L[47], L[48]}}, + { 402, 56, 210, {L[49]}}, /* (3.5 * 60) */ + { 402, 56, 4 * 60, {L[50], L[51]}}, + { 458, 28, 270, {L[52]}}, /* (4.5 * 60) */ + { 458, 28, 5 * 60, {L[53], L[54]}}, + { 458, 28, 330, {L[55]}}, /*(5.5 * 60)*/ + { 486, 28, 345, {L[56]}}, /* (5.75 * 60) */ + { 458, 56, 6 * 60, {L[57], L[58], L[59], L[60]}}, + { 514, 24, 7 * 60, {L[61], L[62], L[63]}}, + { 514, 54, 8 * 60, {L[64], L[65], L[66], L[67], L[68], L[69]}}, + { 538, 84, 9 * 60, {L[70], L[71]}}, + { 595, 27, 10 * 60, {L[72]}}, + { 568, 76, 11 * 60, {L[73], L[74]}}, + { 644, 24, 12 * 60, {L[75]}} }; + +WorldClock::WorldClock() +{ + SetCurrentTimezone(12); // Need to load and store currently set tz to file or any app_data if possible +} + +int WorldClock::GetCurrentTimezoneNo() +{ + return current_tz_; +} + +const Timezone *WorldClock::GetTimezoneByOffset(int offset) +{ + for (int i = offset / 60 + 11; i < time_zones_.size() - 1; i++) { + if (time_zones_.at(i).gmt_offset == offset) { + return &time_zones_.at(i); + } + } + return NULL; +} + +Timezone *WorldClock::GetCurrentTimezone() +{ + return &time_zones_.at(GetCurrentTimezoneNo()); +} + +const char *WorldClock::GetCurrentTzString() +{ + return OffsetToString(GetCurrentTimezone()->gmt_offset); +} + +char *WorldClock::OffsetToString(int offset) +{ + int remainder; + char remainder_str[6]; + static char tz_offset[6] = { 0, }; + + remainder = (offset % 60) * 100 / 60; + snprintf(remainder_str, 3, "%d", (remainder % 10) ? remainder : remainder / 10); + + snprintf(tz_offset, 6, "%s%d%s%s", (offset < 0) ? "" : "+", offset / 60, + ((offset % 60) ? "." : ""), (remainder) ? remainder_str : ""); + return &tz_offset[0]; +} + +void WorldClock::SetCurrentTimezone(int tz) +{ + current_tz_ = tz; +} + +int WorldClock::GetTimezonesCount() +{ + return time_zones_.size(); +} + +int WorldClock::GetLocationsCount() +{ + return locations_.size(); +} diff --git a/clock/src/Utils/Time.cpp b/clock/src/Utils/Time.cpp index 4d5f80c..8f89e1d 100644 --- a/clock/src/Utils/Time.cpp +++ b/clock/src/Utils/Time.cpp @@ -1,3 +1,4 @@ + #include "Utils/Time.h" #include #include @@ -24,9 +25,9 @@ std::string Time::Format(enum Format format) const { switch (format) { case FORMAT_12H: - return getFormattedTime("h:mm"); + return GetFormattedTime("h:mm"); case FORMAT_24H: - return getFormattedTime("HH:mm"); + return GetFormattedTime("HH:mm"); } abort(); return ""; @@ -37,7 +38,12 @@ std::string Time::Meridiem() const return Hour >= 12 ? "PM" : "AM"; } -std::string Time::getFormattedTime(const char *icu_format) const +std::string Time::GetMeridiemByOffset(int timezone_offset) const +{ + return "PM"; +} + +std::string Time::GetFormattedTime(const char *icu_format) const { char buf[32] = {0,}; if (!strcmp(icu_format, "HH:mm")) { @@ -48,3 +54,12 @@ std::string Time::getFormattedTime(const char *icu_format) const } return buf; } + +std::string Time::GetFormattedTimeByTimezoneOffset(const char *icu_format, int timezone_offset) const +{ + return "15:01"; +} +int Time::GetLocalTimezoneOffset(void) const +{ + return 60; +} diff --git a/clock/src/View/WorldClockView.cpp b/clock/src/View/WorldClockView.cpp index 2efe90b..bf3a2f2 100644 --- a/clock/src/View/WorldClockView.cpp +++ b/clock/src/View/WorldClockView.cpp @@ -14,28 +14,311 @@ * limitations under the License. */ +#include + #include "View/WorldClockView.h" #include "View/MainView.h" +#include "Model/WorldClock.h" #include "Utils/Utils.h" +#include "Internal/WorldClockDefs.h" +#include "log.h" +#include "Utils/Time.h" using namespace view; using namespace utils; -WorldClockView::WorldClockView() +void WorldClockView::ChangeTimezoneCb(void *data, Evas_Object *obj, const char *emission, + const char *source) +{ + WorldClockView *world_clock_view = static_cast(data); + model::WorldClock *world_clock_data = world_clock_view->world_clock_data_; + + int current_tz = world_clock_data->GetCurrentTimezoneNo(); + + if (!strcmp(source, "main.world.map:arrow.left")) { + if (current_tz == 0) + world_clock_data->SetCurrentTimezone( + world_clock_data->GetTimezonesCount() - 1); + else + world_clock_data->SetCurrentTimezone(current_tz - 1); + + } else if (!strcmp(source, "main.world.map:arrow.right")) { + if (current_tz == world_clock_data->GetTimezonesCount() - 1) + world_clock_data->SetCurrentTimezone(0); + else + world_clock_data->SetCurrentTimezone(current_tz + 1); + } + world_clock_view->UpdateTimezoneDetails(world_clock_data->GetCurrentTimezone()); +} + +// TODO FOR DEBUGING ONLY - need to be removed when application is ready +void message_cb(void *data, Evas_Object *obj, Edje_Message_Type type, int id, void *msg) { - /*Create content here and use main_layout_ as a parent*/ + if (type == EDJE_MESSAGE_STRING) { + Edje_Message_String *m = static_cast(msg); + DBG("EDJE STRING:%s", m->str); + } else if (type == EDJE_MESSAGE_INT) { + Edje_Message_Int *m = static_cast(msg); + DBG("EDJE INT:%d", m->val); + } else if (type == EDJE_MESSAGE_FLOAT) { + Edje_Message_Float *m = static_cast(msg); + DBG("EDJE FLOAT:%f", m->val); + } +} - /*Temporary Code*/ +WorldClockView::WorldClockView() +{ + world_clock_data_ = new model::WorldClock(); // TODO Move to controller and create Presenter for WorldClock world_clock_ = elm_layout_add(MainView::GetInstance().GetEvasObject()); - elm_layout_file_set(world_clock_, Utils::GetAppResourcePath(Utils::APP_DIR_RESOURCE, "edje/clock.edj"), "main"); + if(!elm_layout_file_set(world_clock_, + Utils::GetAppResourcePath(Utils::APP_DIR_RESOURCE, "edje/WorldClock.edj"), + "main")) { + FAT("Failed to load layout file"); + } + evas_object_size_hint_align_set(world_clock_, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(world_clock_, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + edje_object_message_handler_set(elm_layout_edje_get(world_clock_), message_cb, NULL); + + CreateTimezoneDetails(); + + elm_layout_signal_callback_add(world_clock_, "timezone,go,left", + "main.world.map:arrow.left", WorldClockView::ChangeTimezoneCb, + static_cast(this)); + elm_layout_signal_callback_add(world_clock_, "timezone,go,right", + "main.world.map:arrow.right", WorldClockView::ChangeTimezoneCb, + static_cast(this)); +} + +void WorldClockView::UpdateTimezoneLocationsDots() +{ + int current_tz = world_clock_data_->GetCurrentTimezoneNo(); + + for (int i = 0; i < 8; i++) { + Edje_Message_Int_Set *msg; + msg = (Edje_Message_Int_Set *) malloc( + sizeof(Edje_Message_Int_Set) + 3 * sizeof(int)); + msg->count = 4; + + if (i >= world_clock_data_->GetCurrentTimezone()->places.size()) { + msg->val[0] = 100; + msg->val[1] = 100; + msg->val[2] = PART_NOT_VISIBLE; + + } else { + model::Location loc = world_clock_data_->GetCurrentTimezone()->places.at(i); + msg->val[0] = loc.x; + msg->val[1] = loc.y; + msg->val[2] = PART_VISIBLE; + } + msg->val[3] = i; + edje_object_message_send(elm_layout_edje_get(world_clock_), EDJE_MESSAGE_INT_SET, + MESSAGE_ID_SET_LOCATION_DOT_POSITION, (void *) msg); + + free(msg); + } +} + +void WorldClockView::UpdateGmtOffset() +{ + const char *offset = world_clock_data_->GetCurrentTzString(); + elm_object_part_text_set(world_clock_, "main.world.map:timezone_offset", offset); +} + +void WorldClockView::UpdateTimezoneArea() +{ + Edje_Message_Int_Set *msg; + + msg = static_cast(malloc( + sizeof(Edje_Message_Int_Set) + sizeof(int))); + + msg->count = 2; + msg->val[0] = world_clock_data_->GetCurrentTimezone()->x_coord; + msg->val[1] = world_clock_data_->GetCurrentTimezone()->zone_width; + + edje_object_message_send(elm_layout_edje_get(world_clock_), EDJE_MESSAGE_INT_SET, + MESSAGE_ID_SET_TIMEZONE, (void *) msg); +} + +void WorldClockView::CreateTimezoneDetails() +{ + timezone_details_ = elm_table_add(world_clock_); + + Evas_Object *time = CreateTimezoneTime(); + Evas_Object *padding_1 = CreatePadding(12); + Evas_Object *ampm = CreateTimezoneXMeridiem(); + Evas_Object *padding_2 = CreatePadding(20); + Evas_Object *relative = CreateTimezoneRelativeToLocalObject(); + + elm_table_pack(timezone_details_, time, 0, 0, 1, 1); + elm_table_pack(timezone_details_, padding_1, 1, 0, 1, 1); + elm_table_pack(timezone_details_, ampm, 2, 0, 1, 1); + elm_table_pack(timezone_details_, padding_2, 3, 0, 1, 1); + elm_table_pack(timezone_details_, relative, 4, 0, 1, 1); + + elm_layout_content_set(world_clock_, TIMEZONE_DETAILS_FIRST_LINE_PART, + timezone_details_); + + CreateTimezoneCitiesList(); + + UpdateTimezoneDetails(world_clock_data_->GetCurrentTimezone()); +} + +void WorldClockView::UpdateTimezoneDetails(model::Timezone *timezone) +{ + UpdateTimezoneLocationsDots(); + UpdateTimezoneArea(); + UpdateGmtOffset(); + + UpdateTimezoneTime(timezone->gmt_offset); + UpdateTimezoneXMeridiem(timezone->gmt_offset); + UpdateTimezoneRelativeToLocal(timezone->gmt_offset); + UpdateTimezoneCitiesList(timezone); +} + +Evas_Object *WorldClockView::CreateTimezoneTime() +{ Evas_Object *label = elm_label_add(world_clock_); + evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL); + + evas_object_show(label); - elm_object_text_set(label, "World Clock"); - elm_layout_content_set(world_clock_, "bg", label); + return label; } +void WorldClockView::UpdateTimezoneTime(int timezone_offset) +{ + utils::Time t; + + //TODO This must be formated according to global device settings + std::string timezone_time = t.GetFormattedTimeByTimezoneOffset("HH:MM", timezone_offset); + + char time_formatted[MAX_STYLE_LEN] = { 0, }; + snprintf(time_formatted, sizeof(time_formatted), + TIMEZONE_DETAILS_FIRST_LINE_TIME_STYLE("%s"), timezone_time.c_str()); + elm_object_text_set(elm_table_child_get(timezone_details_, 0, 0), time_formatted); +} + +Evas_Object *WorldClockView::CreateTimezoneXMeridiem() +{ + Evas_Object *ampm = elm_label_add(world_clock_); + evas_object_size_hint_align_set(ampm, EVAS_HINT_FILL, 0.75); + + evas_object_show(ampm); + + return ampm; +} + +void WorldClockView::UpdateTimezoneXMeridiem(int timezone_offset) +{ + utils::Time t; + + //TODO This must be formated according to global device settings + std::string meridiem = t.GetMeridiemByOffset(timezone_offset); + + char ampm_formatted[MAX_STYLE_LEN] = { 0, }; + snprintf(ampm_formatted, sizeof(ampm_formatted), + TIMEZONE_DETAILS_FIRST_LINE_AMPM_STYLE("%s"), meridiem.c_str()); + elm_object_text_set(elm_table_child_get(timezone_details_, 2, 0), ampm_formatted); +} + +Evas_Object *WorldClockView::CreateTimezoneRelativeToLocalObject() +{ + Evas_Object *relative = elm_label_add(world_clock_); + evas_object_size_hint_align_set(relative, EVAS_HINT_FILL, 0.75); + + evas_object_show(relative); + + return relative; +} + +void WorldClockView::UpdateTimezoneRelativeToLocal(int timezone_offset) +{ + char *message_pattern; + char message[64] = { 0, }; + utils::Time t; + + int local_timezone_offset = t.GetLocalTimezoneOffset(); + int offset_integer = (abs(timezone_offset - local_timezone_offset)) / 60; + int offset_remainder = (abs(timezone_offset - local_timezone_offset)) % 60; + + DBG("passed offset:%d, local:%d, remainder:%d", timezone_offset, + local_timezone_offset, offset_remainder); + + if (timezone_offset < local_timezone_offset) { + if (offset_remainder > 0) { + message_pattern = gettext("IDS_CLOCK_BODY_PS1D_H_P2SD_M_BEHIND_ABB"); + snprintf(message, sizeof(message), message_pattern, offset_integer, + offset_remainder); + } else { + message_pattern = gettext("IDS_CLOCK_BODY_PD_H_BEHIND_ABB"); + snprintf(message, sizeof(message), message_pattern, offset_integer); + } + + } else if (timezone_offset > local_timezone_offset) { + if (offset_remainder > 0) { + message_pattern = gettext("IDS_CLOCK_BODY_PS1D_H_P2SD_M_AHEAD_ABB"); + snprintf(message, sizeof(message), message_pattern, offset_integer, + offset_remainder); + } else { + message_pattern = gettext("IDS_CLOCK_BODY_PD_H_AHEAD_ABB"); + snprintf(message, sizeof(message), message_pattern, offset_integer); + } + + } else { + snprintf(message, sizeof(message), "Same as local time"); + } + + char relative_formatted[MAX_STYLE_LEN] = { 0, }; + snprintf(relative_formatted, sizeof(relative_formatted), + TIMEZONE_DETAILS_FIRST_LINE_RELATIVE_TO_LOCAL_STYLE("%s"), message); + + elm_object_text_set(elm_table_child_get(timezone_details_, 4, 0), relative_formatted); +} + +Evas_Object *WorldClockView::CreatePadding(int width) +{ + Evas_Object *padding = elm_bg_add(timezone_details_); + evas_object_size_hint_min_set(padding, width, 10); + evas_object_size_hint_max_set(padding, width, 10); + evas_object_color_set(padding, 0, 0, 0, 0); + evas_object_show(padding); + + return padding; +} + +void WorldClockView::CreateTimezoneCitiesList() +{ + timezone_cities_ = elm_label_add(world_clock_); + evas_object_size_hint_align_set(timezone_cities_, EVAS_HINT_FILL, 0.0); + + evas_object_show (timezone_cities_); + + elm_layout_content_set(world_clock_, TIMEZONE_DETAILS_SECOND_LINE_PART, + timezone_cities_); +} + +void WorldClockView::UpdateTimezoneCitiesList(model::Timezone *timezone) +{ + + std::vector < model::Location > *cities_list = ( (timezone) ? + &timezone->places : &world_clock_data_->GetCurrentTimezone()->places); + + char cities[MAX_CITIES_LEN]; + snprintf(cities, sizeof(cities), "%s", cities_list->at(0).name.c_str()); + + for (int i = 1; i < cities_list->size(); i++) { + char *tmp = strdup(cities); + snprintf(cities, sizeof(cities), "%s, %s", tmp, cities_list->at(i).name.c_str()); + free(tmp); + } + + char cities_formatted[MAX_CITIES_LEN]; + snprintf(cities_formatted, sizeof(cities_formatted), + TIMEZONE_DETAILS_SECOND_LINE_CITIES("%s"), cities); + + elm_object_text_set(timezone_cities_, cities_formatted); +} -- 2.7.4