X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fqt4%2FGuiView.h;h=4cf5d027e92e6371d9235c78252d0ef5f095f5af;hb=1520629d7cefe09cbc9612806c8abbbd6b36048e;hp=dd5a425de03f8f3750623d0f53f36e0d7f8ca88b;hpb=a2022b19504ba7f87d258285ba5f366ffb33caef;p=lyx.git diff --git a/src/frontends/qt4/GuiView.h b/src/frontends/qt4/GuiView.h index dd5a425de0..4cf5d027e9 100644 --- a/src/frontends/qt4/GuiView.h +++ b/src/frontends/qt4/GuiView.h @@ -7,7 +7,7 @@ * \author Lars Gullik Bjornes * \author John Levon * \author Abdelrazak Younes - * \author Peter Kümmel + * \author Peter Kümmel * * Full author contact details are available in file CREDITS. */ @@ -15,37 +15,46 @@ #ifndef GUI_VIEW_H #define GUI_VIEW_H +#include "frontends/Delegates.h" #include "frontends/LyXView.h" -#include "FuncRequest.h" -#include -#include +#include "support/strfwd.h" + #include -#include +class QCloseEvent; class QDragEnterEvent; class QDropEvent; class QMenu; -class QToolBar; +class QShowEvent; namespace lyx { -namespace frontend { -class QCommandBuffer; +class Cursor; -QWidget* mainWindow(); +namespace frontend { + +class Dialog; +class LayoutBox; +class GuiToolbar; +class GuiWorkArea; +class TabWorkArea; +class TocModels; +class ToolbarInfo; /** * GuiView - Qt4 implementation of LyXView * * qt4-private implementation of the main LyX window. * - * Note: any QObject emits a destroyed(QObject *) Qt signal when it - * is deleted.This might be useful for closing other dialogs - * depending on a given GuiView. + * Note: a QObject emits a destroyed(QObject *) Qt signal when it + * is deleted. This might be useful for closing other dialogs + * depending on a given GuiView. */ -class GuiView : public QMainWindow, public LyXView { +class GuiView : public QMainWindow, public LyXView, public GuiBufferViewDelegate, + public GuiBufferDelegate +{ Q_OBJECT public: /// create a main window of the given dimensions @@ -53,123 +62,276 @@ public: ~GuiView(); - virtual void init(); - virtual void close(); - virtual void setFocus(); - virtual void setGeometry( - unsigned int width, - unsigned int height, - int posx, int posy, - int maximized, - unsigned int iconSizeXY, - const std::string & geometryArg); - virtual void saveGeometry(); - virtual void busy(bool); + /// + int id() const { return id_; } + void setFocus(); + void setBusy(bool); + /// returns true if this view has the focus. + bool hasFocus() const; + /// add toolbar, if newline==true, add a toolbar break before the toolbar - Toolbars::ToolbarPtr makeToolbar(ToolbarInfo const & tbinfo, bool newline); + GuiToolbar * makeToolbar(ToolbarInfo const & tbinfo, bool newline); virtual void updateStatusBar(); virtual void message(docstring const & str); - virtual void clearMessage(); - virtual bool hasFocus() const; - /// show - display the top-level window - void show(); + /// updates the possible layouts selectable + void updateLayoutList(); + void updateToolbars(); + QMenu * createPopupMenu(); + bool getStatus(FuncRequest const & cmd, FuncStatus & flag); + bool dispatch(FuncRequest const & cmd); + + /// + LayoutBox * getLayoutDialog() const; + + /// \return the buffer currently shown in this window + Buffer * buffer(); + Buffer const * buffer() const; + /// set a buffer to the current workarea. + void setBuffer(Buffer * b); ///< \c Buffer to set. + /// + bool closeBuffer(); + /// hides the workarea and makes sure it is clean + bool hideWorkArea(GuiWorkArea * wa); + /// load a document into the current workarea. + Buffer * loadDocument(support::FileName const & name, ///< File to load. + bool tolastfiles = true); ///< append to the "Open recent" menu? + /// + void openDocument(std::string const & filename); + /// + void importDocument(std::string const &); + /// + void newDocument(std::string const & filename, bool fromTemplate); + + /// GuiBufferDelegate. + ///@{ + void resetAutosaveTimers(); + void errors(std::string const &, bool from_master = false); + void structureChanged(); + void updateTocItem(std::string const &, DocIterator const &); + ///@} + + /// + TocModels & tocModels(); + + /// called on timeout + void autoSave(); + + /// \return the current buffer view. + BufferView * view(); + + /** redraw \c inset in all the BufferViews in which it is currently + * visible. If successful return a pointer to the owning Buffer. + */ + Buffer const * updateInset(Inset const *); + /// + void restartCursor(); - /// add the command buffer - void addCommandBuffer(QToolBar * toolbar); + /// \return the \c Workarea associated to \p Buffer + /// \retval 0 if no \c WorkArea is found. + GuiWorkArea * workArea(Buffer & buffer); - /// menu item has been selected - void activated(FuncRequest const &); + /// Add a \c WorkArea + /// \return the \c Workarea associated to \p Buffer + /// \retval 0 if no \c WorkArea is found. + GuiWorkArea * addWorkArea(Buffer & buffer); + /// + void setCurrentWorkArea(GuiWorkArea * work_area); + /// + void removeWorkArea(GuiWorkArea * work_area); + /// return the current WorkArea (the one that has the focus). + GuiWorkArea const * currentWorkArea() const; + /// return the current WorkArea (the one that has the focus). + GuiWorkArea * currentWorkArea(); - QMenu* createPopupMenu(); + /// return the current document WorkArea (it may not have the focus). + GuiWorkArea const * currentMainWorkArea() const; + /// return the current document WorkArea (it may not have the focus). + GuiWorkArea * currentMainWorkArea(); Q_SIGNALS: void closing(int); public Q_SLOTS: - /// idle timeout - void update_view_state_qt(); + /// idle timeout. + /// clear any temporary message and replace with current status. + void clearMessage(); - /// populate a toplevel menu and all its children on demand - void updateMenu(QAction *); +private Q_SLOTS: + /// + void updateWindowTitle(GuiWorkArea * wa); + /// + void resetWindowTitleAndIconText(); - void currentTabChanged(int index); - void closeCurrentTab(); + /// + void on_currentWorkAreaChanged(GuiWorkArea *); + /// + void on_lastWorkAreaRemoved(); /// slots to change the icon size void smallSizedIcons(); void normalSizedIcons(); void bigSizedIcons(); -protected: +private: + /// + TabWorkArea * addTabWorkArea(); + + /// connect to signals in the given BufferView + void connectBufferView(BufferView & bv); + /// disconnect from signals in the given BufferView + void disconnectBufferView(); + /// connect to signals in the given buffer + void connectBuffer(Buffer & buf); + /// disconnect from signals in the given buffer + void disconnectBuffer(); + /// + void dragEnterEvent(QDragEnterEvent * ev); + /// + void dropEvent(QDropEvent * ev); /// make sure we quit cleanly - virtual void closeEvent(QCloseEvent * e); + void closeEvent(QCloseEvent * e); + /// + void showEvent(QShowEvent *); + + /// in order to catch Tab key press. + bool event(QEvent * e); + bool focusNextPrevChild(bool); /// - virtual void resizeEvent(QResizeEvent * e); + struct GuiViewPrivate; + GuiViewPrivate & d; +public: + /// + /// dialogs for this view /// - virtual void moveEvent(QMoveEvent * e); - /// \return the \c Workarea associated to \p Buffer - /// \retval 0 if no \c WorkArea is found. - WorkArea * workArea(Buffer & buffer); + /// + void resetDialogs(); + + /// Hide all visible dialogs + void hideAll() const; + + /// Update all visible dialogs. + /** + * Check the status of all visible dialogs and disable or reenable + * them as appropriate. + * + * Disabling is needed for example when a dialog is open and the + * cursor moves to a position where the corresponding inset is not + * allowed. + */ + void updateDialogs(); + + /** \param name == "bibtex", "citation" etc; an identifier used to + launch a particular dialog. + \param data is a string representation of the Inset contents. + It is often little more than the output from Inset::write. + It is passed to, and parsed by, the frontend dialog. + Several of these dialogs do not need any data, + so it defaults to string(). + \param inset ownership is _not_ passed to the frontend dialog. + It is stored internally and used by the kernel to ascertain + what to do with the FuncRequest dispatched from the frontend + dialog on 'Apply'; should it be used to create a new inset at + the current cursor position or modify an existing, 'open' inset? + */ + void showDialog(std::string const & name, + std::string const & data, Inset * inset = 0); + + /** \param name == "citation", "bibtex" etc; an identifier used + to reset the contents of a particular dialog with \param data. + See the comments to 'show', above. + */ + void updateDialog(std::string const & name, std::string const & data); + + /** All Dialogs of the given \param name will be closed if they are + connected to the given \param inset. + */ + void hideDialog(std::string const & name, Inset * inset); + /// + void disconnectDialog(std::string const & name); - /// Add a \c WorkArea - /// \return the \c Workarea associated to \p Buffer - /// \retval 0 if no \c WorkArea is found. - WorkArea * addWorkArea(Buffer & buffer); - void setCurrentWorkArea(WorkArea * work_area); - void removeWorkArea(WorkArea * work_area); - WorkArea const * currentWorkArea() const; - WorkArea * currentWorkArea(); + /// + void updateCompletion(Cursor & cur, bool start, bool keep); private: /// - void dragEnterEvent(QDragEnterEvent * ev); + void saveLayout() const; /// - void dropEvent(QDropEvent * ev); - - /// focus the command buffer widget - void focus_command_widget(); + bool restoreLayout(); + /// + GuiToolbar * toolbar(std::string const & name); + /// + void constructToolbars(); + /// + void initToolbars(); + /// + void lfunUiToggle(FuncRequest const & cmd); + /// + void toggleFullScreen(); + /// + void insertLyXFile(docstring const & fname); + /// + void insertPlaintextFile(docstring const & fname, + bool asParagraph); + /// Save a buffer as a new file. /** - * setWindowTitle - set title of window - * @param t main window title - * @param it iconified (short) title - */ - virtual void setWindowTitle(docstring const & t, docstring const & it); - - /// in order to catch Tab key press. - bool event(QEvent * e); - bool focusNextPrevChild(bool); - - QTimer statusbar_timer_; + Write a buffer to a new file name and rename the buffer + according to the new file name. - /// command buffer - QCommandBuffer * commandbuffer_; + This function is e.g. used by menu callbacks and + LFUN_BUFFER_WRITE_AS. - /// are we quitting by the menu? - bool quitting_by_menu_; + If 'newname' is empty, the user is asked via a + dialog for the buffer's new name and location. + If 'newname' is non-empty and has an absolute path, that is used. + Otherwise the base directory of the buffer is used as the base + for any relative path in 'newname'. + */ + bool renameBuffer(Buffer & b, docstring const & newname); /// - QRect updateFloatingGeometry(); + bool saveBuffer(Buffer & b); /// - QRect floatingGeometry_; + bool closeWorkArea(GuiWorkArea * wa, bool close_buffer, + bool tolastopened = false, bool mark_active = false); + /// gives the user the possibility to save his work + /// or to discard the changes. If hiding is true, the + /// document will be reloaded. + bool saveBufferIfNeeded(Buffer & buf, bool hiding); + /// + bool closeBufferAll(bool tolastopened = false); + /// is the buffer in this workarea also shown in another tab ? + /// This tab can either be in the same view or in another one. + bool inMultiTabs(GuiWorkArea * wa); + /// is the buffer in this workarea also shown in another view ? + bool inMultiViews(GuiWorkArea * wa); + /// + enum NextOrPrevious { + NEXTBUFFER, + PREVBUFFER + }; + /// + void gotoNextOrPreviousBuffer(NextOrPrevious np); - void setIconSize(unsigned int size); + /// + Inset * getOpenInset(std::string const & name) const; - struct ToolbarSize { - int top_width; - int bottom_width; - int left_height; - int right_height; - }; + /// Is the dialog currently visible? + bool isDialogVisible(std::string const & name) const; + /// + Dialog * findOrBuild(std::string const & name, bool hide_it); + /// + Dialog * build(std::string const & name); - ToolbarSize toolbarSize_; + /// This view ID. + int id_; - struct GuiViewPrivate; - GuiViewPrivate& d; + /// flag to avoid two concurrent close events. + bool closing_; }; } // namespace frontend