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); }
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; }
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; }
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; }
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); }
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); }
::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; }
::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; }
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); }
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; }