Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Tylko jeden aktywny widget

Ostatnio zmodyfikowano 2014-10-06 17:39
Autor Wiadomość
Jakobez
Temat założony przez niniejszego użytkownika
Tylko jeden aktywny widget
» 2014-10-05 19:04:12
Witam , jestem w trakcie pisania gui'a i mam problem z blokadą która będzie pozwalać tylko jednemu elementowi kontenera na bycie drag and dropowanym . Gdy jeden widget będzie przesuwany reszta nie będzie mogła być przesuwana. Posiadam klase która obsługuje widgetami
C/C++
class GUIDESKTOP
{
public:
    GUIDESKTOP();
    ~GUIDESKTOP();
    GUIDESKTOP( sf::RenderWindow & window );
   
    sf::RenderWindow & okno;
   
    void AddWidget( std::shared_ptr < JSFELEMENT > element );
    void DestroyAllWidgets();
    void DestroyWidget();
    void HandleWidgetEvents();
    void DrawWidgets();
    void CheckActiveWidget();
   
private:
    std::list < std::shared_ptr < JSFELEMENT > > Desktop;
    std::list < std::shared_ptr < JSFELEMENT > >::iterator it;
    int elements { 0 };
   
};

A tutaj funkcja odpowiadająca za dnd ( tak , wiem że nie jest zbyt efektywna , ważne że dziala :D )
C/C++
virtual void DragNDrop( sf::RenderWindow & window ) override
{
    if( sf::Mouse::isButtonPressed( sf::Mouse::Left )
    && sf::Mouse::getPosition( window ).x >= shape.getPosition().x
    && sf::Mouse::getPosition( window ).x <= shape.getPosition().x + shape.getSize().x
    && sf::Mouse::getPosition( window ).y >= shape.getPosition().y
    && sf::Mouse::getPosition( window ).y <= shape.getPosition().y + shape.getSize().y )
    {
       
        shape.setPosition( sf::Mouse::getPosition( window ).x - 50, sf::Mouse::getPosition( window ).y - 30 );
       
    }
   
   
}

I funkcja gui desktopa
C/C++
void GUIDESKTOP::HandleWidgetEvents()
{
    if( elements > 0 )
    {
        for( it = Desktop.begin(); it != Desktop.end(); it++ )
        {
            ( * it )->DragNDrop( okno );
           
        }
    }
}
I teraz pytanie : jak to zrobić ? Myślałem nad stworzeniem funkcjii która zwróci gui managerowi iterator który ma być wyokonywany a reszta będzie ignorowana lecz to raczej nie zadziała.
P-117993
Jacob99
» 2014-10-05 20:11:56
daj każdemu widgetowi unikalne id
P-117999
Jakobez
Temat założony przez niniejszego użytkownika
» 2014-10-05 20:20:33
No to lepiej wrzucić to w std::map , jednak chyba nie o to chodzi ... Chodzi o to że gdy myszka jest w widgecie i wcisne przycisk to sie przesuwa , jest problem gdy przesune widget na drugi i w tym momencie gdy przesune jeden na drugi złączają się i przesuwam dwa na raz . Funckja gui managera(guidesktop) powinna sprawdzać czy jakiś widget jest w tym momencie przesuwany i blokować funkcję przesuwania innych ...

edit :
problem rozwiazany , zamykam.
P-118002
Jacob99
» 2014-10-06 17:39:19
stwórz dla każdego widgetu prostokąt np. IntRect i później sprawdzaj czy widget drag'n'drop-owany nie wchodzi na drugi widget.
P-118029
« 1 »
  Strona 1 z 1