2016-01-04 8 views
40

Skonfigurowałem prosty system wxAuiManager zawierający osiem kontrolek tekstowych, każdy skonfigurowany jako panel, z wszystkimi ustawionymi wokół centralnej kontroli statycznej. Mam dwa z nich, które są przyciągane do górnego, lewego, prawego i dolnego panelu. Ta część działa dobrze.Jak odświeżyć panele wxAuiManager podczas aktualizowania ich właściwości wxxp?

Chciałbym teraz zmodyfikować właściwości każdego panelu, co, jak myślę, może zostać wykonane przez zresetowanie skojarzonego wxAuiPaneInfo. Na przykład chciałbym dodać/usunąć ikony pinezek lub maksymalizacji. Mogę sprawić, żeby to działało samo w sobie, ale ponowne rysowanie zarządzanego okna po zresetowaniu tych właściwości okazuje się być pewnym wyzwaniem.

Oto kod używam obecnie:

// Get the currently selected pane 
    $paneIndex = $this->getSelectedPaneIndex(); 
    /* @var $paneInfo wxAuiPaneInfo */ 
    $paneInfo = $this->getPaneInfoByIndex($paneIndex); 

    // Set new flag true/false on paneinfo, using setter methods 
    /* @var $ctrl wxCheckBox */ 
    $ctrl = wxDynamicCast($event->GetEventObject(), "wxCheckBox"); 
    $methods = $this->getPaneSetterMethods(); 
    $method = $methods[$ctrl->GetName()]; 
    $paneInfo->$method($ctrl->GetValue()); 

    /* @var $window \wxTextCtrl */ 
    /* @var $manager \wxAuiManager */ 
    $window = $this->getManagedWindow()->getWindowByIndex($paneIndex); 
    $manager = $this->getManagedWindow()->getAuiManager(); 

    // This sort of works, but the pane sometimes ends up being moved 
    $manager->DetachPane($window); 
    $manager->AddPane($window, $paneInfo); 

    // Now redraw the panes 
    $this->getManagedWindow()->getAuiManager()->Update(); 

Jak widać, to, co obecnie zrobić, to odłączyć panel od kierownika, dodaj je ponownie, a następnie zmusić zarządcę do ponownego wszystko. To jest w porządku, z wyjątkiem tego, że często zmienia położenie okna w nowej pozycji. Nie "czuje się dobrze" - modyfikowanie tych właściwości musi być możliwe do osiągnięcia niezależnie od odłączenia szyby.

Zamiast tego myślałem, że warto byłoby próbuje ukryć i pokazać okienko, bezskutecznie:

// This does not work at all 
    $paneInfo->Hide(); 
    $paneInfo->Show(); 

Również próbowałem użyciem ładowacza okienka, choć nie wiem co "ciąg perspektywy" jest - nie jest to właściwość kontrolna, o ile mogę powiedzieć.

// The string should be a "perspective string" 
    $this->getManagedWindow()->getAuiManager()->LoadPaneInfo('auiPane0', $paneInfo); 

Podsumowując: Mam działające rozwiązanie, ale nie jest to idealne rozwiązanie, ponieważ powoduje ono ponowne otwarcie danego panelu. Przypuszczam, że mogłem opracować poprawne polecenie, aby ponownie umieścić go w tym samym miejscu, ale nadal wydaje mi się, że powinienem móc to zrobić w łatwiejszy sposób.

Wszelkie pomysły?


Update: Znalazłem się jak przechwytywać informacje szyby za pomocą perspektyw, które mogą być wykonane w następujący sposób:

$this->winSave = []; 
for($i = 0; $i <= 7; $i++) 
{ 
    $pi = $this->getPaneInfoByIndex($i); 
    $persp = $this->getManagedWindow()->getAuiManager()->SavePaneInfo($pi); 
    echo $persp . "\n"; 
    $this->winSave[$i] = $persp; 
} 

Wszystko co trzeba zrobić to teraz, aby przechwycić zdarzenie szyba przenieść, a wtedy mogę użyć tych danych z LoadPaneInfo(). Jest to nieco trudniejsze - wxPHP nie wydaje wystarczających stałych, aby na to pozwolić. Mam o tym asked a new question.

Będę nadal próbować nowych rzeczy.

+0

Czy to działa? Mam coś z tego samego problemu w moim projekcie ... – Gal

+1

@ Gal, nie próbowałem niczego nowego odkąd napisałem post. Raczej zabrakło pomysłów, więc toleruję to na razie i mam nadzieję, że ktoś to zauważy w przyszłości. Czy używasz wxPHP specjalnie, lub wxWidgets z innym powiązaniem języka? – halfer

+1

Mam nadzieję, że ktoś to zauważy i będzie mógł pomóc. Używam wxWidgets z powiązaniem Python. – Gal

Odpowiedz

-2

Porzuciłem to zadanie przed jego ukończeniem. Jak sobie przypominam, nie było łatwego sposobu na odświeżenie paneli, a podczas gdy obecny opiekun wykonał pewną, szterlingową pracę nad projektem, nie ma już czasu, aby nad nim pracować, a zatem został nieco porzucony. Może to wynikać z trudności ze śledzeniem niezręcznych błędów niezawodnościowych lub z wyzwaniem uzyskania skompilowanych binariów rozszerzających PHP do oficjalnych repozytoriów głównych dystrybucji Linuksa.

Postaram się zaktualizować tę odpowiedź za pomocą powiązanego zgłoszenia błędu dla wxPHP, ale na razie może być rozsądnie dla użytkowników, aby uważali to za "niemożliwe", ponieważ włożyłem wiele starać się go rozwiązać. Oczywiście, jeśli ktoś znajdzie wiarygodny sposób osiągnięcia tego celu, dodaj własną odpowiedź, a ja wybiorę ją zamiast tej.

Powiązane problemy