File indexing completed on 2024-05-26 04:27:30

0001 /*
0002  *  SPDX-FileCopyrightText: 2016 Dmitry Kazakov <dimula73@gmail.com>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "KisPaintOpPresetUpdateProxy.h"
0008 
0009 #include "kis_signal_compressor.h"
0010 
0011 #include <kis_paintop_preset.h>
0012 
0013 struct KisPaintOpPresetUpdateProxy::Private
0014 {
0015     Private()
0016         : updatesCompressor(100, KisSignalCompressor::FIRST_ACTIVE),
0017           updatesBlocked(0),
0018           numUpdatesWhileBlocked(0)
0019     {
0020     }
0021 
0022     KisSignalCompressor updatesCompressor;
0023     int updatesBlocked;
0024     int numUpdatesWhileBlocked;
0025 };
0026 
0027 KisPaintOpPresetUpdateProxy::KisPaintOpPresetUpdateProxy()
0028     : m_d(new Private)
0029 {
0030     connect(&m_d->updatesCompressor, SIGNAL(timeout()), SLOT(slotDeliverSettingsChanged()));
0031 }
0032 
0033 KisPaintOpPresetUpdateProxy::~KisPaintOpPresetUpdateProxy()
0034 {
0035 }
0036 
0037 void KisPaintOpPresetUpdateProxy::notifySettingsChanged()
0038 {
0039     if (m_d->updatesBlocked) {
0040         m_d->numUpdatesWhileBlocked++;
0041     } else {
0042         emit sigSettingsChangedUncompressedEarlyWarning();
0043         emit sigSettingsChangedUncompressed();
0044         m_d->updatesCompressor.start();
0045     }
0046 }
0047 
0048 void KisPaintOpPresetUpdateProxy::notifyUniformPropertiesChanged()
0049 {
0050     emit sigUniformPropertiesChanged();
0051 }
0052 
0053 void KisPaintOpPresetUpdateProxy::postponeSettingsChanges()
0054 {
0055     m_d->updatesBlocked++;
0056 }
0057 
0058 void KisPaintOpPresetUpdateProxy::unpostponeSettingsChanges()
0059 {
0060     m_d->updatesBlocked--;
0061 
0062     if (!m_d->updatesBlocked && m_d->numUpdatesWhileBlocked) {
0063         m_d->numUpdatesWhileBlocked = 0;
0064         emit sigSettingsChangedUncompressedEarlyWarning();
0065         emit sigSettingsChangedUncompressed();
0066         emit sigSettingsChanged();
0067     }
0068 }
0069 
0070 void KisPaintOpPresetUpdateProxy::slotDeliverSettingsChanged()
0071 {
0072     if (m_d->updatesBlocked) {
0073         m_d->numUpdatesWhileBlocked++;
0074     } else {
0075         emit sigSettingsChanged();
0076     }
0077 }