Я создал простую систему 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
чтобы это разрешить. Я задал новый вопрос об этом.
Я продолжу попробовать что-то новое.
Я оставил эту задачу до ее завершения. Насколько я помню, не было простого способа обновить панели, и, хотя нынешний сопровождающий проделал некоторую работу над проектом, у них больше нет времени, чтобы работать над ним, и, таким образом, он стал несколько заброшен. Это может быть связано с трудностью отслеживания ошибок неудобной надежности или с проблемой получения скомпилированных бинарных файлов PHP в официальных репозиториях основных дистрибутивов Linux.
Я попытаюсь обновить этот ответ со связанным сообщением об ошибке для wxPHP, но пока может быть разумным, чтобы пользователи рассматривали это как «невозможное» на данный момент, так как я прилагал много усилий для того, чтобы попытаться реши это. Конечно, если кто-то найдет надежный способ достижения этой цели, добавьте свой собственный ответ, и я выберу его в предпочтении этому.