Pixelmap上のボタンの色

PixelmapButtonの子供としてPromptをぶら下げ、PixelmapButtonにNormal/Selectedのピクセルマップを指定しています。

ボタンを押下するとSelectedのピクセルマップが描画され正常にピクセルマップの切り替えができているのですが、

Promptに指定したSelectedColorが反映されてそうにありません。

どのようにすればボタンの状態に応じてテキストの色が変わりますでしょうか?

親の状態に応じて子供の色を変えなければならないような気がしますが方法が分からずに困っております。

以下はコードの抜粋です。

(Pixelmapボタンの生成)

gx_pixelmap_button_create(&row->pixelmap,
    "PixelmapButton",
    &row->background,//親
    GX_PIXELMAP_ID_MAINMENUBUTTON,
    GX_PIXELMAP_ID_MAINMENUBUTTONS,
    GX_PIXELMAP_ID_MAINMENUBUTTON,
    GX_STYLE_ENABLED,
    0,
    &childsize);

(プロンプトの作成)

gx_prompt_create(&row->datetime,
    "DateTimeInfo",
    &row->pixelmap,
    0,
    GX_STYLE_VALIGN_TOP|GX_STYLE_TRANSPARENT|GX_STYLE_TEXT_CENTER,//メッセージのスタイル
    0,
    &childsize);

(フォントの指定)

gx_prompt_font_set(&row->datetime,GX_FONT_ID_REGULAR16);

(ノーマル/選択時の色指定)

gx_prompt_text_color_set(&row->datetime, GX_COLOR_ID_02, GX_COLOR_ID_17);

  • Former Member
    Former Member
    kom0313さん

    gx_prompt_text_draw関数のソースコードを見ると、そのpromptウィジェットのstyleにGX_STYLE_DRAW_SELECTEDが設定されていればSelected Text Colorで描画され、設定されていなければNormal Text Colorで描画されることが分かります。
    ですので、pixelmap buttonウィジェットの状態に応じて、promptウイジェットのGX_STYLE_DRAW_SELECTEDを変更すれば良いかと思います。
    これにはgx_widget_style_add関数やgx_widget_style_remove関数を利用します。
    尚、ウィジェットのAccepts Focusが有効の場合、そのウィジェットのフォーカスの状態によってもGX_STYLE_DRAW_SELECTEDの状態が変わるので、promptウィジェットのAccepts Focusは無効にしておきます。
  • masukamiさん

    早速のご回答ありがとうございます。
    gx_widget_draw_set(&row->datetime, measure_result_prompt_draw);
    で描画関数を指定し、
    static void measure_result_prompt_draw(GX_PROMPT *prompt)
    {
    if (prompt->gx_widget_parent)
    {
    if (prompt->gx_widget_parent->gx_widget_style & GX_STYLE_DRAW_SELECTED)
    {
    gx_widget_style_add(prompt, GX_STYLE_DRAW_SELECTED);
    gx_system_dirty_mark(prompt);
    }
    else
    {
    gx_widget_style_remove(prompt, GX_STYLE_DRAW_SELECTED);
    gx_system_dirty_mark(prompt);
    }
    }
    gx_prompt_draw(prompt);
    }
    としてみたところ色は変わり始めました。
    ただ、今回のPixelmapButton+Promptの部品をVerticalList内に作成しているのですが、
    親の状態がうまく取れていないのか、ボタンはNORMAL状態なのにPromptはSELECTED状態になり、うまく動作しておりません。GUIXではVirticalListを親として子供に縦スクロールバーを配置しただけの状態でGenerateし、VerticalListのCallBackに下記コードを指定し以下のようにウィジェットを作成しています。何か間違っていますでしょうか?VerticalList上のボタンを押した際には文字色がSELECTEDになっているのが、ボタンがNORMALになっても文字色がそのままになっていそうな状態です。

    VOID Gui_ResultRowCreate(GX_VERTICAL_LIST *list, GX_WIDGET *widget, INT index)
    {
    GX_RECTANGLE childsize;
    MEASURE_RESULT_ROW *row = (MEASURE_RESULT_ROW*)widget;
    GX_BOOL result;
    UINT err=0;

    gx_widget_created_test(&row -> background, &result);

    if(!result){
    //矩形の定義
    gx_utility_rectangle_define(&childsize,
    list->gx_window_client.gx_rectangle_left, //左
    0, //上
    list->gx_window_client.gx_rectangle_right - 20,//右
    46); //下
    //ウィジェットの生成
    gx_widget_create(&row->background, NULL, list, GX_STYLE_ENABLED, GX_ID_NONE, &childsize);
    //ウィジェットのステータス追加
    gx_widget_status_add(&row -> background, GX_STATUS_SELECTABLE);
    gx_widget_status_remove(&row->background,GX_STATUS_ACCEPTS_FOCUS);
    //Pixelmap生成
    err = gx_pixelmap_button_create(&row->pixelmap,
    "PixelmapButton",
    &row->background,//親
    GX_PIXELMAP_ID_MAINMENUBUTTON,
    GX_PIXELMAP_ID_MAINMENUBUTTONS,
    GX_PIXELMAP_ID_MAINMENUBUTTON,
    GX_STYLE_ENABLED,
    0,
    &childsize);

    //=======================================
    // 1行目テキスト
    //=======================================
    gx_utility_rectangle_shift(&childsize,
    MEASURE_RESULT_SHIFT_X, //X軸の移動量(pixel)
    MEASURE_RESULT_SHIFT_Y-18 //Y軸の移動量(pixel)
    );
    err = gx_prompt_create(&row->datetime,
    "DateTimeInfo",
    &row->pixelmap,
    0,
    GX_STYLE_VALIGN_TOP|GX_STYLE_TRANSPARENT|GX_STYLE_TEXT_CENTER,//メッセージのスタイル
    0,
    &childsize);
    gx_widget_status_remove(&row->datetime,GX_STATUS_ACCEPTS_FOCUS);
    gx_widget_draw_set(&row->datetime, measure_result_prompt_draw);
    err = gx_prompt_font_set(&row->datetime,GX_FONT_ID_NORMAL);
    err = gx_prompt_text_color_set(&row->datetime, GX_COLOR_ID_BLACK, GX_COLOR_ID_WHITE);

    //=======================================
    // 2行目テキスト
    //=======================================
    gx_utility_rectangle_shift(&childsize,
    MEASURE_RESULT_SHIFT_X, //X軸の移動量(pixel)
    MEASURE_RESULT_SHIFT_Y+5 //Y軸の移動量(pixel)
    );
    err = gx_prompt_create(&row->type,
    NULL,
    &row->pixelmap,
    0,
    GX_STYLE_VALIGN_TOP|GX_STYLE_TRANSPARENT|GX_STYLE_TEXT_CENTER,//メッセージのスタイル
    0,
    &childsize);
    gx_widget_status_remove(&row->type,GX_STATUS_ACCEPTS_FOCUS);
    gx_widget_draw_set(&row->type, measure_result_prompt_draw);
    err = gx_prompt_font_set(&row->type,GX_FONT_ID_NORMAL);
    err = gx_prompt_text_color_set(&row->type, GX_COLOR_ID_BLACK, GX_COLOR_ID_WHITE);

    }
    err = gx_prompt_text_set(&row->datetime, measure_result_list[index].datetime);
    err = gx_prompt_text_set(&row->type, measure_result_list[index].type);
    }

    typedef struct MEASURE_RESULT_ROW_STRUCT {
    GX_WIDGET background;
    GX_PIXELMAP_BUTTON pixelmap;
    GX_PROMPT datetime;
    GX_PROMPT type;
    } MEASURE_RESULT_ROW;
  • Former Member
    Former Member in reply to kom0313

    kom0313さん

    Vertical List内での利用だったんですね。Renesas Synergy™ GUIX™ 基本アプリケーション(r30an0320jj0100)を利用して、似たような機能が出来るか試してみました。少し無理やりな感じがありますが、概ね動いている感じです。変更箇所のポイントは以下です。

    • gx_pixelmap_button_create()で、disabled_id = 0としている。
    • gx_pixelmap_button_create()とgx_prompt_create()で、styleにGX_STYLE_ENABLEDを設定しない。
    • Vertical Listにおいて、GX_EVENT_LIST_SELECT発生時に全リストのstyleを変更する。
      (前に選択状態だった項目と新しく選択状態となった項目についてのみ、styleを変更するようにした方が良いかもしれませんが、今回はこれで。)

    もっと良い方法があるかもしれませんが、参考になれば幸いです。

    以下がパッチになります。


     

    Index: blinky_api.h
    ===================================================================
    --- blinky_api.h
    +++ blinky_api.h
    @@ -53,6 +53,8 @@

    typedef struct st_blinky_list_widget
    {
    + GX_WIDGET base;
    + GX_PIXELMAP_BUTTON button;
    GX_PROMPT prompt; /* GUIX prompt widget for blink pattern */
    CHAR text[LEN_LED_PATTERN]; /* blink description */
    } blinky_list_widget_t;
    Index: blinky_thread_entry.c
    ===================================================================
    --- blinky_thread_entry.c
    +++ blinky_thread_entry.c
    @@ -294,8 +294,17 @@
    if (!created)
    {
    gx_utility_rectangle_define(&rect, 0, 0, VERTICAL_LIST_WIDTH, VERTICAL_LIST_HEIGHT);
    - gx_prompt_create(&entry->prompt, entry->text, list, blinky_patterns[index].strings,
    - GX_STYLE_ENABLED |
    + gx_widget_create(&entry->base, NULL, list, GX_STYLE_ENABLED, 0, &rect);
    + gx_widget_fill_color_set(&entry->base, GX_COLOR_ID_WHITE, GX_COLOR_ID_BLUE);
    + gx_pixelmap_button_create(&entry->button, NULL, &entry->base,
    + GX_PIXELMAP_ID_RADIO_OFF,
    + GX_PIXELMAP_ID_RADIO_ON,
    + 0,
    + GX_STYLE_VALIGN_CENTER,
    + 0,
    + &rect);
    + gx_utility_rectangle_shift(&rect, 20, 0);
    + gx_prompt_create(&entry->prompt, entry->text, &entry->base, blinky_patterns[index].strings,
    GX_STYLE_TEXT_LEFT |
    GX_STYLE_BORDER_NONE,
    0,
    Index: window_vertical_list.c
    ===================================================================
    --- window_vertical_list.c
    +++ window_vertical_list.c
    @@ -38,6 +38,7 @@
    * Private global variables and functions
    **********************************************************************************************************************/
    static void vertical_list_create(GX_WIDGET *widget);
    +static void vertical_list_refresh(INT selected);

    static blinky_list_widget_t vertical_list_widgets[NUM_LED_PATTERN];
    static GX_CHAR str_interval[8];
    @@ -103,6 +104,7 @@
    gx_widget_find(widget, ID_VTL_LED_PATTERN, GX_SEARCH_DEPTH_INFINITE, &vlist);
    gx_vertical_list_selected_index_get(vlist, &selected);
    blinky_set_pattern( selected );
    + vertical_list_refresh( selected );
    break;

    /* Slider changed */
    @@ -143,3 +145,20 @@
    blinky_create_pattern_row(list, (GX_WIDGET *) &vertical_list_widgets[index], index);
    }
    }
    +
    +static void vertical_list_refresh(INT selected)
    +{
    + for (int index = 0; index < NUM_LED_PATTERN; index++)
    + {
    + if ( index == selected )
    + {
    + vertical_list_widgets[index].button.gx_widget_style |= GX_STYLE_BUTTON_PUSHED;
    + vertical_list_widgets[index].prompt.gx_widget_style |= GX_STYLE_DRAW_SELECTED;
    + }
    + else
    + {
    + vertical_list_widgets[index].button.gx_widget_style &= ~(GX_STYLE_BUTTON_PUSHED);
    + vertical_list_widgets[index].prompt.gx_widget_style &= ~(GX_STYLE_DRAW_SELECTED);
    + }
    + }
    +}


     

  • masukamiさん

    丁寧な解説ありがとうございました。
    解説通りに実装すると、思っていた動作をするようになりました。
    ありがとうございました。