예제 #1
0
void button_t::measure(extents_t& result)
{
    result = metrics::measure(control_m);

    button_state_set_t::iterator state(button_modifier_state(state_set_m,
                                                             modifier_mask_m,
                                                             modifiers_m));

    boost::shared_ptr<GG::Font> font = implementation::DefaultFont();

    if (state == state_set_m.end())
        state = button_default_state(state_set_m);

    extents_t cur_text_extents(metrics::measure_text(state->name_m, font));

    result.width() -= cur_text_extents.width();
    result.height() = Value(control_m->Height());

    long width_additional(0);
    
    for (button_state_set_t::iterator iter(state_set_m.begin()), last(state_set_m.end()); iter != last; ++iter)
    {
        extents_t tmp(metrics::measure_text(iter->name_m, font));
        width_additional = (std::max)(width_additional, tmp.width());
    }

    result.width() += width_additional;
    result.width() += Value(2 * implementation::CharWidth());

    result.width() = (std::max)(result.width(), 70L);
}
예제 #2
0
bool button_t::handle_key(key_type key, bool pressed, modifiers_t modifiers)
{
    if (pressed == false)
        return false;

    button_state_set_t::iterator state(button_modifier_state(state_set_m, modifier_mask_m, modifiers));

    if (state == state_set_m.end())
        state = button_default_state(state_set_m);

    if (state->hit_proc_m.empty() || enabled_m == false)
        return false;

    if (key == 0x0d && is_default_m) // return
    {
        state->hit_proc_m(state->value_m, state->contributing_m);
    }
    else if (key == 0x1b && is_cancel_m) // escape
    {
        state->hit_proc_m(state->value_m, state->contributing_m);
    }
    else
    {
        return false;
    }

    return true;
}
예제 #3
0
void button_t::set_contributing(modifiers_t modifiers, const dictionary_t& value)
{
    button_state_set_t::iterator state(button_modifier_state(state_set_m, modifier_mask_m, modifiers));

    if (state == state_set_m.end())
        state = button_default_state(state_set_m);

    state->contributing_m = value;
}
예제 #4
0
void button_t::set(modifiers_t modifiers, const any_regular_t& value)
{
    button_state_set_t::iterator state(button_modifier_state(state_set_m, modifier_mask_m, modifiers));

    if (state == state_set_m.end())
        state = button_default_state(state_set_m);

    if (state->value_m != value)
        state->value_m = value;
}
예제 #5
0
platform_display_type insert<button_t>(display_t&             display,
                                       platform_display_type& parent,
                                       button_t&              element)
{
    assert(element.control_m == 0);

    button_state_set_t::iterator state(button_default_state(element.state_set_m));

    element.control_m =
        implementation::Factory().NewButton(GG::X0, GG::Y0, GG::X1, implementation::StandardHeight(),
                                            state->name_m, implementation::DefaultFont(),
                                            element.color_m, element.text_color_m);

    element.control_m->SetUnpressedGraphic(element.unpressed_m);
    element.control_m->SetPressedGraphic(element.pressed_m);
    element.control_m->SetRolloverGraphic(element.rollover_m);

    const GG::X max_width =
        std::max(element.unpressed_m.Empty() ? GG::X0 : element.unpressed_m.Width(),
                 std::max(element.pressed_m.Empty() ? GG::X0 : element.pressed_m.Width(),
                          element.rollover_m.Empty() ? GG::X0 : element.rollover_m.Width()));
    const GG::Y max_height =
        std::max(element.unpressed_m.Empty() ? GG::Y0 : element.unpressed_m.Height(),
                 std::max(element.pressed_m.Empty() ? GG::Y0 : element.pressed_m.Height(),
                          element.rollover_m.Empty() ? GG::Y0 : element.rollover_m.Height()));
    const GG::X min_width =
        std::min(element.unpressed_m.Empty() ? GG::X0 : element.unpressed_m.Width(),
                 std::min(element.pressed_m.Empty() ? GG::X0 : element.pressed_m.Width(),
                          element.rollover_m.Empty() ? GG::X0 : element.rollover_m.Width()));
    const GG::Y min_height =
        std::min(element.unpressed_m.Empty() ? GG::Y0 : element.unpressed_m.Height(),
                 std::min(element.pressed_m.Empty() ? GG::Y0 : element.pressed_m.Height(),
                          element.rollover_m.Empty() ? GG::Y0 : element.rollover_m.Height()));
    if (max_width && max_height && min_width && min_height) {
        element.control_m->SetMaxSize(GG::Pt(max_width, max_height));
        element.control_m->SetMinSize(GG::Pt(min_width, min_height));
    }

    GG::Connect(element.control_m->ClickedSignal,
                boost::bind(&button_clicked, boost::ref(element)));

    if (!state->alt_text_m.empty())
        implementation::set_control_alt_text(element.control_m, state->alt_text_m);

    element.control_m->Disable(!element.enabled_m);

    return display.insert(parent, element.control_m);
}
예제 #6
0
platform_display_type insert<button_t>(display_t&             display,
                                       platform_display_type& parent,
                                       button_t&              element)
{
    static const ::Rect bounds_s = { 0, 0, 1024, 1024 };

    assert(element.control_m == false);

    button_state_set_t::iterator state(button_default_state(element.state_set_m));
    ::HIViewRef                  parent_ref(parent);
    ::WindowRef                  window(::GetControlOwner(parent_ref));

    ADOBE_REQUIRE_STATUS(::CreatePushButtonControl(window,
                                                   &bounds_s,
                                                   explicit_cast<auto_cfstring_t>(state->name_m).get(),
                                                   &element.control_m));

    implementation::set_theme(element.control_m, element.theme_m);
    implementation::set_active(element.control_m, element.enabled_m);

    if (state->alt_text_m.empty() == false)
        implementation::set_control_alt_text(element.control_m, state->alt_text_m);

    element.hit_handler_m.handler_m.install(element.control_m);

    implementation::set_widget_data(element.control_m,
                                    kControlEntireControl,
                                    kControlPushButtonDefaultTag,
                                    static_cast< ::Boolean >(element.is_default_m));

    implementation::set_widget_data(element.control_m,
                                    kControlEntireControl,
                                    kControlPushButtonCancelTag,
                                    static_cast< ::Boolean >(element.is_cancel_m));

    assert(element.mod_key_handler_m.handler_m.is_installed() == false);

    if (element.state_set_m.size() > 1)
        element.mod_key_handler_m.handler_m.install(window);

    return display.insert(parent, element.control_m);
}
예제 #7
0
::OSStatus button_modifier_key_handler_t::handle_event(::EventHandlerCallRef /*next*/,
                                                       ::EventRef            event)
{
    assert(button_m);

    button_t& button(*button_m);
    ::UInt32  os_modifiers;

    get_event_parameter<kEventParamKeyModifiers>(event, os_modifiers);

    modifiers_t                  modifiers(implementation::convert_modifiers(os_modifiers));
    button_state_set_t::iterator state(button_modifier_state(button.state_set_m, button.modifier_mask_m, modifiers));

    if (state == button.state_set_m.end())
        state = button_default_state(button.state_set_m);

    implementation::set_name(button.control_m, state->name_m);
    implementation::set_control_alt_text(button.control_m, state->alt_text_m);

    return noErr;
}
예제 #8
0
::OSStatus button_hit_handler_t::handle_event(::EventHandlerCallRef /*next*/,
                                              ::EventRef            event)
{
    assert(button_m);

    button_t& button(*button_m);
    ::UInt32  os_modifiers;

    get_event_parameter<kEventParamKeyModifiers>(event, os_modifiers);

    modifiers_t                  modifiers(implementation::convert_modifiers(os_modifiers));
    button_state_set_t::iterator state(button_modifier_state(button.state_set_m, button.modifier_mask_m, modifiers));

    if (state == button.state_set_m.end())
        state = button_default_state(button.state_set_m);

    if (!state->hit_proc_m.empty())
        state->hit_proc_m(state->value_m, state->contributing_m);

    return noErr;
}
예제 #9
0
platform_display_type insert<button_t>(display_t&             display,
                                       platform_display_type& parent,
                                       button_t&              element)
{
    assert(element.control_m == 0);

    button_state_set_t::iterator state(button_default_state(element.state_set_m));

    element.control_m =
        implementation::Factory().NewButton(GG::X0, GG::Y0, GG::X1, implementation::StandardHeight(),
                                            state->name_m, implementation::DefaultFont(), GG::CLR_GRAY);

    GG::Connect(element.control_m->ClickedSignal, Clicked(element));

    if (!state->alt_text_m.empty())
        implementation::set_control_alt_text(element.control_m, state->alt_text_m);

    element.control_m->Disable(!element.enabled_m);

    return display.insert(parent, element.control_m);
}
예제 #10
0
bool button_t::handle_key(key_type key, bool pressed, modifiers_t /* modifiers */)
{
    if (pressed == false)
        return false;

    modifiers_m = modifier_state();

    //
    // Look up the state which this modifier should trigger.
    //
    button_state_set_t::iterator state(button_modifier_state(state_set_m,
                                                             modifier_mask_m,
                                                             modifiers_m));

    if (state == state_set_m.end())
        state = button_default_state(state_set_m);

    //
    // Set the window text.
    //
    control_m->SetText(state->name_m);

    //
    // Set the alt text if need be.
    //
    if (!state->alt_text_m.empty())
        implementation::set_control_alt_text(control_m, state->alt_text_m);

    if (state->hit_proc_m.empty() || enabled_m == false)
        return false;

    if ((key.first == GG::GGK_RETURN || key.first == GG::GGK_KP_ENTER) && is_default_m)
        state->hit_proc_m(state->value_m, state->contributing_m);
    else if (key.first == GG::GGK_ESCAPE && is_cancel_m)
        state->hit_proc_m(state->value_m, state->contributing_m);
    else
        return false;

    return true;
}