IUP: 루아와 궁합이 잘 맞는 GUI 라이브러리
루아 테이블과 자연스럽게 섞이는 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)
테이블 구문으로 생성한 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.html 와 http://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로 감싸는 방식으로요.
예전 댓글(읽기 전용)
-
댓글 고맙습니다~ 루아 사용자들이 좀 더 많아졌으면 좋겠는데 저부터라도 루아 관련 글을 종종 올려야겠습니다.
저도 루아를 좋아하는데 요즘은 거의 하지 못하네요. 루아에서도 GUI 가능한 툴킷이 나오다니 반갑네요. 좋은 정보입니다.