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 << "