diff --git a/hurricane/CMakeLists.txt b/hurricane/CMakeLists.txt index 41f6c0bf..0add60f4 100644 --- a/hurricane/CMakeLists.txt +++ b/hurricane/CMakeLists.txt @@ -5,6 +5,7 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.4.0) SET(CMAKE_MODULE_PATH "${HURRICANE_SOURCE_DIR}/cmake_modules/") OPTION(BUILD_STATIC "Build static version of libraries & binaries" OFF) +OPTION(BUILD_DOC "Build the documentation (doxygen)" OFF) IF(BUILD_STATIC) MESSAGE(STATUS "Building static libraries.") @@ -25,14 +26,16 @@ FIND_PACKAGE(Qt4 REQUIRED) # find and setup Qt4 for this project FIND_PACKAGE(BISON REQUIRED) FIND_PACKAGE(FLEX REQUIRED) FIND_PACKAGE(PythonLibs REQUIRED) -FIND_PACKAGE(Doxygen) +IF(BUILD_DOC) + FIND_PACKAGE(Doxygen) +ENDIF(BUILD_DOC) ADD_SUBDIRECTORY(src) ADD_SUBDIRECTORY(cmake_modules) ADD_SUBDIRECTORY(tests) -IF(DOXYGEN_FOUND) +IF(BUILD_DOC AND DOXYGEN_FOUND) ADD_SUBDIRECTORY(doc) -ENDIF(DOXYGEN_FOUND) +ENDIF(BUILD_DOC AND DOXYGEN_FOUND) ENABLE_TESTING() ADD_TEST(HurricaneTest ${PROJECT_BINARY_DIR}/tests/htest) diff --git a/hurricane/src/hviewer/CellWidget.cpp b/hurricane/src/hviewer/CellWidget.cpp index 643ab069..54f60a76 100644 --- a/hurricane/src/hviewer/CellWidget.cpp +++ b/hurricane/src/hviewer/CellWidget.cpp @@ -430,8 +430,8 @@ namespace Hurricane { void CellWidget::DrawingPlanes::shiftLeft ( int dx ) { paintersBegin (); - _painters[PlaneId::Normal ].drawPixmap ( dx, 0, *_planes[0], 0, 0, width()-dx, height() ); - _painters[PlaneId::Selection].drawPixmap ( dx, 0, *_planes[1], 0, 0, width()-dx, height() ); + _painters[PlaneId::Normal ].drawPixmap ( dx, 0, *_planes[PlaneId::Normal ], 0, 0, width()-dx, height() ); + _painters[PlaneId::Selection].drawPixmap ( dx, 0, *_planes[PlaneId::Selection], 0, 0, width()-dx, height() ); paintersEnd (); } @@ -439,8 +439,8 @@ namespace Hurricane { void CellWidget::DrawingPlanes::shiftRight ( int dx ) { paintersBegin (); - _painters[PlaneId::Normal ].drawPixmap ( 0, 0, *_planes[0], dx, 0, width()-dx, height() ); - _painters[PlaneId::Selection].drawPixmap ( 0, 0, *_planes[1], dx, 0, width()-dx, height() ); + _painters[PlaneId::Normal ].drawPixmap ( 0, 0, *_planes[PlaneId::Normal ], dx, 0, width()-dx, height() ); + _painters[PlaneId::Selection].drawPixmap ( 0, 0, *_planes[PlaneId::Selection], dx, 0, width()-dx, height() ); paintersEnd (); } @@ -448,8 +448,8 @@ namespace Hurricane { void CellWidget::DrawingPlanes::shiftUp ( int dy ) { paintersBegin (); - _painters[PlaneId::Normal ].drawPixmap ( 0, dy, *_planes[0], 0, 0, width(), height()-dy ); - _painters[PlaneId::Selection].drawPixmap ( 0, dy, *_planes[1], 0, 0, width(), height()-dy ); + _painters[PlaneId::Normal ].drawPixmap ( 0, dy, *_planes[PlaneId::Normal ], 0, 0, width(), height()-dy ); + _painters[PlaneId::Selection].drawPixmap ( 0, dy, *_planes[PlaneId::Selection], 0, 0, width(), height()-dy ); paintersEnd (); } @@ -457,8 +457,8 @@ namespace Hurricane { void CellWidget::DrawingPlanes::shiftDown ( int dy ) { paintersBegin (); - _painters[PlaneId::Normal ].drawPixmap ( 0, 0, *_planes[0], 0, dy, width(), height()-dy ); - _painters[PlaneId::Selection].drawPixmap ( 0, 0, *_planes[1], 0, dy, width(), height()-dy ); + _painters[PlaneId::Normal ].drawPixmap ( 0, 0, *_planes[PlaneId::Normal ], 0, dy, width(), height()-dy ); + _painters[PlaneId::Selection].drawPixmap ( 0, 0, *_planes[PlaneId::Selection], 0, dy, width(), height()-dy ); paintersEnd (); } @@ -470,7 +470,7 @@ namespace Hurricane { _painters[PlaneId::Selection].setBackground ( Graphics::getBrush("background") ); _painters[PlaneId::Selection].eraseRect ( sx, sy, w, h ); //_painters[PlaneId::Selection].setOpacity ( 0.5 ); - _painters[PlaneId::Selection].drawPixmap ( sx, sy, *_planes[0], sx, sy, w, h ); + _painters[PlaneId::Selection].drawPixmap ( sx, sy, *_planes[PlaneId::Normal], sx, sy, w, h ); painterEnd ( PlaneId::Selection ); } @@ -571,7 +571,7 @@ namespace Hurricane { painterBegin ( PlaneId::Image ); - _painters[PlaneId::Image].setRenderHint(QPainter::Antialiasing, false); + _painters[PlaneId::Image].setRenderHint ( QPainter::Antialiasing, false ); _painters[PlaneId::Image].drawPixmap ( ximage, yimage , *_planes[PlaneId::Normal] @@ -1002,6 +1002,8 @@ namespace Hurricane { { cerr << "CellWidget::~CellWidget()" << endl; + unselectAll (); + for ( size_t i=0 ; i<_commands.size() ; i++ ) unbindCommand ( _commands[i] ); } diff --git a/hurricane/src/hviewer/ControllerWidget.cpp b/hurricane/src/hviewer/ControllerWidget.cpp index 254c400e..8b40d104 100644 --- a/hurricane/src/hviewer/ControllerWidget.cpp +++ b/hurricane/src/hviewer/ControllerWidget.cpp @@ -227,6 +227,7 @@ namespace Hurricane { getCellWidget()->setShowSelection ( true ); connect ( _netlistBrowser, SIGNAL(netSelected (const Net*)), getCellWidget(), SLOT(select (const Net*)) ); connect ( _netlistBrowser, SIGNAL(netUnselected(const Net*)), getCellWidget(), SLOT(unselect(const Net*)) ); + _netlistBrowser->updateSelecteds (); } else { getCellWidget()->setShowSelection ( false ); getCellWidget()->setCumulativeSelection ( _cwCumulativeSelection ); diff --git a/hurricane/src/hviewer/InspectorWidget.cpp b/hurricane/src/hviewer/InspectorWidget.cpp index 743079ad..72f57703 100644 --- a/hurricane/src/hviewer/InspectorWidget.cpp +++ b/hurricane/src/hviewer/InspectorWidget.cpp @@ -241,6 +241,8 @@ namespace Hurricane { void InspectorWidget::_setRootRecord ( Record* record ) { + //if ( _baseModel ) _baseModel->setSlot ( NULL, 0 ); + _history.setRootRecord ( record ); if ( !record ) _rootOccurrence = Occurrence (); diff --git a/hurricane/src/hviewer/NetlistWidget.cpp b/hurricane/src/hviewer/NetlistWidget.cpp index 5b667953..f9877760 100644 --- a/hurricane/src/hviewer/NetlistWidget.cpp +++ b/hurricane/src/hviewer/NetlistWidget.cpp @@ -52,14 +52,15 @@ namespace Hurricane { NetlistWidget::NetlistWidget ( QWidget* parent ) - : QWidget (parent) - , _cellWidget(NULL) - , _cell (NULL) - , _baseModel (new NetlistModel(this)) - , _sortModel (new QSortFilterProxyModel(this)) - , _view (new QTableView(this)) - , _rowHeight (20) - , _selecteds () + : QWidget (parent) + , _cellWidget (NULL) + , _cell (NULL) + , _baseModel (new NetlistModel(this)) + , _sortModel (new QSortFilterProxyModel(this)) + , _view (new QTableView(this)) + , _rowHeight (20) + , _selecteds () + , _forceReselect(false) { setAttribute ( Qt::WA_DeleteOnClose ); setAttribute ( Qt::WA_QuitOnClose, false ); @@ -130,6 +131,15 @@ namespace Hurricane { } + void NetlistWidget::updateSelecteds () + { + _forceReselect = true; + + QItemSelection dummy; + updateSelecteds ( dummy, dummy ); + } + + void NetlistWidget::updateSelecteds ( const QItemSelection& , const QItemSelection& ) { if ( _cellWidget ) _cellWidget->openRefreshSession (); @@ -144,6 +154,11 @@ namespace Hurricane { _selecteds.insert ( net ); } + if ( _forceReselect ) { + _selecteds.forceInserteds(); + _forceReselect = false; + } + SelectedNetSet::iterator remove; SelectedNetSet::iterator isel = _selecteds.begin (); while ( isel != _selecteds.end() ) { @@ -172,7 +187,8 @@ namespace Hurricane { void NetlistWidget::textFilterChanged () { _sortModel->setFilterRegExp ( _filterPatternLineEdit->text() ); - forceRowHeight (); + forceRowHeight (); + //updateSelecteds (); } diff --git a/hurricane/src/hviewer/SelectionWidget.cpp b/hurricane/src/hviewer/SelectionWidget.cpp index 628d349f..cf6da691 100644 --- a/hurricane/src/hviewer/SelectionWidget.cpp +++ b/hurricane/src/hviewer/SelectionWidget.cpp @@ -33,6 +33,7 @@ #include #include #include +#include #include "hurricane/Commons.h" #include "hurricane/Cell.h" @@ -61,6 +62,7 @@ namespace Hurricane { { setAttribute ( Qt::WA_DeleteOnClose ); setAttribute ( Qt::WA_QuitOnClose, false ); + setContextMenuPolicy ( Qt::ActionsContextMenu ); _rowHeight = QFontMetrics(Graphics::getFixedFont()).height() + 4; @@ -93,7 +95,7 @@ namespace Hurricane { _sortModel->setSourceModel ( _baseModel ); _sortModel->setDynamicSortFilter ( true ); - _sortModel->setFilterKeyColumn ( 0 ); + _sortModel->setFilterKeyColumn ( 1 ); _view->setShowGrid(false); _view->setAlternatingRowColors(true); @@ -131,6 +133,19 @@ namespace Hurricane { connect ( _view->selectionModel(), SIGNAL(currentChanged(const QModelIndex&,const QModelIndex&)) , this , SLOT (selectCurrent (const QModelIndex&,const QModelIndex&)) ); + QAction* toggleAction = new QAction ( tr("&Toggle Selection"), this ); + toggleAction->setShortcut ( QKeySequence(tr("T")) ); + toggleAction->setStatusTip ( tr("Toggle the selection state of this Occurrence") ); + addAction ( toggleAction ); + + QAction* inspectAction = new QAction ( tr("&Inspect"), this ); + inspectAction->setShortcut ( QKeySequence(tr("I")) ); + inspectAction->setStatusTip ( tr("Load this Occurrence in the Inspector") ); + addAction ( inspectAction ); + + connect ( toggleAction , SIGNAL(triggered()), this, SLOT(toggleSelection ()) ); + connect ( inspectAction, SIGNAL(triggered()), this, SLOT(inspect()) ); + setWindowTitle ( tr("Selection") ); resize ( 500, 300 ); } @@ -143,19 +158,6 @@ namespace Hurricane { } - bool SelectionWidget::eventFilter ( QObject* object, QEvent* event ) - { - if ( event->type() == QEvent::KeyPress ) { - QKeyEvent* keyEvent = static_cast(event); - - if ( keyEvent->key() == Qt::Key_I ) { inspect ( _view->currentIndex() ); } - else if ( keyEvent->key() == Qt::Key_T ) { toggleSelection ( _view->currentIndex() ); } - } - - return QObject::eventFilter ( object, event ); - } - - void SelectionWidget::setCellWidget ( CellWidget* cw ) { if ( _cellWidget ) { @@ -234,12 +236,20 @@ namespace Hurricane { } + void SelectionWidget::toggleSelection () + { + toggleSelection ( _view->currentIndex() ); + } + + void SelectionWidget::toggleSelection ( const QModelIndex& index ) { - Occurrence occurrence = _baseModel->toggleSelection ( index ); - if ( occurrence.isValid() ) { - _updateState = InternalEmit; - _cellWidget->toggleSelection ( occurrence ); + if ( index.isValid() ) { + Occurrence occurrence = _baseModel->toggleSelection ( _sortModel->mapToSource(index) ); + if ( occurrence.isValid() ) { + _updateState = InternalEmit; + _cellWidget->toggleSelection ( occurrence ); + } } } @@ -285,6 +295,12 @@ namespace Hurricane { } + void SelectionWidget::inspect () + { + inspect ( _view->currentIndex() ); + } + + void SelectionWidget::inspect ( const QModelIndex& index ) { if ( index.isValid() ) { diff --git a/hurricane/src/hviewer/hurricane/viewer/CellWidget.h b/hurricane/src/hviewer/hurricane/viewer/CellWidget.h index 6cf94151..3aea6467 100644 --- a/hurricane/src/hviewer/hurricane/viewer/CellWidget.h +++ b/hurricane/src/hviewer/hurricane/viewer/CellWidget.h @@ -330,8 +330,8 @@ namespace Hurricane { public: class PlaneId { public: - enum Ids { Normal = 0 - , Selection = 1 + enum Ids { Normal = 0 // _planes[0] + , Selection = 1 // _planes[1] , Widget = 2 , Printer = 3 , Image = 4 @@ -378,7 +378,7 @@ namespace Hurricane { QPrinter* _printer; QImage* _image; QPixmap* _planes[2]; - QPainter _painters[5]; + QPainter _painters[PlaneId::Working]; QPen _normalPen; QPen _linePen; size_t _workingPlane; @@ -694,15 +694,15 @@ namespace Hurricane { inline int CellWidget::DrawingPlanes::width () const - { return _planes[0]->width(); } + { return _planes[PlaneId::Normal]->width(); } inline int CellWidget::DrawingPlanes::height () const - { return _planes[0]->height(); } + { return _planes[PlaneId::Normal]->height(); } inline QSize CellWidget::DrawingPlanes::size () const - { return _planes[0]->size(); } + { return _planes[PlaneId::Normal]->size(); } inline void CellWidget::DrawingPlanes::select ( size_t i ) @@ -710,37 +710,37 @@ namespace Hurricane { inline QPainter& CellWidget::DrawingPlanes::painter ( size_t i ) - { return _painters[(i>3)?_workingPlane:i]; } + { return _painters[(i>=PlaneId::Working)?_workingPlane:i]; } inline void CellWidget::DrawingPlanes::painterBegin ( size_t i ) { switch ( i ) { - case 5: i = _workingPlane; - case 0: - case 1: _painters[i].begin ( _planes[i] ); break; - case 2: _painters[2].begin ( _cellWidget ); break; - case 3: _painters[3].begin ( _printer ); break; - case 4: _painters[4].begin ( _image ); break; + case PlaneId::Working: i = _workingPlane; + case PlaneId::Normal: + case PlaneId::Selection: _painters[i].begin ( _planes[i] ); break; + case PlaneId::Widget: _painters[2].begin ( _cellWidget ); break; + case PlaneId::Printer: _painters[3].begin ( _printer ); break; + case PlaneId::Image: _painters[4].begin ( _image ); break; } } inline void CellWidget::DrawingPlanes::paintersBegin () { - painterBegin ( 0 ); - painterBegin ( 1 ); + painterBegin ( PlaneId::Normal ); + painterBegin ( PlaneId::Selection ); } inline void CellWidget::DrawingPlanes::painterEnd ( size_t i ) - { _painters[(i>4)?_workingPlane:i].end (); } + { _painters[(i>=PlaneId::Working)?_workingPlane:i].end (); } inline void CellWidget::DrawingPlanes::paintersEnd () { - painterEnd ( 0 ); - painterEnd ( 1 ); + painterEnd ( PlaneId::Normal ); + painterEnd ( PlaneId::Selection ); } diff --git a/hurricane/src/hviewer/hurricane/viewer/NetlistWidget.h b/hurricane/src/hviewer/hurricane/viewer/NetlistWidget.h index 3b30a238..78e38e73 100644 --- a/hurricane/src/hviewer/hurricane/viewer/NetlistWidget.h +++ b/hurricane/src/hviewer/hurricane/viewer/NetlistWidget.h @@ -67,6 +67,7 @@ namespace Hurricane { inline const Net* getNet () const; inline size_t getAccesses () const; inline void incAccesses () const; + inline void setInserted () const; inline void resetAccesses () const; private: const Net* _net; @@ -77,6 +78,7 @@ namespace Hurricane { inline SelectedNet::SelectedNet () : _net(NULL), _accesses(0) { } inline SelectedNet::SelectedNet ( const Net* net, size_t accesses ) : _net(net), _accesses(accesses) { } inline const Net* SelectedNet::getNet () const { return _net; } + inline void SelectedNet::setInserted () const { _accesses = 64; } inline size_t SelectedNet::getAccesses () const { return _accesses; } inline void SelectedNet::incAccesses () const { ++_accesses; } inline void SelectedNet::resetAccesses () const { _accesses = 0; } @@ -99,8 +101,9 @@ namespace Hurricane { class SelectedNetSet : public set{ public: - void insert ( const Net* ); - void resetAccesses (); + void insert ( const Net* ); + void forceInserteds (); + void resetAccesses (); }; @@ -114,6 +117,13 @@ namespace Hurricane { } + inline void SelectedNetSet::forceInserteds () + { + for ( iterator iselected=begin() ; iselected != end() ; ++iselected ) + iselected->setInserted (); + } + + inline void SelectedNetSet::resetAccesses () { for ( iterator iselected=begin() ; iselected != end() ; ++iselected ) @@ -136,6 +146,7 @@ namespace Hurricane { template void setCell ( Cell* ); void goTo ( int ); + void updateSelecteds (); signals: void netSelected ( const Net* ); void netUnselected ( const Net* ); @@ -156,6 +167,7 @@ namespace Hurricane { QLineEdit* _filterPatternLineEdit; int _rowHeight; SelectedNetSet _selecteds; + bool _forceReselect; }; diff --git a/hurricane/src/hviewer/hurricane/viewer/SelectionWidget.h b/hurricane/src/hviewer/hurricane/viewer/SelectionWidget.h index 096f81af..b78c0b03 100644 --- a/hurricane/src/hviewer/hurricane/viewer/SelectionWidget.h +++ b/hurricane/src/hviewer/hurricane/viewer/SelectionWidget.h @@ -73,14 +73,15 @@ namespace Hurricane { void setCumulativeSelection ( bool ); void selectCurrent ( const QModelIndex& current, const QModelIndex& ); void setSelection ( const SelectorSet& selection ); + void toggleSelection (); void toggleSelection ( Occurrence ); void toggleSelection ( const QModelIndex& ); void forceRowHeight (); + void inspect (); private slots: void textFilterChanged (); protected: void blockAllSignals ( bool ); - virtual bool eventFilter ( QObject*, QEvent* ); private: CellWidget* _cellWidget;