Do some caching of window title and related UI

This should avoid performance problems related to the window update machinery.
Moreover this fixes a crash introduced by e4998f21 when closing a file.

Note that GuiWorkArea::Private already had a read_only_ member, but it
was unused.

Also rename LyXVC::vcname() to LyXVC::vcstatus() since it now contains
directly the UI string to be shown.

(cherry picked from commit 6cb05ce8bb)
(cherry picked from commit 85bcf0d93f)
This commit is contained in:
Jean-Marc Lasgouttes 2016-10-19 11:55:08 +02:00
parent e4998f21b0
commit 4c724a6072
5 changed files with 39 additions and 20 deletions

View File

@ -46,9 +46,14 @@ LyXVC::~LyXVC()
{}
string LyXVC::vcname() const
docstring LyXVC::vcstatus() const
{
return vcs->vcname();
if (!vcs)
return docstring();
if (locking())
return bformat(_("%1$s lock"), from_ascii(vcs->vcname()));
else
return from_ascii(vcs->vcname());
}

View File

@ -14,6 +14,8 @@
#include <boost/scoped_ptr.hpp>
#include "support/docstring.h"
#include <string>
@ -50,8 +52,8 @@ public:
LyXVC();
///
~LyXVC();
/// Name of the underlying VCS
std::string vcname() const;
/// Status of the underlying VCS
docstring vcstatus() 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

View File

@ -1180,12 +1180,7 @@ void GuiView::updateWindowTitle(GuiWorkArea * wa)
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()));
version_control_->setText(toqstr(buf.lyxvc().vcstatus()));
} else
version_control_->hide();
}

View File

@ -47,7 +47,6 @@
#include "support/convert.h"
#include "support/debug.h"
#include "support/gettext.h"
#include "support/FileName.h"
#include "support/lassert.h"
#include "support/TempFile.h"
@ -246,11 +245,12 @@ SyntheticMouseEvent::SyntheticMouseEvent()
GuiWorkArea::Private::Private(GuiWorkArea * parent)
: p(parent), screen_(0), buffer_view_(0), read_only_(false), lyx_view_(0),
cursor_visible_(false), cursor_(0),
need_resize_(false), schedule_redraw_(false), preedit_lines_(1),
pixel_ratio_(1.0),
completer_(new GuiCompleter(p, p)), dialog_mode_(false)
: p(parent), screen_(0), buffer_view_(0), lyx_view_(0),
cursor_visible_(false), cursor_(0),
need_resize_(false), schedule_redraw_(false), preedit_lines_(1),
pixel_ratio_(1.0),
completer_(new GuiCompleter(p, p)), dialog_mode_(false),
read_only_(false), clean_(true)
{
}
@ -1373,8 +1373,15 @@ QVariant GuiWorkArea::inputMethodQuery(Qt::InputMethodQuery query) const
void GuiWorkArea::updateWindowTitle()
{
d->lyx_view_->updateWindowTitle(this);
titleChanged(this);
Buffer const & buf = bufferView().buffer();
if (buf.fileName() != d->file_name_ || buf.isReadonly() != d->read_only_
|| buf.lyxvc().vcstatus() != d->vc_status_ || buf.isClean() != d->clean_) {
d->file_name_ = buf.fileName();
d->read_only_ = buf.isReadonly();
d->vc_status_ = buf.lyxvc().vcstatus();
d->clean_ = buf.isClean();
titleChanged(this);
}
}

View File

@ -15,6 +15,7 @@
#include "FuncRequest.h"
#include "LyXRC.h"
#include "support/FileName.h"
#include "support/Timeout.h"
#include <QMouseEvent>
@ -150,8 +151,6 @@ struct GuiWorkArea::Private
QPaintDevice * screen_;
///
BufferView * buffer_view_;
/// Read only Buffer status cache.
bool read_only_;
///
GuiView * lyx_view_;
/// is the cursor currently displayed
@ -187,6 +186,17 @@ struct GuiWorkArea::Private
/// when the menu is actually shown (after releasing on Windows)
/// and after the DEPM has done its job.
std::string context_menu_name_;
/// stuff related to window title
///
support::FileName file_name_;
///
bool read_only_;
///
docstring vc_status_;
///
bool clean_;
}; // GuiWorkArea
} // namespace frontend