]> git.lyx.org Git - features.git/commitdiff
Set window title according to platform UI
authorJean-Marc Lasgouttes <lasgouttes@lyx.org>
Tue, 6 Sep 2016 09:17:10 +0000 (11:17 +0200)
committerJean-Marc Lasgouttes <lasgouttes@lyx.org>
Mon, 17 Oct 2016 08:51:46 +0000 (10:51 +0200)
The window title is built from the current file name and its
mofidication state. We use our own code instead of the automatic title
bar provided when windowFileName() is set because

1/ Qt does not keep the full path name
2/ Qt does not yield a nice application name
3/ Qt separates file name and app name with an em-dash. It seems that
   only KDE does that: Gnome does not, Windows does not either. I do not
   think that we can/want to detect a KDE environment at run-time.

The "read only" and "version control" status are shown in the status bar:

* for read only we use the tab read only emblem (with the right size)
* for version control, we show the name of the backend (using a new
  vcname() method of the backend).

The iconText() of the view is not updated anymore, since this is
deprecated in Qt5.

(cherry picked from commit 82808fea04315fd323ec074e8ad7865d190987d4)
(cherry picked from commit 9313f8565b41c9de4b1990e155fe3fe8468f3446)
(cherry picked from commit bbe36ce6ce87ae37b7c30c250efbff2f9c185de4)
(cherry picked from commit 7cbc0c16a841716fa8966e0f800ee2cdc0432e25)

src/LyXVC.cpp
src/LyXVC.h
src/VCBackend.h
src/frontends/qt4/GuiView.cpp
src/frontends/qt4/GuiView.h
src/frontends/qt4/GuiWorkArea.cpp
status.22x

index d48031102b76436b578f667e76c9f6aa66e57f73..323965858c56870a4eef7842466d174f959db297 100644 (file)
@@ -46,6 +46,12 @@ LyXVC::~LyXVC()
 {}
 
 
+string LyXVC::vcname() const
+{
+       return vcs->vcname();
+}
+
+
 bool LyXVC::fileInVC(FileName const & fn)
 {
        if (!RCS::findFile(fn).empty())
index 3036a396e3a8d4bb448cf7cfc044e986fdaee043..197c4d98b9faaeff2aa30cb6d4f0dfd79ad3e277 100644 (file)
@@ -50,6 +50,8 @@ public:
        LyXVC();
        ///
        ~LyXVC();
+       /// Name of the underlying VCS
+       std::string vcname() const;
        /// Is \p fn under version control?
        static bool fileInVC(support::FileName const & fn);
        /** Not a good name perhaps. This function should be called whenever
index 467a094d937060689a37a882b648b139383745ed..636cd9d4708c905745119289198a5b030f694c9f 100644 (file)
@@ -38,6 +38,8 @@ public:
        VCS(Buffer * b) : vcstatus(NOLOCKING), owner_(b) {}
        virtual ~VCS() {}
 
+       /// the name of the vc backend
+       virtual std::string vcname() const = 0;
        /// register a file for version control
        virtual void registrer(std::string const & msg) = 0;
        /// can this operation be processed in the current VCS?
@@ -150,6 +152,8 @@ public:
        /// get file from repo, the caller must ensure that it does not exist locally
        static bool retrieve(support::FileName const & file);
 
+       virtual std::string vcname() const { return "RCS"; };
+
        virtual void registrer(std::string const & msg);
 
        virtual bool renameEnabled();
@@ -234,6 +238,8 @@ public:
        /// get file from repo, the caller must ensure that it does not exist locally
        static bool retrieve(support::FileName const & file);
 
+       virtual std::string vcname() const { return "CVS"; };
+
        virtual void registrer(std::string const & msg);
 
        virtual bool renameEnabled();
@@ -373,6 +379,8 @@ public:
        /// get file from repo, the caller must ensure that it does not exist locally
        static bool retrieve(support::FileName const & file);
 
+       virtual std::string vcname() const { return "SVN"; };
+
        virtual void registrer(std::string const & msg);
 
        virtual bool renameEnabled();
@@ -481,6 +489,8 @@ public:
        /// get file from repo, the caller must ensure that it does not exist locally
        static bool retrieve(support::FileName const & file);
 
+       virtual std::string vcname() const { return "GIT"; };
+
        virtual void registrer(std::string const & msg);
 
        virtual bool renameEnabled();
index 65115142fb8759eeb9e4a59de823d5f6b6ef3ebd..a7d4f4d19f862b62d7534994a72f1faf84099650 100644 (file)
 #include <QSplitter>
 #include <QStackedWidget>
 #include <QStatusBar>
-#if QT_VERSION >= 0x050000
 #include <QSvgRenderer>
-#endif
 #include <QtConcurrentRun>
 #include <QTime>
 #include <QTimer>
@@ -553,7 +551,7 @@ GuiView::GuiView(int id)
 #endif
 
 #endif
-       resetWindowTitleAndIconText();
+       resetWindowTitle();
 
        // use tabbed dock area for multiple docks
        // (such as "source" and "messages")
@@ -577,6 +575,23 @@ GuiView::GuiView(int id)
        connect(&d.processing_thread_watcher_, SIGNAL(finished()), 
                busylabel, SLOT(hide()));
 
+       QFontMetrics const fm(statusBar()->fontMetrics());
+       int const roheight = max(int(d.normalIconSize), fm.height());
+       QSize const rosize(roheight, roheight);
+       QPixmap readonly = QIcon(getPixmap("images/", "emblem-readonly", "svgz,png")).pixmap(rosize);
+       read_only_ = new QLabel(statusBar());
+       read_only_->setPixmap(readonly);
+       read_only_->setScaledContents(true);
+       read_only_->setAlignment(Qt::AlignCenter);
+       read_only_->hide();
+       statusBar()->addPermanentWidget(read_only_);
+
+       version_control_ = new QLabel(statusBar());
+       version_control_->setAlignment(Qt::AlignCenter);
+       version_control_->setFrameStyle(QFrame::StyledPanel);
+       version_control_->hide();
+       statusBar()->addPermanentWidget(version_control_);
+
        statusBar()->setSizeGripEnabled(true);
        updateStatusBar();
 
@@ -1144,14 +1159,35 @@ void GuiView::updateWindowTitle(GuiWorkArea * wa)
        if (wa != d.current_work_area_
                || wa->bufferView().buffer().isInternal())
                return;
-       setWindowTitle(qt_("LyX: ") + wa->windowTitle());
-       setWindowIconText(wa->windowIconText());
-#if (QT_VERSION >= 0x040400)
-       // Sets the path for the window: this is used by OSX to 
+       Buffer const & buf = wa->bufferView().buffer();
+       // Set the windows title
+       docstring title = buf.fileName().displayName(130) + from_ascii("[*]");
+#ifndef Q_WS_MAC
+       title += from_ascii(" - LyX");
+#endif
+       setWindowTitle(toqstr(title));
+       // Sets the path for the window: this is used by OSX to
        // allow a context click on the title bar showing a menu
        // with the path up to the file
-       setWindowFilePath(toqstr(wa->bufferView().buffer().absFileName()));
-#endif
+       setWindowFilePath(toqstr(buf.absFileName()));
+       // Tell Qt whether the current document is changed
+       setWindowModified(!buf.isClean());
+
+       if (buf.isReadonly())
+               read_only_->show();
+       else
+               read_only_->hide();
+
+       if (buf.lyxvc().inUse()) {
+               version_control_->show();
+               if (buf.lyxvc().locking())
+                       version_control_->setText(
+                               toqstr(bformat(_("%1$s lock"),
+                                              from_ascii(buf.lyxvc().vcname()))));
+               else
+                       version_control_->setText(toqstr(buf.lyxvc().vcname()));
+       } else
+               version_control_->hide();
 }
 
 
@@ -1196,7 +1232,7 @@ void GuiView::on_lastWorkAreaRemoved()
        updateDialog("document", "");
        updateDialogs();
 
-       resetWindowTitleAndIconText();
+       resetWindowTitle();
        updateStatusBar();
 
        if (lyxrc.open_buffers_in_tabs)
@@ -1285,7 +1321,7 @@ bool GuiView::event(QEvent * e)
                        updateDialog("document", "");
                        updateDialogs();
                } else {
-                       resetWindowTitleAndIconText();
+                       resetWindowTitle();
                }
                setFocus();
                return QMainWindow::event(e);
@@ -1312,10 +1348,9 @@ bool GuiView::event(QEvent * e)
        }
 }
 
-void GuiView::resetWindowTitleAndIconText()
+void GuiView::resetWindowTitle()
 {
        setWindowTitle(qt_("LyX"));
-       setWindowIconText(qt_("LyX"));
 }
 
 bool GuiView::focusNextPrevChild(bool /*next*/)
index 9402c415c46160d1f9aa3ca1dd2452f4b2724c16..3fcfc01dd896eca7ec4886dce19ebff389d8422b 100644 (file)
@@ -24,6 +24,7 @@
 class QCloseEvent;
 class QDragEnterEvent;
 class QDropEvent;
+class QLabel;
 class QMenu;
 class QShowEvent;
 
@@ -220,12 +221,12 @@ public Q_SLOTS:
        /// idle timeout.
        /// clear any temporary message and replace with current status.
        void clearMessage();
-
-private Q_SLOTS:
        ///
        void updateWindowTitle(GuiWorkArea * wa);
+
+private Q_SLOTS:
        ///
-       void resetWindowTitleAndIconText();
+       void resetWindowTitle();
 
        ///
        void on_currentWorkAreaChanged(GuiWorkArea *);
@@ -457,6 +458,11 @@ private:
        /// Request to give focus to minibuffer
        bool minibuffer_focus_;
 
+       /// Statusbar widget that shows read-only status
+       QLabel * read_only_;
+       /// Statusbar widget that shows version control status
+       QLabel * version_control_;
+
 };
 
 } // namespace frontend
index 7b8b088504eb64b181782f9cfb12163e2bf15d48..4fb5ef0a539376fc6314bf12c09d4424f4654fd2 100644 (file)
@@ -1373,34 +1373,8 @@ QVariant GuiWorkArea::inputMethodQuery(Qt::InputMethodQuery query) const
 
 void GuiWorkArea::updateWindowTitle()
 {
-       docstring maximize_title;
-       docstring minimize_title;
-
-       Buffer const & buf = d->buffer_view_->buffer();
-       FileName const file_name = buf.fileName();
-       if (!file_name.empty()) {
-               maximize_title = file_name.displayName(130);
-               minimize_title = from_utf8(file_name.onlyFileName());
-               if (buf.lyxvc().inUse()) {
-                       if (buf.lyxvc().locking())
-                               maximize_title +=  _(" (version control, locking)");
-                       else
-                               maximize_title +=  _(" (version control)");
-               }
-               if (!buf.isClean()) {
-                       maximize_title += _(" (changed)");
-                       minimize_title += char_type('*');
-               }
-               if (buf.isReadonly())
-                       maximize_title += _(" (read only)");
-       }
-
-       QString const new_title = toqstr(maximize_title);
-       if (new_title != windowTitle()) {
-               QWidget::setWindowTitle(new_title);
-               QWidget::setWindowIconText(toqstr(minimize_title));
-               titleChanged(this);
-       }
+       d->lyx_view_->updateWindowTitle(this);
+       titleChanged(this);
 }
 
 
index de0029f59c93711ae3df878e20565a0e317b27f9..94b4c0d09074c14ff09f3885605a9604c71bdad1 100644 (file)
@@ -21,6 +21,9 @@ What's new
 
 * USER INTERFACE
 
+- The title bar is now set according to platform UI. Read-only and
+  version control are shown by indicators in the status bar.
+
 
 * DOCUMENTATION AND LOCALIZATION