2016-01-04 16 views
40

Ho installato un semplice sistema wxAuiManager contenente otto controlli di testo, ciascuno configurato come un riquadro, con tutti disposti attorno a un controllo statico centrale. Ne ho scattate due in alto, a sinistra, a destra e in basso. Questa parte funziona bene.Come aggiornare i riquadri wxAuiManager durante l'aggiornamento delle proprietà in wxPHP?

Vorrei ora modificare le proprietà di ciascun riquadro, che credo possa essere eseguito reimpostando lo wxAuiPaneInfo associato. Ad esempio, vorrei aggiungere/rimuovere il pin o ingrandire le icone. Posso farlo funzionare da solo, ma ridisegnare la finestra gestita dopo aver ripristinato queste proprietà si sta rivelando un po 'una sfida.

Ecco il codice che sto usando al momento:

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

Come potete vedere, quello che attualmente fanno è quello di staccare il riquadro dal manager, riaggiungerlo, quindi forzare il manager di ridisegnare qualunque cosa. Questo va bene, tranne che spesso la finestra si arresta in una nuova posizione. Inoltre non "sembra giusto" - la modifica di queste proprietà deve essere possibile indipendentemente dal distacco del pannello.

Invece di questo ho pensato che sarebbe valsa la pena cercando di nascondere e visualizzare il riquadro, senza alcun risultato:

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

Inoltre, ho provato ad utilizzare il caricatore riquadro, anche se non so cosa sia un "stringa di prospettiva" è - non è una proprietà di controllo per quanto posso dire.

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

Così, in sintesi: ho una soluzione di lavoro, ma non è l'ideale, dal momento che redocks riquadro in questione. Suppongo che potrei elaborare il comando corretto per ridistribuirlo nello stesso posto, ma sembra che dovrei essere in grado di farlo in un modo più semplice.

Qualche idea?


Update: ho trovato il modo di acquisire informazioni riquadro con punti di vista, che può essere fatto così:

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

Tutto quello che dobbiamo fare ora è quello di catturare un evento riquadro mossa, e quindi posso utilizzare questi dati con LoadPaneInfo(). Ciò si sta dimostrando piuttosto difficile - wxPHP non sembra fornire costanti sufficienti wxEVT per consentire questo. Ho asked a new question su questo.

Continuerò a provare alcune novità.

+0

Hai funzionato? Sto avendo qualcosa dello stesso problema sul mio progetto ... – Gal

+1

@Gal, non ho provato nulla di nuovo da quando ho scritto il post. Piuttosto ho esaurito le idee, quindi lo sto tollerando per ora e spero che qualcuno lo noti in futuro. Stai usando wxPHP in particolare, o wxWidgets con un altro linguaggio vincolante? – halfer

+1

Spero che qualcuno lo noterà e sarà in grado di aiutare. Sto usando wxWidgets con Python bind. – Gal

risposta

-2

Ho abbandonato questa attività prima di completarla. Ricordo che non c'era un modo semplice per aggiornare i riquadri, e mentre il manutentore attuale ha fatto un buon lavoro sul progetto, non hanno più tempo per lavorarci e quindi è stato in qualche modo abbandonato. Ciò potrebbe essere dovuto alla difficoltà di tracciare bug di affidabilità scomoda o alla sfida di ottenere i binari di estensione PHP compilati nei repository ufficiali delle principali distribuzioni Linux.

Cercherò di aggiornare questa risposta con un rapporto sui bug relativo a wxPHP, ma per il momento potrebbe essere saggio per gli utenti considerare questo come "non possibile" per il momento, dato che ho messo un sacco di sforzo nel cercare di risolverlo. Certo, se qualcuno trova un modo affidabile per raggiungere questo obiettivo, per favore aggiungi la tua risposta e io la selezionerò preferibilmente a questa.