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