KNewStuff
itemsmodel.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "itemsmodel.h"
00020
00021 #include <kdebug.h>
00022
00023 namespace KNS
00024 {
00025 ItemsModel::ItemsModel(QObject * parent, bool hasWebService)
00026 : QAbstractListModel(parent), m_hasPreviewImages(false), m_hasWebService(hasWebService)
00027 {
00028 }
00029
00030 ItemsModel::~ItemsModel()
00031 {
00032 }
00033
00034 int ItemsModel::rowCount(const QModelIndex & ) const
00035 {
00036 return m_entries.count();
00037 }
00038
00039 QVariant ItemsModel::data(const QModelIndex & index, int role) const
00040 {
00041 Entry * entry = m_entries[index.row()];
00042 switch (role) {
00043 case Qt::DisplayRole:
00044 case kNameRole:
00045 return entry->name().representation();
00046 break;
00047 case kCategory:
00048 return entry->category();
00049 break;
00050 case kAuthorName:
00051 return entry->author().name();
00052 break;
00053 case kAuthorEmail:
00054 return entry->author().email();
00055 break;
00056 case kAuthorJabber:
00057 return entry->author().jabber();
00058 break;
00059 case kAuthorHomepage:
00060 return entry->author().homepage();
00061 break;
00062 case kLicense:
00063 return entry->license();
00064 break;
00065
00066 case kSummary:
00067 return entry->summary().representation();
00068 break;
00069 case kVersion:
00070 return entry->version();
00071 break;
00072 case kRelease:
00073 return entry->release();
00074 break;
00075 case kReleaseDate:
00076 return entry->releaseDate();
00077 break;
00078 case kPayload:
00079 return entry->payload().representation();
00080 break;
00081 case kPreview:
00082 return entry->preview().representation();
00083 break;
00084 case kPreviewPixmap:
00085 if (m_previewImages.contains(entry->preview().representation())) {
00086 return m_previewImages[entry->preview().representation()];
00087 }
00088 break;
00089 case kLargePreviewPixmap:
00090 if (m_largePreviewImages.contains(entry->preview().representation())) {
00091 return m_largePreviewImages[entry->preview().representation()];
00092 }
00093 break;
00094 case kRating:
00095 return entry->rating();
00096 break;
00097 case kDownloads:
00098 return entry->downloads();
00099 break;
00100 case kStatus:
00101 return entry->status();
00102 break;
00103 }
00104 return QVariant();
00105 }
00106
00107 KNS::Entry* ItemsModel::entryForIndex(const QModelIndex & index) const
00108 {
00109 if (index.row() < 0)
00110 return 0;
00111 else
00112 return m_entries[index.row()];
00113 }
00114
00115 void ItemsModel::addEntry(Entry * entry)
00116 {
00117
00118 beginInsertRows(QModelIndex(), m_entries.count(), m_entries.count());
00119 m_entries.append(entry);
00120 endInsertRows();
00121
00122 QString preview = entry->preview().representation();
00123 if (!preview.isEmpty()) {
00124 m_hasPreviewImages = true;
00125 m_imageIndexes.insert(preview, index(m_entries.count() - 1, 0));
00126 QAsyncPixmap *pix = new QAsyncPixmap(preview, this);
00127 connect(pix, SIGNAL(signalLoaded(const QString &, const QPixmap&)),
00128 this, SLOT(slotEntryPreviewLoaded(const QString &, const QPixmap&)));
00129 }
00130 }
00131
00132 void ItemsModel::removeEntry(Entry * entry)
00133 {
00134 kDebug(551) << "removing entry " << entry->name().representation() << " from the model";
00135 int index = m_entries.indexOf(entry);
00136 if (index > -1) {
00137 beginRemoveRows(QModelIndex(), index, index);
00138 m_entries.removeAt(index);
00139 endRemoveRows();
00140 }
00141 }
00142
00143 void ItemsModel::slotEntryChanged(Entry * entry)
00144 {
00145 int i = m_entries.indexOf(entry);
00146 QModelIndex entryIndex = index(i, 0);
00147 emit dataChanged(entryIndex, entryIndex);
00148 }
00149
00150 void ItemsModel::slotEntryPreviewLoaded(const QString &url, const QPixmap & pix)
00151 {
00152 if( pix.isNull())
00153 return;
00154 QImage image = pix.toImage();
00155 m_largePreviewImages.insert(url, image);
00156 m_previewImages.insert(url, image.scaled(64, 64, Qt::KeepAspectRatio));
00157
00158 QModelIndex thisIndex = m_imageIndexes[url];
00159
00160 emit dataChanged(thisIndex, thisIndex);
00161 }
00162
00163 bool ItemsModel::hasPreviewImages() const
00164 {
00165 return m_hasPreviewImages;
00166 }
00167
00168 bool ItemsModel::hasWebService() const
00169 {
00170 return m_hasWebService;
00171 }
00172
00173 }