From 9e2c4cb927b9fc9e6b1451c9f0fd63ae404f7a08 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sun, 26 Mar 2017 01:02:40 +0100 Subject: [PATCH] WIP: marked mode, update required message --- src/lay/SaltManagerDialog.ui | 15 +++++-- src/lay/images/marked_16.png | Bin 0 -> 889 bytes src/lay/images/marked_24.png | Bin 0 -> 1452 bytes src/lay/images/marked_64.png | Bin 0 -> 3353 bytes src/lay/layResources.qrc | 3 ++ src/lay/laySaltManagerDialog.cc | 61 ++++++++++++++++++++++---- src/lay/laySaltManagerDialog.h | 5 +++ src/lay/laySaltModel.cc | 73 ++++++++++++++++++++++++++------ src/lay/laySaltModel.h | 17 ++++++++ 9 files changed, 147 insertions(+), 27 deletions(-) create mode 100644 src/lay/images/marked_16.png create mode 100644 src/lay/images/marked_24.png create mode 100644 src/lay/images/marked_64.png diff --git a/src/lay/SaltManagerDialog.ui b/src/lay/SaltManagerDialog.ui index 9194d7715..a51993a12 100644 --- a/src/lay/SaltManagerDialog.ui +++ b/src/lay/SaltManagerDialog.ui @@ -17,7 +17,7 @@ - 0 + 1 @@ -231,8 +231,8 @@ 0 0 - 343 - 207 + 537 + 284 @@ -456,11 +456,18 @@ - Mark for installation + Mark or unmark for installation Mark + + + :/marked_16.png:/marked_16.png + + + true + diff --git a/src/lay/images/marked_16.png b/src/lay/images/marked_16.png new file mode 100644 index 0000000000000000000000000000000000000000..aa152411be8cfc02a42015b1b194db9e08d7321e GIT binary patch literal 889 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 literal 0 HcmV?d00001 diff --git a/src/lay/layResources.qrc b/src/lay/layResources.qrc index 3ffd9e81e..52e7bc522 100644 --- a/src/lay/layResources.qrc +++ b/src/lay/layResources.qrc @@ -120,6 +120,9 @@ images/empty_16.png images/error_16.png images/info_16.png + images/marked_24.png + images/marked_64.png + images/marked_16.png syntax/ruby.xml diff --git a/src/lay/laySaltManagerDialog.cc b/src/lay/laySaltManagerDialog.cc index 5ce7cd4eb..57ce3fbf5 100644 --- a/src/lay/laySaltManagerDialog.cc +++ b/src/lay/laySaltManagerDialog.cc @@ -155,19 +155,27 @@ SaltManagerDialog::SaltManagerDialog (QWidget *parent) mp_salt = get_salt (); mp_salt_mine = get_salt_mine (); - SaltModel *model; - - model = new SaltModel (this, mp_salt); + SaltModel *model = new SaltModel (this, mp_salt); salt_view->setModel (model); salt_view->setItemDelegate (new SaltItemDelegate (this)); - model = new SaltModel (this, mp_salt_mine); - salt_mine_view->setModel (model); + SaltModel *mine_model = new SaltModel (this, mp_salt_mine); + salt_mine_view->setModel (mine_model); salt_mine_view->setItemDelegate (new SaltItemDelegate (this)); + // 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 ()); + if (gm && SaltGrain::compare_versions (gm->version (), (*g)->version ()) > 0) { + model->set_message ((*g)->name (), tl::to_string (tr ("An update to version %1 is available").arg (tl::to_qstring (gm->version ())))); + mine_model->set_message ((*g)->name (), tl::to_string (tr ("The installed version is outdated (%1)").arg (tl::to_qstring ((*g)->version ())))); + } + } + mode_tab->setCurrentIndex (mp_salt->is_empty () ? 1 : 0); connect (mode_tab, SIGNAL (currentChanged (int)), this, SLOT (mode_changed ())); + connect (mp_salt, SIGNAL (collections_changed ()), this, SLOT (salt_changed ())); connect (mp_salt_mine, SIGNAL (collections_changed ()), this, SLOT (salt_mine_changed ())); @@ -175,12 +183,14 @@ SaltManagerDialog::SaltManagerDialog (QWidget *parent) salt_mine_changed (); 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 ())); + connect (salt_mine_view->selectionModel (), SIGNAL (currentChanged (const QModelIndex &, const QModelIndex &)), this, SLOT (mine_current_changed ()), Qt::QueuedConnection); 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 &))); + + connect (mark_button, SIGNAL (clicked ()), this, SLOT (mark_clicked ())); } void @@ -233,6 +243,21 @@ SaltManagerDialog::search_text_changed (const QString &text) } } +void +SaltManagerDialog::mark_clicked () +{ + SaltModel *model = dynamic_cast (salt_mine_view->model ()); + if (! model) { + return; + } + SaltGrain *g = mine_current_grain (); + if (! g) { + return; + } + + model->set_marked (g->name (), !model->is_marked (g->name ())); +} + void SaltManagerDialog::edit_properties () { @@ -379,6 +404,7 @@ SaltManagerDialog::salt_mine_changed () void SaltManagerDialog::mine_current_changed () { + BEGIN_PROTECTED SaltGrain *g = mine_current_grain (); @@ -398,6 +424,22 @@ BEGIN_PROTECTED throw tl::Exception (tl::to_string (tr ("No download link available"))); } + QString text = tr ( + "" + "" + "" + "

Fetching Package Definition ...

" + "

URL: %1

" + "
" + "" + "" + ) + .arg (tl::to_qstring (SaltGrain::spec_url (g->url ()))); + + details_new_text->setHtml (text); + + QApplication::processEvents (QEventLoop::ExcludeUserInputEvents); + tl::InputHttpStream http (SaltGrain::spec_url (g->url ())); tl::InputStream stream (http); @@ -422,9 +464,10 @@ BEGIN_PROTECTED "" "" "" - "

Error Fetching Package Definition

" - "

URL: %1

" - "

Error: %2

" + "

Error Fetching Package Definition

" + "

URL: %1

" + "

Error: %2

" + "
" "" "" ) diff --git a/src/lay/laySaltManagerDialog.h b/src/lay/laySaltManagerDialog.h index 68576602a..6a5068217 100644 --- a/src/lay/laySaltManagerDialog.h +++ b/src/lay/laySaltManagerDialog.h @@ -75,6 +75,11 @@ private slots: */ void edit_properties (); + /** + * @brief Called when the "mark" button is pressed + */ + void mark_clicked (); + /** * @brief Called when the "edit" button is pressed */ diff --git a/src/lay/laySaltModel.cc b/src/lay/laySaltModel.cc index ded796c86..57dd44212 100644 --- a/src/lay/laySaltModel.cc +++ b/src/lay/laySaltModel.cc @@ -120,6 +120,12 @@ SaltModel::data (const QModelIndex &index, int role) const text += tl::escaped_to_html (g->doc ()); text += "

"; } + + std::map::const_iterator m = m_messages.find (g->name ()); + if (m != m_messages.end ()) { + text += "

" + tl::escaped_to_html (m->second) + "

"; + } + text += ""; return tl::to_qstring (text); @@ -129,28 +135,39 @@ SaltModel::data (const QModelIndex &index, int role) const int icon_dim = 64; const lay::SaltGrain *g = mp_salt->begin_flat ()[index.row ()]; + + QImage img; if (g->icon ().isNull ()) { - return QIcon (":/salt_icon.png"); + img = QImage (":/salt_icon.png"); } else { + img = g->icon (); + } - QImage img = g->icon (); - if (img.width () == icon_dim && img.height () == icon_dim) { - return QPixmap::fromImage (img); - } else { + if (img.width () != icon_dim || img.height () != icon_dim) { - img = img.scaled (QSize (icon_dim, icon_dim), Qt::KeepAspectRatio, Qt::SmoothTransformation); + QImage scaled = img.scaled (QSize (icon_dim, icon_dim), Qt::KeepAspectRatio, Qt::SmoothTransformation); - QImage final_img (icon_dim, icon_dim, QImage::Format_ARGB32); - final_img.fill (QColor (0, 0, 0, 0)); - QPainter painter (&final_img); - painter.drawImage ((icon_dim - img.width ()) / 2, (icon_dim - img.height ()) / 2, img); - - return QPixmap::fromImage (final_img); - - } + img = QImage (icon_dim, icon_dim, QImage::Format_ARGB32); + img.fill (QColor (0, 0, 0, 0)); + QPainter painter (&img); + painter.drawImage ((icon_dim - scaled.width ()) / 2, (icon_dim - scaled.height ()) / 2, scaled); } + if (m_marked.find (g->name ()) != m_marked.end ()) { + QPainter painter (&img); + QImage warn (":/marked_64.png"); + painter.drawImage (0, 0, warn); + } + + if (m_messages.find (g->name ()) != m_messages.end ()) { + QPainter painter (&img); + QImage warn (":/warn_16.png"); + painter.drawImage (0, 0, warn); + } + + return QPixmap::fromImage (img); + } else { return QVariant (); } @@ -198,6 +215,34 @@ SaltModel::grain_from_index (const QModelIndex &index) const } } +bool +SaltModel::is_marked (const std::string &name) const +{ + return m_marked.find (name) != m_marked.end (); +} + +void +SaltModel::set_marked (const std::string &name, bool marked) +{ + if (! marked) { + m_marked.erase (name); + } else { + m_marked.insert (name); + } + emit dataChanged (index (0, 0, QModelIndex ()), index (rowCount (QModelIndex ()) - 1, 0, QModelIndex ())); +} + +void +SaltModel::set_message (const std::string &name, const std::string &message) +{ + if (message.empty ()) { + m_messages.erase (name); + } else { + m_messages.insert (std::make_pair (name, message)); + } + emit dataChanged (index (0, 0, QModelIndex ()), index (rowCount (QModelIndex ()) - 1, 0, QModelIndex ())); +} + void SaltModel::update () { diff --git a/src/lay/laySaltModel.h b/src/lay/laySaltModel.h index 1ffa5f86e..20a537e2c 100644 --- a/src/lay/laySaltModel.h +++ b/src/lay/laySaltModel.h @@ -29,6 +29,8 @@ #include #include #include +#include +#include namespace lay { @@ -86,8 +88,23 @@ public: */ void update (); + /** + * @brief Sets or resets the "marked" flag on the grain with the given name + */ + void set_marked (const std::string &name, bool marked); + + /** + * @brief Installs a message on the grain with the given name + * Installing an empty message basically removes the message. + */ + void set_message (const std::string &name, const std::string &message); + public: lay::Salt *mp_salt; + std::set m_marked; + std::map m_messages; + + bool is_marked (const std::string &name) const; }; // --------------------------------------------------------------------------------------