You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kbookreader/src/renderer.h

140 lines
4.6 KiB

/***************************************************************************
* Copyright (C) 2005 by Alexander Nemish *
* atlanter@gmail.com *
* *
* 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 *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program 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 this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#ifndef RENDERER_H
#define RENDERER_H
#include <tqstringlist.h>
#include <tqfont.h>
#include <tqstring.h>
#include <tqobject.h>
#include <tqsize.h>
#include <tqtimer.h>
#include <vector>
#include <memory>
class TQStringList;
class TextLine
{
public:
static const int PARA_NONE = 0;
static const int PARA_START = 1;
static const int PARA_END = 2;
static const int PARA_BOTH = 3;
TextLine(int index, int begin, int end, int paraFlags = PARA_NONE):
m_paragraphFlags(paraFlags),
m_begin(begin),
m_end(end),
m_index(index)
{}
bool isParaStart() const { return m_paragraphFlags & PARA_START; }
bool isParaEnd() const { return m_paragraphFlags & PARA_END; }
void setParagraphFlags(int flags) { m_paragraphFlags = flags; }
const int paragraphFlags() const { return m_paragraphFlags; }
const int paragraphIndex() const { return m_index; }
const int begin() const { return m_begin; }
const int end() const { return m_end; }
const int size() const { return m_end - m_begin; }
private:
int m_paragraphFlags;
int m_begin;
int m_end;
int m_index;
};
/**
* \brief Renders input text into list of word wrapped strings
* \author Alexandr Nemish <anemish@gmail.com>
*/
class Renderer : public TQObject
{
TQ_OBJECT
public:
Renderer();
~Renderer();
/// \brief Loads and renders list of strings
void load(const TQStringList & list);
/// \brief Renders loaded list of strings
void render();
/// \brief Clears all rendered data
void clear();
/// \brief Draws page
void drawPage(TQPainter & paint, TQRect rect, int pageNumber);
//Getters
/// \brief Returns whether the text is empty
bool isEmpty() const { return m_text.empty(); };
/// \brief Returns current font
TQFont font() const { return m_font; }
/// \brief Returns current paragraph offset in pixels
int paraOffset() const { return m_paraOffset; }
/// \brief Returns the number of pages
int pageCount() const { return m_pageCount; }
/// \brief Returns page size in pixels
TQSize pageSize() const { return m_pageSize; }
//Setters
/// \brief Sets current font
void setFont(const TQFont & font);
/// \brief Sets current paragraph offset in pixels
void setParaOffset(int offset);
/// \brief Sets size of a page
void setPageSize(const TQSize & size);
bool busy() const { return m_isRendering; }
signals:
void renderingFinished();
private slots:
void timeout();
private:
typedef TQStringList::const_iterator TStringIter;
typedef std::vector<TQString> TParagraphs;
typedef TParagraphs::size_type TIndex;
typedef std::vector<TextLine> TLines;
//make it non-copyable
Renderer(const Renderer &);
Renderer & operator = (const Renderer &);
/// \brief Renders input paragraph into list of wrapped lines
void parseParagraph(TIndex idx);
/// \brief Returns width of string in pixels
int width(const TQString & a_string) const;
void addLine(TextLine line);
int wordAt(const TQString & str, int len);
TQString getWord(const TQString & str, int idx);
/// \brief Draws justified string
void drawLine(TQPainter& paint, int x, int y, const TLines::size_type idx);
void cancel();
TParagraphs m_text;
TLines m_lines;
int m_pageCount;
int m_linesPerPage;
int m_paraOffset;
TQFont m_font;
std::unique_ptr<TQFontMetrics> m_fontMetrics;
TQSize m_pageSize;
bool m_isStartAdded;
TIndex m_curParagraph;
bool m_isRendering;
TQTimer m_timer;
};
#endif