diff --git a/krita/image/kis_signal_compressor.h b/krita/image/kis_signal_compressor.h --- a/krita/image/kis_signal_compressor.h +++ b/krita/image/kis_signal_compressor.h @@ -19,7 +19,7 @@ #ifndef __KIS_SIGNAL_COMPRESSOR_H #define __KIS_SIGNAL_COMPRESSOR_H -#include +#include #include "kritaimage_export.h" class QTimer; @@ -30,14 +30,16 @@ public: enum Mode { - POSTPONE, /* every start() porspones event by \p delay ms */ + POSTPONE, /* every start() portpones event by \p delay ms */ FIRST_ACTIVE, /* fist call to start() emits a signal, the latter will happen not earlier after \p delay ms */ FIRST_INACTIVE /* the first signal will be emitted not earlier that after \p delay ms after the first call to start() */ }; public: + KisSignalCompressor(); KisSignalCompressor(int delay, Mode mode, QObject *parent = 0); bool isActive() const; + void setMode(Mode mode); void setDelay(int delay); public Q_SLOTS: @@ -51,7 +53,7 @@ void timeout(); private: - QTimer *m_timer; + QTimer m_timer; Mode m_mode; bool m_gotSignals; }; diff --git a/krita/image/kis_signal_compressor.cpp b/krita/image/kis_signal_compressor.cpp --- a/krita/image/kis_signal_compressor.cpp +++ b/krita/image/kis_signal_compressor.cpp @@ -21,46 +21,52 @@ #include +KisSignalCompressor::KisSignalCompressor() + : QObject(0) + , m_gotSignals(false) +{ + m_timer.setSingleShot(true); + connect(&m_timer, SIGNAL(timeout()), SLOT(slotTimerExpired())); +} + KisSignalCompressor::KisSignalCompressor(int delay, Mode mode, QObject *parent) : QObject(parent), - m_timer(new QTimer(this)), m_mode(mode), m_gotSignals(false) { - m_timer->setSingleShot(true); - m_timer->setInterval(delay); - - connect(m_timer, SIGNAL(timeout()), SLOT(slotTimerExpired())); + m_timer.setSingleShot(true); + m_timer.setInterval(delay); + connect(&m_timer, SIGNAL(timeout()), SLOT(slotTimerExpired())); } void KisSignalCompressor::setDelay(int delay) { - m_timer->setInterval(delay); + m_timer.setInterval(delay); } void KisSignalCompressor::start() { switch (m_mode) { case POSTPONE: - m_timer->start(); + m_timer.start(); break; case FIRST_ACTIVE: - if (!m_timer->isActive()) { + if (!m_timer.isActive()) { m_gotSignals = false; - m_timer->start(); + m_timer.start(); emit timeout(); } else { m_gotSignals = true; } break; case FIRST_INACTIVE: - if (!m_timer->isActive()) { - m_timer->start(); + if (!m_timer.isActive()) { + m_timer.start(); } }; - if (m_mode == POSTPONE || !m_timer->isActive()) { - m_timer->start(); + if (m_mode == POSTPONE || !m_timer.isActive()) { + m_timer.start(); } } @@ -74,10 +80,15 @@ void KisSignalCompressor::stop() { - m_timer->stop(); + m_timer.stop(); } bool KisSignalCompressor::isActive() const { - return m_timer->isActive() && (m_mode != FIRST_ACTIVE || m_gotSignals); + return m_timer.isActive() && (m_mode != FIRST_ACTIVE || m_gotSignals); +} + +void KisSignalCompressor::setMode(KisSignalCompressor::Mode mode) +{ + m_mode = mode; } diff --git a/krita/ui/canvas/kis_canvas2.cpp b/krita/ui/canvas/kis_canvas2.cpp --- a/krita/ui/canvas/kis_canvas2.cpp +++ b/krita/ui/canvas/kis_canvas2.cpp @@ -95,9 +95,11 @@ , popupPalette(0) , displayColorConverter(new KisDisplayColorConverter(resourceManager, view)) { + qDebug() << "Creating" << this; } ~KisCanvas2Private() { + qDebug() << "Deleting" << this; delete shapeManager; delete toolProxy; } @@ -114,7 +116,7 @@ KisPrescaledProjectionSP prescaledProjection; bool vastScrolling; - KisSignalCompressor *updateSignalCompressor; + KisSignalCompressor updateSignalCompressor; QRect savedUpdateRect; QBitArray channelFlags; @@ -161,8 +163,10 @@ connect(kritaShapeController, SIGNAL(currentLayerChanged(const KoShapeLayer*)), globalShapeManager()->selection(), SIGNAL(currentLayerChanged(const KoShapeLayer*))); - m_d->updateSignalCompressor = new KisSignalCompressor(10 /*ms*/, KisSignalCompressor::FIRST_ACTIVE, this); - connect(m_d->updateSignalCompressor, SIGNAL(timeout()), SLOT(slotDoCanvasUpdate())); + + m_d->updateSignalCompressor.setDelay(10); + m_d->updateSignalCompressor.setMode(KisSignalCompressor::FIRST_ACTIVE); + connect(&m_d->updateSignalCompressor, SIGNAL(timeout()), SLOT(slotDoCanvasUpdate())); } KisCanvas2::~KisCanvas2() @@ -581,15 +585,16 @@ void KisCanvas2::updateCanvasWidgetImpl(const QRect &rc) { - if (!m_d->updateSignalCompressor->isActive() || + if (!m_d->updateSignalCompressor.isActive() || !m_d->savedUpdateRect.isEmpty()) { m_d->savedUpdateRect |= rc; } - m_d->updateSignalCompressor->start(); + m_d->updateSignalCompressor.start(); } void KisCanvas2::updateCanvas() { + qDebug() << "KisCanvas2::updateCanvas" << m_d; updateCanvasWidgetImpl(); }