Skip to content

Commit

Permalink
Fix knobs not updating vals on link (LMMS#4904)
Browse files Browse the repository at this point in the history
  • Loading branch information
JohannesLorenz committed Feb 25, 2020
1 parent ccf5a71 commit 8ace136
Show file tree
Hide file tree
Showing 4 changed files with 84 additions and 0 deletions.
1 change: 1 addition & 0 deletions include/AutomatableModel.h
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,7 @@ class EXPORT AutomatableModel : public Model, public JournallingObject
m_centerValue = centerVal;
}

//! link @p m1 and @p m2, let @p m1 take the values of @p m2
static void linkModels( AutomatableModel* m1, AutomatableModel* m2 );
static void unlinkModels( AutomatableModel* m1, AutomatableModel* m2 );

Expand Down
15 changes: 15 additions & 0 deletions src/core/AutomatableModel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -443,8 +443,23 @@ void AutomatableModel::unlinkModel( AutomatableModel* model )

void AutomatableModel::linkModels( AutomatableModel* model1, AutomatableModel* model2 )
{
if (!model1->m_linkedModels.contains( model2 ) && model1 != model2)
{
// copy data
model1->m_value = model2->m_value;
if (model1->valueBuffer() && model2->valueBuffer())
{
std::copy_n(model2->valueBuffer()->data(),
model1->valueBuffer()->length(),
model1->valueBuffer()->data());
}
// send dataChanged() before linking (because linking will
// connect the two dataChanged() signals)
emit model1->dataChanged();
// finally: link the models
model1->linkModel( model2 );
model2->linkModel( model1 );
}
}


Expand Down
1 change: 1 addition & 0 deletions tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ ADD_EXECUTABLE(tests
QTestSuite
$<TARGET_OBJECTS:lmmsobjs>

src/core/AutomatableModelTest.cpp
src/core/ProjectVersionTest.cpp
src/core/RelativePathsTest.cpp

Expand Down
67 changes: 67 additions & 0 deletions tests/src/core/AutomatableModelTest.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
/*
* AutomatableModelTest.cpp
*
* Copyright (c) 2020 Johannes Lorenz <j.git$$$lorenz-ho.me, $$$=@>
*
* This file is part of LMMS - https://lmms.io
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program (see COPYING); if not, write to the
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301 USA.
*
*/

#include "QTestSuite.h"

#include "AutomatableModel.h"

class AutomatableModelTest : QTestSuite
{
Q_OBJECT

bool m1Changed, m2Changed;
void resetChanged() { m1Changed = m2Changed = false; }

private slots: // helper slots
void onM1Changed(Model* ) { m1Changed = true; }
void onM2Changed(Model* ) { m2Changed = true; }

private slots: // tests
void LinkTests()
{
BoolModel m1(false), m2(false);

QObject::connect(&m1, SIGNAL(dataChanged(Model*)),
this, SLOT(onM1Changed(Model*)));
QObject::connect(&m2, SIGNAL(dataChanged(Model*)),
this, SLOT(onM2Changed(Model*)));

resetChanged();
AutomatableModel::linkModels(&m1, &m1);
QVERIFY(!m1Changed); // cannot link to itself
QVERIFY(!m2Changed);

resetChanged();
AutomatableModel::linkModels(&m1, &m2);
QVERIFY(m1Changed); // since m1 takes the value of m2
QVERIFY(!m2Changed); // the second model is the source

resetChanged();
AutomatableModel::linkModels(&m1, &m2);
QVERIFY(!m1Changed); // it's already linked
QVERIFY(!m2Changed);
}
} AutomatableModelTests;

#include "AutomatableModelTest.moc"

0 comments on commit 8ace136

Please sign in to comment.