В wxPHP есть событие перемещения (или стыковки) панели AUI?

На этот вопрос Я пытался захватить конфигурацию панели AUI, чтобы ее можно было восстановить, если какие-либо панели были закрыты. Документы для wxPHP несколько ограничены, а для wxWidgets — апстрим, поэтому я в основном чувствую, как все получается.

Я понял, что SavePaneInfo поможет мне захватить состояние панели — он выводит перспективная строка это представляет положение и параметры для панели в данный момент. Поэтому все, что мне нужно сделать, — это зафиксировать изменение панели и обновить ее внутреннее представление.

Ради интереса перспектива выглядит так:

имя = auiPane3; заголовок = заголовок 3; состояние = 2099196; dir = 3; слой = 0; строка = 0; pos = 1; prop = 100000; bestw = 90; besth = 25; minw = -1; minh = -1 ; maxw = -1; MAXH = -1; floatx = -1; плавучим = -1; floatw = -1; floath = -1

Тем не менее, захват события перемещения / дока не оказывается тривиальным. Я вижу шесть событий, связанных с AUI:

wxEVT_AUI_FIND_MANAGER
wxEVT_AUI_PANE_BUTTON
wxEVT_AUI_PANE_CLOSE
wxEVT_AUI_PANE_MAXIMISE
wxEVT_AUI_PANE_RESTORE
wxEVT_AUI_PANE_RENDER

Мне удалось захватить события восстановления и закрытия, и find_manager, похоже, ничего не делает. я пробовал wxEVT_ANY в этом окне, которое также, кажется, ничего не захватывает. Я также попробовал это на отдельных панелях, но безрезультатно (насколько я могу судить, ничего не называется):

$managedWindow->getWindowByIndex(0)->Connect(wxEVT_ANY, array($this, "onAny"));

Документы для вышестоящей библиотеки wxWidgets упоминают это событие:

EVT_AUI_PANE_ACTIVATED

Однако это, похоже, не реализовано в wxPHP — это то, что я хочу? Это звучит не совсем правильно, но если бы я мог получить к нему доступ без константы, я бы обязательно попробовал.

Я думаю, я мог бы использовать wxAuiManager::SetArtProvider со стандартным объектом арт-провайдера, модифицированным для захвата состояния панели, но похоже на кувалду, чтобы сломать орех. Я также мог бы зафиксировать событие закрытия и изменить возвращаемую строку перспективы, чтобы бит «закрыто» не был установлен, но это тоже не особенно элегантно.

То, что я хочу сделать, кажется действительно тривиальным и согласуется с другими частями wxWidgets, но это не так. Любые предложения для вещей, чтобы попробовать?

3

Решение

У меня есть решение. Я хотел бы обнаружить из wxAuiManagerEvent какая панель закрывается, так что я просто записываю перспективную строку панели, когда она закрывается. Однако это не представляется возможным:

  • Ссылка от $event->GetEventObject() является NULL — это может быть ошибка wxPHP;
  • Панель возвращается $event->GetPane() не имеет свойства или метода для чтения имени панели.

Поэтому я принял подход сохранения всех строк перспективы, когда одна панель закрыта.

Я обнаружил, что строки перспективы содержат бит для представления закрытого состояния панели, поэтому при сохранении этих строк я удостоверяюсь, что этот бит не установлен. Сборка строк перспективы — не самая элегантная вещь, но она работает и намного лучше, чем расстыковка и повторная разблокировка (см. Связанный вопрос в оригинальном посте).

Вот некоторый код, который проходит по моим панелям, получает строку перспективы, снимает флаг закрытия и сохраняет перспективу в списке окон:

public function onPaneClose(wxAuiManagerEvent $event)
{
for($i = 0; $i <= 7; $i++)
{
$pi = $this->getPaneInfoByIndex($i);
$persp = $this->getManagedWindow()->getAuiManager()->SavePaneInfo($pi);

// Split perspective string into pieces, get the second one (state)
$items = explode(';', $persp);
$state = $items[2];

// Decode the bitfield within
$stateItems = explode('=', $state);
$stateBitfield = (int) $stateItems[1];

// Set up bitmask to ignore closed state
$bitMask = (-1 ^ 2);

// Reset the perspective string minus the closed state bit
$replacementBitfield = $stateBitfield & $bitMask;
$items[2] = "state=" . $replacementBitfield;
$newPersp = implode(';', $items);

// Finally save the perspective
$this->windowSaves[$i] = $newPersp;
}
}
2

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

Я нашел другое решение, которое я думаю, что я в меру предпочитаю. Оказывается это является можно получить имя панели из wxAuiPaneInfo объект — перспектива содержит его! Это позволяет мне упростить алгоритм — я просто преобразую имя в порядковый номер, а затем индивидуально сохраняю перспективы панели.

Поскольку события закрытия панели всегда инициируются до закрытия (то есть, когда они все еще доступны для вето), им не будет установлен бит закрытия, и, к счастью, мне не нужно это изменять. Вот мой новый обработчик событий:

public function onPaneClose(wxAuiManagerEvent $event)
{
// In the absence of being able to read the pane name from a paneinfo
// method, we can parse it out from the perpective string
$info = $event->GetPane();
$persp = $this->getManagedWindow()->getAuiManager()->SavePaneInfo($info);

// Fish out the number, which represents the pane ordinal
$matches = [];
preg_match('#name=auiPane(\d+)#', $persp, $matches);
if ($matches)
{
$index = $matches[1];
$this->windowSaves[$index] = $persp;
}
}

Я только что использовал регулярное выражение в строке перспективы, которая соответствует моему формату именования auiPane<index>,

0

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