Пример #1
0
void KHistoryComboBox::slotSimulateActivated( const QString& text )
{
    /* With the insertion policy NoInsert, which we use by default,
       Qt doesn't emit activated on typed text if the item is not already there,
       which is perhaps reasonable. Generate the signal ourselves if that's the case.
    */
    if ((insertPolicy() == NoInsert && findText(text, Qt::MatchFixedString|Qt::MatchCaseSensitive) == -1)) {
        emit activated(text);
    }

    /*
       Qt also doesn't emit it if the box is full, and policy is not
       InsertAtCurrent
    */
    else if (insertPolicy() != InsertAtCurrent && count() >= maxCount()) {
        emit activated(text);
    }
}
Пример #2
0
 Allocator::Allocator(const SpillPolicy::RegisterId regs, const policy_t spillPolicies)
 {
   setRegisters(regs);
   assertM(spillPolicies != 0, "No spill policy");
   for(SpillType i = SpillType::LRU; i <= spillPolicies;
       i = (SpillType) ((unsigned) (i) * 2))
   {
     if(spillPolicies & i)
     {
       insertPolicy(i, 1);
     }
   }
 }
Пример #3
0
void LibraryHeader::paintEvent(QPaintEvent *)
{
	QStyleOptionButton option;
	option.initFrom(this);

	QStylePainter p(this);
	QColor base = QApplication::palette().base().color();

	// Gradient
	QLinearGradient g(rect().topLeft(), rect().bottomLeft());
	g.setColorAt(0, base);
	g.setColorAt(1, QApplication::palette().window().color());
	p.fillRect(rect(), g);

	// Text
	QString header;
	auto settings = SettingsPrivate::instance();
	switch (settings->insertPolicy()) {
	case SettingsPrivate::IP_Albums:
		header = tr("Album");
		break;
	case SettingsPrivate::IP_ArtistsAlbums:
		header = tr("Artist – Album");
		break;
	case SettingsPrivate::IP_Years:
		header = tr("Year");
		break;
	case SettingsPrivate::IP_Artists:
	default:
		header = tr("Artist \\ Album");
		break;
	}

	QFont f = settings->font(SettingsPrivate::FF_Library);
	p.setFont(f);
	QFontMetrics fm(f);
	this->setMinimumHeight(fm.height());

	// Check if label should be elided (in case of large font and small area on screen)
	QString elided = fm.elidedText(header, Qt::ElideRight, parentWidget()->width());
	p.setPen(QApplication::palette().windowText().color());
	p.drawText(rect().adjusted(10, 0, 0, 0), Qt::AlignVCenter | Qt::AlignLeft, elided);

	// Draw a thin line before the treeview
	p.save();
	p.setPen(base.darker(115));
	p.drawLine(rect().bottomLeft(), rect().bottomRight());
	p.restore();

	// Draw sort indicator
	static const QPointF sortIndicatorDown[3] = {
		QPointF(0.0, 0.0),
		QPointF(2.0, 0.0),
		QPointF(1.0, 1.0)
	};
	static const QPointF sortIndicatorUp[3] = {
		QPointF(0.0, 1.0),
		QPointF(1.0, 0.0),
		QPointF(2.0, 1.0)
	};

	int minX = rect().center().x() - (rect().height() / 2);
	if (fm.width(elided) > minX - 20) {
		/// XXX: improve this
		minX = fm.width(header) + 20;
	}
	p.save();
	p.translate(minX, rect().height() / 2.5);

	// Highlight the sort indicator if needed
	if (option.state.testFlag(QStyle::State_MouseOver)) {
		p.setPen(QApplication::palette().highlight().color());
		p.setBrush(QApplication::palette().highlight().color().lighter());
	} else {
		p.setPen(QApplication::palette().mid().color());
		p.setBrush(Qt::NoBrush);
	}
	QTransform t;
	float ratio = (float) rect().height() / 6.0;
	t.scale(ratio, ratio);
	QPolygonF sortIndicator;
	if (Qt::DescendingOrder == _order) {
		sortIndicator.append(t.map(sortIndicatorDown[0]));
		sortIndicator.append(t.map(sortIndicatorDown[1]));
		sortIndicator.append(t.map(sortIndicatorDown[2]));
	} else {
		sortIndicator.append(t.map(sortIndicatorUp[0]));
		sortIndicator.append(t.map(sortIndicatorUp[1]));
		sortIndicator.append(t.map(sortIndicatorUp[2]));
	}
	p.drawPolygon(sortIndicator);
	p.restore();
}
Пример #4
0
/** Read all tracks entries in the database and send them to connected views. */
void LibraryItemModel::load(const QString &)
{
	this->reset();

	SqlDatabase db;

	QSqlQuery q("SELECT uri, trackNumber, trackTitle, artist, artistNormalized, album, albumNormalized, artistAlbum, " \
				"albumYear, trackLength, rating, disc, internalCover, cover, host, icon FROM cache ORDER BY uri, internalCover", db);
	q.setForwardOnly(true);
	if (!q.exec()) {
		return;
	}
	const int uri = 0, trackNumber = 1, trackTitle = 2, artist = 3, artistNorm = 4, album = 5, albumNorm = 6, artistAlbum = 7,
			year = 8, trackLength = 9, rating = 10, disc = 11, internalCover = 12, cover = 13, host = 14, icon = 15;

	// Lambda function to reduce duplicate code which is relevant in this method only
	auto loadTrack = [=] (QSqlRecord& r) -> TrackItem* {
		TrackItem *trackItem = new TrackItem;
		trackItem->setText(r.value(trackTitle).toString());
		trackItem->setData(r.value(uri).toString(), Miam::DF_URI);
		trackItem->setData(r.value(trackNumber).toString(), Miam::DF_TrackNumber);
		trackItem->setData(r.value(disc).toString(), Miam::DF_DiscNumber);
		trackItem->setData(r.value(trackLength).toUInt(), Miam::DF_TrackLength);
		if (r.value(rating).toInt() != -1) {
			trackItem->setData(r.value(rating).toInt(), Miam::DF_Rating);
		}
		trackItem->setData(r.value(artist).toString(), Miam::DF_Artist);
		trackItem->setData(r.value(album).toString(), Miam::DF_Album);
		trackItem->setData(!r.value(host).toString().isEmpty(), Miam::DF_IsRemote);
		return trackItem;
	};

	auto s = SettingsPrivate::instance();
	switch (s->insertPolicy()) {
	case SettingsPrivate::IP_Artists: {
		QStringList filters;
		if (s->isLibraryFilteredByArticles() && !s->libraryFilteredByArticles().isEmpty()) {
			filters = s->libraryFilteredByArticles();
		}

		QHash<uint, ArtistItem*> _artists;
		QHash<uint, AlbumItem*> _albums;

		while (q.next()) {
			QSqlRecord r = q.record();

			ArtistItem *artistItem = new ArtistItem;
			QString artistNormalized = r.value(artistNorm).toString();
			QString albumNormalized = r.value(albumNorm).toString();
			QString artist = r.value(3).toString();
			QString aa = r.value(artistAlbum).toString();
			artistItem->setText(aa);
			for (QString filter : filters) {
				if (artist.startsWith(filter + " ", Qt::CaseInsensitive)) {
					artist = artist.mid(filter.length() + 1);
					artistItem->setData(artist + ", " + filter, Miam::DF_CustomDisplayText);
					break;
				}
			}

			if (artistNormalized.isEmpty() || !artistNormalized.contains(QRegularExpression("[\\w]"))) {
				artistItem->setData("0", Miam::DF_NormalizedString);
			} else {
				artistItem->setData(artistNormalized, Miam::DF_NormalizedString);
			}

			// Add artist
			if (_artists.contains(artistItem->hash())) {
				auto it = _artists.find(artistItem->hash());
				delete artistItem;
				artistItem = (*it);
			} else {
				_artists.insert(artistItem->hash(), artistItem);
				invisibleRootItem()->appendRow(artistItem);

				// Also check if newly inserted artist needs to insert a separator
				if (SeparatorItem *separator = this->insertSeparator(artistItem)) {
					_topLevelItems.insert(separator, artistItem->index());
				}
			}

			AlbumItem *albumItem = new AlbumItem;
			if (r.value(albumNorm).toString().isEmpty() || !r.value(albumNorm).toString().contains(QRegularExpression("[\\w]"))) {
				albumItem->setData("0", Miam::DF_NormalizedString);
			} else {
				albumItem->setData(r.value(albumNorm).toString(), Miam::DF_NormalizedString);
			}
			albumItem->setData(artistNormalized, Miam::DF_NormArtist);
			albumItem->setData(albumNormalized, Miam::DF_NormAlbum);
			albumItem->setData(r.value(year).toString(), Miam::DF_Year);

			QString internalCoverPath = r.value(internalCover).toString();
			QString coverPath = r.value(cover).toString();

			// Add album
			if (_albums.contains(albumItem->hash())) {
				auto it = _albums.find(albumItem->hash());
				delete albumItem;
				albumItem = *it;
				if (albumItem->data(Miam::DF_InternalCover).toString().isEmpty() && !internalCoverPath.isEmpty()) {
					albumItem->setData(internalCoverPath, Miam::DF_InternalCover);
				}
				if (albumItem->data(Miam::DF_CoverPath).toString().isEmpty() && !coverPath.isEmpty()) {
					albumItem->setData(coverPath, Miam::DF_CoverPath);
				}
			} else {

				albumItem->setText(r.value(album).toString());
				albumItem->setData(internalCoverPath, Miam::DF_InternalCover);
				albumItem->setData(coverPath, Miam::DF_CoverPath);
				albumItem->setData(r.value(icon).toString(), Miam::DF_IconPath);
				albumItem->setData(!r.value(host).toString().isEmpty(), Miam::DF_IsRemote);

				_albums.insert(albumItem->hash(), albumItem);
				artistItem->appendRow(albumItem);
			}

			// Add tracks
			albumItem->appendRow(loadTrack(r));
		}
		break;
	}
	case SettingsPrivate::IP_Albums: {

		QHash<uint, AlbumItem*> _albums;
		while (q.next()) {
			QSqlRecord r = q.record();
			QString artistNormalized = r.value(artistNorm).toString();
			QString albumNormalized = r.value(albumNorm).toString();

			AlbumItem *albumItem = new AlbumItem;
			albumItem->setText(r.value(album).toString());
			if (r.value(albumNorm).toString().isEmpty() || !r.value(albumNorm).toString().contains(QRegularExpression("[\\w]"))) {
				albumItem->setData("0", Miam::DF_NormalizedString);
			} else {
				albumItem->setData(r.value(albumNorm).toString(), Miam::DF_NormalizedString);
			}
			albumItem->setData(artistNormalized, Miam::DF_NormArtist);
			albumItem->setData(albumNormalized, Miam::DF_NormAlbum);
			albumItem->setData(r.value(year).toString(), Miam::DF_Year);
			if (!r.value(internalCover).toString().isEmpty()) {
				albumItem->setData(r.value(internalCover).toString(), Miam::DF_InternalCover);
			}
			albumItem->setData(r.value(cover).toString(), Miam::DF_CoverPath);
			albumItem->setData(r.value(icon).toString(), Miam::DF_IconPath);
			albumItem->setData(!r.value(host).toString().isEmpty(), Miam::DF_IsRemote);

			// Add album
			if (_albums.contains(albumItem->hash())) {
				auto it = _albums.find(albumItem->hash());
				delete albumItem;
				albumItem = (*it);
			} else {
				_albums.insert(albumItem->hash(), albumItem);
				invisibleRootItem()->appendRow(albumItem);
				// Also check if newly inserted artist needs to insert a separator
				if (SeparatorItem *separator = this->insertSeparator(albumItem)) {
					_topLevelItems.insert(separator, albumItem->index());
				}
			}

			// Add tracks
			albumItem->appendRow(loadTrack(r));
		}
		break;
	}
	case SettingsPrivate::IP_ArtistsAlbums: {
		QHash<uint, AlbumItem*> _albums;
		while (q.next()) {
			QSqlRecord r = q.record();
			QString artistNormalized = r.value(artistNorm).toString();
			QString albumNormalized = r.value(albumNorm).toString();

			AlbumItem *albumItem = new AlbumItem;
			albumItem->setText(r.value(artist).toString() + " – " + r.value(album).toString());
			albumItem->setData(artistNormalized + "|" + albumNormalized, Miam::DF_NormalizedString);
			albumItem->setData(artistNormalized, Miam::DF_NormArtist);
			albumItem->setData(albumNormalized, Miam::DF_NormAlbum);
			albumItem->setData(r.value(year).toString(), Miam::DF_Year);
			albumItem->setData(r.value(cover).toString(), Miam::DF_CoverPath);
			albumItem->setData(r.value(icon).toString(), Miam::DF_IconPath);
			albumItem->setData(!r.value(host).toString().isEmpty(), Miam::DF_IsRemote);

			// Add album
			if (_albums.contains(albumItem->hash())) {
				auto it = _albums.find(albumItem->hash());
				delete albumItem;
				albumItem = *it;
			} else {
				_albums.insert(albumItem->hash(), albumItem);
				invisibleRootItem()->appendRow(albumItem);
				// Also check if newly inserted artist needs to insert a separator
				if (SeparatorItem *separator = this->insertSeparator(albumItem)) {
					_topLevelItems.insert(separator, albumItem->index());
				}
			}

			// Add tracks
			albumItem->appendRow(loadTrack(r));
		}
		break;
	}
	case SettingsPrivate::IP_Years: {

		QHash<uint, YearItem*> _years;
		QHash<uint, AlbumItem*> _artistAlbums;

		while (q.next()) {
			QSqlRecord r = q.record();
			YearItem *yearItem = new YearItem(r.value(year).toString());

			// Add year
			if (_years.contains(yearItem->hash())) {
				auto it = _years.find(yearItem->hash());
				delete yearItem;
				yearItem = (*it);
			} else {
				_years.insert(yearItem->hash(), yearItem);
				invisibleRootItem()->appendRow(yearItem);

				// Also check if newly inserted artist needs to insert a separator
				if (SeparatorItem *separator = this->insertSeparator(yearItem)) {
					_topLevelItems.insert(separator, yearItem->index());
				}
			}

			// Add Artist - Album
			AlbumItem *artistAlbumItem = new AlbumItem;
			artistAlbumItem->setText(r.value(3).toString() + " – " + r.value(album).toString());
			artistAlbumItem->setData(r.value(artistNorm).toString() + "|" + r.value(albumNorm).toString(), Miam::DF_NormalizedString);
			artistAlbumItem->setData(r.value(artistNorm).toString(), Miam::DF_NormArtist);
			artistAlbumItem->setData(r.value(albumNorm).toString(), Miam::DF_NormAlbum);
			artistAlbumItem->setData(r.value(year).toString(), Miam::DF_Year);
			artistAlbumItem->setData(r.value(cover).toString(), Miam::DF_CoverPath);
			artistAlbumItem->setData(r.value(icon).toString(), Miam::DF_IconPath);
			artistAlbumItem->setData(!r.value(14).toString().isEmpty(), Miam::DF_IsRemote);

			if (_artistAlbums.contains(artistAlbumItem->hash())) {
				auto it = _artistAlbums.find(artistAlbumItem->hash());
				delete artistAlbumItem;
				artistAlbumItem = *it;
			} else {
				_artistAlbums.insert(artistAlbumItem->hash(), artistAlbumItem);
				yearItem->appendRow(artistAlbumItem);
			}

			// Add tracks
			artistAlbumItem->appendRow(loadTrack(r));
		}
		break;
	}
	}

	this->sort(0);
}
int QComboBox::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
{
    _id = QWidget::qt_metacall(_c, _id, _a);
    if (_id < 0)
        return _id;
    if (_c == QMetaObject::InvokeMetaMethod) {
        if (_id < 24)
            qt_static_metacall(this, _c, _id, _a);
        _id -= 24;
    }
#ifndef QT_NO_PROPERTIES
      else if (_c == QMetaObject::ReadProperty) {
        void *_v = _a[0];
        switch (_id) {
        case 0: *reinterpret_cast< bool*>(_v) = isEditable(); break;
        case 1: *reinterpret_cast< int*>(_v) = count(); break;
        case 2: *reinterpret_cast< QString*>(_v) = currentText(); break;
        case 3: *reinterpret_cast< int*>(_v) = currentIndex(); break;
        case 4: *reinterpret_cast< int*>(_v) = maxVisibleItems(); break;
        case 5: *reinterpret_cast< int*>(_v) = maxCount(); break;
        case 6: *reinterpret_cast< InsertPolicy*>(_v) = insertPolicy(); break;
        case 7: *reinterpret_cast< SizeAdjustPolicy*>(_v) = sizeAdjustPolicy(); break;
        case 8: *reinterpret_cast< int*>(_v) = minimumContentsLength(); break;
        case 9: *reinterpret_cast< QSize*>(_v) = iconSize(); break;
        case 10: *reinterpret_cast< bool*>(_v) = autoCompletion(); break;
        case 11: *reinterpret_cast< Qt::CaseSensitivity*>(_v) = autoCompletionCaseSensitivity(); break;
        case 12: *reinterpret_cast< bool*>(_v) = duplicatesEnabled(); break;
        case 13: *reinterpret_cast< bool*>(_v) = hasFrame(); break;
        case 14: *reinterpret_cast< int*>(_v) = modelColumn(); break;
        }
        _id -= 15;
    } else if (_c == QMetaObject::WriteProperty) {
        void *_v = _a[0];
        switch (_id) {
        case 0: setEditable(*reinterpret_cast< bool*>(_v)); break;
        case 3: setCurrentIndex(*reinterpret_cast< int*>(_v)); break;
        case 4: setMaxVisibleItems(*reinterpret_cast< int*>(_v)); break;
        case 5: setMaxCount(*reinterpret_cast< int*>(_v)); break;
        case 6: setInsertPolicy(*reinterpret_cast< InsertPolicy*>(_v)); break;
        case 7: setSizeAdjustPolicy(*reinterpret_cast< SizeAdjustPolicy*>(_v)); break;
        case 8: setMinimumContentsLength(*reinterpret_cast< int*>(_v)); break;
        case 9: setIconSize(*reinterpret_cast< QSize*>(_v)); break;
        case 10: setAutoCompletion(*reinterpret_cast< bool*>(_v)); break;
        case 11: setAutoCompletionCaseSensitivity(*reinterpret_cast< Qt::CaseSensitivity*>(_v)); break;
        case 12: setDuplicatesEnabled(*reinterpret_cast< bool*>(_v)); break;
        case 13: setFrame(*reinterpret_cast< bool*>(_v)); break;
        case 14: setModelColumn(*reinterpret_cast< int*>(_v)); break;
        }
        _id -= 15;
    } else if (_c == QMetaObject::ResetProperty) {
        _id -= 15;
    } else if (_c == QMetaObject::QueryPropertyDesignable) {
        _id -= 15;
    } else if (_c == QMetaObject::QueryPropertyScriptable) {
        _id -= 15;
    } else if (_c == QMetaObject::QueryPropertyStored) {
        _id -= 15;
    } else if (_c == QMetaObject::QueryPropertyEditable) {
        _id -= 15;
    } else if (_c == QMetaObject::QueryPropertyUser) {
        _id -= 15;
    }
#endif // QT_NO_PROPERTIES
    return _id;
}