diff --git a/src/lay/layTechSetupDialog.cc b/src/lay/layTechSetupDialog.cc index c143043ef..996f69a76 100644 --- a/src/lay/layTechSetupDialog.cc +++ b/src/lay/layTechSetupDialog.cc @@ -504,14 +504,6 @@ TechSetupDialog::TechSetupDialog (QWidget *parent) connect (add_pb, SIGNAL (clicked ()), this, SLOT (add_clicked ())); connect (delete_pb, SIGNAL (clicked ()), this, SLOT (delete_clicked ())); connect (rename_pb, SIGNAL (clicked ()), this, SLOT (rename_clicked ())); - - if (s_first_show) { - TipDialog td (this, - tl::to_string (QObject::tr ("To get started with the technology manager, read the documentation provided: About Technology Management.")), - "tech-manager-basic-tips"); - td.exec_dialog (); - s_first_show = false; - } } TechSetupDialog::~TechSetupDialog () @@ -559,6 +551,14 @@ TechSetupDialog::update () int TechSetupDialog::exec (lay::Technologies &technologies) { + if (s_first_show) { + TipDialog td (this, + tl::to_string (QObject::tr ("To get started with the technology manager, read the documentation provided: About Technology Management.")), + "tech-manager-basic-tips"); + td.exec_dialog (); + s_first_show = false; + } + m_technologies = technologies; update (); @@ -613,12 +613,17 @@ BEGIN_PROTECTED QDir root = QDir (tl::to_qstring (lay::TechnologyController::instance ()->default_root ())); QDir tech_dir (root.filePath (tn)); if (tech_dir.exists ()) { - throw tl::Exception (tl::to_string (QObject::tr ("A target folder with path '%1' already exists").arg (tech_dir.path ()))); + if (QMessageBox::question (this, QObject::tr ("Creating Technology"), + QObject::tr ("A target folder with path '%1' already exists\nUse this directory for the new technology?").arg (tech_dir.path ()), + QMessageBox::No | QMessageBox::Yes) == QMessageBox::No) { + throw tl::CancelException (); + } } lay::Technology *nt = new lay::Technology (*t); nt->set_tech_file_path (tl::to_string (tech_dir.absoluteFilePath (tn + QString::fromUtf8 (".lyt")))); + nt->set_default_base_path (tl::to_string (tech_dir.absolutePath ())); nt->set_persisted (false); nt->set_name (tl::to_string (tn)); nt->set_description (std::string ()); @@ -990,9 +995,11 @@ TechSetupDialog::commit_tech_component () mp_current_editor->commit (); } - if (mp_current_tech && mp_current_tech_component && !mp_current_tech->is_readonly ()) { + if (mp_current_tech && !mp_current_tech->is_readonly ()) { - mp_current_tech->set_component (mp_current_tech_component->clone ()); + if (mp_current_tech_component) { + mp_current_tech->set_component (mp_current_tech_component->clone ()); + } // because commit may have changed the description text, update the technology titles for (int i = tech_tree->topLevelItemCount (); i > 0; --i) { diff --git a/src/lay/layTechnologyController.cc b/src/lay/layTechnologyController.cc index d10aa2340..6178f0944 100644 --- a/src/lay/layTechnologyController.cc +++ b/src/lay/layTechnologyController.cc @@ -26,6 +26,7 @@ #include "layMainWindow.h" #include "layApplication.h" #include "layConfig.h" +#include "layQtTools.h" #include "laybasicConfig.h" #include @@ -36,6 +37,8 @@ namespace lay { +static const std::string cfg_tech_editor_window_state ("tech-editor-window-state"); + std::string tech_string_from_name (const std::string &tn) { if (tn.empty ()) { @@ -65,20 +68,18 @@ TechnologyController::instance () } void -TechnologyController::initialize (lay::PluginRoot * /*root*/) -{ - // .. nothing yet .. -} - -void -TechnologyController::initialized (lay::PluginRoot *root) +TechnologyController::initialize (lay::PluginRoot *root) { mp_mw = dynamic_cast (root); if (mp_mw) { mp_editor = new lay::TechSetupDialog (mp_mw); mp_editor->setModal (false); } +} +void +TechnologyController::initialized (lay::PluginRoot * /*root*/) +{ update_menu (); connect_events (); } @@ -94,6 +95,7 @@ void TechnologyController::get_options (std::vector < std::pair > &options) const { options.push_back (std::pair (cfg_initial_technology, "")); + options.push_back (std::pair (cfg_tech_editor_window_state, "")); } void @@ -153,7 +155,12 @@ TechnologyController::update_active_technology () { lay::Technology *active_tech = 0; if (mp_mw && mp_mw->current_view () && mp_mw->current_view ()->active_cellview_index () >= 0 && mp_mw->current_view ()->active_cellview_index () <= int (mp_mw->current_view ()->cellviews ())) { - active_tech = lay::Technologies::instance ()->technology_by_name (mp_mw->current_view ()->active_cellview ()->tech_name ()); + + std::string tn = mp_mw->current_view ()->active_cellview ()->tech_name (); + if (lay::Technologies::instance ()->has_technology (tn)) { + active_tech = lay::Technologies::instance ()->technology_by_name (tn); + } + } if (mp_active_technology != active_tech) { @@ -192,6 +199,7 @@ TechnologyController::technologies_changed () } update_menu (); + emit technologies_edited (); } void @@ -210,6 +218,10 @@ TechnologyController::configure (const std::string &name, const std::string &val m_current_technology_updated = true; } + } else if (name == cfg_tech_editor_window_state) { + + lay::restore_dialog_state (mp_editor, value); + } else if (name == cfg_technologies) { if (! value.empty ()) { @@ -295,6 +307,10 @@ TechnologyController::update_menu () m_current_technology = lay::LayoutView::current ()->active_cellview ()->tech_name (); } + if (! lay::Technologies::instance()->has_technology (m_current_technology)) { + m_current_technology = std::string (); + } + std::string title = tech_string_from_name (m_current_technology); size_t ntech = 0; @@ -307,7 +323,7 @@ TechnologyController::update_menu () for (std::vector::const_iterator t = tech_group.begin (); t != tech_group.end (); ++t) { lay::Action action = pr->menu ()->action (*t); action.set_title (title); - action.set_visible (ntech > 1); + action.set_enabled (ntech > 1); std::vector items = pr->menu ()->items (*t); for (std::vector::const_iterator i = items.begin (); i != items.end (); ++i) { pr->menu ()->delete_item (*i); @@ -428,10 +444,13 @@ TechnologyController::show_editor () QMessageBox::Ok); } - update_menu (); - emit technologies_edited (); + technologies_changed (); } + + if (mp_mw) { + mp_mw->config_set (cfg_tech_editor_window_state, lay::save_dialog_state (mp_editor)); + } } const std::string & diff --git a/src/laybasic/layAbstractMenu.cc b/src/laybasic/layAbstractMenu.cc index 3c62f6bb9..6e5fd7c32 100644 --- a/src/laybasic/layAbstractMenu.cc +++ b/src/laybasic/layAbstractMenu.cc @@ -873,7 +873,6 @@ AbstractMenu::build (QToolBar *t, std::list &items) } } - } QMenu * diff --git a/src/laybasic/layQtTools.cc b/src/laybasic/layQtTools.cc index 6d395e8e9..0ed979770 100644 --- a/src/laybasic/layQtTools.cc +++ b/src/laybasic/layQtTools.cc @@ -103,6 +103,10 @@ save_dialog_state (QWidget *w) void restore_dialog_state (QWidget *dialog, const std::string &s) { + if (! dialog) { + return; + } + tl::Extractor ex (s.c_str ()); while (! ex.at_end ()) {