diff --git a/src/LyXVC.cpp b/src/LyXVC.cpp index d48031102b..323965858c 100644 --- a/src/LyXVC.cpp +++ b/src/LyXVC.cpp @@ -46,6 +46,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 3036a396e3..197c4d98b9 100644 --- a/src/LyXVC.h +++ b/src/LyXVC.h @@ -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 diff --git a/src/VCBackend.h b/src/VCBackend.h index 467a094d93..636cd9d470 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 65115142fb..a7d4f4d19f 100644 --- a/src/frontends/qt4/GuiView.cpp +++ b/src/frontends/qt4/GuiView.cpp @@ -110,9 +110,7 @@ #include #include #include -#if QT_VERSION >= 0x050000 #include -#endif #include #include #include @@ -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*/) diff --git a/src/frontends/qt4/GuiView.h b/src/frontends/qt4/GuiView.h index 9402c415c4..3fcfc01dd8 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(); + /// + void updateWindowTitle(GuiWorkArea * wa); private Q_SLOTS: /// - void updateWindowTitle(GuiWorkArea * wa); - /// - 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 diff --git a/src/frontends/qt4/GuiWorkArea.cpp b/src/frontends/qt4/GuiWorkArea.cpp index 7b8b088504..4fb5ef0a53 100644 --- a/src/frontends/qt4/GuiWorkArea.cpp +++ b/src/frontends/qt4/GuiWorkArea.cpp @@ -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); } diff --git a/status.22x b/status.22x index de0029f59c..94b4c0d090 100644 --- a/status.22x +++ b/status.22x @@ -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