/*
* 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 .
*/
#ifndef OVERVIEW_H
#define OVERVIEW_H
#include
#include
class LogFilteredData;
// Class implementing the logic behind the matches overview bar.
// This class converts the matches found in a LogFilteredData in
// a screen dependent set of coloured lines, which is cached.
// This class is not a UI class, actual display is left to the client.
//
// This class is NOT thread-safe.
class Overview
{
public:
// A line with a position in pixel and a weight (darkness)
class WeightedLine {
public:
static const int WEIGHT_STEPS = 3;
WeightedLine() { pos_ = 0; weight_ = 0; }
// (Necessary for QVector)
WeightedLine( int pos ) { pos_ = pos; weight_ = 0; }
int position() const { return pos_; }
int weight() const { return weight_; }
void load() { weight_ = qMin( weight_ + 1, WEIGHT_STEPS - 1 ); }
private:
int pos_;
int weight_;
};
Overview();
~Overview();
// Associate the passed filteredData to this Overview
void setFilteredData( const LogFilteredData* logFilteredData );
// Signal the overview its attached LogFilteredData has been changed and
// the overview must be updated with the provided total number
// of line of the file.
void updateData( int totalNbLine );
// Set the visibility flag of this overview.
void setVisible( bool visible ) { visible_ = visible; dirty_ = visible; }
// Update the current position in the file (to draw the view line)
void updateCurrentPosition( int firstLine, int lastLine )
{ topLine_ = firstLine; nbLines_ = lastLine - firstLine; }
// Returns weither this overview is visible.
bool isVisible() { return visible_; }
// Signal the overview the height of the display has changed, triggering
// an update of its cache.
void updateView( int height );
// Returns a list of lines (between 0 and 'height') representing matches.
// (pointer returned is valid until next call to update*()
const QVector* getMatchLines() const;
// Returns a list of lines (between 0 and 'height') representing marks.
// (pointer returned is valid until next call to update*()
const QVector* getMarkLines() const;
// Return a pair of lines (between 0 and 'height') representing the current view.
std::pair getViewLines() const;
// Return the line number corresponding to the passed overview y coordinate.
int fileLineFromY( int y ) const;
// Return the y coordinate corresponding to the passed line number.
int yFromFileLine( int file_line ) const;
private:
// List of matches associated with this Overview.
const LogFilteredData* logFilteredData_;
// Total number of lines in the file.
int linesInFile_;
// Whether the overview is visible.
bool visible_;
// First and last line currently viewed.
int topLine_;
int nbLines_;
// Current height of view window.
int height_;
// Does the cache (matchesLines, markLines) need to be recalculated.
int dirty_;
// List of lines representing matches and marks (are shared with the client)
QVector matchLines_;
QVector markLines_;
void recalculatesLines();
};
#endif