Blame platform-demos/ko/image-viewer.vala.page

Packit 1470ea
Packit 1470ea
<page xmlns="http://projectmallard.org/1.0/" xmlns:its="http://www.w3.org/2005/11/its" type="topic" id="image-viewer.vala" xml:lang="ko">
Packit 1470ea
Packit 1470ea
  <info>
Packit 1470ea
  <title type="text">그림 보기(Vala)</title>
Packit 1470ea
    <link type="guide" xref="vala#examples"/>
Packit 1470ea
Packit 1470ea
    <desc>간단한 "Hello world" GTK+ 프로그램에 약간의 무언가가 더 들어갑니다.</desc>
Packit 1470ea
Packit 1470ea
    <revision pkgversion="0.1" version="0.1" date="2011-03-18" status="review"/>
Packit 1470ea
    <credit type="author">
Packit 1470ea
      <name>그놈 문서 프로젝트</name>
Packit 1470ea
      <email its:translate="no">gnome-doc-list@gnome.org</email>
Packit 1470ea
    </credit>
Packit 1470ea
    <credit type="author">
Packit 1470ea
      <name>Johannes Schmid</name>
Packit 1470ea
      <email its:translate="no">jhs@gnome.org</email>
Packit 1470ea
    </credit>
Packit 1470ea
    <credit type="author">
Packit 1470ea
      <name>Philip Chimento</name>
Packit 1470ea
      <email its:translate="no">philip.chimento@gmail.com</email>
Packit 1470ea
    </credit>
Packit 1470ea
    <credit type="editor">
Packit 1470ea
     <name>Tiffany Antopolski</name>
Packit 1470ea
     <email its:translate="no">tiffany.antopolski@gmail.com</email>
Packit 1470ea
    </credit>
Packit 1470ea
  <credit type="editor">
Packit 1470ea
    <name>Marta Maria Casetti</name>
Packit 1470ea
    <email its:translate="no">mmcasetti@gmail.com</email>
Packit 1470ea
    <years>2013</years>
Packit 1470ea
  </credit>
Packit 1470ea
  
Packit 1470ea
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
Packit 1470ea
      <mal:name>조성호</mal:name>
Packit 1470ea
      <mal:email>shcho@gnome.org</mal:email>
Packit 1470ea
      <mal:years>2017</mal:years>
Packit 1470ea
    </mal:credit>
Packit 1470ea
  </info>
Packit 1470ea
Packit 1470ea
<title>그림 보기</title>
Packit 1470ea
<synopsis>
Packit 1470ea
  

이 따라하기 지침서에서는 그림 파일을 열고 보여주는 프로그램을 만듭니다. 다음을 배워나갑니다:

Packit 1470ea
  <list type="numbered">
Packit 1470ea
    <item>

<link xref="getting-ready">안주타 IDE</link>로 기본 프로젝트를 설정하는 방법.

</item>
Packit 1470ea
    <item>

Vala 프로그래밍 언어로 <link href="http://developer.gnome.org/platform-overview/stable/gtk">Gtk 프로그램</link>을 작성하는 방법

</item>
Packit 1470ea
    <item>

<link href="http://developer.gnome.org/gobject/stable/">GObject</link> 프로그래밍 일부 기본 개념

</item>
Packit 1470ea
Packit 1470ea
  </list>
Packit 1470ea
  

이 지침을 따라갈 수 있으려면 다음이 필요합니다:

Packit 1470ea
  <list>
Packit 1470ea
    <item>

<link href="https://live.gnome.org/Vala/Tutorial">Vala</link> 프로그래밍 언어 기본 지식.

</item>
Packit 1470ea
    <item>

<app>안주타</app> 설치 사본.

</item>
Packit 1470ea
    <item>

이 따라하기 지침서에선 별로 필요하지 않지만 쓸만한 <link href="http://valadoc.org/gtk+-3.0/">gtk+-3.0</link> API 참고서를 찾아보시는 것도 좋습니다.

</item>
Packit 1470ea
  </list>
Packit 1470ea
</synopsis>
Packit 1470ea
Packit 1470ea
<media type="image" mime="image/png" src="media/image-viewer.png"/>
Packit 1470ea
Packit 1470ea
<section id="anjuta">
Packit 1470ea
  <title>안주타에서 프로젝트 만들기</title>
Packit 1470ea
  

코딩을 시작하기 전에 안주타에서 새 프로젝트를 설정해야합니다. 이 프로그램은 빌드에 필요한 모든 파일을 만들고 그 다음 코드를 실행합니다. 또한 이 모든 상태를 유지 관리하는데 쓸만합니다.

Packit 1470ea
  <steps>
Packit 1470ea
    <item>
Packit 1470ea
      

<app>안주타</app> 를 시작하고 <gui>새 프로젝트 만들기</gui> 또는 <guiseq><gui>파일</gui><gui>새로 만들기</gui><gui>프로젝트</gui></guiseq> 를 눌러 프로젝트 마법사를 여십시오.

Packit 1470ea
    </item>
Packit 1470ea
    <item>
Packit 1470ea
      

<gui>Vala</gui> 탭에서 <gui>GTK+ (단순)</gui>을 선택하고 <gui>계속</gui>을 누른 다음, 나타난 페이지에서 몇가지 자세한 내용을 입력하십시오. 프로젝트 이름과 디렉터리에 <file>image-viewer</file>를 입력하십시오.

Packit 1470ea
   	</item>
Packit 1470ea
    <item>
Packit 1470ea
      

따라하기 지침을 통해 사용자 인터페이스를 직접 만들 예정이므로 <gui>사용자 인터페이스에 GtkBuilder 사용</gui> 설정을 껐는지 확인하십시오.

Packit 1470ea
     <note>

<link xref="guitar-tuner.vala">기타 조율 프로그램</link> 따라하기 지침서에서 인터페이스 빌더 사용법을 배웁니다.

</note>
Packit 1470ea
    </item>
Packit 1470ea
    <item>
Packit 1470ea
      

<gui>계속</gui>을 누르고 <gui>적용</gui>을 누르면 프로젝트를 만들어줍니다. <gui>프로젝트</gui>나 <gui>파일</gui>탭에서 <file>src/image_viewer.vala</file> 파일을 여십시오. 다음 코드가 나타납니다:

Packit 1470ea
      
Packit 1470ea
using GLib;
Packit 1470ea
using Gtk;
Packit 1470ea
Packit 1470ea
public class Main : Object
Packit 1470ea
{
Packit 1470ea
Packit 1470ea
	public Main ()
Packit 1470ea
	{
Packit 1470ea
		Window window = new Window();
Packit 1470ea
		window.set_title ("Hello World");
Packit 1470ea
		window.show_all();
Packit 1470ea
		window.destroy.connect(on_destroy);
Packit 1470ea
	}
Packit 1470ea
Packit 1470ea
	public void on_destroy (Widget window)
Packit 1470ea
	{
Packit 1470ea
		Gtk.main_quit();
Packit 1470ea
	}
Packit 1470ea
Packit 1470ea
	static int main (string[] args)
Packit 1470ea
	{
Packit 1470ea
		Gtk.init (ref args);
Packit 1470ea
		var app = new Main ();
Packit 1470ea
Packit 1470ea
		Gtk.main ();
Packit 1470ea
Packit 1470ea
		return 0;
Packit 1470ea
	}
Packit 1470ea
}
Packit 1470ea
    </item>
Packit 1470ea
  </steps>
Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="build">
Packit 1470ea
  <title>첫 코드 작성</title>
Packit 1470ea
  

이 코드는 (빈) 창을 사용자 인터페이스 설명 파일에서 불러오고 화면에 나타냅니다. 자세한 내용은 아래에 있습니다. 기본을 이해하셨다면 이 부분은 넘어가셔도 됩니다:

Packit 1470ea
Packit 1470ea
  <list>
Packit 1470ea
    <item>
Packit 1470ea
      

상단의 using 줄 두 줄에서는 이름 영역을 임포팅하여 해당 이름을 코드상에서 굳이 언급할 필요가 없게 해줍니다.

Packit 1470ea
    </item>
Packit 1470ea
    <item>
Packit 1470ea
      

Main 클래스의 생성자는 (비어 있는) 새 창을 만들고 창을 닫을 때 프로그램을 빠져나갈 <link href="https://live.gnome.org/Vala/SignalsAndCallbacks">시그널</link>을 연결합니다.

Packit 1470ea
      

시그널 연결은 단추를 누르거나 어떤 동작을 취할 때 처리할 일을 정의하는 방식입니다. 여기서 창을 닫을 때 destroy 함수를 호출(하고 앱을 끝내기)합니다.

Packit 1470ea
    </item>
Packit 1470ea
    <item>
Packit 1470ea
      

static main 함수는 Vala 프로그램을 시작할 때 기본으로 실행하는 함수입니다. Main 클래스를 만들고 설정한 다음 프로그램을 실행하는 몇가지 함수를 호출합니다. <link href="http://valadoc.org/gtk+-3.0/Gtk.main.html">Gtk.main</link> 함수는 사용자 인터페이스를 실행하고 이벤트(마우스 단추 누름과 키 누름) 대기를 시작하는 GTK <link href="http://en.wikipedia.org/wiki/Event_loop">메인 루프</link>를 시작합니다.

Packit 1470ea
    </item>
Packit 1470ea
  </list>
Packit 1470ea
Packit 1470ea
  

이 코드를 사용할 준비가 됐으니 <guiseq><gui>빌드</gui><gui>프로젝트 빌드</gui></guiseq>(또는 <keyseq><key>Shift</key><key>F7</key></keyseq> 키 누름)를 눌러 코드를 컴파일할 수 있습니다.

Packit 1470ea
  

<gui>설정</gui>을 <gui>기본</gui>으로 바꾸고 <gui>실행</gui>을 눌러 빌드 디렉터리를 설정하십시오. 처음 빌드 때 한 번만 실행하면 됩니다.

Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="ui">
Packit 1470ea
  <title>사용자 인터페이스 만들기</title>
Packit 1470ea
  

이제 비어있는 창에 숨결을 불어넣겠습니다. GTK는 다른 위젯을 넣을 수 있고 다른 컨테이너도 넣을 수 있는 <link href="http://www.valadoc.org/gtk+-2.0/Gtk.Container.html">Gtk.Container</link>로 사용자 인터페이스를 모아둡니다. 여기서는 여러가지 컨테이너 중 가장 간단한 <link href="http://unstable.valadoc.org/gtk+-2.0/Gtk.Box.html">Gtk.Box</link>를 사용하겠습니다.

Packit 1470ea
Packit 1470ea

Main 클래스 상단에 다음 줄을 추가하십시오:

Packit 1470ea
  
Packit 1470ea
private Window window;
Packit 1470ea
private Image image;
Packit 1470ea
Packit 1470ea
Packit 1470ea

이제 현재 생성자를 아래 내용으로 바꾸겠습니다:

Packit 1470ea
Packit 1470ea
Packit 1470ea
public Main () {
Packit 1470ea
Packit 1470ea
	window = new Window ();
Packit 1470ea
	window.set_title ("Image Viewer in Vala");
Packit 1470ea
Packit 1470ea
	// Set up the UI
Packit 1470ea
	var box = new Box (Orientation.VERTICAL, 5);
Packit 1470ea
	var button = new Button.with_label ("Open image");
Packit 1470ea
	image = new Image ();
Packit 1470ea
Packit 1470ea
	box.pack_start (image, true, true, 0);
Packit 1470ea
	box.pack_start (button, false, false, 0);
Packit 1470ea
	window.add (box);
Packit 1470ea
Packit 1470ea
	// Show open dialog when opening a file
Packit 1470ea
	button.clicked.connect (on_open_image);
Packit 1470ea
Packit 1470ea
	window.show_all ();
Packit 1470ea
	window.destroy.connect (main_quit);
Packit 1470ea
}
Packit 1470ea
Packit 1470ea
  <steps>
Packit 1470ea
    <item>
Packit 1470ea
      

처음 두 줄은 하나 이상의 메서드에서 접근할 GUI 부분입니다. 이 부분을 여기에 선언하여 메서드를 만든 부분에서만 쓰는게 아니라 전 클래스에 걸쳐 쓸 수 있게 합니다.

Packit 1470ea
    </item>
Packit 1470ea
    <item>
Packit 1470ea
      

생성자 처음 줄에서는 빈 창을 만듭니다. 다음 줄에서는 우리가 쓰려는 위젯을 만듭니다. 그림을 여는 단추, 그림 보기 위젯 자체, 컨테이너로 쓸 상자 위젯이 있습니다.

Packit 1470ea
    </item>
Packit 1470ea
    <item>
Packit 1470ea
      

<link href="http://unstable.valadoc.org/gtk+-2.0/Gtk.Box.pack_start.html">pack_start</link> 호출로 박스에 두 위젯을 추가하고 동작을 정의합니다. 그림은 활용 가능한 공간만큼 충분히 확장하고, 단추는 필요한 만큼만 커집니다. 위젯의 크기를 분명하게 설정하지 않음을 알아채셨을 겁니다. GTK에서는 창 크기가 달라져도 보기 좋은 배치를 쉽게하기에 직접 설정할 필요가 없습니다. 이 과정이 끝나면 박스를 창에 추가합니다.

Packit 1470ea
    </item>
Packit 1470ea
    <item>
Packit 1470ea
      

단추를 사용자가 눌렀을 때 어떤 일이 일어날 지 정해야합니다. GTK는 시그널 개념을 활용합니다.

Packit 1470ea
      

<link href="http://valadoc.org/gtk+-3.0/Gtk.Button.html">Button</link>을 누르면, 어떤 동작(<link href="https://live.gnome.org/Vala/SignalsAndCallbacks">콜백</link> 메서드에 정의)을 연결할 수 있는 <link href="http://valadoc.org/gtk+-3.0/Gtk.Button.clicked.html">clicked</link> 시그널을 내보냅니다.

Packit 1470ea
      

사용자가 단추를 누르면 (아직 정하지 않은) on_image_open 콜백 메서드를 호출하여 그림을 이 함수의 인자로 전달하라고 GTK에 지시할 때 connect 메서드를 사용하면 됩니다. 다음 섹션에서 콜백을 정의하겠습니디.

Packit 1470ea
      

콜백 함수에서 window위젯과 image 위젯에 접근해야합니다. 이게 바로 클래스 상단에서 전용 멤버 인스턴스로 설정한 이유입니다.

Packit 1470ea
    </item>
Packit 1470ea
    <item>
Packit 1470ea
      

마지막으로 connect 호출에서는 창을 닫았을 때 프로그램을 끝낼지 확인합니다. 안주타에서 만든 코드는 <link href="http://www.valadoc.org/gtk+-2.0/Gtk.main_quit.html">Gtk.main_quit</link>를 호출하는 on_destroy 콜백 메서드를 호출하지만, 시그널을 main_quit에 바로 연결하는게 더 쉽습니다. on_destroy 메서드를 지울 수 있습니다.

Packit 1470ea
    </item>
Packit 1470ea
  </steps>
Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="image">
Packit 1470ea
  <title>그림 표시</title>
Packit 1470ea
  

앞서 언급한 단추의 clicked 시그널을 처리할 시그널 핸들러를 정의하겠습니다. 이 코드를 생성자 다음에 추가하십시오:

Packit 1470ea
  
Packit 1470ea
public void on_open_image (Button self) {
Packit 1470ea
	var filter = new FileFilter ();
Packit 1470ea
	var dialog = new FileChooserDialog ("Open image",
Packit 1470ea
	                                    window,
Packit 1470ea
	                                    FileChooserAction.OPEN,
Packit 1470ea
	                                    Stock.OK,     ResponseType.ACCEPT,
Packit 1470ea
	                                    Stock.CANCEL, ResponseType.CANCEL);
Packit 1470ea
	filter.add_pixbuf_formats ();
Packit 1470ea
	dialog.add_filter (filter);
Packit 1470ea
Packit 1470ea
	switch (dialog.run ())
Packit 1470ea
	{
Packit 1470ea
		case ResponseType.ACCEPT:
Packit 1470ea
			var filename = dialog.get_filename ();
Packit 1470ea
			image.set_from_file (filename);
Packit 1470ea
			break;
Packit 1470ea
		default:
Packit 1470ea
			break;
Packit 1470ea
	}
Packit 1470ea
	dialog.destroy ();
Packit 1470ea
}
Packit 1470ea
Packit 1470ea
  

좀 복잡하니 하나씩 살펴보도록 하죠:

Packit 1470ea
  <note>

시그널 핸들러는 시그널을 어딘가에서 내보냈을 때 콜백 함수를 호출하게 하는 방식입니다. 이 용어는 서로 바꿔서 사용합니다.

</note>
Packit 1470ea
  <list>
Packit 1470ea
    <item>
Packit 1470ea
      

콜백 메서드의 첫번째 인자는 항상 시그널을 보낸 위젯입니다. 때로는 뒤 따라오는 다른 인자가 시그널에 관련이 있지만, clicked는 그렇지 않습니다.

Packit 1470ea
      

이 경우 button에서 on_open_image 콜백 함수에 연결한 clicked 시그널을 내보냅니다:

Packit 1470ea
Packit 1470ea
        button.clicked.connect (on_open_image);
Packit 1470ea
Packit 1470ea
Packit 1470ea
  

on_open_image 메서드는 시그널을 방출한 단추를 인저로 취합니다:

Packit 1470ea
 
Packit 1470ea
        public void on_open_image (Button self)
Packit 1470ea
Packit 1470ea
    </item>
Packit 1470ea
    <item>
Packit 1470ea
      

다음 흥미로운 부분은 파일을 선택하는 대화상자를 만드는 부분입니다. <link href="http://www.valadoc.org/gtk+-3.0/Gtk.FileChooserDialog.html">FileChooserDialog</link>의 생성자는 대화 상자 제목, 대화 상자의 상위 창, 단추 갯수와 각각의 값 같은 몇가지 옵션을 취합니다.

Packit 1470ea
      

직접 "취소" 또는 "열기"라고 입력하는 대신, Gtk에서 가져온 <link href="http://unstable.valadoc.org/gtk+-3.0/Gtk.Stock.html">stock</link> 단추 이름을 사용하고 있음을 참고하십시오. 스톡 이름을 사용하면 사용자의 언어로 이미 번역한 단추 레이블을 사용합니다.

Packit 1470ea
    </item>
Packit 1470ea
    <item>
Packit 1470ea
      

다음 두 줄은 <gui>열기</gui> 대화 상자에서 GtkImage로만 열 수 있는 파일을 표시하도록 제한합니다. 필터 객체를 우선 만듭니다. 그 다음 <link href="http://www.valadoc.org/gdk-pixbuf-2.0/Gdk.Pixbuf.html">Gdk.Pixbuf</link>에서 지원하는 파일 종류(PNG와 JPEG 같은 대부분의 그림 형식)를 필터에 추가합니다. 마지막으로 이 필터를 <gui>열기</gui> 대화 상자의 필터로 설정합니다.

Packit 1470ea
    </item>
Packit 1470ea
    <item>
Packit 1470ea
      

<link href="http://www.valadoc.org/gtk+-3.0/Gtk.Dialog.run.html">dialog.run</link>은 <gui>열기</gui> 대화 상자를 표시합니다. 대화 상자는 사용자의 그림 선택을 기다립니다. 사용자가 그림을 선택하면 dialog.run 에서 ResponseType.ACCEPT 값을 반환합니다(<gui>취소</gui>를 누르면 ResponseType.CANCEL 값을 반환합니다). switch 구문에서는 어떤 값을 반환했는지 확인합니다.

Packit 1470ea
    </item>
Packit 1470ea
    <item>
Packit 1470ea
      

사용자가 <gui>열기</gui>를 눌렀다고 한 상황에서, 다음 줄에서 사용자가 선택한 그림의 파일 이름을 가져오고, GtkImage 위젯으로 선택한 그림을 불러오고 화면에 표시합니다.

Packit 1470ea
    </item>
Packit 1470ea
    <item>
Packit 1470ea
      

이 메서드의 마지막 줄에서는 <gui>열기</gui> 대화상자는 더 이상 필요 없으니 해체합니다.

Packit 1470ea
      

해체할 때는 대화상자를 자동으로 숨깁니다.

Packit 1470ea
    </item>
Packit 1470ea
  </list>
Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="run">
Packit 1470ea
  <title>프로그램 빌드 및 실행</title>
Packit 1470ea
  

모든 코드를 실행할 준비가 됐습니다. <guiseq><gui>빌드</gui><gui>프로젝트 빌드</gui></guiseq>를 눌러 프로젝트 전체를 다시 빌드하고, <guiseq><gui>실행</gui><gui>실행</gui></guiseq>을 눌러 프로그램을 시작하십시오.

Packit 1470ea
  

아직 끝나지 않았다면, 대화상자에 나타난 <file>src/image-viewer</file> 프로그램을 선택하십시오. 마지막으로 <gui>실행</gui>을 선택하고 즐기시지요!

Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="impl">
Packit 1470ea
  <title>참조 구현체</title>
Packit 1470ea
  

지침서를 따라하는 실행하는 과정에 문제가 있다면, <link href="image-viewer/image-viewer.vala">참조 코드</link>와 여러분의 코드를 비교해보십시오.

Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="next">
Packit 1470ea
  <title>다음 단계</title>
Packit 1470ea
  

여기 간단한 시험 프로그램에 여러분이 추가로 넣을 수 있는 몇가지 아이디어가 있습니다:

Packit 1470ea
  <list>
Packit 1470ea
  <item>

창을 열었을 때 지정 크기로 시작하도록 설정하십시오. 예를 들면 200 X 200 픽셀 크기입니다.

</item>
Packit 1470ea
   <item>
Packit 1470ea
     

파일을 선택하기 보단 디렉터리를 선택하게 하고, 디렉터리의 모든 그림을 보여줄 수 있는 컨트롤을 제어 기능을 제공합니다.

Packit 1470ea
   </item>
Packit 1470ea
   <item>
Packit 1470ea
     

사용자가 그림을 불러오고 수정한 그림을 저장할 때 임의 필터와 효과를 그림에 적용하십시오.

Packit 1470ea
     

<link href="http://www.gegl.org/api.html">GEGL</link>에서는 강력한 그림 편집 기능을 제공합니다.

Packit 1470ea
   </item>
Packit 1470ea
   <item>
Packit 1470ea
     

네트워크 공유, 스캐너, 다른 복잡한 공급원에서 그림을 불러올 수 있습니다.

Packit 1470ea
     

You can use <link href="http://library.gnome.org/devel/gio/unstable/">GIO</link> to handle network file transfers and the like, and <link href="http://library.gnome.org/devel/gnome-scan/unstable/">GNOME Scan</link> to handle scanning.

Packit 1470ea
   </item>
Packit 1470ea
  </list>
Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
</page>