* ./hurricane/src/viewer :

- Change: Consistent encapsulation of "_active" in Command and all it's derived
        classes.
    - New: support for Rulers. Start drawing by pressing Shift+L.Button, finish
        by pressing it again. To cancel a Ruler press Shift+R.Button.
          Drawing style support also added : "text.ruler". Rulers are always
        visibles (display threshold sets to zero), only the numbers of graduations
        displayeds changes (at least 5 pixels between two graduations).
This commit is contained in:
Jean-Paul Chaput 2009-04-15 16:09:18 +00:00
parent a404498be5
commit ee828cb19f
14 changed files with 678 additions and 124 deletions

View File

@ -42,6 +42,7 @@
hurricane/viewer/AreaCommand.h hurricane/viewer/AreaCommand.h
hurricane/viewer/MoveCommand.h hurricane/viewer/MoveCommand.h
hurricane/viewer/ZoomCommand.h hurricane/viewer/ZoomCommand.h
hurricane/viewer/RulerCommand.h
hurricane/viewer/SelectCommand.h hurricane/viewer/SelectCommand.h
hurricane/viewer/HierarchyCommand.h hurricane/viewer/HierarchyCommand.h
hurricane/viewer/SelectorCriterion.h hurricane/viewer/SelectorCriterion.h
@ -53,6 +54,7 @@
hurricane/viewer/SelectionPopup.h hurricane/viewer/SelectionPopup.h
hurricane/viewer/SelectionModel.h hurricane/viewer/SelectionModel.h
hurricane/viewer/SelectionWidget.h hurricane/viewer/SelectionWidget.h
hurricane/viewer/Ruler.h
hurricane/viewer/NetInformations.h hurricane/viewer/NetInformations.h
hurricane/viewer/NetlistWidget.h hurricane/viewer/NetlistWidget.h
hurricane/viewer/DisplayFilterWidget.h hurricane/viewer/DisplayFilterWidget.h
@ -79,6 +81,7 @@
AreaCommand.cpp AreaCommand.cpp
MoveCommand.cpp MoveCommand.cpp
ZoomCommand.cpp ZoomCommand.cpp
RulerCommand.cpp
SelectCommand.cpp SelectCommand.cpp
HierarchyCommand.cpp HierarchyCommand.cpp
SelectorCriterion.cpp SelectorCriterion.cpp
@ -90,6 +93,7 @@
SelectionPopup.cpp SelectionPopup.cpp
SelectionModel.cpp SelectionModel.cpp
SelectionWidget.cpp SelectionWidget.cpp
Ruler.cpp
NetInformations.cpp NetInformations.cpp
NetlistModel.cpp NetlistModel.cpp
NetlistWidget.cpp NetlistWidget.cpp

View File

@ -59,6 +59,7 @@ namespace Hurricane {
, _fitToContentsAction(NULL) , _fitToContentsAction(NULL)
, _showSelectionAction(NULL) , _showSelectionAction(NULL)
, _rubberChangeAction(NULL) , _rubberChangeAction(NULL)
, _clearRulersAction(NULL)
, _controllerAction(NULL) , _controllerAction(NULL)
, _fileMenu(NULL) , _fileMenu(NULL)
, _viewMenu(NULL) , _viewMenu(NULL)
@ -71,6 +72,7 @@ namespace Hurricane {
, _cellWidget(NULL) , _cellWidget(NULL)
, _moveCommand() , _moveCommand()
, _zoomCommand() , _zoomCommand()
, _rulerCommand()
, _selectCommand() , _selectCommand()
, _hierarchyCommand() , _hierarchyCommand()
, _cellHistory() , _cellHistory()
@ -161,6 +163,11 @@ namespace Hurricane {
_rubberChangeAction->setStatusTip ( tr("Cycle through all avalaibles rubber drawing styles") ); _rubberChangeAction->setStatusTip ( tr("Cycle through all avalaibles rubber drawing styles") );
_rubberChangeAction->setShortcut ( Qt::Key_Asterisk ); _rubberChangeAction->setShortcut ( Qt::Key_Asterisk );
_clearRulersAction = new QAction ( tr("Clear Rulers"), this );
_clearRulersAction->setObjectName ( "viewer.menuBar.view.clearRulers" );
_clearRulersAction->setStatusTip ( tr("Remove all rulers") );
_clearRulersAction->setShortcut ( QKeySequence(tr("CTRL+R")) );
_controllerAction = new QAction ( tr("Controller"), this ); _controllerAction = new QAction ( tr("Controller"), this );
_controllerAction->setObjectName ( "viewer.menuBar.tools.controller" ); _controllerAction->setObjectName ( "viewer.menuBar.tools.controller" );
_controllerAction->setStatusTip ( tr("Fine Tune && Inspect DataBase") ); _controllerAction->setStatusTip ( tr("Fine Tune && Inspect DataBase") );
@ -197,6 +204,7 @@ namespace Hurricane {
_viewMenu->addAction ( _fitToContentsAction ); _viewMenu->addAction ( _fitToContentsAction );
_viewMenu->addAction ( _showSelectionAction ); _viewMenu->addAction ( _showSelectionAction );
_viewMenu->addAction ( _rubberChangeAction ); _viewMenu->addAction ( _rubberChangeAction );
_viewMenu->addAction ( _clearRulersAction );
_toolsMenu = menuBar()->addMenu ( tr("Tools") ); _toolsMenu = menuBar()->addMenu ( tr("Tools") );
_toolsMenu->setObjectName ( "viewer.menuBar.tools" ); _toolsMenu->setObjectName ( "viewer.menuBar.tools" );
@ -224,6 +232,7 @@ namespace Hurricane {
_cellWidget->bindCommand ( &_moveCommand ); _cellWidget->bindCommand ( &_moveCommand );
_cellWidget->bindCommand ( &_zoomCommand ); _cellWidget->bindCommand ( &_zoomCommand );
_cellWidget->bindCommand ( &_rulerCommand );
_cellWidget->bindCommand ( &_selectCommand ); _cellWidget->bindCommand ( &_selectCommand );
_cellWidget->bindCommand ( &_hierarchyCommand ); _cellWidget->bindCommand ( &_hierarchyCommand );
_controller->setCellWidget ( _cellWidget ); _controller->setCellWidget ( _cellWidget );
@ -253,6 +262,7 @@ namespace Hurricane {
connect ( _fitToContentsAction , SIGNAL(triggered()) , _cellWidget, SLOT(fitToContents()) ); connect ( _fitToContentsAction , SIGNAL(triggered()) , _cellWidget, SLOT(fitToContents()) );
connect ( _showSelectionAction , SIGNAL(toggled(bool)) , this , SLOT(setShowSelection(bool)) ); connect ( _showSelectionAction , SIGNAL(toggled(bool)) , this , SLOT(setShowSelection(bool)) );
connect ( _rubberChangeAction , SIGNAL(triggered()) , _cellWidget, SLOT(rubberChange()) ); connect ( _rubberChangeAction , SIGNAL(triggered()) , _cellWidget, SLOT(rubberChange()) );
connect ( _clearRulersAction , SIGNAL(triggered()) , _cellWidget, SLOT(clearRulers()) );
connect ( _controllerAction , SIGNAL(triggered()) , this , SLOT(showController()) ); connect ( _controllerAction , SIGNAL(triggered()) , this , SLOT(showController()) );
connect ( _cellWidget , SIGNAL(mousePositionChanged(const Point&)) connect ( _cellWidget , SIGNAL(mousePositionChanged(const Point&))

View File

@ -25,6 +25,7 @@
#include <sys/resource.h> #include <sys/resource.h>
#include <ctime> #include <ctime>
#include <cmath>
#include <QApplication> #include <QApplication>
#include <QMouseEvent> #include <QMouseEvent>
@ -129,7 +130,6 @@ namespace Hurricane {
} }
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Class : "Hurricane::CellWidget::Spot". // Class : "Hurricane::CellWidget::Spot".
@ -372,34 +372,28 @@ namespace Hurricane {
_linePen.setStyle ( Qt::SolidLine ); _linePen.setStyle ( Qt::SolidLine );
_linePen.setWidth ( 1 ); _linePen.setWidth ( 1 );
if ( _lineMode ) { if ( _lineMode ) painter().setPen ( _linePen );
_painters[0].setPen ( _linePen ); else painter().setPen ( _normalPen );
_painters[1].setPen ( _linePen );
} else {
_painters[0].setPen ( _normalPen );
_painters[1].setPen ( _normalPen );
}
} }
void CellWidget::DrawingPlanes::setBrush ( const QBrush& brush ) void CellWidget::DrawingPlanes::setBrush ( const QBrush& brush )
{ {
_painters[PlaneId::Normal ].setBrush ( brush ); painter().setBrush ( brush );
_painters[PlaneId::Selection].setBrush ( brush );
} }
void CellWidget::DrawingPlanes::setBackground ( const QBrush& brush ) void CellWidget::DrawingPlanes::setBackground ( const QBrush& brush )
{ {
_painters[PlaneId::Normal ].setBackground ( brush ); painter().setBackground ( brush );
_painters[PlaneId::Selection].setBackground ( brush ); painter().setBackground ( brush );
} }
void CellWidget::DrawingPlanes::setBackgroundMode ( Qt::BGMode mode ) void CellWidget::DrawingPlanes::setBackgroundMode ( Qt::BGMode mode )
{ {
_painters[PlaneId::Normal ].setBackgroundMode ( mode ); painter().setBackgroundMode ( mode );
_painters[PlaneId::Selection].setBackgroundMode ( mode ); painter().setBackgroundMode ( mode );
} }
@ -429,49 +423,49 @@ namespace Hurricane {
void CellWidget::DrawingPlanes::shiftLeft ( int dx ) void CellWidget::DrawingPlanes::shiftLeft ( int dx )
{ {
paintersBegin (); buffersBegin ();
_painters[PlaneId::Normal ].drawPixmap ( dx, 0, *_planes[PlaneId::Normal ], 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() ); _painters[PlaneId::Selection].drawPixmap ( dx, 0, *_planes[PlaneId::Selection], 0, 0, width()-dx, height() );
paintersEnd (); buffersEnd ();
} }
void CellWidget::DrawingPlanes::shiftRight ( int dx ) void CellWidget::DrawingPlanes::shiftRight ( int dx )
{ {
paintersBegin (); buffersBegin ();
_painters[PlaneId::Normal ].drawPixmap ( 0, 0, *_planes[PlaneId::Normal ], 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() ); _painters[PlaneId::Selection].drawPixmap ( 0, 0, *_planes[PlaneId::Selection], dx, 0, width()-dx, height() );
paintersEnd (); buffersEnd ();
} }
void CellWidget::DrawingPlanes::shiftUp ( int dy ) void CellWidget::DrawingPlanes::shiftUp ( int dy )
{ {
paintersBegin (); buffersBegin ();
_painters[PlaneId::Normal ].drawPixmap ( 0, dy, *_planes[PlaneId::Normal ], 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 ); _painters[PlaneId::Selection].drawPixmap ( 0, dy, *_planes[PlaneId::Selection], 0, 0, width(), height()-dy );
paintersEnd (); buffersEnd ();
} }
void CellWidget::DrawingPlanes::shiftDown ( int dy ) void CellWidget::DrawingPlanes::shiftDown ( int dy )
{ {
paintersBegin (); buffersBegin ();
_painters[PlaneId::Normal ].drawPixmap ( 0, 0, *_planes[PlaneId::Normal ], 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 ); _painters[PlaneId::Selection].drawPixmap ( 0, 0, *_planes[PlaneId::Selection], 0, dy, width(), height()-dy );
paintersEnd (); buffersEnd ();
} }
void CellWidget::DrawingPlanes::copyToSelect ( int sx, int sy, int w, int h ) void CellWidget::DrawingPlanes::copyToSelect ( int sx, int sy, int w, int h )
{ {
painterBegin ( PlaneId::Selection ); begin ( PlaneId::Selection );
_painters[PlaneId::Selection].setPen ( Qt::NoPen ); _painters[PlaneId::Selection].setPen ( Qt::NoPen );
_painters[PlaneId::Selection].setBackground ( Graphics::getBrush("background") ); _painters[PlaneId::Selection].setBackground ( Graphics::getBrush("background") );
_painters[PlaneId::Selection].eraseRect ( sx, sy, w, h ); _painters[PlaneId::Selection].eraseRect ( sx, sy, w, h );
//_painters[PlaneId::Selection].setOpacity ( 0.5 ); //_painters[PlaneId::Selection].setOpacity ( 0.5 );
_painters[PlaneId::Selection].drawPixmap ( sx, sy, *_planes[PlaneId::Normal], sx, sy, w, h ); _painters[PlaneId::Selection].drawPixmap ( sx, sy, *_planes[PlaneId::Normal], sx, sy, w, h );
painterEnd ( PlaneId::Selection ); end ( PlaneId::Selection );
} }
@ -506,7 +500,7 @@ namespace Hurricane {
} }
_printer = printer; _printer = printer;
painterBegin ( PlaneId::Printer ); begin ( PlaneId::Printer );
if ( !imageOnly ) { if ( !imageOnly ) {
QFont font ( "Bitstream Vera Sans", 12 ); QFont font ( "Bitstream Vera Sans", 12 );
@ -556,7 +550,7 @@ namespace Hurricane {
_painters[PlaneId::Printer].drawRect ( ximage-2, 98, w+4, h+4 ); _painters[PlaneId::Printer].drawRect ( ximage-2, 98, w+4, h+4 );
} }
painterEnd ( PlaneId::Printer ); end ( PlaneId::Printer );
_printer = NULL; _printer = NULL;
} }
@ -569,7 +563,7 @@ namespace Hurricane {
if ( !image ) return; if ( !image ) return;
_image = image; _image = image;
painterBegin ( PlaneId::Image ); begin ( PlaneId::Image );
_painters[PlaneId::Image].setRenderHint ( QPainter::Antialiasing, false ); _painters[PlaneId::Image].setRenderHint ( QPainter::Antialiasing, false );
_painters[PlaneId::Image].drawPixmap _painters[PlaneId::Image].drawPixmap
@ -597,7 +591,7 @@ namespace Hurricane {
} }
} }
painterEnd ( PlaneId::Image ); end ( PlaneId::Image );
_image = NULL; _image = NULL;
} }
@ -785,7 +779,8 @@ namespace Hurricane {
Box bbox = getTransformation().getBox(getMasterCell()->getAbutmentBox()); Box bbox = getTransformation().getBox(getMasterCell()->getAbutmentBox());
if ( getDepth() == 2 ) if ( getDepth() == 2 )
_cellWidget->drawText ( Point(bbox.getXMin(),bbox.getYMin()) _cellWidget->drawText ( Point(bbox.getXMin(),bbox.getYMin())
, getInstance()->getName() , getString(getInstance()->getName()).c_str()
, false
, -90 , -90
, true , true
); );
@ -1199,8 +1194,7 @@ namespace Hurricane {
_spot.setRestore ( false ); _spot.setRestore ( false );
//_drawingPlanes.copyToSelect ( redrawArea ); //_drawingPlanes.copyToSelect ( redrawArea );
_drawingPlanes.select ( PlaneId::Normal ); _drawingPlanes.select ( PlaneId::Normal );
_drawingPlanes.paintersBegin (); _drawingPlanes.begin ();
_drawingPlanes.painter().setPen ( Qt::NoPen ); _drawingPlanes.painter().setPen ( Qt::NoPen );
_drawingPlanes.painter().setBackground ( Graphics::getBrush("background") ); _drawingPlanes.painter().setBackground ( Graphics::getBrush("background") );
_drawingPlanes.painter().setClipRect ( redrawArea ); _drawingPlanes.painter().setClipRect ( redrawArea );
@ -1282,20 +1276,21 @@ namespace Hurricane {
_drawingQuery.doQuery (); _drawingQuery.doQuery ();
} }
} }
repaint ();
} }
_drawingPlanes.paintersEnd (); _drawingPlanes.end ();
_cellModificated = false; _cellModificated = false;
} }
if ( isDrawable("grid") ) drawGrid ( redrawArea ); if ( isDrawable("grid") ) drawGrid ( redrawArea );
if ( isDrawable("text.ruler") ) drawRulers ( redrawArea );
setDarkening ( 100 ); setDarkening ( 100 );
if ( _state->showSelection() ) if ( _state->showSelection() )
redrawSelection ( redrawArea ); redrawSelection ( redrawArea );
popCursor (); popCursor ();
repaint ();
// timer.stop (); // timer.stop ();
// cerr << "CellWidget::redraw() - " << _redrawRectCount // cerr << "CellWidget::redraw() - " << _redrawRectCount
@ -1329,7 +1324,7 @@ namespace Hurricane {
); );
_drawingPlanes.select ( PlaneId::Selection ); _drawingPlanes.select ( PlaneId::Selection );
_drawingPlanes.paintersBegin (); _drawingPlanes.begin ();
_drawingPlanes.painter().setPen ( Qt::NoPen ); _drawingPlanes.painter().setPen ( Qt::NoPen );
_drawingPlanes.painter().setBackground ( Graphics::getBrush("background") ); _drawingPlanes.painter().setBackground ( Graphics::getBrush("background") );
_drawingPlanes.painter().setClipRect ( redrawArea ); _drawingPlanes.painter().setClipRect ( redrawArea );
@ -1398,11 +1393,9 @@ namespace Hurricane {
if ( isDrawable(extensionName) ) if ( isDrawable(extensionName) )
_drawingQuery.drawExtensionGo ( this, eGo, NULL, redrawBox, transformation ); _drawingQuery.drawExtensionGo ( this, eGo, NULL, redrawBox, transformation );
} }
repaint ();
} }
_drawingPlanes.paintersEnd (); _drawingPlanes.end ();
_selectionHasChanged = false; _selectionHasChanged = false;
} }
@ -1477,17 +1470,25 @@ namespace Hurricane {
} }
void CellWidget::drawText ( const Point& point, const Name& text, int angle, bool reverse ) void CellWidget::drawText ( const Point& point, const char* text, bool bold, int angle, bool reverse )
{
drawDisplayText ( dbuToDisplayPoint(point), text, bold, angle, reverse );
}
void CellWidget::drawDisplayText ( const QPoint& point, const char* text, bool bold, int angle, bool reverse )
{ {
_drawingPlanes.painter().save(); _drawingPlanes.painter().save();
if ( reverse ) { if ( reverse ) {
_drawingPlanes.painter().setPen ( Graphics::getPen ("background") ); _drawingPlanes.painter().setPen ( Graphics::getPen ("background") );
_drawingPlanes.painter().setBackgroundMode ( Qt::OpaqueMode ); _drawingPlanes.painter().setBackgroundMode ( Qt::OpaqueMode );
} }
_drawingPlanes.painter().translate( dbuToDisplayPoint(point) );
_drawingPlanes.painter().rotate( angle ); _drawingPlanes.painter().setFont ( Graphics::getNormalFont(bold) );
_drawingPlanes.painter().drawText ( 0, _textFontHeight, getString(text).c_str() ); _drawingPlanes.painter().translate ( point );
_drawingPlanes.painter().restore(); _drawingPlanes.painter().rotate ( angle );
_drawingPlanes.painter().drawText ( 0, _textFontHeight, text );
_drawingPlanes.painter().restore ();
} }
@ -1550,10 +1551,10 @@ namespace Hurricane {
void CellWidget::drawGrid ( QRect redrawArea ) void CellWidget::drawGrid ( QRect redrawArea )
{ {
_drawingPlanes.select ( PlaneId::Normal ); _drawingPlanes.select ( PlaneId::Normal );
_drawingPlanes.painterBegin (); _drawingPlanes.begin ();
_drawingPlanes.painter ().setClipRect ( redrawArea ); _drawingPlanes.painter ().setClipRect ( redrawArea );
_drawingPlanes.painter ( PlaneId::Normal ).setPen ( Graphics::getPen("grid") ); _drawingPlanes.painter ().setPen ( Graphics::getPen("grid") );
Box redrawBox = displayToDbuBox ( redrawArea ).inflate ( DbU::lambda(1.0) ); Box redrawBox = displayToDbuBox ( redrawArea ).inflate ( DbU::lambda(1.0) );
@ -1576,22 +1577,196 @@ namespace Hurricane {
center = dbuToDisplayPoint(xGrid,yGrid); center = dbuToDisplayPoint(xGrid,yGrid);
if ( (xGrid % superGridStep) || (yGrid % superGridStep) ) { if ( (xGrid % superGridStep) || (yGrid % superGridStep) ) {
if ( detailedGrid ) { if ( detailedGrid ) {
_drawingPlanes.painter(PlaneId::Normal).drawPoint ( center ); _drawingPlanes.painter().drawPoint ( center );
} }
} else { } else {
if ( detailedGrid ) { if ( detailedGrid ) {
_drawingPlanes.painter(PlaneId::Normal).drawLine ( center.x()-3, center.y() , center.x()+3, center.y() ); _drawingPlanes.painter().drawLine ( center.x()-3, center.y() , center.x()+3, center.y() );
_drawingPlanes.painter(PlaneId::Normal).drawLine ( center.x() , center.y()-3, center.x() , center.y()+3 ); _drawingPlanes.painter().drawLine ( center.x() , center.y()-3, center.x() , center.y()+3 );
} else { } else {
_drawingPlanes.painter(PlaneId::Normal).drawPoint ( center ); _drawingPlanes.painter().drawPoint ( center );
} }
} }
} }
} }
_drawingPlanes.copyToSelect ( redrawArea ); _drawingPlanes.copyToSelect ( redrawArea );
_drawingPlanes.painterEnd (); _drawingPlanes.end ();
repaint (); }
void CellWidget::drawRulers ( QRect redrawArea )
{
_drawingPlanes.select ( PlaneId::Normal );
_drawingPlanes.begin ();
_drawingPlanes.painter ().setClipRect ( redrawArea );
redrawArea.adjust ( -50, -50, 50, 50 );
Box redrawBox = displayToDbuBox ( redrawArea );
RulerSet::iterator iruler = _state->getRulers().begin();
RulerSet::iterator end = _state->getRulers().end();
for ( ; iruler != end ; iruler++ ) {
if ( !(*iruler)->intersect(redrawBox) ) continue;
drawRuler ( *iruler );
}
_drawingPlanes.copyToSelect ( redrawArea );
_drawingPlanes.end ();
}
void CellWidget::drawRuler ( shared_ptr<Ruler> ruler )
{
QFont font = Graphics::getNormalFont();
QFontMetrics metrics = QFontMetrics(font);
int tickLength = metrics.width ( "+00000" );
Point origin = ruler->getOrigin ();
Point extremity = ruler->getExtremity ();
Point angle = ruler->getAngle ();
DbU::Unit graduation;
DbU::Unit gradStep;
QPoint pxOrigin;
QPoint pxExtremity;
QPoint pxAngle;
bool onScreen = ( _drawingPlanes.getWorkingPlane() > PlaneId::Selection );
// Never less than 5 pixels between two graduations ticks.
if ( symbolicMode() )
gradStep = DbU::lambda(pow(10.0,ceil(log10(DbU::getLambda(displayToDbuLength(50))))))/10;
else
gradStep = DbU::grid(pow(10.0,ceil(log10(DbU::getGrid(displayToDbuLength(50))))))/10;
if ( onScreen ) {
pxOrigin = dbuToScreenPoint ( origin );
pxExtremity = dbuToScreenPoint ( extremity );
pxAngle = dbuToScreenPoint ( angle );
} else {
pxOrigin = dbuToDisplayPoint ( origin );
pxExtremity = dbuToDisplayPoint ( extremity );
pxAngle = dbuToDisplayPoint ( angle );
}
int pxGrad;
int pyGrad;
string textGrad;
int tick;
_drawingPlanes.painter().setPen ( Graphics::getPen("text.ruler") );
// The horizontal ruler.
bool increase = ( origin.getX() < extremity.getX() );
if ( !increase )
gradStep = -gradStep;
if ( abs(pxAngle.x() - pxOrigin.x()) > 20 ) {
// The horizontal ruler axis.
_drawingPlanes.painter().drawLine ( pxOrigin, pxAngle );
// The horizontal ruler ticks.
for ( graduation=origin.getX(), tick=0 ; true ; graduation+=gradStep, tick++ ) {
if ( increase ) {
if ( graduation >= angle.getX() ) break;
} else
if ( graduation <= angle.getX() ) break;
if ( onScreen ) pxGrad = dbuToScreenX ( graduation );
else pxGrad = dbuToDisplayX ( graduation );
if ( tick % 10 ) {
_drawingPlanes.painter().drawLine ( pxGrad, pxOrigin.y()
, pxGrad, pxOrigin.y()+((tick%2)?5:10) );
} else {
_drawingPlanes.painter().drawLine ( pxGrad, pxOrigin.y()
, pxGrad, pxOrigin.y()+tickLength );
if ( !tick ) continue;
textGrad = DbU::getValueString( gradStep*tick );
textGrad.resize ( textGrad.size()-1 );
drawDisplayText ( QPoint(pxGrad - _textFontHeight - 1
,pxOrigin.y() + tickLength)
, textGrad.c_str()
, true
, -90
, false
);
}
}
// The last horizontal tick.
_drawingPlanes.painter().drawLine ( pxAngle.x(), pxAngle.y()
, pxAngle.x(), pxAngle.y()+tickLength );
textGrad = DbU::getValueString ( angle.getX() - origin.getX() );
textGrad.resize ( textGrad.size()-1 );
drawDisplayText ( QPoint(pxAngle.x() - _textFontHeight - 1
,pxAngle.y() + tickLength)
, textGrad.c_str()
, true
, -90
, false
);
}
if ( abs(pxExtremity.y() - pxAngle.y()) > 20 ) {
// The vertical ruler.
increase = ( angle.getY() < extremity.getY() );
if ( increase xor ( gradStep > 0 ) )
gradStep = -gradStep;
// The vertical ruler axis.
_drawingPlanes.painter().drawLine ( pxAngle, pxExtremity );
// The vertical ruler ticks.
for ( graduation=angle.getY(), tick=0 ; true ; graduation+=gradStep, tick++ ) {
if ( increase ) {
if ( graduation >= extremity.getY() ) break;
} else
if ( graduation <= extremity.getY() ) break;
if ( onScreen ) pyGrad = dbuToScreenY ( graduation );
else pyGrad = dbuToDisplayY ( graduation );
if ( tick % 10 ) {
_drawingPlanes.painter().drawLine ( pxAngle.x() , pyGrad
, pxAngle.x()-((tick%2)?5:10), pyGrad );
} else {
_drawingPlanes.painter().drawLine ( pxAngle.x() , pyGrad
, pxAngle.x()-tickLength, pyGrad );
if ( !tick ) continue;
textGrad = DbU::getValueString( gradStep*tick );
textGrad.resize ( textGrad.size()-1 );
drawDisplayText ( QPoint(pxAngle.x() - tickLength
,pyGrad + 1)
, textGrad.c_str()
, true
, 0
, false
);
}
}
// The last vertical tick.
_drawingPlanes.painter().drawLine ( pxAngle.x() , pxExtremity.y()
, pxAngle.x()-tickLength, pxExtremity.y() );
textGrad = DbU::getValueString( extremity.getY() - angle.getY() );
textGrad.resize ( textGrad.size()-1 );
drawDisplayText ( QPoint(pxAngle.x() - tickLength
,pxExtremity.y() + 1)
, textGrad.c_str()
, true
, 0
, false
);
}
} }
@ -1921,13 +2096,16 @@ namespace Hurricane {
// static time_t currTime = 0; // static time_t currTime = 0;
// timer.start (); // timer.start ();
_drawingPlanes.painterBegin ( PlaneId::Widget ); _drawingPlanes.pushWorkingPlane ();
_drawingPlanes.copyToScreen (); _drawingPlanes.select ( PlaneId::Widget );
_drawingPlanes.begin ();
_drawingPlanes.copyToScreen ();
for ( size_t i=0 ; i<_commands.size() ; i++ ) for ( size_t i=0 ; i<_commands.size() ; i++ )
_commands[i]->draw ( this ); _commands[i]->draw ( this );
if ( isDrawable("spot") ) _spot.moveTo ( _mousePosition ); if ( isDrawable("spot") ) _spot.moveTo ( _mousePosition );
_drawingPlanes.painterEnd ( PlaneId::Widget ); _drawingPlanes.end ();
_drawingPlanes.popWorkingPlane ();
// timer.stop (); // timer.stop ();
// time ( &currTime ); // time ( &currTime );

View File

@ -49,6 +49,7 @@ namespace Hurricane {
const Name DisplayStyle::Grid = "grid"; const Name DisplayStyle::Grid = "grid";
const Name DisplayStyle::Spot = "spot"; const Name DisplayStyle::Spot = "spot";
const Name DisplayStyle::Ghost = "ghost"; const Name DisplayStyle::Ghost = "ghost";
const Name DisplayStyle::TextRuler = "text.ruler";
const Name DisplayStyle::TextCell = "text.cell"; const Name DisplayStyle::TextCell = "text.cell";
const Name DisplayStyle::TextInstance = "text.instance"; const Name DisplayStyle::TextInstance = "text.instance";
const Name DisplayStyle::Undef = "undef"; const Name DisplayStyle::Undef = "undef";
@ -263,6 +264,7 @@ namespace Hurricane {
addDrawingStyle ( Viewer, Grid , "FFFFFFFFFFFFFFFF", 255, 255, 255, 1, 8.0 ); addDrawingStyle ( Viewer, Grid , "FFFFFFFFFFFFFFFF", 255, 255, 255, 1, 8.0 );
addDrawingStyle ( Viewer, Spot , "FFFFFFFFFFFFFFFF", 255, 255, 255, 1, 8.0 ); addDrawingStyle ( Viewer, Spot , "FFFFFFFFFFFFFFFF", 255, 255, 255, 1, 8.0 );
addDrawingStyle ( Viewer, Ghost , "FFFFFFFFFFFFFFFF", 255, 255, 255, 1, 1.0 ); addDrawingStyle ( Viewer, Ghost , "FFFFFFFFFFFFFFFF", 255, 255, 255, 1, 1.0 );
addDrawingStyle ( Viewer, TextRuler , "FFFFFFFFFFFFFFFF", 255, 255, 255, 1, 0.0 );
addDrawingStyle ( Viewer, TextCell , "8822441188224411", 255, 255, 255, 0, 1.0 ); addDrawingStyle ( Viewer, TextCell , "8822441188224411", 255, 255, 255, 0, 1.0 );
addDrawingStyle ( Viewer, TextInstance , "8822441188224411", 255, 255, 255, 0, 1.0 ); addDrawingStyle ( Viewer, TextInstance , "8822441188224411", 255, 255, 255, 0, 1.0 );
addDrawingStyle ( Viewer, Undef , "2244118822441188", 238, 130, 238, 0, 1.0 ); addDrawingStyle ( Viewer, Undef , "2244118822441188", 238, 130, 238, 0, 1.0 );

View File

@ -39,7 +39,6 @@ namespace Hurricane {
MoveCommand::MoveCommand () MoveCommand::MoveCommand ()
: Command () : Command ()
, _active (false)
, _firstEvent (true) , _firstEvent (true)
, _lastPosition() , _lastPosition()
{ } { }
@ -60,9 +59,9 @@ namespace Hurricane {
case Qt::Key_Left: widget->goLeft (); return true; case Qt::Key_Left: widget->goLeft (); return true;
case Qt::Key_Right: widget->goRight (); return true; case Qt::Key_Right: widget->goRight (); return true;
case Qt::Key_Space: case Qt::Key_Space:
if ( !_active ) { if ( !isActive() ) {
_active = true; setActive ( true );
_firstEvent = true; _firstEvent = true;
//_lastPosition = widget->getMousePosition(); //_lastPosition = widget->getMousePosition();
widget->pushCursor ( Qt::ClosedHandCursor ); widget->pushCursor ( Qt::ClosedHandCursor );
return true; return true;
@ -76,8 +75,8 @@ namespace Hurricane {
{ {
switch ( event->key() ) { switch ( event->key() ) {
case Qt::Key_Space: case Qt::Key_Space:
if ( _active && !event->isAutoRepeat() ) { if ( isActive() && !event->isAutoRepeat() ) {
_active = false; setActive ( false );
widget->popCursor (); widget->popCursor ();
return true; return true;
} }
@ -89,7 +88,7 @@ namespace Hurricane {
bool MoveCommand::mouseMoveEvent ( CellWidget* widget, QMouseEvent* event ) bool MoveCommand::mouseMoveEvent ( CellWidget* widget, QMouseEvent* event )
{ {
if ( !_active ) return false; if ( !isActive() ) return false;
QPoint eventPosition = event->pos(); QPoint eventPosition = event->pos();
if ( _firstEvent ) { _firstEvent = false; _lastPosition = eventPosition; } if ( _firstEvent ) { _firstEvent = false; _lastPosition = eventPosition; }
@ -113,13 +112,13 @@ namespace Hurricane {
bool MoveCommand::mousePressEvent ( CellWidget* widget, QMouseEvent* event ) bool MoveCommand::mousePressEvent ( CellWidget* widget, QMouseEvent* event )
{ {
return _active; return isActive();
} }
bool MoveCommand::mouseReleaseEvent ( CellWidget* widget, QMouseEvent* event ) bool MoveCommand::mouseReleaseEvent ( CellWidget* widget, QMouseEvent* event )
{ {
return _active; return isActive();
} }

View File

@ -0,0 +1,55 @@
// -*- C++ -*-
//
// This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved
//
// ===================================================================
//
// $Id$
//
// x-----------------------------------------------------------------x
// | |
// | C O R I O L I S |
// | V L S I B a c k e n d D a t a - B a s e |
// | |
// | Author : Jean-Paul CHAPUT |
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
// | =============================================================== |
// | C++ Module : "./Ruler.cpp" |
// | *************************************************************** |
// | U p d a t e s |
// | |
// x-----------------------------------------------------------------x
#include "hurricane/viewer/Ruler.h"
namespace Hurricane {
// -------------------------------------------------------------------
// Class : "Hurricane::Ruler".
Ruler::Ruler ( const Point& origin )
: _origin (origin)
, _extremity(origin)
{ }
Ruler::Ruler ( const Point& origin, const Point& extremity )
: _origin (origin)
, _extremity(extremity)
{ }
bool Ruler::intersect ( const Box& area ) const
{
Point angle = getAngle ();
return area.intersect(Box(_origin,angle)) || area.intersect(Box(angle,_extremity));
}
} // End of Hurricane namespace.

View File

@ -0,0 +1,109 @@
// -*- C++ -*-
//
// This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved
//
// ===================================================================
//
// $Id$
//
// x-----------------------------------------------------------------x
// | |
// | H U R R I C A N E |
// | V L S I B a c k e n d D a t a - B a s e |
// | |
// | Author : Jean-Paul CHAPUT |
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
// | =============================================================== |
// | C++ Module : "./RulerCommand.cpp" |
// | *************************************************************** |
// | U p d a t e s |
// | |
// x-----------------------------------------------------------------x
# include <QMouseEvent>
# include <QKeyEvent>
# include <hurricane/viewer/CellWidget.h>
# include <hurricane/viewer/RulerCommand.h>
namespace Hurricane {
// -------------------------------------------------------------------
// Class : "RulerCommand".
RulerCommand::RulerCommand ()
: Command ()
, _ruler ()
{ }
RulerCommand::~RulerCommand ()
{ }
bool RulerCommand::keyPressEvent ( CellWidget* widget, QKeyEvent* event )
{
return false;
}
bool RulerCommand::keyReleaseEvent ( CellWidget* widget, QKeyEvent* event )
{
return false;
}
bool RulerCommand::mouseMoveEvent ( CellWidget* widget, QMouseEvent* event )
{
if ( !isActive() ) return false;
_ruler->setExtremity ( widget->_onSnapGrid(widget->screenToDbuPoint(event->pos())) );
widget->update ();
return true;
}
bool RulerCommand::mousePressEvent ( CellWidget* widget, QMouseEvent* event )
{
if ( event->modifiers() & Qt::ShiftModifier ) {
if ( event->button() == Qt::LeftButton ) {
if ( !isActive() ) {
setActive ( true );
_ruler.reset ( new Ruler
(widget->_onSnapGrid(widget->screenToDbuPoint(widget->getMousePosition())) ) );
return true;
} else {
widget->addRuler ( _ruler );
setActive ( false );
_ruler.reset ();
}
} else if ( event->button() == Qt::RightButton ){
if ( isActive() ) {
setActive ( false );
_ruler.reset ();
}
}
}
return isActive();
}
bool RulerCommand::mouseReleaseEvent ( CellWidget* widget, QMouseEvent* event )
{ return false; }
void RulerCommand::draw ( CellWidget* widget )
{
if ( !isActive() ) return;
widget->drawRuler ( _ruler );
}
} // End of Hurricane namespace.

View File

@ -44,6 +44,7 @@ class QMenu;
#include "hurricane/viewer/MoveCommand.h" #include "hurricane/viewer/MoveCommand.h"
#include "hurricane/viewer/ZoomCommand.h" #include "hurricane/viewer/ZoomCommand.h"
#include "hurricane/viewer/RulerCommand.h"
#include "hurricane/viewer/SelectCommand.h" #include "hurricane/viewer/SelectCommand.h"
#include "hurricane/viewer/HierarchyCommand.h" #include "hurricane/viewer/HierarchyCommand.h"
#include "hurricane/viewer/CellWidget.h" #include "hurricane/viewer/CellWidget.h"
@ -105,6 +106,7 @@ namespace Hurricane {
QAction* _fitToContentsAction; QAction* _fitToContentsAction;
QAction* _showSelectionAction; QAction* _showSelectionAction;
QAction* _rubberChangeAction; QAction* _rubberChangeAction;
QAction* _clearRulersAction;
QAction* _controllerAction; QAction* _controllerAction;
QMenu* _fileMenu; QMenu* _fileMenu;
QMenu* _viewMenu; QMenu* _viewMenu;
@ -117,6 +119,7 @@ namespace Hurricane {
CellWidget* _cellWidget; CellWidget* _cellWidget;
MoveCommand _moveCommand; MoveCommand _moveCommand;
ZoomCommand _zoomCommand; ZoomCommand _zoomCommand;
RulerCommand _rulerCommand;
SelectCommand _selectCommand; SelectCommand _selectCommand;
HierarchyCommand _hierarchyCommand; HierarchyCommand _hierarchyCommand;
list< shared_ptr<CellWidget::State> > list< shared_ptr<CellWidget::State> >

View File

@ -60,6 +60,7 @@ class QAction;
#include "hurricane/viewer/CellWidgets.h" #include "hurricane/viewer/CellWidgets.h"
#include "hurricane/viewer/Selector.h" #include "hurricane/viewer/Selector.h"
#include "hurricane/viewer/SelectorCriterion.h" #include "hurricane/viewer/SelectorCriterion.h"
#include "hurricane/viewer/Ruler.h"
@ -92,6 +93,10 @@ namespace Hurricane {
}; };
// -------------------------------------------------------------------
// Class : "Hurricane::CellWidget".
class CellWidget : public QWidget { class CellWidget : public QWidget {
Q_OBJECT; Q_OBJECT;
@ -123,6 +128,7 @@ namespace Hurricane {
inline Occurrences getOccurrencesUnder ( const QRect& ) const; inline Occurrences getOccurrencesUnder ( const QRect& ) const;
Occurrences getOccurrencesUnder ( const Box& ) const; Occurrences getOccurrencesUnder ( const Box& ) const;
inline SelectorSet& getSelectorSet (); inline SelectorSet& getSelectorSet ();
inline RulerSet& getRulerSet ();
inline RubberShape getRubberShape () const; inline RubberShape getRubberShape () const;
inline int getStartLevel () const; inline int getStartLevel () const;
inline int getStopLevel () const; inline int getStopLevel () const;
@ -163,9 +169,12 @@ namespace Hurricane {
void drawBox ( const Box& ); void drawBox ( const Box& );
void drawLine ( DbU::Unit, DbU::Unit, DbU::Unit, DbU::Unit, bool mode=true ); void drawLine ( DbU::Unit, DbU::Unit, DbU::Unit, DbU::Unit, bool mode=true );
void drawLine ( const Point&, const Point&, bool mode=true ); void drawLine ( const Point&, const Point&, bool mode=true );
void drawText ( const Point&, const Name&, int angle=0, bool reverse=false ); void drawText ( const Point&, const char*, bool bold=false, int angle=0, bool reverse=false );
void drawGrid ( QRect ); void drawGrid ( QRect );
void drawSpot (); void drawSpot ();
void drawRuler ( shared_ptr<Ruler> );
void drawRulers ( QRect );
void drawDisplayText ( const QPoint&, const char*, bool bold=false, int angle=0, bool reverse=false );
void drawScreenLine ( const QPoint&, const QPoint&, size_t plane=PlaneId::Working, bool mode=true ); void drawScreenLine ( const QPoint&, const QPoint&, size_t plane=PlaneId::Working, bool mode=true );
void drawScreenRect ( const QPoint&, const QPoint&, size_t plane=PlaneId::Working ); void drawScreenRect ( const QPoint&, const QPoint&, size_t plane=PlaneId::Working );
void drawScreenRect ( const QRect& , size_t plane=PlaneId::Working ); void drawScreenRect ( const QRect& , size_t plane=PlaneId::Working );
@ -190,6 +199,7 @@ namespace Hurricane {
inline DbU::Unit screenToDbuY ( int y ) const; inline DbU::Unit screenToDbuY ( int y ) const;
inline Point screenToDbuPoint ( const QPoint& point ) const; inline Point screenToDbuPoint ( const QPoint& point ) const;
inline Box screenToDbuBox ( const QRect& rect ) const; inline Box screenToDbuBox ( const QRect& rect ) const;
inline Box& pixelInflate ( Box&, int pixels ) const;
inline Point getTopLeft () const; inline Point getTopLeft () const;
Box computeVisibleArea ( float scale ) const; Box computeVisibleArea ( float scale ) const;
Box computeVisibleArea ( float scale, const Point& topLeft ) const; Box computeVisibleArea ( float scale, const Point& topLeft ) const;
@ -197,6 +207,7 @@ namespace Hurricane {
inline bool _underDetailedGridThreshold() const; inline bool _underDetailedGridThreshold() const;
inline DbU::Unit _snapGridStep () const; inline DbU::Unit _snapGridStep () const;
inline DbU::Unit _onSnapGrid ( DbU::Unit ) const; inline DbU::Unit _onSnapGrid ( DbU::Unit ) const;
inline Point _onSnapGrid ( const Point& ) const;
// Qt QWidget Functions Overloads. // Qt QWidget Functions Overloads.
void pushCursor ( Qt::CursorShape cursor ); void pushCursor ( Qt::CursorShape cursor );
void popCursor (); void popCursor ();
@ -245,6 +256,9 @@ namespace Hurricane {
void _unselect ( const Net* ); void _unselect ( const Net* );
void _selectOccurrencesUnder ( Box selectArea ); void _selectOccurrencesUnder ( Box selectArea );
void _unselectAll (); void _unselectAll ();
inline void addRuler ( const Point&, const Point& );
inline void addRuler ( shared_ptr<Ruler> );
inline void clearRulers ();
void changeQueryFilter (); void changeQueryFilter ();
void rubberChange (); void rubberChange ();
void changeLayoutMode (); void changeLayoutMode ();
@ -352,37 +366,40 @@ namespace Hurricane {
private: private:
class DrawingPlanes { class DrawingPlanes {
public: public:
DrawingPlanes ( const QSize& size, CellWidget* cw ); DrawingPlanes ( const QSize& size, CellWidget* cw );
~DrawingPlanes (); ~DrawingPlanes ();
inline bool getLineMode () const; inline bool getLineMode () const;
inline int width () const; inline size_t getWorkingPlane () const;
inline int height () const; inline void pushWorkingPlane ();
inline QSize size () const; inline void popWorkingPlane ();
inline void select ( size_t i ); inline int width () const;
inline QPainter& painter ( size_t i=PlaneId::Working ); inline int height () const;
inline void painterBegin ( size_t i=PlaneId::Working ); inline QSize size () const;
inline void paintersBegin (); inline void select ( size_t i );
inline void painterEnd ( size_t i=PlaneId::Working ); inline QPainter& painter ( size_t i=PlaneId::Working );
inline void paintersEnd (); inline void begin ( size_t i=PlaneId::Working );
void setLineMode ( bool mode ); inline void end ( size_t i=PlaneId::Working );
void setPen ( const QPen& pen ); inline void buffersBegin ();
void setBrush ( const QBrush& brush ); inline void buffersEnd ();
void setBackground ( const QBrush& brush ); void setLineMode ( bool mode );
void setBackgroundMode ( Qt::BGMode mode ); void setPen ( const QPen& pen );
void resize ( const QSize& size ); void setBrush ( const QBrush& brush );
void shiftLeft ( int dx ); void setBackground ( const QBrush& brush );
void shiftRight ( int dx ); void setBackgroundMode ( Qt::BGMode mode );
void shiftUp ( int dy ); void resize ( const QSize& size );
void shiftDown ( int dy ); void shiftLeft ( int dx );
inline void copyToSelect (); void shiftRight ( int dx );
inline void copyToSelect ( const QRect& ); void shiftUp ( int dy );
void copyToSelect ( int sx, int sy, int h, int w ); void shiftDown ( int dy );
inline void copyToScreen (); inline void copyToSelect ();
void copyToScreen ( int sx, int sy, int h, int w ); inline void copyToSelect ( const QRect& );
inline void copyToPrinter ( QPrinter*, bool imageOnly ); void copyToSelect ( int sx, int sy, int h, int w );
void copyToPrinter ( int sx, int sy, int h, int w, QPrinter*, bool imageOnly ); inline void copyToScreen ();
inline void copyToImage ( QImage* ); void copyToScreen ( int sx, int sy, int h, int w );
void copyToImage ( int sx, int sy, int h, int w, QImage* ); inline void copyToPrinter ( QPrinter*, bool imageOnly );
void copyToPrinter ( int sx, int sy, int h, int w, QPrinter*, bool imageOnly );
inline void copyToImage ( QImage* );
void copyToImage ( int sx, int sy, int h, int w, QImage* );
private: private:
CellWidget* _cellWidget; CellWidget* _cellWidget;
QPrinter* _printer; QPrinter* _printer;
@ -392,6 +409,7 @@ namespace Hurricane {
QPen _normalPen; QPen _normalPen;
QPen _linePen; QPen _linePen;
size_t _workingPlane; size_t _workingPlane;
size_t _pushWorkingPlane;
bool _lineMode; bool _lineMode;
private: private:
DrawingPlanes ( const DrawingPlanes& ); DrawingPlanes ( const DrawingPlanes& );
@ -514,6 +532,7 @@ namespace Hurricane {
inline Cell* getCell () const; inline Cell* getCell () const;
const Name& getName () const; const Name& getName () const;
inline SelectorCriterions& getSelection (); inline SelectorCriterions& getSelection ();
inline RulerSet& getRulers ();
inline bool realMode () const; inline bool realMode () const;
inline bool symbolicMode () const; inline bool symbolicMode () const;
inline bool showBoundaries () const; inline bool showBoundaries () const;
@ -541,6 +560,7 @@ namespace Hurricane {
Cell* _cell; Cell* _cell;
CellWidget* _cellWidget; CellWidget* _cellWidget;
SelectorCriterions _selection; SelectorCriterions _selection;
RulerSet _rulers;
bool _symbolicMode; bool _symbolicMode;
bool _showBoundaries; bool _showBoundaries;
bool _showSelection; bool _showSelection;
@ -708,6 +728,18 @@ namespace Hurricane {
{ return _lineMode; } { return _lineMode; }
inline size_t CellWidget::DrawingPlanes::getWorkingPlane () const
{ return _workingPlane; }
inline void CellWidget::DrawingPlanes::pushWorkingPlane ()
{ _pushWorkingPlane = _workingPlane; }
inline void CellWidget::DrawingPlanes::popWorkingPlane ()
{ _workingPlane = _pushWorkingPlane; }
inline int CellWidget::DrawingPlanes::width () const inline int CellWidget::DrawingPlanes::width () const
{ return _planes[PlaneId::Normal]->width(); } { return _planes[PlaneId::Normal]->width(); }
@ -725,37 +757,39 @@ namespace Hurricane {
inline QPainter& CellWidget::DrawingPlanes::painter ( size_t i ) inline QPainter& CellWidget::DrawingPlanes::painter ( size_t i )
{ return _painters[(i>=PlaneId::Working)?_workingPlane:i]; } { return _painters[ (i>=PlaneId::Working) ? _workingPlane : i ]; }
inline void CellWidget::DrawingPlanes::painterBegin ( size_t i ) inline void CellWidget::DrawingPlanes::begin ( size_t i )
{ {
switch ( i ) { size_t wp = (i>=PlaneId::Working) ? _workingPlane : i;
case PlaneId::Working: i = _workingPlane; switch ( wp ) {
case PlaneId::Normal: case PlaneId::Normal:
case PlaneId::Selection: _painters[i].begin ( _planes[i] ); break; case PlaneId::Selection: _painters[wp].begin ( _planes[wp] ); break;
case PlaneId::Widget: _painters[2].begin ( _cellWidget ); break; case PlaneId::Widget: _painters[ 2].begin ( _cellWidget ); break;
case PlaneId::Printer: _painters[3].begin ( _printer ); break; case PlaneId::Printer: _painters[ 3].begin ( _printer ); break;
case PlaneId::Image: _painters[4].begin ( _image ); break; case PlaneId::Image: _painters[ 4].begin ( _image ); break;
default:
cerr << "[BUG] Bad plane selection." << endl;
} }
} }
inline void CellWidget::DrawingPlanes::paintersBegin () inline void CellWidget::DrawingPlanes::end ( size_t i )
{
painterBegin ( PlaneId::Normal );
painterBegin ( PlaneId::Selection );
}
inline void CellWidget::DrawingPlanes::painterEnd ( size_t i )
{ _painters[(i>=PlaneId::Working)?_workingPlane:i].end (); } { _painters[(i>=PlaneId::Working)?_workingPlane:i].end (); }
inline void CellWidget::DrawingPlanes::paintersEnd () inline void CellWidget::DrawingPlanes::buffersBegin ()
{ {
painterEnd ( PlaneId::Normal ); begin ( PlaneId::Normal );
painterEnd ( PlaneId::Selection ); begin ( PlaneId::Selection );
}
inline void CellWidget::DrawingPlanes::buffersEnd ()
{
end ( PlaneId::Normal );
end ( PlaneId::Selection );
} }
@ -811,6 +845,7 @@ namespace Hurricane {
: _cell (cell) : _cell (cell)
, _cellWidget (NULL) , _cellWidget (NULL)
, _selection () , _selection ()
, _rulers ()
, _symbolicMode (true) , _symbolicMode (true)
, _showBoundaries (true) , _showBoundaries (true)
, _showSelection (false) , _showSelection (false)
@ -901,11 +936,15 @@ namespace Hurricane {
{ return _selection; } { return _selection; }
inline bool CellWidget::State::showBoundaries () const inline RulerSet& CellWidget::State::getRulers ()
{ return _rulers; }
inline bool CellWidget::State::showBoundaries () const
{ return _showBoundaries; } { return _showBoundaries; }
inline bool CellWidget::State::showSelection () const inline bool CellWidget::State::showSelection () const
{ return _showSelection; } { return _showSelection; }
@ -1009,6 +1048,24 @@ namespace Hurricane {
{ return _offsetVA; } { return _offsetVA; }
inline void CellWidget::addRuler ( const Point& origin, const Point& extremity )
{
_state->getRulers().insert ( shared_ptr<Ruler>( new Ruler(origin,extremity) ) );
refresh ();
}
inline void CellWidget::addRuler ( shared_ptr<Ruler> ruler )
{
_state->getRulers().insert ( ruler );
refresh ();
}
inline void CellWidget::clearRulers ()
{ _state->getRulers().clear (); refresh(); }
inline void CellWidget::refresh () inline void CellWidget::refresh ()
{ _redrawManager.refresh(); } { _redrawManager.refresh(); }
@ -1093,6 +1150,10 @@ namespace Hurricane {
} }
inline Box& CellWidget::pixelInflate ( Box& box, int pixels ) const
{ return box.inflate(displayToDbuLength(pixels)); }
inline Point CellWidget::getTopLeft () const inline Point CellWidget::getTopLeft () const
{ return Point(_visibleArea.getXMin(),_visibleArea.getYMax()); } { return Point(_visibleArea.getXMin(),_visibleArea.getYMax()); }
@ -1144,9 +1205,7 @@ namespace Hurricane {
inline void CellWidget::updateMousePosition () inline void CellWidget::updateMousePosition ()
{ {
Point mousePoint = screenToDbuPoint ( _mousePosition ); Point mousePoint = screenToDbuPoint ( _mousePosition );
emit mousePositionChanged ( Point ( _onSnapGrid(mousePoint.getX()) emit mousePositionChanged ( _onSnapGrid(mousePoint) );
, _onSnapGrid(mousePoint.getY())
) );
} }
@ -1200,6 +1259,10 @@ namespace Hurricane {
{ return symbolicMode() ? DbU::getOnSymbolicSnapGrid(u) : DbU::getOnRealSnapGrid(u); } { return symbolicMode() ? DbU::getOnSymbolicSnapGrid(u) : DbU::getOnRealSnapGrid(u); }
inline Point CellWidget::_onSnapGrid ( const Point& p ) const
{ return Point(_onSnapGrid(p.getX()),_onSnapGrid(p.getY())); }
} // End of Hurricane namespace. } // End of Hurricane namespace.

View File

@ -57,7 +57,7 @@ namespace Hurricane {
virtual bool mouseReleaseEvent ( CellWidget*, QMouseEvent* ); virtual bool mouseReleaseEvent ( CellWidget*, QMouseEvent* );
virtual void draw ( CellWidget* ); virtual void draw ( CellWidget* );
inline set<CellWidget*>& getCellWidgets (); inline set<CellWidget*>& getCellWidgets ();
protected: private:
set<CellWidget*> _cellWidgets; set<CellWidget*> _cellWidgets;
bool _active; bool _active;
private: private:

View File

@ -153,6 +153,7 @@ namespace Hurricane {
static const Name Grid; static const Name Grid;
static const Name Spot; static const Name Spot;
static const Name Ghost; static const Name Ghost;
static const Name TextRuler;
static const Name TextCell; static const Name TextCell;
static const Name TextInstance; static const Name TextInstance;
static const Name Undef; static const Name Undef;

View File

@ -43,8 +43,7 @@ namespace Hurricane {
virtual bool mouseMoveEvent ( CellWidget*, QMouseEvent* ); virtual bool mouseMoveEvent ( CellWidget*, QMouseEvent* );
virtual bool mousePressEvent ( CellWidget*, QMouseEvent* ); virtual bool mousePressEvent ( CellWidget*, QMouseEvent* );
virtual bool mouseReleaseEvent ( CellWidget*, QMouseEvent* ); virtual bool mouseReleaseEvent ( CellWidget*, QMouseEvent* );
protected: private:
bool _active;
bool _firstEvent; bool _firstEvent;
QPoint _lastPosition; QPoint _lastPosition;
private: private:

View File

@ -0,0 +1,71 @@
// -*- C++ -*-
//
// This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved
//
// ===================================================================
//
// $Id$
//
// x-----------------------------------------------------------------x
// | |
// | C O R I O L I S |
// | V L S I B a c k e n d D a t a - B a s e |
// | |
// | Author : Jean-Paul CHAPUT |
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
// | =============================================================== |
// | C++ Header : "./Ruler.h" |
// | *************************************************************** |
// | U p d a t e s |
// | |
// x-----------------------------------------------------------------x
#ifndef __HURRICANE_RULER__
#define __HURRICANE_RULER__
#include <tr1/memory>
#include <set>
#include "hurricane/Point.h"
#include "hurricane/Box.h"
namespace Hurricane {
// -------------------------------------------------------------------
// Class : "Hurricane::Ruler".
class Ruler {
public:
Ruler ( const Point& origin );
Ruler ( const Point& origin, const Point& extremity );
inline const Point& getOrigin () const;
inline const Point& getExtremity () const;
inline Point getAngle () const;
inline Box getBoundingBox () const;
inline void setExtremity ( const Point& );
bool intersect ( const Box& ) const;
private:
Point _origin;
Point _extremity;
};
// Inline Functions.
inline const Point& Ruler::getOrigin () const { return _origin; }
inline const Point& Ruler::getExtremity () const { return _extremity; }
inline Point Ruler::getAngle () const { return Point(_extremity.getX(),_origin.getY()); }
inline Box Ruler::getBoundingBox () const { return Box(_origin,_extremity); }
inline void Ruler::setExtremity ( const Point& extremity ) { _extremity = extremity; }
typedef std::set< std::tr1::shared_ptr<Ruler> > RulerSet;
} // End of Hurricane namespace.
#endif // __HURRICANE_RULER__

View File

@ -0,0 +1,60 @@
// -*- C++ -*-
//
// This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved
//
// ===================================================================
//
// $Id$
//
// x-----------------------------------------------------------------x
// | |
// | H U R R I C A N E |
// | V L S I B a c k e n d D a t a - B a s e |
// | |
// | Author : Jean-Paul CHAPUT |
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
// | =============================================================== |
// | C++ Header : "./RulerCommand.h" |
// | *************************************************************** |
// | U p d a t e s |
// | |
// x-----------------------------------------------------------------x
#ifndef __HURRICANE_RULER_COMMAND__
#define __HURRICANE_RULER_COMMAND__
#include <QPoint>
#include "hurricane/viewer/Command.h"
#include "hurricane/viewer/Ruler.h"
namespace Hurricane {
class RulerCommand : public Command {
public:
RulerCommand ();
virtual ~RulerCommand ();
virtual bool keyPressEvent ( CellWidget*, QKeyEvent* );
virtual bool keyReleaseEvent ( CellWidget*, QKeyEvent* );
virtual bool mouseMoveEvent ( CellWidget*, QMouseEvent* );
virtual bool mousePressEvent ( CellWidget*, QMouseEvent* );
virtual bool mouseReleaseEvent ( CellWidget*, QMouseEvent* );
virtual void draw ( CellWidget* );
protected:
bool _active;
std::tr1::shared_ptr<Ruler> _ruler;
private:
RulerCommand ( const RulerCommand& );
RulerCommand& operator= ( const RulerCommand& );
};
}
#endif