IUP: 루아와 궁합이 잘 맞는 GUI 라이브러리

Twitter icon류광, 2011-07-29 16:07
루아 테이블과 자연스럽게 섞이는 GUI 라이브러리, IUP를 소개합니다.

이 글은 일전에 독립 개발자 네트워크에 올린 글을 재활용한 글입니다. 원래 근황을 쓸 타이밍이지만, 몇 가지 마무리지을 것들이 있어서 잠시 미룹니다...

MFC나 ATL를 자유자재로 다루는 분들 보면 부러운데요... 저는 GUI를 예전에 VB와 델파이로 배워서리 C/C++로는 도저히 못하겠더라고요. 그리고 웹 프로그래밍 경험 역시 하드코어한 C/C++ GUI 프로그래밍에 적응하지 못하는 한 요인이 아닐까 합니다.

스크립팅 언어를 위한 GUI 라이브러리들이 있지만, C/C++ GUI를 거의 일대일로 바인딩한 스타일은 비슷한 이유로 적응하기가 힘들었습니다. 예를 들어 wxWidget의 파이썬 바인딩인 wxPython에서 메뉴를 만드는 코드는 이렇습니다. (wxPyWiki의 Getting started with wxPython에서 발췌)

# Setting up the menu.
filemenu= wx.Menu()

# wx.ID_ABOUT and wx.ID_EXIT are standard IDs provided by wxWidgets.
filemenu.Append(wx.ID_ABOUT, "&About"," Information about this program")
filemenu.AppendSeparator()
filemenu.Append(wx.ID_EXIT,"E&xit"," Terminate the program")

# Creating the menubar.
menuBar = wx.MenuBar()
menuBar.Append(filemenu,"&File") # Adding the "filemenu" to the MenuBar

이는 C++ 버전을 거의 그대로 옮긴 것입니다. (http://www.wxwidgets.org/docs/tutorials/hello.htm 에서)

    wxMenu *menuFile = new wxMenu;

    menuFile->Append( ID_About, _("&About...") );
    menuFile->AppendSeparator();
    menuFile->Append( ID_Quit, _("E&xit") );

    wxMenuBar *menuBar = new wxMenuBar;
    menuBar->Append( menuFile, _("&File") );

(물론 이 예만으로 wxPython을 판단하지는 마시길~)

이 글에서 소개할 IUP는 제가 좋아라 하는 루아와 궁합이 아주 잘 맞아서 쉽게 적응할 수 있었습니다. 루아의 특징이라면 무엇보다도 '테이블(정수 색인 배열+연관 배열)'을 아주 다양한 용도로 사용할 수 있다는 것인데요. IUP의 화면 요소 생성 구문은 테이블 구문을 적극적으로 활용합니다. 다음은 하위 메뉴 항목이 있는 메뉴를 만들어서 띄우는 예입니다. ( http://www.tecgraf.puc-rio.br/iup/en/elem/iupmenu.html 에서)

mnu = iup.menu
{
  {
    "IupSubMenu 1",
    iup.menu
    {
      {"IupItem 1 Checked";value="ON"},
      {},
      {"IupItem 2 Disabled";active="NO"}
    } 
  },
  {"IupItem 3"},
  {"IupItem 4"}
}:popup(iup.CENTER, iup.CENTER)

Image

테이블 구문으로 생성한 mnu는 실제로 테이블처럼 작동합니다. 예를 들어 mnu[1]은 "IupSubMenu 1"에 해당하는 항목(역시 테이블)이고 mnu[2]는 "IupItem 3"에 해당하는 항목입니다.

메뉴 항목 선택 시 행동은, 요즘 스크립팅 언어 답게 소위 람다를 이용해서 지정할 수 있습니다.

...
  iup.item{title="IupItem 3", action=function()
     iup.Message("메뉴", "항목 3이 선택되었음")
  end},
...

대화상자, 버튼 등 다른 대부분의 GUI 요소들도 이처럼 루아의 유연한 테이블 구문과 익명 함수 스타일로 만들 수 있습니다.

IUP의 또 다른 매력 하나는 화면 요소의 크기와 위치를 상대적으로 지정할 수 있다는 것입니다. 웹 프로그래밍 때문인지 저는 화면 요소의 위치나 크기를 픽셀 단위로 지정하는 것이 영 불편한데요. IUP의 화면 요소 크기는 현재 선택된 글꼴의 기본 너비와 높이에 상대적입니다. 또한 iup.vbox, iup.hbox라는 상대적 레이아웃을 위한 컨테이너들을 이용해서 컨트롤들을 아주 수월하게 배치할 수 있습니다. (http://www.tecgraf.puc-rio.br/iup/en/elem/iuphbox.htmlhttp://www.tecgraf.puc-rio.br/iup/en/elem/iupvbox.html 하단에 스크린샷들이 있습니다.)


이상으로 간단하게나마 소개를 마칩니다. 간단한 GUI 프로그램을 후딱 만들 일이 자주 있다면 IUP에 한 두 시간 정도 시간을 투자해 보시길 권합니다.

IUP 홈페이지: http://www.tecgraf.puc-rio.br/iup/

다음에 기회가 되면 VC++과 GCC(Code::Blocks)의 IUP 라이브러리 설정과 간단한 런처 프로그램(C++) 작성에 대해 써보겠습니다.

p.s. 이 IUP와 루아 winapi(http://stevedonovan.github.com/winapi/), 특히 winapi.spawn 을 결합하면 개발용 유틸리티 같은 것들을 아주 편하게 만들어 낼 수 있습니다. 기존의(또는 간단하게 콘솔 버전으로 작성한) 명령줄 유틸리티를 IUP로 감싸는 방식으로요.

태그: 프로그래밍 Lua

comments powered by Disqus

예전 댓글(읽기 전용)