| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171 |
- /*
- * This source file is part of RmlUi, the HTML/CSS Interface Middleware
- *
- * For the latest information, see http://github.com/mikke89/RmlUi
- *
- * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd
- * Copyright (c) 2019 The RmlUi Team, and contributors
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- *
- */
- #include "../../Include/RmlUi/Controls/ElementFormControlSelect.h"
- #include "../../Include/RmlUi/Core/ElementText.h"
- #include "../../Include/RmlUi/Core/Event.h"
- #include "../../Include/RmlUi/Core/ElementUtilities.h"
- #include "WidgetDropDown.h"
- namespace Rml {
- namespace Controls {
- // Constructs a new ElementFormControlSelect.
- ElementFormControlSelect::ElementFormControlSelect(const Rml::Core::String& tag) : ElementFormControl(tag)
- {
- widget = new WidgetDropDown(this);
- }
- ElementFormControlSelect::~ElementFormControlSelect()
- {
- delete widget;
- }
- // Returns a string representation of the current value of the form control.
- Rml::Core::String ElementFormControlSelect::GetValue() const
- {
- RMLUI_ASSERT(widget != nullptr);
- return widget->GetValue();
- }
- // Sets the current value of the form control.
- void ElementFormControlSelect::SetValue(const Rml::Core::String& value)
- {
- OnUpdate();
- RMLUI_ASSERT(widget != nullptr);
- widget->SetValue(value);
- }
- // Sets the index of the selection. If the new index lies outside of the bounds, it will be clamped.
- void ElementFormControlSelect::SetSelection(int selection)
- {
- OnUpdate();
- RMLUI_ASSERT(widget != nullptr);
- widget->SetSelection(selection);
- }
- // Returns the index of the currently selected item.
- int ElementFormControlSelect::GetSelection() const
- {
- RMLUI_ASSERT(widget != nullptr);
- return widget->GetSelection();
- }
- // Returns one of the select control's option elements.
- SelectOption* ElementFormControlSelect::GetOption(int index)
- {
- OnUpdate();
- RMLUI_ASSERT(widget != nullptr);
- return widget->GetOption(index);
- }
- // Returns the number of options in the select control.
- int ElementFormControlSelect::GetNumOptions()
- {
- OnUpdate();
- RMLUI_ASSERT(widget != nullptr);
- return widget->GetNumOptions();
- }
- // Adds a new option to the select control.
- int ElementFormControlSelect::Add(const Rml::Core::String& rml, const Rml::Core::String& value, int before, bool selectable)
- {
- OnUpdate();
- RMLUI_ASSERT(widget != nullptr);
- return widget->AddOption(rml, value, before, false, selectable);
- }
- // Removes an option from the select control.
- void ElementFormControlSelect::Remove(int index)
- {
- OnUpdate();
- RMLUI_ASSERT(widget != nullptr);
- widget->RemoveOption(index);
- }
- // Removes all options from the select control.
- void ElementFormControlSelect::RemoveAll()
- {
- OnUpdate();
- RMLUI_ASSERT(widget != nullptr);
- widget->ClearOptions();
- }
- // Moves all children to be under control of the widget.
- void ElementFormControlSelect::OnUpdate()
- {
- ElementFormControl::OnUpdate();
- // Move any child elements into the widget (except for the three functional elements).
- while (HasChildNodes())
- {
- Core::Element* child = GetFirstChild();
- // Check for a value attribute.
- Rml::Core::String attribute_value = child->GetAttribute<Rml::Core::String>("value", "");
- // Pull the inner RML and add the option.
- Rml::Core::String rml;
- child->GetInnerRML(rml);
- widget->AddOption(rml, attribute_value, -1, child->GetAttribute("selected"), !child->GetAttribute("unselectable"));
- RemoveChild(child);
- }
- }
- // Updates the layout of the widget's elements.
- void ElementFormControlSelect::OnRender()
- {
- ElementFormControl::OnRender();
- widget->OnRender();
- }
- // Forces an internal layout.
- void ElementFormControlSelect::OnLayout()
- {
- widget->OnLayout();
- }
- // Returns true to mark this element as replaced.
- bool ElementFormControlSelect::GetIntrinsicDimensions(Rml::Core::Vector2f& intrinsic_dimensions)
- {
- intrinsic_dimensions.x = 128;
- intrinsic_dimensions.y = 16;
- return true;
- }
- }
- }
|