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