diff --git a/src/lay/SaltManagerDialog.ui b/src/lay/SaltManagerDialog.ui
index 0a4bcf96c..9194d7715 100644
--- a/src/lay/SaltManagerDialog.ui
+++ b/src/lay/SaltManagerDialog.ui
@@ -21,7 +21,7 @@
- Installed Packages
+ Browse Installed Packages
-
@@ -410,7 +410,7 @@
- Install New Packages
+ Install or Update Packages
-
diff --git a/src/lay/laySaltManagerDialog.cc b/src/lay/laySaltManagerDialog.cc
index 09d4a66ed..5ce7cd4eb 100644
--- a/src/lay/laySaltManagerDialog.cc
+++ b/src/lay/laySaltManagerDialog.cc
@@ -27,6 +27,7 @@
#include "ui_SaltGrainTemplateSelectionDialog.h"
#include "tlString.h"
#include "tlExceptions.h"
+#include "tlHttpStream.h"
#include
#include
@@ -130,6 +131,7 @@ lay::Salt *get_salt ()
lay::Salt salt_mine;
void make_salt_mine ()
{
+ salt_mine = lay::Salt ();
salt_mine.load ("/home/matthias/salt.mine");
}
lay::Salt *get_salt_mine ()
@@ -175,7 +177,10 @@ SaltManagerDialog::SaltManagerDialog (QWidget *parent)
connect (salt_view->selectionModel (), SIGNAL (currentChanged (const QModelIndex &, const QModelIndex &)), this, SLOT (current_changed ()));
connect (salt_mine_view->selectionModel (), SIGNAL (currentChanged (const QModelIndex &, const QModelIndex &)), this, SLOT (mine_current_changed ()));
- // @@@
+ search_installed_edit->set_clear_button_enabled (true);
+ search_new_edit->set_clear_button_enabled (true);
+ connect (search_installed_edit, SIGNAL (textChanged (const QString &)), this, SLOT (search_text_changed (const QString &)));
+ connect (search_new_edit, SIGNAL (textChanged (const QString &)), this, SLOT (search_text_changed (const QString &)));
}
void
@@ -189,6 +194,45 @@ SaltManagerDialog::mode_changed ()
}
}
+void
+SaltManagerDialog::search_text_changed (const QString &text)
+{
+ QListView *view = 0;
+ if (sender () == search_installed_edit) {
+ view = salt_view;
+ } else if (sender () == search_new_edit) {
+ view = salt_mine_view;
+ } else {
+ return;
+ }
+
+ SaltModel *model = dynamic_cast (view->model ());
+ if (! model) {
+ return;
+ }
+
+ if (text.isEmpty ()) {
+
+ for (int i = model->rowCount (QModelIndex ()); i > 0; ) {
+ --i;
+ view->setRowHidden (i, false);
+ }
+
+ } else {
+
+ QRegExp re (text, Qt::CaseInsensitive);
+
+ for (int i = model->rowCount (QModelIndex ()); i > 0; ) {
+ --i;
+ QModelIndex index = model->index (i, 0, QModelIndex ());
+ SaltGrain *g = model->grain_from_index (index);
+ bool hidden = (!g || re.indexIn (tl::to_qstring (g->name ())) < 0);
+ view->setRowHidden (i, hidden);
+ }
+
+ }
+}
+
void
SaltManagerDialog::edit_properties ()
{
@@ -335,9 +379,63 @@ SaltManagerDialog::salt_mine_changed ()
void
SaltManagerDialog::mine_current_changed ()
{
+BEGIN_PROTECTED
+
SaltGrain *g = mine_current_grain ();
- details_new_text->set_grain (g);
details_new_frame->setEnabled (g != 0);
+
+ if (! g) {
+ details_new_text->set_grain (0);
+ return;
+ }
+
+ m_remote_grain.reset (0);
+
+ // Download actual grain definition file
+ try {
+
+ if (g->url ().empty ()) {
+ throw tl::Exception (tl::to_string (tr ("No download link available")));
+ }
+
+ tl::InputHttpStream http (SaltGrain::spec_url (g->url ()));
+ tl::InputStream stream (http);
+
+ m_remote_grain.reset (new SaltGrain ());
+ m_remote_grain->load (stream);
+ m_remote_grain->set_url (g->url ());
+
+ if (g->name () != m_remote_grain->name ()) {
+ throw tl::Exception (tl::to_string (tr ("Name mismatch between repository and actual package (repository: %1, package: %2)").arg (tl::to_qstring (g->name ())).arg (tl::to_qstring (m_remote_grain->name ()))));
+ }
+ if (SaltGrain::compare_versions (g->version (), m_remote_grain->version ()) != 0) {
+ 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 (m_remote_grain->version ()))));
+ }
+
+ details_new_text->set_grain (m_remote_grain.get ());
+
+ } catch (tl::Exception &ex) {
+
+ m_remote_grain.reset (0);
+
+ QString text = tr (
+ ""
+ ""
+ ""
+ "
Error Fetching Package Definition
"
+ "URL: %1
"
+ "Error: %2
"
+ ""
+ ""
+ )
+ .arg (tl::to_qstring (SaltGrain::spec_url (g->url ())))
+ .arg (tl::to_qstring (tl::escaped_to_html (ex.msg ())));
+
+ details_new_text->setHtml (text);
+
+ }
+
+END_PROTECTED
}
lay::SaltGrain *
diff --git a/src/lay/laySaltManagerDialog.h b/src/lay/laySaltManagerDialog.h
index 305969f73..68576602a 100644
--- a/src/lay/laySaltManagerDialog.h
+++ b/src/lay/laySaltManagerDialog.h
@@ -23,10 +23,11 @@
#ifndef HDR_laySaltManagerDialog
#define HDR_laySaltManagerDialog
-#include
-
#include "ui_SaltManagerDialog.h"
+#include
+#include
+
namespace lay
{
@@ -94,8 +95,14 @@ private slots:
*/
void mode_changed ();
+ /**
+ * @brief Called when one search text changed
+ */
+ void search_text_changed (const QString &text);
+
private:
lay::Salt *mp_salt, *mp_salt_mine;
+ std::auto_ptr m_remote_grain;
bool m_current_changed_enabled;
lay::SaltGrainPropertiesDialog *mp_properties_dialog;