From 2be8eaa4db77f254beb08995591af8636d4165b6 Mon Sep 17 00:00:00 2001 From: Dave French Date: Thu, 22 Jan 2015 20:16:00 +0000 Subject: [PATCH 01/17] Proposed fix for 446, select notes in piano roll using timeline --- include/PianoRoll.h | 2 ++ src/gui/editors/PianoRoll.cpp | 42 +++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/include/PianoRoll.h b/include/PianoRoll.h index 8f1dabdc3..98e074619 100644 --- a/include/PianoRoll.h +++ b/include/PianoRoll.h @@ -160,6 +160,8 @@ protected slots: void hidePattern( Pattern* pattern ); + void selectRegionFromPixels( int x, int y ); + signals: void currentPatternChanged(); diff --git a/src/gui/editors/PianoRoll.cpp b/src/gui/editors/PianoRoll.cpp index 366920df7..679da308c 100644 --- a/src/gui/editors/PianoRoll.cpp +++ b/src/gui/editors/PianoRoll.cpp @@ -417,6 +417,10 @@ PianoRoll::PianoRoll() : connect( Engine::getSong(), SIGNAL( timeSignatureChanged( int, int ) ), this, SLOT( update() ) ); + + //connection for selecion from timeline + connect( m_timeLine, SIGNAL( regionSelectedFromPixels( int, int ) ), + this, SLOT( selectRegionFromPixels( int, int ) ) ); } @@ -589,6 +593,44 @@ void PianoRoll::hidePattern( Pattern* pattern ) } } +void PianoRoll::selectRegionFromPixels(int x, int y) +{ + + x -= WHITE_KEY_WIDTH; + y -= WHITE_KEY_WIDTH; + + // select an area of notes + int pos_ticks = x * MidiTime::ticksPerTact() / m_ppt + + m_currentPosition; + int key_num = 0; + m_selectStartTick = pos_ticks; + m_selectedTick = 0; + m_selectStartKey = key_num; + m_selectedKeys = 1; + // change size of selection + + // get tick in which the cursor is posated + pos_ticks = y * MidiTime::ticksPerTact() / m_ppt + + m_currentPosition; + key_num = 120; + + m_selectedTick = pos_ticks - m_selectStartTick; + if( (int) m_selectStartTick + m_selectedTick < 0 ) + { + m_selectedTick = -static_cast( + m_selectStartTick ); + } + m_selectedKeys = key_num - m_selectStartKey; + if( key_num <= m_selectStartKey ) + { + --m_selectedKeys; + } + + computeSelectedNotes( false ); +} + + + From c201a41c050ab31e9751154adf4820b87305acaf Mon Sep 17 00:00:00 2001 From: Dave French Date: Fri, 23 Jan 2015 02:16:30 +0000 Subject: [PATCH 02/17] Proposed fix 1416 Drag-and-drop of automatables to Automation Editor --- include/AutomationEditor.h | 4 ++++ include/AutomationTrack.h | 1 + src/gui/editors/AutomationEditor.cpp | 33 ++++++++++++++++++++++++++++ src/tracks/AutomationTrack.cpp | 1 + 4 files changed, 39 insertions(+) diff --git a/include/AutomationEditor.h b/include/AutomationEditor.h index 64cfeb718..45abfd932 100644 --- a/include/AutomationEditor.h +++ b/include/AutomationEditor.h @@ -70,6 +70,7 @@ public: virtual void saveSettings(QDomDocument & doc, QDomElement & parent); virtual void loadSettings(const QDomElement & parent); + QString nodeName() const { return "automationeditor"; @@ -262,6 +263,9 @@ public: void setCurrentPattern(AutomationPattern* pattern); const AutomationPattern* currentPattern(); + virtual void dropEvent( QDropEvent * _de ); + virtual void dragEnterEvent( QDragEnterEvent * _dee ); + void open(AutomationPattern* pattern); AutomationEditor* m_editor; diff --git a/include/AutomationTrack.h b/include/AutomationTrack.h index b8d3da38d..f805f1344 100644 --- a/include/AutomationTrack.h +++ b/include/AutomationTrack.h @@ -52,6 +52,7 @@ public: QDomElement & _parent ); virtual void loadTrackSpecificSettings( const QDomElement & _this ); + private: friend class AutomationTrackView; diff --git a/src/gui/editors/AutomationEditor.cpp b/src/gui/editors/AutomationEditor.cpp index f839eb5a6..4558ff7f0 100644 --- a/src/gui/editors/AutomationEditor.cpp +++ b/src/gui/editors/AutomationEditor.cpp @@ -64,6 +64,8 @@ #include "PianoRoll.h" #include "debug.h" #include "MeterModel.h" +#include "StringPairDrag.h" +#include "ProjectJournal.h" QPixmap * AutomationEditor::s_toolDraw = NULL; @@ -239,6 +241,7 @@ void AutomationEditor::loadSettings( const QDomElement & dom_parent) + // qproperty access methods QColor AutomationEditor::gridColor() const @@ -2220,6 +2223,7 @@ AutomationEditorWindow::AutomationEditorWindow() : setFocusPolicy( Qt::StrongFocus ); setFocus(); setWindowIcon( embed::getIconPixmap( "automation" ) ); + setAcceptDrops( true ); } @@ -2282,6 +2286,35 @@ const AutomationPattern* AutomationEditorWindow::currentPattern() return m_editor->currentPattern(); } +void AutomationEditorWindow::dropEvent(QDropEvent *_de) +{ + QString type = StringPairDrag::decodeKey( _de ); + QString val = StringPairDrag::decodeValue( _de ); + if( type == "automatable_model" ) + { + AutomatableModel * mod = dynamic_cast( + Engine::projectJournal()-> + journallingObject( val.toInt() ) ); + if( mod != NULL ) + { + if( m_editor->m_pattern->firstObject() ) + { + m_editor->m_pattern->objectDestroyed( m_editor->m_pattern->firstObject()->id() ); + } + m_editor->m_pattern->addObject( mod ); + setCurrentPattern( m_editor->m_pattern ); + + } + } + + update(); +} + +void AutomationEditorWindow::dragEnterEvent(QDragEnterEvent *_dee) +{ + StringPairDrag::processDragEnterEvent( _dee, "automatable_model" ); +} + void AutomationEditorWindow::open(AutomationPattern* pattern) { setCurrentPattern(pattern); diff --git a/src/tracks/AutomationTrack.cpp b/src/tracks/AutomationTrack.cpp index 2b397862d..1b552aba3 100644 --- a/src/tracks/AutomationTrack.cpp +++ b/src/tracks/AutomationTrack.cpp @@ -127,6 +127,7 @@ void AutomationTrack::loadTrackSpecificSettings( const QDomElement & _this ) + AutomationTrackView::AutomationTrackView( AutomationTrack * _at, TrackContainerView* tcv ) : TrackView( _at, tcv ) { From dfbbcfd38bb03cf279017cf2b213d7fc7e3462ca Mon Sep 17 00:00:00 2001 From: Dave French Date: Fri, 23 Jan 2015 02:38:17 +0000 Subject: [PATCH 03/17] 1416 tidy up --- include/AutomationEditor.h | 1 - include/AutomationTrack.h | 1 - src/gui/editors/AutomationEditor.cpp | 3 +-- src/tracks/AutomationTrack.cpp | 1 - 4 files changed, 1 insertion(+), 5 deletions(-) diff --git a/include/AutomationEditor.h b/include/AutomationEditor.h index 45abfd932..eca52d2c6 100644 --- a/include/AutomationEditor.h +++ b/include/AutomationEditor.h @@ -70,7 +70,6 @@ public: virtual void saveSettings(QDomDocument & doc, QDomElement & parent); virtual void loadSettings(const QDomElement & parent); - QString nodeName() const { return "automationeditor"; diff --git a/include/AutomationTrack.h b/include/AutomationTrack.h index f805f1344..b8d3da38d 100644 --- a/include/AutomationTrack.h +++ b/include/AutomationTrack.h @@ -52,7 +52,6 @@ public: QDomElement & _parent ); virtual void loadTrackSpecificSettings( const QDomElement & _this ); - private: friend class AutomationTrackView; diff --git a/src/gui/editors/AutomationEditor.cpp b/src/gui/editors/AutomationEditor.cpp index 4558ff7f0..9cfb70b12 100644 --- a/src/gui/editors/AutomationEditor.cpp +++ b/src/gui/editors/AutomationEditor.cpp @@ -241,7 +241,6 @@ void AutomationEditor::loadSettings( const QDomElement & dom_parent) - // qproperty access methods QColor AutomationEditor::gridColor() const @@ -2301,9 +2300,9 @@ void AutomationEditorWindow::dropEvent(QDropEvent *_de) { m_editor->m_pattern->objectDestroyed( m_editor->m_pattern->firstObject()->id() ); } + m_editor->m_pattern->clear(); m_editor->m_pattern->addObject( mod ); setCurrentPattern( m_editor->m_pattern ); - } } diff --git a/src/tracks/AutomationTrack.cpp b/src/tracks/AutomationTrack.cpp index 1b552aba3..2b397862d 100644 --- a/src/tracks/AutomationTrack.cpp +++ b/src/tracks/AutomationTrack.cpp @@ -127,7 +127,6 @@ void AutomationTrack::loadTrackSpecificSettings( const QDomElement & _this ) - AutomationTrackView::AutomationTrackView( AutomationTrack * _at, TrackContainerView* tcv ) : TrackView( _at, tcv ) { From f8120cd2fe4805cae35e88c94a3d4b1dd4e98be1 Mon Sep 17 00:00:00 2001 From: Dave French Date: Fri, 23 Jan 2015 18:15:03 +0000 Subject: [PATCH 04/17] Tidy up and remove clearing 1416 --- src/gui/editors/AutomationEditor.cpp | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/gui/editors/AutomationEditor.cpp b/src/gui/editors/AutomationEditor.cpp index 9cfb70b12..0c8033cb6 100644 --- a/src/gui/editors/AutomationEditor.cpp +++ b/src/gui/editors/AutomationEditor.cpp @@ -2223,6 +2223,7 @@ AutomationEditorWindow::AutomationEditorWindow() : setFocus(); setWindowIcon( embed::getIconPixmap( "automation" ) ); setAcceptDrops( true ); + m_toolBar->setAcceptDrops( true ); } @@ -2285,7 +2286,7 @@ const AutomationPattern* AutomationEditorWindow::currentPattern() return m_editor->currentPattern(); } -void AutomationEditorWindow::dropEvent(QDropEvent *_de) +void AutomationEditorWindow::dropEvent( QDropEvent *_de ) { QString type = StringPairDrag::decodeKey( _de ); QString val = StringPairDrag::decodeValue( _de ); @@ -2296,20 +2297,14 @@ void AutomationEditorWindow::dropEvent(QDropEvent *_de) journallingObject( val.toInt() ) ); if( mod != NULL ) { - if( m_editor->m_pattern->firstObject() ) - { - m_editor->m_pattern->objectDestroyed( m_editor->m_pattern->firstObject()->id() ); - } - m_editor->m_pattern->clear(); - m_editor->m_pattern->addObject( mod ); - setCurrentPattern( m_editor->m_pattern ); + m_editor->m_pattern->addObject( mod ); } } update(); } -void AutomationEditorWindow::dragEnterEvent(QDragEnterEvent *_dee) +void AutomationEditorWindow::dragEnterEvent( QDragEnterEvent *_dee ) { StringPairDrag::processDragEnterEvent( _dee, "automatable_model" ); } From f6792d991c51e1957d93ed7ed1591ada807179c4 Mon Sep 17 00:00:00 2001 From: Dave French Date: Fri, 23 Jan 2015 19:46:09 +0000 Subject: [PATCH 05/17] 1416 refresh window --- src/gui/editors/AutomationEditor.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gui/editors/AutomationEditor.cpp b/src/gui/editors/AutomationEditor.cpp index 0c8033cb6..bde69e950 100644 --- a/src/gui/editors/AutomationEditor.cpp +++ b/src/gui/editors/AutomationEditor.cpp @@ -2298,6 +2298,7 @@ void AutomationEditorWindow::dropEvent( QDropEvent *_de ) if( mod != NULL ) { m_editor->m_pattern->addObject( mod ); + setCurrentPattern( m_editor->m_pattern ); } } From e2a2d27bbaf9bdf95dad313a7f4c9d5764d82a82 Mon Sep 17 00:00:00 2001 From: Dave French Date: Sat, 24 Jan 2015 06:30:23 +0000 Subject: [PATCH 06/17] 446 change parameter names --- include/PianoRoll.h | 2 +- src/gui/editors/PianoRoll.cpp | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/include/PianoRoll.h b/include/PianoRoll.h index 98e074619..6260eaa7e 100644 --- a/include/PianoRoll.h +++ b/include/PianoRoll.h @@ -160,7 +160,7 @@ protected slots: void hidePattern( Pattern* pattern ); - void selectRegionFromPixels( int x, int y ); + void selectRegionFromPixels( int xStart, int xEnd ); signals: diff --git a/src/gui/editors/PianoRoll.cpp b/src/gui/editors/PianoRoll.cpp index 679da308c..0d3540975 100644 --- a/src/gui/editors/PianoRoll.cpp +++ b/src/gui/editors/PianoRoll.cpp @@ -593,14 +593,14 @@ void PianoRoll::hidePattern( Pattern* pattern ) } } -void PianoRoll::selectRegionFromPixels(int x, int y) +void PianoRoll::selectRegionFromPixels( int xStart, int xEnd ) { - x -= WHITE_KEY_WIDTH; - y -= WHITE_KEY_WIDTH; + xStart -= WHITE_KEY_WIDTH; + xEnd -= WHITE_KEY_WIDTH; // select an area of notes - int pos_ticks = x * MidiTime::ticksPerTact() / m_ppt + + int pos_ticks = xStart * MidiTime::ticksPerTact() / m_ppt + m_currentPosition; int key_num = 0; m_selectStartTick = pos_ticks; @@ -610,7 +610,7 @@ void PianoRoll::selectRegionFromPixels(int x, int y) // change size of selection // get tick in which the cursor is posated - pos_ticks = y * MidiTime::ticksPerTact() / m_ppt + + pos_ticks = xEnd * MidiTime::ticksPerTact() / m_ppt + m_currentPosition; key_num = 120; From 91c76f342b00ebb1c0d0845b9fc1b6d3b57bc71b Mon Sep 17 00:00:00 2001 From: SecondFlight Date: Sat, 24 Jan 2015 20:09:07 -0500 Subject: [PATCH 07/17] Added a song to data/projects/CoolSongs The song that will (hopefully) be added: https://soundcloud.com/second_flight/krem-kaakkuja-remix --- ...i - Krem Kaakkuja (Second Flight Remix).mmpz | Bin 0 -> 46365 bytes data/projects/CoolSongs/LICENSES.TXT | 8 ++++++-- 2 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 data/projects/CoolSongs/Greippi - Krem Kaakkuja (Second Flight Remix).mmpz diff --git a/data/projects/CoolSongs/Greippi - Krem Kaakkuja (Second Flight Remix).mmpz b/data/projects/CoolSongs/Greippi - Krem Kaakkuja (Second Flight Remix).mmpz new file mode 100644 index 0000000000000000000000000000000000000000..0a2ecb2c9364364a586b9a72d8acd2920696ca39 GIT binary patch literal 46365 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 zఊ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 z Date: Sun, 25 Jan 2015 20:07:53 +0000 Subject: [PATCH 08/17] Proposed fix 1685 Automation Copy/Paste from Context Menu --- src/core/Track.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/core/Track.cpp b/src/core/Track.cpp index 426676f0e..212c96ee6 100644 --- a/src/core/Track.cpp +++ b/src/core/Track.cpp @@ -49,6 +49,7 @@ #include "AutomationPattern.h" #include "AutomationTrack.h" +#include "AutomationEditor.h" #include "BBEditor.h" #include "BBTrack.h" #include "BBTrackContainer.h" @@ -207,6 +208,8 @@ void TrackContentObject::paste() restoreState( *( Clipboard::getContent( nodeName() ) ) ); movePosition( pos ); } + AutomationPattern::resolveAllIDs(); + GuiApplication::instance()->automationEditor()->m_editor->updateAfterPatternChange(); } From cebf8bfd59da8788645f281e1d59b9a9ac72ee0d Mon Sep 17 00:00:00 2001 From: Dave French Date: Sun, 25 Jan 2015 20:37:00 +0000 Subject: [PATCH 09/17] Renamed parameters on selectRegionFromPixels --- include/TrackContainerView.h | 2 +- src/gui/TrackContainerView.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/include/TrackContainerView.h b/include/TrackContainerView.h index 51b8ca0fa..42e56128f 100644 --- a/include/TrackContainerView.h +++ b/include/TrackContainerView.h @@ -131,7 +131,7 @@ public slots: /// \param x /// \param y /// Use the rubber band to select TCO from all tracks using x, y pixels - void selectRegionFromPixels(int x, int y); + void selectRegionFromPixels(int xStart, int xEnd); /// /// \brief stopRubberBand diff --git a/src/gui/TrackContainerView.cpp b/src/gui/TrackContainerView.cpp index 8872512c9..778577e18 100644 --- a/src/gui/TrackContainerView.cpp +++ b/src/gui/TrackContainerView.cpp @@ -313,11 +313,11 @@ void TrackContainerView::dragEnterEvent( QDragEnterEvent * _dee ) arg( Track::SampleTrack ) ); } -void TrackContainerView::selectRegionFromPixels(int x, int y) +void TrackContainerView::selectRegionFromPixels(int xStart, int xEnd) { m_rubberBand->setEnabled( true ); m_rubberBand->show(); - m_rubberBand->setGeometry( min( x, y ), 0, max( x, y ) - min( x, y ), std::numeric_limits::max() ); + m_rubberBand->setGeometry( min( xStart, xEnd ), 0, max( xStart, xEnd ) - min( xStart, xEnd ), std::numeric_limits::max() ); } void TrackContainerView::stopRubberBand() From ea80d01f8b445495ecdfe5266971dedb67cff6cd Mon Sep 17 00:00:00 2001 From: Spekular Date: Wed, 21 Jan 2015 13:04:19 +0100 Subject: [PATCH 10/17] Adds dialog when project is opened that was made with a different version of LMMS Remove Commented Out Code Update DataFile.cpp Update DataFile.cpp Update DataFile.cpp Changes per tresf's advice, adds comments Git??? Please work :/ Update DataFile.cpp Adds dialog when project is opened that was made with a different version of LMMS Remove Commented Out Code Update DataFile.cpp Update DataFile.cpp Update DataFile.cpp Changes per tresf's advice, adds comments Git??? Please work :/ Update DataFile.cpp --- src/core/DataFile.cpp | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/src/core/DataFile.cpp b/src/core/DataFile.cpp index 0cd7a5703..a9739f412 100644 --- a/src/core/DataFile.cpp +++ b/src/core/DataFile.cpp @@ -37,6 +37,7 @@ #include "ConfigManager.h" #include "ProjectVersion.h" +#include "ProjectVersion.h" #include "SongEditor.h" #include "Effect.h" #include "lmmsversion.h" @@ -779,10 +780,35 @@ void DataFile::loadData( const QByteArray & _data, const QString & _sourceFile ) m_type = type( root.attribute( "type" ) ); m_head = root.elementsByTagName( "head" ).item( 0 ).toElement(); - if( root.hasAttribute( "creatorversion" ) && - root.attribute( "creatorversion" ) != LMMS_VERSION ) + + if( root.hasAttribute( "creatorversion" ) ) { - upgrade(); + //compareType defaults to Build,so it doesn't have to be set here + ProjectVersion createdWith = root.attribute( "creatorversion" ); + ProjectVersion openedWith = LMMS_VERSION;; + + if (createdWith != openedWith) + { + //Only one compareType needs to be set, and "[The] ProjectVersion return type + //from the setCompareType(...) function [...] saves a few lines of code!" (@tresf) + if ( createdWith.setCompareType(Minor) != openedWith) + { + QMessageBox::information( NULL, + SongEditor::tr( "Project Version Mismatch" ), + SongEditor::tr( + "This project was created with " + "LMMS version %1, but version %2 " + "is installed") + .arg( root.attribute( "creatorversion" ) ) + .arg( LMMS_VERSION ) ); + } + + //The upgrade needs to happen after the warning as it updates the project version. + if( createdWith.setCompareType(Build) < openedWith ) + { + upgrade(); + } + } } m_content = root.elementsByTagName( typeName( m_type ) ). From 0847919214fa2f5f023f230514ba7dba955a9dca Mon Sep 17 00:00:00 2001 From: Spekular Date: Mon, 26 Jan 2015 09:39:03 +0100 Subject: [PATCH 11/17] Adds GUI check around GUI calls in DataFile.cpp --- src/core/DataFile.cpp | 69 ++++++++++++++++++++++++++----------------- 1 file changed, 42 insertions(+), 27 deletions(-) diff --git a/src/core/DataFile.cpp b/src/core/DataFile.cpp index a9739f412..c39e78296 100644 --- a/src/core/DataFile.cpp +++ b/src/core/DataFile.cpp @@ -125,14 +125,18 @@ DataFile::DataFile( const QString & _fileName ) : QFile inFile( _fileName ); if( !inFile.open( QIODevice::ReadOnly ) ) { - QMessageBox::critical( NULL, - SongEditor::tr( "Could not open file" ), - SongEditor::tr( "Could not open file %1. You probably " - "have no permissions to read this " - "file.\n Please make sure to have at " - "least read permissions to the file " - "and try again." ).arg( _fileName ) ); - return; + if( Engine::hasGUI() ) + { + QMessageBox::critical( NULL, + SongEditor::tr( "Could not open file" ), + SongEditor::tr( "Could not open file %1. You probably " + "have no permissions to read this " + "file.\n Please make sure to have at " + "least read permissions to the file " + "and try again." ).arg( _fileName ) ); + } + + return; } loadData( inFile.readAll(), _fileName ); @@ -220,11 +224,15 @@ bool DataFile::writeFile( const QString& filename ) if( !outfile.open( QIODevice::WriteOnly | QIODevice::Truncate ) ) { - QMessageBox::critical( NULL, - SongEditor::tr( "Could not write file" ), - SongEditor::tr( "Could not open %1 for writing. You probably are not permitted to " - "write to this file. Please make sure you have write-access to " - "the file and try again." ).arg( fullName ) ); + if( Engine::hasGUI() ) + { + QMessageBox::critical( NULL, + SongEditor::tr( "Could not write file" ), + SongEditor::tr( "Could not open %1 for writing. You probably are not permitted to " + "write to this file. Please make sure you have write-access to " + "the file and try again." ).arg( fullName ) ); + } + return false; } @@ -766,12 +774,16 @@ void DataFile::loadData( const QByteArray & _data, const QString & _sourceFile ) if( line >= 0 && col >= 0 ) { qWarning() << "at line" << line << "column" << errorMsg; - QMessageBox::critical( NULL, - SongEditor::tr( "Error in file" ), - SongEditor::tr( "The file %1 seems to contain " - "errors and therefore can't be " - "loaded." ). - arg( _sourceFile ) ); + if( Engine::hasGUI() ) + { + QMessageBox::critical( NULL, + SongEditor::tr( "Error in file" ), + SongEditor::tr( "The file %1 seems to contain " + "errors and therefore can't be " + "loaded." ). + arg( _sourceFile ) ); + } + return; } } @@ -793,14 +805,17 @@ void DataFile::loadData( const QByteArray & _data, const QString & _sourceFile ) //from the setCompareType(...) function [...] saves a few lines of code!" (@tresf) if ( createdWith.setCompareType(Minor) != openedWith) { - QMessageBox::information( NULL, - SongEditor::tr( "Project Version Mismatch" ), - SongEditor::tr( - "This project was created with " - "LMMS version %1, but version %2 " - "is installed") - .arg( root.attribute( "creatorversion" ) ) - .arg( LMMS_VERSION ) ); + if( Engine::hasGUI() ) + { + QMessageBox::information( NULL, + SongEditor::tr( "Project Version Mismatch" ), + SongEditor::tr( + "This project was created with " + "LMMS version %1, but version %2 " + "is installed") + .arg( root.attribute( "creatorversion" ) ) + .arg( LMMS_VERSION ) ); + } } //The upgrade needs to happen after the warning as it updates the project version. From 6ec2ece4a4af147ef3a3c995e3651f2668782f60 Mon Sep 17 00:00:00 2001 From: Spekular Date: Tue, 27 Jan 2015 11:32:39 +0100 Subject: [PATCH 12/17] Update code style for project version check. --- src/core/DataFile.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/core/DataFile.cpp b/src/core/DataFile.cpp index c39e78296..8db694367 100644 --- a/src/core/DataFile.cpp +++ b/src/core/DataFile.cpp @@ -795,14 +795,13 @@ void DataFile::loadData( const QByteArray & _data, const QString & _sourceFile ) if( root.hasAttribute( "creatorversion" ) ) { - //compareType defaults to Build,so it doesn't have to be set here + // compareType defaults to Build,so it doesn't have to be set here ProjectVersion createdWith = root.attribute( "creatorversion" ); ProjectVersion openedWith = LMMS_VERSION;; - if (createdWith != openedWith) + if ( createdWith != openedWith ) { - //Only one compareType needs to be set, and "[The] ProjectVersion return type - //from the setCompareType(...) function [...] saves a few lines of code!" (@tresf) + // only one compareType needs to be set, and we can compare on one line because setCompareType returns ProjectVersion if ( createdWith.setCompareType(Minor) != openedWith) { if( Engine::hasGUI() ) @@ -818,7 +817,7 @@ void DataFile::loadData( const QByteArray & _data, const QString & _sourceFile ) } } - //The upgrade needs to happen after the warning as it updates the project version. + // the upgrade needs to happen after the warning as it updates the project version. if( createdWith.setCompareType(Build) < openedWith ) { upgrade(); From 9b1e89ae21e631977957c293b95063b078545acf Mon Sep 17 00:00:00 2001 From: Dave French Date: Tue, 27 Jan 2015 11:18:25 +0000 Subject: [PATCH 13/17] Proposed fix 710 --- src/gui/dialogs/VersionedSaveDialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/dialogs/VersionedSaveDialog.cpp b/src/gui/dialogs/VersionedSaveDialog.cpp index ae7f5305e..476046371 100644 --- a/src/gui/dialogs/VersionedSaveDialog.cpp +++ b/src/gui/dialogs/VersionedSaveDialog.cpp @@ -72,7 +72,7 @@ VersionedSaveDialog::VersionedSaveDialog( QWidget *parent, bool VersionedSaveDialog::changeFileNameVersion(QString &fileName, bool increment ) { - static QRegExp regexp( "-\\d+(\\.\\w+)?$" ); + static QRegExp regexp( "[- ]\\d+(\\.\\w+)?$" ); int idx = regexp.indexIn( fileName ); // For file names without extension (no ".mmpz") From ff2617b0bd28e0c8b59c33f3990bb151970c557c Mon Sep 17 00:00:00 2001 From: Amadeus Folego Date: Wed, 28 Jan 2015 00:52:17 -0200 Subject: [PATCH 14/17] Fix crash when removing last channel Sometimes the last channel still had processing to do when it got deleted --- src/core/FxMixer.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/core/FxMixer.cpp b/src/core/FxMixer.cpp index 00143b2ee..5a2c8a272 100644 --- a/src/core/FxMixer.cpp +++ b/src/core/FxMixer.cpp @@ -529,7 +529,10 @@ FloatModel * FxMixer::channelSendModel( fx_ch_t fromChannel, fx_ch_t toChannel ) void FxMixer::mixToChannel( const sampleFrame * _buf, fx_ch_t _ch ) { - if( m_fxChannels[_ch]->m_muteModel.value() == false ) + // The first check is for the case where the last fxchannel was deleted but + // there was a race condition where it had to be processed. + if( _ch < m_fxChannels.size() && + m_fxChannels[_ch]->m_muteModel.value() == false ) { m_fxChannels[_ch]->m_lock.lock(); MixHelpers::add( m_fxChannels[_ch]->m_buffer, _buf, Engine::mixer()->framesPerPeriod() ); From ad1dc2268f33981c00b4ee9f518724c57d269b34 Mon Sep 17 00:00:00 2001 From: SecondFlight Date: Wed, 28 Jan 2015 09:46:26 -0500 Subject: [PATCH 15/17] Changed the license to CC (BY) Seems more reasonable based on the discussion. --- data/projects/CoolSongs/LICENSES.TXT | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/projects/CoolSongs/LICENSES.TXT b/data/projects/CoolSongs/LICENSES.TXT index 17747f0a9..513efd613 100644 --- a/data/projects/CoolSongs/LICENSES.TXT +++ b/data/projects/CoolSongs/LICENSES.TXT @@ -15,7 +15,7 @@ - http://lmms.io/lsp/index.php?action=show&file=1327 * Greippi - Krem Kaakkuja (Second Flight Remix) - - CC (by-nd) + - CC (by) - http://lmms.io/lsp/index.php?action=show&file=6337 * Greippi-ardudar.mmpz From dd80301cee59805ca70bd23607c937aa744f9f33 Mon Sep 17 00:00:00 2001 From: Dave French Date: Wed, 28 Jan 2015 15:35:01 +0000 Subject: [PATCH 16/17] Proposed fix for #1532 Tracks in song editor cannot be moved in pattern select mode. --- src/core/Track.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/core/Track.cpp b/src/core/Track.cpp index 426676f0e..80f30f4c1 100644 --- a/src/core/Track.cpp +++ b/src/core/Track.cpp @@ -2612,7 +2612,11 @@ void TrackView::mousePressEvent( QMouseEvent * _me ) } - if( m_trackContainerView->allowRubberband() == true ) + int widgetTotal = ConfigManager::inst()->value( "ui", + "compacttrackbuttons" ).toInt()==1 ? + DEFAULT_SETTINGS_WIDGET_WIDTH_COMPACT + TRACK_OP_WIDTH_COMPACT : + DEFAULT_SETTINGS_WIDGET_WIDTH + TRACK_OP_WIDTH; + if( m_trackContainerView->allowRubberband() == true && _me->x() > widgetTotal ) { QWidget::mousePressEvent( _me ); } @@ -2666,8 +2670,11 @@ void TrackView::mousePressEvent( QMouseEvent * _me ) */ void TrackView::mouseMoveEvent( QMouseEvent * _me ) { - - if( m_trackContainerView->allowRubberband() == true ) + int widgetTotal = ConfigManager::inst()->value( "ui", + "compacttrackbuttons" ).toInt()==1 ? + DEFAULT_SETTINGS_WIDGET_WIDTH_COMPACT + TRACK_OP_WIDTH_COMPACT : + DEFAULT_SETTINGS_WIDGET_WIDTH + TRACK_OP_WIDTH; + if( m_trackContainerView->allowRubberband() == true && _me->x() > widgetTotal ) { QWidget::mouseMoveEvent( _me ); } From dae0c05061e904bda042d783ac9da6c0b3002bf8 Mon Sep 17 00:00:00 2001 From: Amadeus Folego Date: Wed, 28 Jan 2015 23:22:29 -0200 Subject: [PATCH 17/17] Change Shift+Resize selected notes on Piano Roll Selected notes: when resized would offset posterior, non-selected notes to mantain some kind of melodic structure. This is referred to as *sticky* behaviour. It also assumes some kind of intention that may not be the case. Also adds complexity to a simple feature. This commit makes only the the selected notes be offset. It also adds a new shortcut to the old behaviour . Fixes #1666 --- include/PianoRoll.h | 2 +- src/gui/editors/PianoRoll.cpp | 39 +++++++++++++++++++++-------------- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/include/PianoRoll.h b/include/PianoRoll.h index 6260eaa7e..f4f313174 100644 --- a/include/PianoRoll.h +++ b/include/PianoRoll.h @@ -231,7 +231,7 @@ private: inline int noteEditRight() const; inline int noteEditLeft() const; - void dragNotes( int x, int y, bool alt, bool shift ); + void dragNotes( int x, int y, bool alt, bool shift, bool ctrl ); static const int cm_scrollAmtHoriz = 10; static const int cm_scrollAmtVert = 1; diff --git a/src/gui/editors/PianoRoll.cpp b/src/gui/editors/PianoRoll.cpp index 0d3540975..c14b6b930 100644 --- a/src/gui/editors/PianoRoll.cpp +++ b/src/gui/editors/PianoRoll.cpp @@ -949,7 +949,8 @@ void PianoRoll::keyPressEvent(QKeyEvent* ke ) { dragNotes( m_lastMouseX, m_lastMouseY, ke->modifiers() & Qt::AltModifier, - ke->modifiers() & Qt::ShiftModifier ); + ke->modifiers() & Qt::ShiftModifier, + ke->modifiers() & Qt::ControlModifier ); } } ke->accept(); @@ -981,7 +982,8 @@ void PianoRoll::keyPressEvent(QKeyEvent* ke ) { dragNotes( m_lastMouseX, m_lastMouseY, ke->modifiers() & Qt::AltModifier, - ke->modifiers() & Qt::ShiftModifier ); + ke->modifiers() & Qt::ShiftModifier, + ke->modifiers() & Qt::ControlModifier ); } } ke->accept(); @@ -1022,7 +1024,8 @@ void PianoRoll::keyPressEvent(QKeyEvent* ke ) { dragNotes( m_lastMouseX, m_lastMouseY, ke->modifiers() & Qt::AltModifier, - ke->modifiers() & Qt::ShiftModifier ); + ke->modifiers() & Qt::ShiftModifier, + ke->modifiers() & Qt::ControlModifier ); } } @@ -1063,7 +1066,8 @@ void PianoRoll::keyPressEvent(QKeyEvent* ke ) { dragNotes( m_lastMouseX, m_lastMouseY, ke->modifiers() & Qt::AltModifier, - ke->modifiers() & Qt::ShiftModifier ); + ke->modifiers() & Qt::ShiftModifier, + ke->modifiers() & Qt::ControlModifier ); } } @@ -1120,7 +1124,11 @@ void PianoRoll::keyPressEvent(QKeyEvent* ke ) } case Qt::Key_Control: - if ( isActiveWindow() ) + // Enter selection mode if: + // -> this window is active + // -> shift is not pressed + // ( is shortcut for sticky note resize) + if ( !( ke->modifiers() & Qt::ShiftModifier ) && isActiveWindow() ) { m_ctrlMode = m_editMode; m_editMode = ModeSelect; @@ -1265,7 +1273,7 @@ void PianoRoll::mousePressEvent(QMouseEvent * me ) return; } - // if holding control, go to selection mode + // if holding control, go to selection mode unless shift is also pressed if( me->modifiers() & Qt::ControlModifier && m_editMode != ModeSelect ) { m_ctrlMode = m_editMode; @@ -1991,12 +1999,10 @@ void PianoRoll::mouseMoveEvent( QMouseEvent * me ) pauseTestNotes(); } - dragNotes( - me->x(), - me->y(), + dragNotes( me->x(), me->y(), me->modifiers() & Qt::AltModifier, - me->modifiers() & Qt::ShiftModifier - ); + me->modifiers() & Qt::ShiftModifier, + me->modifiers() & Qt::ControlModifier ); if( replay_note && m_action == ActionMoveNote && ! ( ( me->modifiers() & Qt::ShiftModifier ) && ! m_startedWithShift ) ) { @@ -2408,7 +2414,7 @@ void PianoRoll::mouseMoveEvent( QMouseEvent * me ) -void PianoRoll::dragNotes( int x, int y, bool alt, bool shift ) +void PianoRoll::dragNotes( int x, int y, bool alt, bool shift, bool ctrl ) { // dragging one or more notes around @@ -2458,9 +2464,12 @@ void PianoRoll::dragNotes( int x, int y, bool alt, bool shift ) { Note *note = *it; const int pos = note->pos().getTicks(); - // when resizing a note and holding shift: shift the following - // notes to preserve the melody - if( m_action == ActionResizeNote && shift ) + + // When resizing notes: + // If shift is pressed we resize and rearrange only the selected notes + // If shift + ctrl then we also rearrange all posterior notes (sticky) + if( m_action == ActionResizeNote && shift && + ( note->selected() || ctrl ) ) { int shifted_pos = note->oldPos().getTicks() + shift_offset; if( shifted_pos && pos == shift_ref_pos )