GuiBuilder: move and resize widgets when pressing arrow keys while holding control and/or shift

0.8
Bruno Van de Velde 2019-03-02 19:05:17 +01:00
parent 932f710eaf
commit 06af24d63e
3 changed files with 145 additions and 58 deletions

View File

@ -48,12 +48,14 @@ public:
void selectWidgetById(const std::string& id);
void mouseMoved(sf::Vector2i pos);
void mouseReleased();
void arrowKeyPressed(const sf::Event::KeyEvent& keyEvent);
void setFilename(const sf::String& filename);
sf::String getFilename() const;
void setSize(sf::Vector2i filename);
sf::Vector2i getSize() const;
void setChanged(bool changed);
bool isChanged() const;
bool hasFocus() const;
bool load();
void save();

View File

@ -29,6 +29,8 @@
#include <cassert>
#include <cmath>
const static float MOVE_STEP = 10;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Form::Form(GuiBuilder* guiBuilder, const std::string& filename, tgui::ChildWindow::Ptr formWindow) :
@ -228,6 +230,66 @@ void Form::mouseReleased()
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void Form::arrowKeyPressed(const sf::Event::KeyEvent& keyEvent)
{
if (!m_selectedWidget)
return;
auto selectedWidget = m_selectedWidget->ptr;
if (keyEvent.shift && keyEvent.control)
{
if (keyEvent.code == sf::Keyboard::Left)
selectedWidget->setPosition({selectedWidget->getPosition().x - MOVE_STEP, selectedWidget->getPosition().y});
else if (keyEvent.code == sf::Keyboard::Right)
selectedWidget->setPosition({selectedWidget->getPosition().x + MOVE_STEP, selectedWidget->getPosition().y});
else if (keyEvent.code == sf::Keyboard::Up)
selectedWidget->setPosition({selectedWidget->getPosition().x, selectedWidget->getPosition().y - MOVE_STEP});
else if (keyEvent.code == sf::Keyboard::Down)
selectedWidget->setPosition({selectedWidget->getPosition().x, selectedWidget->getPosition().y + MOVE_STEP});
setChanged(true);
updateSelectionSquarePositions();
m_guiBuilder->reloadProperties();
}
else if (keyEvent.shift)
{
if (keyEvent.code == sf::Keyboard::Left)
selectedWidget->setSize({selectedWidget->getSize().x - 1, selectedWidget->getSize().y});
else if (keyEvent.code == sf::Keyboard::Right)
selectedWidget->setSize({selectedWidget->getSize().x + 1, selectedWidget->getSize().y});
else if (keyEvent.code == sf::Keyboard::Up)
selectedWidget->setSize({selectedWidget->getSize().x, selectedWidget->getSize().y - 1});
else if (keyEvent.code == sf::Keyboard::Down)
selectedWidget->setSize({selectedWidget->getSize().x, selectedWidget->getSize().y + 1});
setChanged(true);
updateSelectionSquarePositions();
m_guiBuilder->reloadProperties();
}
else if (keyEvent.control)
{
if (keyEvent.code == sf::Keyboard::Left)
selectedWidget->setPosition({selectedWidget->getPosition().x - 1, selectedWidget->getPosition().y});
else if (keyEvent.code == sf::Keyboard::Right)
selectedWidget->setPosition({selectedWidget->getPosition().x + 1, selectedWidget->getPosition().y});
else if (keyEvent.code == sf::Keyboard::Up)
selectedWidget->setPosition({selectedWidget->getPosition().x, selectedWidget->getPosition().y - 1});
else if (keyEvent.code == sf::Keyboard::Down)
selectedWidget->setPosition({selectedWidget->getPosition().x, selectedWidget->getPosition().y + 1});
setChanged(true);
updateSelectionSquarePositions();
m_guiBuilder->reloadProperties();
}
else
{
// TODO: Select other widget
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void Form::setFilename(const sf::String& filename)
{
m_filename = filename;
@ -280,6 +342,13 @@ bool Form::isChanged() const
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
bool Form::hasFocus() const
{
return m_formWindow->isFocused();
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
bool Form::load()
{
try
@ -389,37 +458,36 @@ void Form::onDrag(sf::Vector2i mousePos)
const sf::Vector2f pos = sf::Vector2f{mousePos} - m_formWindow->getPosition() - m_formWindow->getChildWidgetsOffset() + m_scrollablePanel->getContentOffset();
auto selectedWidget = m_selectedWidget->ptr;
const float step = 10;
bool updated = false;
if (m_draggingWidget)
{
while (pos.x - m_draggingPos.x >= step)
while (pos.x - m_draggingPos.x >= MOVE_STEP)
{
selectedWidget->setPosition({selectedWidget->getPosition().x + step, selectedWidget->getPosition().y});
m_draggingPos.x += step;
selectedWidget->setPosition({selectedWidget->getPosition().x + MOVE_STEP, selectedWidget->getPosition().y});
m_draggingPos.x += MOVE_STEP;
updated = true;
}
while (m_draggingPos.x - pos.x >= step)
while (m_draggingPos.x - pos.x >= MOVE_STEP)
{
selectedWidget->setPosition({selectedWidget->getPosition().x - step, selectedWidget->getPosition().y});
m_draggingPos.x -= step;
selectedWidget->setPosition({selectedWidget->getPosition().x - MOVE_STEP, selectedWidget->getPosition().y});
m_draggingPos.x -= MOVE_STEP;
updated = true;
}
while (pos.y - m_draggingPos.y >= step)
while (pos.y - m_draggingPos.y >= MOVE_STEP)
{
selectedWidget->setPosition({selectedWidget->getPosition().x, selectedWidget->getPosition().y + step});
m_draggingPos.y += step;
selectedWidget->setPosition({selectedWidget->getPosition().x, selectedWidget->getPosition().y + MOVE_STEP});
m_draggingPos.y += MOVE_STEP;
updated = true;
}
while (m_draggingPos.y - pos.y >= step)
while (m_draggingPos.y - pos.y >= MOVE_STEP)
{
selectedWidget->setPosition({selectedWidget->getPosition().x, selectedWidget->getPosition().y - step});
m_draggingPos.y -= step;
selectedWidget->setPosition({selectedWidget->getPosition().x, selectedWidget->getPosition().y - MOVE_STEP});
m_draggingPos.y -= MOVE_STEP;
updated = true;
}
}
@ -428,69 +496,69 @@ void Form::onDrag(sf::Vector2i mousePos)
{
if (m_draggingSelectionSquare == m_selectionSquares[1]) // Top
{
while (pos.y - m_draggingPos.y >= step)
while (pos.y - m_draggingPos.y >= MOVE_STEP)
{
selectedWidget->setPosition({selectedWidget->getPosition().x, selectedWidget->getPosition().y + step});
selectedWidget->setSize({selectedWidget->getSize().x, selectedWidget->getSize().y - step});
m_draggingPos.y += step;
selectedWidget->setPosition({selectedWidget->getPosition().x, selectedWidget->getPosition().y + MOVE_STEP});
selectedWidget->setSize({selectedWidget->getSize().x, selectedWidget->getSize().y - MOVE_STEP});
m_draggingPos.y += MOVE_STEP;
updated = true;
}
while (m_draggingPos.y - pos.y >= step)
while (m_draggingPos.y - pos.y >= MOVE_STEP)
{
selectedWidget->setPosition({selectedWidget->getPosition().x, selectedWidget->getPosition().y - step});
selectedWidget->setSize({selectedWidget->getSize().x, selectedWidget->getSize().y + step});
m_draggingPos.y -= step;
selectedWidget->setPosition({selectedWidget->getPosition().x, selectedWidget->getPosition().y - MOVE_STEP});
selectedWidget->setSize({selectedWidget->getSize().x, selectedWidget->getSize().y + MOVE_STEP});
m_draggingPos.y -= MOVE_STEP;
updated = true;
}
}
else if (m_draggingSelectionSquare == m_selectionSquares[3]) // Right
{
while (pos.x - m_draggingPos.x >= step)
while (pos.x - m_draggingPos.x >= MOVE_STEP)
{
selectedWidget->setSize({selectedWidget->getSize().x + step, selectedWidget->getSize().y});
m_draggingPos.x += step;
selectedWidget->setSize({selectedWidget->getSize().x + MOVE_STEP, selectedWidget->getSize().y});
m_draggingPos.x += MOVE_STEP;
updated = true;
}
while (m_draggingPos.x - pos.x >= step)
while (m_draggingPos.x - pos.x >= MOVE_STEP)
{
selectedWidget->setSize({selectedWidget->getSize().x - step, selectedWidget->getSize().y});
m_draggingPos.x -= step;
selectedWidget->setSize({selectedWidget->getSize().x - MOVE_STEP, selectedWidget->getSize().y});
m_draggingPos.x -= MOVE_STEP;
updated = true;
}
}
else if (m_draggingSelectionSquare == m_selectionSquares[5]) // Bottom
{
while (pos.y - m_draggingPos.y >= step)
while (pos.y - m_draggingPos.y >= MOVE_STEP)
{
selectedWidget->setSize({selectedWidget->getSize().x, selectedWidget->getSize().y + step});
m_draggingPos.y += step;
selectedWidget->setSize({selectedWidget->getSize().x, selectedWidget->getSize().y + MOVE_STEP});
m_draggingPos.y += MOVE_STEP;
updated = true;
}
while (m_draggingPos.y - pos.y >= step)
while (m_draggingPos.y - pos.y >= MOVE_STEP)
{
selectedWidget->setSize({selectedWidget->getSize().x, selectedWidget->getSize().y - step});
m_draggingPos.y -= step;
selectedWidget->setSize({selectedWidget->getSize().x, selectedWidget->getSize().y - MOVE_STEP});
m_draggingPos.y -= MOVE_STEP;
updated = true;
}
}
else if (m_draggingSelectionSquare == m_selectionSquares[7]) // Left
{
while (pos.x - m_draggingPos.x >= step)
while (pos.x - m_draggingPos.x >= MOVE_STEP)
{
selectedWidget->setPosition({selectedWidget->getPosition().x + step, selectedWidget->getPosition().y});
selectedWidget->setSize({selectedWidget->getSize().x - step, selectedWidget->getSize().y});
m_draggingPos.x += step;
selectedWidget->setPosition({selectedWidget->getPosition().x + MOVE_STEP, selectedWidget->getPosition().y});
selectedWidget->setSize({selectedWidget->getSize().x - MOVE_STEP, selectedWidget->getSize().y});
m_draggingPos.x += MOVE_STEP;
updated = true;
}
while (m_draggingPos.x - pos.x >= step)
while (m_draggingPos.x - pos.x >= MOVE_STEP)
{
selectedWidget->setPosition({selectedWidget->getPosition().x - step, selectedWidget->getPosition().y});
selectedWidget->setSize({selectedWidget->getSize().x + step, selectedWidget->getSize().y});
m_draggingPos.x -= step;
selectedWidget->setPosition({selectedWidget->getPosition().x - MOVE_STEP, selectedWidget->getPosition().y});
selectedWidget->setSize({selectedWidget->getSize().x + MOVE_STEP, selectedWidget->getSize().y});
m_draggingPos.x -= MOVE_STEP;
updated = true;
}
}
@ -500,9 +568,9 @@ void Form::onDrag(sf::Vector2i mousePos)
sf::Vector2f change;
if (ratio <= 1)
change = sf::Vector2f(step, step * ratio);
change = sf::Vector2f(MOVE_STEP, MOVE_STEP * ratio);
else
change = sf::Vector2f(step / ratio, step);
change = sf::Vector2f(MOVE_STEP / ratio, MOVE_STEP);
if (m_draggingSelectionSquare == m_selectionSquares[0]) // Top left
{

View File

@ -299,6 +299,15 @@ void GuiBuilder::mainLoop()
if (m_selectedForm)
m_selectedForm->mouseMoved({event.mouseMove.x, event.mouseMove.y});
}
else if (event.type == sf::Event::KeyPressed)
{
if ((event.key.code == sf::Keyboard::Key::Left) || (event.key.code == sf::Keyboard::Key::Right)
|| (event.key.code == sf::Keyboard::Key::Up) || (event.key.code == sf::Keyboard::Key::Down))
{
if (m_selectedForm && m_selectedForm->hasFocus())
m_selectedForm->arrowKeyPressed(event.key);
}
}
m_gui.handleEvent(event);
}
@ -788,24 +797,32 @@ void GuiBuilder::addPropertyValueWidgets(float& topPosition, const PropertyValue
const std::vector<std::string> enumValues = tgui::Deserializer::split(type.substr(5, type.size() - 6), ',');
addPropertyValueEnum(property, value, onChange, topPosition, enumValues);
}
else if (type == "Font")
{
// TODO: Allowing picking font from list (e.g. managed similar to themes) or via file dialog.
addPropertyValueEditBox(property, value, onChange, topPosition, 0);
}
else if (type == "Texture")
{
// TODO: Open dialog where filename, bounding rect and middle rect can be chosen
addPropertyValueEditBox(property, value, onChange, topPosition, 0);
}
else if (type == "List<String>")
{
// TODO: Open dialog with list box and edit box where items can be added and removed to list
addPropertyValueEditBox(property, value, onChange, topPosition, 0);
}
else
{
const bool valueEditBoxExists = (m_propertiesContainer->get<tgui::EditBox>("Value" + property) != nullptr);
auto valueEditBox = addPropertyValueEditBox(property, value, onChange, topPosition, 0);
if (!valueEditBoxExists)
{
if (type == "UInt")
valueEditBox->setInputValidator(tgui::EditBox::Validator::UInt);
else if (type == "Int")
valueEditBox->setInputValidator(tgui::EditBox::Validator::Int);
else if (type == "Float")
valueEditBox->setInputValidator(tgui::EditBox::Validator::Float);
else if (type == "Char")
valueEditBox->setMaximumCharacters(1);
//else if (type != "String")
// std::cerr << "DEBUG: Unhandled type: " << type << "\n";
}
if (type == "UInt")
valueEditBox->setInputValidator(tgui::EditBox::Validator::UInt);
else if (type == "Int")
valueEditBox->setInputValidator(tgui::EditBox::Validator::Int);
else if (type == "Float")
valueEditBox->setInputValidator(tgui::EditBox::Validator::Float);
else if (type == "Char")
valueEditBox->setMaximumCharacters(1);
}
topPosition += EDIT_BOX_HEIGHT - propertyEditBox->getRenderer()->getBorders().getBottom();