dat.GUI는 값을 GUI를 통해 직관적으로 변경하여 기능을 테스트해 볼 수 있는 javascript 기반의 매우 직관적인 라이브러리입니다.
dat.gui를 js에서 사용하기 위해 간단히 CDN을 통해 아래처럼 페이지에 스크립트를 포함할 수 있습니다.
아래는 dat.GUI의 가장 간단한 예제입니다.
var MyData = function() { this.dataString = "Dip2K"; this.dataNumber = 0.7; this.dataBoolean = false; this.dataFunction = function() { alert( "dataString: " + this.dataString + "\n" + "dataNumber: " + this.dataNumber + "\n" + "dataBoolean: " + this.dataBoolean ); }; }; window.onload = function() { var myData = new MyData(); var gui = new dat.GUI(); gui.add(myData, "dataString"); gui.add(myData, "dataNumber"); gui.add(myData, "dataBoolean"); gui.add(myData, "dataFunction"); }
관리하고자 하는 데이터는 함수에 대한 new 호출을 통한 this에 바인딩되어져야 합니다. 위의 코드를 실행해 보면 아래와 UI가 페이지의 우측 상단에 표시됩니다.
[xyz-ihs snippet=”DAT-GUI-1″]
위의 UI에서 보는 것처럼 함수의 new 호출로 this에 바인딩된 dataString, dataNumber, dataBoolean, dataFunction은 각각의 데이터 타입에 따라 적절한 UI로 표시되며 사용자가 쉽게 변경할 수 있습니다. function 타입의 데이터는 버튼 UI로 표시되며 버튼 클릭시에 해당 함수가 호출됩니다.
이 정도만 되어도 dat.gui를 적절하게 활용할 수 있지만, 여기에 덧붙여 변수값에 대한 제약 조건의 지정 등 다양한 활용이 가능합니다.
예를 들어, dataString 변수에 대해서 입력받을 수 있는 문자열을 Dip2K, James, Anold로 제한하고 싶다면 다음처럼 코드를 작성하면 됩니다.
gui.add(myData, "dataString", ["Dip2K", "James", "Anold"]);
dataNumber에 대해서 0~100 사이의 값만을 입력받으며 0.1 단위로 값의 증가, 감소하고자 한다면 아래처럼 코드를 작성하면 되구요.
gui.add(myData, "dataNumber", 0, 100).step(0.1);
dataNumber가 비록 수치 타입이지만, 항목으로써 선택 받도록 하고 각 항목에 대한 수치값을 지정하는 방식도 가능한데, 아래와 같습니다.
gui.add(myData, "dataNumber", { A: 0, B:50, C:100 });
색상값에 대한 직관적인 입력도 가능합니다. 그 예는 아래와 같습니다.
var MyData = function() { this.dataString = "Dip2K"; this.dataNumber = 50; this.dataBoolean = false; this.dataColor1 = "#ff0000"; this.dataColor2 = [ 0, 255, 0 ]; this.dataColor3 = { h: 350, s: 0.5, v: 0.7 }; this.dataFunction = function() { alert( "dataString: " + this.dataString + "\n" + "dataNumber: " + this.dataNumber + "\n" + "dataBoolean: " + this.dataBoolean + "\n" + "dataColor1: " + this.dataColor1 + "\n" + "dataColor2: " + this.dataColor2 + "\n" + "dataColor3: " + this.dataColor3 ); }; }; window.onload = function() { var myData = new MyData(); var gui = new dat.GUI(); gui.add(myData, "dataString", ["Dip2K", "James", "Anold"]); gui.add(myData, "dataNumber", 0, 100).step(0.1); gui.add(myData, "dataBoolean"); gui.addColor(myData, "dataColor1"); gui.addColor(myData, "dataColor2"); gui.addColor(myData, "dataColor3"); gui.add(myData, "dataFunction"); }
그런데 만약, 값의 변경이 dat.gui가 아닌 다른 곳에서 이루어진 다면, 변경된 값을 dat.gui에서 반영해 줘야 할 것입니다. 이는 매우 간단합니다. 즉, 아래처럼 listen을 호출해 주면 됩니다. 이 listen 함수는 타이머를 생성하고 이 타이머에서 값의 변경 여부를 검사하여 dat.gui에 반영해주게 됩니다.
gui.add(myData, "dataNumber").listen();
끝으로 dat.gui를 통한 값의 변경이 발생하면, 이에 대한 이벤트가 호출되도록 할 수 있는데, 그 예는 아래와 같습니다.
gui.add(myData, "dataNumber").onChange( function(v) { //alert(v); }).onFinishChange( function(v) { alert(v); });
onChange는 값 변경 중의 매 순간 발생하는 이벤트이고, onFinishChange는 최종적인 값의 변경이 발생할 때 호출되는 이벤트입니다.
이외에도 dat.gui는 설정된 값을 localStorage에 저장할 수 있는 기능도 있다는 것도 알아두시면 유용할듯합니다.