ドキュメント

View Categories

Box[IN]Component

4 min read

Box[IN]Componentは[IN]コンポーネントをBoxComponent以下に配置するコンポーネントです。以下のコンポーネントが標準で用意してあります。


  • BoxImageComponent
  • BoxSliderComponent
  • BoxTextComponent


box_image_component.hpp

class BoxImageComponent : public Component
{
public:
  BoxImageComponent(
    MOD mod,
    unsigned int box_width,
    unsigned int box_height,
    unsigned char box_bg_color_R,
    unsigned char box_bg_color_G,
    unsigned char box_bg_color_B,
    unsigned char box_bg_color_A,
    spa::gui::box::POS box_pos,
    std::string image_filename
  );

  BoxImageComponent(
    MOD mod,
    unsigned int box_width,
    unsigned int box_height,
    unsigned char box_bg_color_R,
    unsigned char box_bg_color_G,
    unsigned char box_bg_color_B,
    unsigned char box_bg_color_A,
    spa::gui::box::POS box_pos,
    unsigned int image_width,
    unsigned int image_height,
    unsigned char image_bg_color_R,
    unsigned char image_bg_color_G,
    unsigned char image_bg_color_B,
    unsigned char image_bg_color_A,
    spa::gui::box::POS image_pos,
    std::string image_filename
  );

  ~BoxImageComponent() = default;

  BoxImageComponent(BoxImageComponent const&);
  BoxImageComponent& operator=(BoxImageComponent const&);

  spa::gui::Image<>* get();

  void mod_image_color(
    unsigned char mod_color_R,
    unsigned char mod_color_G,
    unsigned char mod_color_B);

  void margin(int x, int y);

  void configure();

  void recapture();

private:
  std::unique_ptr<BoxComponent> box;
  std::unique_ptr<BoxComponent> image_box;
  std::unique_ptr<ImageComponent> image;

};


imageコンポーネントは親コンポーネント全体に画像を描画するためimage_boxを用意してboxに対してimage_boxを配置できるように待っています。

mod_image_color、margin、recaptureメソッドがあります。

box_slider_component.hpp

class BoxSliderComponent : public Component
{
public:
  BoxSliderComponent
  (
    MOD mod,
    unsigned int box_width,
    unsigned int box_height,
    unsigned char box_bg_color_R,
    unsigned char box_bg_color_G,
    unsigned char box_bg_color_B,
    unsigned char box_bg_color_A,
    spa::gui::box::POS pos,
    unsigned int slider_min,
    unsigned int slider_max,
    unsigned int slider_value,
    unsigned int slider_size,
    unsigned char slider_bg_color_R,
    unsigned char slider_bg_color_G,
    unsigned char slider_bg_color_B,
    unsigned char slider_bg_color_A,
    std::function<void(unsigned int)> slider_event
  );

  ~BoxSliderComponent() = default;;

  BoxSliderComponent(BoxSliderComponent const&);
  BoxSliderComponent& operator=(BoxSliderComponent const&);

  spa::gui::Slider<>* get();

  void configure();

private:
  std::unique_ptr<SliderComponent> slider;
  std::unique_ptr<BoxComponent> box;
};


boxにsliderをattachします。

box_text_component.hpp

class BoxTextComponent : public Component
{
public:
  BoxTextComponent
  (
    MOD mod,
    unsigned int box_width,
    unsigned int box_height,
    unsigned char box_bg_color_R,
    unsigned char box_bg_color_G,
    unsigned char box_bg_color_B,
    unsigned char box_bg_color_A,
    spa::gui::box::POS pos,
    bool text_update,
    std::string text_str,
    unsigned int text_c_size,
    unsigned char text_color_R,
    unsigned char text_color_G,
    unsigned char text_color_B
  );

  ~BoxTextComponent() = default;

  BoxTextComponent(BoxTextComponent const&);
  BoxTextComponent& operator=(BoxTextComponent const&);

  spa::gui::Text<>* get();

  void attach_inner(ComponentPlugin* component);

  void attach_inner(FcComponent component);

  unsigned int get_inner_height();

  void mask();

  void configure();

  void recapture();

private:
  std::unique_ptr<TextComponent> text;
  std::unique_ptr<BoxComponent> inner;
  std::unique_ptr<BoxComponent> outer;
};


テキストをセンターリングするためにinnerボックスを中間に入れています。

attach_innerはinnerコンポーネントにattachするためのメソッドです。textにはclickコンポーネントをattachすると文字入力とクリック操作を区別できないためinnerにattachします。SelectBoxComponentで使用しています。

get_inner_height、mask、recaptureメソッドがあります。

2026/02/02 追記

void attach_inner(FcComponent component);←削除

void attach_inner(std::weak_ptr<DOM> dom);


FcComponentを引数にする場合、コンポーネントのコピーが行われます。

コピー元のコンポーネントを操作しても変更が反映されない場合があるため、configure内でFcComponentのコピーは禁止です。

代わりにcomponent()で得られるdomのポインタを引数にします。

これに伴い、意図しないコードが発生する可能性(configure内でFcComponentの値渡し)があるため、domをもともとは生ポインタでしたが、weak_ptrで管理して、lock時にshared_ptrを確認します。

コメントを残す

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