From 41ca6bd1de1e8e82bc466013651f763c4bf1a2c2 Mon Sep 17 00:00:00 2001 From: James Turner <zakalawe@mac.com> Date: Mon, 16 Mar 2015 17:34:22 +0100 Subject: [PATCH] GUI exclude support. - visual refinements in the delegate. --- src/GUI/AircraftItemDelegate.cxx | 35 +++++++++++++++++++---------- src/GUI/AircraftItemDelegate.hxx | 1 + src/GUI/AircraftModel.cxx | 38 ++++++++++++++++++++++++++------ src/GUI/AircraftModel.hxx | 2 ++ 4 files changed, 57 insertions(+), 19 deletions(-) diff --git a/src/GUI/AircraftItemDelegate.cxx b/src/GUI/AircraftItemDelegate.cxx index e950abf3c..b13a9500b 100644 --- a/src/GUI/AircraftItemDelegate.cxx +++ b/src/GUI/AircraftItemDelegate.cxx @@ -68,6 +68,10 @@ void AircraftItemDelegate::paint(QPainter * painter, const QStyleOptionViewItem painter->setBrush(Qt::NoBrush); painter->drawRect(contentRect.left(), yPos, thumbnail.width(), thumbnail.height()); + // draw bottom dividing line + painter->drawLine(contentRect.left(), contentRect.bottom() + MARGIN, + contentRect.right(), contentRect.bottom() + MARGIN); + int variantCount = index.data(AircraftVariantCountRole).toInt(); int currentVariant =index.data(AircraftVariantRole).toInt(); QString description = index.data(Qt::DisplayRole).toString(); @@ -125,15 +129,17 @@ void AircraftItemDelegate::paint(QPainter * painter, const QStyleOptionViewItem r.moveLeft(r.right()); r.setHeight(24); - drawRating(painter, "Flight model:", r, index.data(AircraftRatingRole).toInt()); - r.moveTop(r.bottom()); - drawRating(painter, "Systems:", r, index.data(AircraftRatingRole + 1).toInt()); + if (index.data(AircraftHasRatingsRole).toBool()) { + drawRating(painter, "Flight model:", r, index.data(AircraftRatingRole).toInt()); + r.moveTop(r.bottom()); + drawRating(painter, "Systems:", r, index.data(AircraftRatingRole + 1).toInt()); - r.moveTop(actualBounds.bottom() + MARGIN); - r.moveLeft(r.right()); - drawRating(painter, "Cockpit:", r, index.data(AircraftRatingRole + 2).toInt()); - r.moveTop(r.bottom()); - drawRating(painter, "Exterior model:", r, index.data(AircraftRatingRole + 3).toInt()); + r.moveTop(actualBounds.bottom() + MARGIN); + r.moveLeft(r.right()); + drawRating(painter, "Cockpit:", r, index.data(AircraftRatingRole + 2).toInt()); + r.moveTop(r.bottom()); + drawRating(painter, "Exterior model:", r, index.data(AircraftRatingRole + 3).toInt()); + } QVariant v = index.data(AircraftPackageStatusRole); AircraftItemStatus status = static_cast<AircraftItemStatus>(v.toInt()); @@ -182,8 +188,13 @@ QSize AircraftItemDelegate::sizeHint(const QStyleOptionViewItem & option, const textHeight += smallMetrics.boundingRect(contentRect, Qt::TextWordWrap, desc).height(); } - // ratings - textHeight += 48; // (24px per rating box) + if (index.data(AircraftHasRatingsRole).toBool()) { + // ratings + textHeight += 48; // (24px per rating box) + } else { + // just the button height + textHeight += BUTTON_HEIGHT; + } textHeight = qMax(textHeight, 128); @@ -262,13 +273,13 @@ QRect AircraftItemDelegate::packageButtonRect(const QRect& visualRect, const QMo QPixmap thumbnail = index.data(Qt::DecorationRole).value<QPixmap>(); contentRect.setLeft(contentRect.left() + MARGIN + thumbnail.width()); - return QRect(contentRect.left() + ARROW_SIZE, contentRect.bottom() - 24, 60, 24); + return QRect(contentRect.left() + ARROW_SIZE, contentRect.bottom() - 24, 60, BUTTON_HEIGHT); } void AircraftItemDelegate::drawRating(QPainter* painter, QString label, const QRect& box, int value) const { const int DOT_SIZE = 10; - const int DOT_MARGIN = 4; + const int DOT_MARGIN = 2; QRect dotBox = box; dotBox.setLeft(box.right() - (DOT_MARGIN * 6 + DOT_SIZE * 5)); diff --git a/src/GUI/AircraftItemDelegate.hxx b/src/GUI/AircraftItemDelegate.hxx index 0a5f3f609..f2a398872 100644 --- a/src/GUI/AircraftItemDelegate.hxx +++ b/src/GUI/AircraftItemDelegate.hxx @@ -31,6 +31,7 @@ class AircraftItemDelegate : public QStyledItemDelegate public: static const int MARGIN = 4; static const int ARROW_SIZE = 20; + static const int BUTTON_HEIGHT = 24; AircraftItemDelegate(QListView* view); diff --git a/src/GUI/AircraftModel.cxx b/src/GUI/AircraftModel.cxx index a7e2b00cd..e357bb02e 100644 --- a/src/GUI/AircraftModel.cxx +++ b/src/GUI/AircraftModel.cxx @@ -41,13 +41,15 @@ using namespace simgear::pkg; -AircraftItem::AircraftItem() +AircraftItem::AircraftItem() : + excluded(false) { // oh for C++11 initialisers for (int i=0; i<4; ++i) ratings[i] = 0; } -AircraftItem::AircraftItem(QDir dir, QString filePath) +AircraftItem::AircraftItem(QDir dir, QString filePath) : + excluded(false) { for (int i=0; i<4; ++i) ratings[i] = 0; @@ -62,6 +64,10 @@ AircraftItem::AircraftItem(QDir dir, QString filePath) path = filePath; pathModTime = QFileInfo(path).lastModified(); + if (sim->getBoolValue("exclude-from-gui", false)) { + excluded = true; + return; + } description = sim->getStringValue("description"); authors = sim->getStringValue("author"); @@ -89,16 +95,24 @@ QString AircraftItem::baseName() const void AircraftItem::fromDataStream(QDataStream& ds) { - ds >> path >> description >> authors >> variantOf; + ds >> path >> pathModTime >> excluded; + if (excluded) { + return; + } + + ds >> description >> authors >> variantOf; for (int i=0; i<4; ++i) ds >> ratings[i]; - ds >> pathModTime; } void AircraftItem::toDataStream(QDataStream& ds) const { - ds << path << description << authors << variantOf; + ds << path << pathModTime << excluded; + if (excluded) { + return; + } + + ds << description << authors << variantOf; for (int i=0; i<4; ++i) ds << ratings[i]; - ds << pathModTime; } QPixmap AircraftItem::thumbnail() const @@ -119,7 +133,7 @@ QPixmap AircraftItem::thumbnail() const } -static int CACHE_VERSION = 2; +static int CACHE_VERSION = 3; class AircraftScanThread : public QThread { @@ -239,6 +253,10 @@ private: m_nextCache[absolutePath] = item; + if (item->excluded) { + continue; + } + if (item->variantOf.isNull()) { baseAircraft.insert(item->baseName(), item); } else { @@ -394,6 +412,12 @@ QVariant AircraftItemModel::dataFromItem(const AircraftItem* item, quint32 varia return PackageInstalled; // always the case } else if (role == Qt::ToolTipRole) { return item->path; + } else if (role == AircraftHasRatingsRole) { + bool have = false; + for (int i=0; i<4; ++i) { + have |= (item->ratings[i] > 0); + } + return have; } else if (role == AircraftLongDescriptionRole) { return "Lorum Ipsum, etc. Is this the real life? Is this just fantasy? Caught in a land-slide, " "no escape from reality. Open your eyes, like up to the skies and see. " diff --git a/src/GUI/AircraftModel.hxx b/src/GUI/AircraftModel.hxx index 6ce258333..c1bb77cf0 100644 --- a/src/GUI/AircraftModel.hxx +++ b/src/GUI/AircraftModel.hxx @@ -38,6 +38,7 @@ const int AircraftPackageIdRole = Qt::UserRole + 6; const int AircraftPackageStatusRole = Qt::UserRole + 7; const int AircraftPackageProgressRole = Qt::UserRole + 8; const int AircraftLongDescriptionRole = Qt::UserRole + 9; +const int AircraftHasRatingsRole = Qt::UserRole + 10; const int AircraftRatingRole = Qt::UserRole + 100; const int AircraftVariantDescriptionRole = Qt::UserRole + 200; @@ -61,6 +62,7 @@ struct AircraftItem QPixmap thumbnail() const; + bool excluded; QString path; QString description; QString authors;