This looks good but isn't this be a theme api break?
Elementary was already released.
Maybe this needs to be optional?

Daniel Juyung Seo (SeoZ)

On Fri, Jan 4, 2013 at 5:50 AM, Enlightenment SVN <
[email protected]> wrote:

> Log:
> [elm] calendar: spinners for month and year now
>
>   Adding a separated spinner for year.
>
>
>
> Author:       ceolin
> Date:         2013-01-03 12:50:10 -0800 (Thu, 03 Jan 2013)
> New Revision: 82108
> Trac:         http://trac.enlightenment.org/e/changeset/82108
>
> Modified:
>   trunk/elementary/data/themes/widgets/calendar.edc
> trunk/elementary/src/lib/elm_calendar.c
> trunk/elementary/src/lib/elm_calendar.h
> trunk/elementary/src/lib/elm_widget_calendar.h
>
> Modified: trunk/elementary/data/themes/widgets/calendar.edc
> ===================================================================
> --- trunk/elementary/data/themes/widgets/calendar.edc   2013-01-03
> 20:48:52 UTC (rev 82107)
> +++ trunk/elementary/data/themes/widgets/calendar.edc   2013-01-03
> 20:50:10 UTC (rev 82108)
> @@ -1,3 +1,293 @@
> +#define CAL_SPIN(_sufix, _relative)\
> +      part { name: "left_bt_"#_sufix;\
> +         mouse_events:  1;\
> +         description { state: "default" 0.0;\
> +            rel1 { to: #_relative;\
> +               offset: 2 2;\
> +            }\
> +            rel2 { to: #_relative;\
> +               offset: -3 -3;\
> +            }\
> +            align: 0.0 0.5;\
> +            min: 24 24;\
> +            max: 24 24;\
> +            fixed: 1 1;\
> +            image {\
> +               normal: "bt_base1.png";\
> +               border: 6 6 6 6;\
> +            }\
> +            fill.smooth : 0;\
> +         }\
> +         description { state: "clicked" 0.0;\
> +            inherit: "default" 0.0;\
> +            image.normal: "bt_base1.png";\
> +            image.middle: SOLID;\
> +         }\
> +      }\
> +      part { name: "left_bt_"#_sufix"_over1";\
> +         mouse_events: 0;\
> +         description { state: "default" 0.0;\
> +            rel1.to: "left_bt_"#_sufix;\
> +            rel2 { to: "left_bt_"#_sufix;\
> +               relative: 1.0 0.5;\
> +            }\
> +            image {\
> +               normal: "bt_hilight.png";\
> +               border: 7 7 7 0;\
> +            }\
> +         }\
> +      }\
> +      part { name: "left_bt_"#_sufix"_over2";\
> +         mouse_events: 1;\
> +         repeat_events: 1;\
> +         description { state: "default" 0.0;\
> +            rel1.to: "left_bt_"#_sufix;\
> +            rel2.to: "left_bt_"#_sufix;\
> +            image {\
> +               normal: "bt_shine.png";\
> +               border: 7 7 7 7;\
> +            }\
> +         }\
> +      }\
> +      part { name: "left_bt_"#_sufix"_over3";\
> +         mouse_events: 1;\
> +         repeat_events: 1;\
> +         description { state: "default" 0.0;\
> +            color: 255 255 255 0;\
> +            rel1.to: "left_bt_"#_sufix;\
> +            rel2.to: "left_bt_"#_sufix;\
> +            image {\
> +               normal: "bt_glow.png";\
> +               border: 12 12 12 12;\
> +            }\
> +            fill.smooth : 0;\
> +         }\
> +         description { state: "clicked" 0.0;\
> +            inherit:  "default" 0.0;\
> +            visible: 1;\
> +            color: 255 255 255 255;\
> +         }\
> +      } \
> +      part { name: "left_bt_"#_sufix"_icon";\
> +         repeat_events: 1;\
> +         description { state: "default" 0.0;\
> +            rel1.to: "left_bt_"#_sufix;\
> +            rel2.to: "left_bt_"#_sufix;\
> +            align: 0.5 0.5;\
> +            min: 16 16;\
> +            max: 16 16;\
> +            image.normal: "sp_bt_l.png";\
> +         }\
> +         description { state: "rtl" 0.0;\
> +            inherit: "default" 0.0;\
> +            image.normal: "sp_bt_r.png";\
> +         }\
> +      }\
> +      part { name: "right_bt_"#_sufix;\
> +         mouse_events:  1;\
> +         description { state: "default" 0.0;\
> +            rel1 { to: #_relative;\
> +               offset: -27 2;\
> +            }\
> +            rel2 { to: #_relative;\
> +               offset: -3 -3;\
> +            }\
> +            align: 1.0 0.5;\
> +            min: 24 24;\
> +            max: 24 24;\
> +            fixed: 1 1;\
> +            image {\
> +               normal: "bt_base1.png";\
> +               border: 5 5 4 12;\
> +            }\
> +            fill.smooth : 0;\
> +         }\
> +         description { state: "clicked" 0.0;\
> +            inherit: "default" 0.0;\
> +            image.normal: "bt_base1.png";\
> +            image.middle: SOLID;\
> +         }\
> +      }\
> +      part { name: "right_bt_"#_sufix"_over1";\
> +         mouse_events: 0;\
> +         description { state: "default" 0.0;\
> +            rel1.to: "right_bt_"#_sufix;\
> +            rel2 { to: "right_bt_"#_sufix;\
> +               relative: 1.0 0.5;\
> +            }\
> +            image {\
> +               normal: "bt_hilight.png";\
> +               border: 7 7 7 0;\
> +            }\
> +         }\
> +      }\
> +      part { name: "right_bt_"#_sufix"_over2";\
> +         mouse_events: 1;\
> +         repeat_events: 1;\
> +         description { state: "default" 0.0;\
> +            rel1.to: "right_bt_"#_sufix;\
> +            rel2.to: "right_bt_"#_sufix;\
> +            image {\
> +               normal: "bt_shine.png";\
> +               border: 7 7 7 7;\
> +            }\
> +         }\
> +      }\
> +      part { name: "right_bt_"#_sufix"_over3";\
> +         mouse_events: 1;\
> +         repeat_events: 1;\
> +         description { state: "default" 0.0;\
> +            color: 255 255 255 0;\
> +            rel1.to: "right_bt_"#_sufix;\
> +            rel2.to: "right_bt_"#_sufix;\
> +            image {\
> +               normal: "bt_glow.png";\
> +               border: 12 12 12 12;\
> +            }\
> +            fill.smooth : 0;\
> +         }\
> +         description { state: "clicked" 0.0;\
> +            inherit:  "default" 0.0;\
> +            visible: 1;\
> +            color: 255 255 255 255;\
> +         }\
> +      }\
> +      part { name: "right_bt_"#_sufix"_icon";\
> +         repeat_events: 1;\
> +         description { state: "default" 0.0;\
> +            rel1.to: "right_bt_"#_sufix;\
> +            rel2.to: "right_bt_"#_sufix;\
> +            align: 0.5 0.5;\
> +            min: 16 16;\
> +            max: 16 16;\
> +            image.normal: "sp_bt_r.png";\
> +         }\
> +         description { state: "rtl" 0.0;\
> +            inherit: "default" 0.0;\
> +            image.normal: "sp_bt_l.png";\
> +         }\
> +      }\
> +      part { name: "text_"#_sufix;\
> +         type: TEXT;\
> +         mouse_events: 0;\
> +         scale: 1;\
> +         description { state: "default" 0.0;\
> +            align: 0 0.5;\
> +            fixed: 1 1;\
> +            rel1 { relative: 1.0 0.0;\
> +               offset: 3 2;\
> +               to: "left_bt_"#_sufix;\
> +               to_y: #_relative;\
> +            }\
> +            rel2 { relative: 0.0 1.0;\
> +               offset: -3 -2;\
> +               to_x: "right_bt_"#_sufix;\
> +               to_y: #_relative;\
> +            }\
> +            color: 0 0 0 255;\
> +            text {\
> +               font: "Sans,Edje-Vera";\
> +               size: 12;\
> +               min: 1 1;\
> +               align: 0.5 0.5;\
> +            }\
> +         }\
> +      }\
> +      programs {\
> +          program { name: "dec_"#_sufix"_start";\
> +             signal: "mouse,down,1";\
> +             source: "left_bt_"#_sufix;\
> +             action: SIGNAL_EMIT "elm,action,decrement,"#_sufix",start"
> "";\
> +         }\
> +         program { name: "dec_"#_sufix"_stop";\
> +            signal: "mouse,up,1";\
> +            source: "left_bt_"#_sufix;\
> +            action: SIGNAL_EMIT "elm,action,"#_sufix",stop" ""; \
> +         }\
> +         program {\
> +            name:   "left_bt_"#_sufix"_click";\
> +            signal: "mouse,down,1";\
> +            source: "left_bt_"#_sufix"_over2";\
> +            action: STATE_SET "clicked" 0.0;\
> +            target: "left_bt_"#_sufix;\
> +         }\
> +         program {\
> +            name:   "left_bt_"#_sufix"_unclick";\
> +            signal: "mouse,up,1";\
> +            source: "left_bt_"#_sufix"over2";\
> +            action: STATE_SET "default" 0.0;\
> +            target: "left_bt_"#_sufix;\
> +         }\
> +         program {\
> +            name:   "left_bt_"#_sufix"_click2";\
> +            signal: "mouse,down,1";\
> +            source: "left_bt_"#_sufix"_over3";\
> +            action: STATE_SET "clicked" 0.0;\
> +            target: "left_bt_"#_sufix"_over3";\
> +         }\
> +         program {\
> +            name:   "left_bt_"#_sufix"_unclick2";\
> +            signal: "mouse,up,1";\
> +            source: "left_bt_"#_sufix"_over3";\
> +            action: STATE_SET "default" 0.0;\
> +            transition: DECELERATE 0.5;\
> +            target: "left_bt_"#_sufix"_over3";\
> +         }\
> +         program { name: "inc_"#_sufix"_start";\
> +            signal: "mouse,down,1";\
> +            source: "right_bt_"#_sufix;\
> +            action: SIGNAL_EMIT "elm,action,increment,"#_sufix",start"
> "";\
> +         }\
> +         program { name: "inc_"#_sufix"_stop";\
> +            signal: "mouse,up,1";\
> +            source: "right_bt_"#_sufix;\
> +            action: SIGNAL_EMIT "elm,action,"#_sufix",stop" "";\
> +         }\
> +         program {\
> +            name:   "right_bt_"#_sufix"_click";\
> +            signal: "mouse,down,1";\
> +            source: "right_bt_"#_sufix"_over2";\
> +            action: STATE_SET "clicked" 0.0;\
> +            target: "right_bt_"#_sufix;\
> +         }\
> +         program {\
> +            name:   "right_bt_"#_sufix"_unclick";\
> +            signal: "mouse,up,1";\
> +            source: "right_bt_"#_sufix"_over2";\
> +            action: STATE_SET "default" 0.0;\
> +            target: "right_bt_"#_sufix;\
> +         }\
> +         program {\
> +            name:   "right_bt_"#_sufix"_click2";\
> +            signal: "mouse,down,1";\
> +            source: "right_bt_"#_sufix"_over3";\
> +            action: STATE_SET "clicked" 0.0;\
> +            target: "right_bt_"#_sufix"_over3";\
> +         }\
> +         program {\
> +            name:   "right_bt_"#_sufix"_unclick2";\
> +            signal: "mouse,up,1";\
> +            source: "right_bt_"#_sufix"_over3";\
> +            action: STATE_SET "default" 0.0;\
> +            transition: DECELERATE 0.5;\
> +            target: "right_bt_"#_sufix"_over3";\
> +         }\
> +         program { name: "to_rtl_"#_sufix;\
> +            signal: "edje,state,rtl";\
> +            source: "edje";\
> +            action: STATE_SET "rtl" 0.0;\
> +            target: "left_bt_"#_sufix"_icon";\
> +            target: "right_bt_"#_sufix"_icon";\
> +         }\
> +         program { name: "to_ltr_"#_sufix;\
> +            signal: "edje,state,ltr";\
> +            source: "edje";\
> +            action: STATE_SET "default" 0.0;\
> +            target: "left_bt_"#_sufix"_icon";\
> +            target: "right_bt_"#_sufix"_icon";\
> +         }\
> +      }
> +
>  #define CH(_pos) \
>     part { name: "ch_"#_pos".base"; \
>        type: RECT; \
> @@ -363,7 +653,7 @@
>              align: 0.0 0.5;
>           }
>        }
> -      part { name: "spinner-base";
> +      part { name: "spinner-base1";
>           type: RECT;
>           mouse_events: 0;
>           description { state: "default" 0.0;
> @@ -372,17 +662,18 @@
>              rel1.to: "bg";
>              rel1.offset: 6 6;
>              rel2.to: "bg";
> +         rel2.relative: 0.5 1.0;
>              rel2.offset: -7 -7;
>              color: 255 255 255 0;
>              align: 0.0 0.0;
>           }
>        }
> -      part { name: "conf_over_spinner";
> +      part { name: "conf_over_spinner1";
>           mouse_events:  0;
>           description { state: "default" 0.0;
> -            rel1.to: "spinner-base";
> +            rel1.to: "spinner-base1";
>              rel1.offset: -3 -3;
> -            rel2.to: "spinner-base";
> +            rel2.to: "spinner-base1";
>              rel2.offset: 2 2;
>              image {
>                 normal: "shelf_inset.png";
> @@ -392,13 +683,44 @@
>              fill.smooth : 0;
>           }
>        }
> +      part { name: "spinner-base2";
> +         type: RECT;
> +         mouse_events: 0;
> +         description { state: "default" 0.0;
> +            min: 24 24;
> +            max: 999999 24;
> +            rel1.to_x: "spinner-base1";
> +            rel1.to_y: "bg";
> +            rel1.relative: 1.0 0;
> +            rel1.offset: 6 6;
> +            rel2.to: "bg";
> +            rel2.offset: -7 -7;
> +            color: 255 255 255 0;
> +            align: 0.0 0.0;
> +         }
> +      }
> +      part { name: "conf_over_spinner2";
> +         mouse_events:  0;
> +         description { state: "default" 0.0;
> +            rel1.to: "spinner-base2";
> +            rel1.offset: -2 -2;
> +            rel2.to: "spinner-base2";
> +            rel2.offset: 2 2;
> +            image {
> +               normal: "shelf_inset.png";
> +               border: 7 7 7 7;
> +               middle: 0;
> +            }
> +            fill.smooth : 0;
> +         }
> +      }
>        part { name: "table-base";
>           type: RECT;
>           mouse_events: 0;
>           description { state: "default" 0.0;
>              min: 256 220;
>              rel1.to_x: "bg";
> -            rel1.to_y: "spinner-base";
> +            rel1.to_y: "spinner-base1";
>              rel1.offset: 6 6;
>              rel1.relative: 0 1;
>              rel2.to: "bg";
> @@ -445,200 +767,10 @@
>              color: 255 255 255 0;
>           }
>        }
> -      part { name: "left_bt";
> -         mouse_events:  1;
> -         description { state: "default" 0.0;
> -            rel1 { to: "spinner-base";
> -               offset: 2 2;
> -            }
> -            rel2 { to: "spinner-base";
> -               offset: -3 -3;
> -            }
> -            align: 0.0 0.5;
> -            min: 24 24;
> -            max: 24 24;
> -            fixed: 1 1;
> -            image {
> -               normal: "bt_base1.png";
> -               border: 6 6 6 6;
> -            }
> -            fill.smooth : 0;
> -         }
> -         description { state: "clicked" 0.0;
> -            inherit: "default" 0.0;
> -            image.normal: "bt_base1.png";
> -            image.middle: SOLID;
> -         }
> -      }
> -      part { name: "left_over1";
> -         mouse_events: 0;
> -         description { state: "default" 0.0;
> -            rel1.to: "left_bt";
> -            rel2 { to: "left_bt";
> -               relative: 1.0 0.5;
> -            }
> -            image {
> -               normal: "bt_hilight.png";
> -               border: 7 7 7 0;
> -            }
> -         }
> -      }
> -      part { name: "left_over2";
> -         mouse_events: 1;
> -         repeat_events: 1;
> -         description { state: "default" 0.0;
> -            rel1.to: "left_bt";
> -            rel2.to: "left_bt";
> -            image {
> -               normal: "bt_shine.png";
> -               border: 7 7 7 7;
> -            }
> -         }
> -      }
> -      part { name: "left_over3";
> -         mouse_events: 1;
> -         repeat_events: 1;
> -         description { state: "default" 0.0;
> -            color: 255 255 255 0;
> -            rel1.to: "left_bt";
> -            rel2.to: "left_bt";
> -            image {
> -               normal: "bt_glow.png";
> -               border: 12 12 12 12;
> -            }
> -            fill.smooth : 0;
> -         }
> -         description { state: "clicked" 0.0;
> -            inherit:  "default" 0.0;
> -            visible: 1;
> -            color: 255 255 255 255;
> -         }
> -      }
> -      part { name: "right_bt";
> -         mouse_events:  1;
> -         description { state: "default" 0.0;
> -            rel1 { to: "spinner-base";
> -               offset: -27 3;
> -            }
> -            rel2 { to: "spinner-base";
> -               offset: -3 -3;
> -            }
> -            align: 1.0 0.5;
> -            min: 24 24;
> -            max: 24 24;
> -            fixed: 1 1;
> -            image {
> -               normal: "bt_base1.png";
> -               border: 5 5 4 12;
> -            }
> -            fill.smooth : 0;
> -         }
> -         description { state: "clicked" 0.0;
> -            inherit: "default" 0.0;
> -            image.normal: "bt_base1.png";
> -            image.middle: SOLID;
> -         }
> -      }
> -      part { name: "right_over1";
> -         mouse_events: 0;
> -         description { state: "default" 0.0;
> -            rel1.to: "right_bt";
> -            rel2 { to: "right_bt";
> -               relative: 1.0 0.5;
> -            }
> -            image {
> -               normal: "bt_hilight.png";
> -               border: 7 7 7 0;
> -            }
> -         }
> -      }
> -      part { name: "right_over2";
> -         mouse_events: 1;
> -         repeat_events: 1;
> -         description { state: "default" 0.0;
> -            rel1.to: "right_bt";
> -            rel2.to: "right_bt";
> -            image {
> -               normal: "bt_shine.png";
> -               border: 7 7 7 7;
> -            }
> -         }
> -      }
> -      part { name: "right_over3";
> -         mouse_events: 1;
> -         repeat_events: 1;
> -         description { state: "default" 0.0;
> -            color: 255 255 255 0;
> -            rel1.to: "right_bt";
> -            rel2.to: "right_bt";
> -            image {
> -               normal: "bt_glow.png";
> -               border: 12 12 12 12;
> -            }
> -            fill.smooth : 0;
> -         }
> -         description { state: "clicked" 0.0;
> -            inherit:  "default" 0.0;
> -            visible: 1;
> -            color: 255 255 255 255;
> -         }
> -      }
> -      part { name: "left_bt_icon";
> -         repeat_events: 1;
> -         description { state: "default" 0.0;
> -            rel1.to: "left_bt";
> -            rel2.to: "left_bt";
> -            align: 0.5 0.5;
> -            min: 16 16;
> -            max: 16 16;
> -            image.normal: "sp_bt_l.png";
> -         }
> -         description { state: "rtl" 0.0;
> -            inherit: "default" 0.0;
> -            image.normal: "sp_bt_r.png";
> -         }
> -      }
> -      part { name: "right_bt_icon";
> -         repeat_events: 1;
> -         description { state: "default" 0.0;
> -            rel1.to: "right_bt";
> -            rel2.to: "right_bt";
> -            align: 0.5 0.5;
> -            min: 16 16;
> -            max: 16 16;
> -            image.normal: "sp_bt_r.png";
> -         }
> -         description { state: "rtl" 0.0;
> -            inherit: "default" 0.0;
> -            image.normal: "sp_bt_l.png";
> -         }
> -      }
> -      part { name: "month_text";
> -         type: TEXT;
> -         mouse_events: 0;
> -         scale: 1;
> -         description { state: "default" 0.0;
> -            align: 0 0.5;
> -            fixed: 1 1;
> -            rel1 { relative: 1.0 0.0;
> -               offset: 3 2;
> -               to: "left_bt";
> -               to_y: "spinner-base";
> -            }
> -            rel2 { relative: 0.0 1.0;
> -               offset: -3 -2;
> -               to_x: "right_bt";
> -               to_y: "spinner-base";
> -            }
> -            color: 0 0 0 255;
> -            text {
> -               font: "Sans,Edje-Vera";
> -               size: 12;
> -               min: 1 1;
> -               align: 0.5 0.5;
> -            }
> -         }
> -      }
> +
> +      CAL_SPIN(month, spinner-base1)
> +      CAL_SPIN(year, spinner-base2)
> +
>        CH(0)   CH(1)   CH(2)   CH(3)   CH(4)   CH(5)   CH(6)
>        CIT(0)  CIT(1)  CIT(2)  CIT(3)  CIT(4)  CIT(5)  CIT(6)
>        CIT(7)  CIT(8)  CIT(9)  CIT(10) CIT(11) CIT(12) CIT(13)
> @@ -647,100 +779,6 @@
>        CIT(28) CIT(29) CIT(30) CIT(31) CIT(32) CIT(33) CIT(34)
>        CIT(35) CIT(36) CIT(37) CIT(38) CIT(39) CIT(40) CIT(41)
>     }
> -   programs {
> -      program { name: "dec_start";
> -         signal: "mouse,down,1";
> -         source: "left_bt";
> -         action: SIGNAL_EMIT "elm,action,decrement,start" "";
> -      }
> -      program { name: "dec_stop";
> -         signal: "mouse,up,1";
> -         source: "left_bt";
> -         action: SIGNAL_EMIT "elm,action,stop" "";
> -      }
> -      program { name: "inc_start";
> -         signal: "mouse,down,1";
> -         source: "right_bt";
> -         action: SIGNAL_EMIT "elm,action,increment,start" "";
> -      }
> -      program { name: "inc_stop";
> -         signal: "mouse,up,1";
> -         source: "right_bt";
> -         action: SIGNAL_EMIT "elm,action,stop" "";
> -      }
> -      program {
> -         name:   "left_bt_click";
> -         signal: "mouse,down,1";
> -         source: "left_over2";
> -         action: STATE_SET "clicked" 0.0;
> -         target: "left_bt";
> -      }
> -      program {
> -         name:   "left_bt_unclick";
> -         signal: "mouse,up,1";
> -         source: "left_over2";
> -         action: STATE_SET "default" 0.0;
> -         target: "left_bt";
> -      }
> -      program {
> -         name:   "left_bt_click2";
> -         signal: "mouse,down,1";
> -         source: "left_over3";
> -         action: STATE_SET "clicked" 0.0;
> -         target: "left_over3";
> -      }
> -      program {
> -         name:   "left_bt_unclick2";
> -         signal: "mouse,up,1";
> -         source: "left_over3";
> -         action: STATE_SET "default" 0.0;
> -         transition: DECELERATE 0.5;
> -         target: "left_over3";
> -      }
> -      program {
> -         name:   "right_bt_click";
> -         signal: "mouse,down,1";
> -         source: "right_over2";
> -         action: STATE_SET "clicked" 0.0;
> -         target: "right_bt";
> -      }
> -      program {
> -         name:   "right_bt_unclick";
> -         signal: "mouse,up,1";
> -         source: "right_over2";
> -         action: STATE_SET "default" 0.0;
> -         target: "right_bt";
> -      }
> -      program {
> -         name:   "right_bt_click2";
> -         signal: "mouse,down,1";
> -         source: "right_over3";
> -         action: STATE_SET "clicked" 0.0;
> -         target: "right_over3";
> -      }
> -      program {
> -         name:   "right_bt_unclick2";
> -         signal: "mouse,up,1";
> -         source: "right_over3";
> -         action: STATE_SET "default" 0.0;
> -         transition: DECELERATE 0.5;
> -         target: "right_over3";
> -      }
> -      program { name: "to_rtl";
> -         signal: "edje,state,rtl";
> -         source: "edje";
> -         action: STATE_SET "rtl" 0.0;
> -         target: "right_bt_icon";
> -         target: "left_bt_icon";
> -      }
> -      program { name: "to_ltr";
> -         signal: "edje,state,ltr";
> -         source: "edje";
> -         action: STATE_SET "default" 0.0;
> -         target: "right_bt_icon";
> -         target: "left_bt_icon";
> -      }
> -   }
>  }
>
>  #undef CIT
>
> Modified: trunk/elementary/src/lib/elm_calendar.c
> ===================================================================
> --- trunk/elementary/src/lib/elm_calendar.c     2013-01-03 20:48:52 UTC
> (rev 82107)
> +++ trunk/elementary/src/lib/elm_calendar.c     2013-01-03 20:50:10 UTC
> (rev 82108)
> @@ -136,6 +136,24 @@
>     return strdup(buf);
>  }
>
> +static char *
> +_format_month(struct tm *selected_time)
> +{
> +   char buf[32];
> +
> +   if (!strftime(buf, sizeof(buf), E_("%B"), selected_time)) return NULL;
> +   return strdup(buf);
> +}
> +
> +static char *
> +_format_year(struct tm *selected_time)
> +{
> +   char buf[32];
> +
> +   if (!strftime(buf, sizeof(buf), E_("%Y"), selected_time)) return NULL;
> +   return strdup(buf);
> +}
> +
>  static inline void
>  _cit_mark(Evas_Object *cal,
>            int cit,
> @@ -187,14 +205,21 @@
>  {
>     char *buf;
>
> -   /* Set selected month */
> -   buf = sd->format_func(&sd->shown_time);
> +   buf = _format_month(&sd->shown_time);
>     if (buf)
>       {
> -        elm_layout_text_set(sd->obj, "month_text", buf);
> +        elm_layout_text_set(sd->obj, "text_month", buf);
>          free(buf);
>       }
> -   else elm_layout_text_set(sd->obj, "month_text", "");
> +   else elm_layout_text_set(sd->obj, "text_month", "");
> +
> +   buf = _format_year(&sd->shown_time);
> +   if (buf)
> +     {
> +        elm_layout_text_set(sd->obj, "text_year", buf);
> +        free(buf);
> +     }
> +   else elm_layout_text_set(sd->obj, "text_year", "");
>  }
>
>  static char *
> @@ -255,28 +280,43 @@
>     Elm_Access_Info *ai;
>     ELM_CALENDAR_DATA_GET(obj, sd);
>
> -   // decrement button
> -   sd->dec_btn_access = _elm_access_edje_object_part_object_register
> -                            (obj, elm_layout_edje_get(obj), "left_bt");
> -   ai = _elm_access_object_get(sd->dec_btn_access);
> -   _elm_access_text_set(ai, ELM_ACCESS_TYPE, E_("calendar decrement
> button"));
> +   sd->dec_btn_month_access = _elm_access_edje_object_part_object_register
> +                            (obj, elm_layout_edje_get(obj),
> "left_bt_month");
> +   ai = _elm_access_object_get(sd->dec_btn_month_access);
> +   _elm_access_text_set(ai, ELM_ACCESS_TYPE, E_("calendar decrement month
> button"));
>
> -   // increment button
> -   sd->inc_btn_access = _elm_access_edje_object_part_object_register
> -                            (obj, elm_layout_edje_get(obj), "right_bt");
> -   ai = _elm_access_object_get(sd->inc_btn_access);
> -   _elm_access_text_set(ai, ELM_ACCESS_TYPE, E_("calendar increment
> button"));
> +   sd->dec_btn_year_access = _elm_access_edje_object_part_object_register
> +                            (obj, elm_layout_edje_get(obj),
> "left_bt_year");
> +   ai = _elm_access_object_get(sd->dec_btn_year_access);
> +   _elm_access_text_set(ai, ELM_ACCESS_TYPE, E_("calendar decrement year
> button"));
>
> -   // month text
> +   sd->inc_btn_month_access = _elm_access_edje_object_part_object_register
> +                            (obj, elm_layout_edje_get(obj),
> "right_bt_month");
> +   ai = _elm_access_object_get(sd->inc_btn_month_access);
> +   _elm_access_text_set(ai, ELM_ACCESS_TYPE, E_("calendar increment month
> button"));
> +
> +   sd->inc_btn_year_access = _elm_access_edje_object_part_object_register
> +                            (obj, elm_layout_edje_get(obj),
> "right_bt_year");
> +   ai = _elm_access_object_get(sd->inc_btn_year_access);
> +   _elm_access_text_set(ai, ELM_ACCESS_TYPE, E_("calendar increment year
> button"));
> +
>     sd->month_access = _elm_access_edje_object_part_object_register
> -                          (obj, elm_layout_edje_get(obj), "month_text");
> +                          (obj, elm_layout_edje_get(obj), "text_month");
>     ai = _elm_access_object_get(sd->month_access);
>     _elm_access_text_set(ai, ELM_ACCESS_TYPE, E_("calendar month"));
>
> +   sd->year_access = _elm_access_edje_object_part_object_register
> +                          (obj, elm_layout_edje_get(obj), "text_year");
> +   ai = _elm_access_object_get(sd->year_access);
> +   _elm_access_text_set(ai, ELM_ACCESS_TYPE, E_("calendar year"));
> +
>     po = (Evas_Object *)edje_object_part_object_get
> -          (elm_layout_edje_get(obj), "month_text");
> +          (elm_layout_edje_get(obj), "text_month");
>     evas_object_pass_events_set(po, EINA_FALSE);
>
> +   po = (Evas_Object *)edje_object_part_object_get
> +          (elm_layout_edje_get(obj), "text_year");
> +   evas_object_pass_events_set(po, EINA_FALSE);
>  }
>
>  static void
> @@ -517,7 +557,7 @@
>  }
>
>  static Eina_Bool
> -_update_month(Evas_Object *obj,
> +_update_data(Evas_Object *obj, Eina_Bool month,
>                int delta)
>  {
>     struct tm time_check;
> @@ -527,30 +567,40 @@
>
>     /* check if it's a valid time. for 32 bits, year greater than 2037 is
> not */
>     time_check = sd->shown_time;
> -   time_check.tm_mon += delta;
> +   if (month)
> +       time_check.tm_mon += delta;
> +   else
> +       time_check.tm_year += delta;
>     if (mktime(&time_check) == -1)
>       return EINA_FALSE;
>
> -   sd->shown_time.tm_mon += delta;
> -   if (sd->shown_time.tm_mon < 0)
> +   if (month)
>       {
> -        if (sd->shown_time.tm_year == sd->year_min)
> -          {
> -             sd->shown_time.tm_mon++;
> -             return EINA_FALSE;
> -          }
> -        sd->shown_time.tm_mon = 11;
> -        sd->shown_time.tm_year--;
> +       sd->shown_time.tm_mon += delta;
> +       if (sd->shown_time.tm_mon < 0)
> +         {
> +            if (sd->shown_time.tm_year == sd->year_min)
> +              {
> +                 sd->shown_time.tm_mon++;
> +                 return EINA_FALSE;
> +              }
> +            sd->shown_time.tm_mon = 11;
> +            sd->shown_time.tm_year--;
> +         }
> +       else if (sd->shown_time.tm_mon > 11)
> +         {
> +            if (sd->shown_time.tm_year == sd->year_max)
> +              {
> +                 sd->shown_time.tm_mon--;
> +                 return EINA_FALSE;
> +              }
> +            sd->shown_time.tm_mon = 0;
> +            sd->shown_time.tm_year++;
> +         }
>       }
> -   else if (sd->shown_time.tm_mon > 11)
> +   else
>       {
> -        if (sd->shown_time.tm_year == sd->year_max)
> -          {
> -             sd->shown_time.tm_mon--;
> -             return EINA_FALSE;
> -          }
> -        sd->shown_time.tm_mon = 0;
> -        sd->shown_time.tm_year++;
> +       sd->shown_time.tm_year += delta;
>       }
>
>     if ((sd->select_mode != ELM_CALENDAR_SELECT_MODE_ONDEMAND)
> @@ -569,21 +619,35 @@
>  }
>
>  static Eina_Bool
> -_spin_value(void *data)
> +_spin_month_value(void *data)
>  {
>     ELM_CALENDAR_DATA_GET(data, sd);
>
> -   if (_update_month(data, sd->spin_speed))
> +   if (_update_data(data, EINA_TRUE, sd->spin_speed))
>       evas_object_smart_changed(data);
>
>     sd->interval = sd->interval / 1.05;
> -   ecore_timer_interval_set(sd->spin, sd->interval);
> +   ecore_timer_interval_set(sd->spin_month, sd->interval);
>
>     return ECORE_CALLBACK_RENEW;
>  }
>
> +static Eina_Bool
> +_spin_year_value(void *data)
> +{
> +   ELM_CALENDAR_DATA_GET(data, sd);
> +
> +   if (_update_data(data, EINA_FALSE, sd->spin_speed))
> +     evas_object_smart_changed(data);
> +
> +   sd->interval = sd->interval / 1.05;
> +   ecore_timer_interval_set(sd->spin_year, sd->interval);
> +
> +   return ECORE_CALLBACK_RENEW;
> +}
> +
>  static void
> -_button_inc_start(void *data,
> +_button_month_inc_start(void *data,
>                    Evas_Object *obj __UNUSED__,
>                    const char *emission __UNUSED__,
>                    const char *source __UNUSED__)
> @@ -592,14 +656,14 @@
>
>     sd->interval = sd->first_interval;
>     sd->spin_speed = 1;
> -   if (sd->spin) ecore_timer_del(sd->spin);
> -   sd->spin = ecore_timer_add(sd->interval, _spin_value, data);
> +   if (sd->spin_month) ecore_timer_del(sd->spin_month);
> +   sd->spin_month = ecore_timer_add(sd->interval, _spin_month_value,
> data);
>
> -   _spin_value(data);
> +   _spin_month_value(data);
>  }
>
>  static void
> -_button_dec_start(void *data,
> +_button_month_dec_start(void *data,
>                    Evas_Object *obj __UNUSED__,
>                    const char *emission __UNUSED__,
>                    const char *source __UNUSED__)
> @@ -608,25 +672,70 @@
>
>     sd->interval = sd->first_interval;
>     sd->spin_speed = -1;
> -   if (sd->spin) ecore_timer_del(sd->spin);
> -   sd->spin = ecore_timer_add(sd->interval, _spin_value, data);
> +   if (sd->spin_month) ecore_timer_del(sd->spin_month);
> +   sd->spin_month = ecore_timer_add(sd->interval, _spin_month_value,
> data);
>
> -   _spin_value(data);
> +   _spin_month_value(data);
>  }
>
>  static void
> -_button_stop(void *data,
> -             Evas_Object *obj __UNUSED__,
> -             const char *emission __UNUSED__,
> -             const char *source __UNUSED__)
> +_button_month_stop(void *data,
> +                  Evas_Object *obj __UNUSED__,
> +                  const char *emission __UNUSED__,
> +                  const char *source __UNUSED__)
>  {
>     ELM_CALENDAR_DATA_GET(data, sd);
>
>     sd->interval = sd->first_interval;
> -   if (sd->spin) ecore_timer_del(sd->spin);
> -   sd->spin = NULL;
> +   if (sd->spin_month) ecore_timer_del(sd->spin_month);
> +   sd->spin_month = NULL;
>  }
>
> +static void
> +_button_year_inc_start(void *data,
> +                      Evas_Object *obj __UNUSED__,
> +                      const char *emission __UNUSED__,
> +                      const char *source __UNUSED__)
> +{
> +   ELM_CALENDAR_DATA_GET(data, sd);
> +
> +   sd->interval = sd->first_interval;
> +   sd->spin_speed = 1;
> +   if (sd->spin_year) ecore_timer_del(sd->spin_year);
> +   sd->spin_year = ecore_timer_add(sd->interval, _spin_year_value, data);
> +
> +   _spin_year_value(data);
> +}
> +
> +static void
> +_button_year_dec_start(void *data,
> +                  Evas_Object *obj __UNUSED__,
> +                  const char *emission __UNUSED__,
> +                  const char *source __UNUSED__)
> +{
> +   ELM_CALENDAR_DATA_GET(data, sd);
> +
> +   sd->interval = sd->first_interval;
> +   sd->spin_speed = -1;
> +   if (sd->spin_year) ecore_timer_del(sd->spin_year);
> +   sd->spin_year = ecore_timer_add(sd->interval, _spin_year_value, data);
> +
> +   _spin_year_value(data);
> +}
> +
> +static void
> +_button_year_stop(void *data,
> +                 Evas_Object *obj __UNUSED__,
> +                 const char *emission __UNUSED__,
> +                 const char *source __UNUSED__)
> +{
> +   ELM_CALENDAR_DATA_GET(data, sd);
> +
> +   sd->interval = sd->first_interval;
> +   if (sd->spin_year) ecore_timer_del(sd->spin_year);
> +   sd->spin_year = NULL;
> +}
> +
>  static int
>  _get_item_day(Evas_Object *obj,
>                int selected_it)
> @@ -735,12 +844,12 @@
>     if ((!strcmp(ev->keyname, "Prior")) ||
>         ((!strcmp(ev->keyname, "KP_Prior")) && (!ev->string)))
>       {
> -        if (_update_month(obj, -1)) _populate(obj);
> +        if (_update_data(obj, EINA_TRUE, -1)) _populate(obj);
>       }
>     else if ((!strcmp(ev->keyname, "Next")) ||
>              ((!strcmp(ev->keyname, "KP_Next")) && (!ev->string)))
>       {
> -        if (_update_month(obj, 1)) _populate(obj);
> +        if (_update_data(obj, EINA_TRUE, 1)) _populate(obj);
>       }
>     else if ((sd->select_mode != ELM_CALENDAR_SELECT_MODE_NONE)
>              && ((sd->select_mode != ELM_CALENDAR_SELECT_MODE_ONDEMAND)
> @@ -819,15 +928,24 @@
>     priv->selectable = (~(ELM_CALENDAR_SELECTABLE_NONE));
>
>     edje_object_signal_callback_add
> -     (wd->resize_obj, "elm,action,increment,start", "*",
> -     _button_inc_start, obj);
> +     (wd->resize_obj, "elm,action,increment,month,start", "*",
> +     _button_month_inc_start, obj);
>     edje_object_signal_callback_add
> -     (wd->resize_obj, "elm,action,decrement,start", "*",
> -     _button_dec_start, obj);
> +     (wd->resize_obj, "elm,action,decrement,month,start", "*",
> +      _button_month_dec_start, obj);
>     edje_object_signal_callback_add
> -     (wd->resize_obj, "elm,action,stop", "*",
> -     _button_stop, obj);
> +     (wd->resize_obj, "elm,action,increment,year,start", "*",
> +     _button_year_inc_start, obj);
>     edje_object_signal_callback_add
> +     (wd->resize_obj, "elm,action,decrement,year,start", "*",
> +     _button_year_dec_start, obj);
> +   edje_object_signal_callback_add
> +     (wd->resize_obj, "elm,action,month,stop", "*",
> +     _button_month_stop, obj);
> +   edje_object_signal_callback_add
> +     (wd->resize_obj, "elm,action,year,stop", "*",
> +     _button_year_stop, obj);
> +   edje_object_signal_callback_add
>       (wd->resize_obj, "elm,action,selected", "*",
>       _day_selected, obj);
>
> @@ -875,7 +993,8 @@
>     Elm_Calendar_Mark *mark;
>     Elm_Calendar_Smart_Data *sd = _pd;
>
> -   if (sd->spin) ecore_timer_del(sd->spin);
> +   if (sd->spin_month) ecore_timer_del(sd->spin_month);
> +   if (sd->spin_year) ecore_timer_del(sd->spin_year);
>     if (sd->update_timer) ecore_timer_del(sd->update_timer);
>
>     if (sd->marks)
> @@ -925,9 +1044,13 @@
>     Elm_Calendar_Smart_Data *sd = _pd;
>
>     items = eina_list_append(items, sd->month_access);
> -   items = eina_list_append(items, sd->dec_btn_access);
> -   items = eina_list_append(items, sd->inc_btn_access);
> +   items = eina_list_append(items, sd->dec_btn_month_access);
> +   items = eina_list_append(items, sd->inc_btn_month_access);
>
> +   items = eina_list_append(items, sd->year_access);
> +   items = eina_list_append(items, sd->dec_btn_year_access);
> +   items = eina_list_append(items, sd->inc_btn_year_access);
> +
>     day = 0;
>     maxdays = _maxdays_get(&sd->shown_time);
>     for (i = 0; i < 42; i++)
> @@ -976,15 +1099,25 @@
>                 }
>            }
>
> -        if (sd->dec_btn_access)
> +        if (sd->dec_btn_month_access)
>            _elm_access_edje_object_part_object_unregister
> -            (obj, elm_layout_edje_get(obj), "left_bt");
> -        if (sd->inc_btn_access)
> +            (obj, elm_layout_edje_get(obj), "left_bt_month");
> +        if (sd->inc_btn_month_access)
>            _elm_access_edje_object_part_object_unregister
> -            (obj, elm_layout_edje_get(obj), "right_bt");
> +            (obj, elm_layout_edje_get(obj), "right_bt_month");
>          if (sd->month_access)
>            _elm_access_edje_object_part_object_unregister
> -            (obj, elm_layout_edje_get(obj), "month_text");
> +            (obj, elm_layout_edje_get(obj), "text_month");
> +
> +        if (sd->dec_btn_year_access)
> +          _elm_access_edje_object_part_object_unregister
> +            (obj, elm_layout_edje_get(obj), "left_bt_year");
> +        if (sd->inc_btn_year_access)
> +          _elm_access_edje_object_part_object_unregister
> +            (obj, elm_layout_edje_get(obj), "right_bt_year");
> +        if (sd->year_access)
> +          _elm_access_edje_object_part_object_unregister
> +            (obj, elm_layout_edje_get(obj), "text_year");
>       }
>  }
>
> @@ -1238,7 +1371,7 @@
>     *ret = EINA_TRUE;
>  }
>
> -EAPI void
> +EINA_DEPRECATED EAPI void
>  elm_calendar_format_function_set(Evas_Object *obj,
>                                   Elm_Calendar_Format_Cb format_function)
>  {
> @@ -1253,7 +1386,6 @@
>     Elm_Calendar_Smart_Data *sd = _pd;
>
>     sd->format_func = format_function;
> -   _set_month_year(sd);
>  }
>
>  EAPI Elm_Calendar_Mark *
>
> Modified: trunk/elementary/src/lib/elm_calendar.h
> ===================================================================
> --- trunk/elementary/src/lib/elm_calendar.h     2013-01-03 20:48:52 UTC
> (rev 82107)
> +++ trunk/elementary/src/lib/elm_calendar.h     2013-01-03 20:50:10 UTC
> (rev 82108)
> @@ -640,7 +640,7 @@
>   *
>   * @ingroup Calendar
>   */
> -EAPI void                 elm_calendar_format_function_set(Evas_Object
> *obj, Elm_Calendar_Format_Cb format_func);
> +EINA_DEPRECATED EAPI void
> elm_calendar_format_function_set(Evas_Object *obj, Elm_Calendar_Format_Cb
> format_func);
>
>  /**
>   * Add a new mark to the calendar
>
> Modified: trunk/elementary/src/lib/elm_widget_calendar.h
> ===================================================================
> --- trunk/elementary/src/lib/elm_widget_calendar.h      2013-01-03
> 20:48:52 UTC (rev 82107)
> +++ trunk/elementary/src/lib/elm_widget_calendar.h      2013-01-03
> 20:50:10 UTC (rev 82108)
> @@ -34,15 +34,18 @@
>     int                      year_min, year_max, spin_speed;
>     int                      today_it, selected_it, first_day_it;
>     Elm_Calendar_Weekday     first_week_day;
> -   Ecore_Timer             *spin, *update_timer;
> +   Ecore_Timer             *spin_month, *spin_year, *update_timer;
>     Elm_Calendar_Format_Cb   format_func;
>     const char              *weekdays[ELM_DAY_LAST];
>     struct tm                current_time, selected_time, shown_time;
>     Day_Color                day_color[42]; // EINA_DEPRECATED
>     Elm_Calendar_Select_Mode select_mode;
> -   Evas_Object             *inc_btn_access;
> -   Evas_Object             *dec_btn_access;
> +   Evas_Object             *inc_btn_month_access;
> +   Evas_Object             *dec_btn_month_access;
>     Evas_Object             *month_access;
> +   Evas_Object             *inc_btn_year_access;
> +   Evas_Object             *dec_btn_year_access;
> +   Evas_Object             *year_access;
>     Eina_Bool                selected : 1;
>     Elm_Calendar_Selectable  selectable;
>  };
>
>
>
> ------------------------------------------------------------------------------
> Master Visual Studio, SharePoint, SQL, ASP.NET, C# 2012, HTML5, CSS,
> MVC, Windows 8 Apps, JavaScript and much more. Keep your skills current
> with LearnDevNow - 3,200 step-by-step video tutorials by Microsoft
> MVPs and experts. ON SALE this month only -- learn more at:
> http://p.sf.net/sfu/learnmore_122712
> _______________________________________________
> enlightenment-svn mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/enlightenment-svn
>
------------------------------------------------------------------------------
Master Visual Studio, SharePoint, SQL, ASP.NET, C# 2012, HTML5, CSS,
MVC, Windows 8 Apps, JavaScript and much more. Keep your skills current
with LearnDevNow - 3,200 step-by-step video tutorials by Microsoft
MVPs and experts. SALE $99.99 this month only -- learn more at:
http://p.sf.net/sfu/learnmore_122912
_______________________________________________
enlightenment-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to