wxPropertyGrid ругня после RemoveProperty - Insert wxPGProperty

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
Post Reply
Serge_N
Knows some wx things
Knows some wx things
Posts: 40
Joined: Thu Apr 13, 2017 1:34 pm

wxPropertyGrid ругня после RemoveProperty - Insert wxPGProperty

Post by Serge_N »

Что-то не могу понять в чём дело.

Нужно поднять вверх или опустить вниз wxPGProperty в wxPropertyGrid.

На wx3.0.4

Удаляю и сразу вставляю wxPGProperty в обработчике кнопки всё нормально опускается-поднимается вверх-низ, но когда кликаю на wxPGProperty получаю матюки:

Code: Select all

../src/propgrid/propgrid.cpp(4140): assert "m_wndEditor == __null" failed in DoSelectProperty().
А при закрытии приложения опять матюкается:

Code: Select all

../src/common/wincmn.cpp(477): assert "GetEventHandler() == this" failed in ~wxWindowBase(): any pushed event handlers must have been removed
На wx3.1.5
При закрытии

Code: Select all

Аварийный останов (стек памяти сброшен на диск)
Может кто-то сталкивался с этим багом или я делаю что-то не так?

Компилируемый код для демонстрации бага:

Code: Select all

#include <wx/app.h>
#include <wx/frame.h>
#include <wx/button.h>
#include <wx/msgdlg.h>
#include <wx/propgrid/propgrid.h>
#include <wx/propgrid/advprops.h>

#define wxID_BUTTON_UP 1000
#define wxID_BUTTON_DOWN 1001

class MyFrame : public wxFrame
{
    wxPropertyGrid* m_propertyGrid1;
    wxPGProperty* camProp;
    wxPGProperty* camProp2;
    wxPGProperty* camProp3;
    wxButton *m_buttonUp;
    wxButton *m_buttonDown;

public:
    MyFrame(wxWindow *parent, int id = wxID_ANY, wxString title = wxT("PropGridDemo")) : wxFrame(parent, id, title)
    {
        m_propertyGrid1 = new wxPropertyGrid(this, wxID_ANY, wxDefaultPosition, wxSize( 250,200 ), wxPG_DEFAULT_STYLE);
        m_propertyGrid1->Append( new wxPropertyCategory("StreetView",wxPG_LABEL) );
        camProp = m_propertyGrid1->Append(new wxStringProperty("Camera 1", wxPG_LABEL, ""));
        camProp2 = m_propertyGrid1->Append(new wxStringProperty("Camera 2", wxPG_LABEL, ""));
        camProp3 = m_propertyGrid1->Append(new wxStringProperty("Camera 3", wxPG_LABEL, ""));

        m_buttonUp = new wxButton( this, wxID_BUTTON_UP, wxT("Cam Up"), wxPoint(300,10), wxSize(80,35), 0 );
        m_buttonDown = new wxButton( this, wxID_BUTTON_DOWN, wxT("Cam Down"), wxPoint(300,60), wxSize(80,35), 0 );
        this->Bind( wxEVT_BUTTON, &MyFrame::OnButtonUpClick, this, wxID_BUTTON_UP );
        this->Bind( wxEVT_BUTTON, &MyFrame::OnButtonDownClick, this, wxID_BUTTON_DOWN );
    }

    void OnButtonUpClick( wxCommandEvent& event )
    {
        wxPGProperty* selectedPropUp = m_propertyGrid1->GetSelectedProperty();

        if (selectedPropUp)
        {
            int indexProp = selectedPropUp->GetIndexInParent();
            wxPGProperty* camProp = m_propertyGrid1->RemoveProperty(selectedPropUp->GetName());
            m_propertyGrid1->Insert("StreetView", indexProp-1, camProp);
        }
        else wxMessageBox("Select any Camera");
    }

    void OnButtonDownClick( wxCommandEvent& event )
    {
        wxPGProperty* selectedPropDown = m_propertyGrid1->GetSelectedProperty();

        if (selectedPropDown)
        {
            int indexProp = selectedPropDown->GetIndexInParent();
            wxPGProperty* camProp = m_propertyGrid1->RemoveProperty(selectedPropDown->GetName());
            m_propertyGrid1->Insert("StreetView", indexProp+1, camProp);
        }
        else wxMessageBox("Select any Camera");
    }

    ~MyFrame(){}

};

class MyApp : public wxApp
{
public:
    virtual bool OnInit()
    {
        MyFrame* frame = new MyFrame(0L);
        frame->Show(true);
        return true;
    }
};

wxIMPLEMENT_APP(MyApp);
OS: Ubuntu 20.04
wx 3.0.4 / 3.1.5
User avatar
T-Rex
Moderator
Moderator
Posts: 1249
Joined: Sat Oct 23, 2004 9:58 am
Location: Zaporizhzhya, Ukraine
Contact:

Re: wxPropertyGrid ругня после RemoveProperty - Insert wxPGProperty

Post by T-Rex »

В документации написано что удаления не происходит фактически до следующего idle евента. Мне кажется что есть смысл wxYield() вызвать перед вставкой, чтобы все события отработали. Или добавление вынести куда-то в событие и его через AddPendingEvent() тригернуть (зависит от логики приложения).
Serge_N
Knows some wx things
Knows some wx things
Posts: 40
Joined: Thu Apr 13, 2017 1:34 pm

Re: wxPropertyGrid ругня после RemoveProperty - Insert wxPGProperty

Post by Serge_N »

T-Rex wrote: Mon Feb 21, 2022 10:57 am В документации написано что удаления не происходит фактически до следующего idle евента. Мне кажется что есть смысл wxYield() вызвать перед вставкой, чтобы все события отработали. Или добавление вынести куда-то в событие и его через AddPendingEvent() тригернуть (зависит от логики приложения).
Спасибо.
wxYield() я в первую очередь попробовал. Не помогло.
А вот AddPendingEvent попытаюсь и о результах отпишусь.
User avatar
T-Rex
Moderator
Moderator
Posts: 1249
Joined: Sat Oct 23, 2004 9:58 am
Location: Zaporizhzhya, Ukraine
Contact:

Re: wxPropertyGrid ругня после RemoveProperty - Insert wxPGProperty

Post by T-Rex »

В общем, погонял немного этот пример. Как по мне, там действительно какой-то баг, связанный с тем, что не чистится выделение перед удалением. А если добавить пропертю повторно, то там старые флаги остаются. Попробуй сделать фабричный метод для пропертей и добавлять новый инстанс, вместо старого, а старый удалять. Дебажить в кишочках долго нет возможности, если будет настроение, может гляну еще более детально. Самому интересно, почему так.
Serge_N
Knows some wx things
Knows some wx things
Posts: 40
Joined: Thu Apr 13, 2017 1:34 pm

Re: wxPropertyGrid ругня после RemoveProperty - Insert wxPGProperty

Post by Serge_N »

T-Rex wrote: Tue Feb 22, 2022 9:49 am В общем, погонял немного этот пример. Как по мне, там действительно какой-то баг, связанный с тем, что не чистится выделение перед удалением. А если добавить пропертю повторно, то там старые флаги остаются. Попробуй сделать фабричный метод для пропертей и добавлять новый инстанс, вместо старого, а старый удалять. Дебажить в кишочках долго нет возможности, если будет настроение, может гляну еще более детально. Самому интересно, почему так.
Спасибо.
Я тоже покопаюсь в коде и если ничего не получится, то сначала в англоязычный раздел форума закину, а потом в рассылки, может разработчики подкинут идею, как выйти из ситуации.
ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 7480
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Re: wxPropertyGrid ругня после RemoveProperty - Insert wxPGProperty

Post by ONEEYEMAN »

Dobrogo vremeni sutok,
Moget poprobovat cherez CallAfter() vstavljat.
I esche - proverte kak budet rabotat v 3.1.5/ git master...

Moget vse uge pofikseno.

Spasibo.
Serge_N
Knows some wx things
Knows some wx things
Posts: 40
Joined: Thu Apr 13, 2017 1:34 pm

Re: wxPropertyGrid ругня после RemoveProperty - Insert wxPGProperty

Post by Serge_N »

ONEEYEMAN wrote: Fri Feb 25, 2022 5:30 pm Dobrogo vremeni sutok,
Moget poprobovat cherez CallAfter() vstavljat.
I esche - proverte kak budet rabotat v 3.1.5/ git master...

Moget vse uge pofikseno.

Spasibo.
Спасибо,
попробовал 3.1.5 из git master результат тот же, что и 3.1.5 не из git.
CallAfter() ещё не пробовал, как попробую напишу, но скорее всего результат будет тот же.
Повидмому это баг, который нужно исправлять в исходниках.
Post Reply