/*
* Copyright (C) 2011, 2012 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 Overview class.
// It provides support for drawing the match overview sidebar but
// the actual drawing is done in AbstractLogView which uses this class.
#include "log.h"
#include "data/logfiltereddata.h"
#include "overview.h"
Overview::Overview() : matchLines_(), markLines_()
{
logFilteredData_ = NULL;
linesInFile_ = 0;
topLine_ = 0;
nbLines_ = 0;
height_ = 0;
dirty_ = true;
visible_ = false;
}
Overview::~Overview()
{
}
void Overview::setFilteredData( const LogFilteredData* logFilteredData )
{
logFilteredData_ = logFilteredData;
}
void Overview::updateData( int totalNbLine )
{
LOG(logDEBUG) << "OverviewWidget::updateData " << totalNbLine;
linesInFile_ = totalNbLine;
dirty_ = true;
}
void Overview::updateView( int height )
{
// We don't touch the cache if the height hasn't changed
if ( ( height != height_ ) || ( dirty_ == true ) ) {
height_ = height;
recalculatesLines();
}
}
const QVector* Overview::getMatchLines() const
{
return &matchLines_;
}
const QVector* Overview::getMarkLines() const
{
return &markLines_;
}
std::pair Overview::getViewLines() const
{
int top = 0;
int bottom = height_ - 1;
if ( linesInFile_ > 0 ) {
top = (int)((qint64)topLine_ * height_ / linesInFile_);
bottom = (int)((qint64)top + nbLines_ * height_ / linesInFile_);
}
return std::pair(top, bottom);
}
int Overview::fileLineFromY( int position ) const
{
int line = (int)((qint64)position * linesInFile_ / height_);
return line;
}
int Overview::yFromFileLine( int file_line ) const
{
int position = 0;
if ( linesInFile_ > 0 )
position = (int)((qint64)file_line * height_ / linesInFile_);
return position;
}
// Update the internal cache
void Overview::recalculatesLines()
{
LOG(logDEBUG) << "OverviewWidget::recalculatesLines";
if ( logFilteredData_ != NULL ) {
matchLines_.clear();
markLines_.clear();
if ( linesInFile_ > 0 ) {
for ( int i = 0; i < logFilteredData_->getNbLine(); i++ ) {
LogFilteredData::FilteredLineType line_type =
logFilteredData_->filteredLineTypeByIndex( i );
int line = (int) logFilteredData_->getMatchingLineNumber( i );
int position = (int)( (qint64)line * height_ / linesInFile_ );
if ( line_type == LogFilteredData::Match ) {
if ( ( ! matchLines_.isEmpty() ) && matchLines_.last().position() == position ) {
// If the line is already there, we increase its weight
matchLines_.last().load();
}
else {
// If not we just add it
matchLines_.append( WeightedLine( position ) );
}
}
else {
if ( ( ! markLines_.isEmpty() ) && markLines_.last().position() == position ) {
// If the line is already there, we increase its weight
markLines_.last().load();
}
else {
// If not we just add it
markLines_.append( WeightedLine( position ) );
}
}
}
}
}
else
LOG(logDEBUG) << "Overview::recalculatesLines: logFilteredData_ == NULL";
dirty_ = false;
}