From: GrimBlasPhemy <gri...@gm...> - 2006-02-23 10:40:18
|
I'm trying to implement a window that removes itself from a list when it is destroyed (eg. closed with the close button in the top right corner of the window :) ) in this window I have code just like in the "example_multiple_windows" class example_flim_tableau : public vgui_tableau { bool handle(vgui_event const& e) { if (e.type =3D=3D vgui_DESTROY) { vgui_dialog dialog("Farewell!"); dialog.message("I am about to die!\nLast chance to save data would go here..."); dialog.set_modal(true); dialog.ask(); return true; } else return false; } vcl_string type_name() const { return "example_flim_tableau"; } ... vgui_shell_tableau_new shell_tab(sub[i].tab, flim_tab); sub_window->get_adaptor()->set_tableau(shell_tab); sub_window->show(); but when I close the window it doesn't do anything, it even doesn't come inside the handle method. is there another way to catch this kind of event? or isn't this possible? TIA -- Grtz Rowin Heymans |
From: Karen M. <mc...@gm...> - 2006-02-23 12:26:20
|
Hi, I looked in vgui/impl and a vgui_DESTROY event is dispatched when a window is destroyed using GToK but not in the other implementations. If yo= u are using MFC then there are no vgui_DESTRY events at all so it wouldn't work. You probably can fix this by adding something like: dispatch_to_tableau(vgui_DESTROY); to the destructor ~vgui_mfc_adaptor() in vgui/impl/vgui_mfc_adaptor.cxx. If you do fix this could you post the solution to the VXL mailing lists so it can be fixed properly. Thanks, Karen McGaul On 2/23/06, GrimBlasPhemy <gri...@gm...> wrote: > > I'm trying to implement a window that removes itself from a list when it > is destroyed (eg. closed with the close button in the top right corner of > the window :) ) > > in this window I have code just like in the "example_multiple_windows" > > class example_flim_tableau : public vgui_tableau { > bool handle(vgui_event const& e) { > if (e.type =3D=3D vgui_DESTROY) { > vgui_dialog dialog("Farewell!"); > dialog.message("I am about to die!\nLast chance to save data would > go here..."); > dialog.set_modal(true); > dialog.ask(); > return true; > } > else > return false; > } > vcl_string type_name() const { return "example_flim_tableau"; } > > ... > > vgui_shell_tableau_new shell_tab(sub[i].tab, flim_tab); > sub_window->get_adaptor()->set_tableau(shell_tab); > sub_window->show(); > > but when I close the window it doesn't do anything, it even doesn't come > inside the handle method. > is there another way to catch this kind of event? or isn't this possible? > > TIA > > -- > Grtz > Rowin Heymans > |
From: GrimBlasPhemy <gri...@gm...> - 2006-02-24 09:02:08
|
Ok I looked into this for Qt since I'm using Qt :) I added the dispatch_to_tableau(vgui_DESTROY); to vgui_qt_adaptor.cxx but this didn't do what it had to do since the destructor isn't even called when the window is closed so I changed the constructors in vgui_qt_window.cxx to fix this //-------------------------------------------------------------------------= ---- vgui_qt_window::vgui_qt_window(int w, int h, const char* title) : QMainWindow(0, "vgui_qt_mainwindow_without_menu", Qt::WStyle_Customize | Qt::WDestructiveClose | Qt::WStyle_NormalBorder | Qt::WStyle_SysMenu | Qt::WStyle_MinMax), statusbar (this), use_menubar(false), use_statusbar(true) { setup_widget(w, h, title); } //-------------------------------------------------------------------------= ------- vgui_qt_window::vgui_qt_window(int w, int h, const vgui_menu& menu, const char* title) : QMainWindow(0, "vgui_qt_mainwindow_with_menu", Qt::WStyle_Customize | Qt::WDestructiveClose | Qt::WStyle_NormalBorder | Qt::WStyle_SysMenu | Qt::WStyle_MinMax), statusbar (this), use_menubar(true), use_statusbar(true) { setup_widget(w, h, title); set_menubar(menu); } this is what they look like now and it seems to do his job :) it didn't really solve my problem since the destroy event is dispatched to the shell_tableau but the tableau that creates this window (with the shell tableau in it) has no way of knowing when the window is closed as far as I see it... -- Grtz Rowin Heymans On 2/23/06, Karen McGaul <mc...@gm...> wrote: > > Hi, I looked in vgui/impl and a vgui_DESTROY event is dispatched when a > window is destroyed using GToK but not in the other implementations. If = you > are using MFC then there are no vgui_DESTRY events at all so it wouldn't > work. You probably can fix this by adding something like: > > dispatch_to_tableau(vgui_DESTROY); > > to the destructor ~vgui_mfc_adaptor() in vgui/impl/vgui_mfc_adaptor.cxx. > If you do fix this could you post the solution to the VXL mailing lists s= o > it can be fixed properly. Thanks, > Karen McGaul > |
From: Rowin H. <row...@gm...> - 2006-02-24 10:33:01
|
Ok I think I found what was wrong :) in vgui_shell tableau, in the handle method a few events are handled specifically and all the others are just passed down to the children until = 1 accepts it. I added a specific handling for the vgui_DESTROY event and like this all th= e children of the shell_tableau get the destroy event. This way I can handle the destroy event in my flim_tableau and my application knows when a window is closed I hope you understand my explanation and that it is useful for general purposes :) here is the modified handle method from vgui_shell_tableau.cxx bool vgui_shell_tableau::handle(vgui_event const &e) { if ( bindings.quit(e) ) { e.origin->post_destroy(); vgui::quit(); } if ( bindings.close(e) ) { e.origin->post_destroy(); } if ( bindings.graph(e) ) { vgui_text_graph(vcl_cerr); } // "draw" event : return true unless some child returns false. if ( e.type=3D=3Dvgui_DRAW || e.type=3D=3Dvgui_DRAW_OVERLAY ) { bool retv =3D true; for ( unsigned i=3D0; i<children.size(); ++i ) { //PM.restore(); #ifdef DEBUG vcl_cerr << "DRAW"; #endif if ( active[i] && children[i] ) if ( !children[i]->handle(e) ) retv=3Dfalse; } return retv; } // "destroy" event : return true unless some child returns false. if ( e.type=3D=3Dvgui_DESTROY ) { bool retva =3D true; for ( unsigned i=3D0; i<children.size(); ++i ) { //PM.restore(); #ifdef DEBUG vcl_cerr << "DESTROY"; #endif if ( active[i] && children[i] ) if ( !children[i]->handle(e) ) retva=3Dfalse; } return retva; } // "normal" event : pass it on till handled. for ( unsigned i=3D0; i < children.size(); ++i ) { if (active[i] && children[i]) { if ( children[i]->handle(e) ) return true; } } // Noone was interested.... return false; } -- Grtz Rowin Heymans |
From: Rowin H. <row...@gm...> - 2006-02-27 11:35:15
|
ok nevermind my last mail, some child was just sending a true when he didn'= t do anything with the event so it wasn't a problem in shell_tableau :) sry grtz Rowin Heymans |