3 * \file GuiWorkArea_Private.h
4 * This file is part of LyX, the document processor.
5 * Licence details can be found in the file COPYING.
7 * \author Abdelrazak Younes
9 * Full author contact details are available in file CREDITS.
12 #ifndef WORKAREA_PRIVATE_H
13 #define WORKAREA_PRIVATE_H
15 #include "FuncRequest.h"
18 #include "support/FileName.h"
19 #include "support/Timeout.h"
21 #include <QMouseEvent>
26 class QContextMenuEvent;
27 class QDragEnterEvent;
50 /// for emulating triple click
54 DoubleClick() : state(Qt::NoButton), active(false) {}
56 DoubleClick(QMouseEvent * e) : state(e->button()), active(true) {}
58 bool operator==(QMouseEvent const & e) { return state == e.button(); }
62 Qt::MouseButton state;
67 /** Qt only emits mouse events when the mouse is being moved, but
68 * we want to generate 'pseudo' mouse events when the mouse button is
69 * pressed and the mouse cursor is below the bottom, or above the top
70 * of the work area. In this way, we'll be able to continue scrolling
71 * (and selecting) the text.
73 * This class stores all the parameters needed to make this happen.
75 class SyntheticMouseEvent
78 SyntheticMouseEvent();
87 * Implementation of the work area (buffer view GUI)
91 struct GuiWorkArea::Private
93 Private(GuiWorkArea *);
95 /// update the passed area.
96 void update(int x, int y, int w, int h);
100 void resizeBufferView();
102 /// paint the cursor and store the background
103 void showCursor(int x, int y, int h,
104 bool l_shape, bool rtl, bool completable);
109 void dispatch(FuncRequest const & cmd0);
110 /// hide the visible cursor, if it is visible
112 /// show the cursor if it is not visible
114 /// Set the range and value of the scrollbar and connect to its valueChanged
116 void updateScrollbar();
117 /// Change the cursor when the mouse hovers over a clickable inset
118 void updateCursorShape();
120 void setCursorShape(Qt::CursorShape shape);
122 bool needResize() const {
123 return need_resize_ || p->pixelRatio() != pixel_ratio_;
129 pixel_ratio_ = p->pixelRatio();
130 if (lyxrc.use_qimage) {
132 new QImage(static_cast<int>(pixel_ratio_ * p->viewport()->width()),
133 static_cast<int>(pixel_ratio_ * p->viewport()->height()),
134 QImage::Format_ARGB32_Premultiplied);
135 #if QT_VERSION >= 0x050000
136 x->setDevicePixelRatio(pixel_ratio_);
141 new QPixmap(static_cast<int>(pixel_ratio_ * p->viewport()->width()),
142 static_cast<int>(pixel_ratio_ * p->viewport()->height()));
143 #if QT_VERSION >= 0x050000
144 x->setDevicePixelRatio(pixel_ratio_);
152 QPaintDevice * screen_;
154 BufferView * buffer_view_;
157 /// is the cursor currently displayed
158 bool cursor_visible_;
161 QTimer cursor_timeout_;
163 SyntheticMouseEvent synthetic_mouse_event_;
165 DoubleClick dc_event_;
168 CursorWidget * cursor_;
172 bool schedule_redraw_;
175 /// Ratio between physical pixels and device-independent pixels
176 /// We save the last used value to detect changes of the
177 /// current pixel_ratio of the viewport.
180 GuiCompleter * completer_;
182 /// Special mode in which Esc and Enter (with or without Shift)
185 /// store the name of the context menu when the mouse is
186 /// pressed. This is used to get the correct context menu
187 /// when the menu is actually shown (after releasing on Windows)
188 /// and after the DEPM has done its job.
189 std::string context_menu_name_;
191 /// stuff related to window title
193 support::FileName file_name_;
199 docstring vc_status_;
203 bool externally_modified_;
207 } // namespace frontend