ProjucerのGUIエディタを紹介してみる

本記事は [JUCE Advent Calendar 2017](https://qiita.com/advent-calendar/2017/juce)  の12月4日向けに投稿した記事です。

JUCEフレームワークにおいて、Projucer（プロジェクトマネージャ）は、最も重要なツールであり、無くてはならない存在です。実は、Projucerにはプロジェクト設定を管理する機能だけでなく、GUIコンポーネントを画面上で開発するビジュアルエディタが内蔵されていることはご存知でしたでしょうか？
本記事では、Projucerに組み込まれているビジュアルエディタ（GUIエディタ)の機能や使い方について、簡単に紹介します。


## 1. GUIコンポーネントのソースファイルを追加する

![AddNewComponent.PNG](https://qiita-image-store.s3.amazonaws.com/0/93566/a6aafe6b-2ae6-3a20-7e99-6f287cf10975.png)



## 2. 追加したソースファイルを開く

追加された"NewComponenth.h/cpp"のうち、NewComponent.cppファイルを選択すると右側ペインにGUIエディタが出現します。


![GUIClass.PNG](https://qiita-image-store.s3.amazonaws.com/0/93566/a194925f-c284-0798-147d-b94f9b1f6674.png)


## 3. GUIエディタの機能について

### 3-1．[Class]タブ
このコンポーネントのクラス名や初期サイズ、追加実装するコールバック関数等のオプションを設定します

![GUIClass.PNG](https://qiita-image-store.s3.amazonaws.com/0/93566/a325160e-ca40-1d43-8c91-00a4bde37b77.png)


### 3-2. [SubComponents]タブ
スライダーやボタンなどのGUIコンポーネントを配置したり、各種オプション設定を画面上で行います。

![SubComponents.PNG](https://qiita-image-store.s3.amazonaws.com/0/93566/d1a357a2-8d4b-7d0e-e0ab-5b3cd17c4672.png)


### 3-3. [Graphics]タブ

背景色の変更、四角形、丸などのグラフィック要素の配置、JPEGやPNGなどの画像ファイルを配置します。

![Graphics.PNG](https://qiita-image-store.s3.amazonaws.com/0/93566/be8c2c2e-5a6f-4491-8854-fd5beb4b6ee8.png)


### 3-4. [Resources]タブ

取り込んだJPEGやPNGなどの画像ファイルをリソースファイルとして管理します。

![Reources.PNG](https://qiita-image-store.s3.amazonaws.com/0/93566/d73265c0-6598-a9ab-65f3-6382dc02fd82.png)


### 3-5. [Code]タブ

各種タブで設定したものが反映されたソースコードがProjucerによって生成されます。

![GenCode.PNG](https://qiita-image-store.s3.amazonaws.com/0/93566/fa475296-3243-e3be-d6d8-481b995a1287.png)

最終的には[Code]タブに表示されるソースコードがGUIエディタの成果物となります。
その正体は、メタプログラミングの塊となっており、デリケートに扱う必要があります。明示的に許可された箇所（コメントアウトに挟まれている）以外に変更を加えた場合に、Projucerが勝手に書き直してしまうことがありますので、その点ご注意ください。

明示的に許可されている箇所の一例

```C++

//[UserPrePaint] Add your own custom painting code here..

ユーザー独自のコードを書く
ここに書いたコードはProjucerから変更されないい

//[/UserPrePaint]

```

## 4. 使ってみる
 
### 4-1．[Class]タブでクラス名を変更する

クラス名を"NewComponent" → "AdventCalendar"に変更してみます

![ClassName.PNG](https://qiita-image-store.s3.amazonaws.com/0/93566/f3fbebfa-5255-8937-52e6-73d16b6eee63.png)

[Code]タブに切り替えると、クラス名が"NewComponent" → "AdventCalendar"に変更されていることが確認できます。

![ClassName_code.PNG](https://qiita-image-store.s3.amazonaws.com/0/93566/b1ed90e4-b699-47d7-5856-0ded6bb5c830.png)


### 4-2．[Class]タブでコールバック関数を追加する

マウスがクリックされると実行されるコールバック関数"mouseDown"を追加します。
"void Component::mouseDown ~"にチェックを付けましょう。

![GUIClass_mouse.PNG](https://qiita-image-store.s3.amazonaws.com/0/93566/45eecd1a-33d3-a835-8b2f-f17333dbcb2e.png)


[Code]タブに切り替えると、クラス名が"NewComponent" → "AdventCalendar"に変更されていることが確認できます。関数"void AdventCalendar::mouseDown (const MouseEvent& e) {}"がコード上に定義されます。

![GenCode_mouse.PNG](https://qiita-image-store.s3.amazonaws.com/0/93566/e1a8f252-c81b-b0d0-b97c-49dcd5003904.png)


### 4-3. [SubComponents]タブでスライダーを追加する

グリッドが表示されているエリアで[右クリック] → [New Slider]をクリックします

![SubCompo.PNG](https://qiita-image-store.s3.amazonaws.com/0/93566/ef36d2ea-ad4e-d626-fea3-696f84a9bbad.png)

グリッド上にスライダーコンポーネントが追加されます。また、スライダーを選択した状態の時（バウンディングボックスに囲まれている時）には、グリッドの右横にスライダーコンポーネントの各種オプション設定が表示されます。
[type]オプションを"Linear"タイプから、"Rotatry"タイプに変更、大きさを変更、カラー設定を変更してみみたした。変更したオプションがリアルタイムに反映されるため、GUIの編集が簡単にでき、また、GUIコンポーネントが持つオプション項目がどのように作用するかについても知ることができます。

![SubComponents_slider_rotary.PNG](https://qiita-image-store.s3.amazonaws.com/0/93566/11f0e7dc-c700-4143-8e9b-65133f6e1f7d.png)


### 4-4. [Graphics]タブで背景色を変更する

[background]オプションをクリックするとカラーパレットが開き、背景色を変更することが出来ます。

![Graphics_bg.PNG](https://qiita-image-store.s3.amazonaws.com/0/93566/d489ec38-eaf6-db7c-900e-95a0650d123f.png)

### 4-4. [Graphics]タブで画像を挿入する

グリッドが表示されているエリアで[右クリック] → [New Image]をクリックします

![Graphics_bg_2.PNG](https://qiita-image-store.s3.amazonaws.com/0/93566/bbe9d02b-c760-3d8b-b0d0-aeb698bb0b00.png)

"(image missing)"と表示された四角い枠がグリッド上に追加されます。

![Graphics_bg_3.PNG](https://qiita-image-store.s3.amazonaws.com/0/93566/147ab1f8-a0d4-99ff-5f62-3d1cad83299f.png)

[image source]オプションをクリック → [-- create new image resource --] をクリックします。

![Graphics_bg_4.PNG](https://qiita-image-store.s3.amazonaws.com/0/93566/ab76dcf0-2336-de17-bf6a-726bf1af286a.png)


ファイラーが開くので、取り込みたい画像を選択します。画像フォーマットはJPEG, PNG, SVGに対応しています。
今回は、[いらすとやさんの画像](http://www.irasutoya.com/2013/09/dj.html)を取り込み、大きさや位置を調整しました。

![Graphics_bg_5.PNG](https://qiita-image-store.s3.amazonaws.com/0/93566/6bbcab81-b879-7073-5266-1bbfd3db43cd.png)

### 4-5. 作成したコンポーネントの動作確認

メニュー → [GUI Editor] → [Test component...]をクリックすると、ダイアログウインドウが開き、作成したGUIコンポーネントが表示されます。また、スライダーやボタンなどを操作することもできます。
 
![TestComponent.PNG](https://qiita-image-store.s3.amazonaws.com/0/93566/bea4dd44-ec31-b321-2757-c2430be09c32.png)

![TestComponent_dialog.PNG](https://qiita-image-store.s3.amazonaws.com/0/93566/ac76c989-dec5-df5a-f5af-f46f5e4bae6d.png)



## 5. 作成したコンポーネントをアプリケーションに配置する

GUIエディタで作成したAdventCalendarコンポーネントをアプリケーションのGUIに配置して、画面に表示してみましょう。"MainComponent.cpp"を次のように編集します。

```C++

#include "../JuceLibraryCode/JuceHeader.h"
#include "NewComponent.h"                //AdventCalendarコンポーネントのヘッダをインクルードする

class MainContentComponent   : public AudioAppComponent
{
public:
    //==============================================================================
    MainContentComponent()
    {
        setSize (800, 600);
        setAudioChannels (2, 2);

        addAndMakeVisible(adventCalnedar);　 //AdventCalendarコンポーネントを追加・表示する
        adventCalnedar.setSize(this->getWidth(), this->getHeight());  //サイズを親と同じにする
    }

~~~中略~~~

private: 
    AdventCalendar adventCalnedar;         //AdventCalendarコンポーネントのインスタンスを生成

    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainContentComponent)
};

```

ビルドして実行するとこのように、アプリケーションのGUIの部品として、配置することが出来ることが確認できました。

![Result.PNG](https://qiita-image-store.s3.amazonaws.com/0/93566/0fdbd1ea-c606-ee17-a78f-44a68dd4831b.png)





## おまけ. Live Coding Engine

JUCE 5から、無償のPersonal版でもProjucer付属のライブコーディングエンジンを利用することができるようになりました。（JUCE 4では商用ライセンスを購入することで利用することが出来ました。）

ライブコーディング機能を有効にすると、Projucerでプロジェクト設定やソースコードに変更を加えた際に即時にビルドが実行されます。ただし、Windows環境ではインクルードでエラーを吐いたり、IDE側で設定が反映されるものについては予め設定しておくなど、多少使い勝手に癖があるので、個人的にまだまだ検証してから実際の開発に利用していきたいですね。

![22894045_1559414340792872_326026364361428252_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/93566/75ef0de6-ad31-13e4-ad6e-007c42ca6d4c.jpeg)