본문 바로가기

IT/Tizen

[EFL/Tizen 타이젠] edc - SWALLOW 타입(fixed, elm_layout_content_set)

Swallow 타입을 이용하여,

C에서 생성한 오브젝트를 edc에 넣을 수 있습니다.

사실 edc에서 사용하는 모든 타입은 C에서도 그대로 만들 수 있습니다.

이 말은 굳이 edc를 사용하지 않아도 C로만 화면 구성을 할 수 있다는 것이지요.


하지만, edc는 레이아웃에 특화 되어 있습니다.

화면 구성을 edc 빼고 논할 수는 없지요.

그래서 edc에서는 화면 구성을 하고,

나머지 필수 요소는 Swallow 타입을 이용하여,

C에서 코딩하곤 합니다.



안녕하세요, Tizen 개발자 윤진입니다.


SWALLOW는 파트의 기본적인 타입 중에 하나입니다.

C에서 생성한 오브젝트를 edc의 SWALLOW에 넣을 수 있습니다.


collections - group - part { ... type: SWALLOW ... }


SWALLOW 파트로만 이뤄진 그룹을 하나 보겠습니다.

repo. : git://review.tizen.org/framework/uifw/elementary

branch : tizen_2.3

source : data/themes/widgets/conformant.edc


group { name: "elm/conformant/base/default";
   parts {
      part { name: "elm.swallow.indicator";
         type: SWALLOW;
         description { state: "default" 0.0;
            fixed: 0 1;
            align: 0.0 0.0;
            rel2.relative: 1.0 0.0;
         }
      }
      part { name: "elm.swallow.content";
         type: SWALLOW;
         description { state: "default" 0.0;
            fixed: 0 1;
            align: 0.5 0.5;
            rel1.relative: 0.0 1.0;
            rel1.to_y: "elm.swallow.indicator";
            rel2.relative: 1.0 0.0;
            rel2.to_y: "elm.swallow.clipboard";
         }
      }
      part { name: "elm.swallow.clipboard";
         type: SWALLOW;
         description { state: "default" 0.0;
            fixed: 0 1;
            align: 0.0 1.0;
            rel1.relative: 0.0 0.0;
            rel1.to_y: "elm.swallow.virtualkeypad";
            rel2.relative: 1.0 0.0;
            rel2.to_y: "elm.swallow.virtualkeypad";
         }
      }
      part { name: "elm.swallow.virtualkeypad";
         type: SWALLOW;
         description { state: "default" 0.0;
            fixed: 0 1;
            align: 0.0 1.0;
            rel1.relative: 0.0 0.0;
            rel1.to_y: "elm.swallow.softkey";
            rel2.relative: 1.0 0.0;
            rel2.to_y: "elm.swallow.softkey";
         }
      }
      part { name: "elm.swallow.softkey";
         type: SWALLOW;
         description { state: "default" 0.0;
            fixed: 0 1;
            align: 0.0 1.0;
            rel1.relative: 0.0 1.0;
         }
      }
   }
}


위의 소스에 SWALLOW 타입을 사용할 때 주의해야하는 점이 있습니다.

우선, rel1 / rel2에서 영역을 제대로 잡아주지 않고 있는 것을 기억하세요.

위의 rel1 / rel2는 '면'으로 영역을 확정하지 않고 '점'이나 '선'이 되도록 설정하고 있습니다.

'점'이나 '선'은 크기가 없지요.


그렇다면 크기는 어디서 설정해주고 있는 것일까요?

위의 edc 파일에서는 min이 전혀 보이지 않으므로 c 파일에서 min을 설정해주었다고 유추할 수 있습니다.

C에서 evas_object_size_hint_min_set() 함수로 영역의 최소값을 정하였겠지요.

C 파일단에서 크기를 확정하고 Swallow 영역에 대입한다는 사실에 주목해야 합니다.


fixed가 사용되고 있는 점도 주의하세요.

(fixed와 관련해서는 이 포스트를 참고해주세요.)

c에서 설정한 min값으로 부모 영역의 크기에 영향을 주지 않기 위해서 fixed를 사용했습니다.


어쨌든 SWALLOW 파트에 오브젝트를 넣을거면, SWALLOW 파트는 fixed 처리하는게 좋습니다.

fixed를 1로 처리 하여 SWALLOW 파트의 크기에 직접적으로 영향을 미치지 못하게 하지요.


물론, c 파일에서 설정한 min값이 SWALLOW 타입의 파트에도 적용이 되어야 한다면,

fixed를 1로 처리해서는 안됩니다.

fixed: 0 0;과 같은 방식으로 설정하면 됩니다.


SWALLOW 파트 중에 "elm.swallow.indicator" 파트에 들어가는 부분을 C에서 발췌하였습니다.

SWALLOW에 넣을 오브젝트를 생성(_create_xxxx_indicator())하고,

elm_layout_content_set()을 사용하여 레이아웃 내에 위치하는 SWALLOW 파트에 넣고 있네요.


   if (indmode == ELM_WIN_INDICATOR_SHOW)
     {
        old_indi = elm_layout_content_get(conformant, INDICATOR_PART);

        //create new indicator
        if (!old_indi)
          {
             if ((sd->rot == 90)||(sd->rot == 270))
               {
                  if (!sd->landscape_indicator)
                    sd->landscape_indicator = _create_landscape_indicator(conformant);

                  if (!sd->landscape_indicator) return;

                  evas_object_show(sd->landscape_indicator);
                  elm_layout_content_set(conformant, INDICATOR_PART, sd->landscape_indicator);
               }
             else
               {
                  if (!sd->portrait_indicator)
                    sd->portrait_indicator = _create_portrait_indicator(conformant);

                  if (!sd->portrait_indicator) return;

                  evas_object_show(sd->portrait_indicator);
                  elm_layout_content_set(conformant, INDICATOR_PART, sd->portrait_indicator);
               }

          }
        elm_object_signal_emit(conformant, "elm,state,indicator,show", "elm");


C에서는 오브젝트를 만들고,

elm_layout_content_set()을 이용하여 SWALLOW 영역에 넣어줍니다.

오브젝트를 만들고 사이즈를 관리하는 법에 대해서는 차후에 다시 설명하겠습니다.


SWALLOW 파트를 만들고,

거기에 넣을 오브젝트를 C파일에서 만들어 간단하게나마 연동해 보았습니다.


오늘은 여기까지 하겠습니다.

그럼 좋은 하루 보내세요~

끝_