1 // -*- C++ -*-
2 /**
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.
6  *
7  * \author Abdelrazak Younes
8  *
9  * Full author contact details are available in file CREDITS.
10  */
11 
12 #ifndef WORKAREA_PRIVATE_H
13 #define WORKAREA_PRIVATE_H
14 
15 #include "FuncRequest.h"
16 
17 #include "support/FileName.h"
18 #include "support/Timeout.h"
19 
20 #include <QMouseEvent>
21 #include <QTimer>
22 
23 namespace lyx {
24 
25 class Buffer;
26 
27 namespace frontend {
28 
29 class GuiCompleter;
30 class GuiPainter;
31 class GuiView;
32 class GuiWorkArea;
33 
34 /// for emulating triple click
35 class DoubleClick {
36 public:
37 	///
DoubleClick()38 	DoubleClick() : state(Qt::NoButton), active(false) {}
39 	///
DoubleClick(QMouseEvent * e)40 	DoubleClick(QMouseEvent * e) : state(e->button()), active(true) {}
41 	///
42 	bool operator==(QMouseEvent const & e) { return state == e.button(); }
43 	///
44 public:
45 	///
46 	Qt::MouseButton state;
47 	///
48 	bool active;
49 };
50 
51 /** Qt only emits mouse events when the mouse is being moved, but
52  *  we want to generate 'pseudo' mouse events when the mouse button is
53  *  pressed and the mouse cursor is below the bottom, or above the top
54  *  of the work area. In this way, we'll be able to continue scrolling
55  *  (and selecting) the text.
56  *
57  *  This class stores all the parameters needed to make this happen.
58  */
59 class SyntheticMouseEvent
60 {
61 public:
62 	SyntheticMouseEvent();
63 
64 	FuncRequest cmd;
65 	Timeout timeout;
66 	bool restart_timeout;
67 };
68 
69 
70 /**
71  * Implementation of the work area (buffer view GUI)
72 */
73 class CaretWidget;
74 
75 struct GuiWorkArea::Private
76 {
77 	///
78 	Private(GuiWorkArea *);
79 
80 	///
81 	~Private();
82 
83 	///
84 	void resizeBufferView();
85 
86 	///
87 	void dispatch(FuncRequest const & cmd0);
88 	/// recompute the shape and position of the caret
89 	void updateCaretGeometry();
90 	/// show the caret if it is not visible
91 	void showCaret();
92 	/// hide the caret if it is visible
93 	void hideCaret();
94 	/// Set the range and value of the scrollbar and connect to its valueChanged
95 	/// signal.
96 	void updateScrollbar();
97 	/// Change the cursor when the mouse hovers over a clickable inset
98 	void updateCursorShape();
99 
100 	void paintPreeditText(GuiPainter & pain);
101 
102 	/// Prepare screen for next painting
103 	void resetScreen();
104 	/// Where painting takes place
105 	QPaintDevice * screenDevice();
106 	/// Put backingstore to screen if necessary
107 	void updateScreen(QRectF const & rc);
108 
109 	///
110 	GuiWorkArea * p;
111 	///
112 	BufferView * buffer_view_;
113 	///
114 	GuiView * lyx_view_;
115 
116 	/// Do we need an intermediate image when painting (for now macOS and Wayland)
117 	bool use_backingstore_;
118 	///
119 	QImage screen_;
120 
121 	///
122 	CaretWidget * caret_;
123 	/// is the caret currently displayed
124 	bool caret_visible_;
125 	///
126 	QTimer caret_timeout_;
127 
128 	///
129 	SyntheticMouseEvent synthetic_mouse_event_;
130 	///
131 	DoubleClick dc_event_;
132 
133 	///
134 	bool need_resize_;
135 
136 	/// the current preedit text of the input method
137 	docstring preedit_string_;
138 	/// Number of lines used by preedit text
139 	int preedit_lines_;
140 	/// the attributes of the preedit text
141 	QList<QInputMethodEvent::Attribute> preedit_attr_;
142 
143 	/// Ratio between physical pixels and device-independent pixels
144 	/// We save the last used value to detect changes of the
145 	/// current pixel_ratio of the viewport.
146 	double last_pixel_ratio_;
147 	///
148 	GuiCompleter * completer_;
149 
150 	/// Special mode in which Esc and Enter (with or without Shift)
151 	/// are ignored
152 	bool dialog_mode_;
153 	/// store the name of the context menu when the mouse is
154 	/// pressed. This is used to get the correct context menu
155 	/// when the menu is actually shown (after releasing on Windows)
156 	/// and after the DEPM has done its job.
157 	std::string context_menu_name_;
158 
159 	/// stuff related to window title
160 	///
161 	support::FileName file_name_;
162 	///
163 	bool shell_escape_;
164 	///
165 	bool read_only_;
166 	///
167 	docstring vc_status_;
168 	///
169 	bool clean_;
170 	///
171 	bool externally_modified_;
172 
173 }; // GuiWorkArea
174 
175 } // namespace frontend
176 } // namespace lyx
177 
178 #endif // WORKAREA_H
179