diff --git a/src/lay/SaltManagerDialog.ui b/src/lay/SaltManagerDialog.ui
index 77651bd95..b0cd99823 100644
--- a/src/lay/SaltManagerDialog.ui
+++ b/src/lay/SaltManagerDialog.ui
@@ -408,9 +408,299 @@
+
+
+ Update Packages
+
+
+ -
+
+
+
+ 0
+ 1
+
+
+
+ Qt::Horizontal
+
+
+
+
+ 4
+
+
-
+
+
+ QFrame::NoFrame
+
+
+ QFrame::Raised
+
+
+
+ 2
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+ Mark or unmark for installation
+
+
+ Mark
+
+
+
+ :/marked_16.png:/marked_16.png
+
+
+ true
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 126
+ 20
+
+
+
+
+ -
+
+
+
+
+
+ :/find.png
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+
+
+
+ -
+
+
+ QFrame::NoFrame
+
+
+ QFrame::Raised
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+ true
+
+
+
+ 64
+ 64
+
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 0
+
+
+
+ QFrame::NoFrame
+
+
+ QFrame::Raised
+
+
+
+ 4
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+ -
+
+
+ QFrame::NoFrame
+
+
+ QFrame::Raised
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+
+ 75
+ true
+
+
+
+ Details
+
+
+
+ -
+
+
+ false
+
+
+ ...
+
+
+
+ :/empty_16.png:/empty_16.png
+
+
+ true
+
+
+
+
+
+
+ -
+
+
+ true
+
+
+
+
+
+
+
+ -
+
+
+ QFrame::NoFrame
+
+
+ QFrame::Raised
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+ Apply
+
+
+ false
+
+
+ false
+
+
+
+ -
+
+
+ Set in code
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 563
+ 20
+
+
+
+
+
+
+
+
+
- Install or Update Packages
+ Install New Packages
-
@@ -454,7 +744,7 @@
0
-
-
+
Mark or unmark for installation
@@ -528,7 +818,7 @@
0
-
-
+
true
@@ -661,7 +951,7 @@
0
-
-
+
Apply
@@ -674,7 +964,7 @@
-
-
+
Set in code
@@ -732,21 +1022,44 @@
Delete package
-
+
Unmark all
-
+
Show marked only
-
+
Show all
+
+
+ Refresh
+
+
+ Reload package repository
+
+
+
+
+ Show all
+
+
+
+
+ Show marked only
+
+
+
+
+ Unmark all
+
+
@@ -767,11 +1080,11 @@
details_text
edit_button
search_new_edit
- mark_button
- salt_mine_view
+ mark_new_button
+ salt_mine_view_new
details_new_text
toolButton
- apply_button
+ apply_new_button
scrollArea
diff --git a/src/lay/laySaltController.cc b/src/lay/laySaltController.cc
index 866e0b00e..98e5e0174 100644
--- a/src/lay/laySaltController.cc
+++ b/src/lay/laySaltController.cc
@@ -121,16 +121,7 @@ SaltController::show_editor ()
{
if (mp_mw && !mp_salt_dialog) {
- try {
- if (! m_salt_mine_url.empty ()) {
- tl::log << tl::to_string (tr ("Downloading package repository from %1").arg (tl::to_qstring (m_salt_mine_url)));
- m_salt_mine.load (m_salt_mine_url);
- }
- } catch (tl::Exception &ex) {
- tl::error << ex.msg ();
- }
-
- mp_salt_dialog = new lay::SaltManagerDialog (mp_mw, &m_salt, &m_salt_mine);
+ mp_salt_dialog = new lay::SaltManagerDialog (mp_mw, &m_salt, m_salt_mine_url);
}
diff --git a/src/lay/laySaltManagerDialog.cc b/src/lay/laySaltManagerDialog.cc
index 5c191b2bb..295b0fa71 100644
--- a/src/lay/laySaltManagerDialog.cc
+++ b/src/lay/laySaltManagerDialog.cc
@@ -109,9 +109,10 @@ private:
// --------------------------------------------------------------------------------------
// SaltManager implementation
-SaltManagerDialog::SaltManagerDialog (QWidget *parent, lay::Salt *salt, lay::Salt *salt_mine)
+SaltManagerDialog::SaltManagerDialog (QWidget *parent, lay::Salt *salt, const std::string &salt_mine_url)
: QDialog (parent),
- m_current_changed_enabled (true), dm_update_models (this, &SaltManagerDialog::update_models)
+ m_salt_mine_url (salt_mine_url),
+ dm_update_models (this, &SaltManagerDialog::update_models), m_current_tab (-1)
{
Ui::SaltManagerDialog::setupUi (this);
mp_properties_dialog = new lay::SaltGrainPropertiesDialog (this);
@@ -119,106 +120,213 @@ SaltManagerDialog::SaltManagerDialog (QWidget *parent, lay::Salt *salt, lay::Sal
connect (edit_button, SIGNAL (clicked ()), this, SLOT (edit_properties ()));
connect (create_button, SIGNAL (clicked ()), this, SLOT (create_grain ()));
connect (delete_button, SIGNAL (clicked ()), this, SLOT (delete_grain ()));
- connect (apply_button, SIGNAL (clicked ()), this, SLOT (apply ()));
+ connect (apply_new_button, SIGNAL (clicked ()), this, SLOT (apply ()));
+ connect (apply_update_button, SIGNAL (clicked ()), this, SLOT (apply ()));
mp_salt = salt;
- mp_salt_mine = salt_mine;
+
+ try {
+ if (! m_salt_mine_url.empty ()) {
+ tl::log << tl::to_string (tr ("Downloading package repository from %1").arg (tl::to_qstring (m_salt_mine_url)));
+ m_salt_mine.load (m_salt_mine_url);
+ }
+ } catch (tl::Exception &ex) {
+ tl::error << ex.msg ();
+ }
SaltModel *model = new SaltModel (this, mp_salt);
salt_view->setModel (model);
salt_view->setItemDelegate (new SaltItemDelegate (this));
- SaltModel *mine_model = new SaltModel (this, mp_salt_mine);
- salt_mine_view->setModel (mine_model);
- salt_mine_view->setItemDelegate (new SaltItemDelegate (this));
+ SaltModel *mine_model;
+
+ // This model will show only the grains of mp_salt_mine which are not present in mp_salt yet.
+ mine_model = new SaltModel (this, &m_salt_mine, mp_salt, true);
+ salt_mine_view_new->setModel (mine_model);
+ salt_mine_view_new->setItemDelegate (new SaltItemDelegate (this));
+
+ // This model will show only the grains of mp_salt_mine which are present in mp_salt already.
+ mine_model = new SaltModel (this, &m_salt_mine, mp_salt, false);
+ salt_mine_view_update->setModel (mine_model);
+ salt_mine_view_update->setItemDelegate (new SaltItemDelegate (this));
mode_tab->setCurrentIndex (mp_salt->is_empty () ? 1 : 0);
connect (mode_tab, SIGNAL (currentChanged (int)), this, SLOT (mode_changed ()));
+ m_current_tab = mode_tab->currentIndex ();
connect (mp_salt, SIGNAL (collections_changed ()), this, SLOT (salt_changed ()));
connect (mp_salt, SIGNAL (collections_about_to_change ()), this, SLOT (salt_about_to_change ()));
- connect (mp_salt_mine, SIGNAL (collections_changed ()), this, SLOT (salt_mine_changed ()));
- connect (mp_salt_mine, SIGNAL (collections_about_to_change ()), this, SLOT (salt_mine_about_to_change ()));
+ connect (&m_salt_mine, SIGNAL (collections_changed ()), this, SLOT (salt_mine_changed ()));
+ connect (&m_salt_mine, SIGNAL (collections_about_to_change ()), this, SLOT (salt_mine_about_to_change ()));
update_models ();
connect (salt_view->selectionModel (), SIGNAL (currentChanged (const QModelIndex &, const QModelIndex &)), this, SLOT (current_changed ()));
connect (salt_view, SIGNAL (doubleClicked (const QModelIndex &)), this, SLOT (edit_properties ()));
- connect (salt_mine_view->selectionModel (), SIGNAL (currentChanged (const QModelIndex &, const QModelIndex &)), this, SLOT (mine_current_changed ()), Qt::QueuedConnection);
- connect (salt_mine_view, SIGNAL (doubleClicked (const QModelIndex &)), this, SLOT (mark_clicked ()));
+ connect (salt_mine_view_new->selectionModel (), SIGNAL (currentChanged (const QModelIndex &, const QModelIndex &)), this, SLOT (mine_new_current_changed ()), Qt::QueuedConnection);
+ connect (salt_mine_view_update->selectionModel (), SIGNAL (currentChanged (const QModelIndex &, const QModelIndex &)), this, SLOT (mine_update_current_changed ()), Qt::QueuedConnection);
+ connect (salt_mine_view_new, SIGNAL (doubleClicked (const QModelIndex &)), this, SLOT (mark_clicked ()));
+ connect (salt_mine_view_update, SIGNAL (doubleClicked (const QModelIndex &)), this, SLOT (mark_clicked ()));
search_installed_edit->set_clear_button_enabled (true);
search_new_edit->set_clear_button_enabled (true);
+ search_update_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 &)));
+ connect (search_update_edit, SIGNAL (textChanged (const QString &)), this, SLOT (search_text_changed (const QString &)));
- connect (mark_button, SIGNAL (clicked ()), this, SLOT (mark_clicked ()));
+ connect (mark_new_button, SIGNAL (clicked ()), this, SLOT (mark_clicked ()));
+ connect (mark_update_button, SIGNAL (clicked ()), this, SLOT (mark_clicked ()));
- salt_mine_view->addAction (actionUnmarkAll);
- QAction *a = new QAction (this);
+ QAction *a;
+
+ salt_mine_view_new->addAction (actionUnmarkAllNew);
+ a = new QAction (this);
a->setSeparator (true);
- salt_mine_view->addAction (a);
- salt_mine_view->addAction (actionShowMarkedOnly);
- salt_mine_view->addAction (actionShowAll);
- salt_mine_view->setContextMenuPolicy (Qt::ActionsContextMenu);
+ salt_mine_view_new->addAction (a);
+ salt_mine_view_new->addAction (actionShowMarkedOnlyNew);
+ salt_mine_view_new->addAction (actionShowAllNew);
+ a = new QAction (this);
+ a->setSeparator (true);
+ salt_mine_view_new->addAction (a);
+ salt_mine_view_new->addAction (actionRefresh);
+ salt_mine_view_new->setContextMenuPolicy (Qt::ActionsContextMenu);
- connect (actionUnmarkAll, SIGNAL (triggered ()), this, SLOT (unmark_all ()));
- connect (actionShowMarkedOnly, SIGNAL (triggered ()), this, SLOT (show_marked_only ()));
- connect (actionShowAll, SIGNAL (triggered ()), this, SLOT (show_all ()));
+ salt_mine_view_update->addAction (actionUnmarkAllUpdate);
+ a = new QAction (this);
+ a->setSeparator (true);
+ salt_mine_view_update->addAction (a);
+ salt_mine_view_update->addAction (actionShowMarkedOnlyUpdate);
+ salt_mine_view_update->addAction (actionShowAllUpdate);
+ a = new QAction (this);
+ a->setSeparator (true);
+ salt_mine_view_update->addAction (a);
+ salt_mine_view_update->addAction (actionRefresh);
+ salt_mine_view_update->setContextMenuPolicy (Qt::ActionsContextMenu);
+
+ connect (actionUnmarkAllNew, SIGNAL (triggered ()), this, SLOT (unmark_all_new ()));
+ connect (actionShowMarkedOnlyNew, SIGNAL (triggered ()), this, SLOT (show_marked_only_new ()));
+ connect (actionShowAllNew, SIGNAL (triggered ()), this, SLOT (show_all_new ()));
+ connect (actionUnmarkAllUpdate, SIGNAL (triggered ()), this, SLOT (unmark_all_update ()));
+ connect (actionShowMarkedOnlyUpdate, SIGNAL (triggered ()), this, SLOT (show_marked_only_update ()));
+ connect (actionShowAllUpdate, SIGNAL (triggered ()), this, SLOT (show_all_update ()));
+ connect (actionRefresh, SIGNAL (triggered ()), this, SLOT (refresh ()));
}
void
SaltManagerDialog::mode_changed ()
{
+ QList sizes;
+ if (m_current_tab == 0) {
+ sizes = splitter->sizes ();
+ } else if (m_current_tab == 1) {
+ sizes = splitter_update->sizes ();
+ } else if (m_current_tab == 2) {
+ sizes = splitter_new->sizes ();
+ }
+
// keeps the splitters in sync
- if (mode_tab->currentIndex () == 1) {
- splitter_new->setSizes (splitter->sizes ());
- show_all ();
- } else if (mode_tab->currentIndex () == 0) {
- splitter->setSizes (splitter_new->sizes ());
+ if (!sizes.empty ()) {
+ splitter_new->setSizes (sizes);
+ splitter_update->setSizes (sizes);
+ splitter->setSizes (sizes);
+ }
+
+ if (mode_tab->currentIndex () >= 1) {
+ show_all_new ();
+ show_all_update ();
+ }
+
+ m_current_tab = mode_tab->currentIndex ();
+}
+
+void
+SaltManagerDialog::show_all_new ()
+{
+ search_new_edit->clear ();
+
+ SaltModel *model = dynamic_cast (salt_mine_view_new->model ());
+ if (model) {
+ for (int i = model->rowCount (QModelIndex ()); i > 0; ) {
+ --i;
+ salt_mine_view_new->setRowHidden (i, false);
+ }
}
}
void
-SaltManagerDialog::show_all ()
+SaltManagerDialog::show_all_update ()
{
- search_new_edit->clear ();
+ search_update_edit->clear ();
- SaltModel *model = dynamic_cast (salt_mine_view->model ());
- if (! model) {
- return;
- }
-
- for (int i = model->rowCount (QModelIndex ()); i > 0; ) {
- --i;
- salt_mine_view->setRowHidden (i, false);
+ SaltModel *model = dynamic_cast (salt_mine_view_update->model ());
+ if (model) {
+ for (int i = model->rowCount (QModelIndex ()); i > 0; ) {
+ --i;
+ salt_mine_view_update->setRowHidden (i, false);
+ }
}
}
void
-SaltManagerDialog::show_marked_only ()
+SaltManagerDialog::show_marked_only_new ()
{
search_new_edit->clear ();
- SaltModel *model = dynamic_cast (salt_mine_view->model ());
+ SaltModel *model = dynamic_cast (salt_mine_view_new->model ());
if (! model) {
return;
}
+ salt_mine_view_new->setCurrentIndex (QModelIndex ());
+
for (int i = model->rowCount (QModelIndex ()); i > 0; ) {
--i;
SaltGrain *g = model->grain_from_index (model->index (i, 0, QModelIndex ()));
- salt_mine_view->setRowHidden (i, !(g && model->is_marked (g->name ())));
+ salt_mine_view_new->setRowHidden (i, !(g && model->is_marked (g->name ())));
+ mine_new_current_changed ();
}
}
void
-SaltManagerDialog::unmark_all ()
+SaltManagerDialog::show_marked_only_update ()
{
- SaltModel *model = dynamic_cast (salt_mine_view->model ());
+ search_update_edit->clear ();
+
+ SaltModel *model = dynamic_cast (salt_mine_view_update->model ());
+ if (! model) {
+ return;
+ }
+
+ salt_mine_view_update->setCurrentIndex (QModelIndex ());
+
+ for (int i = model->rowCount (QModelIndex ()); i > 0; ) {
+ --i;
+ SaltGrain *g = model->grain_from_index (model->index (i, 0, QModelIndex ()));
+ salt_mine_view_update->setRowHidden (i, !(g && model->is_marked (g->name ())));
+ mine_update_current_changed ();
+ }
+}
+
+void
+SaltManagerDialog::unmark_all_new ()
+{
+ SaltModel *model = dynamic_cast (salt_mine_view_new->model ());
if (model) {
model->clear_marked ();
+ show_all_new ();
+ update_apply_state ();
+ }
+}
+
+void
+SaltManagerDialog::unmark_all_update ()
+{
+ SaltModel *model = dynamic_cast (salt_mine_view_update->model ());
+ if (model) {
+ model->clear_marked ();
+ show_all_update ();
update_apply_state ();
}
}
@@ -230,7 +338,9 @@ SaltManagerDialog::search_text_changed (const QString &text)
if (sender () == search_installed_edit) {
view = salt_view;
} else if (sender () == search_new_edit) {
- view = salt_mine_view;
+ view = salt_mine_view_new;
+ } else if (sender () == search_update_edit) {
+ view = salt_mine_view_update;
} else {
return;
}
@@ -265,45 +375,78 @@ SaltManagerDialog::search_text_changed (const QString &text)
void
SaltManagerDialog::mark_clicked ()
{
- SaltModel *model = dynamic_cast (salt_mine_view->model ());
+ QListView *view;
+ if (sender () == salt_mine_view_new || sender () == mark_new_button) {
+ view = salt_mine_view_new;
+ } else {
+ view = salt_mine_view_update;
+ }
+
+ SaltModel *model = dynamic_cast (view->model ());
if (! model) {
return;
}
- SaltGrain *g = mine_current_grain ();
- if (! g) {
- return;
- }
- model->set_marked (g->name (), !model->is_marked (g->name ()));
- update_apply_state ();
+ SaltGrain *g = model->grain_from_index (view->currentIndex ());
+ if (g) {
+ model->set_marked (g->name (), ! model->is_marked (g->name ()));
+ update_apply_state ();
+ }
}
void
SaltManagerDialog::update_apply_state ()
{
- int marked = 0;
+ SaltModel *model;
- SaltModel *model = dynamic_cast (salt_mine_view->model ());
- if (! model) {
- return;
- }
+ model = dynamic_cast (salt_mine_view_new->model ());
+ if (model) {
- for (int i = model->rowCount (QModelIndex ()); i > 0; ) {
- --i;
- QModelIndex index = model->index (i, 0, QModelIndex ());
- SaltGrain *g = model->grain_from_index (index);
- if (g && model->is_marked (g->name ())) {
- marked += 1;
+ int marked = 0;
+
+ for (int i = model->rowCount (QModelIndex ()); i > 0; ) {
+ --i;
+ QModelIndex index = model->index (i, 0, QModelIndex ());
+ SaltGrain *g = model->grain_from_index (index);
+ if (g && model->is_marked (g->name ())) {
+ marked += 1;
+ }
}
+
+ apply_new_button->setEnabled (marked > 0);
+ if (marked == 0) {
+ apply_label_new->setText (QString ());
+ } else if (marked == 1) {
+ apply_label_new->setText (tr ("One package selected"));
+ } else if (marked > 1) {
+ apply_label_new->setText (tr ("%1 packages selected").arg (marked));
+ }
+
}
- apply_button->setEnabled (marked > 0);
- if (marked == 0) {
- apply_label->setText (QString ());
- } else if (marked == 1) {
- apply_label->setText (tr ("One package selected"));
- } else if (marked > 1) {
- apply_label->setText (tr ("%1 packages selected").arg (marked));
+ model = dynamic_cast (salt_mine_view_update->model ());
+ if (model) {
+
+ int marked = 0;
+
+ for (int i = model->rowCount (QModelIndex ()); i > 0; ) {
+ --i;
+ QModelIndex index = model->index (i, 0, QModelIndex ());
+ SaltGrain *g = model->grain_from_index (index);
+ if (g && model->is_marked (g->name ())) {
+ marked += 1;
+ }
+ }
+
+ apply_update_button->setEnabled (marked > 0);
+ if (marked == 0) {
+ apply_label_update->setText (QString ());
+ } else if (marked == 1) {
+ apply_label_update->setText (tr ("One package selected"));
+ } else if (marked > 1) {
+ apply_label_update->setText (tr ("%1 packages selected").arg (marked));
+ }
+
}
}
@@ -312,12 +455,20 @@ SaltManagerDialog::apply ()
{
BEGIN_PROTECTED
+ bool update = (sender () == apply_update_button);
+
lay::SaltDownloadManager manager;
bool any = false;
// fetch all marked grains and register for download
- SaltModel *model = dynamic_cast (salt_mine_view->model ());
+ SaltModel *model;
+ if (update) {
+ model = dynamic_cast (salt_mine_view_update->model ());
+ } else {
+ model = dynamic_cast (salt_mine_view_new->model ());
+ }
+
if (model) {
for (int i = model->rowCount (QModelIndex ()); i > 0; ) {
--i;
@@ -331,13 +482,21 @@ BEGIN_PROTECTED
}
if (! any) {
- throw tl::Exception (tl::to_string (tr ("No packages marked for installation or update")));
+ if (update) {
+ throw tl::Exception (tl::to_string (tr ("No packages marked for update")));
+ } else {
+ throw tl::Exception (tl::to_string (tr ("No packages marked for installation")));
+ }
}
- manager.compute_dependencies (*mp_salt, *mp_salt_mine);
+ manager.compute_dependencies (*mp_salt, m_salt_mine);
if (manager.show_confirmation_dialog (this, *mp_salt)) {
- unmark_all ();
+ if (update) {
+ unmark_all_update ();
+ } else {
+ unmark_all_new ();
+ }
manager.execute (*mp_salt);
}
@@ -426,9 +585,35 @@ SaltManagerDialog::salt_changed ()
void
SaltManagerDialog::salt_mine_about_to_change ()
{
- SaltModel *mine_model = dynamic_cast (salt_mine_view->model ());
- tl_assert (mine_model != 0);
- mine_model->begin_update ();
+ SaltModel *model;
+
+ model = dynamic_cast (salt_mine_view_new->model ());
+ tl_assert (model != 0);
+ model->begin_update ();
+
+ model = dynamic_cast (salt_mine_view_update->model ());
+ tl_assert (model != 0);
+ model->begin_update ();
+}
+
+void
+SaltManagerDialog::refresh ()
+{
+BEGIN_PROTECTED
+
+ if (! m_salt_mine_url.empty ()) {
+
+ tl::log << tl::to_string (tr ("Downloading package repository from %1").arg (tl::to_qstring (m_salt_mine_url)));
+
+ lay::Salt new_mine;
+ new_mine.load (m_salt_mine_url);
+ m_salt_mine = new_mine;
+
+ salt_mine_changed ();
+
+ }
+
+END_PROTECTED
}
void
@@ -443,15 +628,11 @@ SaltManagerDialog::update_models ()
SaltModel *model = dynamic_cast (salt_view->model ());
tl_assert (model != 0);
- // NOTE: the disabling of the event handler prevents us from
- // letting the model connect to the salt's signal directly.
- m_current_changed_enabled = false;
-
model->clear_messages ();
// Establish a message saying that an update is available
for (Salt::flat_iterator g = mp_salt->begin_flat (); g != mp_salt->end_flat (); ++g) {
- SaltGrain *gm = mp_salt_mine->grain_by_name ((*g)->name ());
+ SaltGrain *gm = m_salt_mine.grain_by_name ((*g)->name ());
if (gm && SaltGrain::compare_versions (gm->version (), (*g)->version ()) > 0) {
model->set_message ((*g)->name (), SaltModel::Warning, tl::to_string (tr ("An update to version %1 is available").arg (tl::to_qstring (gm->version ()))));
}
@@ -459,8 +640,6 @@ SaltManagerDialog::update_models ()
model->update ();
- m_current_changed_enabled = true;
-
if (mp_salt->is_empty ()) {
list_stack->setCurrentIndex (1);
@@ -478,40 +657,59 @@ SaltManagerDialog::update_models ()
}
- SaltModel *mine_model = dynamic_cast (salt_mine_view->model ());
- tl_assert (mine_model != 0);
+ SaltModel *mine_model;
- // NOTE: the disabling of the event handler prevents us from
- // letting the model connect to the salt's signal directly.
- m_current_changed_enabled = false;
+ mine_model = dynamic_cast (salt_mine_view_update->model ());
+ tl_assert (mine_model != 0);
mine_model->clear_order ();
mine_model->clear_messages ();
mine_model->enable_all ();
+ bool has_warning = false;
+
// Establish a message saying that an update is available
for (Salt::flat_iterator g = mp_salt->begin_flat (); g != mp_salt->end_flat (); ++g) {
- SaltGrain *gm = mp_salt_mine->grain_by_name ((*g)->name ());
+ SaltGrain *gm = m_salt_mine.grain_by_name ((*g)->name ());
if (gm && SaltGrain::compare_versions (gm->version (), (*g)->version ()) > 0) {
+ has_warning = true;
mine_model->set_message ((*g)->name (), SaltModel::Warning, tl::to_string (tr ("The installed version is outdated (%1)").arg (tl::to_qstring ((*g)->version ()))));
mine_model->set_order ((*g)->name (), -1);
} else if (gm) {
- mine_model->set_message ((*g)->name (), SaltModel::None, tl::to_string (tr ("This package is already installed and up to date")));
+ mine_model->set_message ((*g)->name (), SaltModel::None, tl::to_string (tr ("This package is up to date")));
mine_model->set_order ((*g)->name (), 1);
mine_model->set_enabled ((*g)->name (), false);
}
}
- mine_model->update ();
+ if (has_warning) {
+ mode_tab->setTabIcon (1, QIcon (":/warn_16.png"));
+ } else {
+ mode_tab->setTabIcon (1, QIcon ());
+ }
- m_current_changed_enabled = true;
+ mine_model->update ();
// select the first grain
if (mine_model->rowCount (QModelIndex ()) > 0) {
- salt_mine_view->setCurrentIndex (mine_model->index (0, 0, QModelIndex ()));
+ salt_mine_view_update->setCurrentIndex (mine_model->index (0, 0, QModelIndex ()));
}
- mine_current_changed ();
+ mine_model = dynamic_cast (salt_mine_view_new->model ());
+ tl_assert (mine_model != 0);
+
+ mine_model->clear_order ();
+ mine_model->clear_messages ();
+ mine_model->enable_all ();
+ mine_model->update ();
+
+ // select the first grain
+ if (mine_model->rowCount (QModelIndex ()) > 0) {
+ salt_mine_view_new->setCurrentIndex (mine_model->index (0, 0, QModelIndex ()));
+ }
+
+ mine_new_current_changed ();
+ mine_update_current_changed ();
current_changed ();
update_apply_state ();
}
@@ -539,20 +737,56 @@ SaltManagerDialog::current_grain ()
}
void
-SaltManagerDialog::mine_current_changed ()
+SaltManagerDialog::mine_update_current_changed ()
{
-
BEGIN_PROTECTED
- SaltGrain *g = mine_current_grain ();
+ SaltModel *model = dynamic_cast (salt_mine_view_update->model ());
+ tl_assert (model != 0);
+ SaltGrain *g = model->grain_from_index (salt_mine_view_update->currentIndex ());
+
+ details_update_frame->setEnabled (g != 0);
+
+ QString html;
+ SaltGrain *remote_grain = get_remote_grain_info (g, html);
+
+ m_remote_update_grain.reset (remote_grain);
+ details_update_text->set_grain (remote_grain);
+ details_update_text->setHtml (html);
+
+END_PROTECTED
+}
+
+void
+SaltManagerDialog::mine_new_current_changed ()
+{
+BEGIN_PROTECTED
+
+ SaltModel *model = dynamic_cast (salt_mine_view_new->model ());
+ tl_assert (model != 0);
+ SaltGrain *g = model->grain_from_index (salt_mine_view_new->currentIndex ());
+
details_new_frame->setEnabled (g != 0);
+ QString html;
+ SaltGrain *remote_grain = get_remote_grain_info (g, html);
+
+ 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)
+{
if (! g) {
- details_new_text->set_grain (0);
- return;
+ return 0;
}
- m_remote_grain.reset (0);
+ std::auto_ptr remote_grain;
+ remote_grain.reset (0);
// Download actual grain definition file
try {
@@ -561,7 +795,7 @@ BEGIN_PROTECTED
throw tl::Exception (tl::to_string (tr ("No download link available")));
}
- QString text = tr (
+ html = tr (
""
""
""
@@ -573,30 +807,26 @@ BEGIN_PROTECTED
)
.arg (tl::to_qstring (SaltGrain::spec_url (g->url ())));
- details_new_text->setHtml (text);
-
QApplication::processEvents (QEventLoop::ExcludeUserInputEvents);
tl::InputStream stream (SaltGrain::spec_url (g->url ()));
- m_remote_grain.reset (new SaltGrain ());
- m_remote_grain->load (stream);
- m_remote_grain->set_url (g->url ());
+ remote_grain.reset (new SaltGrain ());
+ remote_grain->load (stream);
+ 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 (g->name () != 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 (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 ()))));
+ if (SaltGrain::compare_versions (g->version (), 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 (remote_grain->version ()))));
}
- details_new_text->set_grain (m_remote_grain.get ());
-
} catch (tl::Exception &ex) {
- m_remote_grain.reset (0);
+ remote_grain.reset (0);
- QString text = tr (
+ html = tr (
""
""
""
@@ -610,18 +840,9 @@ BEGIN_PROTECTED
.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 *
-SaltManagerDialog::mine_current_grain ()
-{
- SaltModel *model = dynamic_cast (salt_mine_view->model ());
- return model ? model->grain_from_index (salt_mine_view->currentIndex ()) : 0;
+ return remote_grain.release ();
}
}
diff --git a/src/lay/laySaltManagerDialog.h b/src/lay/laySaltManagerDialog.h
index 4455ef9a3..f73d07674 100644
--- a/src/lay/laySaltManagerDialog.h
+++ b/src/lay/laySaltManagerDialog.h
@@ -24,6 +24,7 @@
#define HDR_laySaltManagerDialog
#include "ui_SaltManagerDialog.h"
+#include "laySalt.h"
#include "tlDeferredExecution.h"
#include
@@ -32,8 +33,6 @@
namespace lay
{
-class Salt;
-class SaltGrain;
class SaltGrainPropertiesDialog;
/**
@@ -48,7 +47,7 @@ public:
/**
* @brief Constructor
*/
- SaltManagerDialog (QWidget *parent, lay::Salt *salt, lay::Salt *salt_mine);
+ SaltManagerDialog (QWidget *parent, lay::Salt *salt, const std::string &salt_mine_url);
private slots:
/**
@@ -77,9 +76,14 @@ private slots:
void current_changed ();
/**
- * @brief Called when the currently selected package from the salt mine has changed
+ * @brief Called when the currently selected package from the update page has changed
*/
- void mine_current_changed ();
+ void mine_update_current_changed ();
+
+ /**
+ * @brief Called when the currently selected package from the new installation page has changed
+ */
+ void mine_new_current_changed ();
/**
* @brief Called when the "edit" button is pressed
@@ -117,31 +121,54 @@ private slots:
void search_text_changed (const QString &text);
/**
- * @brief Called to show the marked items only
+ * @brief Called to show the marked items only (new packages tab)
*/
- void show_marked_only ();
+ void show_marked_only_new ();
/**
- * @brief Called to show all items again
+ * @brief Called to show all items again (new packages tab)
*/
- void show_all ();
+ void show_all_new ();
/**
- * @brief Called to unmark all items
+ * @brief Called to unmark all items (new packages tab)
*/
- void unmark_all ();
+ void unmark_all_new ();
+
+ /**
+ * @brief Called to show the marked items only (update packages tab)
+ */
+ void show_marked_only_update ();
+
+ /**
+ * @brief Called to show all items again (update packages tab)
+ */
+ void show_all_update ();
+
+ /**
+ * @brief Called to unmark all items (update packages tab)
+ */
+ void unmark_all_update ();
+
+ /**
+ * @brief Reloads the salt mine
+ */
+ void refresh ();
private:
- Salt *mp_salt, *mp_salt_mine;
- std::auto_ptr m_remote_grain;
- bool m_current_changed_enabled;
+ Salt *mp_salt;
+ Salt m_salt_mine;
+ std::string m_salt_mine_url;
+ std::auto_ptr m_remote_update_grain;
+ std::auto_ptr m_remote_new_grain;
SaltGrainPropertiesDialog *mp_properties_dialog;
tl::DeferredMethod dm_update_models;
+ int m_current_tab;
SaltGrain *current_grain ();
- SaltGrain *mine_current_grain ();
void update_models ();
void update_apply_state ();
+ SaltGrain *get_remote_grain_info (lay::SaltGrain *g, QString &html);
};
}
diff --git a/src/lay/laySaltModel.cc b/src/lay/laySaltModel.cc
index 661b0934f..078582186 100644
--- a/src/lay/laySaltModel.cc
+++ b/src/lay/laySaltModel.cc
@@ -95,8 +95,10 @@ SaltItemDelegate::sizeHint (const QStyleOptionViewItem &option, const QModelInde
// --------------------------------------------------------------------------------------
-SaltModel::SaltModel (QObject *parent, lay::Salt *salt)
- : QAbstractItemModel (parent), mp_salt (salt), m_in_update (false)
+SaltModel::SaltModel (QObject *parent, lay::Salt *salt, lay::Salt *salt_filtered, bool salt_exclude)
+ : QAbstractItemModel (parent), mp_salt (salt),
+ mp_salt_filtered (salt_filtered), m_salt_exclude (salt_exclude),
+ m_in_update (false)
{
create_ordered_list ();
}
@@ -389,6 +391,10 @@ SaltModel::create_ordered_list ()
if (m_display_order.empty ()) {
for (Salt::flat_iterator i = mp_salt->begin_flat (); i != mp_salt->end_flat (); ++i) {
+ // filter the grains by looking them up in the reference salt
+ if (mp_salt_filtered && (mp_salt_filtered->grain_by_name ((*i)->name ()) != 0) == m_salt_exclude) {
+ continue;
+ }
m_ordered_grains.push_back (*i);
}
@@ -406,6 +412,10 @@ SaltModel::create_ordered_list ()
for (int o = min_order; o <= max_order; ++o) {
for (Salt::flat_iterator i = mp_salt->begin_flat (); i != mp_salt->end_flat (); ++i) {
+ // filter the grains by looking them up in the reference salt
+ if (mp_salt_filtered && (mp_salt_filtered->grain_by_name ((*i)->name ()) != 0) == m_salt_exclude) {
+ continue;
+ }
std::map::const_iterator d = m_display_order.find ((*i)->name ());
int oi = 0;
if (d != m_display_order.end ()) {
diff --git a/src/lay/laySaltModel.h b/src/lay/laySaltModel.h
index b95824665..ea6f02a2a 100644
--- a/src/lay/laySaltModel.h
+++ b/src/lay/laySaltModel.h
@@ -61,7 +61,7 @@ public:
/**
* @brief Constructor
*/
- SaltModel (QObject *parent, lay::Salt *salt);
+ SaltModel (QObject *parent, lay::Salt *salt, Salt *salt_filtered = 0, bool salt_exclude = false);
/**
* @brief Implementation of the QAbstractItemModel interface
@@ -170,7 +170,8 @@ public:
void clear_order ();
public:
- lay::Salt *mp_salt;
+ lay::Salt *mp_salt, *mp_salt_filtered;
+ bool m_salt_exclude;
std::set m_marked;
std::set m_disabled;
std::map > m_messages;