チュートリアル、一気にてんこ盛り過ぎてうまく理解できないんですよね・・・
問題を細分化するのじゃ
JUCEチュートリアル、「Interface Design」、「The TableListBox class」チュートリアルを引き続きやっていきます。前回実装したデモアプリですが、内容がてんこ盛り過ぎてどこから手をつけて良いのかいまいちわからなくなってしまったので、まずは、TableListBoxクラスを利用するために何が必要なのかを削ぎ落としてみました。
公式のチュートリアルページはこちらになります。
https://docs.juce.com/master/tutorial_table_list_box.html
前回の記事はこちらになります。
https://panda-clip.com/juce-the-tablelistbox-class1
こんな人の役に立つかも
・JUCEプログラミングを勉強している人
・JUCEチュートリアル「The TableListBox class」をやっている人
・JUCE、TableListBoxクラスを利用したい人
TableListBoxクラスの使い方
今回のデモアプリの実装方法では、TableListBoxクラスを継承した独自のクラス「TableTutorialComponent」を実装して、このクラスをMainComponent内で「table」という名称でメンバとして定義して利用する、という流れになります。
次のように、MainComponent.hに作成して利用しています。
//[1]TableTutorialComponentクラスを定義します。
class TableTutorialComponent : public juce::Component,
public juce::TableListBoxModel
{
public
//....
private
//....
}
class MainComponent : public juce::Component
{
public:
//...
private:
//[2]MainComponentクラスのメンバとして利用します。
TableTutorialComponent table;
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainComponent)
};
このようにすることで、TableListBoxクラスから関数をオーバーライドしたりして、カスタマイズされたTableTutorialComponentクラスとして利用することができます。
チュートリアルによると、TableListBoxには、オーバーライドしておかなければいけない関数があります。また、これがないとエラーでコンパイルできませんでした。
必須の関数
getNumRows関数
次のように、returnが必要になります。
int getNumRows() override
{
return numRows;
}
paintRowBackground関数
とりあえず、最低限、オーバーライドした関数定義さえあればOKなようです。
void paintRowBackground(juce::Graphics& g, int rowNumber, int /*width*/, int /*height*/, bool rowIsSelected) override
{
}
paintCell関数
この関数で、セルの内容を描画するようです。ここも、最低限、オーバーライドしないとコンパイルが通りませんでした。
void paintCell(juce::Graphics& g, int rowNumber, int columnId,
int width, int height, bool rowIsSelected) override
{
}
必要最低限のTableTutorialComponent
Projucerの「GUI」テンプレートでプロジェクトを作成したら、次のようにMainComponent.hにTableTutorialComponentクラスを定義することで、まずはアプリが動作します。これがまずはベースとなる必要最低限となります。
class TableTutorialComponent : public juce::Component,
public juce::TableListBoxModel
{
public:
TableTutorialComponent(){}
int getNumRows() override
{
return numRows;
}
void paintRowBackground(juce::Graphics& g, int rowNumber, int /*width*/, int /*height*/, bool rowIsSelected) override{}
void paintCell(juce::Graphics& g, int rowNumber, int columnId,
int width, int height, bool rowIsSelected) override{}
void resized() override
{
table.setBoundsInset(juce::BorderSize<int>(8));
}
private:
juce::TableListBox table{ {}, this };
int numRows = 0;
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(TableTutorialComponent)
};
このクラスを実装しても特に何かが起きるわけではないのですが、チュートリアルの開始時点として、ここからの差分で一つづつ機能を追加していくのが理解しやすいと思いました。最低限のprivateなメンバとして、TableListBoxクラスのtableメンバ、そして、行数を格納するnumRowが定義されています。numRowは、getNumRows関数で返す数値として利用しているので、必要になりました。
まずは、シンプルに何もしないクラスに削ぎ落としたので、次回からはここにXML読み込みの機能を追加します。