/*
* Copyright (C) 2009, 2010, 2012, 2017 Nicolas Bonnefon and other contributors
*
* This file is part of glogg.
*
* glogg is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* glogg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with glogg. If not, see .
*/
// This file implements the FilteredView concrete class.
// Most of the actual drawing and event management is done in AbstractLogView
// Only behaviour specific to the filtered (bottom) view is implemented here.
#include
#include "filteredview.h"
FilteredView::FilteredView( LogFilteredData* newLogData,
const QuickFindPattern* const quickFindPattern, QWidget* parent )
: AbstractLogView( newLogData, quickFindPattern, parent )
{
// We keep a copy of the filtered data for fast lookup of the line type
logFilteredData_ = newLogData;
}
void FilteredView::setVisibility( Visibility visi )
{
assert( logFilteredData_ );
LogFilteredData::Visibility data_visibility =
LogFilteredData::MarksAndMatches;
switch ( visi ) {
case MarksOnly:
data_visibility = LogFilteredData::MarksOnly;
break;
case MatchesOnly:
data_visibility = LogFilteredData::MatchesOnly;
break;
case MarksAndMatches:
data_visibility = LogFilteredData::MarksAndMatches;
break;
};
logFilteredData_->setVisibility( data_visibility );
updateData();
}
// For the filtered view, a line is always matching!
AbstractLogView::LineType FilteredView::lineType( int lineNumber ) const
{
LogFilteredData::FilteredLineType type =
logFilteredData_->filteredLineTypeByIndex( lineNumber );
if ( type == LogFilteredData::Mark )
return Marked;
else
return Match;
}
qint64 FilteredView::displayLineNumber( int lineNumber ) const
{
// Display a 1-based index
return logFilteredData_->getMatchingLineNumber( lineNumber ) + 1;
}
qint64 FilteredView::maxDisplayLineNumber() const
{
return logFilteredData_->getNbTotalLines();
}
void FilteredView::keyPressEvent( QKeyEvent* keyEvent )
{
bool noModifier = keyEvent->modifiers() == Qt::NoModifier;
if ( keyEvent->key() == Qt::Key_BracketLeft && noModifier ) {
for ( qint64 i = static_cast( getViewPosition() ) - 1; i >= 0; --i ) {
if ( lineType( i ) == Marked ) {
selectAndDisplayLine( static_cast( i ) );
break;
}
}
keyEvent->accept();
}
else if ( keyEvent->key() == Qt::Key_BracketRight && noModifier ) {
for ( qint64 i = getViewPosition() + 1;
i < logFilteredData_->getNbLine(); ++i ) {
if ( lineType( i ) == Marked ) {
selectAndDisplayLine( static_cast( i ) );
break;
}
}
keyEvent->accept();
}
else {
keyEvent->ignore();
AbstractLogView::keyPressEvent( keyEvent );
}
}