Driver

Driver

コンポーネントを単体で呼び出すためのドライバーです。

ドライバーはAtoms、Molecules、Organisms、Templates、Pagesに分類されています。

標準で使用できるコンポーネントが登録されています。


次のImageDriverComponentを作成しDriverAtomsComponentに登録することで呼び出します。

// 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;
};

driver_atoms_component.hpp

// driver_atoms_component.hpp
#pragma once

#include <gui/components/atoms/box/box_driver_component.hpp>
#include <gui/components/atoms/rect/rect_driver_component.hpp>
#include <gui/components/atoms/text/text_driver_component.hpp>

// ImageDriverComponentを読み込み
#include <gui/components/atoms/image/image_driver_component.hpp>

#include <gui/components/atoms/click/click_driver_component.hpp>
#include <gui/components/atoms/slider/slider_driver_component.hpp>
#include <gui/components/atoms/select/select_driver_component.hpp>
#include <gui/components/atoms/page/page_driver_component.hpp>
#include <gui/components/atoms/capture/capture_driver_component.hpp>

class DriverAtomsComponent : public Component
{
private:
  // ドライバー一覧のカラム定義
  using Columns = DriverTableRecordGenerator::Columns;

public:
  DriverAtomsComponent(MOD mod);

  std::list<Columns> records();

  void configure();

private:
  // ドライバー一覧のリスト
  std::list<Columns> drivers;
  // プレビューウィンドウに表示するコンポーネント
  std::map<std::string, FcComponent> preview;
};

driver_atoms_component.cpp

// driver_atoms_component.cpp
#include <gui/components/organisms/driver/driver_atoms_component.hpp>

DriverAtomsComponent::DriverAtomsComponent(MOD mod)
  : Component(mod)
{
  // components
  BoxDriverComponent box_driver_component{ mod };
  RectDriverComponent rect_driver_component{ mod };
  TextDriverComponent text_driver_component{ mod };
  //ImageDriverComponentを初期化します。
  ImageDriverComponent image_driver_component{ mod };
  ClickDriverComponent click_driver_component{ mod };
  SliderDriverComponent slider_driver_component{ mod };
  SelectDriverComponent select_driver_component{ mod };
  PageDriverComponent page_driver_component{ mod };
  CaptureDriverComponent capture_driver_component{ mod };
  // driver table columns
  drivers.push_back(box_driver_component.gen());
  drivers.push_back(rect_driver_component.gen());
  drivers.push_back(text_driver_component.gen());
  // ドライバー一覧にimage_driver_componentのレコードを追加します。
  drivers.push_back(image_driver_component.gen());
  drivers.push_back(click_driver_component.gen());
  drivers.push_back(slider_driver_component.gen());
  drivers.push_back(select_driver_component.gen());
  drivers.push_back(page_driver_component.gen());
  drivers.push_back(capture_driver_component.gen());
  // preview components
  preview[std::get<1>(box_driver_component.gen())] = box_driver_component;
  preview[std::get<1>(rect_driver_component.gen())] = rect_driver_component;
  preview[std::get<1>(text_driver_component.gen())] = text_driver_component;
  // preview["ImageComponent"]にimage_driver_componentを指定します。
  preview[std::get<1>(image_driver_component.gen())] = image_driver_component;
  preview[std::get<1>(click_driver_component.gen())] = click_driver_component;
  preview[std::get<1>(slider_driver_component.gen())] = slider_driver_component;
  preview[std::get<1>(select_driver_component.gen())] = select_driver_component;
  preview[std::get<1>(page_driver_component.gen())] = page_driver_component;
  preview[std::get<1>(capture_driver_component.gen())] = capture_driver_component;
}

std::list<DriverAtomsComponent::Columns> DriverAtomsComponent::records()
{
  return drivers;
}

void DriverAtomsComponent::configure()
{
  if (preview.contains(mod.store->preview))
    attach(preview[mod.store->preview]());
}

redを指定してImageComponentを実行すると次のようになります。