From bdf52a66901c41ffe51c3dec42a312cad355e42a Mon Sep 17 00:00:00 2001 From: Igor Olshevskyi Date: Thu, 25 May 2017 17:18:10 +0300 Subject: [PATCH] TizenRefApp-8585[Call UI] Implement VolumeControl view Change-Id: Icacfeeaae1d70c437bed7c65d7152506bd1511fd --- edc/accessory.edc | 92 +++++++++++ edc/buttons.edc | 106 +++++++++++++ edc/color_classes.edc | 7 + edc/images/b_slider_btn_bg.png | Bin 0 -> 3262 bytes edc/images/b_slider_icon_minus.png | Bin 0 -> 2894 bytes edc/images/b_slider_icon_plus.png | Bin 0 -> 2933 bytes edc/volume_control.edc | 224 ++++++++++++++++++++++++++ inc/view/VolumeControl.h | 88 +++++++++++ inc/view/types.h | 13 ++ res/edje/theme.edc | 2 + src/view/VolumeControl.cpp | 244 +++++++++++++++++++++++++++++ 11 files changed, 776 insertions(+) create mode 100644 edc/accessory.edc create mode 100644 edc/images/b_slider_btn_bg.png create mode 100644 edc/images/b_slider_icon_minus.png create mode 100644 edc/images/b_slider_icon_plus.png create mode 100644 edc/volume_control.edc create mode 100644 inc/view/VolumeControl.h create mode 100644 src/view/VolumeControl.cpp diff --git a/edc/accessory.edc b/edc/accessory.edc new file mode 100644 index 0000000..740a4e0 --- /dev/null +++ b/edc/accessory.edc @@ -0,0 +1,92 @@ +/* + * Copyright 2017 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + +/* +#define CU_BTN_VOLUME_EFF_DEFAULT_SIZE 160 160 +#define CU_BTN_VOLUME_EFF_PRESSED_SIZE 144 144 +#define CU_BTN_VOLUME_ICON_SIZE 64 64 + +#define CU_BTN_VOLUME_CONTROL(_name, _icon) + group { "elm/button/base/"_name; + images { + image: "w_call_button_press_circle.png" COMP; + image: _icon COMP; + } + parts { + image { "image.bg"; + nomouse; + scale; + desc { "default"; + fixed: 1 1; + min: CU_BTN_VOLUME_EFF_DEFAULT_SIZE; + image.normal: "w_call_button_press_circle.png"; + color: 255 255 255 0; + } + desc { "pressed_effect"; + inherit: "default"; + min: CU_BTN_VOLUME_EFF_PRESSED_SIZE; + color: 255 255 255 33; + } + desc { "pressed"; + inherit: "pressed_effect"; + min: CU_BTN_VOLUME_EFF_DEFAULT_SIZE; + } + } + image { "icon"; + scale; + desc { "default"; + min: CU_BTN_VOLUME_ICON_SIZE; + max: CU_BTN_VOLUME_ICON_SIZE; + image.normal: _icon; + } + } + } + programs { + program { + signal: "mouse,clicked,*"; + source: "icon"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { + signal: "mouse,down,*"; + source: "icon"; + sequence { + action: STATE_SET "pressed_effect"; + target: "image.bg"; + action: STATE_SET "pressed"; + target: "image.bg"; + transition: TRANSITION_GLIDE(0.3); + } + } + program { + signal: "mouse,up,*"; + source: "icon"; + action: STATE_SET "default"; + target: "image.bg"; + transition: LINEAR 0.535; + } + } +*/ + +group { "elm/layout/callui/accessory"; + parts { + swallow { "swl.volume_control" + scale; + desc { "default"; + } + } + } +} \ No newline at end of file diff --git a/edc/buttons.edc b/edc/buttons.edc index 2b1b968..20ca4b3 100644 --- a/edc/buttons.edc +++ b/edc/buttons.edc @@ -25,6 +25,10 @@ #define CU_BTN_BOTTOM_SIZE_INC 360 78 #define CU_BTN_BOTTOM_ICON_SIZE_INC 50 50 +#define CU_BTN_VOLUME_EFF_DEFAULT_SIZE 160 160 +#define CU_BTN_VOLUME_EFF_PRESSED_SIZE 144 144 +#define CU_BTN_VOLUME_ICON_SIZE 64 64 + #define CU_BTN_INCOM_CALL(_name, _icon, _bg_cc, _effect_cc, _icon_norm_cc, _icon_pressed_cc) \ group { "elm/button/base/"_name; \ script { \ @@ -498,8 +502,110 @@ group { "elm/button/base/"_name; \ } \ } +#define CU_BTN_VOLUME_CONTROL(_name, _icon) \ + group { "elm/button/base/"_name; \ + images { \ + image: "w_call_button_press_circle.png" COMP; \ + image: _icon COMP; \ + } \ + parts { \ + image { "image.bg"; \ + nomouse; \ + scale; \ + desc { "default"; \ + fixed: 1 1; \ + min: CU_BTN_VOLUME_EFF_DEFAULT_SIZE; \ + image.normal: "w_call_button_press_circle.png"; \ + color: 255 255 255 0; \ + } \ + desc { "pressed_effect"; \ + inherit: "default"; \ + min: CU_BTN_VOLUME_EFF_PRESSED_SIZE; \ + color: 255 255 255 33; \ + } \ + desc { "pressed"; \ + inherit: "pressed_effect"; \ + min: CU_BTN_VOLUME_EFF_DEFAULT_SIZE; \ + } \ + } \ + image { "icon"; \ + scale; \ + clip_to: "icon.clipper"; \ + desc { "default"; \ + min: CU_BTN_VOLUME_ICON_SIZE; \ + max: CU_BTN_VOLUME_ICON_SIZE; \ + image.normal: _icon; \ + } \ + } \ + rect { "icon.clipper"; \ + scale; \ + desc { "default"; \ + rel.to: "icon"; \ + color_class: "FO22L1i"; \ + } \ + desc { "disabled"; \ + inherit: "default"; \ + color_class: "FO22L1iD"; \ + } \ + } \ + rect { "event"; \ + scale; \ + desc { "default"; \ + rel.to: "icon"; \ + color: 0 0 0 0; \ + } \ + desc { "disabled"; \ + inherit: "default"; \ + hid; \ + } \ + } \ + } \ + programs { \ + program { \ + signal: "mouse,clicked,*"; \ + source: "event"; \ + action: SIGNAL_EMIT "elm,action,click" ""; \ + } \ + program { \ + signal: "mouse,down,*"; \ + source: "event"; \ + sequence { \ + action: STATE_SET "pressed_effect"; \ + target: "image.bg"; \ + action: STATE_SET "pressed"; \ + target: "image.bg"; \ + transition: TRANSITION_GLIDE(0.3); \ + } \ + } \ + program { \ + signal: "mouse,up,*"; \ + source: "event"; \ + action: STATE_SET "default"; \ + target: "image.bg"; \ + transition: LINEAR 0.535; \ + } \ + program { \ + signal: "elm,state,enabled"; \ + source: "elm"; \ + action: STATE_SET "default"; \ + target: "event"; \ + target: "icon.clipper"; \ + } \ + program { \ + signal: "elm,state,disabled"; \ + source: "elm"; \ + action: STATE_SET "disabled"; \ + target: "event"; \ + target: "icon.clipper"; \ + } \ + } \ +} + CU_BTN_INCOM_CALL("callui/accept", "w_call_incoming_icon_accept.png", "AO01131", "AO01132", "AO0113", "AO0113P") CU_BTN_INCOM_CALL("callui/reject", "w_call_incoming_icon_reject.png", "AO01151", "AO01152", "AO0115", "AO0115P") CU_BTN_BOTTOM("callui/end_call", "w_incoming_icon_end_phone.png", "AO0121", "AO0121P", "B013A", "B013") CU_BTN_BOTTOM("callui/call_back", "w_incoming_icon_call.png", "AO0171", "AO0171P", "B013A", "B013") + +CU_BTN_VOLUME_CONTROL("callui/minus", "b_slider_icon_minus.png") +CU_BTN_VOLUME_CONTROL("callui/plus", "b_slider_icon_plus.png") \ No newline at end of file diff --git a/edc/color_classes.edc b/edc/color_classes.edc index 3f4f1b7..10e7ac4 100644 --- a/edc/color_classes.edc +++ b/edc/color_classes.edc @@ -98,4 +98,11 @@ color_classes { color_class { name: "B013"; color: 0 146 204 77; } + color_class { name: "FO22L1i"; + color: 255 255 255 255; + } + color_class { name: "FO22L1iD"; + color: 255 255 255 90; + } + } diff --git a/edc/images/b_slider_btn_bg.png b/edc/images/b_slider_btn_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..c061f95af0910e93dd7ed79820d4fd497edfb3bb GIT binary patch literal 3262 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 AM*si- literal 0 HcmV?d00001 diff --git a/edc/images/b_slider_icon_minus.png b/edc/images/b_slider_icon_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..35affbeb8f2cb93ce27b032a3397254ffa7c00a1 GIT binary patch literal 2894 zcmZ{mcRUq-7stPTWUuUzvRAmaZ0@yZxVqQMc1beJimp9>B-ve2*&~swYh-V(ka>;l z5T1-E>(TT7b6&4=KCjm~?|;tc{BsiSn&{F{a!>*QX!P~8%&%1AZ<3Q<)p8Htg)5=( z(X;XgfQs>N5`o-TYyeQ2dca_J@49;jc>BA1`*7>SVB9`_-fkWbT>%K1#aN)=7Mm=p z#|wv0!+7*dLvM3ta&B{I5}GMZP?U#)-XNZ*aE95e{kpa`31?qHJaI}2I+@u_j5?8W znrxNlO-j_;_{4$JrO>yYlg-EL!x!~aY8#aYn7R?NHgf7rJsC4OG<6yD=Jjt;y9z`p1jV5$N!v<2%LngsNCjlBl`@9g2t)HL7Q=2o8*nSOS&y+jx7;7ny4)x z?T#Tinh9uxq(F;-h7J)LlPzcg3P^y%ptI8oxGN4Egr2RB12pC&CzJ@-yyRgfDo6v| zjIQxoz+D+sj@(Ps21rT3q&~t;57ab(HatC5Eg+``l4kKSB7h_mIP~%H z1%c=sz@)Q}Q2BYgntns{%Bh@M6&$~!c7zSNxGxz3A#qa}ug`j$N#5}v$6O7Gj^G@2 z=?Gc6ZwEsF6r?dtgWt28+1W!90w3#7pM;V zHpKbE-{C4}$4B2jFY`x8+ePS-oP6sTIy5S}G4g^U+G%b*Rrjoc>hg?hoVQEg35OJA zS}|krP0`9tK9DZrO@O`-=@uBfbXi^$J0(_Ilmj&n)QCdU#7pg*iGLXi(IW%emX870 zZ}M*cDojp{c8^*b3B24>Ki4e~0BAS;7rp@8*W#Ce57epmk^`Vs5FuKl$$8k$Ce}uJ zqy5@kJJp$kd^D85s{=|8rF22x@N*EUjD!lu4%cvrIzYZ^aLKlrxyPpa&`NYzexg>%*+uB^)`A zdk#5iFE#uq*m(VS7n_r` zR2))IjBk=5l@UT88V~DI;AcpHNekhg|D*rm9ej*oOlRzoIp3yOS)QyO2VZ*stczzY znc_<^?%RDatC-c!Rhd=JRi1qtN{o|+@4FL=WnuGy2L|kG^lP$fq^{Z0nwD>K&F4!C z;n(F-t)W$gSo8O0aixs1k8>4=qgeC}i>lsajB~iNx*vPI{~pkIeLmx+N!Ay{*x;t_ z_pI;4hk?{IvCL7u@hD;TJT@{m6nh}s`)s3P_VFb4Ubv)!)OPkp4qcA7B~lbC`jk0s zfHK1%LokC=6ap_RFD_pwr?Nb-9E7Kq-M0v<*0GeaSSh3Unpt64j=8&S!D)diQ!b4w zN0oZR)!&6%ohOi5bsBY=!rqw`e6U|>?%}3#X0Hnp|9l^vZ{%IF5Ztoy=SCRh9DeTgr{qYN8cAA5%}+|8#*aij|F&je3WNhTjZN=E&u#N=->`Lt&6R8vCWTS ztQD<_ke1eVbvjj;DuKzSs-}|bB{-9GlZyOFRAcZqMTS! z4c*n9yXh_IVU1z`o~x44#LduFa9MMO`+xLfQo5(Kkc)q{s~*;Un7Ii-AxG#(re#*J zjDsRw9vF+faa|NE3g;hn5TBG_7&$1Br6!Tb*)!kQvT6`;P$<-%7^+OJ^VKo7vi^I@Rk8NzcW~a8sCR1gd_658@0-LsU)GG!zAv zA3N@`s{K;)d%dEzqN1=My>78#Mvj}^}cjOl}kKO znN?_%ZB*}(aI+ekKw^;k4-Ic9N{Cj=KYI9i@oeWHZW*&owGzsj4e7J<2`Y znA(f(M@bEkn;B&No^{VFuUUyxVxh&~;nu=aqGYuwSA<*ZaKeCMW<~z(;hmwn0m5^I zS9`B7cNjVtmR?|sVhs`ET*&p7$_I+ID!#!4$`$5ow`1>-R;qkT#EN=Nm{#l{vZ}*d z1VfBHBks2kM7Gxxd2Ul#Qm(~>ZO={Z*qI_BR*UtHe_}D5YRn0V)l3A|Eaqp^!gE1u zoN?X*tvPcqKbBQ=;ao=C#@sg77sT^zXfw;R*0X3I(ag+#q*=W8ap&llHUW|~EKF#M z!oqNGTU9yFi{6UsMFGEcqis!Y6mcY2A(h|kIRXt7hcuM=Ejs&Mnv$=lnyw7s`J zUtsnE#cAYeEdPDgv&`qC6}-B6OtE-;lSXOwNpfiA6505zCtN5l$OCBZey&cQMeeDM zlTD-PklN_v)AksU5846?4o2s6k4a;qMlRBhQt4pVQgc!VV`*Zy^Y5rBDlV)0 zoo}9%z(!m~1oK%h-dqe;v$88)N*i_W*&w%OkkdOCV;e(n#F zk-C3)?{udFQJNXTq26zdsyVd?`6iXHQSRBq7c|ICGW}CtUrT+|GLD z#sGu}0Dz7H;P>T~ZUXRF5`ZlS0F<%;VD)}s->q}S2J35S!h>di%(PPgNpc`1zS~-h zfzl7reB+D1RoArQ2T38j!v24tIVakNHUs@+4hS3=}1jr>3G)*sUb# zpU}=wtqHtLjeV8)Wawl$;+4--D{*7wym4A}PtrJZvF0i0iEzvXerP!AVXtvL~KA21#lU5cUuKFq=1X)qm2oG#vJEHkO7D10_42ZrBT)}{se|g#n@{usQWmgzn)axI87UxZjPNu9bxoiH&rDYjsOf>MRbretpojo2 z1A>B~;BhWsGuTIH{E(<+-h^Bvm0PcY6H?WWcA%CDph6&|`NZ(XoDyuxu7A1a=}32l z<#NeKD>8jK_y|BzI{U@82WO#p##%gHITg$3EVbQENxJ6dwtBukTIGLnxaHuev2#h8 z25z)ECEEA=rSKkw*DboD`^03=dM2GlP_#9NIPm|IjehY{-0bZ7+S-gs57fbR2oZUX z>T>QtoZbBurEy9;`to5#C|cer+K}S-OV`Ikvy!W$&uAXI&2OX`o;J~uPI)J;^%%S1 zkPx<2E0%y%y}XnI`I2i%&}ZVk!sDddD@&3m(s%7M!y;jT_B4JL0KhFhA!+zfgLXeP0D48ykUCwS!_F&` z9h6r)FU@z-ow_JLh6?p`L7Abnx6xMvUBs(npknbOb-WN4na?`BiXB#7@frS%(p|Ri z88!Wxe!Ef^c8aw|(@^LRP_w!U%q5b!JwXblQgi0U9Sd|CQLrQn@ed}lSzR+tS2B{b zegfyWHR9dZ4E#$q!O@^OU3~z^$DGEu8p=J7uD82|POUK&SH z{-?lq+?pxM#hah1yqMcP(fS=U$`m0`epfzSBcvJ9V#cVP|EiGU33HGG_9++h5kwcwUyMZTgDw_wKL z+-;wFD%Izb{1O9kYnZj}HH9^vHGzExT8x`c!0Th16*23fJ0@J~%tX9x`&Z@Gl#N61i;juwg zsFx>HqRRc?+OMPR&XOqYy3M*RVXv)<-a4JfQ6GW+lW zq$TH!wmmjC&#x!0{8vJ9xl;YjzxGJ>j+vnT&N`z8GK*ZF1 z+k7w2+8kFZUaD@UZq`5YapdL5RIXCKrrfmrX8vaWbpBG4i+!lQB(@y;-ovA9sS%!Psc9*@T!ypAu&64WLUq^uzz$+7nz-uLXDA7^SYK?U zE6R-%)zn+ty_eCJ5!oF1&zU9_L&7X$6|X&SRM5LXHnp2-i+T8hJ?+Te!>lbC6mpb# zbVgwn%Q`IH;1JbeoTZEGgMM*&XD;p0b`{D%Cl z-EzX4J>@;`y@dG}9~EDS7uqQVed->7eX&{})24foDeJRT9c2l#j7BwX3d*?4q$6sk z>zYbJDv7S&IkkRj1-@9-TGdcllwY)S{;1N?G|)6`+3i>89Jd5}BuKhV3MY+$GPE!m ziaaS=H`?K^ljHD*0_~~VY6Op;^|QOWDMdJ4cHOj?nwa&@8Ue3?Z%=Ckh?_b1bi6lX z+>NNOQ=h0@H(Zmuqv%EB65_xPbgL1ZIWhxI{$a)V zuEV%8jtXfONwq8;vqX#Q&;O^(3@PVG5#DDF5l*EI>*DP~U6UD89!s2oIYRg>_KhIs z;m^LMwcv!4WX(>c_2L7N0NqAv#JUuMs`0o z3=y8H6nuX{+GXitS$>8si8n<^@gg_cs_&@QYXpQ5Xjj=UNyOiztk!t{1Pk${*K4+Xt5_fsbwQ@X0tz< z5t|QP=SlDzYR{d2{;r~`2X}kabKG-lV^ONmfibHxdn23i9>eV1JBFp3?{<%V>JwzL zN5lv%u~-=HRlCOfR*$kl{D`_X{5AX#{u{2mH@?v5I(>X^Y>y|R^{3*uNrFQw@l0#* z1HqQe)_l@)(&NPVq=Bein^d`VoOR;sRAb>Au-i{QPJTuu$cUZBeV*hU*MwWAO-bw+ zGWP%d;T-clM2bO~!S^j5TjM-q!m_`mpe3&s z=jemm3vX+T@FZ^W6sq7C4%@(ew19G$z=kwA{4ec!v0$!s}Y9 zsw>)oXIrObu+iJ2B88miFVBZ-IXPsajwg4f@nbn-#o7DW8STCgOU|}CcDUXU`nvk~ zJ`9E`$lW@;d9vFXG9SYG{nZka<=R93M`9$eUvH0WK9!whaAjnWD9CdTPTdux2p9h* zzq^sOIRN3p0H9+5_(i(lEdcJz0J?()tD^D745i&Q{UgSg zK&W(3tU}XJ+!M8ai%lo&+Gi3DuPg5Xe1IjICEyb>BQ&r P?vKS--$Jhz>JsyRR3=ui literal 0 HcmV?d00001 diff --git a/edc/volume_control.edc b/edc/volume_control.edc new file mode 100644 index 0000000..8c9632e --- /dev/null +++ b/edc/volume_control.edc @@ -0,0 +1,224 @@ +/* + * Copyright 2017 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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. + */ + +#define CU_VOLUME_PAD_TOP_MIN 0 39 +#define CU_VOLUME_PAD_BOTTOM_MIN 0 24 +#define CU_VOLUME_ACTION_ZONE_MIN 154 64 +#define CU_VOLUME_ACTION_BTN_SIZE 64 64 +#define CU_VOLUME_ACTION_BTN_MIN 0 7 +#define CU_VOLUME_VALUE_TXT_MIN 66 52 +#define CU_VOLUME_INFO_TXT_ZONE_MIN 168 74 +#define CU_VOLUME_INFO_TXT_MIN 168 37 +#define CU_VOLUME_ICON_SIZE 150 150 + +styles { + style { "volume_value"; + base: "font=Tizen font_weight=Bold font_width=Condensed font_size=40 align=center valign=center color=#FFFFFF ellipsis=1.0"; + } + style { "volume_info"; + base: "font=Tizen font_weight=Regular font_width=Condensed font_size=32 align=center valign=center color=#FFFFFF ellipsis=1.0"; + } +} + +group { "elm/layout/callui/volume_control"; + images { + image: "b_slider_btn_bg.png" COMP; + image: "w_call_opt_volume.png" COMP; + } + parts { + spacer { "sizer" + scale; + desc { "default"; + min: 360 360; + } + } + rect { "bg"; + scale; + desc { "default"; + color: 0 0 0 191; + } + desc { "hide"; + hid; + } + } + swallow { "swl.slider"; + scale; + desc { "default"; + rel1.to: "sizer"; + rel2.to: "sizer"; + } + } + spacer { "pad.top"; + scale; + desc { "default"; + min: CU_VOLUME_PAD_TOP_MIN; + fixed: 0 1; + rel1 { relative: 0.0 0.0; to: "sizer"; } + rel2 { relative: 1.0 0.0; to: "sizer"; } + align: 0.0 0.0; + } + } + spacer { "pad.bottom"; + scale; + desc { "default"; + min: CU_VOLUME_PAD_BOTTOM_MIN; + fixed: 0 1; + rel1 { relative: 0.0 1.0; to: "sizer"; } + rel2 { relative: 1.0 1.0; to: "sizer"; } + align: 0.0 1.0; + } + } + spacer { "action_zone"; + scale; + desc { "default"; + min: CU_VOLUME_ACTION_ZONE_MIN; + max: CU_VOLUME_ACTION_ZONE_MIN; + fixed: 1 1; + rel1 { relative: 0.0 1.0; to_y: "pad.top"; } + rel2 { relative: 1.0 1.0; to_y: "pad.top"; } + align: 0.5 0.0; + } + } + spacer { "txt.value.pad.bottom"; + scale; + desc { "default"; + min: CU_VOLUME_ACTION_BTN_MIN; + fixed: 0 1; + rel1 { relative: 0.0 1.0; to: "action_zone"; } + rel2 { relative: 1.0 1.0; to: "action_zone"; } + align: 0.0 1.0; + } + } + textblock { "txt.value"; + scale; + desc { "default"; + min: CU_VOLUME_VALUE_TXT_MIN; + fixed: 1 1; + rel1 { relative: 0.5 0.0; to_y: "txt.value.pad.bottom"; } + rel2 { relative: 0.5 0.0; to_y: "txt.value.pad.bottom"; } + align: 0.5 1.0; + text.style: "volume_value"; + } + desc { "hide"; + hid; + } + } + swallow { "swl.minus"; + scale; + desc { "default"; + min: CU_VOLUME_ACTION_BTN_SIZE; + max: CU_VOLUME_ACTION_BTN_SIZE; + fixed: 1 1; + rel1 { relative: 0.0 0.0; to: "action_zone"; } + rel2 { relative: 0.0 1.0; to: "action_zone"; } + align: 0.0 0.5; + } + desc { "hide"; + hid; + } + } + swallow { "swl.plus"; + scale; + desc { "default"; + min: CU_VOLUME_ACTION_BTN_SIZE; + max: CU_VOLUME_ACTION_BTN_SIZE; + fixed: 1 1; + rel1 { relative: 1.0 0.0; to: "action_zone"; } + rel2 { relative: 1.0 1.0; to: "action_zone"; } + align: 1.0 0.5; + } + desc { "hide"; + hid; + } + } + spacer { "txt.info.zone"; + scale; + desc { "default"; + min: CU_VOLUME_INFO_TXT_ZONE_MIN; + fixed: 1 1; + rel1 { relative: 0.5 0.0; to_y: "pad.bottom"; } + rel2 { relative: 0.5 0.0; to_y: "pad.bottom"; } + align: 0.5 1.0; + } + } + textblock { "txt.info"; + scale; + desc { "default"; + min: CU_VOLUME_INFO_TXT_MIN; + fixed: 1 1; + rel1 { relative: 0.5 0.5; to_y: "txt.info.zone"; } + rel2 { relative: 0.5 0.5; to_y: "txt.info.zone"; } + text.style: "volume_info"; + } + desc { "hide"; + hid; + } + } + image { "icon.bg" + scale; + desc { "default"; + min: CU_VOLUME_ICON_SIZE; + max: CU_VOLUME_ICON_SIZE; + rel1.to: "sizer"; + rel2.to: "sizer"; + image.normal: "b_slider_btn_bg.png"; + } + desc { "hide"; + hid; + } + } + image { "icon" + scale; + desc { "default"; + min: CU_VOLUME_ICON_SIZE; + max: CU_VOLUME_ICON_SIZE; + rel1.to: "sizer"; + rel2.to: "sizer"; + image.normal: "w_call_opt_volume.png"; + color: 0 0 0 255; + } + desc { "hide"; + hid; + } + } + } + programs { + program { + signal: "hide_controls"; + source: "volume_control"; + action: STATE_SET "hide"; + target: "bg"; + target: "txt.value"; + target: "swl.plus"; + target: "swl.minus"; + target: "txt.info"; + target: "icon.bg"; + target: "icon"; + } + program { + signal: "show_controls"; + source: "volume_control"; + action: STATE_SET "default"; + target: "bg"; + target: "txt.value"; + target: "swl.plus"; + target: "swl.minus"; + target: "txt.info"; + target: "icon.bg"; + target: "icon"; + } + } +} diff --git a/inc/view/VolumeControl.h b/inc/view/VolumeControl.h new file mode 100644 index 0000000..4fcb55b --- /dev/null +++ b/inc/view/VolumeControl.h @@ -0,0 +1,88 @@ +/* + * Copyright 2017 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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 __CALLUI_VIEW_VOLUME_CONTROL_H__ +#define __CALLUI_VIEW_VOLUME_CONTROL_H__ + +#include "ucl/gui/StyledWidget.h" +#include "ucl/gui/Layout.h" + +#include "types.h" + +namespace callui { + + class VolumeControl final : public ucl::ElmWidget { + public: + class Builder { + public: + Builder(); + Builder &setInfoText(const ucl::TString &info); + Builder &setMaxSliderValue(int maxValue); + Builder &setSliderValue(int curValue); + Builder &setShowControls(bool isShown); + Builder &setEventHandler(const VolumeControlEventHandler &handler); + VolumeControlSRef build(ucl::ElmWidget &parent) const; + + private: + ucl::TString m_info; + int m_maxValue; + int m_curValue; + bool m_showControls; + VolumeControlEventHandler m_handler; + }; + + public: + void showControls(); + void hideControls(); + bool getControlsVisibilityState(); + void setInfoText(const ucl::TString &info); + void setSliderValue(int value); + void setMaxSliderValue(int maxValue); + void setDecreaseBtnEnable(bool isEnable); + void setIncreaseBtnEnable(bool isEnable); + void setEventHandler(const VolumeControlEventHandler &handler); + + private: + friend class ucl::RefCountObj; + VolumeControl(ucl::RefCountObjBase &rc, + const ucl::LayoutSRef &layout, + const ucl::TString &info, + int maxValue, + int curValue, + bool showControls, + const VolumeControlEventHandler &handler); + virtual ~VolumeControl(); + + void prepare(const ucl::TString &info, + int maxValue, + int curValue, + bool showControls); + + void onDecreaseBtnClickedCb(ucl::Widget &widget, void *eventInfo); + void onIncreaseBtnClickedCb(ucl::Widget &widget, void *eventInfo); + + private: + ucl::LayoutWRef m_layout; + ucl::ElmWidget m_slider; + ucl::StyledWidget m_decreaseBtn; + ucl::StyledWidget m_increaseBtn; + VolumeControlEventHandler m_handler; + bool m_isControlsShown; + }; + +} + +#endif // __CALLUI_VIEW_VOLUME_CONTROL_H__ diff --git a/inc/view/types.h b/inc/view/types.h index 4ff7915..4a38550 100644 --- a/inc/view/types.h +++ b/inc/view/types.h @@ -23,4 +23,17 @@ #include "../types.h" +namespace callui { + + enum class VolumeControlEvent { + INCREASE, + DECREASE + }; + + UCL_DECLARE_REF_ALIASES(VolumeControl); + + using VolumeControlEventHandler = ucl::WeakDelegate; + +} + #endif // __CALLUI_VIEW_TYPES_H__ diff --git a/res/edje/theme.edc b/res/edje/theme.edc index 75b394d..e583fd4 100644 --- a/res/edje/theme.edc +++ b/res/edje/theme.edc @@ -41,5 +41,7 @@ collections { #include "../../edc/indicator.edc" #include "../../edc/call_info.edc" #include "../../edc/reject_msg.edc" + #include "../../edc/volume_control.edc" + #include "../../edc/accessory.edc" } diff --git a/src/view/VolumeControl.cpp b/src/view/VolumeControl.cpp new file mode 100644 index 0000000..dea42cb --- /dev/null +++ b/src/view/VolumeControl.cpp @@ -0,0 +1,244 @@ +/* + * Copyright 2017 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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 "view/VolumeControl.h" + +#include "common.h" + +namespace callui { namespace { namespace impl { + + using namespace ucl; + + constexpr LayoutTheme LAYOUT_VOLUME + {"layout", "callui", "volume_control"}; + + constexpr ElmStyle STYLE_BTN_MINUS {"callui/minus"}; + constexpr ElmStyle STYLE_BTN_PLUS {"callui/plus"}; + + constexpr EdjePart PART_SWL_SLIDER {"swl.slider"}; + constexpr EdjePart PART_SWL_MINUS {"swl.minus"}; + constexpr EdjePart PART_SWL_PLUS {"swl.plus"}; + + constexpr EdjePart PART_TXT_INFO {"txt.info"}; + constexpr EdjePart PART_TXT_VALUE {"txt.value"}; + + constexpr EdjeSignal SIGNAL_SHOW_CONTROLS {"show_controls"}; + constexpr EdjeSignal SIGNAL_HIDE_CONTROLS {"hide_controls"}; + + constexpr EdjeSignalSrc SIGNAL_SRC_VOICE_CONTROL {"volume_control"}; +}}} + +namespace callui { + + using namespace ucl; + + VolumeControl::Builder::Builder(): + m_maxValue(0), + m_curValue(0), + m_showControls(true) + { + } + + VolumeControl::Builder &VolumeControl::Builder::setInfoText(const TString &info) + { + m_info = info; + return *this; + } + + VolumeControl::Builder &VolumeControl::Builder::setMaxSliderValue(int maxValue) + { + m_maxValue = maxValue; + return *this; + } + + VolumeControl::Builder &VolumeControl::Builder::setSliderValue(int curValue) + { + m_curValue = curValue; + return *this; + } + + VolumeControl::Builder &VolumeControl::Builder::setShowControls(bool isShown) + { + m_showControls = isShown; + return *this; + } + + VolumeControl::Builder &VolumeControl::Builder::setEventHandler( + const VolumeControlEventHandler &handler) + { + m_handler = handler; + return *this; + } + + VolumeControlSRef VolumeControl::Builder::build(ElmWidget &parent) const + { + auto layout = Layout::Builder(). + setTheme(impl::LAYOUT_VOLUME). + setIsOwner(true). + build(parent); + if (!layout) { + LOG_RETURN_VALUE(RES_FAIL, {}, "Layout::build() failed!"); + } + + auto result = makeShared(layout, + m_info, + m_maxValue, + m_curValue, + m_showControls, + m_handler); + + result->bindToEo(); + + return result; + } + + VolumeControl::VolumeControl(RefCountObjBase &rc, + const LayoutSRef &layout, + const TString &info, + int maxValue, + int curValue, + bool showControls, + const VolumeControlEventHandler &handler): + ElmWidget(&rc, *layout, true), + m_layout(layout), + m_slider(eext_circle_object_slider_add(*m_layout, + getCircleSurface(*m_layout))), + m_decreaseBtn(elm_button_add(*m_layout)), + m_increaseBtn(elm_button_add(*m_layout)), + m_handler(handler), + m_isControlsShown(true) + { + prepare(info, maxValue, curValue, showControls); + } + + VolumeControl::~VolumeControl() + { + } + + void VolumeControl::prepare(const TString &info, + int maxValue, + int curValue, + bool showControls) + { + m_layout->setIsOwner(false); + + evas_object_size_hint_align_set(m_slider, + EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(m_slider, + EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + m_layout->setContent(m_slider, impl::PART_SWL_SLIDER); + show(*m_layout); + + m_decreaseBtn.setStyle(impl::STYLE_BTN_MINUS); + m_decreaseBtn.addEventHandler(BTN_CLICKED, WEAK_DELEGATE( + VolumeControl::onDecreaseBtnClickedCb, asWeak(*this))); + m_layout->setContent(m_decreaseBtn, impl::PART_SWL_MINUS); + show(m_decreaseBtn); + + m_increaseBtn.setStyle(impl::STYLE_BTN_PLUS); + m_increaseBtn.addEventHandler(BTN_CLICKED, WEAK_DELEGATE( + VolumeControl::onIncreaseBtnClickedCb, asWeak(*this))); + m_layout->setContent(m_increaseBtn, impl::PART_SWL_PLUS); + show(m_increaseBtn); + + setInfoText(info); + setMaxSliderValue(maxValue); + setSliderValue(curValue); + + if (!showControls) { + hideControls(); + } + } + + void VolumeControl::showControls() + { + if (!m_isControlsShown) { + m_layout->emit(impl::SIGNAL_SHOW_CONTROLS, + impl::SIGNAL_SRC_VOICE_CONTROL); + m_isControlsShown = true; + } + } + + void VolumeControl::hideControls() + { + if (m_isControlsShown) { + m_layout->emit(impl::SIGNAL_HIDE_CONTROLS, + impl::SIGNAL_SRC_VOICE_CONTROL); + m_isControlsShown = false; + } + } + + bool VolumeControl::getControlsVisibilityState() + { + return m_isControlsShown; + } + + void VolumeControl::setInfoText(const TString &info) + { + m_layout->setText(info.translate(), impl::PART_TXT_INFO); + } + + void VolumeControl::setSliderValue(int value) + { + eext_circle_object_value_set(m_slider, static_cast(value)); + m_layout->setText(std::to_string(value), impl::PART_TXT_VALUE); + } + + void VolumeControl::setMaxSliderValue(int maxValue) + { + eext_circle_object_value_min_max_set(m_slider, + 0, maxValue); + } + + void VolumeControl::setIncreaseBtnEnable(bool isEnable) + { + isEnable ? enable(m_increaseBtn) : disable(m_increaseBtn); + } + + void VolumeControl::setDecreaseBtnEnable(bool isEnable) + { + isEnable ? enable(m_decreaseBtn) : disable(m_decreaseBtn); + } + + void VolumeControl::setEventHandler( + const VolumeControlEventHandler &handler) + { + m_handler = handler; + } + + void VolumeControl::onDecreaseBtnClickedCb(Widget &widget, void *eventInfo) + { + if (m_isControlsShown) { + ILOG("Ignored as callback called after control was hidden"); + } + + if (m_handler) { + m_handler(VolumeControlEvent::DECREASE); + } + } + + void VolumeControl::onIncreaseBtnClickedCb(Widget &widget, void *eventInfo) + { + if (m_isControlsShown) { + ILOG("Ignored as callback called after control was hidden"); + } + + if (m_handler) { + m_handler(VolumeControlEvent::INCREASE); + } + } + +} -- 2.34.1