summaryrefslogtreecommitdiff
path: root/src/fqterm/fqterm_screen.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/fqterm/fqterm_screen.h')
-rw-r--r--src/fqterm/fqterm_screen.h281
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