184 lines
5.7 KiB
C++
184 lines
5.7 KiB
C++
|
|
// -*- C++ -*-
|
|
|
|
|
|
# include <vector>
|
|
|
|
# include <QHBoxLayout>
|
|
# include <QVBoxLayout>
|
|
# include <QCheckBox>
|
|
# include <QPushButton>
|
|
|
|
# include "hurricane/Name.h"
|
|
# include "hurricane/DataBase.h"
|
|
# include "hurricane/Technology.h"
|
|
# include "hurricane/BasicLayer.h"
|
|
# include "hurricane/BasicLayers.h"
|
|
|
|
# include "hurricane/viewer/Graphics.h"
|
|
# include "hurricane/viewer/PaletteEntry.h"
|
|
# include "hurricane/viewer/LayerPaletteEntry.h"
|
|
# include "hurricane/viewer/GroupPaletteEntry.h"
|
|
# include "hurricane/viewer/ViewerPaletteEntry.h"
|
|
# include "hurricane/viewer/Palette.h"
|
|
# include "hurricane/viewer/CellWidget.h"
|
|
|
|
|
|
namespace Hurricane {
|
|
|
|
|
|
|
|
Palette::Palette ( CellWidget* cellWidget ) : QScrollArea()
|
|
, _cellWidget(cellWidget)
|
|
, _entries()
|
|
, _showAll(NULL)
|
|
, _hideAll(NULL)
|
|
{
|
|
setWidgetResizable ( true );
|
|
|
|
QWidget* adaptator = new QWidget ();
|
|
QVBoxLayout* layout = new QVBoxLayout ();
|
|
|
|
//layout->setContentsMargins ( 0, 0, 0, 0 );
|
|
|
|
vector<DrawingGroup*> groups = Graphics::getStyle()->getDrawingGroups();
|
|
vector<DrawingStyle*> styles = groups[0]->getDrawingStyles();
|
|
|
|
GroupPaletteEntry* gentry = GroupPaletteEntry::create ( this, groups[0]->getName() );
|
|
layout->addWidget ( gentry, 0, Qt::AlignLeft );
|
|
layout->addSpacing ( -5 );
|
|
_entries.push_back ( gentry );
|
|
|
|
for ( size_t si=0 ; si<styles.size() ; si++ ) {
|
|
if ( styles[si]->getName() == DisplayStyle::Foreground ) continue;
|
|
if ( styles[si]->getName() == DisplayStyle::Background ) continue;
|
|
if ( styles[si]->getName() == DisplayStyle::Foreground ) continue;
|
|
if ( styles[si]->getName() == DisplayStyle::SelectionDraw ) continue;
|
|
if ( styles[si]->getName() == DisplayStyle::SelectionFill ) continue;
|
|
if ( styles[si]->getName() == DisplayStyle::Foreground ) continue;
|
|
|
|
ViewerPaletteEntry* entry = ViewerPaletteEntry::create ( this, styles[si]->getName() );
|
|
layout->addWidget ( entry, 0, Qt::AlignLeft );
|
|
_entries.push_back ( entry );
|
|
}
|
|
gentry->setChecked ( false );
|
|
|
|
DataBase* database = DataBase::getDB();
|
|
if ( database ) {
|
|
Technology* technology = database->getTechnology();
|
|
if ( technology ) {
|
|
for ( size_t gi=1 ; gi<groups.size() ; gi++ ) {
|
|
gentry = GroupPaletteEntry::create ( this, groups[gi]->getName() );
|
|
layout->addWidget ( gentry, 0, Qt::AlignLeft );
|
|
layout->addSpacing ( -5 );
|
|
_entries.push_back ( gentry );
|
|
|
|
styles = groups[gi]->getDrawingStyles();
|
|
for ( size_t si=0 ; si<styles.size() ; si++ ) {
|
|
BasicLayer* basicLayer = technology->getBasicLayer ( styles[si]->getName() );
|
|
|
|
if ( basicLayer ) {
|
|
LayerPaletteEntry* entry = LayerPaletteEntry::create ( this, basicLayer );
|
|
layout->addWidget ( entry, 0, Qt::AlignLeft );
|
|
_entries.push_back ( entry );
|
|
}
|
|
}
|
|
gentry->setChecked ( false );
|
|
}
|
|
bool unmatched = false;
|
|
for_each_basic_layer ( basicLayer, technology->getBasicLayers() ) {
|
|
if ( !find(basicLayer->getName()) ) {
|
|
if ( !unmatched ) {
|
|
unmatched = true;
|
|
gentry = GroupPaletteEntry::create ( this, "Unmatcheds" );
|
|
layout->addWidget ( gentry, 0, Qt::AlignLeft );
|
|
layout->addSpacing ( -5 );
|
|
_entries.push_back ( gentry );
|
|
}
|
|
LayerPaletteEntry* entry = LayerPaletteEntry::create ( this, basicLayer );
|
|
layout->addWidget ( entry, 0, Qt::AlignLeft );
|
|
_entries.push_back ( entry );
|
|
|
|
cerr << "[WARNING] BasicLayer \"" << basicLayer->getName()
|
|
<< "\" has no associated DisplayStyle." << endl;
|
|
}
|
|
end_for;
|
|
}
|
|
if ( unmatched )
|
|
gentry->setChecked ( false );
|
|
}
|
|
}
|
|
|
|
_showAll = new QPushButton ( this );
|
|
_showAll->setIcon ( QIcon(":/images/palette_show_all.png") );
|
|
_showAll->setFlat ( true );
|
|
|
|
_hideAll = new QPushButton ( this );
|
|
_hideAll->setIcon ( QIcon(":/images/palette_hide_all.png") );
|
|
_hideAll->setFlat ( true );
|
|
|
|
connect ( _showAll, SIGNAL(clicked()), this, SLOT(showAll()) );
|
|
connect ( _hideAll, SIGNAL(clicked()), this, SLOT(hideAll()) );
|
|
|
|
QHBoxLayout* bottomEntry = new QHBoxLayout ();
|
|
bottomEntry->setContentsMargins ( 0, 0, 0, 0 );
|
|
bottomEntry->addWidget ( _showAll );
|
|
bottomEntry->addWidget ( _hideAll );
|
|
layout->addLayout ( bottomEntry );
|
|
layout->addStretch ();
|
|
|
|
adaptator->setLayout ( layout );
|
|
setWidget ( adaptator );
|
|
setHorizontalScrollBarPolicy ( Qt::ScrollBarAlwaysOff );
|
|
setVerticalScrollBarPolicy ( Qt::ScrollBarAsNeeded );
|
|
setFrameStyle ( QFrame::Plain );
|
|
}
|
|
|
|
|
|
bool Palette::isDrawable ( size_t index )
|
|
{
|
|
if ( index < _entries.size() )
|
|
return _entries[index]->isChecked ();
|
|
|
|
return false;
|
|
}
|
|
|
|
|
|
void Palette::showAll ()
|
|
{
|
|
for ( size_t i=0 ; i<_entries.size() ; i++ )
|
|
if ( !_entries[i]->isGroup() )
|
|
_entries[i]->setChecked ( true );
|
|
|
|
_cellWidget->redraw ();
|
|
}
|
|
|
|
|
|
void Palette::hideAll ()
|
|
{
|
|
for ( size_t i=0 ; i<_entries.size() ; i++ )
|
|
if ( !_entries[i]->isGroup() )
|
|
_entries[i]->setChecked ( false );
|
|
|
|
_cellWidget->redraw ();
|
|
}
|
|
|
|
|
|
void Palette::redrawCellWidget ()
|
|
{
|
|
_cellWidget->redraw ();
|
|
}
|
|
|
|
|
|
PaletteEntry* Palette::find ( const Name& name )
|
|
{
|
|
for ( size_t i=0 ; i<_entries.size() ; i++ ) {
|
|
if ( _entries[i]->getName() == name )
|
|
return _entries[i];
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
|
|
} // End of Hurricane namespace.
|