For websites and forvo, don't add dummy word search results (as they don't have any index to search in) -- instead, make results empty, but mark the search uncertain, and don't mark the word input line as reddish in that case.

This is just a refinement on how the word search is done in the dictionaries
that don't actually ability to search words in. Previously they emitted dummy
italicized suggestions, which were getting in the way. Now they don't emit
anything, but mark the search as uncertain. Any uncertain searches don't mark
the word input with the different color to indicate the search has failed.
This commit is contained in:
Konstantin Isakov 2010-06-22 16:43:11 +04:00
parent cc5e5b6c77
commit 04bdf3aa36
6 changed files with 28 additions and 6 deletions

View file

@ -131,6 +131,9 @@ class WordSearchRequest: public Request
public: public:
WordSearchRequest(): uncertain( false )
{}
/// Returns the number of matches found. The value can grow over time /// Returns the number of matches found. The value can grow over time
/// unless isFinished() is true. /// unless isFinished() is true.
size_t matchesCount(); size_t matchesCount();
@ -143,6 +146,12 @@ public:
/// done, this can only be called after the request has finished. /// done, this can only be called after the request has finished.
vector< WordMatch > & getAllMatches() throw( exRequestUnfinished ); vector< WordMatch > & getAllMatches() throw( exRequestUnfinished );
/// Returns true if the match was uncertain -- that is, there may be more
/// results in the dictionary itself, the dictionary index isn't good enough
/// to tell that.
bool isUncertain() const
{ return uncertain; }
protected: protected:
// Subclasses should be filling up the 'matches' array, locking the mutex when // Subclasses should be filling up the 'matches' array, locking the mutex when
@ -150,6 +159,7 @@ protected:
Mutex dataMutex; Mutex dataMutex;
vector< WordMatch > matches; vector< WordMatch > matches;
bool uncertain;
}; };
/// This request type corresponds to any kinds of data responses where a /// This request type corresponds to any kinds of data responses where a
@ -202,6 +212,9 @@ public:
vector< WordMatch > & getMatches() vector< WordMatch > & getMatches()
{ return matches; } { return matches; }
void setUncertain( bool value )
{ uncertain = value; }
}; };
/// A helper class for syncronous data read implementations. /// A helper class for syncronous data read implementations.

View file

@ -54,13 +54,12 @@ public:
virtual QIcon getIcon() throw(); virtual QIcon getIcon() throw();
virtual sptr< WordSearchRequest > prefixMatch( wstring const & word, virtual sptr< WordSearchRequest > prefixMatch( wstring const & /*word*/,
unsigned long /*maxResults*/ ) throw( std::exception ) unsigned long /*maxResults*/ ) throw( std::exception )
{ {
// Dummy
sptr< WordSearchRequestInstant > sr = new WordSearchRequestInstant; sptr< WordSearchRequestInstant > sr = new WordSearchRequestInstant;
sr->getMatches().push_back( WordMatch( word, 1 ) ); sr->setUncertain( true );
return sr; return sr;
} }

View file

@ -1053,7 +1053,7 @@ void MainWindow::updateMatchResults( bool finished )
// Visually mark the input line to mark if there's no results // Visually mark the input line to mark if there's no results
bool setMark = results.empty(); bool setMark = results.empty() && !wordFinder.wasSearchUncertain();
if ( ui.translateLine->property( "noResults" ).toBool() != setMark ) if ( ui.translateLine->property( "noResults" ).toBool() != setMark )
{ {

View file

@ -52,12 +52,12 @@ public:
throw( std::exception ); throw( std::exception );
}; };
sptr< WordSearchRequest > WebSiteDictionary::prefixMatch( wstring const & word, sptr< WordSearchRequest > WebSiteDictionary::prefixMatch( wstring const & /*word*/,
unsigned long ) throw( std::exception ) unsigned long ) throw( std::exception )
{ {
sptr< WordSearchRequestInstant > sr = new WordSearchRequestInstant; sptr< WordSearchRequestInstant > sr = new WordSearchRequestInstant;
sr->getMatches().push_back( WordMatch( word, 1 ) ); sr->setUncertain( true );
return sr; return sr;
} }

View file

@ -95,6 +95,7 @@ void WordFinder::startSearch()
finishedRequests.clear(); finishedRequests.clear();
searchErrorString.clear(); searchErrorString.clear();
searchResultsUncertain = false;
searchQueued = false; searchQueued = false;
searchInProgress = true; searchInProgress = true;
@ -167,6 +168,9 @@ void WordFinder::requestFinished()
if ( searchInProgress && !(*i)->getErrorString().isEmpty() ) if ( searchInProgress && !(*i)->getErrorString().isEmpty() )
searchErrorString = tr( "Failed to query some dictionaries." ); searchErrorString = tr( "Failed to query some dictionaries." );
if ( (*i)->isUncertain() )
searchResultsUncertain = true;
if ( (*i)->matchesCount() ) if ( (*i)->matchesCount() )
{ {
newResults = true; newResults = true;

View file

@ -28,6 +28,7 @@ private:
SearchResults searchResults; SearchResults searchResults;
QString searchErrorString; QString searchErrorString;
bool searchResultsUncertain;
std::list< sptr< Dictionary::WordSearchRequest > > queuedRequests, std::list< sptr< Dictionary::WordSearchRequest > > queuedRequests,
finishedRequests; finishedRequests;
bool searchInProgress; bool searchInProgress;
@ -104,6 +105,11 @@ public:
QString const & getErrorString() QString const & getErrorString()
{ return searchErrorString; } { return searchErrorString; }
/// Returns true if the search was inconclusive -- that is, there may be more
/// results than the ones returned.
bool wasSearchUncertain() const
{ return searchResultsUncertain; }
/// Cancels any pending search operation, if any. /// Cancels any pending search operation, if any.
void cancel(); void cancel();