3
* $Id: widgetsmanager.cpp 3754 2011-04-25 07:11:36Z tovar $
6
* Copyright 2008-10 MetaEmotion S.L. All rights reserved.
7
* http://ginkgo-cadx.com
9
* This file is licensed under LGPL v3 license.
10
* See License.txt for details
14
//#define _GINKGO_TRACE
21
#include <api/globals.h>
22
#include <api/icontexto.h>
23
#include <api/iwidgetsrenderer.h>
25
#include <eventos/eventosginkgo.h>
27
#include <api/westilo.h>
28
#include <main/entorno.h>
29
#include <main/controllers/controladoreventos.h>
30
#include <widgets/wanotacionesquina.h>
31
#include <widgets/wanotacionposicion.h>
33
#include "widgetsmanager.h"
35
#include <resources/ginkgoresourcemanager.h>
37
#include <cairo/cairo.h>
39
#include <vtkginkgoimageviewer.h>
41
class TimerAnimation : public wxTimer
44
TimerAnimation(GNC::GCS::IWidgetsManager* pManager){
45
m_pManager = pManager;
51
virtual void Notify(){
52
m_pManager->TickAnimation(m_Frecuencia);
53
//std::cout << "Tick()" << std::endl;
62
Start((int)( 1000.0f * (1.0f/m_Frecuencia) ) );
72
GNC::GCS::IWidgetsManager* m_pManager;
76
GNC::WidgetsManager::WidgetsManager(GNC::GCS::IVista* pVista):GNC::GCS::IWidgetsManager(pVista) {
77
m_pRendererActivo = NULL;
78
m_cursor = GNC::GCS::Widgets::CUR_FLECHA;
79
m_mouseDerechoDown = false;
80
m_mouseIzquierdoDown = false;
81
m_pTimerAnimation = new TimerAnimation(this);
84
GNC::WidgetsManager::~WidgetsManager() {
85
if (m_pTimerAnimation != NULL) {
86
delete m_pTimerAnimation;
87
m_pTimerAnimation = NULL;
90
for (GNC::GCS::ListaRenderers::iterator itr = m_Renderers.begin(); itr != m_Renderers.end(); itr++) {
91
GNC::GCS::IWidgetsRenderer* pRenderer = *itr;
92
pRenderer->WSetCurrent();
93
for (IteradorListaWidgets it = m_Widgets.begin(); it != m_Widgets.end(); it++)
95
GNC::GCS::Widgets::IWidget* w = (*it);
96
if(w->ReservaRecursos()) {
97
w->LiberarRecursos(pRenderer);
102
GNC::GCS::ListaRenderers copia(m_Renderers); // Porque los renderers invocaran a EliminarRenderer de esta misma instancia;
104
for (GNC::GCS::ListaRenderers::iterator it = copia.begin(); it != copia.end(); it++)
106
GNC::GCS::IWidgetsRenderer* renderer = *it;
108
renderer->SetManager(NULL);
115
void GNC::WidgetsManager::TickAnimation(double freq)
117
for (IteradorListaWidgets it = m_Widgets.begin(); it != m_Widgets.end(); it++) {
118
GNC::GCS::Widgets::IWidget* w = *it;
119
if (!w->EstaOculto()) {
120
w->TickAnimation(freq);
125
void GNC::WidgetsManager::EnableAnimation()
127
m_pTimerAnimation->Enable();
130
void GNC::WidgetsManager::DisableAnimation()
132
m_pTimerAnimation->Disable();
135
inline void GNC::WidgetsManager::ModificarRenderersDeWidget(GNC::GCS::Widgets::IWidget* w)
137
if (w != NULL && !w->EsTopLevel()) {
138
for (GNC::GCS::ListaRenderers::iterator itr = m_Renderers.begin(); itr != m_Renderers.end(); itr++) {
139
GNC::GCS::IWidgetsRenderer* ren = *itr;
140
if (w->GetVID() != -1 && w->GetVID() == ren->GetVID()) {
141
ren->Modificar(true);
147
//----------------------------------------------------------------------------------------------------
148
//region "Interfaz especifica"
150
void GNC::WidgetsManager::RenderPrivate(GNC::GCS::Contexto3D* c)
152
glPushAttrib(GL_ENABLE_BIT);
153
bool widgetIluminado = false;
154
// Primera pasada: widgets normales.
155
for (IteradorListaWidgets it = m_Widgets.begin(); it != m_Widgets.end(); it++) {
156
GNC::GCS::Widgets::IWidget* w = *it;
157
if (!w->EsTopLevel() && (w->GetVID() == c->GetRenderer()->GetVID()) ) {
161
widgetIluminado = widgetIluminado || (!w->EstaOculto()&& w->EstaIluminado());
164
// Segunda pasada: widgets toplevel.
165
for (IteradorListaWidgets it = m_Widgets.begin(); it != m_Widgets.end(); it++) {
166
GNC::GCS::Widgets::IWidget* w = *it;
167
if (w->EsTopLevel()) {
172
if (c->GetRenderer() == m_pRendererActivo) {
173
if (m_pBuilder != NULL) {
174
m_pBuilder->Render(c);
179
GNC::GCS::Vector boundingBox;
181
// Tercera pasada: dibujado de overlays
182
for (IteradorListaWidgets it = m_Widgets.begin(); boundingBox.EsNulo() && it != m_Widgets.end(); it++)
184
GNC::GCS::Widgets::IWidget* w = (*it);
185
if(!w->EstaOculto() && w->EstaIluminado() && (w->GetVID() == c->GetRenderer()->GetVID()) ){
186
if (m_pRendererActivo != NULL) {
187
m_pRendererActivo->ImprimirOverlay(w, c, boundingBox);
192
if (m_pBuilder != NULL) {
193
if (!boundingBox.EsNulo()) {
194
if (m_pRendererActivo != NULL) {
195
m_pRendererActivo->ImprimirOverlay(m_pBuilder, c, boundingBox);
204
//encima de un widget selecc e iluminado => si esta pulsando el boton derecho moviendose, si no pues no
205
if(m_mouseIzquierdoDown) {
206
SetCursor(GNC::GCS::Widgets::CUR_MANO_CERRADA);
207
//std::cout << "WIluminado: IZDown: Mano Cerrada " << std::endl;
209
SetCursor(GNC::GCS::Widgets::CUR_MANO_ABIERTA);
210
//std::cout << "WIluminado !IZDown: Mano Abierta " << std::endl;
213
//si esta haciendo pam
214
if(m_mouseDerechoDown) {
215
//std::cout << "!WIluminado: DERDown: Mano Cerrada " << std::endl;
216
SetCursor(GNC::GCS::Widgets::CUR_MANO_CERRADA);
218
//si no se lo pedimos al builder
219
if(m_pBuilder != NULL && m_pBuilder->GetCursor() != GNC::GCS::Widgets::CUR_INVALIDO){
220
//std::cout << "!WIluminado: !DERDown: Builder cursor " << std::endl;
221
SetCursor(m_pBuilder->GetCursor());
223
//y si no pues si esta pulsando el derecho es que esta haciendo pan
224
//std::cout << "!WIluminado: !DERDown: Flecha" << std::endl;
225
SetCursor(GNC::GCS::Widgets::CUR_FLECHA);
230
c->GetRenderer()->Modificar(false);
235
void GNC::WidgetsManager::Render() {
237
bool seleccionEnActual = false;
238
bool seleccionEnOtro = false;
240
// Primera pasada: Widgets
241
for (IteradorListaWidgets it = m_Widgets.begin(); it != m_Widgets.end(); it++) {
242
GNC::GCS::Widgets::IWidget* w = *it;
243
if (!w->EsTopLevel() && !w->EstaOculto()) {
244
if (m_pRendererActivo) { // Si hay renderer activo, comprobamos las selecciones.
245
if (w->EstaSeleccionado()) {
246
if (w->GetVID() == m_pRendererActivo->GetVID()) {
247
seleccionEnActual = true;
250
seleccionEnOtro = true;
254
if (w->EstaModificado()) {
256
ModificarRenderersDeWidget(w);
261
if (seleccionEnActual && seleccionEnOtro) {
262
// Segunda pasada opcional: Deseleccion de selecciones en renderers no activos
263
for (IteradorListaWidgets it = m_Widgets.begin(); it != m_Widgets.end(); it++) {
264
GNC::GCS::Widgets::IWidget* w = *it;
265
if (!w->EsTopLevel() && !w->EstaOculto()) {
266
if (m_pRendererActivo) { // Si hay renderer activo, comprobamos las selecciones.
267
if (w->EstaSeleccionado()) {
268
if (w->GetVID() != m_pRendererActivo->GetVID()) {
269
w->Seleccionar(false);
271
ModificarRenderersDeWidget(w);
279
for (GNC::GCS::ListaRenderers::iterator it = m_Renderers.begin(); it != m_Renderers.end(); it++) {
280
GNC::GCS::IWidgetsRenderer* ren = *it;
281
if (ren->EstaModificado()) {
282
GTRACE("Renderer[" << ren->GetVID() << "] modificado. Rendering...");
283
//si el renderer es el activo, provoca un update inmediato, sino solo un refresh que harĆ” un update cuando pueda
284
ren->PostRender(ren == m_pRendererActivo);
285
ren->Modificar(false);
290
void GNC::WidgetsManager::OffScreenRender(GNC::GCS::Contexto3D* c)
293
// Primera pasada: Widgets normales
294
for (IteradorListaWidgets it = m_Widgets.begin(); it != m_Widgets.end(); it++) {
295
GNC::GCS::Widgets::IWidget* w = *it;
296
if (!w->EstaOculto() && !w->EsTopLevel() && w->GetVID() == c->OVID) {
297
w->OffscreenRender(c);
301
// Primera pasada: Widgets top level
302
for (IteradorListaWidgets it = m_Widgets.begin(); it != m_Widgets.end(); it++) {
303
GNC::GCS::Widgets::IWidget* w = *it;
304
if (!w->EstaOculto() && w->EsTopLevel()) {
305
w->OffscreenRender(c);
310
void GNC::WidgetsManager::Modificado()
312
if (m_pRendererActivo != NULL)
314
m_pRendererActivo->Modificar(true);
318
void GNC::WidgetsManager::ModificadoPorWidget(GNC::GCS::Widgets::IWidget* w)
320
this->ModificarRenderersDeWidget(w);
323
void GNC::WidgetsManager::OnMouseEvents(GNC::GCS::Eventos::EventoRaton& evento)
327
if (!evento.c->IsOk()) {
328
std::cerr << "Adverencia: Render omitido: singularidad en contexto" << std::endl;
331
//pillamos boton derecho e izquierdo down-up
332
if (evento.ButtonDown(GNC::GCS::Eventos::EventoRaton::EB_IZQUIERDO)) {
333
m_mouseIzquierdoDown = true;
334
} else if(evento.ButtonUp(GNC::GCS::Eventos::EventoRaton::EB_IZQUIERDO)){
335
m_mouseIzquierdoDown = false;
336
} else if(evento.ButtonDown(GNC::GCS::Eventos::EventoRaton::EB_DERECHO)){
337
m_mouseDerechoDown = true;
338
} else if(evento.ButtonUp(GNC::GCS::Eventos::EventoRaton::EB_DERECHO)){
339
m_mouseDerechoDown = false;
342
// Primera pasada: widgets toplevel.
343
for (IteradorListaWidgets it = m_Widgets.begin(); it != m_Widgets.end(); it++)
345
GNC::GCS::Widgets::IWidget* w = (*it);
346
if(!w->EstaOculto() && w->EsTopLevel() && !w->IgnoraEventos()){
347
w->OnMouseEvents(evento);
348
if (w->EstaModificado()) {
350
if (w->RequiereNotificarCambios()) {
351
w->NotificarCambios(false);
352
NotificarModificacion(w);
358
// Segunda pasada: widgets normales.
359
for (IteradorListaWidgets it = m_Widgets.begin(); it != m_Widgets.end(); it++)
361
GNC::GCS::Widgets::IWidget* w = (*it);
362
if(!w->EstaOculto() && !w->EsTopLevel() && !w->IgnoraEventos() && ( w->GetVID() == evento.c->GetRenderer()->GetVID())){
363
w->OnMouseEvents(evento);
364
if (w->EstaModificado()) {
366
if (w->RequiereNotificarCambios()) {
367
w->NotificarCambios(false);
368
NotificarModificacion(w);
372
if (w->EstaIluminado() && ( evento.LeftUp() ||evento.LeftDown() )) { // Si el widget esta iluminado y este evento es up/down del boton izquierdo, forzamos render para cambiar el cursor.
378
if (m_pBuilder != NULL && evento.GetSkipped()) {
379
m_pBuilder->OnMouseEvents(evento);
382
if (evento.GetSkipped()) {
383
DefaultMouseEventProcess(evento);
385
if (m_pRendererActivo != NULL && m_pRendererActivo->EstaModificado()) {
390
void GNC::WidgetsManager::OnKeyEvents(GNC::GCS::Eventos::EventoTeclado& evento)
394
/* Paso de auto-borrado (si lo soporta el widget) */
395
if (evento.GetKeyCode() == WXK_DELETE || evento.GetKeyCode() == WXK_BACK) {
396
GNC::GCS::ListaWidgets lw;
397
for (IteradorListaWidgets it = m_Widgets.begin(); it != m_Widgets.end(); it++)
399
GNC::GCS::Widgets::IWidget* w = (*it);
401
if(!w->EstaOculto() && w->EstaSeleccionado() && w->SoportaAutoBorrado() && (w->GetVID() == -1 || w->GetVID() == evento.c->GetRenderer()->GetVID())) {
406
for (IteradorListaWidgets it = lw.begin(); it != lw.end(); it++){
407
EliminarWidget(*it, true);
411
else if (evento.GetKeyCode() == 'r' || evento.GetKeyCode() == 'R') {
412
for (IteradorListaWidgets it = m_Widgets.begin(); it != m_Widgets.end(); it++)
414
GNC::GCS::Widgets::IWidget* w = (*it);
419
if (m_pBuilder != NULL) {
420
m_pBuilder->OnKeyEvents(evento);
423
// Primera pasada: widgets toplevel.
424
for (IteradorListaWidgets it = m_Widgets.begin(); evento.GetSkipped() && it != m_Widgets.end(); it++)
426
GNC::GCS::Widgets::IWidget* w = (*it);
427
if(!w->EstaOculto() && w->EsTopLevel() && !w->IgnoraEventos() && (w->GetVID() == evento.c->GetRenderer()->GetVID())){
428
w->OnKeyEvents(evento);
429
if (w->EstaModificado()) {
431
if (w->RequiereNotificarCambios()) {
432
w->NotificarCambios(false);
433
NotificarModificacion(w);
438
// Segunda pasada: widgets normales.
439
for (IteradorListaWidgets it = m_Widgets.begin(); evento.GetSkipped() && it != m_Widgets.end(); it++)
441
GNC::GCS::Widgets::IWidget* w = (*it);
442
if(!w->EstaOculto() && !w->EsTopLevel() && !w->IgnoraEventos() && (w->GetVID() == evento.c->GetRenderer()->GetVID())){
443
w->OnKeyEvents(evento);
444
if (w->EstaModificado()) {
446
if (w->RequiereNotificarCambios()) {
447
w->NotificarCambios(false);
448
NotificarModificacion(w);
454
if (evento.GetSkipped()) {
455
DefaultKeyEventProcess(evento);
460
void GNC::WidgetsManager::DefaultMouseEventProcess(GNC::GCS::Eventos::EventoRaton& evento)
462
/* Paso de mostrar menu si procede */
463
if (evento.ButtonUp(GNC::GCS::Eventos::EventoRaton::EB_DERECHO)) {
465
//std::cout << "DerUp! ĀæRender?" << std::endl;
467
SetCursor(GNC::GCS::Widgets::CUR_MANO_ABIERTA);
469
GNC::GCS::ListaWidgets lw;
471
for (IteradorListaWidgets it = m_Widgets.begin(); it != m_Widgets.end(); it++)
473
GNC::GCS::Widgets::IWidget* w = (*it);
474
if(!w->EstaOculto() && w->EstaSeleccionado() && !w->IgnoraEventos() && (w->GetVID() == -1 || w->GetVID() == evento.c->GetRenderer()->GetVID())){
480
//comprobamos si alguno de los seleccionados valida el hittest
481
for (IteradorListaWidgets it = lw.begin(); it != lw.end(); it++)
483
GNC::GCS::Widgets::IWidget* w = (*it);
484
if(w->HitTest(evento.iP.x, evento.iP.y, evento.c->RelacionImagenPantalla().NormaInfinito())){
487
//se meten las opciones que pueda aportar el widget
488
w->GetMenuContextual(&menu, evento.c->pWindow );
489
if(menu.GetMenuItemCount()>0) {
490
menu.AppendSeparator();
493
GetMenuContextual(&menu);
494
//en este caso hay varios seleccionados pues se muestra el menu comun...
495
evento.c->pWindow->PopupMenu(&menu,wxPoint(evento.sX, evento.sY));
496
if(m_pBuilder != NULL && m_pBuilder->GetCursor() != GNC::GCS::Widgets::CUR_INVALIDO){
497
SetCursor(m_pBuilder->GetCursor());
499
//y si no pues si esta pulsando el derecho es que esta haciendo pan
500
SetCursor(GNC::GCS::Widgets::CUR_FLECHA);
508
if(!(EventoConsumido())){
510
//se deseleccionan los widgets seleccionados
511
for (IteradorListaWidgets it = lw.begin(); it != lw.end(); it++)
513
GNC::GCS::Widgets::IWidget* w = (*it);
514
w->Seleccionar(false);
517
//hay que buscar si algun widget valida el hittest, en ese caso se selecciona y se muestra el menu
518
GNC::GCS::Widgets::IWidget* widgetMenu = NULL;
519
for (IteradorListaWidgets it = m_Widgets.begin(); it != m_Widgets.end(); it++)
521
GNC::GCS::Widgets::IWidget* w = (*it);
522
if(!w->EstaOculto() && !w->IgnoraEventos() && (w->GetVID() == -1 || w->GetVID() == evento.c->GetRenderer()->GetVID()) && w->HitTest(evento.iP.x, evento.iP.y, evento.c->RelacionImagenPantalla().NormaInfinito())){
527
if(widgetMenu != NULL) {
528
widgetMenu->Seleccionar(true);
530
//se meten las opciones que pueda aportar el widget
531
widgetMenu->GetMenuContextual(&menu, evento.c->pWindow );
532
if(menu.GetMenuItemCount()>0) {
533
menu.AppendSeparator();
536
GetMenuContextual(&menu);
538
//en este caso hay varios seleccionados pues se muestra el menu comun...
539
evento.c->pWindow->PopupMenu(&menu, wxPoint(evento.sX, evento.sY));
540
if(m_pBuilder != NULL && m_pBuilder->GetCursor() != GNC::GCS::Widgets::CUR_INVALIDO){
541
SetCursor(m_pBuilder->GetCursor());
543
//y si no pues si esta pulsando el derecho es que esta haciendo pan
544
SetCursor(GNC::GCS::Widgets::CUR_FLECHA);
549
if(m_pBuilder != NULL && m_pBuilder->GetCursor() != GNC::GCS::Widgets::CUR_INVALIDO){
550
SetCursor(m_pBuilder->GetCursor());
552
//y si no pues si esta pulsando el derecho es que esta haciendo pan
553
SetCursor(GNC::GCS::Widgets::CUR_FLECHA);
563
void GNC::WidgetsManager::DefaultKeyEventProcess(GNC::GCS::Eventos::EventoTeclado& evento)
568
void GNC::WidgetsManager::PropagarHitTestSeleccion(GNC::GCS::Vector* vertices, int numVertices)
570
for (IteradorListaWidgets it = m_Widgets.begin(); it != m_Widgets.end(); it++)
572
GNC::GCS::Widgets::IWidget* w = (*it);
573
if(!w->EstaOculto() && !w->IgnoraEventos() && w->HitTest(vertices, numVertices)){
574
w->Seleccionar(true);
581
//----------------------------------------------------------------------------------------------------
582
//region "Interfaz de registro de Renderers"
584
void GNC::WidgetsManager::SetRendererActivo(GNC::GCS::IWidgetsRenderer* pRenderer)
586
m_pRendererActivo = pRenderer;
589
void GNC::WidgetsManager::InsertarRenderer(GNC::GCS::IWidgetsRenderer* pRenderer)
591
bool notfound = true;
592
for (GNC::GCS::ListaRenderers::iterator it = m_Renderers.begin(); notfound && (it != m_Renderers.end()); it++)
594
GNC::GCS::IWidgetsRenderer* renderer = *it;
596
if (pRenderer == renderer)
601
if (notfound == true) {
602
m_Renderers.push_back(pRenderer);
607
void GNC::WidgetsManager::EliminarRenderer(GNC::GCS::IWidgetsRenderer* pRenderer)
609
bool notfound = true;
610
GNC::GCS::ListaRenderers::iterator itpos = m_Renderers.end();
611
for (GNC::GCS::ListaRenderers::iterator it = m_Renderers.begin(); notfound && (it != m_Renderers.end()); it++)
613
GNC::GCS::IWidgetsRenderer* renderer = *it;
615
if (pRenderer == renderer)
617
if (renderer == m_pRendererActivo) {
618
m_pRendererActivo = NULL;
624
if (itpos != m_Renderers.end())
626
m_Renderers.erase(itpos);
628
if (m_pRendererActivo == NULL && m_Renderers.size() > 0) {
629
m_pRendererActivo = m_Renderers.front();
635
void GNC::WidgetsManager::LiberarRecursos(GNC::GCS::IWidgetsRenderer* pRenderer)
637
pRenderer->WSetCurrent();
638
for (IteradorListaWidgets it = m_Widgets.begin(); it != m_Widgets.end(); it++)
640
(*it)->LiberarRecursos(pRenderer);
646
//----------------------------------------------------------------------------------------------------
647
//region "Interfaz de registro de IWidget's"
649
void GNC::WidgetsManager::InsertarWidget(GNC::GCS::Widgets::IWidget* pWidget, bool propagarEvento)
651
m_Widgets.push_back(pWidget);
652
if (propagarEvento) {
653
NotificarCreacion(pWidget);
657
void GNC::WidgetsManager::EliminarWidget(GNC::GCS::Widgets::IWidget* pWidget, bool propagarEvento)
659
IteradorListaWidgets it;
661
for (it = m_Widgets.begin(); it != m_Widgets.end() && (*it) != pWidget; it++);
663
if (it != m_Widgets.end()) {
664
if (propagarEvento) {
665
NotificarDestruccion(pWidget);
667
if(pWidget->ReservaRecursos()) {
668
for (GNC::GCS::ListaRenderers::iterator itr = m_Renderers.begin(); itr != m_Renderers.end(); itr++)
670
GNC::GCS::IWidgetsRenderer* pRenderer = *itr;
671
pRenderer->WSetCurrent();
672
pWidget->LiberarRecursos(pRenderer);
681
void GNC::WidgetsManager::EliminarWidget(GNC::GCS::IWidgetsManager::IteradorListaWidgets& it, bool propagarEvento)
683
if (it != m_Widgets.end()) {
684
GNC::GCS::Widgets::IWidget* w = (*it);
685
if (propagarEvento) {
686
NotificarDestruccion(w);
688
if(w->ReservaRecursos()) {
689
for (GNC::GCS::ListaRenderers::iterator itr = m_Renderers.begin(); itr != m_Renderers.end(); itr++)
691
GNC::GCS::IWidgetsRenderer* pRenderer = *itr;
692
pRenderer->WSetCurrent();
693
w->LiberarRecursos(pRenderer);
701
void GNC::WidgetsManager::EliminarTodosLosWidgets(bool propagarEventos)
703
for (IteradorListaWidgets it = m_Widgets.begin(); it != m_Widgets.end(); it++) {
704
GNC::GCS::Widgets::IWidget* w = (*it);
705
if (propagarEventos) {
706
NotificarDestruccion(w);
708
if(w->ReservaRecursos()) {
709
for (GNC::GCS::ListaRenderers::iterator itr = m_Renderers.begin(); itr != m_Renderers.end(); itr++)
711
GNC::GCS::IWidgetsRenderer* pRenderer = *itr;
712
pRenderer->WSetCurrent();
713
w->LiberarRecursos(pRenderer);
721
void GNC::WidgetsManager::OcultarTodosLosWidgets(bool ocultar, long GID){
723
for (IteradorListaWidgets it = m_Widgets.begin(); it != m_Widgets.end(); it++) {
724
GNC::GCS::Widgets::IWidget* w = (*it);
725
if(w->GetGID() == GID){
726
if(ocultar && w->ReservaRecursos()) {
727
for (GNC::GCS::ListaRenderers::iterator itr = m_Renderers.begin(); itr != m_Renderers.end(); itr++)
729
GNC::GCS::IWidgetsRenderer* pRenderer = *itr;
730
pRenderer->WSetCurrent();
731
w->LiberarRecursos(pRenderer);
739
void GNC::WidgetsManager::EliminarTodosLosWidgets(long GID)
741
GNC::GCS::ListaWidgets listaEliminados;
742
for (IteradorListaWidgets it = m_Widgets.begin(); it != m_Widgets.end(); it++) {
743
GNC::GCS::Widgets::IWidget* w = (*it);
744
if(w->GetGID() == GID){
745
listaEliminados.push_back(w);
748
for(IteradorListaWidgets it = listaEliminados.begin(); it!= listaEliminados.end(); it++) {
749
EliminarWidget((*it));
753
void GNC::WidgetsManager::OcultarWidgetsDeSubVista(bool /*ocultar*/, long /*vid*/)
756
for (IteradorListaWidgets it = m_Widgets.begin(); it != m_Widgets.end(); it++) {
757
GNC::GCS::Widgets::IWidget* w = *it;
758
if(w->GetVID() == vid){
759
if( w->EstaOculto() != ocultar ) {
760
if (ocultar && w->ReservaRecursos()) {
761
for (ListaRenderers::iterator itr = m_Renderers.begin(); itr != m_Renderers.end(); itr++)
763
GNC::GCS::IWidgetsRenderer* pRenderer = *itr;
764
pRenderer->WSetCurrent();
765
w->LiberarRecursos(pRenderer);
776
GNC::GCS::ListaWidgets& GNC::WidgetsManager::GetListaWidgets()
781
void GNC::WidgetsManager::GetListaWidgetsSubVista(long vid, GNC::GCS::ListaWidgets& lista)
783
for(GNC::GCS::IWidgetsManager::IteradorListaWidgets it = m_Widgets.begin(); it!= m_Widgets.end(); it++){
784
if((*it)->GetVID() == vid){
785
lista.push_back((*it));
792
//----------------------------------------------------------------------------------------------------
793
//endregion "Interfaz de Observadores"
795
void GNC::WidgetsManager::NotificarCreacion(GNC::GCS::Widgets::IWidget* pWidget)
798
for (IteradorListaObservadores it = m_Observadores.begin(); it != m_Observadores.end(); it++) {
799
GNC::GCS::Widgets::IObservadorWidget* pObservador = *it;
800
//TODO hasta que no se adapten los observadores de las herramientas no se pondra esta linea que es la buena
801
//if ((pObservador->VID == -1 || pObservador->VID == m_pRendererActivo->GetVID())&& pObservador->GID == pWidget->GetGID()) {
802
if (pObservador->GID == pWidget->GetGID()) {
804
pObservador->OnWidgetCreado(pWidget);
809
void GNC::WidgetsManager::NotificarDestruccion(GNC::GCS::Widgets::IWidget* pWidget)
812
for (IteradorListaObservadores it = m_Observadores.begin(); it != m_Observadores.end(); it++) {
813
GNC::GCS::Widgets::IObservadorWidget* pObservador = *it;
814
//TODO hasta que no se adapten los observadores de las herramientas no se pondra esta linea que es la buena
815
//if ((pObservador->VID == -1 || pObservador->VID == m_pRendererActivo->GetVID())&& pObservador->GID == pWidget->GetGID()) {
816
if (pObservador->GID == pWidget->GetGID()) {
818
pObservador->OnWidgetDestruido(pWidget);
823
void GNC::WidgetsManager::NotificarModificacion(GNC::GCS::Widgets::IWidget* pWidget)
826
for (IteradorListaObservadores it = m_Observadores.begin(); it != m_Observadores.end(); it++) {
827
GNC::GCS::Widgets::IObservadorWidget* pObservador = *it;
828
//TODO hasta que no se adapten los observadores de las herramientas no se pondra esta linea que es la buena
829
//if ((pObservador->VID == -1 || pObservador->VID == m_pRendererActivo->GetVID())&& pObservador->GID == pWidget->GetGID()) {
830
if (pObservador->GID == pWidget->GetGID()) {
832
pObservador->OnWidgetModificado(pWidget);
839
//----------------------------------------------------------------------------------------------------
840
//region "Interfaz general"
841
void GNC::WidgetsManager::CrearWidgetAnotador(GNC::GCS::IAnotador* pAnotador)
843
GNC::GCS::Widgets::WAnotador* pW = new GNC::GCS::Widgets::WAnotador(pAnotador,this,-1,"",-1);
845
GNC::GCS::Widgets::WAnotacionPosicion* pPosicion = new GNC::GCS::Widgets::WAnotacionPosicion(pAnotador,this,-1,"",-1);
846
InsertarWidget(pPosicion);
849
void GNC::WidgetsManager::EnableAnotacionDinamica(bool /*enable*/)
851
//buscamos los widgets anotadores y los establecemos el modo
852
for( GNC::GCS::ListaWidgets::iterator it = m_Widgets.begin(); it != m_Widgets.end(); it++) {
853
GNC::GCS::Widgets::IWidget* w = *it;
854
if (w->GetVID() == -1 && w->GetGID() == -1) {
855
//GNC::GCS::Widgets::WAnotador* pAnotador = dynamic_cast<GNC::GCS::Widgets::WAnotador*> (w);
860
void GNC::WidgetsManager::MostrarOcultarAnotador()
862
//buscamos los widgets anotadores y los establecemos el modo
863
for( GNC::GCS::ListaWidgets::iterator it = m_Widgets.begin(); it != m_Widgets.end(); it++) {
864
GNC::GCS::Widgets::IWidget* w = *it;
865
if (w->GetVID() == -1 && w->GetGID() == -1) {
866
GNC::GCS::Widgets::WAnotador* pAnotador = dynamic_cast<GNC::GCS::Widgets::WAnotador*> (w);
867
if (pAnotador != NULL) {
868
pAnotador->Ocultar(!pAnotador->EstaOculto());
874
bool GNC::WidgetsManager::IsVisibleAnotador()
876
for( GNC::GCS::ListaWidgets::iterator it = m_Widgets.begin(); it != m_Widgets.end(); it++) {
877
GNC::GCS::Widgets::IWidget* w = *it;
878
if (w->GetVID() == -1 && w->GetGID() == -1) {
879
GNC::GCS::Widgets::WAnotador* pAnotador = dynamic_cast<GNC::GCS::Widgets::WAnotador*> (w);
880
if (pAnotador != NULL) {
881
return !pAnotador->EstaOculto();
889
//----------------------------------------------------------------------------------------------------
890
//region "Interfaz de acceso al sistema de eventos ginkgo"
892
void GNC::WidgetsManager::LanzarEventoCreacion(GNC::GCS::Widgets::IWidget* w)
894
GNC::Entorno::Instance()->GetControladorEventos()->ProcesarEvento(new GNC::GCS::Eventos::EventoModificacionWidget(m_pVista,GNC::GCS::Eventos::EventoModificacionWidget::WidgetCreado, w));
897
void GNC::WidgetsManager::LanzarEventoModificacion(GNC::GCS::Widgets::IWidget* w)
899
GNC::Entorno::Instance()->GetControladorEventos()->ProcesarEvento(new GNC::GCS::Eventos::EventoModificacionWidget(m_pVista,GNC::GCS::Eventos::EventoModificacionWidget::WidgetModificado, w));
902
void GNC::WidgetsManager::LanzarEventoDestruccion(GNC::GCS::Widgets::IWidget* w)
904
GNC::Entorno::Instance()->GetControladorEventos()->ProcesarEvento(new GNC::GCS::Eventos::EventoModificacionWidget(m_pVista,GNC::GCS::Eventos::EventoModificacionWidget::WidgetDestruido, w));
907
GNC::GCS::IControladorEventos* GNC::WidgetsManager::GetControladorEventos() {
908
return GNC::Entorno::Instance()->GetControladorEventos();
912
void GNC::WidgetsManager::ProcesarEvento(GNC::GCS::Eventos::IEvento* /*evt*/){
918
void GNC::WidgetsManager::OnClickEnPropiedades(wxCommandEvent& )
920
//eliminamos los widgets seleccionados que soporten autoborrar
921
GNC::GCS::ListaWidgets lw;
922
for (IteradorListaWidgets it = m_Widgets.begin(); it != m_Widgets.end(); it++)
924
GNC::GCS::Widgets::IWidget* w = (*it);
926
if(!w->EstaOculto() && w->EstaSeleccionado()) {
930
for (IteradorListaWidgets it = lw.begin(); it != lw.end(); it++){
931
//mostrar propiedades de los widgets
932
(*it)->MostrarPropiedades(GNC::Entorno::Instance()->GetVentanaRaiz());
936
void GNC::WidgetsManager::OnClickEnEliminar(wxCommandEvent& )
938
//eliminamos los widgets seleccionados que soporten autoborrar
939
GNC::GCS::ListaWidgets lw;
940
for (IteradorListaWidgets it = m_Widgets.begin(); it != m_Widgets.end(); it++)
942
GNC::GCS::Widgets::IWidget* w = (*it);
944
if(!w->EstaOculto() && w->EstaSeleccionado() && w->SoportaAutoBorrado() ) {
949
for (IteradorListaWidgets it = lw.begin(); it != lw.end(); it++){
950
EliminarWidget(*it, true);
955
bool GNC::WidgetsManager::GetMenuContextual(wxMenu* menuContextual) const {
956
wxMenuItem* pMenuEliminar = new wxMenuItem(menuContextual, -1, _("Delete"), _("Delete Widget"), wxITEM_NORMAL );
957
menuContextual->Connect(pMenuEliminar->GetId(),(int)wxEVT_COMMAND_MENU_SELECTED,wxCommandEventHandler(WidgetsManager::OnClickEnEliminar),NULL,(wxEvtHandler*)this);
959
pMenuEliminar->SetBitmaps( GinkgoResourcesManager::IconosMenus::GetIcoEliminarWidget());
961
pMenuEliminar->SetBitmap(GinkgoResourcesManager::IconosMenus::GetIcoEliminarWidget());
963
menuContextual->Append(pMenuEliminar);
965
menuContextual->AppendSeparator();
967
wxMenuItem* pMenuPropiedades = new wxMenuItem(menuContextual, -1, _("Properties ..."), _("Widget Properties"), wxITEM_NORMAL );
968
menuContextual->Connect(pMenuPropiedades->GetId(),(int)wxEVT_COMMAND_MENU_SELECTED,wxCommandEventHandler(WidgetsManager::OnClickEnPropiedades),NULL,(wxEvtHandler*)this);
969
menuContextual->Append(pMenuPropiedades);
973
void GNC::WidgetsManager::SetCursor(GNC::GCS::Widgets::TipoCursor cursor)
975
if(m_cursor != cursor){
976
for (GNC::GCS::ListaRenderers::iterator itr = m_Renderers.begin(); itr != m_Renderers.end(); itr++) {
978
case GNC::GCS::Widgets::CUR_TRANSPARENTE:
979
(*itr)->m_c->pWindow->SetCursor(wxCursor(GinkgoResourcesManager::Cursores::GetCursorTransparente()));
981
case GNC::GCS::Widgets::CUR_LUPA:
982
(*itr)->m_c->pWindow->SetCursor(wxCursor(GinkgoResourcesManager::Cursores::GetCursorLupa()));
984
case GNC::GCS::Widgets::CUR_SELECCION:
985
(*itr)->m_c->pWindow->SetCursor(wxCursor(GinkgoResourcesManager::Cursores::GetCursorSeleccionar()));
987
case GNC::GCS::Widgets::CUR_FLECHA:
988
(*itr)->m_c->pWindow->SetCursor(wxCursor(wxCURSOR_ARROW));
990
case GNC::GCS::Widgets::CUR_MANO_ABIERTA:
991
(*itr)->m_c->pWindow->SetCursor(wxCursor(GinkgoResourcesManager::Cursores::GetCursorManoAbierta()));
993
case GNC::GCS::Widgets::CUR_MANO_CERRADA:
994
(*itr)->m_c->pWindow->SetCursor(wxCursor(GinkgoResourcesManager::Cursores::GetCursorManoCerrada()));
996
case GNC::GCS::Widgets::CUR_CREAR_LINEA:
997
(*itr)->m_c->pWindow->SetCursor(wxCursor(GinkgoResourcesManager::Cursores::GetCursorCrearLinea()));
999
case GNC::GCS::Widgets::CUR_CREAR_ANGULO_COBB:
1000
(*itr)->m_c->pWindow->SetCursor(wxCursor(GinkgoResourcesManager::Cursores::GetCursorCrearAnguloCobb()));
1002
case GNC::GCS::Widgets::CUR_CREAR_ANGULO_NORMAL:
1003
(*itr)->m_c->pWindow->SetCursor(wxCursor(GinkgoResourcesManager::Cursores::GetCursorCrearAnguloNormal()));
1005
case GNC::GCS::Widgets::CUR_CREAR_ANOTACION:
1006
(*itr)->m_c->pWindow->SetCursor(wxCursor(GinkgoResourcesManager::Cursores::GetCursorCrearAnotacion()));
1008
case GNC::GCS::Widgets::CUR_CREAR_ELIPSE:
1009
(*itr)->m_c->pWindow->SetCursor(wxCursor(GinkgoResourcesManager::Cursores::GetCursorCrearElipse()));
1011
case GNC::GCS::Widgets::CUR_CREAR_PUNTO:
1012
(*itr)->m_c->pWindow->SetCursor(wxCursor(GinkgoResourcesManager::Cursores::GetCursorCrearPunto()));
1014
case GNC::GCS::Widgets::CUR_CREAR_POLIGONO:
1015
(*itr)->m_c->pWindow->SetCursor(wxCursor(GinkgoResourcesManager::Cursores::GetCursorCrearPoligono()));
1017
case GNC::GCS::Widgets::CUR_CREAR_RECTANGULO:
1018
(*itr)->m_c->pWindow->SetCursor(wxCursor(GinkgoResourcesManager::Cursores::GetCursorCrearRectangulo()));
1020
case GNC::GCS::Widgets::CUR_WINDOW_LEVEL:
1021
(*itr)->m_c->pWindow->SetCursor(wxCursor(GinkgoResourcesManager::Cursores::GetCursorWindowLevel()));
1023
case GNC::GCS::Widgets::CUR_ANCLA_SIMPLE:
1024
(*itr)->m_c->pWindow->SetCursor(wxCursor(GinkgoResourcesManager::Cursores::GetCursorAnclaSimple()));
1026
case GNC::GCS::Widgets::CUR_ANCLA_COMPUESTA:
1027
(*itr)->m_c->pWindow->SetCursor(wxCursor(GinkgoResourcesManager::Cursores::GetCursorAnclaCompuesta()));
1029
case GNC::GCS::Widgets::CUR_INVALIDO: