coriolis/unicorn/src/UnicornGui.cpp

279 lines
7.7 KiB
C++
Raw Normal View History

// -*- C++ -*-
//
// This file is part of the Coriolis Software.
Update to Qt 5, requires cmake 2.8.9. New placer: Etesian. Update to Qt 5: * Change: Now requires at least cmake 2.8.9. * Change: CMakeLists.txt needs small changes. Qt modules must be found one by one (Core, Gui, Widgets). Must add "set(CMAKE_AUTOMOC ON)" in the top file and replace "qt4" prefix in macros by "qt5". Added simpler macro "setup_qt()" in FindBootstrap.cmake. * Change: No longer need to include <QGtkStyle> is is choosen by default according to the current desktop environment. * Change: In <hurricane>, In HApplication, launch ExceptionWidget when a std::exception is catched instead of silently discarting it. New placer Tool: Etesian * New: <etesian> analytical placer. Encapsulate Coloquinte from Gabriel Gouvine. * New: in <documentation>, add stub demonstration ToolEngine <smurf>. Needs to be commented. Miscellaneous: * New: in <boostrap> and <unicorn>, added support for Etesian, the new analytic placer. The tool itself will be added in the next commit. * Bug: in <CellWidget>, when shifting the display buffer, we no longer can copy the buffer on itself (we should never have). Now go through a temporary one (PlaneId::AutoCopy) which is added to the DrawingPlanes. Affect "goLeft()" and "goUp()". * Bug: In <CellWidget>, remove the WA_PaintOnScreen flag/attribute. When it's on, no PaintEvent is transmitted to the CellWidget when it's the central widget of the <CellViewer> (QMainWindow). It's something I still don't understand from the doc of Qt. * Change: In <AreaCommand>, use the PlaneId enumeration instead of a anonymous numerical index. * Change: In <HApplication>, no longer catch and silently discard standartd exceptions but launch the ExceptionWidget... Suppress the now deprecated constructor with "Type" argument. * Change: In <SelectionModel>, the "reset()" method is deprecated in Qt5, instead enclose the "clear()" by a "beginResetModel()" and "endResetModel()" pair. * New: In <crlcore>, add support for ISPD05 benchmarks (in Bookshelf format). Forked from ISPD04 and not finished yet. * Change: In <Mauka>, distinguish the Action string identifier from <Etesian> * New: In <unicorn>, add entry for ISPD05 loader. Add entry for <Etesian> analytic placer.
2014-03-22 05:50:36 -05:00
// Copyright (c) UPMC/LIP6 2008-2014, All Rights Reserved
//
// +-----------------------------------------------------------------+
// | C O R I O L I S |
// | U n i c o r n - M a i n G U I |
// | |
// | Author : Jean-Paul CHAPUT |
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
// | =============================================================== |
// | C++ Module : "./UnicornGui.cpp" |
// +-----------------------------------------------------------------+
Support for Python plugins in CellViewer/Unicorn. ClockTree plugin. * New: In Hurricane, in CellViewer, create a simpler API to graft menu and actions into the menubar. Mainly addToMenu() which take care of the QAction creation but also locate the relevant QMenu, base on the Qt object name. Regroup all the widget & action creation inside the body of the constructor, this way almost all actions can be removed from the attributes of the CellViewer. addToMenu() is supplied in three flavors: 1. For C++ callbacks in GraphicToolEngines (with a binded member function method). 2. For running Python scripts to be used by the plugin system. 3. To insert separator in menus (to give a more homogeneous look). Remove the last remnants of Stratus scripts (unificated with basic Python scripts). * New: In Hurricane, in PyCellViewer, export the interface to graft Python scripts into the CellViewer menu tree. * Change: In Etesian, in GraphicEtesianEngine, use the new API to graft menus & callbacks into the CellViewer. * Change: In Mauka, in GraphicMaukaEngine, use the new API to graft menus & callbacks into the CellViewer. * Change: In Kite, in GraphicKiteEngine, use the new API to graft menus & callbacks into the CellViewer. * New: In Cumulus, install Python scripts as plugins for Unicorn under <PYTHON_SITE_PACKAGES>/cumulus/plugins/. * New: In Unicorn, in UnicornGui, make uses of the new API for creating menus in the CellViewer. Creates the stem menu for the P&R tools. Add a Python initialization mechanism to read the plugins installeds into <PYTHON_SITE_PACKAGES>/cumulus/plugins/.
2014-06-25 12:50:34 -05:00
#include <Python.h>
#include <QAction>
#include <QMenu>
#include "hurricane/Warning.h"
Support for Python plugins in CellViewer/Unicorn. ClockTree plugin. * New: In Hurricane, in CellViewer, create a simpler API to graft menu and actions into the menubar. Mainly addToMenu() which take care of the QAction creation but also locate the relevant QMenu, base on the Qt object name. Regroup all the widget & action creation inside the body of the constructor, this way almost all actions can be removed from the attributes of the CellViewer. addToMenu() is supplied in three flavors: 1. For C++ callbacks in GraphicToolEngines (with a binded member function method). 2. For running Python scripts to be used by the plugin system. 3. To insert separator in menus (to give a more homogeneous look). Remove the last remnants of Stratus scripts (unificated with basic Python scripts). * New: In Hurricane, in PyCellViewer, export the interface to graft Python scripts into the CellViewer menu tree. * Change: In Etesian, in GraphicEtesianEngine, use the new API to graft menus & callbacks into the CellViewer. * Change: In Mauka, in GraphicMaukaEngine, use the new API to graft menus & callbacks into the CellViewer. * Change: In Kite, in GraphicKiteEngine, use the new API to graft menus & callbacks into the CellViewer. * New: In Cumulus, install Python scripts as plugins for Unicorn under <PYTHON_SITE_PACKAGES>/cumulus/plugins/. * New: In Unicorn, in UnicornGui, make uses of the new API for creating menus in the CellViewer. Creates the stem menu for the P&R tools. Add a Python initialization mechanism to read the plugins installeds into <PYTHON_SITE_PACKAGES>/cumulus/plugins/.
2014-06-25 12:50:34 -05:00
#include "hurricane/viewer/Script.h"
#include "hurricane/viewer/CellViewer.h"
#include "hurricane/viewer/PyCellViewer.h"
#include "crlcore/Catalog.h"
#include "crlcore/AllianceFramework.h"
#include "crlcore/GraphicToolEngine.h"
#include "crlcore/DefExport.h"
#include "unicorn/ImportCell.h"
#include "unicorn/OpenCellDialog.h"
#include "unicorn/SaveCellDialog.h"
#include "unicorn/ImportCellDialog.h"
#include "unicorn/ExportCellDialog.h"
#include "unicorn/UnicornGui.h"
namespace Unicorn {
Support for Python plugins in CellViewer/Unicorn. ClockTree plugin. * New: In Hurricane, in CellViewer, create a simpler API to graft menu and actions into the menubar. Mainly addToMenu() which take care of the QAction creation but also locate the relevant QMenu, base on the Qt object name. Regroup all the widget & action creation inside the body of the constructor, this way almost all actions can be removed from the attributes of the CellViewer. addToMenu() is supplied in three flavors: 1. For C++ callbacks in GraphicToolEngines (with a binded member function method). 2. For running Python scripts to be used by the plugin system. 3. To insert separator in menus (to give a more homogeneous look). Remove the last remnants of Stratus scripts (unificated with basic Python scripts). * New: In Hurricane, in PyCellViewer, export the interface to graft Python scripts into the CellViewer menu tree. * Change: In Etesian, in GraphicEtesianEngine, use the new API to graft menus & callbacks into the CellViewer. * Change: In Mauka, in GraphicMaukaEngine, use the new API to graft menus & callbacks into the CellViewer. * Change: In Kite, in GraphicKiteEngine, use the new API to graft menus & callbacks into the CellViewer. * New: In Cumulus, install Python scripts as plugins for Unicorn under <PYTHON_SITE_PACKAGES>/cumulus/plugins/. * New: In Unicorn, in UnicornGui, make uses of the new API for creating menus in the CellViewer. Creates the stem menu for the P&R tools. Add a Python initialization mechanism to read the plugins installeds into <PYTHON_SITE_PACKAGES>/cumulus/plugins/.
2014-06-25 12:50:34 -05:00
using Hurricane::dbo_ptr;
using Hurricane::Warning;
using Hurricane::PyCellViewer_Link;
Support for Python plugins in CellViewer/Unicorn. ClockTree plugin. * New: In Hurricane, in CellViewer, create a simpler API to graft menu and actions into the menubar. Mainly addToMenu() which take care of the QAction creation but also locate the relevant QMenu, base on the Qt object name. Regroup all the widget & action creation inside the body of the constructor, this way almost all actions can be removed from the attributes of the CellViewer. addToMenu() is supplied in three flavors: 1. For C++ callbacks in GraphicToolEngines (with a binded member function method). 2. For running Python scripts to be used by the plugin system. 3. To insert separator in menus (to give a more homogeneous look). Remove the last remnants of Stratus scripts (unificated with basic Python scripts). * New: In Hurricane, in PyCellViewer, export the interface to graft Python scripts into the CellViewer menu tree. * Change: In Etesian, in GraphicEtesianEngine, use the new API to graft menus & callbacks into the CellViewer. * Change: In Mauka, in GraphicMaukaEngine, use the new API to graft menus & callbacks into the CellViewer. * Change: In Kite, in GraphicKiteEngine, use the new API to graft menus & callbacks into the CellViewer. * New: In Cumulus, install Python scripts as plugins for Unicorn under <PYTHON_SITE_PACKAGES>/cumulus/plugins/. * New: In Unicorn, in UnicornGui, make uses of the new API for creating menus in the CellViewer. Creates the stem menu for the P&R tools. Add a Python initialization mechanism to read the plugins installeds into <PYTHON_SITE_PACKAGES>/cumulus/plugins/.
2014-06-25 12:50:34 -05:00
using CRL::System;
using CRL::Catalog;
using CRL::AllianceFramework;
using CRL::DefExport;
// -------------------------------------------------------------------
// Class : "UnicornGui".
Banner UnicornGui::_banner ( "Unicorn"
, "1.0b"
, "Coriolis Main GUI"
, "2008"
, "Jean-Paul Chaput"
, ""
);
UnicornGui::UnicornGui ( QWidget* parent )
: CellViewer (parent)
, _tools ()
, _importDialog(new ImportCellDialog(this))
, _exportDialog(new ExportCellDialog(this))
Support for Python plugins in CellViewer/Unicorn. ClockTree plugin. * New: In Hurricane, in CellViewer, create a simpler API to graft menu and actions into the menubar. Mainly addToMenu() which take care of the QAction creation but also locate the relevant QMenu, base on the Qt object name. Regroup all the widget & action creation inside the body of the constructor, this way almost all actions can be removed from the attributes of the CellViewer. addToMenu() is supplied in three flavors: 1. For C++ callbacks in GraphicToolEngines (with a binded member function method). 2. For running Python scripts to be used by the plugin system. 3. To insert separator in menus (to give a more homogeneous look). Remove the last remnants of Stratus scripts (unificated with basic Python scripts). * New: In Hurricane, in PyCellViewer, export the interface to graft Python scripts into the CellViewer menu tree. * Change: In Etesian, in GraphicEtesianEngine, use the new API to graft menus & callbacks into the CellViewer. * Change: In Mauka, in GraphicMaukaEngine, use the new API to graft menus & callbacks into the CellViewer. * Change: In Kite, in GraphicKiteEngine, use the new API to graft menus & callbacks into the CellViewer. * New: In Cumulus, install Python scripts as plugins for Unicorn under <PYTHON_SITE_PACKAGES>/cumulus/plugins/. * New: In Unicorn, in UnicornGui, make uses of the new API for creating menus in the CellViewer. Creates the stem menu for the P&R tools. Add a Python initialization mechanism to read the plugins installeds into <PYTHON_SITE_PACKAGES>/cumulus/plugins/.
2014-06-25 12:50:34 -05:00
{
addMenu ( "placeAndRoute" , "P&&R" , CellViewer::TopMenu );
addMenu ( "placeAndRoute.stepByStep", "&Step by Step" );
addToMenu( "placeAndRoute.========" );
_runUnicornInit();
}
UnicornGui::~UnicornGui ()
{ }
Support for Python plugins in CellViewer/Unicorn. ClockTree plugin. * New: In Hurricane, in CellViewer, create a simpler API to graft menu and actions into the menubar. Mainly addToMenu() which take care of the QAction creation but also locate the relevant QMenu, base on the Qt object name. Regroup all the widget & action creation inside the body of the constructor, this way almost all actions can be removed from the attributes of the CellViewer. addToMenu() is supplied in three flavors: 1. For C++ callbacks in GraphicToolEngines (with a binded member function method). 2. For running Python scripts to be used by the plugin system. 3. To insert separator in menus (to give a more homogeneous look). Remove the last remnants of Stratus scripts (unificated with basic Python scripts). * New: In Hurricane, in PyCellViewer, export the interface to graft Python scripts into the CellViewer menu tree. * Change: In Etesian, in GraphicEtesianEngine, use the new API to graft menus & callbacks into the CellViewer. * Change: In Mauka, in GraphicMaukaEngine, use the new API to graft menus & callbacks into the CellViewer. * Change: In Kite, in GraphicKiteEngine, use the new API to graft menus & callbacks into the CellViewer. * New: In Cumulus, install Python scripts as plugins for Unicorn under <PYTHON_SITE_PACKAGES>/cumulus/plugins/. * New: In Unicorn, in UnicornGui, make uses of the new API for creating menus in the CellViewer. Creates the stem menu for the P&R tools. Add a Python initialization mechanism to read the plugins installeds into <PYTHON_SITE_PACKAGES>/cumulus/plugins/.
2014-06-25 12:50:34 -05:00
void UnicornGui::_runUnicornInit ()
{
Utilities::Path pythonSitePackages = System::getPath("pythonSitePackages");
Utilities::Path systemConfDir = pythonSitePackages / "unicorn";
Utilities::Path systemConfFile = systemConfDir / "unicornInit.py";
if (systemConfFile.exists()) {
Isobar::Script::addPath( systemConfDir.string() );
dbo_ptr<Isobar::Script> script = Isobar::Script::create( systemConfFile.stem().string() );
script->addKwArgument( "editor" , (PyObject*)PyCellViewer_Link(this) );
script->runFunction ( "unicornConfigure", getCell() );
Support for Python plugins in CellViewer/Unicorn. ClockTree plugin. * New: In Hurricane, in CellViewer, create a simpler API to graft menu and actions into the menubar. Mainly addToMenu() which take care of the QAction creation but also locate the relevant QMenu, base on the Qt object name. Regroup all the widget & action creation inside the body of the constructor, this way almost all actions can be removed from the attributes of the CellViewer. addToMenu() is supplied in three flavors: 1. For C++ callbacks in GraphicToolEngines (with a binded member function method). 2. For running Python scripts to be used by the plugin system. 3. To insert separator in menus (to give a more homogeneous look). Remove the last remnants of Stratus scripts (unificated with basic Python scripts). * New: In Hurricane, in PyCellViewer, export the interface to graft Python scripts into the CellViewer menu tree. * Change: In Etesian, in GraphicEtesianEngine, use the new API to graft menus & callbacks into the CellViewer. * Change: In Mauka, in GraphicMaukaEngine, use the new API to graft menus & callbacks into the CellViewer. * Change: In Kite, in GraphicKiteEngine, use the new API to graft menus & callbacks into the CellViewer. * New: In Cumulus, install Python scripts as plugins for Unicorn under <PYTHON_SITE_PACKAGES>/cumulus/plugins/. * New: In Unicorn, in UnicornGui, make uses of the new API for creating menus in the CellViewer. Creates the stem menu for the P&R tools. Add a Python initialization mechanism to read the plugins installeds into <PYTHON_SITE_PACKAGES>/cumulus/plugins/.
2014-06-25 12:50:34 -05:00
Isobar::Script::removePath( systemConfDir.string() );
} else {
cerr << Warning("System configuration file:\n <%s> not found."
,systemConfFile.string().c_str()) << endl;
}
}
UnicornGui* UnicornGui::create ( QWidget* parent )
{
UnicornGui* unicorn = new UnicornGui ( parent );
unicorn->_postCreate ();
return unicorn;
}
void UnicornGui::destroy ()
{
_preDestroy ();
delete this;
}
void UnicornGui::_postCreate ()
{
setApplicationName ( tr("unicorn") );
setWindowIcon ( QIcon(":/images/diet-coke.png") );
QAction* openAction = findChild<QAction*>("viewer.menuBar.file.openCell");
if ( openAction ) {
connect ( openAction, SIGNAL(triggered()), this, SLOT(openCell()) );
}
QAction* saveAction = findChild<QAction*>("viewer.menuBar.file.saveCell");
if ( saveAction ) {
saveAction->setVisible ( true );
connect ( saveAction, SIGNAL(triggered()), this, SLOT(saveCell()) );
}
QAction* importAction = findChild<QAction*>("viewer.menuBar.file.importCell");
if ( importAction ) {
connect ( importAction, SIGNAL(triggered()), this, SLOT(importCell()) );
}
QAction* exportAction = findChild<QAction*>("viewer.menuBar.file.exportCell");
if ( exportAction ) {
connect ( exportAction, SIGNAL(triggered()), this, SLOT(exportCell()) );
}
}
void UnicornGui::_preDestroy ()
{
set<GraphicTool*>::iterator itool = _tools.begin();
for ( ; itool != _tools.end() ; itool++ )
(*itool)->release ();
}
Cell* UnicornGui::getCellFromDb ( const char* name )
{
return AllianceFramework::get()->getCell ( name, Catalog::State::Views );
}
void UnicornGui::registerTool ( GraphicTool* tool )
{
assert ( tool != NULL );
if ( _tools.find(tool) != _tools.end() ) {
cerr << Warning ( "Tool %s already registered in Unicorn (ignored)."
, getString(tool->getName()).c_str() ) << endl;
return;
}
_tools.insert ( tool );
const GraphicTool::DrawGoMap& drawGos = tool->getDrawGos ();
GraphicTool::DrawGoMap::const_iterator idrawGo = drawGos.begin();
for ( ; idrawGo != drawGos.end() ; idrawGo++ )
getCellWidget()->addDrawExtensionGo ( idrawGo->first
, idrawGo->second.getInit()
, idrawGo->second.getDraw()
);
tool->addToMenu ( this );
}
void UnicornGui::openCell ()
{
UnicornGui* viewer = this;
QString cellName;
bool newViewer;
if ( OpenCellDialog::runDialog ( this, cellName, newViewer ) ) {
Cell* cell = getCellFromDb ( cellName.toStdString().c_str() );
if ( cell ) {
if ( newViewer ) {
viewer = UnicornGui::create ();
viewer->show ();
}
viewer->setCell ( cell );
} else
cerr << "[ERROR] Cell not found: " << cellName.toStdString() << endl;
}
}
void UnicornGui::importCell ()
{
QString cellName;
bool newViewer;
int format;
if ( _importDialog->runDialog( cellName, format, newViewer ) ) {
Cell* cell = ImportCell::load( cellName.toStdString(), format );
if (cell) {
UnicornGui* viewer = this;
if (newViewer) {
viewer = UnicornGui::create();
viewer->show();
}
viewer->setCell( cell );
}
}
}
void UnicornGui::exportCell ()
{
Cell* cell = getCell();
if ( cell == NULL ) return;
QString cellName= getString(cell->getName()).c_str();
int format;
if ( _exportDialog->runDialog ( cellName, format ) ) {
renameCell ( cellName.toStdString().c_str() );
switch ( format ) {
// case ImportCellDialog::AcmSigda:
// break;
// case ImportCellDialog::Ispd04:
// break;
// case ImportCellDialog::Iccad04:
// break;
case ExportCellDialog::AllianceDef:
DefExport::drive ( cell, DefExport::WithLEF );
break;
}
}
}
void UnicornGui::saveCell ()
{
Cell* cell = getCell();
if ( cell == NULL ) return;
QString cellName = getString(cell->getName()).c_str();
if ( SaveCellDialog::runDialog ( this, cellName ) ) {
renameCell ( cellName.toStdString().c_str() );
AllianceFramework::get()->saveCell ( cell, Catalog::State::Views );
}
}
string UnicornGui::_getString () const
{
ostringstream s;
s << "<UnicornGui ";
Cell* cell = getCell();
if (cell) s << getString(cell->getName());
else s << "No_Cell_Loaded";
s << ">";
return s.str();
}
} // End of Unicorn namespace.
//INSPECTOR_P_SUPPORT(Unicorn::UnicornGui)