From kde-commits Thu Jan 22 15:29:25 2009 From: =?utf-8?q?Ryan=20P=2E=20Bitanga?= Date: Thu, 22 Jan 2009 15:29:25 +0000 To: kde-commits Subject: branches/KDE/4.2/kdebase/workspace/krunner/interfaces/quicksand Message-Id: <1232638165.656405.24010.nullmailer () svn ! kde ! org> X-MARC-Message: https://marc.info/?l=kde-commits&m=123263817327388 SVN commit 915220 by rbitanga: Backport quicksand bugfixes for showing text mode/restoring normal mode on reset M +30 -2 qs_dialog.cpp M +2 -0 qs_dialog.h M +43 -27 qs_matchview.cpp M +2 -1 qs_matchview.h --- branches/KDE/4.2/kdebase/workspace/krunner/interfaces/quicksand/qs_dialog.cpp #915219:915220 @@ -1,6 +1,6 @@ /* * Copyright (C) 2006 by Aaron Seigo - * Copyright (C) 2007-2008 Ryan P. Bitanga + * Copyright (C) 2007-2009 Ryan P. Bitanga * Copyright (C) 2008 by Davide Bettio * * This program is free software; you can redistribute it and/or modify @@ -108,6 +108,8 @@ connect(m_actionView, SIGNAL(itemActivated(MatchItem*)), this, SLOT(run(MatchItem*))); m_matchView->setFocus(); + + m_newQuery = true; } QsDialog::~QsDialog() @@ -145,6 +147,7 @@ m_matchView->showLoading(); } m_runnerManager->launchQuery(query); + m_newQuery = true; } void QsDialog::run(MatchItem *item) @@ -184,7 +187,28 @@ void QsDialog::setMatches(const QList &matches) { QList items; + QMultiMap temp; + QMultiMap::iterator end = m_matches.end(); foreach (Plasma::QueryMatch match, matches) { + temp.insert(match.id(), match); + // Do not create new MatchItems for existing matches when the query hasn't changed + if (!m_newQuery && m_matches.find(match.id()) != end) { + // kDebug() << "A match with id " << match.id() << " already exists." << endl; + QList duplicates = m_matches.values(match.id()); + bool exists = false; + foreach (Plasma::QueryMatch m, duplicates) { + // FIXME: Matching the displayed text isn't always reliable + // maybe adding an operator== to QueryMatch would help + if (m.text() == match.text()) { + exists = true; + break; + } + } + + if (exists) { + continue; + } + } MatchItem *m = new QuickSand::QueryMatchItem(match); switch(match.type()) { @@ -201,7 +225,11 @@ } items.append(m); } - m_matchView->setItems(items); + // kDebug() << "Add " << items.size() << " matches. Append?" << !m_newQuery << endl; + m_matchView->setItems(items, true, !m_newQuery); + m_matches = temp; + // If new matches are obtained for the same query, append them to the list + m_newQuery = false; } void QsDialog::setAction(MatchItem *item) --- branches/KDE/4.2/kdebase/workspace/krunner/interfaces/quicksand/qs_dialog.h #915219:915220 @@ -58,6 +58,8 @@ void loadActions(MatchItem *item); void setAction(MatchItem *item); private: + bool m_newQuery; + QMultiMap m_matches; QuickSand::QsMatchView *m_matchView; QuickSand::QsMatchView *m_actionView; QuickSand::QueryMatchItem *m_currentMatch; --- branches/KDE/4.2/kdebase/workspace/krunner/interfaces/quicksand/qs_matchview.cpp #915219:915220 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2007-2008 Ryan P. Bitanga + * Copyright (C) 2007-2009 Ryan P. Bitanga * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -74,6 +74,7 @@ bool m_hasFocus; bool m_itemsRemoved; bool m_listVisible; + bool m_selectionMade; }; QsMatchView::QsMatchView(QWidget *parent) @@ -85,6 +86,7 @@ d->m_hasFocus = false; d->m_itemsRemoved = false; d->m_listVisible = true; + d->m_selectionMade = false; //Prevent completion box from popping up once a user chooses a match //FIXME: don't hardcode black setStyleSheet("QListWidget {color: black} QLineEdit {color: black}"); @@ -157,8 +159,10 @@ { clear(true); + d->m_stack->setCurrentIndex(0); d->m_arrowButton->hide(); d->m_listVisible = true; + d->m_selectionMade = false; d->m_hasFocus = false; d->m_searchTerm = QString(); d->m_compBox->clear(); @@ -172,26 +176,35 @@ setDescriptionText(i18n("Type to search.")); } -void QsMatchView::setItems(const QList &items, bool popup) +void QsMatchView::setItems(const QList &items, bool popup, bool append) { + int spacing = MatchItem::ITEM_SIZE/2; - clear(true); + int pos = spacing; - d->m_compBox->clear(); + if (!append) { + clear(true); + d->m_compBox->clear(); - d->m_currentItem = -1; - d->m_items = items; + d->m_currentItem = -1; + d->m_items = items; + } else { + // FIXME: This completely disregards item ranking + // Maybe should we just sort then scroll to previously selected item + if (!d->m_items.isEmpty()) { + pos += d->m_items.last()->pos().x(); + } + d->m_items << items; + } - int spacing = MatchItem::ITEM_SIZE/2; - - int pos = spacing; - - foreach(MatchItem *item, d->m_items) { + foreach(MatchItem *item, items) { if (item) { item->setPos(pos, SMALL_ICON_PADDING); item->scale(0.5, 0.5); pos += spacing; - d->m_scene->addItem(item); + if (d->m_listVisible) { + d->m_scene->addItem(item); + } QString description; if (item->description().isEmpty()) { description = item->name(); @@ -204,7 +217,14 @@ } d->m_itemsRemoved = false; setItemCount(d->m_items.size()); + + if (d->m_selectionMade) { + //kDebug() << "A user selection was already made" << endl; + return; + } + scrollToItem(0); + //Ensure popup is shown if desired if (popup) { if (items.size()) { @@ -262,7 +282,11 @@ d->m_descRect->setBrush(b); d->m_descRect->setPen(p); - d->m_descText = new QGraphicsTextItem(text, d->m_descRect); + QFontMetrics fm(font()); + + // Show ellipsis in the middle to distinguish between strings with identical + // beginnings e.g. paths + d->m_descText = new QGraphicsTextItem(fm.elidedText(text, Qt::ElideMiddle, WIDTH), d->m_descRect); //Center text d->m_descText->setPos(-(d->m_descText->boundingRect().width()/2), 60); @@ -306,11 +330,6 @@ void QsMatchView::showLoading() { clear(true); -// QPointF pos[8]; -// for (int i = 0; i < 8; ++i) { -// pos[i] = QPointF(std::sin((i * 6.28) / 8.0) * 25, -// std::cos((i * 6.28) / 8.0) * 25); -// } d->m_descText = new QGraphicsTextItem(i18n("Loading..."), d->m_descRect); d->m_descText->setDefaultTextColor(QColor(Qt::white)); @@ -319,14 +338,6 @@ //Center text d->m_descText->setPos(-(d->m_descText->boundingRect().width()/2), (HEIGHT - fm.height())/2); d->m_scene->addItem(d->m_descText); - -// for (int i = 0; i < 8; ++i) { -// QGraphicsEllipseItem *item = new QGraphicsEllipseItem(0, 30, 6, 6); -// item->setPos(pos[i]); -// QBrush b(QColor(0, 0, 0, 255*i/8)); -// item->setBrush(b); -// d->m_scene->addItem(item); -// } } void QsMatchView::showList() @@ -352,7 +363,9 @@ void QsMatchView::showSelected() { if (!d->m_items.size()) { - reset(); + if (d->m_searchTerm.isEmpty()) { + reset(); + } return; } @@ -573,6 +586,7 @@ QWidget::keyPressEvent(e); return; } + switch (e->key()) { case Qt::Key_Period: //Switch to line edit @@ -606,6 +620,7 @@ && d->m_currentItem < d->m_items.size()) { emit itemActivated(d->m_items[d->m_currentItem]); } + d->m_selectionMade = true; showSelected(); return; default: @@ -620,6 +635,7 @@ } else { d->m_searchTerm += c; } + d->m_selectionMade = false; } } d->m_lineEdit->setText(d->m_searchTerm); --- branches/KDE/4.2/kdebase/workspace/krunner/interfaces/quicksand/qs_matchview.h #915219:915220 @@ -65,8 +65,9 @@ * Sets the list of items to be displayed on screen * @param items The list of items to display * @param popup Display the popup completion box + * @param append Append items to the current list instead of replacing it */ - void setItems(const QList &items, bool popup = true); + void setItems(const QList &items, bool popup = true, bool append = false); /** * Sets the item count text on the upper right hand corner