X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fqt4%2FGuiWorkArea.h;h=0858521a9a5bf0f98d36553dc9e39b51fa76a156;hb=ee7dd4a11ea21851e7e32164c66b37d3bc8ac31d;hp=c6ebce0b6867f7b9b7a4e3f891b26909c030e56a;hpb=61443d8641780cbb1a64db977de9e0b5209e819e;p=lyx.git diff --git a/src/frontends/qt4/GuiWorkArea.h b/src/frontends/qt4/GuiWorkArea.h index c6ebce0b68..0858521a9a 100644 --- a/src/frontends/qt4/GuiWorkArea.h +++ b/src/frontends/qt4/GuiWorkArea.h @@ -15,54 +15,58 @@ #include "frontends/WorkArea.h" -#include "QLPainter.h" - -#include "funcrequest.h" -#include "frontends/Timeout.h" +#include "DocIterator.h" +#include "FuncRequest.h" +#include "qt_helpers.h" +#include "support/docstring.h" +#include "support/Timeout.h" #include #include -#include +#include #include -#include -#include +#include +#include #include -#include -#include - -#include -class Painter; - -class QWidget; +class QContextMenuEvent; class QDragEnterEvent; class QDropEvent; -class QMouseEvent; +class QKeyEvent; +class QWheelEvent; +class QPaintEvent; +class QToolButton; +class QWidget; + +#ifdef CursorShape +#undef CursorShape +#endif namespace lyx { + +class Buffer; + namespace frontend { +class GuiCompleter; class GuiView; +class GuiWorkArea; /// for emulating triple click -class double_click { +class DoubleClick { +public: + /// + DoubleClick() : state(Qt::NoButton), active(false) {} + /// + DoubleClick(QMouseEvent * e) : state(e->button()), active(true) {} + /// + bool operator==(QMouseEvent const & e) { return state == e.button(); } + /// public: - int x; - int y; + /// Qt::MouseButton state; + /// bool active; - - bool operator==(QMouseEvent const & e) { - return x == e.x() && y == e.y() - && state == e.button(); - } - - double_click() - : x(0), y(0), state(Qt::NoButton), active(false) {} - - double_click(QMouseEvent * e) - : x(e->x()), y(e->y()), - state(e->button()), active(true) {} }; /** Qt only emits mouse events when the mouse is being moved, but @@ -81,148 +85,296 @@ public: FuncRequest cmd; Timeout timeout; bool restart_timeout; - int x_old; - int y_old; - double scrollbar_value_old; }; + /** - * Qt-specific implementation of the work area - * (buffer view GUI) + * Implementation of the work area (buffer view GUI) */ -class GuiWorkArea: public QAbstractScrollArea, public WorkArea +class CursorWidget; + +class GuiWorkArea : public QAbstractScrollArea, public WorkArea { Q_OBJECT public: - - GuiWorkArea(int width, int height, LyXView & lyx_view); - - virtual ~GuiWorkArea(); - /// return the width of the content pane - virtual int width() const { return viewport()->width(); } - - /// return the height of the content pane - virtual int height() const { return viewport()->height(); } /// - virtual void setScrollbarParams(int height, int pos, int line_height); - + GuiWorkArea(QWidget *); + /// + GuiWorkArea(Buffer & buffer, GuiView & gv); /// - virtual void dragEnterEvent(QDragEnterEvent * event); + ~GuiWorkArea(); /// - virtual void dropEvent(QDropEvent* event); + void init(); + /// + void setBuffer(Buffer &); + /// + void setGuiView(GuiView &); + /// + void setFullScreen(bool full_screen); + /// is GuiView in fullscreen mode? + bool isFullScreen(); + /// + void scheduleRedraw() { schedule_redraw_ = true; } + /// + BufferView & bufferView(); + /// + BufferView const & bufferView() const; + /// + void redraw(bool update_metrics); + /// + void stopBlinkingCursor(); + /// + void startBlinkingCursor(); + /// Process Key pressed event. + /// This needs to be public because it is accessed externally by GuiView. + void processKeySym(KeySymbol const & key, KeyModifier mod); + /// + void resizeBufferView(); - /// return the widget's painter - virtual Painter & getPainter() { return (Painter &) painter_; } + bool inDialogMode() const { return dialog_mode_; } + void setDialogMode(bool mode) { dialog_mode_ = mode; } - /// return the backing pixmap - QPaintDevice * paintDevice() { return &paint_device_; } + /// + GuiCompleter & completer() { return *completer_; } - /// update the passed area. - void update(int x, int y, int w, int h); - /// return a screen copy of the defined area. - QPixmap copyScreen(int x, int y, int w, int h) const; + /// Return the GuiView this workArea belongs to + GuiView const & view() const { return *lyx_view_; } + GuiView & view() { return *lyx_view_; } + +Q_SIGNALS: + /// + void titleChanged(GuiWorkArea *); - /// Draw a pixmap onto the backing pixmap. +private Q_SLOTS: + /// Scroll the BufferView. /** - QPixmap is implicitely shared so no need to pass by reference. + * This is a slot for the valueChanged() signal of the vertical scrollbar. + * \p value value of the scrollbar. */ - void drawScreen(int x, int y, QPixmap pixmap); + void scrollTo(int value); + /// timer to limit triple clicks + void doubleClickTimeout(); + /// toggle the cursor's visibility + void toggleCursor(); + /// close this work area. + /// Slot for Buffer::closing signal. + void close(); + /// Slot to restore proper scrollbar behaviour. + void fixVerticalScrollBar(); - /// copies specified area of pixmap to screen - virtual void expose(int x, int y, int exp_width, int exp_height); +private: + friend class GuiCompleter; + + /// update the passed area. + void update(int x, int y, int w, int h); + /// + void updateScreen(); /// paint the cursor and store the background - virtual void showCursor(int x, int y, int h, CursorShape shape); + virtual void showCursor(int x, int y, int h, + bool l_shape, bool rtl, bool completable); /// hide the cursor virtual void removeCursor(); -protected: + /// This function should be called to update the buffer readonly status. + void setReadOnly(bool); + /// Update window titles of all users. + void updateWindowTitle(); + /// + bool event(QEvent *); + /// + void contextMenuEvent(QContextMenuEvent *); + /// + void focusInEvent(QFocusEvent *); + /// + void focusOutEvent(QFocusEvent *); /// repaint part of the widget - void paintEvent(QPaintEvent * e); + void paintEvent(QPaintEvent * ev); /// widget has been resized - void resizeEvent(QResizeEvent * e); + void resizeEvent(QResizeEvent * ev); /// mouse button press - void mousePressEvent(QMouseEvent * e); + void mousePressEvent(QMouseEvent * ev); /// mouse button release - void mouseReleaseEvent(QMouseEvent * e); + void mouseReleaseEvent(QMouseEvent * ev); /// mouse double click of button - void mouseDoubleClickEvent(QMouseEvent * e); + void mouseDoubleClickEvent(QMouseEvent * ev); /// mouse motion - void mouseMoveEvent(QMouseEvent * e); + void mouseMoveEvent(QMouseEvent * ev); /// wheel event - void wheelEvent(QWheelEvent * e); + void wheelEvent(QWheelEvent * ev); /// key press - void keyPressEvent(QKeyEvent * e); + void keyPressEvent(QKeyEvent * ev); /// IM events - void inputMethodEvent(QInputMethodEvent * e); - /// focus in - void focusInEvent(QFocusEvent * ev); - /// focus out - void focusOutEvent(QFocusEvent * ev); + void inputMethodEvent(QInputMethodEvent * ev); + /// IM query + QVariant inputMethodQuery(Qt::InputMethodQuery query) const; -public Q_SLOTS: + /// The slot connected to SyntheticMouseEvent::timeout. + void generateSyntheticMouseEvent(); + /// + void dispatch(FuncRequest const & cmd0, KeyModifier = NoModifier); + /// hide the visible cursor, if it is visible + void hideCursor(); + /// show the cursor if it is not visible + void showCursor(); + /// + void updateScrollbar(); - /// Timeout event Slot for keyboard bufferring. - /// \todo This is not used currently in the code, remove? - void keyeventTimeout(); + /// + BufferView * buffer_view_; + /// Read only Buffer status cache. + bool read_only_; + /// + GuiView * lyx_view_; + /// is the cursor currently displayed + bool cursor_visible_; - /// Adjust the LyX buffer view with the position of the scrollbar. - /** - * The action argument is not used in the the code, it is there - * only for the connection to the vertical srollbar signal which - * emits an 'int' action. - */ - void adjustViewWithScrollBar(int action = 0); + /// + QTimer cursor_timeout_; + /// + SyntheticMouseEvent synthetic_mouse_event_; + /// + DoubleClick dc_event_; -private: + /// + CursorWidget * cursor_; + /// + QPixmap screen_; + /// + bool need_resize_; + /// + bool schedule_redraw_; + /// + int preedit_lines_; - /// Our painter. - QLPainter painter_; + /// + GuiCompleter * completer_; - /// The slot connected to SyntheticMouseEvent::timeout. - void generateSyntheticMouseEvent(); + /// Special mode in which Esc and Enter (with or without Shift) + /// are ignored + bool dialog_mode_; + /// store the position of the rightclick when the mouse is + /// pressed. This is used to get the correct context menu + /// when the menu is actually shown (after releasing on Windwos). + QPoint context_target_pos_; +}; // GuiWorkArea + + +class EmbeddedWorkArea : public GuiWorkArea +{ + Q_OBJECT +public: + /// + EmbeddedWorkArea(QWidget *); + ~EmbeddedWorkArea(); + + /// Dummy methods for Designer. + void setWidgetResizable(bool) {} + void setWidget(QWidget *) {} + QSize sizeHint () const; /// - SyntheticMouseEvent synthetic_mouse_event_; + void disable(); + +protected: + /// + void closeEvent(QCloseEvent * ev); + /// + void hideEvent(QHideEvent *ev); + +private: + /// Embedded Buffer. + Buffer * buffer_; +}; // EmbeddedWorkArea - /// Our client side painting device. - QPixmap paint_device_; - /// \todo remove - QTimer step_timer_; +/// A tabbed set of GuiWorkAreas. +class TabWorkArea : public QTabWidget +{ + Q_OBJECT +public: + TabWorkArea(QWidget * parent = 0); - /// \todo remove - std::queue > keyeventQueue_; + /// + void setFullScreen(bool full_screen); + void showBar(bool show); + void closeAll(); + bool setCurrentWorkArea(GuiWorkArea *); + GuiWorkArea * addWorkArea(Buffer & buffer, GuiView & view); + bool removeWorkArea(GuiWorkArea *); + GuiWorkArea * currentWorkArea(); + GuiWorkArea * workArea(Buffer & buffer); + +Q_SIGNALS: + /// + void currentWorkAreaChanged(GuiWorkArea *); + /// + void lastWorkAreaRemoved(); - double_click dc_event_; +public Q_SLOTS: + /// close current buffer, or the one given by \c clicked_tab_ + void closeCurrentBuffer(); + /// hide current tab, or the one given by \c clicked_tab_ + void hideCurrentTab(); + /// close the tab given by \c index + void closeTab(int index); + /// + void updateTabTexts(); + +private Q_SLOTS: + /// + void on_currentTabChanged(int index); + /// + void showContextMenu(const QPoint & pos); + /// + void moveTab(int fromIndex, int toIndex); + /// + void mouseDoubleClickEvent(QMouseEvent * event); +private: /// - int cursor_x_; + int clicked_tab_; /// - int cursor_y_; + QToolButton * closeBufferButton; +}; // TabWorkArea + + +class DragTabBar : public QTabBar +{ + Q_OBJECT +public: /// - int cursor_w_; + DragTabBar(QWidget * parent = 0); + +#if QT_VERSION < 0x040300 /// - int cursor_h_; + int tabAt(QPoint const & position) const; +#endif + +protected: /// - QPixmap hcursor_; + void mousePressEvent(QMouseEvent * event); /// - QPixmap vcursor_; + void mouseMoveEvent(QMouseEvent * event); /// - bool show_hcursor_; + void dragEnterEvent(QDragEnterEvent * event); /// - bool show_vcursor_; + void dropEvent(QDropEvent * event); + +private: /// - bool lshape_cursor_; + QPoint dragStartPos_; /// - QColor cursor_color_; + int dragCurrentIndex_; + +Q_SIGNALS: /// - CursorShape cursor_shape_; + void tabMoveRequested(int fromIndex, int toIndex); }; } // namespace frontend