* ./hurricane/src/hviewer :

- API : in CellWidget & CellViewer constructors now only takes the
       parent QWidget.
   - Renaming coordinates translation functions for more clarity.
   - Adding a StatusBar showing mouse coordinates.
This commit is contained in:
Jean-Paul Chaput 2008-07-02 13:31:50 +00:00
parent 51a72fc639
commit 3c7d1b2e62
13 changed files with 386 additions and 243 deletions

View File

@ -1 +1,2 @@
add_subdirectory(hurricane) add_subdirectory(hurricane)
add_subdirectory(hviewer)

View File

@ -258,7 +258,7 @@ Segments segments = netgetComponents()->getSubSet<Segment*>(IsOnLayer(metal));
*/ */
// \{ // \{
/*! \function bool Collection::isEmpty() const; /* \function bool Collection::isEmpty() const;
* This function returns \true if the collection designates no * This function returns \true if the collection designates no
* element and else \false. * element and else \false.
*/ */

View File

@ -207,7 +207,7 @@
* getValueString(). Avalaibles modes are : * getValueString(). Avalaibles modes are :
*/ */
/*! \function string DbU::getValueString(Unit unit); /*! \function string DbU::getValueString(Unit unit, int mode=SmartTruncate);
* \return A character string representing the external value of * \return A character string representing the external value of
* \c \<unit\>. The value is converted in the length according * \c \<unit\>. The value is converted in the length according
* to setStringMode(): database, grid or symbolic. * to setStringMode(): database, grid or symbolic.

View File

@ -214,34 +214,30 @@ namespace Hurricane {
// } // }
string DbU::getValueString ( DbU::Unit u ) string DbU::getValueString ( DbU::Unit u, int mode )
{ {
char buffer[1024]; char buffer[1024];
char unitSymbol = 'u'; char unitSymbol = 'u';
if ( _stringMode == Grid ) { if ( _stringMode == Grid ) {
if ( u == 0 ) return "0g";
unitSymbol = 'g'; unitSymbol = 'g';
snprintf ( buffer, 1024, "%.1f", getGrid(u) ); snprintf ( buffer, 1024, "%.1f", getGrid(u) );
} else if ( _stringMode == Symbolic ) { } else if ( _stringMode == Symbolic ) {
if ( u == 0 ) return "0l";
unitSymbol = 'l'; unitSymbol = 'l';
snprintf ( buffer, 1024, "%.1f", getLambda(u) ); snprintf ( buffer, 1024, "%.1f", getLambda(u) );
} else { } else {
if ( _stringMode != Db ) if ( _stringMode != Db )
cerr << "[ERROR] Unknown Unit representation mode: " << _stringMode << endl; cerr << "[ERROR] Unknown Unit representation mode: " << _stringMode << endl;
if ( u == 0 ) return "0u";
snprintf ( buffer, 1024, "%ld", u ); snprintf ( buffer, 1024, "%ld", u );
} }
size_t length = strlen(buffer) - 1; size_t length = strlen(buffer) - 1;
for ( ; length > 0 ; length-- ) { if ( mode & SmartTruncate ) {
if ( (buffer[length] != '0') && (buffer[length] != '.') ) for ( ; length > 0 ; length-- ) {
break; if ( buffer[length] == '.' ) { length--; break; }
if ( buffer[length] != '0' ) break;
}
} }
buffer[++length] = unitSymbol; buffer[++length] = unitSymbol;
buffer[++length] = '\0'; buffer[++length] = '\0';

View File

@ -48,9 +48,10 @@ namespace Hurricane {
public: public:
typedef long Unit; typedef long Unit;
public: public:
enum StringMode { Db = 1 enum StringMode { Db = 1
, Grid = 2 , Grid = 2
, Symbolic = 4 , Symbolic = 4
, SmartTruncate = 8
}; };
public: public:
@ -80,7 +81,7 @@ namespace Hurricane {
static inline long getDb ( Unit u ); static inline long getDb ( Unit u );
static inline double getGrid ( Unit u ); static inline double getGrid ( Unit u );
static inline double getLambda ( Unit u ); static inline double getLambda ( Unit u );
static string getValueString ( Unit u ); static string getValueString ( Unit u, int mode=SmartTruncate );
static Record* getValueRecord ( const Unit* u ); static Record* getValueRecord ( const Unit* u );
static Slot* getValueSlot ( const string& name, const Unit* u ); static Slot* getValueSlot ( const string& name, const Unit* u );
static inline void setStringMode ( unsigned int mode ); static inline void setStringMode ( unsigned int mode );

View File

@ -9,6 +9,7 @@
hurricane/viewer/GroupPaletteEntry.h hurricane/viewer/GroupPaletteEntry.h
hurricane/viewer/ViewerPaletteEntry.h hurricane/viewer/ViewerPaletteEntry.h
hurricane/viewer/Palette.h hurricane/viewer/Palette.h
hurricane/viewer/DynamicLabel.h
hurricane/viewer/CellWidget.h hurricane/viewer/CellWidget.h
hurricane/viewer/CellViewer.h hurricane/viewer/CellViewer.h
hurricane/viewer/RecordModel.h hurricane/viewer/RecordModel.h
@ -30,6 +31,7 @@
GroupPaletteEntry.cpp GroupPaletteEntry.cpp
ViewerPaletteEntry.cpp ViewerPaletteEntry.cpp
Palette.cpp Palette.cpp
DynamicLabel.cpp
CellWidget.cpp CellWidget.cpp
CellViewer.cpp CellViewer.cpp
RecordModel.cpp RecordModel.cpp

View File

@ -21,27 +21,26 @@
namespace Hurricane { namespace Hurricane {
CellViewer::CellViewer ( Cell* cell ) : QMainWindow() CellViewer::CellViewer ( QWidget* parent ) : QMainWindow(parent)
, _openAction(NULL) , _openAction(NULL)
, _nextCellAction(NULL) , _nextCellAction(NULL)
, _previousCellAction(NULL) , _previousCellAction(NULL)
, _nextAction(NULL) , _nextAction(NULL)
, _saveAction(NULL) , _saveAction(NULL)
, _exitAction(NULL) , _exitAction(NULL)
, _refreshAction(NULL) , _refreshAction(NULL)
, _fitToContentsAction(NULL) , _fitToContentsAction(NULL)
, _showBoundariesAction(NULL) , _runInspectorOnDataBase(NULL)
, _runInspectorOnDataBase(NULL) , _runInspectorOnCell(NULL)
, _runInspectorOnCell(NULL) , _fileMenu(NULL)
, _fileMenu(NULL) , _viewMenu(NULL)
, _viewMenu(NULL) , _toolsMenu(NULL)
, _toolsMenu(NULL) //, _mapView(NULL)
//, _mapView(NULL) , _palette(NULL)
, _palette(NULL) , _cellWidget(NULL)
, _cellWidget(NULL)
{ {
createMenus (); createMenus ();
createLayout ( cell ); createLayout ();
} }
@ -81,10 +80,6 @@ namespace Hurricane {
_fitToContentsAction->setStatusTip ( tr("Adjust zoom to fit the whole cell's contents") ); _fitToContentsAction->setStatusTip ( tr("Adjust zoom to fit the whole cell's contents") );
_fitToContentsAction->setShortcut ( Qt::Key_F ); _fitToContentsAction->setShortcut ( Qt::Key_F );
_showBoundariesAction = new QAction ( tr("&Boundaries"), this );
_showBoundariesAction->setCheckable ( true );
_showBoundariesAction->setStatusTip ( tr("Show/hide cell & instances abutment boxes") );
_runInspectorOnDataBase= new QAction ( tr("Inspect &DataBase"), this ); _runInspectorOnDataBase= new QAction ( tr("Inspect &DataBase"), this );
_runInspectorOnDataBase->setStatusTip ( tr("Run Inspector on Hurricane DataBase") ); _runInspectorOnDataBase->setStatusTip ( tr("Run Inspector on Hurricane DataBase") );
@ -110,7 +105,6 @@ namespace Hurricane {
_viewMenu = menuBar()->addMenu ( tr("View") ); _viewMenu = menuBar()->addMenu ( tr("View") );
_viewMenu->addAction ( _refreshAction ); _viewMenu->addAction ( _refreshAction );
_viewMenu->addAction ( _fitToContentsAction ); _viewMenu->addAction ( _fitToContentsAction );
//_viewMenu->addAction ( _showBoundariesAction );
_toolsMenu = menuBar()->addMenu ( tr("Tool") ); _toolsMenu = menuBar()->addMenu ( tr("Tool") );
_toolsMenu->addAction ( _runInspectorOnDataBase ); _toolsMenu->addAction ( _runInspectorOnDataBase );
@ -119,14 +113,16 @@ namespace Hurricane {
void CellViewer::createLayout ( Cell* cell ) void CellViewer::createLayout ()
{ {
if ( _cellWidget ) return; if ( _cellWidget ) return;
_cellWidget = new CellWidget ( cell ); _cellWidget = new CellWidget ();
_palette = _cellWidget->getPalette(); _palette = _cellWidget->getPalette();
//_mapView = _cellWidget->getMapView (); //_mapView = _cellWidget->getMapView ();
setStatusBar ( _cellWidget->getStatusBar() );
setCorner ( Qt::TopLeftCorner , Qt::LeftDockWidgetArea ); setCorner ( Qt::TopLeftCorner , Qt::LeftDockWidgetArea );
setCorner ( Qt::BottomLeftCorner , Qt::LeftDockWidgetArea ); setCorner ( Qt::BottomLeftCorner , Qt::LeftDockWidgetArea );
setCorner ( Qt::TopRightCorner , Qt::RightDockWidgetArea ); setCorner ( Qt::TopRightCorner , Qt::RightDockWidgetArea );
@ -151,13 +147,16 @@ namespace Hurricane {
connect ( _runInspectorOnDataBase, SIGNAL(triggered()) , this , SLOT(runInspectorOnDataBase())); connect ( _runInspectorOnDataBase, SIGNAL(triggered()) , this , SLOT(runInspectorOnDataBase()));
connect ( _runInspectorOnCell , SIGNAL(triggered()) , this , SLOT(runInspectorOnCell ())); connect ( _runInspectorOnCell , SIGNAL(triggered()) , this , SLOT(runInspectorOnCell ()));
//_showBoundariesAction->setChecked ( _cellWidget->showBoundaries() );
//connect ( _showBoundariesAction, SIGNAL(toggled(bool)), _cellWidget, SLOT(setShowBoundaries(bool)) );
_cellWidget->redraw (); _cellWidget->redraw ();
} }
void CellViewer::setCell ( Cell* cell )
{
_cellWidget->setCell ( cell );
}
void CellViewer::runInspector ( Record* record ) void CellViewer::runInspector ( Record* record )
{ {
static HInspectorWidget* inspector = NULL; static HInspectorWidget* inspector = NULL;
@ -181,7 +180,8 @@ namespace Hurricane {
void CellViewer::runInspectorOnCell () void CellViewer::runInspectorOnCell ()
{ {
runInspector ( getRecord(_cellWidget->getCell()) ); Cell* cell = _cellWidget->getCell();
if ( cell ) runInspector ( getRecord(cell) );
} }

View File

@ -8,6 +8,8 @@
# include <QPainter> # include <QPainter>
# include <QStylePainter> # include <QStylePainter>
# include <QBitmap> # include <QBitmap>
# include <QLabel>
# include <QStatusBar>
# include "hurricane/DataBase.h" # include "hurricane/DataBase.h"
# include "hurricane/Technology.h" # include "hurricane/Technology.h"
@ -22,6 +24,7 @@
# include "hurricane/viewer/Graphics.h" # include "hurricane/viewer/Graphics.h"
# include "hurricane/viewer/PaletteEntry.h" # include "hurricane/viewer/PaletteEntry.h"
# include "hurricane/viewer/Palette.h" # include "hurricane/viewer/Palette.h"
# include "hurricane/viewer/DynamicLabel.h"
// # include "MapView.h" // # include "MapView.h"
# include "hurricane/viewer/CellWidget.h" # include "hurricane/viewer/CellWidget.h"
@ -36,35 +39,50 @@ const int CellWidget::_stripWidth = 100;
CellWidget::CellWidget ( Cell* cell ) : QWidget() CellWidget::CellWidget ( QWidget* parent ) : QWidget(parent)
, _palette(NULL) , _statusBar(NULL)
, _displayArea(0,0,6*_stripWidth,6*_stripWidth) , _palette(NULL)
, _visibleArea(_stripWidth,_stripWidth,4*_stripWidth,4*_stripWidth) , _xPosition(NULL)
, _scale(1.0) , _yPosition(NULL)
, _offsetVA(_stripWidth,_stripWidth) , _displayArea(0,0,6*_stripWidth,6*_stripWidth)
, _drawingBuffer(6*_stripWidth,6*_stripWidth) , _visibleArea(_stripWidth,_stripWidth,4*_stripWidth,4*_stripWidth)
, _painter() , _scale(1.0)
, _lastMousePosition(0,0) , _offsetVA(_stripWidth,_stripWidth)
, _cell(cell) , _drawingBuffer(6*_stripWidth,6*_stripWidth)
, _mouseGo(false) , _painter()
, _openCell(true) , _lastMousePosition(0,0)
, _showBoundaries(true) , _cell(NULL)
, _redrawRectCount(0) , _mouseGo(false)
, _showBoundaries(true)
, _redrawRectCount(0)
{ {
//setBackgroundRole ( QPalette::Dark ); //setBackgroundRole ( QPalette::Dark );
//setAutoFillBackground ( false ); //setAutoFillBackground ( false );
setAttribute ( Qt::WA_OpaquePaintEvent ); setAttribute ( Qt::WA_OpaquePaintEvent );
//setAttribute ( Qt::WA_NoSystemBackground ); //setAttribute ( Qt::WA_NoSystemBackground );
//setAttribute ( Qt::WA_PaintOnScreen ); //setAttribute ( Qt::WA_PaintOnScreen );
//setAttribute ( Qt::WA_StaticContents ); //setAttribute ( Qt::WA_StaticContents );
setSizePolicy ( QSizePolicy::Expanding, QSizePolicy::Expanding ); setSizePolicy ( QSizePolicy::Expanding, QSizePolicy::Expanding );
setFocusPolicy ( Qt::StrongFocus ); setFocusPolicy ( Qt::StrongFocus );
setMouseTracking ( true );
_statusBar = new QStatusBar ( this );
_xPosition = new DynamicLabel ();
_xPosition->setStaticText ( "X:" );
_xPosition->setDynamicText ( "0l" );
_yPosition = new DynamicLabel ();
_yPosition->setStaticText ( "Y:" );
_yPosition->setDynamicText ( "0l" );
_statusBar->addPermanentWidget ( _xPosition );
_statusBar->addPermanentWidget ( _yPosition );
//_mapView = new MapView ( this ); //_mapView = new MapView ( this );
_palette = new Palette ( this ); _palette = new Palette ( this );
fitToContents (); fitToContents ();
_openCell = false;
} }
@ -110,20 +128,21 @@ void CellWidget::redraw ( QRect redrawArea )
_painter.setClipRect ( redrawArea ); _painter.setClipRect ( redrawArea );
_painter.eraseRect ( redrawArea ); _painter.eraseRect ( redrawArea );
Box redrawBox = getBox ( redrawArea ); if ( _cell ) {
Box redrawBox = displayToDbuBox ( redrawArea );
vector<PaletteEntry*>& paletteEntries = _palette->getEntries (); vector<PaletteEntry*>& paletteEntries = _palette->getEntries ();
for ( size_t i=0 ; i<paletteEntries.size() ; i++ ) { for ( size_t i=0 ; i<paletteEntries.size() ; i++ ) {
_painter.setPen ( Graphics::getPen (paletteEntries[i]->getName()) ); _painter.setPen ( Graphics::getPen (paletteEntries[i]->getName()) );
_painter.setBrush ( Graphics::getBrush(paletteEntries[i]->getName()) ); _painter.setBrush ( Graphics::getBrush(paletteEntries[i]->getName()) );
if ( paletteEntries[i]->isBasicLayer() && isDrawable(paletteEntries[i]) ) { if ( paletteEntries[i]->isBasicLayer() && isDrawable(paletteEntries[i]) ) {
drawCell ( _cell, paletteEntries[i]->getBasicLayer(), redrawBox, Transformation() ); drawCell ( _cell, paletteEntries[i]->getBasicLayer(), redrawBox, Transformation() );
} else if ( (paletteEntries[i]->getName() == DisplayStyle::Boundaries) } else if ( (paletteEntries[i]->getName() == DisplayStyle::Boundaries)
&& paletteEntries[i]->isChecked() ) { && paletteEntries[i]->isChecked() ) {
drawBoundaries ( _cell, redrawBox, Transformation() ); drawBoundaries ( _cell, redrawBox, Transformation() );
}
} }
} }
_painter.end (); _painter.end ();
@ -253,7 +272,7 @@ void CellWidget::drawSegment ( const Segment* segment
, const Transformation& transformation , const Transformation& transformation
) )
{ {
if ( 1 < getScreenLength(segment->getWidth()) ) { if ( 1 < dbuToDisplayLength(segment->getWidth()) ) {
drawBox ( transformation.getBox(segment->getBoundingBox(basicLayer)) ); drawBox ( transformation.getBox(segment->getBoundingBox(basicLayer)) );
} else { } else {
drawLine ( transformation.getPoint(segment->getSourcePosition()), drawLine ( transformation.getPoint(segment->getSourcePosition()),
@ -284,13 +303,13 @@ void CellWidget::drawPad ( const Pad* pad
void CellWidget::drawBox ( const Box& box ) void CellWidget::drawBox ( const Box& box )
{ {
_redrawRectCount++; _redrawRectCount++;
_painter.drawRect ( getScreenRect(box) ); _painter.drawRect ( dbuToDisplayRect(box) );
} }
void CellWidget::drawLine ( const Point& p1, const Point& p2 ) void CellWidget::drawLine ( const Point& p1, const Point& p2 )
{ {
_painter.drawLine ( getScreenPoint(p1), getScreenPoint(p2) ); _painter.drawLine ( dbuToDisplayPoint(p1), dbuToDisplayPoint(p2) );
} }
@ -411,7 +430,7 @@ void CellWidget::reframe ( const Box& box )
void CellWidget::fitToContents () void CellWidget::fitToContents ()
{ {
reframe ( _cell->getBoundingBox() ); if ( _cell ) reframe ( _cell->getBoundingBox() );
} }
@ -596,8 +615,6 @@ void CellWidget::keyPressEvent ( QKeyEvent* event )
void CellWidget::mouseMoveEvent ( QMouseEvent* event ) void CellWidget::mouseMoveEvent ( QMouseEvent* event )
{ {
//cerr << "CellWidget::mouseMoveEvent()" << endl;
if ( _mouseGo ) { if ( _mouseGo ) {
int dx = event->x() - _lastMousePosition.x(); int dx = event->x() - _lastMousePosition.x();
dx <<= 1; dx <<= 1;
@ -612,6 +629,10 @@ void CellWidget::mouseMoveEvent ( QMouseEvent* event )
if ( dy < 0 ) goDown ( -dy ); if ( dy < 0 ) goDown ( -dy );
_lastMousePosition = event->pos(); _lastMousePosition = event->pos();
} else {
//cerr << "x:" << event->x() << " y:" << event->y() << endl;
_xPosition->setDynamicText ( screenToDbuX(event->x()) );
_yPosition->setDynamicText ( screenToDbuY(event->y()) );
} }
} }
@ -635,35 +656,35 @@ void CellWidget::mouseReleaseEvent ( QMouseEvent* event )
} }
QPoint CellWidget::getScreenPoint ( DbU::Unit x, DbU::Unit y ) const QPoint CellWidget::dbuToDisplayPoint ( DbU::Unit x, DbU::Unit y ) const
{ {
return QPoint ( getScreenX(x), getScreenY(y) ); return QPoint ( dbuToDisplayX(x), dbuToDisplayY(y) );
} }
QPoint CellWidget::getScreenPoint ( const Point& point ) const QPoint CellWidget::dbuToDisplayPoint ( const Point& point ) const
{ {
return getScreenPoint ( point.getX(), point.getY() ); return dbuToDisplayPoint ( point.getX(), point.getY() );
} }
QRect CellWidget::getScreenRect ( DbU::Unit x1, DbU::Unit y1, DbU::Unit x2, DbU::Unit y2 ) const QRect CellWidget::dbuToDisplayRect ( DbU::Unit x1, DbU::Unit y1, DbU::Unit x2, DbU::Unit y2 ) const
{ {
return QRect ( getScreenX(x1) return QRect ( dbuToDisplayX(x1)
, getScreenY(y2) , dbuToDisplayY(y2)
, getScreenX(x2) - getScreenX(x1) , dbuToDisplayX(x2) - dbuToDisplayX(x1)
, getScreenY(y1) - getScreenY(y2) , dbuToDisplayY(y1) - dbuToDisplayY(y2)
); );
} }
QRect CellWidget::getScreenRect ( const Box& box ) const QRect CellWidget::dbuToDisplayRect ( const Box& box ) const
{ {
return getScreenRect ( box.getXMin() return dbuToDisplayRect ( box.getXMin()
, box.getYMin() , box.getYMin()
, box.getXMax() , box.getXMax()
, box.getYMax() , box.getYMax()
); );
} }
@ -676,4 +697,11 @@ void CellWidget::setShowBoundaries ( bool state )
} }
void CellWidget::setCell ( Cell* cell )
{
_cell = cell;
fitToContents ();
}
} // End of Hurricane namespace. } // End of Hurricane namespace.

View File

@ -0,0 +1,77 @@
// -*- C++ -*-
# include <QFontMetrics>
# include <QFont>
# include <QLabel>
# include <QHBoxLayout>
# include "hurricane/viewer/Graphics.h"
# include "hurricane/viewer/DynamicLabel.h"
namespace Hurricane {
DynamicLabel::DynamicLabel ( QWidget* parent )
: QWidget(parent)
, _staticLabel(NULL)
, _dynamicLabel(NULL)
{
_staticLabel = new QLabel ();
_staticLabel->setText ( " V: " );
_staticLabel->setMinimumSize ( _staticLabel->sizeHint() );
_staticLabel->setAlignment ( Qt::AlignHCenter );
//_staticLabel->setFrameStyle (QFrame::Panel | QFrame::Raised );
QFont font = Graphics::getFixedFont(QFont::Bold);
int cwidth = QFontMetrics(font).width('X');
_dynamicLabel = new QLabel ();
_dynamicLabel->setText ( "vvv.vu" );
_dynamicLabel->setIndent ( cwidth/2 );
_dynamicLabel->setMinimumSize ( QSize(cwidth*10,QFontMetrics(font).height()) );
_dynamicLabel->setAlignment ( Qt::AlignRight );
_dynamicLabel->setFont ( font );
QHBoxLayout* layout = new QHBoxLayout ();
layout->addWidget ( _staticLabel );
layout->addWidget ( _dynamicLabel );
layout->setContentsMargins ( 0, 0, 0, 0 );
setLayout ( layout );
}
QString DynamicLabel::getStaticText () const
{
return _staticLabel->text ();
}
QString DynamicLabel::getDynamicText () const
{
return _dynamicLabel->text ();
}
void DynamicLabel::setStaticText ( const QString& text )
{
_staticLabel->setText ( text );
}
void DynamicLabel::setDynamicText ( const QString& text )
{
_dynamicLabel->setText ( text );
}
void DynamicLabel::setDynamicText ( DbU::Unit u )
{
_dynamicLabel->setText ( DbU::getValueString(u,0).c_str() );
}
} // End of Hurricane namespace.

View File

@ -5,6 +5,7 @@
# include <assert.h> # include <assert.h>
# include <Qt>
# include <QBrush> # include <QBrush>
# include <QPen> # include <QPen>
# include <QFont> # include <QFont>

View File

@ -32,7 +32,8 @@ namespace Hurricane {
Q_OBJECT; Q_OBJECT;
public: public:
CellViewer ( Cell* cell ); CellViewer ( QWidget* parent=NULL );
void setCell ( Cell* cell );
public slots: public slots:
void runInspectorOnDataBase (); void runInspectorOnDataBase ();
void runInspectorOnCell (); void runInspectorOnCell ();
@ -46,7 +47,6 @@ namespace Hurricane {
QAction* _exitAction; QAction* _exitAction;
QAction* _refreshAction; QAction* _refreshAction;
QAction* _fitToContentsAction; QAction* _fitToContentsAction;
QAction* _showBoundariesAction;
QAction* _runInspectorOnDataBase; QAction* _runInspectorOnDataBase;
QAction* _runInspectorOnCell; QAction* _runInspectorOnCell;
QMenu* _fileMenu; QMenu* _fileMenu;
@ -59,7 +59,7 @@ namespace Hurricane {
protected: protected:
void createActions (); void createActions ();
void createMenus (); void createMenus ();
void createLayout ( Cell* cell ); void createLayout ();
void runInspector ( Record* record ); void runInspector ( Record* record );
}; };

View File

@ -20,6 +20,7 @@ class QResizeEvent;
class QMouseEvent; class QMouseEvent;
class QKeyEvent; class QKeyEvent;
class QAction; class QAction;
class QStatusBar;
# include "hurricane/Commons.h" # include "hurricane/Commons.h"
@ -45,176 +46,164 @@ namespace Hurricane {
class PaletteEntry; class PaletteEntry;
class Palette; class Palette;
class DynamicLabel;
//class MapView; //class MapView;
class CellWidget : public QWidget { class CellWidget : public QWidget {
Q_OBJECT; Q_OBJECT;
// Attributes.
protected:
static const int _stripWidth;
vector<Qt::CursorShape> _cursors;
// MapView* _mapView;
Palette* _palette;
Box _displayArea;
Box _visibleArea;
float _scale;
QPoint _offsetVA;
QPixmap _drawingBuffer;
QPainter _painter;
QPoint _lastMousePosition;
Cell* _cell;
bool _mouseGo;
bool _openCell;
bool _showBoundaries;
size_t _redrawRectCount;
public: public:
CellWidget ( Cell* cell ); // Constructor & Destructor.
virtual ~CellWidget (); CellWidget ( QWidget* parent=NULL );
virtual ~CellWidget ();
public slots:
void redraw ( QRect redrawArea );
inline void redraw ();
void goLeft ( int dx = 0 );
void goRight ( int dx = 0 );
void goUp ( int dy = 0 );
void goDown ( int dy = 0 );
void fitToContents ();
void setScale ( float scale );
void setShowBoundaries ( bool state );
void reframe ( const Box& box );
void screenReframe ();
void shiftLeft ( int dx );
void shiftRight ( int dx );
void shiftUp ( int dy );
void shiftDown ( int dy );
// Qt QWidget Overloads.
public:
void pushCursor ( Qt::CursorShape cursor );
void popCursor ();
QSize minimumSizeHint () const;
void paintEvent ( QPaintEvent* );
void resizeEvent ( QResizeEvent* );
void keyPressEvent ( QKeyEvent* );
void mouseMoveEvent ( QMouseEvent* );
void mousePressEvent ( QMouseEvent* );
void mouseReleaseEvent ( QMouseEvent* );
// Geometric conversions.
public:
QRect getScreenRect ( DbU::Unit x1, DbU::Unit y1, DbU::Unit x2, DbU::Unit y2 ) const;
QRect getScreenRect ( const Box& box ) const;
QPoint getScreenPoint ( DbU::Unit x, DbU::Unit y ) const;
QPoint getScreenPoint ( const Point& point ) const;
inline int getScreenX ( DbU::Unit x ) const;
inline int getScreenY ( DbU::Unit y ) const;
inline int getScreenLength ( DbU::Unit length ) const;
inline DbU::Unit getX ( int x ) const;
inline DbU::Unit getY ( int y ) const;
inline DbU::Unit getLength ( int length ) const;
inline Box getBox ( const QRect& rect ) const;
// Painter control & Hurricane objects drawing primitives.
public:
void drawBoundaries ( const Cell* , const Box&, const Transformation& );
void drawBoundaries ( const Instance*, const Box&, const Transformation& );
bool isDrawable ( PaletteEntry* entry );
void drawCell ( const Cell* , const BasicLayer*, const Box&, const Transformation& );
void drawInstance ( const Instance*, const BasicLayer*, const Box&, const Transformation& );
void drawSlice ( const Slice* , const BasicLayer*, const Box&, const Transformation& );
void drawGo ( const Go* , const BasicLayer*, const Box&, const Transformation& );
void drawSegment ( const Segment* , const BasicLayer*, const Box&, const Transformation& );
void drawContact ( const Contact* , const BasicLayer*, const Box&, const Transformation& );
void drawPad ( const Pad* , const BasicLayer*, const Box&, const Transformation& );
void drawBox ( const Box& );
void drawLine ( const Point&, const Point& );
// Accessors. // Accessors.
public: // MapView* getMapView () { return _mapView; };
// MapView* getMapView () { return _mapView; }; void setCell ( Cell* cell );
inline Cell* getCell () const; inline Cell* getCell () const;
inline Palette* getPalette (); inline Palette* getPalette ();
inline bool showBoundaries () const; inline QStatusBar* getStatusBar ();
inline bool showBoundaries () const;
// Painter control & Hurricane objects drawing primitives.
void drawBoundaries ( const Cell* , const Box&, const Transformation& );
void drawBoundaries ( const Instance*, const Box&, const Transformation& );
bool isDrawable ( PaletteEntry* entry );
void drawCell ( const Cell* , const BasicLayer*, const Box&, const Transformation& );
void drawInstance ( const Instance*, const BasicLayer*, const Box&, const Transformation& );
void drawSlice ( const Slice* , const BasicLayer*, const Box&, const Transformation& );
void drawGo ( const Go* , const BasicLayer*, const Box&, const Transformation& );
void drawSegment ( const Segment* , const BasicLayer*, const Box&, const Transformation& );
void drawContact ( const Contact* , const BasicLayer*, const Box&, const Transformation& );
void drawPad ( const Pad* , const BasicLayer*, const Box&, const Transformation& );
void drawBox ( const Box& );
void drawLine ( const Point&, const Point& );
// Geometric conversions.
QRect dbuToDisplayRect ( DbU::Unit x1, DbU::Unit y1, DbU::Unit x2, DbU::Unit y2 ) const;
QRect dbuToDisplayRect ( const Box& box ) const;
QPoint dbuToDisplayPoint ( DbU::Unit x, DbU::Unit y ) const;
QPoint dbuToDisplayPoint ( const Point& point ) const;
inline int dbuToDisplayX ( DbU::Unit x ) const;
inline int dbuToDisplayY ( DbU::Unit y ) const;
inline int dbuToDisplayLength ( DbU::Unit length ) const;
inline DbU::Unit displayToDbuX ( int x ) const;
inline DbU::Unit displayToDbuY ( int y ) const;
inline DbU::Unit displayToDbuLength ( int length ) const;
inline Box displayToDbuBox ( const QRect& rect ) const;
inline DbU::Unit screenToDbuX ( int x ) const;
inline DbU::Unit screenToDbuY ( int y ) const;
// Qt QWidget Functions Overloads.
void pushCursor ( Qt::CursorShape cursor );
void popCursor ();
QSize minimumSizeHint () const;
void paintEvent ( QPaintEvent* );
void resizeEvent ( QResizeEvent* );
void keyPressEvent ( QKeyEvent* );
void mouseMoveEvent ( QMouseEvent* );
void mousePressEvent ( QMouseEvent* );
void mouseReleaseEvent ( QMouseEvent* );
public slots:
// Qt QWidget Slots Overload & CellWidget Specifics.
void redraw ( QRect redrawArea );
inline void redraw ();
void goLeft ( int dx = 0 );
void goRight ( int dx = 0 );
void goUp ( int dy = 0 );
void goDown ( int dy = 0 );
void fitToContents ();
void setScale ( float scale );
void setShowBoundaries ( bool state );
void reframe ( const Box& box );
void screenReframe ();
void shiftLeft ( int dx );
void shiftRight ( int dx );
void shiftUp ( int dy );
void shiftDown ( int dy );
// Modifiers. protected:
public: // Internal: Attributes.
static const int _stripWidth;
vector<Qt::CursorShape> _cursors;
QStatusBar* _statusBar;
// MapView* _mapView;
Palette* _palette;
DynamicLabel* _xPosition;
DynamicLabel* _yPosition;
Box _displayArea;
Box _visibleArea;
float _scale;
QPoint _offsetVA;
QPixmap _drawingBuffer;
QPainter _painter;
QPoint _lastMousePosition;
Cell* _cell;
bool _mouseGo;
bool _showBoundaries;
size_t _redrawRectCount;
}; };
inline void CellWidget::redraw () inline void CellWidget::redraw ()
{ redraw ( QRect(QPoint(0,0),_drawingBuffer.size()) ); }
inline int CellWidget::dbuToDisplayX ( DbU::Unit x ) const
{ return (int)rint ( (float)( x - _displayArea.getXMin() ) * _scale ); }
inline int CellWidget::dbuToDisplayY ( DbU::Unit y ) const
{ return (int)rint ( (float)( _displayArea.getYMax() - y ) * _scale ); }
inline int CellWidget::dbuToDisplayLength ( DbU::Unit length ) const
{ return (int)rint ( (float)length * _scale ); }
inline DbU::Unit CellWidget::displayToDbuX ( int x ) const
{ return (DbU::Unit)(x/_scale) + _displayArea.getXMin(); }
inline DbU::Unit CellWidget::displayToDbuY ( int y ) const
{ return _displayArea.getYMax() - (DbU::Unit)(y/_scale); }
inline DbU::Unit CellWidget::displayToDbuLength ( int length ) const
{ return (int)( (float)length / _scale ); }
inline Box CellWidget::displayToDbuBox ( const QRect& rect ) const
{ {
redraw ( QRect(QPoint(0,0),_drawingBuffer.size()) ); return Box ( displayToDbuX(rect.x())
, displayToDbuY(rect.y())
, displayToDbuX(rect.x()+rect.width ())
, displayToDbuY(rect.y()+rect.height())
);
} }
inline int CellWidget::getScreenX ( DbU::Unit x ) const inline DbU::Unit CellWidget::screenToDbuX ( int x ) const
{ { return displayToDbuX(x+_offsetVA.x()); }
return (int)rint ( (float)( x - _displayArea.getXMin() ) * _scale );
}
inline int CellWidget::getScreenY ( DbU::Unit y ) const inline DbU::Unit CellWidget::screenToDbuY ( int y ) const
{ { return displayToDbuY(y+_offsetVA.y()); }
return (int)rint ( (float)( _displayArea.getYMax() - y ) * _scale );
}
inline int CellWidget::getScreenLength ( DbU::Unit length ) const
{
return (int)rint ( (float)length * _scale );
}
inline DbU::Unit CellWidget::getX ( int x ) const
{
return (DbU::Unit)(x/_scale) + _displayArea.getXMin();
}
inline DbU::Unit CellWidget::getY ( int y ) const
{
return _displayArea.getYMax() - (DbU::Unit)(y/_scale);
}
inline DbU::Unit CellWidget::getLength ( int length ) const
{
return (int)( (float)length / _scale );
}
inline Box CellWidget::getBox ( const QRect& rect ) const
{
return Box ( getX(rect.x())
, getY(rect.y())
, getX(rect.x()+rect.width ())
, getY(rect.y()+rect.height()));
}
inline Cell* CellWidget::getCell () const inline Cell* CellWidget::getCell () const
{ { return _cell; }
return _cell;
}
inline Palette* CellWidget::getPalette () inline Palette* CellWidget::getPalette ()
{ { return _palette; }
return _palette;
}
inline QStatusBar* CellWidget::getStatusBar ()
{ return _statusBar; }
inline bool CellWidget::showBoundaries () const inline bool CellWidget::showBoundaries () const
{ { return _showBoundaries; }
return _showBoundaries;
}
} // End of Hurricane namespace. } // End of Hurricane namespace.

View File

@ -0,0 +1,48 @@
// -*- C++ -*-
# ifndef __DYNAMIC_LABEL_H__
# define __DYNAMIC_LABEL_H__
# include <QString>
# include <QWidget>
class QLabel;
# include "hurricane/Commons.h"
# include "hurricane/DbU.h"
namespace Hurricane {
class DynamicLabel : public QWidget {
Q_OBJECT;
public:
// Constructor.
DynamicLabel ( QWidget* parent=NULL );
// Methods.
QString getStaticText () const;
QString getDynamicText () const;
void setStaticText ( const QString& text );
void setDynamicText ( const QString& text );
void setDynamicText ( DbU::Unit u );
protected:
// Internal - Attributes.
QLabel* _staticLabel;
QLabel* _dynamicLabel;
// Internal - Constructor.
DynamicLabel ( const DynamicLabel& );
DynamicLabel& operator= ( const DynamicLabel& );
};
} // End of Hurricane namespace.
# endif