X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fqt4%2FGuiWorkArea.h;h=4ec0af11a9fbd320b0bea301543a3b64563d9f06;hb=425d092204118ea6c24c28e85fdf03fcf2bb51a4;hp=19e0d6e31bfaec0051f8e36af1d6aa30459ba505;hpb=bc20c9f382a0db9f91ac9cfc32bd70f445a45b0e;p=lyx.git diff --git a/src/frontends/qt4/GuiWorkArea.h b/src/frontends/qt4/GuiWorkArea.h index 19e0d6e31b..4ec0af11a9 100644 --- a/src/frontends/qt4/GuiWorkArea.h +++ b/src/frontends/qt4/GuiWorkArea.h @@ -15,24 +15,28 @@ #include "frontends/WorkArea.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 - -class QWidget; +class QContextMenuEvent; class QDragEnterEvent; class QDropEvent; +class QKeyEvent; class QWheelEvent; class QPaintEvent; +class QToolButton; +class QWidget; #ifdef CursorShape #undef CursorShape @@ -44,17 +48,9 @@ class Buffer; namespace frontend { -class LyXView; - -/// types of cursor in work area -enum CursorShape { - /// normal I-beam - BAR_SHAPE, - /// L-shape for locked insets of a different language - L_SHAPE, - /// reverse L-shape for RTL text - REVERSED_L_SHAPE -}; +class GuiCompleter; +class GuiView; +class GuiWorkArea; /// for emulating triple click class DoubleClick { @@ -91,7 +87,8 @@ public: bool restart_timeout; int x_old; int y_old; - double scrollbar_value_old; + int min_scrollbar_old; + int max_scrollbar_old; }; @@ -106,75 +103,97 @@ class GuiWorkArea : public QAbstractScrollArea, public WorkArea public: /// - GuiWorkArea(Buffer & buffer, LyXView & lv); + GuiWorkArea(QWidget *); + /// + GuiWorkArea(Buffer & buffer, GuiView & gv); /// ~GuiWorkArea(); /// - bool hasFocus() const { return QAbstractScrollArea::hasFocus(); } - bool isVisible() const { return QAbstractScrollArea::isVisible(); } - - /// 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(); } + void init(); /// - virtual void setScrollbarParams(int height, int pos, int line_height); + void setBuffer(Buffer &); /// - virtual void scheduleRedraw() { schedule_redraw_ = true; } - - /// update the passed area. - void update(int x, int y, int w, int h); - - /// copies specified area of pixmap to screen - virtual void expose(int x, int y, int exp_width, int exp_height); - - /// paint the cursor and store the background - virtual void showCursor(int x, int y, int h, CursorShape shape); - - /// hide the cursor - virtual void removeCursor(); + void setGuiView(GuiView &); + /// + void setFullScreen(bool full_screen); + /// is LyXView in fullscreen mode? + bool isFullScreen(); + /// + void scheduleRedraw() { schedule_redraw_ = true; } /// BufferView & bufferView(); /// BufferView const & bufferView() const; /// - void redraw(); + 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(); -public Q_SLOTS: - /// Adjust the LyX buffer view with the position of the scrollbar. + bool inDialogMode() const { return dialog_mode_; } + void setDialogMode(bool mode) { dialog_mode_ = mode; } + + /// + GuiCompleter & completer() { return *completer_; } + + + /// Return the GuiView this workArea belongs to + GuiView const & view() const { return *lyx_view_; } + GuiView & view() { return *lyx_view_; } + +Q_SIGNALS: + /// + void titleChanged(GuiWorkArea *); + +private Q_SLOTS: + /// Scroll the BufferView. /** - * 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. + * This is a slot for the valueChanged() signal of the vertical scrollbar. + * \p value value of the scrollbar. */ - void adjustViewWithScrollBar(int action = 0); + 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(); - //// - void setWindowTitle(docstring const & t, docstring const & it); + /// Slot to restore proper scrollbar behaviour. + void fixVerticalScrollBar(); -Q_SIGNALS: +private: + friend class GuiCompleter; + + /// update the passed area. + void update(int x, int y, int w, int h); /// - void titleChanged(GuiWorkArea *); + void updateScreen(); -private: - /// This function is called when the buffer readonly status change. + /// paint the cursor and store the background + virtual void showCursor(int x, int y, int h, + bool l_shape, bool rtl, bool completable); + + /// hide the cursor + virtual void removeCursor(); + + /// 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 *); @@ -203,26 +222,24 @@ private: void generateSyntheticMouseEvent(); /// void dispatch(FuncRequest const & cmd0, KeyModifier = NoModifier); - /// - void resizeBufferView(); /// hide the visible cursor, if it is visible void hideCursor(); /// show the cursor if it is not visible void showCursor(); - /// toggle the cursor's visibility - void toggleCursor(); /// void updateScrollbar(); /// BufferView * buffer_view_; + /// Read only Buffer status cache. + bool read_only_; /// - LyXView * lyx_view_; + GuiView * lyx_view_; /// is the cursor currently displayed bool cursor_visible_; /// - Timeout cursor_timeout_; + QTimer cursor_timeout_; /// SyntheticMouseEvent synthetic_mouse_event_; /// @@ -231,8 +248,6 @@ private: /// CursorWidget * cursor_; /// - void updateScreen(); - /// QPixmap screen_; /// bool need_resize_; @@ -240,9 +255,47 @@ private: bool schedule_redraw_; /// int preedit_lines_; + + /// + GuiCompleter * completer_; + + /// 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 *) {} + + /// + void disable(); + +protected: + /// + void closeEvent(QCloseEvent * ev); + /// + void hideEvent(QHideEvent *ev); + +private: + /// Embedded Buffer. + Buffer * buffer_; +}; // EmbeddedWorkArea + + /// A tabbed set of GuiWorkAreas. class TabWorkArea : public QTabWidget { @@ -250,9 +303,12 @@ class TabWorkArea : public QTabWidget public: TabWorkArea(QWidget * parent = 0); + /// + 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); @@ -260,16 +316,68 @@ public: Q_SIGNALS: /// void currentWorkAreaChanged(GuiWorkArea *); + /// + void lastWorkAreaRemoved(); 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 closeCurrentTab(); + void showContextMenu(const QPoint & pos); + /// + void moveTab(int fromIndex, int toIndex); + +private: /// - void updateTabText(GuiWorkArea *); + int clicked_tab_; + /// + QToolButton * closeBufferButton; }; // TabWorkArea + +class DragTabBar : public QTabBar +{ + Q_OBJECT +public: + /// + DragTabBar(QWidget * parent = 0); + +#if QT_VERSION < 0x040300 + /// + int tabAt(QPoint const & position) const; +#endif + +protected: + /// + void mousePressEvent(QMouseEvent * event); + /// + void mouseMoveEvent(QMouseEvent * event); + /// + void dragEnterEvent(QDragEnterEvent * event); + /// + void dropEvent(QDropEvent * event); + +private: + /// + QPoint dragStartPos_; + /// + int dragCurrentIndex_; + +Q_SIGNALS: + /// + void tabMoveRequested(int fromIndex, int toIndex); +}; + } // namespace frontend } // namespace lyx