* ./hurricane/src/hviewer :

- Bug: correction of the bad keyPress event handling in InspectorWidget
        (had to press twice the key for the action to be transmitted).
          Uses an eventFilter() at InspectorWidget instead of a keyPressEvent()
        overload. The keyPress event is first received by the QTableView then
        transmitted to the upper level. The eventFilter allows the InspectorWidget
        to catch the event *before* it gets to QTableView (but let pass thoses
        it don't want).
    - Bug: idem for SeletionWidget.
    - Change: do not draw the rectangular area of AreaCommand until it is bigger
        than a given threshold (programmable). Affect ZoomCommand and
        SelectCommand. ZoomCommand no longer issue a warning when the zoom is
        to small.
    - New feature: fit to net in the NetlistWidget. Uses simple contextual menu,
        another way to avoid overloading keyPressEvent().
    - Change: in Query, the filter has now it's own subtype: Query::Mask.
    - Change: enhancement for the "start" model of signal propagation, used to
        re-implement the DisplayFilterWidget.
    - Change: more clear policy for signal emission: a signal must be emitted
        by any "setter" method (setStartLevel(), setStopLevel(), ...). Has to
        be enforced for all setter (work in progress).
    - Change: re-implemenation of the delayed refresh mechanism. No more flags
        propaged througout the functions calls but a session mechanism instead.
        See CellWidget::openRefreshSession() & CellWidget::closeRefreshSession().
        Nothing is actually drawn until the last session is closed.
          Session mechanism can be invoked by signals/slots, see NetlistWidget.
    - Change: less dangerous key mapping:
        'z'          : zoom in.
        'm'          : zoom out.
        'CTRL+z'     : previous zoom level.
        'CTRL+m'     : next zoom level.
        'CTRL+Up'    : back in hierarchy.
        'CTRL+Down'  : go down in hierarchy.
        'SHIFT+Up'   : back in hierarchy stack.
        'SHIFT+Down' : go down in hierarchy stack.
This commit is contained in:
Jean-Paul Chaput 2009-02-02 14:45:48 +00:00
parent a2e1fd4d97
commit 4067a363dc
23 changed files with 529 additions and 354 deletions

View File

@ -79,7 +79,7 @@ namespace Hurricane {
, const Transformation& transformation
, const BasicLayer* basicLayer
, ExtensionSlice::Mask mask
, unsigned int filter
, Mask filter
)
{
_basicLayer = basicLayer;
@ -102,13 +102,13 @@ namespace Hurricane {
while ( !_stack.empty() ) {
// Process the Components of the current instance.
if ( hasGoCallback() && _basicLayer && (_filter & DoComponents) ) {
if ( hasGoCallback() && _basicLayer && (_filter.isSet(DoComponents)) ) {
//if ( getInstance() )
// cerr << getTab() << getInstance() << " " << getTransformation() << endl;
//else
// cerr << " TopCell: " << getMasterCell() << " " << getTransformation() << endl;
if ( !getMasterCell()->isTerminal() || (_filter & DoTerminalCells) ) {
if ( !getMasterCell()->isTerminal() || (_filter.isSet(DoTerminalCells)) ) {
forEach ( Slice*, islice, getMasterCell()->getSlices() ) {
if ( !(*islice)->getLayer()->contains(getBasicLayer()) ) continue;
if ( !(*islice)->getBoundingBox().intersect(getArea()) ) continue;
@ -119,13 +119,13 @@ namespace Hurricane {
}
}
if ( !getMasterCell()->isTerminal() && (_filter & DoRubbers) ) {
if ( !getMasterCell()->isTerminal() && (_filter.isSet(DoRubbers)) ) {
forEach ( Rubber*, rubber, getMasterCell()->getRubbersUnder(_stack.getArea()) )
rubberCallback ( *rubber );
}
if ( hasExtensionGoCallback() && (_filter & DoExtensionGos) ) {
if ( !getMasterCell()->isTerminal() || (_filter & DoTerminalCells) ) {
if ( hasExtensionGoCallback() && (_filter.isSet(DoExtensionGos)) ) {
if ( !getMasterCell()->isTerminal() || (_filter.isSet(DoTerminalCells)) ) {
forEach ( ExtensionSlice*, islice, getMasterCell()->getExtensionSlices() ) {
if ( !( (*islice)->getMask() & _extensionMask ) ) continue;
if ( !(*islice)->getBoundingBox().intersect(getArea()) ) continue;
@ -136,7 +136,7 @@ namespace Hurricane {
}
}
if ( (_filter & DoMasterCells) && hasMasterCellCallback() )
if ( (_filter.isSet(DoMasterCells)) && hasMasterCellCallback() )
masterCellCallback ();
_stack.progress ();

View File

@ -2,7 +2,7 @@
// -*- C++ -*-
//
// This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved
// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved
//
// ===================================================================
//
@ -41,6 +41,7 @@ namespace Hurricane {
inline bool zero () const;
inline Mask& set ( const Mask mask );
inline Mask& unset ( const Mask mask );
inline bool isSet ( const Mask mask ) const;
inline bool contains ( const Mask mask ) const;
inline bool intersect ( const Mask mask ) const;
inline Mask& merge ( const Mask mask ) const;
@ -85,6 +86,10 @@ namespace Hurricane {
inline Mask<IntType>& Mask<IntType>::unset ( const Mask<IntType> mask )
{ _mask &= ~mask._mask; return *this; }
template<typename IntType>
inline bool Mask<IntType>::isSet ( const Mask<IntType> mask ) const
{ return _mask & mask._mask; }
template<typename IntType>
inline bool Mask<IntType>::contains ( const Mask<IntType> mask ) const
{ return (_mask & mask._mask) && !(~_mask & mask._mask); }

View File

@ -1,36 +1,9 @@
// -*- C++ -*-
//
// This file is part of the Coriolis Project.
// Copyright (C) Laboratoire LIP6 - Departement ASIM
// Universite Pierre et Marie Curie
// This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved
//
// Main contributors :
// Christophe Alexandre <Christophe.Alexandre@lip6.fr>
// Sophie Belloeil <Sophie.Belloeil@lip6.fr>
// Hugo Clément <Hugo.Clement@lip6.fr>
// Jean-Paul Chaput <Jean-Paul.Chaput@lip6.fr>
// Damien Dupuis <Damien.Dupuis@lip6.fr>
// Christian Masson <Christian.Masson@lip6.fr>
// Marek Sroka <Marek.Sroka@lip6.fr>
//
// The Coriolis Project is free software; you can redistribute it
// and/or modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2 of
// the License, or (at your option) any later version.
//
// The Coriolis Project is distributed in the hope that it will be
// useful, but WITHOUT ANY WARRANTY; without even the implied warranty
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with the Coriolis Project; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
// USA
//
// License-Tag
// Authors-Tag
// ===================================================================
//
// $Id$
@ -303,6 +276,8 @@ namespace Hurricane {
class Query {
public:
typedef Hurricane::Mask<int> Mask;
public:
// Types.
enum QueryFilter { DoMasterCells = 1
@ -344,14 +319,14 @@ namespace Hurricane {
, const Transformation& transformation
, const BasicLayer* basicLayer
, ExtensionSlice::Mask extensionMask
, unsigned int filter
, Mask filter
);
inline void setCell ( Cell* cell );
inline void setArea ( const Box& area );
inline void setTransformation ( const Transformation& transformation );
inline void setBasicLayer ( const BasicLayer* basicLayer );
inline void setExtensionMask ( ExtensionSlice::Mask mode );
inline void setFilter ( unsigned int mode );
inline void setFilter ( Mask mode );
inline void setStartLevel ( unsigned int level );
inline void setStopLevel ( unsigned int level );
void doQuery ();
@ -361,7 +336,7 @@ namespace Hurricane {
QueryStack _stack;
const BasicLayer* _basicLayer;
ExtensionSlice::Mask _extensionMask;
unsigned int _filter;
Mask _filter;
};
@ -371,7 +346,7 @@ namespace Hurricane {
inline void Query::setArea ( const Box& area ) { _stack.setTopArea(area); }
inline void Query::setTransformation ( const Transformation& transformation ) { _stack.setTopTransformation(transformation); }
inline void Query::setBasicLayer ( const BasicLayer* basicLayer ) { _basicLayer = basicLayer; }
inline void Query::setFilter ( unsigned int filter ) { _filter = filter; }
inline void Query::setFilter ( Mask filter ) { _filter = filter; }
inline void Query::setExtensionMask ( ExtensionSlice::Mask mask ) { _extensionMask = mask; }
inline void Query::setStartLevel ( unsigned int level ) { _stack.setStartLevel(level); }
inline void Query::setStopLevel ( unsigned int level ) { _stack.setStopLevel(level); }

View File

@ -1,36 +1,9 @@
// -*- C++ -*-
//
// This file is part of the Coriolis Project.
// Copyright (C) Laboratoire LIP6 - Departement ASIM
// Universite Pierre et Marie Curie
// This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved
//
// Main contributors :
// Christophe Alexandre <Christophe.Alexandre@lip6.fr>
// Sophie Belloeil <Sophie.Belloeil@lip6.fr>
// Hugo Clément <Hugo.Clement@lip6.fr>
// Jean-Paul Chaput <Jean-Paul.Chaput@lip6.fr>
// Damien Dupuis <Damien.Dupuis@lip6.fr>
// Christian Masson <Christian.Masson@lip6.fr>
// Marek Sroka <Marek.Sroka@lip6.fr>
//
// The Coriolis Project is free software; you can redistribute it
// and/or modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2 of
// the License, or (at your option) any later version.
//
// The Coriolis Project is distributed in the hope that it will be
// useful, but WITHOUT ANY WARRANTY; without even the implied warranty
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with the Coriolis Project; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
// USA
//
// License-Tag
// Authors-Tag
// ===================================================================
//
// $Id$
@ -69,6 +42,7 @@ namespace Hurricane {
: Command()
, _startPoint()
, _stopPoint()
, _drawingThreshold(10)
, _drawingEnabled(false)
{ }
@ -93,10 +67,13 @@ namespace Hurricane {
{
if ( !_drawingEnabled ) return;
widget->setPen ( Graphics::getPen("grid"), 2 );
widget->drawScreenRect ( _startPoint, _stopPoint, 2 );
drawCorner ( widget, true );
drawCorner ( widget, false );
if ( ( abs(_stopPoint.x()-_startPoint.x()) > _drawingThreshold )
&& ( abs(_stopPoint.y()-_startPoint.y()) > _drawingThreshold ) ) {
widget->setPen ( Graphics::getPen("grid"), 2 );
widget->drawScreenRect ( _startPoint, _stopPoint, 2 );
drawCorner ( widget, true );
drawCorner ( widget, false );
}
}

View File

@ -196,10 +196,11 @@ namespace Hurricane {
CellWidget::RedrawManager::RedrawManager ( CellWidget* widget )
: _widget (widget)
, _events ()
, _processing (false)
, _interrupted(false)
: _widget (widget)
, _events ()
, _refreshSession(0)
, _processing (false)
, _interrupted (false)
{ }
@ -283,14 +284,25 @@ namespace Hurricane {
if ( !_processing ) process ();
}
#else
_events.push_back ( new RedrawEvent(RedrawEvent::Refresh,0,_widget) );
bool addRefresh = true;
if ( _refreshSession ) {
list<RedrawEvent*>::iterator ievent = _events.begin();
for ( ; ievent != _events.end() ; ievent++ ) {
if ( (_events.back()->getType() == RedrawEvent::Refresh) ) {
addRefresh = false;
break;
}
}
}
if ( addRefresh )
_events.push_back ( new RedrawEvent(RedrawEvent::Refresh,0,_widget) );
if ( !_processing ) process ();
if ( !_processing && (_refreshSession == 0) ) process ();
#endif
}
inline void CellWidget::RedrawManager::process ()
void CellWidget::RedrawManager::process ()
{
_processing = true;
@ -780,12 +792,12 @@ namespace Hurricane {
}
bool CellWidget::SelectorCriterions::add ( const Net* net, bool delayRedraw )
bool CellWidget::SelectorCriterions::add ( const Net* net )
{
if ( !_cellWidget ) return false;
if ( !_cellWidget->isSelected(Occurrence(net)) ) {
_criterions.push_back ( new NetSelectorCriterion(net) );
_criterions.back()->doSelection ( _cellWidget, delayRedraw );
_criterions.back()->doSelection ( _cellWidget );
return true;
}
return false;
@ -796,12 +808,12 @@ namespace Hurricane {
{
if ( !_cellWidget ) return false;
_criterions.push_back ( new AreaSelectorCriterion(area) );
_criterions.back()->doSelection ( _cellWidget, true );
_criterions.back()->doSelection ( _cellWidget );
return true;
}
bool CellWidget::SelectorCriterions::remove ( const Net* net, bool delayRedraw )
bool CellWidget::SelectorCriterions::remove ( const Net* net )
{
if ( !_cellWidget ) return false;
if ( !_cellWidget->isSelected(Occurrence(net)) ) return false;
@ -812,7 +824,7 @@ namespace Hurricane {
if ( i < _criterions.size() ) {
swap ( _criterions[i], *(_criterions.end()-1) );
_criterions.back()->undoSelection ( _cellWidget, delayRedraw );
_criterions.back()->undoSelection ( _cellWidget );
_criterions.pop_back ();
} else
return false;
@ -838,7 +850,7 @@ namespace Hurricane {
size_t last = _criterions.size ();
while ( i < last ) {
if ( _criterions[i]->isValid(_cellWidget) ) {
_criterions[i]->doSelection ( _cellWidget, true );
_criterions[i]->doSelection ( _cellWidget );
++i;
} else
swap ( _criterions[i], _criterions[--last] );
@ -912,7 +924,6 @@ namespace Hurricane {
, _drawingPlanes (QSize(_initialSide+2*_stripWidth,_initialSide+2*_stripWidth),this)
, _drawingQuery (this)
, _textDrawingQuery (this)
, _queryFilter (~Query::DoTerminalCells)
, _darkening (100)
, _mousePosition (0,0)
, _spot (this)
@ -926,7 +937,6 @@ namespace Hurricane {
, _commands ()
, _redrawRectCount (0)
, _textFontHeight (20)
, _rubberShape (Steiner)
{
//setBackgroundRole ( QPalette::Dark );
//setAutoFillBackground ( false );
@ -1046,7 +1056,6 @@ namespace Hurricane {
case Barycentric: setRubberShape(Steiner ); break;
case Steiner: setRubberShape(Centric ); break;
}
emit settingsChanged();
}
@ -1082,11 +1091,18 @@ namespace Hurricane {
}
void CellWidget::changeQueryFilter ()
{
_redrawManager.refresh ();
emit queryFilterChanged ();
}
void CellWidget::_redraw ( QRect redrawArea )
{
// cerr << "CellWidget::redraw() - start "
// << _selectionHasChanged << " filter:"
// << _queryFilter << endl;
// << _state->getQueryFilter() << endl;
// static bool timedout;
// static Timer timer;
@ -1130,7 +1146,7 @@ namespace Hurricane {
if ( isDrawable((*iLayer)->getName()) ) {
_drawingQuery.setBasicLayer ( *iLayer );
_drawingQuery.setFilter ( _queryFilter & ~(Query::DoMasterCells|Query::DoRubbers) );
_drawingQuery.setFilter ( getQueryFilter().unset(Query::DoMasterCells|Query::DoRubbers) );
_drawingQuery.doQuery ();
}
if ( _enableRedrawInterrupt ) QApplication::processEvents();
@ -1147,7 +1163,7 @@ namespace Hurricane {
_drawingPlanes.setBrush ( Graphics::getBrush("boundaries",getDarkening()) );
_drawingQuery.setBasicLayer ( NULL );
_drawingQuery.setFilter ( _queryFilter & ~(Query::DoComponents|Query::DoRubbers) );
_drawingQuery.setFilter ( getQueryFilter().unset(Query::DoComponents|Query::DoRubbers) );
_drawingQuery.doQuery ();
}
}
@ -1158,7 +1174,7 @@ namespace Hurricane {
_drawingPlanes.setBrush ( Graphics::getBrush("rubber",getDarkening()) );
_drawingQuery.setBasicLayer ( NULL );
_drawingQuery.setFilter ( _queryFilter & ~(Query::DoComponents|Query::DoMasterCells) );
_drawingQuery.setFilter ( getQueryFilter().unset(Query::DoComponents|Query::DoMasterCells) );
_drawingQuery.doQuery ();
}
}
@ -1175,7 +1191,7 @@ namespace Hurricane {
}
}
//_drawingQuery.setFilter ( _queryFilter & ~Query::DoMasterCells );
//_drawingQuery.setFilter ( getQueryFilter() & ~Query::DoMasterCells );
forEach ( ExtensionSlice*, islice, getCell()->getExtensionSlices() ) {
if ( _enableRedrawInterrupt ) QApplication::processEvents();
if ( /*timeout("redraw [extension]",timer,10.0,timedout) ||*/ (_redrawManager.interrupted()) ) break;
@ -1517,7 +1533,7 @@ namespace Hurricane {
}
void CellWidget::displayReframe ( bool delayed )
void CellWidget::displayReframe ()
{
_offsetVA.rx() = _stripWidth;
_offsetVA.ry() = _stripWidth;
@ -1529,7 +1545,7 @@ namespace Hurricane {
_displayArea = Box ( xmin, ymin, xmax, ymax );
if ( !delayed ) _redrawManager.refresh ();
_redrawManager.refresh ();
}
@ -1612,41 +1628,42 @@ namespace Hurricane {
}
void CellWidget::reframe ( bool delayed )
void CellWidget::reframe ()
{
//cerr << "CellWidget::reframe() - scale:" << _state->getScale()
// << " topLeft:" << _state->getTopLeft() << endl;
_visibleArea = computeVisibleArea ( _state->getScale(), _state->getTopLeft() );
displayReframe ( delayed );
displayReframe ();
}
void CellWidget::reframe ( const Box& box, bool delayed )
void CellWidget::reframe ( const Box& box, bool historyEnable )
{
//cerr << "CellWidget::reframe() - " << box << endl;
//cerr << " widget size := " << _drawingPlanes.width() << "x" << _drawingPlanes.height() << endl;
//cerr << " CellWidget::reframe() - widget size := " << width() << "x" << height() << endl;
float scale;
bool backupHistoryEnable = _state->getHistoryEnable ();
_state->setHistoryEnable ( historyEnable );
_state->setTopLeft ( getTopLeft() );
_state->setTopLeft ( getTopLeft() );
float scale;
_visibleArea = computeVisibleArea ( box, scale );
_state->setScale ( scale );
displayReframe ( delayed );
displayReframe ();
_state->setHistoryEnable ( backupHistoryEnable );
//cerr << " _displayArea: " << _displayArea << " (offset: " << _offsetVA.x() << ")" << endl;
}
void CellWidget::fitToContents ( bool delayed, bool historyEnable )
void CellWidget::fitToContents ( bool historyEnable )
{
//cerr << "CellWidget::fitToContents()" << endl;
bool backupHistoryEnable = _state->getHistoryEnable ();
_state->setHistoryEnable ( historyEnable );
Box boundingBox = Box ( DbU::lambda(0)
, DbU::lambda(0)
, DbU::lambda(10)
@ -1654,9 +1671,26 @@ namespace Hurricane {
);
if ( getCell() ) boundingBox = getCell()->getBoundingBox();
reframe ( boundingBox, delayed );
reframe ( boundingBox, historyEnable );
}
_state->setHistoryEnable ( backupHistoryEnable );
void CellWidget::fitToNet ( const Net* net, bool historyEnable )
{
if ( !net )
throw Error ( "<b>CellWidget::fitToNet()</b>: NULL net argument." );
if ( net->getCell() != getCell() )
throw Error ( "<b>CellWidget::fitToNet()</b>:<br>"
"Net %s (cell: %s) do not belong to Cell %s"
, Graphics::toHtml(getString(net->getName())).c_str()
, Graphics::toHtml(getString(net->getCell()->getName())).c_str()
, Graphics::toHtml(getString(getCell()->getName())).c_str()
);
Box boundingBox = net->getBoundingBox ();
if ( !boundingBox.isEmpty() )
reframe ( boundingBox, historyEnable );
}
@ -1782,7 +1816,7 @@ namespace Hurricane {
{
//cerr << "CellWidget::showEvent() - size: " << geometry().width() << "x" << geometry().height() << endl;
if ( _cellChanged )
fitToContents ( false, false );
fitToContents ( false );
}
@ -1963,12 +1997,16 @@ namespace Hurricane {
if ( cell == getCell() ) return;
openRefreshSession ();
shared_ptr<State> state ( new State(cell) );
setState ( state );
fitToContents ( false, false );
fitToContents ( false );
_state->setHistoryEnable ( true );
closeRefreshSession ();
}
@ -1978,6 +2016,8 @@ namespace Hurricane {
if ( state == _state ) return;
openRefreshSession ();
cellPreModificate ();
_state->getSelection ().clear ();
_state->setCellWidget ( NULL );
@ -1994,16 +2034,21 @@ namespace Hurricane {
_state->setHistoryEnable ( false );
_state->setCellWidget ( this );
_drawingQuery .setCell ( getCell() );
_textDrawingQuery.setCell ( getCell() );
_drawingQuery .setCell ( getCell() );
_drawingQuery .setStartLevel ( _state->getStartLevel() );
_drawingQuery .setStopLevel ( _state->getStopLevel() );
_textDrawingQuery.setCell ( getCell() );
reframe ( true );
reframe ();
_state->setHistoryEnable ( true );
emit cellChanged ( getCell() );
emit stateChanged ( _state );
emit cellChanged ( getCell() );
emit stateChanged ( _state );
emit queryFilterChanged ();
cellPostModificate ();
closeRefreshSession ();
}
@ -2013,12 +2058,16 @@ namespace Hurricane {
}
void CellWidget::select ( const Net* net, bool delayRedraw )
void CellWidget::select ( const Net* net )
{
++_delaySelectionChanged;
if ( !_state->cumulativeSelection() ) unselectAll ( true );
bool added = _state->getSelection().add ( net, delayRedraw );
if ( !_state->cumulativeSelection() ) {
openRefreshSession ();
unselectAll ();
closeRefreshSession ();
}
bool added = _state->getSelection().add ( net );
if ( !--_delaySelectionChanged && added ) emit selectionChanged(_selectors,getCell());
}
@ -2083,18 +2132,22 @@ namespace Hurricane {
{
++_delaySelectionChanged;
if ( !_state->cumulativeSelection() ) unselectAll ( true );
if ( !_state->cumulativeSelection() ) {
openRefreshSession ();
unselectAll ();
closeRefreshSession ();
}
bool added = _state->getSelection().add ( selectArea );
if ( !--_delaySelectionChanged && added ) emit selectionChanged(_selectors,getCell());
}
void CellWidget::unselect ( const Net* net, bool delayRedraw )
void CellWidget::unselect ( const Net* net )
{
++_delaySelectionChanged;
bool removed = _state->getSelection().remove ( net, delayRedraw );
bool removed = _state->getSelection().remove ( net );
if ( !--_delaySelectionChanged && removed ) emit selectionChanged(_selectors,getCell());
}
@ -2121,12 +2174,12 @@ namespace Hurricane {
}
void CellWidget::unselectAll ( bool delayRedraw )
void CellWidget::unselectAll ()
{
++_delaySelectionChanged;
_state->getSelection().clear ();
_unselectAll ( delayRedraw );
_unselectAll ();
if ( !--_delaySelectionChanged ) emit selectionChanged(_selectors,getCell());
}
@ -2159,7 +2212,7 @@ namespace Hurricane {
}
void CellWidget::_select ( const Net* net, bool delayRedraw )
void CellWidget::_select ( const Net* net )
{
select ( Occurrence(net) );
forEach ( Component*, component, net->getComponents() ) {
@ -2170,11 +2223,11 @@ namespace Hurricane {
Occurrence occurrence ( *rubber );
select ( occurrence );
}
if ( !delayRedraw && _state->showSelection() ) _redrawManager.refresh ();
if ( _state->showSelection() ) _redrawManager.refresh ();
}
void CellWidget::_unselect ( const Net* net, bool delayRedraw )
void CellWidget::_unselect ( const Net* net )
{
unselect ( Occurrence(net) );
forEach ( Component*, component, net->getComponents() ) {
@ -2185,7 +2238,7 @@ namespace Hurricane {
Occurrence occurrence ( *rubber );
unselect ( occurrence );
}
if ( !delayRedraw && _state->showSelection() ) _redrawManager.refresh ();
if ( _state->showSelection() ) _redrawManager.refresh ();
}
@ -2196,28 +2249,32 @@ namespace Hurricane {
}
void CellWidget::_unselectAll ( bool delayRedraw )
void CellWidget::_unselectAll ()
{
SelectorSet::iterator iselector;
while ( !_selectors.empty() )
(*_selectors.begin())->detachFrom ( this );
if ( !_selectionHasChanged ) _selectionHasChanged = true;
if ( !delayRedraw && _state->showSelection() ) _redrawManager.refresh ();
if ( _state->showSelection() ) _redrawManager.refresh ();
}
void CellWidget::cellPreModificate ()
{
_unselectAll ( true );
openRefreshSession ();
_unselectAll ();
emit selectionChanged(_selectors,getCell());
emit cellPreModificated ();
closeRefreshSession ();
}
void CellWidget::cellPostModificate ()
{
openRefreshSession ();
_cellModificated = true;
++_delaySelectionChanged;
@ -2229,6 +2286,8 @@ namespace Hurricane {
--_delaySelectionChanged;
emit selectionChanged(_selectors,getCell());
emit cellPostModificated ();
closeRefreshSession ();
}

View File

@ -221,8 +221,11 @@ namespace Hurricane {
{
if ( state && getCellWidget() && _syncNetlist->isChecked() ) {
_cwCumulativeSelection = getCellWidget()->cumulativeSelection();
if ( !_cwCumulativeSelection )
getCellWidget()->unselectAll ( true );
if ( !_cwCumulativeSelection ) {
getCellWidget()->openRefreshSession ();
getCellWidget()->unselectAll ();
getCellWidget()->closeRefreshSession ();
}
getCellWidget()->setCumulativeSelection ( true );
getCellWidget()->setShowSelection ( true );
connect ( _netlistBrowser, SIGNAL(netSelected (const Net*)), getCellWidget(), SLOT(select (const Net*)) );
@ -247,7 +250,13 @@ namespace Hurricane {
if ( getCellWidget() != cellWidget ) {
ControllerTab::setCellWidget ( cellWidget );
if ( getCellWidget() ) {
connect ( _netlistBrowser, SIGNAL(refreshSessionOpened())
, getCellWidget(), SLOT (openRefreshSession()) );
connect ( _netlistBrowser, SIGNAL(refreshSessionClosed())
, getCellWidget(), SLOT (closeRefreshSession()) );
connect ( getCellWidget(), SIGNAL(cellChanged(Cell*)), this, SLOT(setCell(Cell*)) );
connect ( _netlistBrowser, SIGNAL(netFitted(const Net*))
, getCellWidget(), SLOT (fitToNet (const Net*)) );
}
setSyncNetlist ( _syncNetlist->isChecked() );
}

View File

@ -2,7 +2,7 @@
// -*- C++ -*-
//
// This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved
// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved
//
// ===================================================================
//
@ -55,8 +55,7 @@ namespace Hurricane {
, _steiner (new QRadioButton())
, _centric (new QRadioButton())
, _barycentric (new QRadioButton())
, _queryFilter (Query::DoAll)
, _signalEmitter (false)
, _updateState (External)
{
setAttribute ( Qt::WA_QuitOnClose, false );
setWindowTitle ( tr("Display Filter") );
@ -152,55 +151,79 @@ namespace Hurricane {
void DisplayFilterWidget::setCellWidget ( CellWidget* cw )
{
if ( !cw ) {
if ( _cellWidget )
disconnect ( _cellWidget, SLOT(refresh()) );
if ( _cellWidget ) {
disconnect ( this , SIGNAL(queryFilterChanged()), _cellWidget, SLOT(changeQueryFilter()) );
disconnect ( _cellWidget , SIGNAL(queryFilterChanged()), this , SLOT(changeQueryFilter()) );
}
_cellWidget = NULL;
return;
}
_cellWidget = cw;
connect ( this , SIGNAL(filterChanged()) , _cellWidget, SLOT(refresh()) );
connect ( _cellWidget , SIGNAL(settingsChanged()), this , SLOT(syncFromCellWidget()) );
connect ( _steiner , SIGNAL(clicked()) , this , SLOT(setRubberSteiner()) );
connect ( _centric , SIGNAL(clicked()) , this , SLOT(setRubberCentric()) );
connect ( _barycentric, SIGNAL(clicked()) , this , SLOT(setRubberBarycentric()) );
connect ( this , SIGNAL(queryFilterChanged()), _cellWidget, SLOT(changeQueryFilter()) );
connect ( _cellWidget , SIGNAL(queryFilterChanged()), this , SLOT(changeQueryFilter()) );
connect ( _steiner , SIGNAL(clicked()) , this , SLOT(setRubberSteiner()) );
connect ( _centric , SIGNAL(clicked()) , this , SLOT(setRubberCentric()) );
connect ( _barycentric, SIGNAL(clicked()) , this , SLOT(setRubberBarycentric()) );
_signalEmitter = false;
syncFromCellWidget ();
_updateState = External;
changeQueryFilter ();
}
void DisplayFilterWidget::syncFromCellWidget ()
void DisplayFilterWidget::changeQueryFilter()
{
if ( !_cellWidget ) return;
if ( _signalEmitter ) {
_signalEmitter = false;
return;
}
if ( !_cellWidget ) return;
_doMasterCells ->setChecked ( _cellWidget->getQueryFilter() & Query::DoMasterCells );
_doTerminalCells->setChecked ( _cellWidget->getQueryFilter() & Query::DoTerminalCells );
_doComponents ->setChecked ( _cellWidget->getQueryFilter() & Query::DoComponents );
if ( _updateState == InternalEmit ) {
_updateState = InternalReceive;
emit queryFilterChanged ();
} else {
if ( _updateState == External ) {
blockAllSignals ( true );
switch ( _cellWidget->getRubberShape() ) {
case CellWidget::Steiner: _steiner->setChecked(true); break;
case CellWidget::Centric: _centric->setChecked(true); break;
case CellWidget::Barycentric: _barycentric->setChecked(true); break;
_startSpinBox->setValue ( _cellWidget->getStartLevel() );
_stopSpinBox ->setValue ( _cellWidget->getStopLevel() );
_doMasterCells ->setChecked ( _cellWidget->getQueryFilter().isSet(Query::DoMasterCells ) );
_doTerminalCells->setChecked ( _cellWidget->getQueryFilter().isSet(Query::DoTerminalCells) );
_doComponents ->setChecked ( _cellWidget->getQueryFilter().isSet(Query::DoComponents ) );
switch ( _cellWidget->getRubberShape() ) {
case CellWidget::Steiner: _steiner->setChecked(true); break;
case CellWidget::Centric: _centric->setChecked(true); break;
case CellWidget::Barycentric: _barycentric->setChecked(true); break;
}
blockAllSignals ( false );
}
_updateState = External;
}
_signalEmitter = false;
}
void DisplayFilterWidget::blockAllSignals ( bool state )
{
_startSpinBox ->blockSignals ( state );
_stopSpinBox ->blockSignals ( state );
_doMasterCells ->blockSignals ( state );
_doTerminalCells->blockSignals ( state );
_doComponents ->blockSignals ( state );
_steiner ->blockSignals ( state );
_centric ->blockSignals ( state );
_barycentric ->blockSignals ( state );
}
void DisplayFilterWidget::startLevelChanged ( int level )
{
if ( _cellWidget ) {
_cellWidget->setStartLevel ( level );
if ( _stopSpinBox->value() < level ) {
_stopSpinBox->setValue ( level );
return;
_stopSpinBox->blockSignals ( true );
_stopSpinBox->setValue ( level );
_stopSpinBox->blockSignals ( false );
}
_signalEmitter = true;
emit filterChanged();
_updateState = InternalEmit;
_cellWidget->setStartLevel ( level );
}
}
@ -208,59 +231,66 @@ namespace Hurricane {
void DisplayFilterWidget::stopLevelChanged ( int level )
{
if ( _cellWidget ) {
_cellWidget->setStopLevel ( level );
if ( _startSpinBox->value() > level ) {
_startSpinBox->setValue ( level );
return;
_startSpinBox->blockSignals ( true );
_startSpinBox->setValue ( level );
_startSpinBox->blockSignals ( false );
}
_signalEmitter = true;
emit filterChanged();
_updateState = InternalEmit;
_cellWidget->setStopLevel ( level );
}
}
void DisplayFilterWidget::setDoMasterCells ( int state )
{
if ( state != Qt::Unchecked ) _queryFilter |= Query::DoMasterCells;
else _queryFilter &= ~Query::DoMasterCells;
if ( _cellWidget ) {
_updateState = InternalEmit;
Query::Mask queryFilter = _cellWidget->getQueryFilter();
if ( state != Qt::Unchecked ) queryFilter.set ( Query::DoMasterCells );
else queryFilter.unset ( Query::DoMasterCells );
_cellWidget->setQueryFilter ( _queryFilter );
_signalEmitter = true;
emit filterChanged();
_cellWidget->setQueryFilter ( queryFilter );
}
}
void DisplayFilterWidget::setDoTerminalCells ( int state )
{
if ( state != Qt::Unchecked ) _queryFilter |= Query::DoTerminalCells;
else _queryFilter &= ~Query::DoTerminalCells;
if ( _cellWidget ) {
_updateState = InternalEmit;
Query::Mask queryFilter = _cellWidget->getQueryFilter();
if ( state != Qt::Unchecked ) queryFilter.set ( Query::DoTerminalCells );
else queryFilter.unset ( Query::DoTerminalCells );
_cellWidget->setQueryFilter ( _queryFilter );
_signalEmitter = true;
emit filterChanged();
_cellWidget->setQueryFilter ( queryFilter );
}
}
void DisplayFilterWidget::setDoComponents ( int state )
{
if ( state != Qt::Unchecked ) _queryFilter |= Query::DoComponents;
else _queryFilter &= ~Query::DoComponents;
if ( _cellWidget ) {
_updateState = InternalEmit;
Query::Mask queryFilter = _cellWidget->getQueryFilter();
if ( state != Qt::Unchecked ) queryFilter.set ( Query::DoComponents );
else queryFilter.unset ( Query::DoComponents );
_cellWidget->setQueryFilter ( _queryFilter );
_signalEmitter = true;
emit filterChanged();
_cellWidget->setQueryFilter ( queryFilter );
}
}
void DisplayFilterWidget::setRubberSteiner ()
{
if ( _cellWidget ) {
if ( _cellWidget->getRubberShape() != CellWidget::Steiner )
if ( _cellWidget->getRubberShape() != CellWidget::Steiner ) {
_updateState = InternalEmit;
_cellWidget->setRubberShape ( CellWidget::Steiner );
//emit filterChanged();
}
}
}
@ -268,9 +298,10 @@ namespace Hurricane {
void DisplayFilterWidget::setRubberCentric ()
{
if ( _cellWidget ) {
if ( _cellWidget->getRubberShape() != CellWidget::Centric )
if ( _cellWidget->getRubberShape() != CellWidget::Centric ) {
_updateState = InternalEmit;
_cellWidget->setRubberShape ( CellWidget::Centric );
//emit filterChanged();
}
}
}
@ -278,9 +309,10 @@ namespace Hurricane {
void DisplayFilterWidget::setRubberBarycentric ()
{
if ( _cellWidget ) {
if ( _cellWidget->getRubberShape() != CellWidget::Barycentric )
if ( _cellWidget->getRubberShape() != CellWidget::Barycentric ) {
_updateState = InternalEmit;
_cellWidget->setRubberShape ( CellWidget::Barycentric );
//emit filterChanged();
}
}
}

View File

@ -65,12 +65,12 @@ namespace Hurricane {
Box pointBox ( widget->screenToDbuBox(QRect(position,QSize(1,1))) );
switch ( event->key() ) {
case Qt::Key_U:
case Qt::Key_Up:
if ( ( _historyIndex > 0 ) && (shift || control) ) {
widget->setState ( _history[--_historyIndex]._state );
}
break;
case Qt::Key_D:
case Qt::Key_Down:
{
if ( control ) {
if ( _history.empty() )

View File

@ -2,7 +2,7 @@
// -*- C++ -*-
//
// This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved
// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved
//
// ===================================================================
//
@ -177,6 +177,7 @@ namespace Hurricane {
_view->setAlternatingRowColors(true);
_view->setSelectionBehavior(QAbstractItemView::SelectRows);
_view->setSortingEnabled(true);
_view->installEventFilter(this);
QHeaderView* horizontalHeader = _view->horizontalHeader ();
horizontalHeader->setStretchLastSection ( true );
@ -302,23 +303,27 @@ namespace Hurricane {
}
void InspectorWidget::keyPressEvent ( QKeyEvent *event )
bool InspectorWidget::eventFilter ( QObject* object, QEvent* event )
{
if ( event->key() == Qt::Key_Right ) {
QModelIndex index = _view->currentIndex();
if ( index.isValid() ) {
Slot* slot = _baseModel->getRecord()->getSlot(_sortModel->mapToSource(index).row());
if ( event->type() == QEvent::KeyPress ) {
QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event);
if ( slot )
pushSlot ( slot );
if ( keyEvent->key() == Qt::Key_Right ) {
QModelIndex index = _view->currentIndex();
if ( index.isValid() ) {
Slot* slot = _baseModel->getRecord()->getSlot(_sortModel->mapToSource(index).row());
if ( slot )
pushSlot ( slot );
}
} else if ( keyEvent->key() == Qt::Key_Left ) {
back ();
} else if ( keyEvent->key() == Qt::Key_O ) {
forkInspector ( _view->currentIndex() );
}
} else if ( event->key() == Qt::Key_Left ) {
back ();
} else if ( event->key() == Qt::Key_O ) {
forkInspector ( _view->currentIndex() );
} else {
QWidget::keyPressEvent ( event );
}
return QObject::eventFilter ( object, event );
}

View File

@ -2,7 +2,7 @@
// -*- C++ -*-
//
// This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved
// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved
//
// ===================================================================
//
@ -51,6 +51,9 @@ namespace Hurricane {
bool MoveCommand::keyPressEvent ( CellWidget* widget, QKeyEvent* event )
{
if ( event->modifiers() & (Qt::ControlModifier|Qt::ShiftModifier) )
return false;
switch ( event->key() ) {
case Qt::Key_Up: widget->goUp (); return true;
case Qt::Key_Down: widget->goDown (); return true;

View File

@ -2,7 +2,7 @@
// -*- C++ -*-
//
// This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved
// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved
//
// ===================================================================
//
@ -29,6 +29,7 @@
#include <QKeyEvent>
#include <QGroupBox>
#include <QVBoxLayout>
#include <QAction>
#include "hurricane/Commons.h"
#include "hurricane/Net.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,11 +95,17 @@ namespace Hurricane {
setLayout ( gLayout );
QAction* fitAction = new QAction ( tr("&Fit to Net"), this );
fitAction->setShortcut ( QKeySequence(tr("CTRL+F")) );
fitAction->setStatusTip ( tr("Fit the view to the Net's bounding box") );
addAction ( fitAction );
connect ( _filterPatternLineEdit , SIGNAL(textChanged(const QString &))
, this , SLOT (textFilterChanged()) );
connect ( _view->selectionModel(), SIGNAL(selectionChanged(const QItemSelection&,const QItemSelection&))
, this , SLOT (updateSelecteds (const QItemSelection&,const QItemSelection&)) );
connect ( _baseModel , SIGNAL(layoutChanged()), this, SLOT(forceRowHeight()) );
connect ( _baseModel, SIGNAL(layoutChanged()), this, SLOT(forceRowHeight()) );
connect ( fitAction , SIGNAL(triggered ()), this, SLOT(fitToNet ()) );
resize(300, 300);
}
@ -123,10 +131,12 @@ namespace Hurricane {
void NetlistWidget::updateSelecteds ( const QItemSelection& , const QItemSelection& )
{
const Net* net;
cerr << "open refresh session" << endl;
emit refreshSessionOpened ();
_selecteds.resetAccesses ();
const Net* net;
QModelIndexList iList = _view->selectionModel()->selectedRows();
for ( int i=0 ; i<iList.size() ; i++ ) {
net = _baseModel->getNet ( _sortModel->mapToSource(iList[i]).row() );
@ -154,12 +164,9 @@ namespace Hurricane {
}
++isel;
}
}
void NetlistWidget::keyPressEvent ( QKeyEvent* event )
{
QWidget::keyPressEvent ( event );
emit refreshSessionClosed ();
cerr << "close refresh session" << endl;
}
@ -170,4 +177,12 @@ namespace Hurricane {
}
void NetlistWidget::fitToNet ()
{
const Net* net = _baseModel->getNet ( _sortModel->mapToSource(_view->currentIndex()).row() );
if ( net ) emit netFitted ( net );
}
} // End of Hurricane namespace.

View File

@ -98,6 +98,8 @@ namespace Hurricane {
void SelectionPopup::keyPressEvent ( QKeyEvent* event )
{
cerr << "SelectionPopup::keyPressEvent()" << endl;
QWidget::keyPressEvent ( event );
}

View File

@ -99,6 +99,7 @@ namespace Hurricane {
_view->setSortingEnabled(true);
_view->setModel ( _sortModel );
_view->horizontalHeader()->setStretchLastSection ( true );
_view->installEventFilter(this);
QHeaderView* horizontalHeader = _view->horizontalHeader ();
horizontalHeader->setStretchLastSection ( true );
@ -144,11 +145,16 @@ namespace Hurricane {
}
void SelectionWidget::keyPressEvent ( QKeyEvent* event )
bool SelectionWidget::eventFilter ( QObject* object, QEvent* event )
{
if ( event->key() == Qt::Key_I ) { inspect ( _view->currentIndex() ); }
else if ( event->key() == Qt::Key_T ) { toggleSelection ( _view->currentIndex() ); }
else QWidget::keyPressEvent ( event );
if ( event->type() == QEvent::KeyPress ) {
QKeyEvent* keyEvent = static_cast<QKeyEvent*>(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 );
}
@ -189,8 +195,8 @@ namespace Hurricane {
static bool isEmitter = false;
if ( sender() == _showSelection ) {
isEmitter = true;
emit showSelectionToggled ( state );
isEmitter = true;
emit showSelectionToggled ( state );
} else {
if ( !isEmitter ) {
_showSelection->blockSignals ( true );

View File

@ -42,7 +42,7 @@ namespace Hurricane {
{ return NULL; }
void SelectorCriterion::undoSelection ( CellWidget* cw, bool delayRedraw )
void SelectorCriterion::undoSelection ( CellWidget* cw )
{ }
@ -72,15 +72,15 @@ namespace Hurricane {
}
void NetSelectorCriterion::doSelection ( CellWidget* cw, bool delayRedraw )
void NetSelectorCriterion::doSelection ( CellWidget* cw )
{
cw->_select ( _net, delayRedraw );
cw->_select ( _net );
}
void NetSelectorCriterion::undoSelection ( CellWidget* cw, bool delayRedraw )
void NetSelectorCriterion::undoSelection ( CellWidget* cw )
{
cw->_unselect ( _net, delayRedraw );
cw->_unselect ( _net );
}
@ -124,7 +124,7 @@ namespace Hurricane {
{ return true; }
void AreaSelectorCriterion::doSelection ( CellWidget* cw, bool delayRedraw )
void AreaSelectorCriterion::doSelection ( CellWidget* cw )
{
cw->_selectOccurrencesUnder ( _area );
}

View File

@ -59,11 +59,17 @@ namespace Hurricane {
bool ZoomCommand::keyPressEvent ( CellWidget* widget, QKeyEvent* event )
{
bool control = (event->modifiers() & Qt::ControlModifier);
switch ( event->key() ) {
case Qt::Key_Z: widget->setScale ( widget->getScale()*2.0 ); return true;
case Qt::Key_M: widget->setScale ( widget->getScale()/2.0 ); return true;
case Qt::Key_U: widget->scaleHistoryUp (); return true;
case Qt::Key_D: widget->scaleHistoryDown(); return true;
case Qt::Key_Z:
if ( control ) widget->scaleHistoryDown();
else widget->setScale ( widget->getScale()*2.0 );
return true;
case Qt::Key_M:
if ( control ) widget->scaleHistoryUp ();
else widget->setScale ( widget->getScale()/2.0 );
return true;
}
return false;
}
@ -91,12 +97,13 @@ namespace Hurricane {
setDrawingEnabled ( false );
QRect zoomArea = QRect ( _startPoint, _stopPoint );
if ( ( abs(zoomArea.width()) > 10 ) && ( abs(zoomArea.height()) > 10 ) )
if ( ( abs(zoomArea.width ()) > getDrawingThreshold() )
&& ( abs(zoomArea.height()) > getDrawingThreshold() ) )
widget->reframe ( widget->screenToDbuBox(zoomArea) );
else {
cerr << Warning("Rejecting too small zoom request.") << endl;
widget->update ();
}
//else {
// cerr << Warning("Rejecting too small zoom request.") << endl;
// widget->update ();
//}
return false;
}

View File

@ -1,36 +1,9 @@
// -*- C++ -*-
//
// This file is part of the Coriolis Project.
// Copyright (C) Laboratoire LIP6 - Departement ASIM
// Universite Pierre et Marie Curie
// This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved
//
// Main contributors :
// Christophe Alexandre <Christophe.Alexandre@lip6.fr>
// Sophie Belloeil <Sophie.Belloeil@lip6.fr>
// Hugo Clément <Hugo.Clement@lip6.fr>
// Jean-Paul Chaput <Jean-Paul.Chaput@lip6.fr>
// Damien Dupuis <Damien.Dupuis@lip6.fr>
// Christian Masson <Christian.Masson@lip6.fr>
// Marek Sroka <Marek.Sroka@lip6.fr>
//
// The Coriolis Project is free software; you can redistribute it
// and/or modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2 of
// the License, or (at your option) any later version.
//
// The Coriolis Project is distributed in the hope that it will be
// useful, but WITHOUT ANY WARRANTY; without even the implied warranty
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with the Coriolis Project; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
// USA
//
// License-Tag
// Authors-Tag
// ===================================================================
//
// $Id$
@ -50,8 +23,8 @@
// x-----------------------------------------------------------------x
#ifndef __HURRICANE_AREA_COMMAND_H__
#define __HURRICANE_AREA_COMMAND_H__
#ifndef __HURRICANE_AREA_COMMAND__
#define __HURRICANE_AREA_COMMAND__
#include <QPoint>
@ -68,14 +41,17 @@ namespace Hurricane {
inline void setStartPoint ( const QPoint& start );
inline void setStopPoint ( const QPoint& stop );
inline void setDrawingEnabled ( bool state );
inline void setDrawingThreshold ( int );
virtual void draw ( CellWidget* widget );
virtual void drawCorner ( CellWidget* widget, bool bottomLeft );
virtual bool mouseMoveEvent ( CellWidget* widget, QMouseEvent* event );
inline bool isDrawingEnabled () const;
inline int getDrawingThreshold () const;
protected:
QPoint _startPoint;
QPoint _stopPoint;
QPoint _cornerPoints[3];
int _drawingThreshold;
bool _drawingEnabled;
private:
AreaCommand ( const AreaCommand& );
@ -95,10 +71,18 @@ namespace Hurricane {
{ _drawingEnabled = state; }
inline void AreaCommand::setDrawingThreshold ( int threshold )
{ _drawingThreshold = threshold; }
inline bool AreaCommand::isDrawingEnabled () const
{ return _drawingEnabled; }
inline int AreaCommand::getDrawingThreshold () const
{ return _drawingThreshold; }
}

View File

@ -114,6 +114,13 @@ namespace Hurricane {
inline Cell* getCell () const;
inline shared_ptr<State>& getState ();
inline PaletteWidget* getPalette ();
inline Occurrences getOccurrencesUnder ( const QRect& ) const;
Occurrences getOccurrencesUnder ( const Box& ) const;
inline SelectorSet& getSelectorSet ();
inline RubberShape getRubberShape () const;
inline int getStartLevel () const;
inline int getStopLevel () const;
inline Query::Mask getQueryFilter () const ;
void bindToPalette ( PaletteWidget* );
void detachFromPalette ();
void bindCommand ( Command* );
@ -121,22 +128,17 @@ namespace Hurricane {
inline bool showBoundaries () const;
inline bool showSelection () const;
inline bool cumulativeSelection () const;
inline Occurrences getOccurrencesUnder ( const QRect& ) const;
Occurrences getOccurrencesUnder ( const Box& ) const;
inline SelectorSet& getSelectorSet ();
inline void setRubberShape ( RubberShape );
inline RubberShape getRubberShape () const;
inline void setStartLevel ( int );
inline void setStopLevel ( int );
inline void setQueryFilter ( int );
inline int getQueryFilter () const ;
inline void setQueryFilter ( Query::Mask );
inline bool timeout ( const char*, const Timer&, double timeout, bool& timedout ) const;
// Painter control & Hurricane objects drawing primitives.
inline void setEnableRedrawInterrupt ( bool );
inline void addDrawExtensionGo ( const Name&, InitExtensionGo_t*, DrawExtensionGo_t* );
inline QPainter& getPainter ( size_t plane=PlaneId::Working );
inline int getDarkening () const;
inline void copyToPrinter ( QPrinter* printer );
inline void copyToPrinter ( QPrinter* );
inline const float& getScale () const;
inline const QPoint& getMousePosition () const;
bool isDrawable ( const Name& );
@ -199,8 +201,8 @@ namespace Hurricane {
void cellPreModificated ();
void cellPostModificated ();
void stateChanged ( shared_ptr<CellWidget::State>& );
void settingsChanged ();
void styleChanged ( void* emitter );
void queryFilterChanged ();
void updatePalette ( Cell* );
void mousePositionChanged ( const Point& position );
void selectionChanged ( const SelectorSet&, Cell* );
@ -211,22 +213,25 @@ namespace Hurricane {
public slots:
// Qt QWidget Slots Overload & CellWidget Specifics.
void setState ( shared_ptr<CellWidget::State>& );
inline void openRefreshSession ();
inline void closeRefreshSession ();
inline DrawingPlanes& getDrawingPlanes ();
inline QPoint& getOffsetVA ();
void select ( const Net* net, bool delayRedraw=false );
void select ( Occurrence occurence );
bool isSelected ( Occurrence occurence );
void select ( const Net* );
void select ( Occurrence );
bool isSelected ( Occurrence );
void selectOccurrencesUnder ( Box selectArea );
void unselect ( const Net* net, bool delayRedraw=false );
void unselect ( Occurrence occurence );
void unselectAll ( bool delayRedraw=false );
void toggleSelection ( Occurrence occurence );
void unselect ( const Net* );
void unselect ( Occurrence );
void unselectAll ();
void toggleSelection ( Occurrence );
void setShowSelection ( bool state );
void setCumulativeSelection ( bool state );
void _select ( const Net* net, bool delayRedraw=false );
void _unselect ( const Net* net, bool delayRedraw=false );
void _select ( const Net* );
void _unselect ( const Net* );
void _selectOccurrencesUnder ( Box selectArea );
void _unselectAll ( bool delayRedraw );
void _unselectAll ();
void changeQueryFilter ();
void rubberChange ();
void styleChange ( void* emitter );
void updatePalette ();
@ -240,14 +245,15 @@ namespace Hurricane {
void goRight ( int dx = 0 );
void goUp ( int dy = 0 );
void goDown ( int dy = 0 );
void fitToContents ( bool delayed=false, bool historyEnable=true );
void fitToContents ( bool historyEnable=true );
void fitToNet ( const Net*, bool historyEnable=true );
void setScale ( float );
void scaleHistoryUp ();
void scaleHistoryDown ();
void setShowBoundaries ( bool state );
void reframe ( bool delayed=false );
void reframe ( const Box& box, bool delayed=false );
void displayReframe ( bool delayed=false );
void reframe ();
void reframe ( const Box& box, bool historyEnable=true );
void displayReframe ();
void _goLeft ( int dx );
void _goRight ( int dx );
void _goUp ( int dy );
@ -292,21 +298,24 @@ namespace Hurricane {
private:
class RedrawManager {
public:
inline RedrawManager ( CellWidget* );
~RedrawManager ();
void goLeft ( int );
void goRight ( int );
void goUp ( int );
void goDown ( int );
void refresh ();
void process ();
inline void stopProcessing ();
inline bool isProcessing () const;
inline bool interrupted () const;
inline size_t getPendings () const;
inline RedrawManager ( CellWidget* );
~RedrawManager ();
void goLeft ( int );
void goRight ( int );
void goUp ( int );
void goDown ( int );
void refresh ();
void process ();
inline void stopProcessing ();
inline bool isProcessing () const;
inline bool interrupted () const;
inline size_t getPendings () const;
inline void openRefreshSession ();
inline void closeRefreshSession ();
private:
CellWidget* _widget;
list<RedrawEvent*> _events;
int _refreshSession;
bool _processing;
bool _interrupted;
};
@ -449,9 +458,9 @@ namespace Hurricane {
SelectorCriterions ();
~SelectorCriterions ();
inline void setCellWidget ( CellWidget* );
bool add ( const Net* net, bool delayRedraw );
bool add ( const Net* net );
bool add ( Box area );
bool remove ( const Net* net, bool delayRedraw );
bool remove ( const Net* net );
void clear ();
void revalidate ();
inline size_t size () const;
@ -472,6 +481,10 @@ namespace Hurricane {
void setScale ( float );
inline void setTopLeft ( DbU::Unit, DbU::Unit );
inline void setTopLeft ( const Point& );
inline void setQueryFilter ( Query::Mask );
inline void setStartLevel ( int );
inline void setStopLevel ( int );
inline void setRubberShape ( RubberShape );
inline void setHistoryEnable ( bool );
bool scaleHistoryUp ();
bool scaleHistoryDown ();
@ -485,6 +498,10 @@ namespace Hurricane {
inline size_t getHistorySize () const;
inline const float& getScale () const;
inline const Point& getTopLeft () const;
inline Query::Mask getQueryFilter () const;
inline int getStartLevel () const;
inline int getStopLevel () const;
inline RubberShape getRubberShape () const;
private:
class ScaleEntry {
@ -501,6 +518,10 @@ namespace Hurricane {
SelectorCriterions _selection;
bool _showBoundaries;
bool _showSelection;
Query::Mask _queryFilter;
int _startLevel;
int _stopLevel;
RubberShape _rubberShape;
bool _cumulativeSelection;
vector<ScaleEntry> _scaleHistory;
size_t _ihistory;
@ -530,7 +551,6 @@ namespace Hurricane {
DrawingPlanes _drawingPlanes;
DrawingQuery _drawingQuery;
TextDrawingQuery _textDrawingQuery;
int _queryFilter;
int _darkening;
QPoint _mousePosition;
Spot _spot;
@ -544,7 +564,6 @@ namespace Hurricane {
vector<Command*> _commands;
size_t _redrawRectCount;
int _textFontHeight;
RubberShape _rubberShape;
friend class RedrawManager;
};
@ -579,6 +598,14 @@ namespace Hurricane {
{ _enableRedrawInterrupt = state; }
inline void CellWidget::openRefreshSession ()
{ _redrawManager.openRefreshSession (); }
inline void CellWidget::closeRefreshSession ()
{ _redrawManager.closeRefreshSession (); }
inline void CellWidget::DrawingQuery::addDrawExtensionGo ( const Name& name
, InitExtensionGo_t* initExtensionGo
, DrawExtensionGo_t* drawExtensionGo
@ -630,6 +657,17 @@ namespace Hurricane {
{ return _events.size(); }
inline void CellWidget::RedrawManager::openRefreshSession ()
{ _refreshSession++; }
inline void CellWidget::RedrawManager::closeRefreshSession ()
{
_refreshSession--;
if ( !_processing && (_refreshSession == 0) ) process ();
}
inline bool CellWidget::RedrawManager::interrupted () const
{
#ifdef ALLOW_REQUEST_INTERRUPT
@ -733,6 +771,10 @@ namespace Hurricane {
inline CellWidget::State::State ( Cell* cell )
: _cell (cell)
, _selection ()
, _queryFilter (~Query::DoTerminalCells)
, _startLevel (0)
, _stopLevel (99)
, _rubberShape (CellWidget::Steiner)
, _showBoundaries (true)
, _showSelection (false)
, _cumulativeSelection(false)
@ -775,9 +817,23 @@ namespace Hurricane {
inline void CellWidget::State::setTopLeft ( const Point& topLeft )
{
_scaleHistory[_ihistory]._topLeft = topLeft;
}
{ _scaleHistory[_ihistory]._topLeft = topLeft; }
inline void CellWidget::State::setQueryFilter ( Query::Mask mask )
{ _queryFilter = mask; }
inline void CellWidget::State::setStartLevel ( int level )
{ _startLevel = level; }
inline void CellWidget::State::setStopLevel ( int level )
{ _stopLevel = level; }
inline void CellWidget::State::setRubberShape ( RubberShape shape )
{ _rubberShape = shape; }
inline void CellWidget::State::setHistoryEnable ( bool enable )
@ -816,6 +872,22 @@ namespace Hurricane {
{ return _scaleHistory[_ihistory]._topLeft; }
inline Query::Mask CellWidget::State::getQueryFilter () const
{ return _queryFilter; }
inline int CellWidget::State::getStartLevel () const
{ return _startLevel; }
inline int CellWidget::State::getStopLevel () const
{ return _stopLevel; }
inline CellWidget::RubberShape CellWidget::State::getRubberShape () const
{ return _rubberShape; }
inline const float& CellWidget::State::getScale () const
{ return _scaleHistory[_ihistory]._scale; }
@ -845,11 +917,27 @@ namespace Hurricane {
inline void CellWidget::setStartLevel ( int level )
{ _drawingQuery.setStartLevel ( level ); }
{
_drawingQuery.setStartLevel ( level );
_state->setStartLevel ( level );
emit queryFilterChanged ();
}
inline void CellWidget::setStopLevel ( int level )
{ _drawingQuery.setStopLevel ( level ); }
{
_drawingQuery.setStopLevel ( level );
_state->setStopLevel ( level );
emit queryFilterChanged ();
}
inline int CellWidget::getStartLevel () const
{ return _drawingQuery.getStartLevel (); }
inline int CellWidget::getStopLevel () const
{ return _drawingQuery.getStopLevel (); }
inline CellWidget::DrawingPlanes& CellWidget::getDrawingPlanes ()
@ -988,23 +1076,26 @@ namespace Hurricane {
{ return _mousePosition; }
inline void CellWidget::setQueryFilter ( int filter )
{ _queryFilter = filter; }
inline void CellWidget::setQueryFilter ( Query::Mask filter )
{
_state->setQueryFilter ( filter );
emit queryFilterChanged ();
}
inline int CellWidget::getQueryFilter () const
{ return _queryFilter; }
inline Query::Mask CellWidget::getQueryFilter () const
{ return _state->getQueryFilter(); }
inline void CellWidget::setRubberShape ( RubberShape shape )
{
_rubberShape = shape;
refresh ();
_state->setRubberShape ( shape );
emit queryFilterChanged ();
}
inline CellWidget::RubberShape CellWidget::getRubberShape () const
{ return _rubberShape; }
{ return _state->getRubberShape(); }
inline void CellWidget::setPen ( const QPen& pen, size_t plane )

View File

@ -2,7 +2,7 @@
// -*- C++ -*-
//
// This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved
// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved
//
// ===================================================================
//

View File

@ -2,7 +2,7 @@
// -*- C++ -*-
//
// This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved
// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved
//
// ===================================================================
//
@ -46,12 +46,10 @@ namespace Hurricane {
public:
DisplayFilterWidget ( QWidget* parent=NULL );
void setCellWidget ( CellWidget* );
signals:
void filterChanged ();
void queryFilterChanged ();
public slots:
void syncFromCellWidget ();
void changeQueryFilter ();
void startLevelChanged ( int level );
void stopLevelChanged ( int level );
void setDoMasterCells ( int state );
@ -60,6 +58,14 @@ namespace Hurricane {
void setRubberSteiner ();
void setRubberCentric ();
void setRubberBarycentric ();
protected:
void blockAllSignals ( bool state );
protected:
enum UpdateState { External = 0
, InternalEmit
, InternalReceive
};
protected:
CellWidget* _cellWidget;
@ -71,8 +77,7 @@ namespace Hurricane {
QRadioButton* _steiner;
QRadioButton* _centric;
QRadioButton* _barycentric;
int _queryFilter;
bool _signalEmitter;
UpdateState _updateState;
};

View File

@ -2,7 +2,7 @@
// -*- C++ -*-
//
// This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved
// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved
//
// ===================================================================
//
@ -88,7 +88,7 @@ namespace Hurricane {
void historyChanged ( int depth );
void forkInspector ( const QModelIndex& );
protected:
void keyPressEvent ( QKeyEvent* );
bool eventFilter ( QObject*, QEvent* );
private:
void _setRootRecord ( Record* );
void pushSlot ( Slot* );

View File

@ -2,7 +2,7 @@
// -*- C++ -*-
//
// This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved
// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved
//
// ===================================================================
//
@ -116,23 +116,23 @@ namespace Hurricane {
Q_OBJECT;
public:
NetlistWidget ( QWidget* parent=NULL );
inline Cell* getCell ();
template<typename InformationType>
void setCell ( Cell* );
void goTo ( int );
NetlistWidget ( QWidget* parent=NULL );
inline Cell* getCell ();
template<typename InformationType>
void setCell ( Cell* );
void goTo ( int );
signals:
void netSelected ( const Net* );
void netUnselected ( const Net* );
public slots:
void forceRowHeight ();
private slots:
void textFilterChanged ();
// void selectNet ( const QModelIndex& );
// void selectCurrent ( const QModelIndex& , const QModelIndex& );
void updateSelecteds ( const QItemSelection& , const QItemSelection& );
protected:
void keyPressEvent ( QKeyEvent* );
void refreshSessionOpened ();
void refreshSessionClosed ();
void netSelected ( const Net* );
void netUnselected ( const Net* );
void netFitted ( const Net* );
public slots:
void forceRowHeight ();
private slots:
void textFilterChanged ();
void updateSelecteds ( const QItemSelection& , const QItemSelection& );
void fitToNet ();
private:
Cell* _cell;

View File

@ -2,7 +2,7 @@
// -*- C++ -*-
//
// This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved
// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved
//
// ===================================================================
//
@ -77,7 +77,7 @@ namespace Hurricane {
private slots:
void textFilterChanged ();
protected:
virtual void keyPressEvent ( QKeyEvent * event );
virtual bool eventFilter ( QObject*, QEvent* );
virtual void hideEvent ( QHideEvent* event );
private:

View File

@ -44,8 +44,8 @@ namespace Hurricane {
virtual ~SelectorCriterion ();
virtual bool isValid ( CellWidget* ) const = 0;
virtual const Net* getNet () const;
virtual void doSelection ( CellWidget*, bool delayRedraw ) = 0;
virtual void undoSelection ( CellWidget*, bool delayRedraw );
virtual void doSelection ( CellWidget* ) = 0;
virtual void undoSelection ( CellWidget* );
virtual Record* _getRecord () const = 0;
virtual string _getString () const = 0;
virtual string _getTypeName () const = 0;
@ -58,8 +58,8 @@ namespace Hurricane {
virtual ~NetSelectorCriterion ();
virtual const Net* getNet () const;
virtual bool isValid ( CellWidget* ) const;
virtual void doSelection ( CellWidget*, bool delayRedraw );
virtual void undoSelection ( CellWidget*, bool delayRedraw );
virtual void doSelection ( CellWidget* );
virtual void undoSelection ( CellWidget* );
virtual Record* _getRecord () const;
virtual string _getString () const;
virtual string _getTypeName () const;
@ -75,7 +75,7 @@ namespace Hurricane {
virtual ~AreaSelectorCriterion ();
const Box& getArea () const;
virtual bool isValid ( CellWidget* ) const;
virtual void doSelection ( CellWidget*, bool delayRedraw );
virtual void doSelection ( CellWidget* );
virtual Record* _getRecord () const;
virtual string _getString () const;
virtual string _getTypeName () const;