Как обновить панели 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 константы, чтобы разрешить это. я имею задал новый вопрос об этом.

Я буду продолжать пробовать некоторые новые вещи.

41

Решение

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

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

-2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]