diff --git a/src/lay/SaltGrainPropertiesDialog.ui b/src/lay/SaltGrainPropertiesDialog.ui index 1f8cc352f..f503a7832 100644 --- a/src/lay/SaltGrainPropertiesDialog.ui +++ b/src/lay/SaltGrainPropertiesDialog.ui @@ -41,100 +41,10 @@ 0 - - - - - 16777215 - 80 - - - - - - - - Qt::Vertical - - - QSizePolicy::Fixed - - - - 20 - 5 - - - - - - - - - 0 - 0 - - - - <a href="%1">Open link</a> - - - true - - - - - - - - 75 - true - - - - Author contact - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - 75 - true - - - - License - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - Qt::Vertical - - - QSizePolicy::Fixed - - - - 20 - 5 - - - - - + @@ -150,71 +60,7 @@ - - - - Qt::Vertical - - - - 20 - 32 - - - - - - - - - 75 - true - - - - Title - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - 75 - true - - - - Depends on - - - Qt::AlignRight|Qt::AlignTop|Qt::AlignTrailing - - - - - - - - 75 - true - - - - Version - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - + @@ -232,118 +78,58 @@ + + + + + + + + 75 + true + + + + Depends on + + + Qt::AlignRight|Qt::AlignTop|Qt::AlignTrailing + + + - - - - QFrame::NoFrame - - - QFrame::Raised - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 0 - 0 - - - - - - - - Qt::NoFocus - - - ... - - - - :/warn.png:/warn.png - - - true - - - - - - - - + + 0 0 - - QFrame::NoFrame + + <a href="%1">Open link</a> - - QFrame::Raised + + true - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 0 - 0 - - - - - - - - Qt::NoFocus - - - ... - - - - :/warn.png:/warn.png - - - true - - - - - + + + + Qt::Vertical + + + + 20 + 32 + + + + + @@ -468,8 +254,8 @@ - - + + 75 @@ -477,42 +263,46 @@ - Images - - - Qt::AlignRight|Qt::AlignTop|Qt::AlignTrailing - - - - - - - - true - - - - (use numeric versions like "1.5" or "2.1.3") - - - - - - - - 75 - true - - - - Author + Title Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - + + + + + 75 + true + + + + API version + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 75 + true + + + + Author contact + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + @@ -680,7 +470,209 @@ - + + + + + 0 + 0 + + + + QFrame::NoFrame + + + QFrame::Raised + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + + + + + Qt::NoFocus + + + ... + + + + :/warn.png:/warn.png + + + true + + + + + + + + + + + true + + + + (license information like "GPLv3" or "MIT") + + + + + + + + 75 + true + + + + Version + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 75 + true + + + + Images + + + Qt::AlignRight|Qt::AlignTop|Qt::AlignTrailing + + + + + + + + 0 + 0 + + + + QFrame::NoFrame + + + QFrame::Raised + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + + + + + Qt::NoFocus + + + ... + + + + :/warn.png:/warn.png + + + true + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 5 + + + + + + + + + true + + + + (use numeric versions like "1.5" or "2.1.3") + + + + + + + + 75 + true + + + + License + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + @@ -696,19 +688,7 @@ - - - - - true - - - - (license information like "GPLv3" or "MIT") - - - - + QFrame::NoFrame @@ -762,6 +742,110 @@ + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 5 + + + + + + + + + 16777215 + 80 + + + + + + + + + 75 + true + + + + Author + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + QFrame::NoFrame + + + QFrame::Raised + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + + Qt::NoFocus + + + ... + + + + :/warn.png:/warn.png + + + true + + + + + + + + + + + true + + + + (API version required - i.e. "0.25") + + + diff --git a/src/lay/images/empty_12.png b/src/lay/images/empty_12.png new file mode 100644 index 000000000..989ee8a3f Binary files /dev/null and b/src/lay/images/empty_12.png differ diff --git a/src/lay/images/file_12.png b/src/lay/images/file_12.png new file mode 100644 index 000000000..5113c3262 Binary files /dev/null and b/src/lay/images/file_12.png differ diff --git a/src/lay/images/folder_12.png b/src/lay/images/folder_12.png new file mode 100644 index 000000000..99459e601 Binary files /dev/null and b/src/lay/images/folder_12.png differ diff --git a/src/lay/layResources.qrc b/src/lay/layResources.qrc index 52e7bc522..6d7bbd6b0 100644 --- a/src/lay/layResources.qrc +++ b/src/lay/layResources.qrc @@ -123,6 +123,9 @@ images/marked_24.png images/marked_64.png images/marked_16.png + images/folder_12.png + images/file_12.png + images/empty_12.png syntax/ruby.xml diff --git a/src/lay/laySaltGrain.cc b/src/lay/laySaltGrain.cc index e3fe54985..83ed47e4f 100644 --- a/src/lay/laySaltGrain.cc +++ b/src/lay/laySaltGrain.cc @@ -46,6 +46,7 @@ SaltGrain::operator== (const SaltGrain &other) const return m_name == other.m_name && m_path == other.m_path && m_version == other.m_version && + m_api_version == other.m_api_version && m_url == other.m_url && m_title == other.m_title && m_doc == other.m_doc && @@ -72,6 +73,12 @@ SaltGrain::set_version (const std::string &v) m_version = v; } +void +SaltGrain::set_api_version (const std::string &v) +{ + m_api_version = v; +} + void SaltGrain::set_path (const std::string &p) { @@ -301,6 +308,7 @@ struct ImageConverter static tl::XMLElementList s_xml_elements = tl::make_member (&SaltGrain::name, &SaltGrain::set_name, "name") + tl::make_member (&SaltGrain::version, &SaltGrain::set_version, "version") + + tl::make_member (&SaltGrain::api_version, &SaltGrain::set_api_version, "api-version") + tl::make_member (&SaltGrain::title, &SaltGrain::set_title, "title") + tl::make_member (&SaltGrain::doc, &SaltGrain::set_doc, "doc") + tl::make_member (&SaltGrain::doc_url, &SaltGrain::set_doc_url, "doc-url") + diff --git a/src/lay/laySaltGrain.h b/src/lay/laySaltGrain.h index df30e7f49..9f92763db 100644 --- a/src/lay/laySaltGrain.h +++ b/src/lay/laySaltGrain.h @@ -161,6 +161,23 @@ public: */ void set_version (const std::string &v); + /** + * @brief Gets the API version of the grain + * + * The API version is the KLayout version required to run the grain's macros. + * A version string is of the form "x.y..." where x, y and other version + * components are integer numbers. + */ + const std::string &api_version () const + { + return m_api_version; + } + + /** + * @brief Sets the API version of the grain + */ + void set_api_version (const std::string &v); + /** * @brief Gets the author of the grain */ @@ -403,6 +420,7 @@ public: private: std::string m_name; std::string m_version; + std::string m_api_version; std::string m_path; std::string m_url; std::string m_title; diff --git a/src/lay/laySaltGrainDetailsTextWidget.cc b/src/lay/laySaltGrainDetailsTextWidget.cc index 310a18a6e..660eed4d1 100644 --- a/src/lay/laySaltGrainDetailsTextWidget.cc +++ b/src/lay/laySaltGrainDetailsTextWidget.cc @@ -28,6 +28,8 @@ #include #include #include +#include +#include namespace lay { @@ -116,6 +118,37 @@ SaltGrainDetailsTextWidget::loadResource (int type, const QUrl &url) } } +static void produce_listing (QTextStream &stream, QDir dir, int level) +{ + for (int i = 0; i < level + 1; ++i) { + stream << "  "; + } + stream << "  "; + if (level > 0) { + stream << tl::escaped_to_html (tl::to_string (dir.dirName ())).c_str (); + } else { + stream << tl::escaped_to_html (tl::to_string (dir.absolutePath ())).c_str (); + } + stream << "
\n"; + + level += 1; + + QStringList entries = dir.entryList (QDir::AllEntries | QDir::NoDotAndDotDot, QDir::Name); + for (QStringList::const_iterator e = entries.begin (); e != entries.end (); ++e) { + + QFileInfo fi (dir.filePath (*e)); + if (fi.isDir ()) { + produce_listing (stream, QDir (fi.filePath ()), level); + } else { + for (int i = 0; i < level + 1; ++i) { + stream << "  "; + } + stream << "  " << tl::escaped_to_html (tl::to_string (*e)).c_str () << "
\n"; + } + + } +} + QString SaltGrainDetailsTextWidget::details_text () { @@ -196,6 +229,12 @@ SaltGrainDetailsTextWidget::details_text () } stream << "

"; + stream << "

"; + if (! g->api_version ().empty ()) { + stream << "" << QObject::tr ("API version") << ": " << tl::to_qstring (tl::escaped_to_html (g->api_version ())) << " "; + } + stream << "

"; + stream << "

"; if (! g->doc_url ().empty ()) { stream << "" << QObject::tr ("Documentation link") << ": doc_url ()) << "\">" << tl::to_qstring (tl::escaped_to_html (g->doc_url ())) << ""; @@ -215,7 +254,6 @@ SaltGrainDetailsTextWidget::details_text () stream << "
"; stream << "

" << QObject::tr ("Installation") << "

"; - stream << "

" << QObject::tr ("Installation path: ") << "" << tl::to_qstring (tl::escaped_to_html (g->path ())) << "

"; if (! g->url ().empty ()) { stream << "

" << QObject::tr ("Download URL: ") << "" << tl::to_qstring (tl::escaped_to_html (g->url ())) << "

"; } @@ -235,6 +273,12 @@ SaltGrainDetailsTextWidget::details_text () stream << "

"; } + if (! g->path ().empty ()) { + stream << "

" << QObject::tr ("Installed files: ") << "

"; + produce_listing (stream, QDir (tl::to_qstring (g->path ())), 0); + stream << "

"; + } + stream << ""; stream << ""; diff --git a/src/lay/laySaltGrainPropertiesDialog.cc b/src/lay/laySaltGrainPropertiesDialog.cc index c3ce4244c..f1786a553 100644 --- a/src/lay/laySaltGrainPropertiesDialog.cc +++ b/src/lay/laySaltGrainPropertiesDialog.cc @@ -160,6 +160,7 @@ SaltGrainPropertiesDialog::update_controls () dependencies_alert->clear (); version->setText (tl::to_qstring (m_grain.version ())); + api_version->setText (tl::to_qstring (m_grain.api_version ())); title->setText (tl::to_qstring (m_grain.title ())); author->setText (tl::to_qstring (m_grain.author ())); author_contact->setText (tl::to_qstring (m_grain.author_contact ())); @@ -222,6 +223,7 @@ void SaltGrainPropertiesDialog::update_data () { m_grain.set_version (tl::to_string (version->text ())); + m_grain.set_api_version (tl::to_string (api_version->text ())); m_grain.set_title (tl::to_string (title->text ())); m_grain.set_author (tl::to_string (author->text ())); m_grain.set_author_contact (tl::to_string (author_contact->text ())); @@ -524,6 +526,12 @@ SaltGrainPropertiesDialog::accept () version_alert->error () << tr ("'%1' is not a valid version string. A version string needs to be numeric (like '1.2.3' or '4.5'').").arg (tl::to_qstring (m_grain.version ())); } + // API version + api_version_alert->clear (); + if (! m_grain.api_version ().empty () && ! SaltGrain::valid_version (m_grain.api_version ())) { + api_version_alert->error () << tr ("'%1' is not a valid API version string. An API version string needs to be numeric (like '0.25'').").arg (tl::to_qstring (m_grain.api_version ())); + } + // doc URL doc_url_alert->clear (); if (! m_grain.doc_url ().empty ()) { @@ -595,7 +603,8 @@ SaltGrainPropertiesDialog::accept () if (!license_alert->needs_attention () && !doc_url_alert->needs_attention () && !dependencies_alert->needs_attention () && - !version_alert->needs_attention ()) { + !version_alert->needs_attention () && + !api_version_alert->needs_attention ()) { QDialog::accept (); } else { if (QMessageBox::warning (this, tr ("Issues Encountered"), diff --git a/src/lay/laySaltManagerDialog.cc b/src/lay/laySaltManagerDialog.cc index 295b0fa71..e1ab7d007 100644 --- a/src/lay/laySaltManagerDialog.cc +++ b/src/lay/laySaltManagerDialog.cc @@ -217,6 +217,9 @@ SaltManagerDialog::SaltManagerDialog (QWidget *parent, lay::Salt *salt, const st void SaltManagerDialog::mode_changed () { + // commits edits: + setFocus (Qt::NoFocusReason); + QList sizes; if (m_current_tab == 0) { sizes = splitter->sizes (); @@ -747,12 +750,8 @@ BEGIN_PROTECTED details_update_frame->setEnabled (g != 0); - QString html; - SaltGrain *remote_grain = get_remote_grain_info (g, html); - + SaltGrain *remote_grain = get_remote_grain_info (g, details_update_text); m_remote_update_grain.reset (remote_grain); - details_update_text->set_grain (remote_grain); - details_update_text->setHtml (html); END_PROTECTED } @@ -768,18 +767,14 @@ BEGIN_PROTECTED details_new_frame->setEnabled (g != 0); - QString html; - SaltGrain *remote_grain = get_remote_grain_info (g, html); - + SaltGrain *remote_grain = get_remote_grain_info (g, details_new_text); m_remote_new_grain.reset (remote_grain); - details_new_text->set_grain (remote_grain); - details_new_text->setHtml (html); END_PROTECTED } lay::SaltGrain * -SaltManagerDialog::get_remote_grain_info (lay::SaltGrain *g, QString &html) +SaltManagerDialog::get_remote_grain_info (lay::SaltGrain *g, SaltGrainDetailsTextWidget *details) { if (! g) { return 0; @@ -795,7 +790,7 @@ SaltManagerDialog::get_remote_grain_info (lay::SaltGrain *g, QString &html) throw tl::Exception (tl::to_string (tr ("No download link available"))); } - html = tr ( + QString html = tr ( "" "" "" @@ -807,6 +802,8 @@ SaltManagerDialog::get_remote_grain_info (lay::SaltGrain *g, QString &html) ) .arg (tl::to_qstring (SaltGrain::spec_url (g->url ()))); + details->setHtml (html); + QApplication::processEvents (QEventLoop::ExcludeUserInputEvents); tl::InputStream stream (SaltGrain::spec_url (g->url ())); @@ -822,11 +819,13 @@ SaltManagerDialog::get_remote_grain_info (lay::SaltGrain *g, QString &html) throw tl::Exception (tl::to_string (tr ("Version mismatch between repository and actual package (repository: %1, package: %2)").arg (tl::to_qstring (g->version ())).arg (tl::to_qstring (remote_grain->version ())))); } + details->set_grain (remote_grain.get ()); + } catch (tl::Exception &ex) { remote_grain.reset (0); - html = tr ( + QString html = tr ( "" "" "" @@ -840,6 +839,8 @@ SaltManagerDialog::get_remote_grain_info (lay::SaltGrain *g, QString &html) .arg (tl::to_qstring (SaltGrain::spec_url (g->url ()))) .arg (tl::to_qstring (tl::escaped_to_html (ex.msg ()))); + details->setHtml (html); + } return remote_grain.release (); diff --git a/src/lay/laySaltManagerDialog.h b/src/lay/laySaltManagerDialog.h index f73d07674..88493198d 100644 --- a/src/lay/laySaltManagerDialog.h +++ b/src/lay/laySaltManagerDialog.h @@ -168,7 +168,7 @@ private: SaltGrain *current_grain (); void update_models (); void update_apply_state (); - SaltGrain *get_remote_grain_info (lay::SaltGrain *g, QString &html); + SaltGrain *get_remote_grain_info (lay::SaltGrain *g, SaltGrainDetailsTextWidget *details); }; }