ドキュメント

View Categories

ドライバーを作成する

4 min read

ソフトウェア-Driverで紹介した通りの方法でドライバーを追加します。
ここではドライバーに必要な機能についてより詳しく解説します。
ドライバーには次の3つの機能が必要です。

  • 表示するパターンを指定
  • 指定されたパターンに対応するコンポーネントを作成
  • ドライバー一覧に表示するカラムデータを作成


image_driver_component.hpp

// 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;
};
ソフトウェア-Driverhttps://amateru-kami.online/software/driver


列挙体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;

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です