diff options
Diffstat (limited to 'src/fqterm/fqterm_screen.h')
-rw-r--r-- | src/fqterm/fqterm_screen.h | 281 |
1 files changed, 281 insertions, 0 deletions
diff --git a/src/fqterm/fqterm_screen.h b/src/fqterm/fqterm_screen.h new file mode 100644 index 0000000..5c65142 --- /dev/null +++ b/src/fqterm/fqterm_screen.h @@ -0,0 +1,281 @@ +/*************************************************************************** + * fqterm, a terminal emulator for both BBS and *nix. * + * Copyright (C) 2008 fqterm development group. * + * * + * 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., * + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * + ***************************************************************************/ + +#ifndef FQTERM_SCREEN_H +#define FQTERM_SCREEN_H + +#include <QWidget> +#include <QVector> +#include <QList> +#include "fqterm_param.h" +#include "fqterm_convert.h" + +class QTextCodec; +class QColor; +class QPainter; +class QInputMethodEvent; +class QPixmap; +class QScrollBar; +class QShortcut; + +namespace FQTerm { + +class FQTermWindow; +class FQTermBuffer; +class FQTermSession; +class FQTermParam; + +class PreeditLine: public QWidget { +public: + PreeditLine(QWidget *parent,const QColor *colors); + ~PreeditLine(); + + void setPreeditText(QInputMethodEvent *e, const QFont *font); + + void paintEvent(QPaintEvent * event); + + int getCaretOffset() const {return caret_offset_;} + +private: + QPixmap *pixmap_; + int caret_offset_; + + const QColor *colors_; +}; + +class FQTermScreen: public QWidget { + Q_OBJECT; + public: + + enum PaintState { + System = 0, Repaint = 1, NewData = 2, Blink = 4, Cursor = 8, Widget = 16 + }; + enum MouseState { + Enter, Press, Move, Release, Leave + }; + + FQTermScreen(QWidget *parent, FQTermSession *session); + ~FQTermScreen(); + + void setSchema(); + void setTermFont(bool isEnglish, const QFont& font); + + QFont termFont(bool isEnglish); + + + void setPaintState(PaintState ps) { + paintState_ |= ps; + } + + void clearPaintState(PaintState ps) { + paintState_ &= ~ps; + } + + bool testPaintState(PaintState ps) { + return paintState_ & ps; + } + + + /*void clearPaintState() { + paintState_ = None; + }*/ + // Buffer cell coordinate to screen pixel. + int getBufferStart() {return bufferStart_;} + QPoint mapToPixel(const QPoint &); + + // Screen pixel coordinate to buffer cell coordinate. + QPoint mapToChar(const QPoint &); + + // Buffer cell coordinate to screen pixel. + QRect mapToRect(int x, int y, int width, int height); + QRect mapToRect(const QRect &); + private: + int paintState_; + void updateWidgetRect(QPainter& painter); + void refreshScreen(QPainter &painter); + void blinkScreen(QPainter &painter); + void updateCursor(QPainter &painter); + void repaintScreen(QPaintEvent *pe, QPainter &painter); + void syncBufferAndScreen(); + void updateBackgroundPixmap(); + void drawBackground(QPainter& painter, const QRect& rect, int colorIndex); + void drawBackgroundPixmap(QPainter& painter, const QRect& rect); + int getVerticalSetting() const; + + signals: + // 0 - enter 1 - press 2 - move 3 - release 4 - leave + void mouseAction(int, QMouseEvent*); + void inputEvent(const QString&); + void termFontChange(bool isEnglish, QFont font); + + public slots: + void bufferSizeChanged(); + void termSizeChanged(int column, int row); + void bossColor(); + void updateScrollBar(); + void setFontAntiAliasing(bool on = true); + void widgetHideAt(const QRect& rect); + + + protected: + void initFontMetrics(); + + bool event(QEvent *e); + + void resizeEvent(QResizeEvent*); + void focusInEvent(QFocusEvent*); + void focusOutEvent(QFocusEvent*); + + void paintEvent(QPaintEvent*); + + // mouse + void enterEvent(QEvent*); + void leaveEvent(QEvent*); + void mousePressEvent(QMouseEvent*); + void mouseMoveEvent(QMouseEvent*); + void mouseReleaseEvent(QMouseEvent*); + void wheelEvent(QWheelEvent*); + + // display + void eraseRect(QPainter &, int, int, int, int, short); + void drawStr(QPainter &painter, const QString &str, + int x, int y, int length, + unsigned char color, unsigned char attr, + bool transparent, bool selected = false); + void drawLine(QPainter &, int index, int startx = -1, int endx = -1, + bool complete = true); + void drawCaret(QPainter &, bool); + QRect drawMenuSelect(QPainter &, int); + void drawUnderLine(QPainter &, const QPoint& startPoint, const QPoint& endPoint); + + // auxiluary + int getPosX(int xChar) { + return xChar *charWidth_; + } + int getPosY(int yLine) { + return yLine *charHeight_; + } + + //screen size, in pixel. + QSize getScreenSize() const; + + + + void updateFont(); + void setFontMetrics(); + + QImage &fade(QImage &, float, const QColor &); + + void inputMethodEvent(QInputMethodEvent *e); + QVariant inputMethodQuery(Qt::InputMethodQuery property)const; + + + protected slots: + void blinkEvent(); + void cursorEvent(); + void scrollChanged(int); + void prevPage(); + void nextPage(); + void prevLine(); + void nextLine(); + void scrollLine(int); + protected: + void drawSingleUnderLine(QPainter &, const QPoint& startPoint, const QPoint& endPoint); + + QRect clientRectangle_; // the display area + QRect menuRect_; + QRect widgetRect_; //we need to redraw this rect since a widget just disappeared. + + int scrollBarWidth_; + + QScrollBar *scrollBar_; + + QTimer *blinkTimer_; + QTimer *cursorTimer_; + + bool isBlinkScreen_; + bool isBlinkCursor_; + bool hasBlinkText_; + + FQTermWindow *termWindow_; + FQTermSession *session_; + const FQTermBuffer *termBuffer_; + FQTermParam *param_; + + bool is_light_background_mode_; + + QColor colors_[16]; + QFont *englishFont_; + QFont *nonEnglishFont_; + + double fontAscent_, fontDescent_; + double charWidth_, charHeight_; + double cnLetterSpacing_; + double enLetterSpacing_; + double spLetterSpacing_; + + void updateFixedPitchInfo(); + bool cnFixedPitch_; + bool enFixedPitch_; + int lineSpacing_; // for future + + bool *areLinesBlink_; + bool isCursorShown_; + + // background + bool hasBackground_; + QPixmap backgroundPixmap_; + QPixmap originBackgroundPixmap_; + //0 -- tile 1 -- center 2 -- stretch + int backgroundRenderOption_; + //0 -- Whole screen, 1 -- Only padding + int backgroundCoverage_; + bool backgroundUseAlpha_; + int backgroundAlpha_; + + + // the range of the buffer's lines to be displayed + int bufferStart_; + int bufferEnd_; + + QShortcut *gotoPrevPage_; + QShortcut *gotoNextPage_; + QShortcut *gotoPrevLine_; + QShortcut *gotoNextLine_; + + FQTermConvert encodingConverter_; + + PreeditLine *preedit_line_; + + QString *tmp_im_query_; + + //TODO: change to bit field + enum TextRenderingType{ + HalfAndAlign, FullAndAlign, FullNotAlign, HalfAndSpace + }; + TextRenderingType charRenderingType(const QChar& c); + + friend class FQTermWindow; + // for test only +}; + +} // namespace FQTerm + +#endif // FQTERM_SCREEN_H |