]> git.lyx.org Git - features.git/blobdiff - src/frontends/qt4/GuiImplementation.C
new LFUN_WINDOW_CLOSE
[features.git] / src / frontends / qt4 / GuiImplementation.C
index 5e70eb2f3f867ac1145ba581266779b141e5902a..08a80d552165a6064f81d1e4737a2262a8656082 100644 (file)
 #include "GuiWorkArea.h"
 
 #include "BufferView.h"
+#include "funcrequest.h"
+#include "lyxfunc.h"
 
 using boost::shared_ptr;
 
 namespace lyx {
 namespace frontend {
 
+
 GuiImplementation::GuiImplementation(): max_view_id_(0), max_wa_id_(0)
 {
 }
@@ -36,7 +39,11 @@ int GuiImplementation::newView()
        size_t const id = max_view_id_;
        ++max_view_id_;
 
-       views_[id].reset(new GuiView());
+       views_[id] = new GuiView(id);
+       view_ids_.push_back(id);
+
+       QObject::connect(views_[id], SIGNAL(destroyed(QObject *)),
+               this, SLOT(cleanupViews(QObject *)));
 
        return id;
 }
@@ -46,13 +53,39 @@ LyXView& GuiImplementation::view(int id)
 {
        BOOST_ASSERT(views_.find(id) != views_.end());
 
-       return *views_[id].get();
+       return *views_[id];
+}
+
+
+void GuiImplementation::cleanupViews(QObject * qobj)
+{
+       GuiView * view = static_cast<GuiView *>(qobj);
+       std::map<int, GuiView *>::iterator I;
+
+       for (I = views_.begin(); I != views_.end(); ++I) {
+               if (I->second == view) {
+                       views_.erase(I->first);
+                       break;
+               }
+       }
+
+       buildViewIds();
+
+       if (views_.empty()) {
+               theLyXFunc().setLyXView(0);
+//             dispatch(FuncRequest(LFUN_LYX_QUIT));
+               return;
+       }
+       theLyXFunc().setLyXView(views_.begin()->second);
 }
 
 
-void GuiImplementation::destroyView(int id)
+void GuiImplementation::buildViewIds()
 {
-       views_.erase(id);
+       view_ids_.clear();
+       std::map<int, GuiView *>::const_iterator I;
+       for (I = views_.begin(); I != views_.end(); ++I)
+               view_ids_.push_back(I->first);
 }
 
 
@@ -61,16 +94,16 @@ int GuiImplementation::newWorkArea(unsigned int w, unsigned int h, int view_id)
        size_t const id = max_wa_id_;
        ++max_wa_id_;
 
-       GuiView * view = views_[view_id].get();
+       GuiView * view = views_[view_id];
 
-       work_areas_[id].reset(new GuiWorkArea(w, h, *view));
+       work_areas_[id] = new GuiWorkArea(w, h, id, *view);
 
        // FIXME BufferView creation should be independant of WorkArea creation
        buffer_views_[id].reset(new BufferView);
        work_areas_[id]->setBufferView(buffer_views_[id].get());
-       view->setWorkArea(work_areas_[id].get());
+       view->setWorkArea(work_areas_[id]);
 
-       view->setCentralWidget(work_areas_[id].get());
+       view->setCentralWidget(work_areas_[id]);
 
        return id;
 }
@@ -80,14 +113,11 @@ WorkArea& GuiImplementation::workArea(int id)
 {
        BOOST_ASSERT(work_areas_.find(id) != work_areas_.end());
 
-       return *work_areas_[id].get();
+       return *work_areas_[id];
 }
 
 
-void GuiImplementation::destroyWorkArea(int id)
-{
-       work_areas_.erase(id);
-}
-
 } // namespace frontend
 } // namespace lyx
+
+#include "GuiImplementation_moc.cpp"