cli application php wxwidgets wxphp

application - ¿Cómo actualizar los paneles de wxAuiManager al actualizar sus propiedades en wxPHP?



php graphic interface (1)

He configurado un sistema simple wxAuiManager que contiene ocho controles de texto, cada uno configurado como un panel, todos dispuestos alrededor de un control central estático. Tengo dos cada uno ajustado a las direcciones del panel superior, izquierdo, derecho e inferior. Esta parte funciona bien.

Ahora me gustaría modificar las propiedades de cada panel, lo que creo que se puede hacer restableciendo el wxAuiPaneInfo asociado. Por ejemplo, me gustaría agregar / eliminar el pin o maximizar los iconos. Puedo hacer que esto funcione en sí mismo, pero volver a dibujar la ventana administrada después de restablecer estas propiedades es un reto.

Aquí está el código que estoy usando actualmente:

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

Como puede ver, lo que actualmente hago es separar el panel del administrador, volver a agregarlo y luego forzar al administrador a volver a dibujar todo. Esto está bien, excepto que a menudo vuelve a bloquear la ventana en una nueva posición. Tampoco "se siente bien": la modificación de estas propiedades debe poder lograrse independientemente de separar el panel.

En lugar de esto, pensé que valdría la pena intentar ocultar y mostrar el panel, en vano:

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

Además, he intentado usar el cargador de paneles, aunque no sé qué es una "cadena de perspectiva", no es una propiedad de control por lo que puedo decir.

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

Entonces, en resumen: tengo una solución que funciona pero no es la ideal, ya que vuelve a bloquear el panel en cuestión. Supongo que podría encontrar el comando correcto para volver a acoplarlo en el mismo lugar, pero aún siento que debería poder hacerlo de una manera más fácil.

¿Algunas ideas?

Actualización: he descubierto cómo capturar información del panel utilizando perspectivas, que se puede hacer de la siguiente manera:

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

Todo lo que debo hacer ahora es capturar un evento de movimiento de panel, y luego puedo usar estos datos con LoadPaneInfo() . Esto está resultando algo difícil: wxPHP no parece proporcionar suficientes constantes wxEVT para permitir esto. He hecho una nueva pregunta sobre esto.

Continuaré probando algunas cosas nuevas.


Abandoné esta tarea antes de completarla. Como recuerdo, no había una manera fácil de actualizar los paneles, y aunque el mantenedor actual ha realizado un excelente trabajo en el proyecto, ya no tiene tiempo para trabajar en él y, por lo tanto, se ha convertido en algo abandonado. Esto puede deberse a la dificultad de rastrear errores de confiabilidad torpes, o al desafío de obtener los binarios compilados de extensión PHP en los repositorios oficiales de las principales distribuciones de Linux.

Intentaré actualizar esta respuesta con un informe de error relacionado para wxPHP, pero por el momento puede ser prudente que los usuarios consideren esto como "no posible" por el momento, ya que hice un gran esfuerzo para intentar resuélvelo. Por supuesto, si alguien encuentra una manera confiable de lograr este objetivo, agregue su propia respuesta y la seleccionaré con preferencia a esta.