#ifndef WORKAREA_H
#define WORKAREA_H
+#include "ui_WorkAreaUi.h"
+
#include "frontends/WorkArea.h"
+#include "frontends/KeySymbol.h"
#include <QAbstractScrollArea>
#include <QTabBar>
class QToolButton;
class QWidget;
-#ifdef CursorShape
-#undef CursorShape
-#endif
-
namespace lyx {
class Buffer;
+class FuncRequest;
namespace frontend {
/// is GuiView in fullscreen mode?
bool isFullScreen() const;
///
- void scheduleRedraw();
- ///
BufferView & bufferView();
///
BufferView const & bufferView() const;
///
- void redraw(bool update_metrics);
+ void scheduleRedraw(bool update_metrics);
/// return true if the key is part of a shortcut
bool queryKeySym(KeySymbol const & key, KeyModifier mod) const;
- /// Process Key pressed event.
- /// This needs to be public because it is accessed externally by GuiView.
- void processKeySym(KeySymbol const & key, KeyModifier mod);
bool inDialogMode() const;
void setDialogMode(bool mode);
///
GuiCompleter & completer();
- Qt::CursorShape cursorShape() const;
-
/// Return the GuiView this workArea belongs to
GuiView const & view() const;
GuiView & view();
double pixelRatio() const;
public Q_SLOTS:
+ /// Process Key pressed event.
+ /// This needs to be public because it is accessed externally by GuiView.
+ void processKeySym(KeySymbol const & key, KeyModifier mod);
///
- void stopBlinkingCursor();
+ void stopBlinkingCaret();
///
- void startBlinkingCursor();
+ void startBlinkingCaret();
Q_SIGNALS:
///
void titleChanged(GuiWorkArea *);
///
void busy(bool);
+ ///
+ void bufferViewChanged();
+ /// send key event to CompressorProxy
+ void compressKeySym(KeySymbol sym, KeyModifier mod, bool isAutoRepeat);
private Q_SLOTS:
/// Scroll the BufferView.
void scrollTo(int value);
/// timer to limit triple clicks
void doubleClickTimeout();
- /// toggle the cursor's visibility
- void toggleCursor();
+ /// toggle the caret's visibility
+ void toggleCaret();
/// close this work area.
/// Slot for Buffer::closing signal.
void close();
}; // GuiWorkArea
+/// CompressorProxy adapted from Kuba Ober https://stackoverflow.com/a/21006207
+class CompressorProxy : public QObject
+{
+ Q_OBJECT
+ bool emitCheck(bool isAutoRepeat);
+ bool flag_;
+ // input: event to compress
+ Q_SLOT void slot(KeySymbol sym, KeyModifier mod, bool isAutoRepeat);
+ // output: compressed event
+ Q_SIGNAL void signal(KeySymbol sym, KeyModifier mod);
+public:
+ // No default constructor, since the proxy must be a child of the
+ // target object.
+ explicit CompressorProxy(GuiWorkArea * wa);
+};
+
+
class EmbeddedWorkArea : public GuiWorkArea
{
Q_OBJECT
}; // EmbeddedWorkArea
+class GuiWorkAreaContainer;
+
/// A tabbed set of GuiWorkAreas.
class TabWorkArea : public QTabWidget
{
public:
TabWorkArea(QWidget * parent = 0);
+ /// hide QTabWidget methods
+ GuiWorkAreaContainer * currentWidget() const;
+ GuiWorkAreaContainer * widget(int index) const;
+
///
void setFullScreen(bool full_screen);
void showBar(bool show);
bool setCurrentWorkArea(GuiWorkArea *);
GuiWorkArea * addWorkArea(Buffer & buffer, GuiView & view);
bool removeWorkArea(GuiWorkArea *);
- GuiWorkArea * currentWorkArea();
- GuiWorkArea * workArea(Buffer & buffer);
- GuiWorkArea * workArea(int index);
+ GuiWorkArea * currentWorkArea() const;
+ GuiWorkArea * workArea(Buffer & buffer) const;
+ GuiWorkArea * workArea(int index) const;
void paintEvent(QPaintEvent *);
Q_SIGNALS:
void moveTab(int fromIndex, int toIndex);
///
void updateTabTexts();
-
+
private Q_SLOTS:
///
void on_currentTabChanged(int index);
///
void showContextMenu(const QPoint & pos);
+ /// enable closing tab on middle-click
+ void mousePressEvent(QMouseEvent * me);
+ void mouseReleaseEvent(QMouseEvent * me);
///
void mouseDoubleClickEvent(QMouseEvent * event);
+ ///
+ int indexOfWorkArea(GuiWorkArea * w) const;
private:
- ///
+ using QTabWidget::addTab;
+ using QTabWidget::insertTab;
+
+ /// true if position is a tab (rather than the blank space in tab bar)
+ bool posIsTab(QPoint position);
+
int clicked_tab_;
///
+ int midpressed_tab_;
+ ///
QToolButton * closeBufferButton;
}; // TabWorkArea
void tabMoveRequested(int fromIndex, int toIndex);
};
+
+class GuiWorkAreaContainer : public QWidget, public Ui::WorkAreaUi
+{
+ Q_OBJECT
+ // non-null
+ GuiWorkArea * const wa_;
+ void dispatch(FuncRequest f) const;
+
+private Q_SLOTS:
+ void updateDisplay();
+ void reload() const;
+ void ignore() const;
+
+protected:
+ void mouseDoubleClickEvent(QMouseEvent * event); //override
+
+public:
+ /// wa != 0
+ GuiWorkAreaContainer(GuiWorkArea * wa, QWidget * parent = 0);
+ /// non-null
+ GuiWorkArea * workArea() const { return wa_; }
+};
+
+
+
} // namespace frontend
} // namespace lyx