Lazy layout CFGs
authorChristoph Egger <christoph@christoph-egger.org>
Mon, 25 May 2015 11:37:26 +0000 (13:37 +0200)
committerChristoph Egger <christoph@christoph-egger.org>
Mon, 25 May 2015 11:37:26 +0000 (13:37 +0200)
Wait for the Widget to actually be shown before starting to
layout. Good candidate for a background-worker-thread later!

src/gui/widgets/FunctionWidget.cxx
src/gui/widgets/FunctionWidget.hxx

index 17b539f4b93db26a749212f83cfd357a97a3ee5e..c9c28d169a2c36bacb4d904c12de6f0e29ac6b49 100644 (file)
@@ -18,42 +18,45 @@ namespace {
 FunctionWidget::FunctionWidget(Function* function, Mainwindow* mainwindow)
        : function(function)
        , mainwindow(mainwindow)
+       , layouted(false)
        , logger(log4cxx::Logger::getLogger("gui.Mainwindow")) {
 
-       // CFG
-       CFGScene * scene = new CFGScene;
-       InformationManager* manager = function->getManager();
-
-       BasicBlock * block = manager->getBasicBlock(function->getStartAddress());
-       LOG4CXX_DEBUG(logger, "Building widget for functionction " << function->getName());
-       for (auto i : function->blocks()) {
-               LOG4CXX_DEBUG(logger, "Functionction contains Block " << i.second->getName());
-       }
-
-       uint64_t start_address(std::numeric_limits<uint64_t>::max());
-       for (auto b : function->blocks()) {
-               if (b.first < start_address)
-                       start_address = b.first;
-       }
+}
 
-       std::map<uint64_t, BasicBlockWidget*> _blocks;
-       local__add_basic_block(block, mainwindow,
-                              manager, _blocks, scene, 3*start_address, 100);
+void FunctionWidget::showEvent(QShowEvent* event) {
+       if (!layouted) {
+               CFGScene * scene = new CFGScene;
+               InformationManager* manager = function->getManager();
 
-       QGraphicsView * view = new QGraphicsView(scene);
-       view->setDragMode(QGraphicsView::ScrollHandDrag);
-       addTab(view, "CFG");
+               BasicBlock * block = manager->getBasicBlock(function->getStartAddress());
+               LOG4CXX_DEBUG(logger, "Building widget for functionction " << function->getName());
+               for (auto i : function->blocks()) {
+                       LOG4CXX_DEBUG(logger, "Functionction contains Block " << i.second->getName());
+               }
 
-       // Listing
-       QTableWidget * t = new QTableWidget();
-       t->setColumnCount(3);
-       t->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
+               uint64_t start_address(std::numeric_limits<uint64_t>::max());
+               for (auto b : function->blocks()) {
+                       if (b.first < start_address)
+                               start_address = b.first;
+               }
 
-       addTab(t, "Listing");
-}
+               std::map<uint64_t, BasicBlockWidget*> _blocks;
+               local__add_basic_block(block, mainwindow,
+                                      manager, _blocks, scene, 3*start_address, 100);
 
+               QGraphicsView * view = new QGraphicsView(scene);
+               view->setDragMode(QGraphicsView::ScrollHandDrag);
+               addTab(view, "CFG");
 
+               // Listing
+               QTableWidget * t = new QTableWidget();
+               t->setColumnCount(3);
+               t->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
 
+               addTab(t, "Listing");
+               layouted = true;
+       }
+}
 
 namespace {
        BasicBlockWidget *
index 8400df874c4c8b52409df3ec499743a8bf79380a..6976d736adb551605ca35b052e5678c6a8f43134 100644 (file)
@@ -16,10 +16,12 @@ public:
 
        Function* getFunction() const
                { return function; }
-
+protected:
+       void showEvent(QShowEvent * event);
 private:
        Function * function;
        Mainwindow* mainwindow;
+       bool layouted;
 
        log4cxx::LoggerPtr logger;
 };