Подтвердить что ты не робот

Как обновить панели wxAuiManager при обновлении их свойств в wxPHP?

Я создал простую систему wxAuiManager, содержащую восемь текстовых элементов управления, каждая из которых настроена как панель, причем все они расположены вокруг центрального статического элемента управления. У меня есть два, каждый из которых привязан к верхним, левым, правым и нижним направлениям. Эта часть отлично работает.

Теперь я хотел бы изменить свойства каждой панели, что, я думаю, можно сделать, сбросив связанный wxAuiPaneInfo. Например, я хотел бы добавить/удалить пиктограммы или увеличить значки. Я могу заставить это работать сам по себе, но перерисовать управляемое окно после сброса этих свойств оказалось немного сложной задачей.

Вот код, который я использую в настоящее время:

    // 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();

Как вы можете видеть, что я сейчас делаю, это отделить панель от менеджера, снова добавить его, а затем заставить менеджера перерисовать все. Это нормально, за исключением того, что он часто переводит окно в новое положение. Он также не "чувствует себя хорошо" - изменение этих свойств должно быть осуществимо независимо от отсоединения панели.

Вместо этого я подумал, что стоит попытаться скрыть и показать панель, безрезультатно:

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

Кроме того, я попытался использовать загрузчик панелей, хотя я не знаю, что такое "строка перспективы" - это не свойство управления, насколько я могу судить.

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

Итак, вкратце: у меня есть рабочее решение, но оно не идеально, так как оно переделывает рассматриваемую панель. Я полагаю, что я мог бы выработать правильную команду, чтобы повторно установить ее в том же месте, но мне все еще кажется, что я могу сделать это проще.

Любые идеи?


Обновление: я узнал, как захватить информацию о панели с помощью перспектив, что можно сделать так:

$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;
}

Все, что мне нужно сделать, это захватить событие перемещения панели, а затем я смогу использовать эти данные с помощью LoadPaneInfo(). Это несколько сложно: wxPHP, по-видимому, не дает достаточных констант wxEVT, чтобы это разрешить. Я задал новый вопрос об этом.

Я продолжу попробовать что-то новое.

4b9b3361

Ответ 1

Я оставил эту задачу перед ее завершением. Насколько я помню, не было простого способа обновить панели, и, хотя нынешний сопровождающий проделал некоторую работу над проектом, у них больше нет времени, чтобы работать над ним, и, таким образом, он стал несколько заброшен. Это может быть связано с трудностью отслеживания ошибок неудобной надежности или с задачей получения скомпилированных бинарных файлов PHP в официальных репозиториях основных дистрибутивов Linux.

Я попытаюсь обновить этот ответ с соответствующим сообщением об ошибке для wxPHP, но пока может быть разумным, если бы пользователи считали это "невозможным" на данный момент, так как я приложил много усилий в попытке решить эту проблему. Конечно, если кто-то найдет надежный способ достижения этой цели, добавьте свой собственный ответ, и я выберу его в предпочтении этому.