Le 06/09/2016 à 18:12, Jean-Marc Lasgouttes a écrit :
Hello,

The following patch uses Qt built-in mechanism for creating window
title. This means that changed status is shown using an asterisk (except
on Mac OS) and that read-only and version-control and not shown anymore.
The patch also adds two widgets to the status bar that provide this
information

Here is an updated patch following the feedback received here and at
http://www.lyx.org/trac/ticket/10367

I consider it complete enough, except that the emblem-read-only svg icon makes the status bar grow vertically, and I have no idea of the right way to avoid that. Any idea?

Comments on the patch are welcome.

JMarc

>From 8dca45a34c00a4a65128c53c756ce2deadf0ea6d Mon Sep 17 00:00:00 2001
From: Jean-Marc Lasgouttes <lasgout...@lyx.org>
Date: Tue, 6 Sep 2016 11:17:10 +0200
Subject: [PATCH] Set window title according to platform UI

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

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

* for read only we use the tab read only emblem (does not have the
  right size yet)
* 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.
---
 src/LyXVC.cpp                     |    6 +++++
 src/LyXVC.h                       |    2 ++
 src/VCBackend.h                   |   10 ++++++++
 src/frontends/qt4/GuiView.cpp     |   50 ++++++++++++++++++++++++++++++-------
 src/frontends/qt4/GuiView.h       |   12 ++++++---
 src/frontends/qt4/GuiWorkArea.cpp |   30 ++--------------------
 6 files changed, 70 insertions(+), 40 deletions(-)

diff --git a/src/LyXVC.cpp b/src/LyXVC.cpp
index b28139f..15d2626 100644
--- a/src/LyXVC.cpp
+++ b/src/LyXVC.cpp
@@ -41,6 +41,12 @@ LyXVC::LyXVC()
 }
 
 
+string LyXVC::vcname() const
+{
+	return vcs->vcname();
+}
+
+
 bool LyXVC::fileInVC(FileName const & fn)
 {
 	if (!RCS::findFile(fn).empty())
diff --git a/src/LyXVC.h b/src/LyXVC.h
index 27d935e..f54fd9a 100644
--- a/src/LyXVC.h
+++ b/src/LyXVC.h
@@ -48,6 +48,8 @@ public:
 	};
 	///
 	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
diff --git a/src/VCBackend.h b/src/VCBackend.h
index 467a094..636cd9d 100644
--- a/src/VCBackend.h
+++ b/src/VCBackend.h
@@ -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();
diff --git a/src/frontends/qt4/GuiView.cpp b/src/frontends/qt4/GuiView.cpp
index c74163a..68d4cfa 100644
--- a/src/frontends/qt4/GuiView.cpp
+++ b/src/frontends/qt4/GuiView.cpp
@@ -553,7 +553,7 @@ GuiView::GuiView(int id)
 #endif
 
 #endif
-	resetWindowTitleAndIconText();
+	resetWindowTitle();
 
 	// use tabbed dock area for multiple docks
 	// (such as "source" and "messages")
@@ -577,6 +577,19 @@ GuiView::GuiView(int id)
 	connect(&d.processing_thread_watcher_, SIGNAL(finished()), 
 		busylabel, SLOT(hide()));
 
+	read_only_ = new QLabel(statusBar());
+	read_only_->setPixmap(getPixmap("images/", "emblem-readonly", "svgz,png"));
+	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 +1157,34 @@ 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)
+	Buffer const & buf = wa->bufferView().buffer();
 	// 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()));
+	setWindowFilePath(toqstr(buf.absFileName()));
+	// Tell Qt whether the current document is changed
+	setWindowModified(!buf.isClean());
+	// Set the windows title
+	docstring title = buf.fileName().displayName(130) + from_ascii("[*]");
+#ifndef Q_WS_MAC
+	// — U+2014 EM DASH
+	title += from_ascii(" ") + char_type(0x2014) + from_ascii(" LyX");
 #endif
+	setWindowTitle(toqstr(title));
+
+	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 +1229,7 @@ void GuiView::on_lastWorkAreaRemoved()
 	updateDialog("document", "");
 	updateDialogs();
 
-	resetWindowTitleAndIconText();
+	resetWindowTitle();
 	updateStatusBar();
 
 	if (lyxrc.open_buffers_in_tabs)
@@ -1285,7 +1318,7 @@ bool GuiView::event(QEvent * e)
 			updateDialog("document", "");
 			updateDialogs();
 		} else {
-			resetWindowTitleAndIconText();
+			resetWindowTitle();
 		}
 		setFocus();
 		return QMainWindow::event(e);
@@ -1312,10 +1345,9 @@ bool GuiView::event(QEvent * e)
 	}
 }
 
-void GuiView::resetWindowTitleAndIconText()
+void GuiView::resetWindowTitle()
 {
 	setWindowTitle(qt_("LyX"));
-	setWindowIconText(qt_("LyX"));
 }
 
 bool GuiView::focusNextPrevChild(bool /*next*/)
diff --git a/src/frontends/qt4/GuiView.h b/src/frontends/qt4/GuiView.h
index 0d8cf8d..c7c2699 100644
--- a/src/frontends/qt4/GuiView.h
+++ b/src/frontends/qt4/GuiView.h
@@ -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 *);
@@ -455,6 +456,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
diff --git a/src/frontends/qt4/GuiWorkArea.cpp b/src/frontends/qt4/GuiWorkArea.cpp
index 69090b3..a0f57fe 100644
--- a/src/frontends/qt4/GuiWorkArea.cpp
+++ b/src/frontends/qt4/GuiWorkArea.cpp
@@ -1387,34 +1387,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);
 }
 
 
-- 
1.7.9.5

Reply via email to