Got it, thank you! I will implement it like this for now and will wait until you add this future.
This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.
Show posts MenuQuote from: texus on 22 May 2020, 16:12:03
but you could just replace the text with an actual Label widget for now.
. I just have to update maximum text width every time widget changes its size.
class MyTguiSlider : public Panel
{
public:
typedef std::shared_ptr<MyTguiSlider> Ptr;
typedef std::shared_ptr<const MyTguiSlider> ConstPtr;
MyTguiSlider(const sf::String& name, const Layout width = { "100%"});
~MyTguiSlider() {};
static MyTguiSlider::Ptr create(const sf::String& name, const Layout width = { "100%" });
protected:
private:
Label::Ptr m_nameLabel;
Label::Ptr m_valueLabel;
Slider::Ptr m_slider;
};
tgui::MyTguiSlider::MyTguiSlider(const sf::String& name, const Layout width)
{
m_valueLabel = Label::create("100.00");
m_slider = Slider::create();
m_nameLabel = Label::create(name);
getRenderer()->setBackgroundColor({ 100, 100, 60 });
m_slider->setSize("95%", 10);
m_slider->setPosition("&.w/2 - w/2", "nameLabel.bottom + h");
add(m_slider, "slider");
m_valueLabel->setHorizontalAlignment(Label::HorizontalAlignment::Right);
m_valueLabel->setPosition("slider.right - width", "slider.top - height");
add(m_valueLabel, "valueLabel");
m_nameLabel->setMaximumTextWidth(m_slider->getSize().x - m_valueLabel->getSize().x - 10);
m_nameLabel->setPosition("slider.left", 0);
add(m_nameLabel, "nameLabel");
setSize(width, "slider.bottom + 10");
}
Quote from: texus on 24 May 2019, 11:34:06how can I do that?
So basically call gui.handleEvent for every event except for the space key press event.
if(event.type == Event::KeyPressed && event.key.code == Keyboard::Space)
{
handleSpaceKeyEvent();
return;
}
gui.handleEvent();
/* handle other events */
auto button = tgui::Button::create();
button->setRenderer(theme.getRenderer("Button"));
button->connect("pressed", [](){std::cout<<"button pressed" << endl;});
gui->add(button);
/* --- */
sf::Event event;
while (window->isOpen())
{
while (window->pollEvent(event))
{
/* --- */
gui.handleEvent(event);
if (event->type == Event::KeyPressed)
switch (event->key.code)
{
case Keyboard::Space:
cout<< "space key pressed"<<endl;
break;
/* --- */
}
/* --- */
}
}
int main()
{
sf::RenderWindow window(sf::VideoMode(800, 600), "TGUI window");
window.setFramerateLimit(60);
tgui::Gui gui(window);
try
{
tgui::Theme theme{ "../themes/Black.txt" };
gui.add(tgui::Picture::create("../RedBackground.jpg"));
auto label = tgui::Label::create();
label->setRenderer(theme.getRenderer("Label"));
label->setText("Hold down the mouse button on list box and move the mouse over items");
label->setPosition(70, 30);
label->setTextSize(18);
gui.add(label);
label = tgui::Label::create();
label->setRenderer(theme.getRenderer("Label"));
label->setText("ComboBox");
label->setPosition(150, 80);
label->setTextSize(18);
gui.add(label);
auto comboBox = tgui::ComboBox::create();
comboBox->setRenderer(theme.getRenderer("ComboBox"));
comboBox->setSize(200, 21);
comboBox->setPosition(150, 100);
comboBox->connect("ItemSelected", []() { cout << "Item selected" << endl; });
comboBox->addItem("Item 1");
comboBox->addItem("Item 2");
comboBox->addItem("Item 3");
comboBox->addItem("Item 4");
comboBox->addItem("Item 5");
comboBox->addItem("Item 6");
comboBox->setSelectedItem("Item 2");
gui.add(comboBox);
label = tgui::Label::create();
label->setRenderer(theme.getRenderer("Label"));
label->setText("ComboBox with heavy functions");
label->setPosition(450, 80);
label->setTextSize(18);
gui.add(label);
comboBox = tgui::ComboBox::create();
comboBox->setRenderer(theme.getRenderer("ComboBox"));
comboBox->setSize(200, 21);
comboBox->setPosition(450, 100);
comboBox->connect("ItemSelected", []() {this_thread::sleep_for(500ms); cout << "hard work done" << endl; });
comboBox->addItem("Item 1");
comboBox->addItem("Item 2");
comboBox->addItem("Item 3");
comboBox->addItem("Item 4");
comboBox->addItem("Item 5");
comboBox->addItem("Item 6");
comboBox->setSelectedItem("Item 2");
gui.add(comboBox);
auto button = tgui::Button::create();
button->setRenderer(theme.getRenderer("Button"));
button->setPosition(window.getSize().x - 115.f, window.getSize().y - 50.f);
button->setText("Exit");
button->setSize(100, 40);
button->connect("pressed", [&]() { window.close(); });
gui.add(button);
}
catch (const tgui::Exception& e)
{
std::cerr << "TGUI Exception: " << e.what() << std::endl;
return EXIT_FAILURE;
}
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
gui.handleEvent(event);
}
window.clear();
gui.draw();
window.display();
}
return EXIT_SUCCESS;
}
class BaseWindow;
class myRWindow : public sf::RenderWindow
{
BaseWindow * state;
public:
void changeState(BaseWindow *st) { state = st; }
void handleEvent(Event *event) { state->handleEvent(event); }
void drawCurrentState() { state->draw(); };
};
class BaseWindow
{
public:
virtual void draw() = 0;
virtual void handleEvent(sf::Event *) = 0;
protected:
myRWindow *contex;
};
class WindowStateA : public BaseWindow
{
private:
tgui::Gui gui;
void onComboBoxItemSelected(tgui::Widget::Ptr, const sf::String&)
{
/* --- */
WindowStateB *windB = WindowStateB::getInstance();
contex->changeState(windB);
windB->doSomethingAndReturn(this);
};
public:
virtual void draw();
virtual void handleEvent(sf::Event & ev) { gui.handleEvent(ev); };
};
class WindowStateB : public BaseWindow
{
public:
void doSomethingAndReturn(BaseWindow * wst) // and return to window
{
auto contWind = contex;
auto changeState = [contWind, wst]() {contWind->changeState(wst); };
/* --- */
// working in another thread while showong animation. After finishing work changeState will be called
/* --- */
}
virtual void draw();
virtual void handleEvent(sf::Event & ev);
};
Quote from: texus on 10 March 2019, 11:54:38Yes
What should the function do exactly? Place some text in the ComboBox when none of its items are selected yet?