#include "support/convert.h"
#include "support/debug.h"
#include "support/gettext.h"
-#include "support/FileName.h"
#include "support/lassert.h"
#include "support/TempFile.h"
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)
{
}
double GuiWorkArea::pixelRatio() const
{
#if QT_VERSION >= 0x050000
- return devicePixelRatio();
+ return qt_scale_factor * devicePixelRatio();
#else
return 1.0;
#endif
if (buffer.text().paragraphs().size() > 4)
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
QTimer::singleShot(50, this, SLOT(fixVerticalScrollBar()));
+ Q_EMIT bufferViewChanged();
}
void GuiWorkArea::Private::updateScrollbar()
{
ScrollbarParameters const & scroll_ = buffer_view_->scrollbarParameters();
- // WARNING: don't touch at the scrollbar value like this:
- // verticalScrollBar()->setValue(scroll_.position);
- // because this would cause a recursive signal/slot calling with
- // GuiWorkArea::scrollTo
+ // Block signals to prevent setRange() and setSliderPosition from causing
+ // recursive calls via the signal valueChanged. (#10311)
+ QSignalBlocker blocker(p->verticalScrollBar());
p->verticalScrollBar()->setRange(scroll_.min, scroll_.max);
p->verticalScrollBar()->setPageStep(scroll_.page_step);
p->verticalScrollBar()->setSingleStep(scroll_.single_step);
stopBlinkingCursor();
// last_width : for checking if last preedit string was/wasn't empty.
- // FIXME THREAD
+ // FIXME THREAD && FIXME
// We could have more than one work area, right?
static bool last_width = false;
if (!last_width && preedit_string.empty()) {
GuiPainter pain(d->screen_, pixelRatio());
d->buffer_view_->updateMetrics();
d->buffer_view_->draw(pain);
+ // FIXME: shall we use real_current_font here? (see #10478)
FontInfo font = d->buffer_view_->cursor().getFont().fontInfo();
FontMetrics const & fm = theFontMetrics(font);
int height = fm.maxHeight();
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);
+ 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();
+ Q_EMIT titleChanged(this);
}
}
TabWorkArea::TabWorkArea(QWidget * parent)
- : QTabWidget(parent), clicked_tab_(-1)
+ : QTabWidget(parent), clicked_tab_(-1), midpressed_tab_(-1)
{
#ifdef Q_OS_MAC
setStyle(&noTabFrameMacStyle);
}
+void TabWorkArea::mousePressEvent(QMouseEvent *me)
+{
+ if (me->button() == Qt::MidButton)
+ midpressed_tab_ = tabBar()->tabAt(me->pos());
+ else
+ QTabWidget::mousePressEvent(me);
+}
+
+
+void TabWorkArea::mouseReleaseEvent(QMouseEvent *me)
+{
+ if (me->button() == Qt::MidButton) {
+ int const midreleased_tab = tabBar()->tabAt(me->pos());
+ if (midpressed_tab_ == midreleased_tab && posIsTab(me->pos()))
+ closeTab(midreleased_tab);
+ } else
+ QTabWidget::mouseReleaseEvent(me);
+}
+
+
void TabWorkArea::paintEvent(QPaintEvent * event)
{
if (tabBar()->isVisible()) {
}
+bool TabWorkArea::posIsTab(QPoint position)
+{
+ // tabAt returns -1 if tab does not covers position
+ return tabBar()->tabAt(position) > -1;
+}
+
+
void TabWorkArea::mouseDoubleClickEvent(QMouseEvent * event)
{
if (event->button() != Qt::LeftButton)
// leave this code for now. (skostysh, 2016-07-21)
//
// return early if double click on existing tabs
- for (int i = 0; i < count(); ++i)
- if (tabBar()->tabRect(i).contains(event->pos()))
- return;
+ if (posIsTab(event->pos()))
+ return;
dispatch(FuncRequest(LFUN_BUFFER_NEW));
}