ドキュメント
ドライバーを作成する
4 min read
ソフトウェア-Driverで紹介した通りの方法でドライバーを追加します。
ここではドライバーに必要な機能についてより詳しく解説します。
ドライバーには次の3つの機能が必要です。
- 表示するパターンを指定
- 指定されたパターンに対応するコンポーネントを作成
- ドライバー一覧に表示するカラムデータを作成
image_driver_component.hpp
ソフトウェア-Driverhttps://amateru-kami.online/software/driver// ImageDriverComponent.hpp #pragma once #include <gui/components/atoms/box/box_component.hpp> #include <gui/components/atoms/image/image_component.hpp> class ImageDriverComponent : public Component { public: // 呼び出すドライバーのパターンを作成します。 enum class PATTERN : unsigned int { BASE = 0, RED, GREEN, BRUE, END }; //テンプレート引数に作成したPATTERNを指定します。 using SelectPattern = DriverTableRecordGenerator::SelectPattern<PATTERN>; //ドライバー一覧に表示するカラム定義 using Columns = DriverTableRecordGenerator::Columns; //ATOMICはATOMS〜PAGESを指定します。 using ATOMIC = DriverTableRecordGenerator::ATOMIC; private: using POS = spa::gui::box::POS; public: ImageDriverComponent(MOD mod) : Component(mod) , pattern{ std::make_shared<PATTERN>(PATTERN::BASE) } { //ImageComponentの表示域を指定します。 box = BoxComponent{ mod , Theme().main_window_w / 2 , Theme().main_window_h / 2 , 255 , 255 , 255 , 255 , POS::CENTER }; //componentsにPATTERNを指定してImageComponentを登録します。 ImageComponent base{ mod , "brand.png" }; components[PATTERN::BASE] = base; ImageComponent red{ mod , "brand.png" }; // RGBに255,0,0を乗算 元画像が白色の箇所は赤色になります。 red.mod_image_color(255, 0, 0); components[PATTERN::RED] = red; ImageComponent green{ mod , "brand.png" }; green.mod_image_color(0, 255, 0); // RGBに0,255,0を乗算 元画像が白色の箇所は緑色になります。 components[PATTERN::GREEN] = green; ImageComponent brue{ mod , "brand.png" }; // RGBに0,0,255を乗算 元画像が白色の箇所は青色になります。 brue.mod_image_color(0, 0, 255); components[PATTERN::BRUE] = brue; //ドライバー一覧で選択できるオプションを設定します。 options = std::map<unsigned int, std::string>{ {static_cast<unsigned int>(PATTERN::BASE), "base"} , {static_cast<unsigned int>(PATTERN::RED), "red"} , {static_cast<unsigned int>(PATTERN::GREEN), "green"} , {static_cast<unsigned int>(PATTERN::BRUE), "brue"} }; } ~ImageDriverComponent() = default; //ドライバー一覧のデータを生成します、SelectPatternでセレクトボックスで //指定した値にpatternを設定します。 Columns gen() { return std::tuple( ATOMIC::ATOMS , "ImageComponent" , options , SelectPattern(pattern.get())); } //コンポーネントを指定したパターンで構成します。 void configure() { attach(box()); box()->attach(components[*pattern]()); } private: std::map<unsigned int, std::string> options; std::shared_ptr<PATTERN> pattern; std::map<PATTERN, FcComponent> components; FcComponent box; };
列挙体PATTERNで設定するパターンを定義します。optionsには定義したパターンをドライバー一覧で表示するワードを設定します。
driver_table_record_generator.hpp
template<typename PATTERN>
class SelectPattern
{
public:
SelectPattern(PATTERN* pattern) : pattern{ pattern } {}
void operator()(unsigned int pattern_uint32)
{
if (pattern_uint32 < static_cast<unsigned int>(PATTERN::END))
*pattern = static_cast<PATTERN>(pattern_uint32);
}
private:
PATTERN* pattern;
};
SelectPatternはテンプレート引数PATTERN(先ほど定義したPATTERN)で実体化します。ドライバーテーブル一覧でパターンを選択した時にポインタpatternの内容を選択したPATTERNに変更します。
driver_table_record_generator.hpp
using Columns = std::tuple<ATOMIC, std::string, OPTIONS, SelectEvent>;
ドライバーテーブルのカラム定義はstd::tuple(列挙体ATOMIC、文字列、std::map<unsinged int, std::string>、SelectPattern(pattern.get()))です。
componentsにそれぞれのPATTERNに応じたコンポーネントを登録します。
driver_image_component.cpp
components[PATTERN::BASE] = base;//red,green,brue
patternで指定中のコンポーネントを表示します。
driver_image_component.cpp
void configure()
{
attach(box());
box()->attach(components[*pattern]());
}
Driver[ATOMIC]Componentで宣言からドライバーの一覧にレコードを登録します
driver_atomic_component.cpp
ImageDriverComponent image_driver_component{ mod };
最後にpreviewプロパティにコンポーネントを登録します。
driver_atomic_component.cpp
preview[std::get<1>(image_driver_component.gen())]
= image_driver_component;
コメントを残す