X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fqt4%2FGuiApplication.h;h=de6013d4c7e691fa127e128d9de5a37fcc0fbcb3;hb=1f10969bb5c5f36017bf5ba8671381b09945cf57;hp=435af2d813687b2233d6a2def8c6d27cd9dff259;hpb=8460c9a072be7e067443c7933ca676285fd1bee5;p=lyx.git diff --git a/src/frontends/qt4/GuiApplication.h b/src/frontends/qt4/GuiApplication.h index 435af2d813..de6013d4c7 100644 --- a/src/frontends/qt4/GuiApplication.h +++ b/src/frontends/qt4/GuiApplication.h @@ -13,149 +13,260 @@ #ifndef GUIAPPLICATION_H #define GUIAPPLICATION_H -#include "ColorCache.h" -#include "GuiFontLoader.h" -#include "GuiClipboard.h" -#include "GuiSelection.h" - #include "frontends/Application.h" +#include "support/filetools.h" -#include #include -#include - -#include -#include +#include +#ifdef QPA_XCB +#include +#endif +class QAbstractItemModel; +class QIcon; class QSessionManager; +class QFont; namespace lyx { class BufferView; +class ColorCache; +class KeySymbol; + +namespace support { +class FileName; +} namespace frontend { class GuiView; -class LyXView; class GuiWorkArea; +class Menus; class SocketNotifier; +class Toolbars; /// The Qt main application class /** There should be only one instance of this class. No Qt object -initialisation should be done before the instanciation of this class. +initialisation should be done before the instantiation of this class. */ class GuiApplication : public QApplication, public Application +#ifdef QPA_XCB + , public QAbstractNativeEventFilter +#endif { Q_OBJECT public: GuiApplication(int & argc, char ** argv); - /// - virtual ~GuiApplication(); + ~GuiApplication(); - /// Method inherited from \c Application class + /// \name Methods inherited from Application class //@{ - virtual void resetGui(); - virtual Clipboard & clipboard(); - virtual Selection & selection(); - virtual FontLoader & fontLoader() { return font_loader_; } - virtual int exec(); - virtual void exit(int status); - virtual bool event(QEvent * e); - virtual bool getRgbColor(ColorCode col, RGBColor & rgbcol); - virtual std::string const hexName(ColorCode col); - virtual void updateColor(ColorCode col); - virtual void registerSocketCallback(int fd, SocketCallback func); + DispatchResult const & dispatch(FuncRequest const &); + void dispatch(FuncRequest const &, DispatchResult & dr); + FuncStatus getStatus(FuncRequest const & cmd) const; + void restoreGuiSession(); + Buffer const * updateInset(Inset const * inset) const; + int exec(); + void exit(int status); + bool event(QEvent * e); + bool getRgbColor(ColorCode col, RGBColor & rgbcol); + std::string const hexName(ColorCode col); + void registerSocketCallback(int fd, SocketCallback func); void unregisterSocketCallback(int fd); - LyXView & createView(std::string const & geometry_arg); + bool searchMenu(FuncRequest const & func, docstring_list & names) const; + void handleKeyFunc(FuncCode action); //@} - /// Methods inherited from \c QApplication class + /// + bool getStatus(FuncRequest const & cmd, FuncStatus & status) const; + /// + void hideDialogs(std::string const & name, Inset * inset) const; + /// + void resetGui(); + + /// + Clipboard & clipboard(); + /// + Selection & selection(); + /// + FontLoader & fontLoader(); + + /// + Toolbars const & toolbars() const; + /// + Toolbars & toolbars(); + /// + Menus const & menus() const; + /// + Menus & menus(); + + /// \name Methods inherited from QApplication class //@{ bool notify(QObject * receiver, QEvent * event); void commitData(QSessionManager & sm); +#ifdef Q_WS_X11 + bool x11EventFilter(XEvent * ev); +#elif defined(QPA_XCB) + virtual bool nativeEventFilter(const QByteArray & eventType, void * message, + long * result) Q_DECL_OVERRIDE; +#endif //@} + /// Create the main window with given geometry settings. + /// \param geometry_arg: only for Windows platform. + /// \param optional id identifier. + void createView(QString const & geometry_arg = QString(), + bool autoShow = true, int id = 0); + /// FIXME: this method and the one above are quite ugly. + void createView(int id); /// GuiView const * currentView() const { return current_view_; } /// GuiView * currentView() { return current_view_; } /// - void setCurrentView(GuiView & view) { current_view_ = &view; } - /// - virtual size_t viewCount() const { return view_ids_.size(); } + void setCurrentView(GuiView * view) { current_view_ = view; } /// - std::vector const & viewIds() { return view_ids_; } + QList viewIds() const; + + /// Clear all session information. + void clearSession(); /// - ColorCache & colorCache() { return color_cache_; } + ColorCache & colorCache(); /// - GuiFontLoader & guiFontLoader() { return font_loader_; } + QAbstractItemModel * languageModel(); /// return a suitable serif font name. - virtual QString const romanFontName(); + QString const romanFontName(); /// return a suitable sans serif font name. - virtual QString const sansFontName(); + QString const sansFontName(); /// return a suitable monospaced font name. - virtual QString const typewriterFontName(); - /// - virtual bool closeAllViews(); - /// - virtual bool unregisterView(int id); + QString const typewriterFontName(); + QFont const typewriterSystemFont(); + /// - virtual GuiView & view(int id) const; + void unregisterView(GuiView * gv); /// - virtual void hideDialogs(std::string const & name, Inset * inset) const; + GuiView & view(int id) const; + + /// Current ratio between physical pixels and device-independent pixels + double pixelRatio() const; + + /// How to load image files + support::search_mode imageSearchMode() const { +#if QT_VERSION >= 0x050000 + return pixelRatio() > 1 ? support::check_hidpi : support::must_exist; +#else + return support::must_exist; +#endif + } + + /// return true if the key is part of a shortcut + bool queryKeySym(KeySymbol const & key, KeyModifier state) const; /// - virtual Buffer const * updateInset(Inset const * inset) const; + void processKeySym(KeySymbol const & key, KeyModifier state); + /// return the status bar state string + docstring viewStatusMessage(); + + /// \name Methods to process FuncRequests + //@{ + /// process the func request + void processFuncRequest(FuncRequest const &); + /// add a func request to the queue and process it asynchronously + /// \note As a side-effect this will also process the + /// func requests that were added to the queue before. + void processFuncRequestAsync(FuncRequest const &); + /// process the func requests in the queue + void processFuncRequestQueue(); + /// process the func requests in the queue asynchronously + void processFuncRequestQueueAsync(); + /// add a func request to the queue for later processing + void addToFuncRequestQueue(FuncRequest const &); + //@} + + /// goto a bookmark + /// openFile: whether or not open a file if the file is not opened + /// switchToBuffer: whether or not switch to buffer if the buffer is + /// not the current buffer + void gotoBookmark(unsigned int idx, bool openFile, bool switchToBuffer); + /// Start a long operation with some cancel possibility (button or ESC) + void startLongOperation(); + /// This needs to be periodically called to avoid freezing the GUI + bool longOperationCancelled(); + /// Stop the long operation mode (i.e., release the GUI) + void stopLongOperation(); + /// A started long operation is still in progress ? + bool longOperationStarted(); private Q_SLOTS: /// void execBatchCommands(); /// void socketDataReceived(int fd); + /// events to be triggered by Private::general_timer_ should go here + void handleRegularEvents(); + /// + void onLastWindowClosed(); + /// + void slotProcessFuncRequestQueue() { processFuncRequestQueue(); } private: /// - GuiClipboard clipboard_; + void validateCurrentView(); + /// + void updateCurrentView(FuncRequest const & cmd, DispatchResult & dr); /// - GuiSelection selection_; + bool closeAllViews(); + /// Things that need to be done when the OSes session manager + /// requests a log out. + bool prepareAllViewsForLogout(); + /// read the given ui (menu/toolbar) file + bool readUIFile(QString const & name, bool include = false); /// - GuiFontLoader font_loader_; + enum ReturnValues { + ReadOK, + ReadError, + FormatMismatch + }; /// - ColorCache color_cache_; + ReturnValues readUIFile(support::FileName); /// - QTranslator qt_trans_; + void setGuiLanguage(); /// - std::map socket_notifiers_; + void reconfigure(std::string const & option); -#ifdef Q_WS_X11 -public: - bool x11EventFilter(XEvent * ev); -#endif - /// A translator suitable for the entries in the LyX menu. - /// Only needed with Qt/Mac. - void addMenuTranslator(); - - /// Multiple views container. - /** - * Warning: This must not be a smart pointer as the destruction of the - * object is handled by Qt when the view is closed - * \sa Qt::WA_DeleteOnClose attribute. - */ - std::map views_; - /// - std::vector view_ids_; - /// This LyXView is the one receiving Clipboard and Selection + /// This GuiView is the one receiving Clipboard and Selection /// events GuiView * current_view_; + + /// + struct Private; + Private * const d; }; // GuiApplication extern GuiApplication * guiApp; +/// \return the icon file name for the given action. +QString iconName(FuncRequest const & f, bool unknown); + +/// \return the pixmap for the given path, name and extension. +/// in case of errors a warning is produced and an empty pixmap is returned. +QPixmap getPixmap(QString const & path, QString const & name, QString const & ext); +/// Load the file at \param path and convert it to a pixmap. +/// \return true on success otherwise invalidate the pixmap and return false. +/// The caller is responsible for error reporting. +bool getPixmap(QPixmap & pixmap, QString const & path); + +/// \return an icon for the given action. +QIcon getIcon(FuncRequest const & f, bool unknown); + +/// +GuiApplication * theGuiApp(); + } // namespace frontend } // namespace lyx