From 01252892c0fef349fc695ee4fe7523c05b1444b3 Mon Sep 17 00:00:00 2001 From: adi Date: Fri, 10 Jul 2020 16:14:59 +0530 Subject: [PATCH 01/63] Enable track-wide color coding --- include/BBTrack.h | 1 + include/Pattern.h | 35 ++++++++++++++++++++++++++- include/SampleTrack.h | 33 ++++++++++++++++++++++++-- include/Track.h | 14 +++++++++++ src/core/Track.cpp | 46 +++++++++++++++++++++++++++++++++++- src/tracks/BBTrack.cpp | 26 +++++++++++++++++++-- src/tracks/Pattern.cpp | 48 ++++++++++++++++++++++++++++++++++---- src/tracks/SampleTrack.cpp | 40 +++++++++++++++++++++++++++++-- 8 files changed, 231 insertions(+), 12 deletions(-) diff --git a/include/BBTrack.h b/include/BBTrack.h index 70195f28de6..531dedcb172 100644 --- a/include/BBTrack.h +++ b/include/BBTrack.h @@ -107,6 +107,7 @@ protected slots: void changeName(); void changeColor(); void resetColor(); + void trackColorChanged( QColor & c ); protected: diff --git a/include/Pattern.h b/include/Pattern.h index 5192da9faf8..7497c5f33de 100644 --- a/include/Pattern.h +++ b/include/Pattern.h @@ -100,6 +100,26 @@ class LMMS_EXPORT Pattern : public TrackContentObject { return "pattern"; } + + unsigned int color() const + { + return( m_color.rgb() ); + } + + QColor colorObj() const + { + return m_color; + } + + void setColor( const QColor & c ) + { + m_color = QColor( c ); + } + + void setUseStyleColor( bool b ) + { + m_useStyleColor = b; + } inline InstrumentTrack * instrumentTrack() const { @@ -110,7 +130,9 @@ class LMMS_EXPORT Pattern : public TrackContentObject TrackContentObjectView * createView( TrackView * _tv ) override; - + + void setBGColor( QColor & c ); + QColor BGColor(); using Model::dataChanged; @@ -145,6 +167,9 @@ protected slots: Pattern * adjacentPatternByOffset(int offset) const; + QColor m_color; + bool m_useStyleColor; + friend class PatternView; friend class BBTrackContainerView; @@ -181,6 +206,12 @@ class PatternView : public TrackContentObjectView QColor const & getMutedNoteBorderColor() const { return m_mutedNoteBorderColor; } void setMutedNoteBorderColor(QColor const & color) { m_mutedNoteBorderColor = color; } + QColor color() const + { + return( m_pat->m_color ); + } + void setColor( QColor _new_color ); + public slots: void update() override; @@ -191,6 +222,8 @@ protected slots: void resetName(); void changeName(); + + void trackColorChanged( QColor & ); protected: diff --git a/include/SampleTrack.h b/include/SampleTrack.h index 47cc0df3945..91690a936b6 100644 --- a/include/SampleTrack.h +++ b/include/SampleTrack.h @@ -64,6 +64,27 @@ class SampleTCO : public TrackContentObject { return m_sampleBuffer; } + + unsigned int color() const + { + return( m_color.rgb() ); + } + + QColor colorObj() const + { + return m_color; + } + + void setColor( const QColor & c ) + { + m_color = QColor( c ); + } + + void setUseStyleColor( bool b ) + { + m_useStyleColor = b; + } + MidiTime sampleLength() const; void setSampleStartFrame( f_cnt_t startFrame ); @@ -87,7 +108,9 @@ public slots: SampleBuffer* m_sampleBuffer; BoolModel m_recordModel; bool m_isPlaying; - + + bool m_useStyleColor; + QColor m_color; friend class SampleTCOView; @@ -106,11 +129,17 @@ class SampleTCOView : public TrackContentObjectView public: SampleTCOView( SampleTCO * _tco, TrackView * _tv ); virtual ~SampleTCOView() = default; + + QColor color() const + { + return( m_tco->m_color ); + } + void setColor( QColor _new_color ); public slots: void updateSample(); - + void trackColorChanged( QColor & ); protected: void contextMenuEvent( QContextMenuEvent * _cme ) override; diff --git a/include/Track.h b/include/Track.h index 89c95059cf9..e9d40d88007 100644 --- a/include/Track.h +++ b/include/Track.h @@ -154,6 +154,9 @@ class LMMS_EXPORT TrackContentObject : public Model, public JournallingObject MidiTime startTimeOffset() const; void setStartTimeOffset( const MidiTime &startTimeOffset ); + + void setBGColor( QColor & c ); + QColor BGColor(); public slots: void copy(); @@ -165,6 +168,7 @@ public slots: void lengthChanged(); void positionChanged(); void destroyedTCO(); + void trackColorChanged( QColor & ); private: @@ -188,6 +192,8 @@ public slots: bool m_selectViewOnCreate; + QColor m_bgcolor; + friend class TrackContentObjectView; } ; @@ -443,6 +449,9 @@ class TrackOperationsWidget : public QWidget TrackOperationsWidget( TrackView * parent ); ~TrackOperationsWidget(); + void setBackgroundColor( QColor & ); + QColor backgroundColor(); + protected: void mousePressEvent( QMouseEvent * me ) override; @@ -453,6 +462,8 @@ private slots: void cloneTrack(); void removeTrack(); void updateMenu(); + void changeTrackColor(); + void resetTrackColor(); void toggleRecording(bool on); void recordingOn(); void recordingOff(); @@ -467,11 +478,13 @@ private slots: PixmapButton * m_muteBtn; PixmapButton * m_soloBtn; + QColor m_backgroundColor; friend class TrackView; signals: void trackRemovalScheduled( TrackView * t ); + void colorChanged( QColor & c ); } ; @@ -616,6 +629,7 @@ public slots: void toggleSolo(); + void trackColorChanged( QColor & c ); private: TrackContainer* m_trackContainer; diff --git a/src/core/Track.cpp b/src/core/Track.cpp index 8f7b62bcd2c..193d6da3192 100644 --- a/src/core/Track.cpp +++ b/src/core/Track.cpp @@ -39,6 +39,7 @@ #include +#include #include #include #include @@ -245,7 +246,16 @@ void TrackContentObject::setStartTimeOffset( const MidiTime &startTimeOffset ) m_startTimeOffset = startTimeOffset; } +void TrackContentObject::setBGColor( QColor & c ) +{ + m_bgcolor = c; + emit trackColorChanged( m_bgcolor ); +} +QColor TrackContentObject::BGColor() +{ + return m_bgcolor; +} @@ -2016,7 +2026,26 @@ void TrackOperationsWidget::removeTrack() emit trackRemovalScheduled( m_trackView ); } +void TrackOperationsWidget::setBackgroundColor( QColor & c ) +{ m_backgroundColor = c; } +QColor TrackOperationsWidget::backgroundColor() +{ return m_backgroundColor; } + +void TrackOperationsWidget::changeTrackColor() +{ + QColor new_color = QColorDialog::getColor( QPalette::Background ); + if( ! new_color.isValid() ) + { return; } + + m_backgroundColor = new_color; + emit colorChanged( m_backgroundColor ); +} +void TrackOperationsWidget::resetTrackColor() +{ + m_backgroundColor = QPalette::Background; + emit colorChanged( m_backgroundColor ); +} /*! \brief Update the trackOperationsWidget context menu @@ -2057,6 +2086,12 @@ void TrackOperationsWidget::updateMenu() toMenu->addAction( tr( "Turn all recording on" ), this, SLOT( recordingOn() ) ); toMenu->addAction( tr( "Turn all recording off" ), this, SLOT( recordingOff() ) ); } + + toMenu->addSeparator(); + toMenu->addAction( embed::getIconPixmap( "colorize" ), + tr( "Change color" ), this, SLOT( changeTrackColor() ) ); + toMenu->addAction( embed::getIconPixmap( "colorize" ), + tr( "Reset color to default" ), this, SLOT( resetTrackColor() ) ); } @@ -2666,7 +2701,13 @@ void Track::toggleSolo() } } - +void Track::trackColorChanged( QColor & c ) +{ + for (int i = 0; i < numOfTCOs(); i++) + { + m_trackContentObjects[i]->setBGColor(c); + } +} BoolModel *Track::getMutedModel() @@ -2737,6 +2778,9 @@ TrackView::TrackView( Track * track, TrackContainerView * tcv ) : connect( &m_track->m_soloModel, SIGNAL( dataChanged() ), m_track, SLOT( toggleSolo() ), Qt::DirectConnection ); + + connect( &m_trackOperationsWidget, SIGNAL( colorChanged( QColor & ) ), + m_track, SLOT( trackColorChanged( QColor & ) ) ); // create views for already existing TCOs for( Track::tcoVector::iterator it = m_track->m_trackContentObjects.begin(); diff --git a/src/tracks/BBTrack.cpp b/src/tracks/BBTrack.cpp index a779e2ea49b..7686a796225 100644 --- a/src/tracks/BBTrack.cpp +++ b/src/tracks/BBTrack.cpp @@ -153,7 +153,10 @@ BBTCOView::BBTCOView( TrackContentObject * _tco, TrackView * _tv ) : m_bbTCO( dynamic_cast( _tco ) ), m_paintPixmap() { - connect( _tco->getTrack(), SIGNAL( dataChanged() ), this, SLOT( update() ) ); + connect( _tco->getTrack(), SIGNAL( dataChanged() ), + this, SLOT( update() ) ); + connect( _tco, SIGNAL( trackColorChanged( QColor & ) ), + this, SLOT( trackColorChanged( QColor & ) ) ); setStyle( QApplication::style() ); } @@ -372,7 +375,26 @@ void BBTCOView::update() TrackContentObjectView::update(); } - +void BBTCOView::trackColorChanged( QColor & c ) +{ + if( isSelected() ) + { + QVector selected = + gui->songEditor()->m_editor->selectedObjects(); + for( QVector::iterator it = + selected.begin(); + it != selected.end(); ++it ) + { + BBTCOView * bb_tcov = dynamic_cast( *it ); + if( bb_tcov ) + { + bb_tcov->setColor( c ); + } + } + } + else + { setColor(c); } +} QColor * BBTrack::s_lastTCOColor = NULL; diff --git a/src/tracks/Pattern.cpp b/src/tracks/Pattern.cpp index 125e84a1f57..5bc95c9d35a 100644 --- a/src/tracks/Pattern.cpp +++ b/src/tracks/Pattern.cpp @@ -41,6 +41,7 @@ #include "BBTrackContainer.h" #include "StringPairDrag.h" #include "MainWindow.h" +#include "SongEditor.h" #include @@ -56,7 +57,9 @@ Pattern::Pattern( InstrumentTrack * _instrument_track ) : TrackContentObject( _instrument_track ), m_instrumentTrack( _instrument_track ), m_patternType( BeatPattern ), - m_steps( MidiTime::stepsPerBar() ) + m_steps( MidiTime::stepsPerBar() ), + m_color( 128, 128, 128 ), + m_useStyleColor( true ) { setName( _instrument_track->name() ); if( _instrument_track->trackContainer() @@ -75,7 +78,9 @@ Pattern::Pattern( const Pattern& other ) : TrackContentObject( other.m_instrumentTrack ), m_instrumentTrack( other.m_instrumentTrack ), m_patternType( other.m_patternType ), - m_steps( other.m_steps ) + m_steps( other.m_steps ), + m_color( 128, 128, 128 ), + m_useStyleColor( true ) { for( NoteVector::ConstIterator it = other.m_notes.begin(); it != other.m_notes.end(); ++it ) { @@ -586,6 +591,8 @@ PatternView::PatternView( Pattern* pattern, TrackView* parent ) : { connect( gui->pianoRoll(), SIGNAL( currentPatternChanged() ), this, SLOT( update() ) ); + connect( m_pat, SIGNAL( trackColorChanged( QColor & ) ), + this, SLOT( trackColorChanged( QColor & ) ) ); if( s_stepBtnOn0 == NULL ) { @@ -665,7 +672,37 @@ void PatternView::changeName() m_pat->setName( s ); } +void PatternView::setColor( QColor new_color ) +{ + if( new_color.rgb() != m_pat->color() ) + { + m_pat->setColor( new_color ); + m_pat->m_useStyleColor = false; + Engine::getSong()->setModified(); + update(); + } +} +void PatternView::trackColorChanged( QColor & c ) +{ + if( isSelected() ) + { + QVector selected = + gui->songEditor()->m_editor->selectedObjects(); + for( QVector::iterator it = + selected.begin(); + it != selected.end(); ++it ) + { + PatternView * pcov = dynamic_cast( *it ); + if( pcov ) + { + pcov->setColor( c ); + } + } + } + else + { setColor(c); } +} void PatternView::constructContextMenu( QMenu * _cm ) @@ -864,9 +901,12 @@ void PatternView::paintEvent( QPaintEvent * ) bool beatPattern = m_pat->m_patternType == Pattern::BeatPattern; // state: selected, normal, beat pattern, muted - QColor c = isSelected() ? selectedColor() : ( ( !muted && !beatPattern ) + /*QColor c = isSelected() ? selectedColor() : ( ( !muted && !beatPattern ) ? painter.background().color() : ( beatPattern - ? BBPatternBackground() : mutedBackgroundColor() ) ); + ? BBPatternBackground() : mutedBackgroundColor() ) );*/ + QColor c = isSelected() ? selectedColor() : ( muted ? mutedBackgroundColor() + : ( m_pat->m_useStyleColor ? painter.background().color() + : m_pat->colorObj() ) ); // invert the gradient for the background in the B&B editor QLinearGradient lingrad( 0, 0, 0, height() ); diff --git a/src/tracks/SampleTrack.cpp b/src/tracks/SampleTrack.cpp index 9232cc8b0d4..fbfc4b377b7 100644 --- a/src/tracks/SampleTrack.cpp +++ b/src/tracks/SampleTrack.cpp @@ -56,7 +56,9 @@ SampleTCO::SampleTCO( Track * _track ) : TrackContentObject( _track ), m_sampleBuffer( new SampleBuffer ), - m_isPlaying( false ) + m_isPlaying( false ), + m_useStyleColor( true ), + m_color( 128, 128, 128 ) { saveJournallingState( false ); setSampleFile( "" ); @@ -323,6 +325,9 @@ SampleTCOView::SampleTCOView( SampleTCO * _tco, TrackView * _tv ) : // track future changes of SampleTCO connect( m_tco, SIGNAL( sampleChanged() ), this, SLOT( updateSample() ) ); + + connect( m_tco, SIGNAL( trackColorChanged( QColor & ) ), + this, SLOT( trackColorChanged( QColor & ) ) ); setStyle( QApplication::style() ); } @@ -501,7 +506,8 @@ void SampleTCOView::paintEvent( QPaintEvent * pe ) // state: selected, muted, normal c = isSelected() ? selectedColor() : ( muted ? mutedBackgroundColor() - : painter.background().color() ); + : ( m_tco->m_useStyleColor ? painter.background().color() + : m_tco->colorObj() ) ); lingrad.setColorAt( 1, c.darker( 300 ) ); lingrad.setColorAt( 0, c ); @@ -580,7 +586,37 @@ void SampleTCOView::paintEvent( QPaintEvent * pe ) painter.drawPixmap( 0, 0, m_paintPixmap ); } +void SampleTCOView::setColor( QColor new_color ) +{ + if( new_color.rgb() != m_tco->color() ) + { + m_tco->setColor( new_color ); + m_tco->m_useStyleColor = false; + Engine::getSong()->setModified(); + update(); + } +} +void SampleTCOView::trackColorChanged( QColor & c ) +{ + if( isSelected() ) + { + QVector selected = + gui->songEditor()->m_editor->selectedObjects(); + for( QVector::iterator it = + selected.begin(); + it != selected.end(); ++it ) + { + SampleTCOView * scov = dynamic_cast( *it ); + if( scov ) + { + scov->setColor( c ); + } + } + } + else + { setColor(c); } +} From ac99a20cbd60bb56a5cbb5a258a6dccf2061f160 Mon Sep 17 00:00:00 2001 From: adi Date: Sat, 11 Jul 2020 12:58:46 +0530 Subject: [PATCH 02/63] Add support for automation tracks --- include/AutomationPattern.h | 22 +++++++++++++++++ include/AutomationPatternView.h | 13 ++++++++-- src/core/AutomationPattern.cpp | 8 ++++-- src/gui/AutomationPatternView.cpp | 41 +++++++++++++++++++++++++++++-- 4 files changed, 78 insertions(+), 6 deletions(-) diff --git a/include/AutomationPattern.h b/include/AutomationPattern.h index cad9d0a1d00..d25908c2824 100644 --- a/include/AutomationPattern.h +++ b/include/AutomationPattern.h @@ -93,6 +93,25 @@ class LMMS_EXPORT AutomationPattern : public TrackContentObject void applyDragValue(); + unsigned int color() const + { + return( m_color.rgb() ); + } + + QColor colorObj() const + { + return m_color; + } + + void setColor( const QColor & c ) + { + m_color = QColor( c ); + } + + void setUseStyleColor( bool b ) + { + m_useStyleColor = b; + } bool isDragging() const { @@ -192,6 +211,9 @@ public slots: static const float DEFAULT_MIN_VALUE; static const float DEFAULT_MAX_VALUE; + + QColor m_color; + bool m_useStyleColor; friend class AutomationPatternView; diff --git a/include/AutomationPatternView.h b/include/AutomationPatternView.h index 3f019483a10..5a031421ece 100644 --- a/include/AutomationPatternView.h +++ b/include/AutomationPatternView.h @@ -27,10 +27,11 @@ #include +#include "AutomationPattern.h" +#include "Song.h" +#include "SongEditor.h" #include "Track.h" -class AutomationPattern; - class AutomationPatternView : public TrackContentObjectView { @@ -41,6 +42,12 @@ class AutomationPatternView : public TrackContentObjectView AutomationPatternView( AutomationPattern * _pat, TrackView * _parent ); virtual ~AutomationPatternView(); + QColor color() const + { + return( m_pat->m_color ); + } + void setColor( QColor _new_color ); + public slots: /// Opens this view's pattern in the global automation editor void openInAutomationEditor(); @@ -54,6 +61,8 @@ protected slots: void toggleRecording(); void flipY(); void flipX(); + + void trackColorChanged( QColor & ); protected: void constructContextMenu( QMenu * ) override; diff --git a/src/core/AutomationPattern.cpp b/src/core/AutomationPattern.cpp index 2fd1cea125f..cf9fe636855 100644 --- a/src/core/AutomationPattern.cpp +++ b/src/core/AutomationPattern.cpp @@ -49,7 +49,9 @@ AutomationPattern::AutomationPattern( AutomationTrack * _auto_track ) : m_progressionType( DiscreteProgression ), m_dragging( false ), m_isRecording( false ), - m_lastRecordedValue( 0 ) + m_lastRecordedValue( 0 ), + m_color( 128, 128, 128 ), + m_useStyleColor( true ) { changeLength( MidiTime( 1, 0 ) ); if( getTrack() ) @@ -77,7 +79,9 @@ AutomationPattern::AutomationPattern( const AutomationPattern & _pat_to_copy ) : m_autoTrack( _pat_to_copy.m_autoTrack ), m_objects( _pat_to_copy.m_objects ), m_tension( _pat_to_copy.m_tension ), - m_progressionType( _pat_to_copy.m_progressionType ) + m_progressionType( _pat_to_copy.m_progressionType ), + m_color( 128, 128, 128 ), + m_useStyleColor( true ) { for( timeMap::const_iterator it = _pat_to_copy.m_timeMap.begin(); it != _pat_to_copy.m_timeMap.end(); ++it ) diff --git a/src/gui/AutomationPatternView.cpp b/src/gui/AutomationPatternView.cpp index 6daba567b0f..bedda5af2a8 100644 --- a/src/gui/AutomationPatternView.cpp +++ b/src/gui/AutomationPatternView.cpp @@ -53,6 +53,8 @@ AutomationPatternView::AutomationPatternView( AutomationPattern * _pattern, this, SLOT( update() ) ); connect( gui->automationEditor(), SIGNAL( currentPatternChanged() ), this, SLOT( update() ) ); + connect( m_pat, SIGNAL( trackColorChanged( QColor & ) ), + this, SLOT( trackColorChanged( QColor & ) ) ); setAttribute( Qt::WA_OpaquePaintEvent, true ); @@ -166,6 +168,38 @@ void AutomationPatternView::flipX() +void AutomationPatternView::setColor( QColor new_color ) +{ + if( new_color.rgb() != m_pat->color() ) + { + m_pat->setColor( new_color ); + m_pat->m_useStyleColor = false; + Engine::getSong()->setModified(); + update(); + } +} + +void AutomationPatternView::trackColorChanged( QColor & c ) +{ + if( isSelected() ) + { + QVector selected = + gui->songEditor()->m_editor->selectedObjects(); + for( QVector::iterator it = + selected.begin(); + it != selected.end(); ++it ) + { + AutomationPatternView * apcov = dynamic_cast( *it ); + if( apcov ) + { + apcov->setColor( c ); + } + } + } + else + { setColor(c); } +} + void AutomationPatternView::constructContextMenu( QMenu * _cm ) { @@ -261,8 +295,11 @@ void AutomationPatternView::paintEvent( QPaintEvent * ) bool current = gui->automationEditor()->currentPattern() == m_pat; // state: selected, muted, normal - c = isSelected() ? selectedColor() : ( muted ? mutedBackgroundColor() - : painter.background().color() ); + /*c = isSelected() ? selectedColor() : ( muted ? mutedBackgroundColor() + : painter.background().color() );*/ + c = isSelected() ? selectedColor() : ( muted ? mutedBackgroundColor() + : ( m_pat->m_useStyleColor ? painter.background().color() + : m_pat->colorObj() ) ); lingrad.setColorAt( 1, c.darker( 300 ) ); lingrad.setColorAt( 0, c ); From 34388c1d39cdd550eb0d458f1edc525371fb0449 Mon Sep 17 00:00:00 2001 From: adi Date: Sat, 11 Jul 2020 13:09:44 +0530 Subject: [PATCH 03/63] Allow saving & loading track colors --- src/core/AutomationPattern.cpp | 8 ++++++++ src/tracks/Pattern.cpp | 9 +++++++++ src/tracks/SampleTrack.cpp | 10 +++++++++- 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/core/AutomationPattern.cpp b/src/core/AutomationPattern.cpp index cf9fe636855..644ce9173be 100644 --- a/src/core/AutomationPattern.cpp +++ b/src/core/AutomationPattern.cpp @@ -542,6 +542,8 @@ void AutomationPattern::saveSettings( QDomDocument & _doc, QDomElement & _this ) _this.setAttribute( "prog", QString::number( progressionType() ) ); _this.setAttribute( "tens", QString::number( getTension() ) ); _this.setAttribute( "mute", QString::number( isMuted() ) ); + _this.setAttribute( "stylecolor", m_useStyleColor ); + _this.setAttribute( "color", m_color.rgb() ); for( timeMap::const_iterator it = m_timeMap.begin(); it != m_timeMap.end(); ++it ) @@ -597,6 +599,12 @@ void AutomationPattern::loadSettings( const QDomElement & _this ) m_idsToResolve << element.attribute( "id" ).toInt(); } } + + if( _this.hasAttribute( "stylecolor" ) ) + { + m_useStyleColor = _this.attribute( "stylecolor" ).toInt(); + m_color.setRgb( _this.attribute( "color" ).toUInt() ); + } int len = _this.attribute( "len" ).toInt(); if( len <= 0 ) diff --git a/src/tracks/Pattern.cpp b/src/tracks/Pattern.cpp index 5bc95c9d35a..7ee41e46086 100644 --- a/src/tracks/Pattern.cpp +++ b/src/tracks/Pattern.cpp @@ -364,6 +364,8 @@ void Pattern::saveSettings( QDomDocument & _doc, QDomElement & _this ) { _this.setAttribute( "type", m_patternType ); _this.setAttribute( "name", name() ); + _this.setAttribute( "stylecolor", m_useStyleColor ); + _this.setAttribute( "color", m_color.rgb() ); // as the target of copied/dragged pattern is always an existing // pattern, we must not store actual position, instead we store -1 // which tells loadSettings() not to mess around with position @@ -395,6 +397,13 @@ void Pattern::loadSettings( const QDomElement & _this ) m_patternType = static_cast( _this.attribute( "type" ).toInt() ); setName( _this.attribute( "name" ) ); + + if( _this.hasAttribute( "stylecolor" ) ) + { + m_useStyleColor = _this.attribute( "stylecolor" ).toInt(); + m_color.setRgb( _this.attribute( "color" ).toUInt() ); + } + if( _this.attribute( "pos" ).toInt() >= 0 ) { movePosition( _this.attribute( "pos" ).toInt() ); diff --git a/src/tracks/SampleTrack.cpp b/src/tracks/SampleTrack.cpp index fbfc4b377b7..17f8ecb5424 100644 --- a/src/tracks/SampleTrack.cpp +++ b/src/tracks/SampleTrack.cpp @@ -276,7 +276,9 @@ void SampleTCO::saveSettings( QDomDocument & _doc, QDomElement & _this ) _this.setAttribute( "data", m_sampleBuffer->toBase64( s ) ); } - _this.setAttribute ("sample_rate", m_sampleBuffer->sampleRate()); + _this.setAttribute( "sample_rate", m_sampleBuffer->sampleRate()); + _this.setAttribute( "stylecolor", m_useStyleColor ); + _this.setAttribute( "color", m_color.rgb() ); // TODO: start- and end-frame } @@ -301,6 +303,12 @@ void SampleTCO::loadSettings( const QDomElement & _this ) if (_this.hasAttribute("sample_rate")) { m_sampleBuffer->setSampleRate(_this.attribute("sample_rate").toInt()); } + + if( _this.hasAttribute( "stylecolor" ) ) + { + m_useStyleColor = _this.attribute( "stylecolor" ).toInt(); + m_color.setRgb( _this.attribute( "color" ).toUInt() ); + } } From 7efa117736938977afeb8d22f206b3a10f378d56 Mon Sep 17 00:00:00 2001 From: adi Date: Sun, 12 Jul 2020 13:27:30 +0530 Subject: [PATCH 04/63] Allow track color to be reset to default --- include/AutomationPatternView.h | 1 + include/Pattern.h | 1 + include/SampleTrack.h | 1 + include/Track.h | 4 ++++ src/core/Track.cpp | 19 ++++++++++++++++++- src/gui/AutomationPatternView.cpp | 12 ++++++++++++ src/tracks/BBTrack.cpp | 3 +++ src/tracks/Pattern.cpp | 12 ++++++++++++ src/tracks/SampleTrack.cpp | 13 +++++++++++++ 9 files changed, 65 insertions(+), 1 deletion(-) diff --git a/include/AutomationPatternView.h b/include/AutomationPatternView.h index 5a031421ece..73be77f4a08 100644 --- a/include/AutomationPatternView.h +++ b/include/AutomationPatternView.h @@ -63,6 +63,7 @@ protected slots: void flipX(); void trackColorChanged( QColor & ); + void trackColorReset(); protected: void constructContextMenu( QMenu * ) override; diff --git a/include/Pattern.h b/include/Pattern.h index 7497c5f33de..a9a218e6b2d 100644 --- a/include/Pattern.h +++ b/include/Pattern.h @@ -224,6 +224,7 @@ protected slots: void changeName(); void trackColorChanged( QColor & ); + void trackColorReset(); protected: diff --git a/include/SampleTrack.h b/include/SampleTrack.h index 91690a936b6..6f9c1cefd83 100644 --- a/include/SampleTrack.h +++ b/include/SampleTrack.h @@ -140,6 +140,7 @@ public slots: void updateSample(); void trackColorChanged( QColor & ); + void trackColorReset(); protected: void contextMenuEvent( QContextMenuEvent * _cme ) override; diff --git a/include/Track.h b/include/Track.h index e9d40d88007..7d93975932c 100644 --- a/include/Track.h +++ b/include/Track.h @@ -157,6 +157,7 @@ class LMMS_EXPORT TrackContentObject : public Model, public JournallingObject void setBGColor( QColor & c ); QColor BGColor(); + void resetColor(); public slots: void copy(); @@ -169,6 +170,7 @@ public slots: void positionChanged(); void destroyedTCO(); void trackColorChanged( QColor & ); + void trackColorReset(); private: @@ -485,6 +487,7 @@ private slots: signals: void trackRemovalScheduled( TrackView * t ); void colorChanged( QColor & c ); + void colorReset(); } ; @@ -630,6 +633,7 @@ public slots: void toggleSolo(); void trackColorChanged( QColor & c ); + void trackColorReset(); private: TrackContainer* m_trackContainer; diff --git a/src/core/Track.cpp b/src/core/Track.cpp index 193d6da3192..49dd488eec6 100644 --- a/src/core/Track.cpp +++ b/src/core/Track.cpp @@ -257,6 +257,11 @@ QColor TrackContentObject::BGColor() return m_bgcolor; } +void TrackContentObject::resetColor() +{ + emit trackColorReset(); +} + @@ -2044,7 +2049,7 @@ void TrackOperationsWidget::changeTrackColor() void TrackOperationsWidget::resetTrackColor() { m_backgroundColor = QPalette::Background; - emit colorChanged( m_backgroundColor ); + emit colorReset(); } @@ -2709,6 +2714,14 @@ void Track::trackColorChanged( QColor & c ) } } +void Track::trackColorReset() +{ + for (int i = 0; i < numOfTCOs(); i++) + { + m_trackContentObjects[i]->resetColor(); + } +} + BoolModel *Track::getMutedModel() { @@ -2781,6 +2794,10 @@ TrackView::TrackView( Track * track, TrackContainerView * tcv ) : connect( &m_trackOperationsWidget, SIGNAL( colorChanged( QColor & ) ), m_track, SLOT( trackColorChanged( QColor & ) ) ); + + connect( &m_trackOperationsWidget, SIGNAL( colorReset() ), + m_track, SLOT( trackColorReset() ) ); + // create views for already existing TCOs for( Track::tcoVector::iterator it = m_track->m_trackContentObjects.begin(); diff --git a/src/gui/AutomationPatternView.cpp b/src/gui/AutomationPatternView.cpp index bedda5af2a8..c3c9e7f0d05 100644 --- a/src/gui/AutomationPatternView.cpp +++ b/src/gui/AutomationPatternView.cpp @@ -55,6 +55,8 @@ AutomationPatternView::AutomationPatternView( AutomationPattern * _pattern, this, SLOT( update() ) ); connect( m_pat, SIGNAL( trackColorChanged( QColor & ) ), this, SLOT( trackColorChanged( QColor & ) ) ); + connect( m_pat, SIGNAL( trackColorReset() ), + this, SLOT( trackColorReset() ) ); setAttribute( Qt::WA_OpaquePaintEvent, true ); @@ -179,6 +181,16 @@ void AutomationPatternView::setColor( QColor new_color ) } } +void AutomationPatternView::trackColorReset() +{ + if( ! m_pat->m_useStyleColor ) + { + m_pat->m_useStyleColor = true; + Engine::getSong()->setModified(); + update(); + } +} + void AutomationPatternView::trackColorChanged( QColor & c ) { if( isSelected() ) diff --git a/src/tracks/BBTrack.cpp b/src/tracks/BBTrack.cpp index 7686a796225..c56f3072439 100644 --- a/src/tracks/BBTrack.cpp +++ b/src/tracks/BBTrack.cpp @@ -155,8 +155,11 @@ BBTCOView::BBTCOView( TrackContentObject * _tco, TrackView * _tv ) : { connect( _tco->getTrack(), SIGNAL( dataChanged() ), this, SLOT( update() ) ); + connect( _tco, SIGNAL( trackColorChanged( QColor & ) ), this, SLOT( trackColorChanged( QColor & ) ) ); + connect( _tco, SIGNAL( trackColorReset() ), + this, SLOT( resetColor() ) ); setStyle( QApplication::style() ); } diff --git a/src/tracks/Pattern.cpp b/src/tracks/Pattern.cpp index 7ee41e46086..d5c9e36aab3 100644 --- a/src/tracks/Pattern.cpp +++ b/src/tracks/Pattern.cpp @@ -602,6 +602,8 @@ PatternView::PatternView( Pattern* pattern, TrackView* parent ) : this, SLOT( update() ) ); connect( m_pat, SIGNAL( trackColorChanged( QColor & ) ), this, SLOT( trackColorChanged( QColor & ) ) ); + connect( m_pat, SIGNAL( trackColorReset() ), + this, SLOT( trackColorReset() ) ); if( s_stepBtnOn0 == NULL ) { @@ -692,6 +694,16 @@ void PatternView::setColor( QColor new_color ) } } +void PatternView::trackColorReset() +{ + if( ! m_pat->m_useStyleColor ) + { + m_pat->m_useStyleColor = true; + Engine::getSong()->setModified(); + update(); + } +} + void PatternView::trackColorChanged( QColor & c ) { if( isSelected() ) diff --git a/src/tracks/SampleTrack.cpp b/src/tracks/SampleTrack.cpp index 17f8ecb5424..28007a2bfb4 100644 --- a/src/tracks/SampleTrack.cpp +++ b/src/tracks/SampleTrack.cpp @@ -336,6 +336,9 @@ SampleTCOView::SampleTCOView( SampleTCO * _tco, TrackView * _tv ) : connect( m_tco, SIGNAL( trackColorChanged( QColor & ) ), this, SLOT( trackColorChanged( QColor & ) ) ); + + connect( m_tco, SIGNAL( trackColorReset() ), + this, SLOT( trackColorReset() ) ); setStyle( QApplication::style() ); } @@ -605,6 +608,16 @@ void SampleTCOView::setColor( QColor new_color ) } } +void SampleTCOView::trackColorReset() +{ + if( ! m_tco->m_useStyleColor ) + { + m_tco->m_useStyleColor = true; + Engine::getSong()->setModified(); + update(); + } +} + void SampleTCOView::trackColorChanged( QColor & c ) { if( isSelected() ) From c6e8368d516d0c33d67a2ff73c124140c13a4aea Mon Sep 17 00:00:00 2001 From: adi Date: Mon, 13 Jul 2020 12:44:39 +0530 Subject: [PATCH 05/63] Partially migrate common settings to Track.cpp, fix bug --- include/Pattern.h | 25 +------------------------ include/Track.h | 32 ++++++++++++++++++++++++++++++++ src/core/Track.cpp | 10 +++++++++- src/tracks/Pattern.cpp | 37 ++++++++++++++++++------------------- 4 files changed, 60 insertions(+), 44 deletions(-) diff --git a/include/Pattern.h b/include/Pattern.h index a9a218e6b2d..f72b833342b 100644 --- a/include/Pattern.h +++ b/include/Pattern.h @@ -100,26 +100,6 @@ class LMMS_EXPORT Pattern : public TrackContentObject { return "pattern"; } - - unsigned int color() const - { - return( m_color.rgb() ); - } - - QColor colorObj() const - { - return m_color; - } - - void setColor( const QColor & c ) - { - m_color = QColor( c ); - } - - void setUseStyleColor( bool b ) - { - m_useStyleColor = b; - } inline InstrumentTrack * instrumentTrack() const { @@ -167,9 +147,6 @@ protected slots: Pattern * adjacentPatternByOffset(int offset) const; - QColor m_color; - bool m_useStyleColor; - friend class PatternView; friend class BBTrackContainerView; @@ -208,7 +185,7 @@ class PatternView : public TrackContentObjectView QColor color() const { - return( m_pat->m_color ); + return( m_pat->color() ); } void setColor( QColor _new_color ); diff --git a/include/Track.h b/include/Track.h index 7d93975932c..b69e92aa336 100644 --- a/include/Track.h +++ b/include/Track.h @@ -133,6 +133,36 @@ class LMMS_EXPORT TrackContentObject : public Model, public JournallingObject { return m_autoResize; } + + unsigned int color() const + { + return( m_color.rgb() ); + } + + QColor colorObj() const + { + return m_color; + } + + void setColor( const QColor & c ) + { + m_color = QColor( c ); + } + + void setColorRgb( const unsigned int & c ) + { + m_color.setRgb( c ); + } + + void setUseStyleColor( bool b ) + { + m_useStyleColor = b; + } + + bool useStyleColor() + { + return m_useStyleColor; + } virtual void movePosition( const MidiTime & pos ); virtual void changeLength( const MidiTime & length ); @@ -195,6 +225,8 @@ public slots: bool m_selectViewOnCreate; QColor m_bgcolor; + QColor m_color; + bool m_useStyleColor; friend class TrackContentObjectView; diff --git a/src/core/Track.cpp b/src/core/Track.cpp index 49dd488eec6..2fca31322ac 100644 --- a/src/core/Track.cpp +++ b/src/core/Track.cpp @@ -103,7 +103,9 @@ TrackContentObject::TrackContentObject( Track * track ) : m_startPosition(), m_length(), m_mutedModel( false, this, tr( "Mute" ) ), - m_selectViewOnCreate( false ) + m_selectViewOnCreate( false ), + m_color( 128, 128, 128 ), + m_useStyleColor( false ) { if( getTrack() ) { @@ -2406,6 +2408,12 @@ void Track::loadSettings( const QDomElement & element ) */ TrackContentObject * Track::addTCO( TrackContentObject * tco ) { + if ( m_trackContentObjects.size() >= 1 ) + { + tco->setColor( m_trackContentObjects[0]->colorObj() ); + tco->setUseStyleColor( m_trackContentObjects[0]->useStyleColor() ); + } + m_trackContentObjects.push_back( tco ); emit trackContentObjectAdded( tco ); diff --git a/src/tracks/Pattern.cpp b/src/tracks/Pattern.cpp index d5c9e36aab3..10bb1786019 100644 --- a/src/tracks/Pattern.cpp +++ b/src/tracks/Pattern.cpp @@ -57,9 +57,7 @@ Pattern::Pattern( InstrumentTrack * _instrument_track ) : TrackContentObject( _instrument_track ), m_instrumentTrack( _instrument_track ), m_patternType( BeatPattern ), - m_steps( MidiTime::stepsPerBar() ), - m_color( 128, 128, 128 ), - m_useStyleColor( true ) + m_steps( MidiTime::stepsPerBar() ) { setName( _instrument_track->name() ); if( _instrument_track->trackContainer() @@ -78,9 +76,7 @@ Pattern::Pattern( const Pattern& other ) : TrackContentObject( other.m_instrumentTrack ), m_instrumentTrack( other.m_instrumentTrack ), m_patternType( other.m_patternType ), - m_steps( other.m_steps ), - m_color( 128, 128, 128 ), - m_useStyleColor( true ) + m_steps( other.m_steps ) { for( NoteVector::ConstIterator it = other.m_notes.begin(); it != other.m_notes.end(); ++it ) { @@ -364,8 +360,8 @@ void Pattern::saveSettings( QDomDocument & _doc, QDomElement & _this ) { _this.setAttribute( "type", m_patternType ); _this.setAttribute( "name", name() ); - _this.setAttribute( "stylecolor", m_useStyleColor ); - _this.setAttribute( "color", m_color.rgb() ); + _this.setAttribute( "stylecolor", useStyleColor() ); + _this.setAttribute( "color", color() ); // as the target of copied/dragged pattern is always an existing // pattern, we must not store actual position, instead we store -1 // which tells loadSettings() not to mess around with position @@ -400,8 +396,8 @@ void Pattern::loadSettings( const QDomElement & _this ) if( _this.hasAttribute( "stylecolor" ) ) { - m_useStyleColor = _this.attribute( "stylecolor" ).toInt(); - m_color.setRgb( _this.attribute( "color" ).toUInt() ); + setUseStyleColor( _this.attribute( "stylecolor" ).toInt() ); + setColorRgb( _this.attribute( "color" ).toUInt() ); } if( _this.attribute( "pos" ).toInt() >= 0 ) @@ -688,7 +684,7 @@ void PatternView::setColor( QColor new_color ) if( new_color.rgb() != m_pat->color() ) { m_pat->setColor( new_color ); - m_pat->m_useStyleColor = false; + m_pat->setUseStyleColor( false ); Engine::getSong()->setModified(); update(); } @@ -696,9 +692,9 @@ void PatternView::setColor( QColor new_color ) void PatternView::trackColorReset() { - if( ! m_pat->m_useStyleColor ) + if( ! m_pat->useStyleColor() ) { - m_pat->m_useStyleColor = true; + m_pat->setUseStyleColor( true ); Engine::getSong()->setModified(); update(); } @@ -922,12 +918,15 @@ void PatternView::paintEvent( QPaintEvent * ) bool beatPattern = m_pat->m_patternType == Pattern::BeatPattern; // state: selected, normal, beat pattern, muted - /*QColor c = isSelected() ? selectedColor() : ( ( !muted && !beatPattern ) - ? painter.background().color() : ( beatPattern - ? BBPatternBackground() : mutedBackgroundColor() ) );*/ - QColor c = isSelected() ? selectedColor() : ( muted ? mutedBackgroundColor() - : ( m_pat->m_useStyleColor ? painter.background().color() - : m_pat->colorObj() ) ); + /*QColor c = isSelected() ? selectedColor() : ( ( !muted && !m_pat->useStyleColor() ) + ? painter.background().color() : ( m_pat->useStyleColor() + ? m_pat->colorObj() : mutedBackgroundColor() ) );*/ + /*QColor c = isSelected() ? selectedColor() : ( muted ? mutedBackgroundColor() + : ( m_pat->useStyleColor() ? painter.background().color() + : m_pat->colorObj() ) );*/ + QColor c = isSelected() ? selectedColor() : ( muted + ? mutedBackgroundColor() : ( m_pat->useStyleColor() + ? m_pat->colorObj() : painter.background().color() ) ); // invert the gradient for the background in the B&B editor QLinearGradient lingrad( 0, 0, 0, height() ); From b9a5fd8bdf3fee16aab112804ea0eff33dca5c83 Mon Sep 17 00:00:00 2001 From: adi Date: Tue, 14 Jul 2020 12:07:26 +0530 Subject: [PATCH 06/63] Completely migrate local TCO color functions to TCO class, fix bug --- include/AutomationPattern.h | 23 ---------- include/AutomationPatternView.h | 2 +- include/BBTrack.h | 24 +---------- include/SampleTrack.h | 25 +---------- src/core/AutomationPattern.cpp | 16 +++---- src/core/Track.cpp | 5 +-- src/gui/AutomationPatternView.cpp | 10 ++--- src/tracks/BBTrack.cpp | 70 +++++++++++++++---------------- src/tracks/Pattern.cpp | 5 ++- src/tracks/SampleTrack.cpp | 26 ++++++------ 10 files changed, 66 insertions(+), 140 deletions(-) diff --git a/include/AutomationPattern.h b/include/AutomationPattern.h index d25908c2824..312cec7c007 100644 --- a/include/AutomationPattern.h +++ b/include/AutomationPattern.h @@ -93,26 +93,6 @@ class LMMS_EXPORT AutomationPattern : public TrackContentObject void applyDragValue(); - unsigned int color() const - { - return( m_color.rgb() ); - } - - QColor colorObj() const - { - return m_color; - } - - void setColor( const QColor & c ) - { - m_color = QColor( c ); - } - - void setUseStyleColor( bool b ) - { - m_useStyleColor = b; - } - bool isDragging() const { return m_dragging; @@ -211,9 +191,6 @@ public slots: static const float DEFAULT_MIN_VALUE; static const float DEFAULT_MAX_VALUE; - - QColor m_color; - bool m_useStyleColor; friend class AutomationPatternView; diff --git a/include/AutomationPatternView.h b/include/AutomationPatternView.h index 73be77f4a08..a9ba5e29c32 100644 --- a/include/AutomationPatternView.h +++ b/include/AutomationPatternView.h @@ -44,7 +44,7 @@ class AutomationPatternView : public TrackContentObjectView QColor color() const { - return( m_pat->m_color ); + return( m_pat->colorObj() ); } void setColor( QColor _new_color ); diff --git a/include/BBTrack.h b/include/BBTrack.h index 531dedcb172..ce781f98d47 100644 --- a/include/BBTrack.h +++ b/include/BBTrack.h @@ -50,33 +50,11 @@ class BBTCO : public TrackContentObject return( "bbtco" ); } - unsigned int color() const - { - return( m_color.rgb() ); - } - - QColor colorObj() const - { - return m_color; - } - - void setColor( const QColor & c ) - { - m_color = QColor( c ); - } - - void setUseStyleColor( bool b ) - { - m_useStyleColor = b; - } - int bbTrackIndex(); TrackContentObjectView * createView( TrackView * _tv ) override; private: - QColor m_color; - bool m_useStyleColor; friend class BBTCOView; @@ -94,7 +72,7 @@ class BBTCOView : public TrackContentObjectView QColor color() const { - return( m_bbTCO->m_color ); + return( m_bbTCO->colorObj() ); } void setColor( QColor _new_color ); diff --git a/include/SampleTrack.h b/include/SampleTrack.h index 6f9c1cefd83..eb9eb0edb2c 100644 --- a/include/SampleTrack.h +++ b/include/SampleTrack.h @@ -64,26 +64,6 @@ class SampleTCO : public TrackContentObject { return m_sampleBuffer; } - - unsigned int color() const - { - return( m_color.rgb() ); - } - - QColor colorObj() const - { - return m_color; - } - - void setColor( const QColor & c ) - { - m_color = QColor( c ); - } - - void setUseStyleColor( bool b ) - { - m_useStyleColor = b; - } MidiTime sampleLength() const; @@ -108,9 +88,6 @@ public slots: SampleBuffer* m_sampleBuffer; BoolModel m_recordModel; bool m_isPlaying; - - bool m_useStyleColor; - QColor m_color; friend class SampleTCOView; @@ -132,7 +109,7 @@ class SampleTCOView : public TrackContentObjectView QColor color() const { - return( m_tco->m_color ); + return( m_tco->colorObj() ); } void setColor( QColor _new_color ); diff --git a/src/core/AutomationPattern.cpp b/src/core/AutomationPattern.cpp index 644ce9173be..d5d8f03e972 100644 --- a/src/core/AutomationPattern.cpp +++ b/src/core/AutomationPattern.cpp @@ -49,9 +49,7 @@ AutomationPattern::AutomationPattern( AutomationTrack * _auto_track ) : m_progressionType( DiscreteProgression ), m_dragging( false ), m_isRecording( false ), - m_lastRecordedValue( 0 ), - m_color( 128, 128, 128 ), - m_useStyleColor( true ) + m_lastRecordedValue( 0 ) { changeLength( MidiTime( 1, 0 ) ); if( getTrack() ) @@ -79,9 +77,7 @@ AutomationPattern::AutomationPattern( const AutomationPattern & _pat_to_copy ) : m_autoTrack( _pat_to_copy.m_autoTrack ), m_objects( _pat_to_copy.m_objects ), m_tension( _pat_to_copy.m_tension ), - m_progressionType( _pat_to_copy.m_progressionType ), - m_color( 128, 128, 128 ), - m_useStyleColor( true ) + m_progressionType( _pat_to_copy.m_progressionType ) { for( timeMap::const_iterator it = _pat_to_copy.m_timeMap.begin(); it != _pat_to_copy.m_timeMap.end(); ++it ) @@ -542,8 +538,8 @@ void AutomationPattern::saveSettings( QDomDocument & _doc, QDomElement & _this ) _this.setAttribute( "prog", QString::number( progressionType() ) ); _this.setAttribute( "tens", QString::number( getTension() ) ); _this.setAttribute( "mute", QString::number( isMuted() ) ); - _this.setAttribute( "stylecolor", m_useStyleColor ); - _this.setAttribute( "color", m_color.rgb() ); + _this.setAttribute( "stylecolor", useStyleColor() ); + _this.setAttribute( "color", color() ); for( timeMap::const_iterator it = m_timeMap.begin(); it != m_timeMap.end(); ++it ) @@ -602,8 +598,8 @@ void AutomationPattern::loadSettings( const QDomElement & _this ) if( _this.hasAttribute( "stylecolor" ) ) { - m_useStyleColor = _this.attribute( "stylecolor" ).toInt(); - m_color.setRgb( _this.attribute( "color" ).toUInt() ); + setUseStyleColor( _this.attribute( "stylecolor" ).toInt() ); + setColor( _this.attribute( "color" ).toUInt() ); } int len = _this.attribute( "len" ).toInt(); diff --git a/src/core/Track.cpp b/src/core/Track.cpp index c8e71c7fe68..cde28c2e7da 100644 --- a/src/core/Track.cpp +++ b/src/core/Track.cpp @@ -106,7 +106,7 @@ TrackContentObject::TrackContentObject( Track * track ) : m_mutedModel( false, this, tr( "Mute" ) ), m_selectViewOnCreate( false ), m_color( 128, 128, 128 ), - m_useStyleColor( false ) + m_useStyleColor( true ) { if( getTrack() ) { @@ -2041,7 +2041,7 @@ QColor TrackOperationsWidget::backgroundColor() void TrackOperationsWidget::changeTrackColor() { - QColor new_color = QColorDialog::getColor( QPalette::Background ); + QColor new_color = QColorDialog::getColor( m_backgroundColor ); if( ! new_color.isValid() ) { return; } @@ -2051,7 +2051,6 @@ void TrackOperationsWidget::changeTrackColor() void TrackOperationsWidget::resetTrackColor() { - m_backgroundColor = QPalette::Background; emit colorReset(); } diff --git a/src/gui/AutomationPatternView.cpp b/src/gui/AutomationPatternView.cpp index c3c9e7f0d05..60bad4b7070 100644 --- a/src/gui/AutomationPatternView.cpp +++ b/src/gui/AutomationPatternView.cpp @@ -175,7 +175,7 @@ void AutomationPatternView::setColor( QColor new_color ) if( new_color.rgb() != m_pat->color() ) { m_pat->setColor( new_color ); - m_pat->m_useStyleColor = false; + m_pat->setUseStyleColor( false ); Engine::getSong()->setModified(); update(); } @@ -183,9 +183,9 @@ void AutomationPatternView::setColor( QColor new_color ) void AutomationPatternView::trackColorReset() { - if( ! m_pat->m_useStyleColor ) + if( ! m_pat->useStyleColor() ) { - m_pat->m_useStyleColor = true; + m_pat->setUseStyleColor( true ); Engine::getSong()->setModified(); update(); } @@ -310,8 +310,8 @@ void AutomationPatternView::paintEvent( QPaintEvent * ) /*c = isSelected() ? selectedColor() : ( muted ? mutedBackgroundColor() : painter.background().color() );*/ c = isSelected() ? selectedColor() : ( muted ? mutedBackgroundColor() - : ( m_pat->m_useStyleColor ? painter.background().color() - : m_pat->colorObj() ) ); + : ( ! m_pat->useStyleColor() ? m_pat->colorObj() + : painter.background().color() ) ); lingrad.setColorAt( 1, c.darker( 300 ) ); lingrad.setColorAt( 0, c ); diff --git a/src/tracks/BBTrack.cpp b/src/tracks/BBTrack.cpp index c56f3072439..076ee0d09b6 100644 --- a/src/tracks/BBTrack.cpp +++ b/src/tracks/BBTrack.cpp @@ -47,9 +47,7 @@ BBTrack::infoMap BBTrack::s_infoMap; BBTCO::BBTCO( Track * _track ) : - TrackContentObject( _track ), - m_color( 128, 128, 128 ), - m_useStyleColor( true ) + TrackContentObject( _track ) { bar_t t = Engine::getBBTrackContainer()->lengthOfBB( bbTrackIndex() ); if( t > 0 ) @@ -75,15 +73,7 @@ void BBTCO::saveSettings( QDomDocument & doc, QDomElement & element ) element.setAttribute( "len", length() ); element.setAttribute( "muted", isMuted() ); element.setAttribute( "color", color() ); - - if( m_useStyleColor ) - { - element.setAttribute( "usestyle", 1 ); - } - else - { - element.setAttribute( "usestyle", 0 ); - } + element.setAttribute( "stylecolor", useStyleColor() ); } @@ -101,32 +91,42 @@ void BBTCO::loadSettings( const QDomElement & element ) { toggleMute(); } - - if( element.hasAttribute( "color" ) ) + + // for files saved in 1.3-onwards + if( element.hasAttribute( "stylecolor" ) ) { - setColor( QColor( element.attribute( "color" ).toUInt() ) ); + setUseStyleColor( element.attribute( "stylecolor" ).toUInt() ); + setColor( element.attribute( "color" ) ); } - if( element.hasAttribute( "usestyle" ) ) + // for files saved before 1.3 + else { - if( element.attribute( "usestyle" ).toUInt() == 1 ) + if( element.hasAttribute( "color" ) ) { - m_useStyleColor = true; + setColor( QColor( element.attribute( "color" ).toUInt() ) ); } - else + if( element.hasAttribute( "usestyle" ) ) { - m_useStyleColor = false; - } - } - else - { - if( m_color.rgb() == qRgb( 128, 182, 175 ) || m_color.rgb() == qRgb( 64, 128, 255 ) ) // old or older default color - { - m_useStyleColor = true; + if( element.attribute( "usestyle" ).toUInt() == 1 ) + { + setUseStyleColor( true ); + } + else + { + setUseStyleColor( false ); + } } else { - m_useStyleColor = false; + if( color() == qRgb( 128, 182, 175 ) || color() == qRgb( 64, 128, 255 ) ) // old or older default color + { + setUseStyleColor( true ); + } + else + { + setUseStyleColor( false ); + } } } } @@ -221,7 +221,7 @@ void BBTCOView::paintEvent( QPaintEvent * ) // state: selected, muted, default, user selected c = isSelected() ? selectedColor() : ( muted ? mutedBackgroundColor() - : ( m_bbTCO->m_useStyleColor ? painter.background().color() + : ( m_bbTCO->useStyleColor() ? painter.background().color() : m_bbTCO->colorObj() ) ); lingrad.setColorAt( 0, c.lighter( 130 ) ); @@ -317,7 +317,7 @@ void BBTCOView::changeName() void BBTCOView::changeColor() { - QColor new_color = QColorDialog::getColor( m_bbTCO->m_color ); + QColor new_color = QColorDialog::getColor( m_bbTCO->colorObj() ); if( ! new_color.isValid() ) { return; @@ -347,13 +347,13 @@ void BBTCOView::changeColor() /** \brief Makes the BB pattern use the colour defined in the stylesheet */ void BBTCOView::resetColor() { - if( ! m_bbTCO->m_useStyleColor ) + if( ! m_bbTCO->useStyleColor() ) { - m_bbTCO->m_useStyleColor = true; + m_bbTCO->setUseStyleColor( true ); Engine::getSong()->setModified(); update(); } - BBTrack::clearLastTCOColor(); + //BBTrack::clearLastTCOColor(); } @@ -363,11 +363,11 @@ void BBTCOView::setColor( QColor new_color ) if( new_color.rgb() != m_bbTCO->color() ) { m_bbTCO->setColor( new_color ); - m_bbTCO->m_useStyleColor = false; + m_bbTCO->setUseStyleColor( false ); Engine::getSong()->setModified(); update(); } - BBTrack::setLastTCOColor( new_color ); + //BBTrack::setLastTCOColor( new_color ); } diff --git a/src/tracks/Pattern.cpp b/src/tracks/Pattern.cpp index 10bb1786019..dd1495d29ac 100644 --- a/src/tracks/Pattern.cpp +++ b/src/tracks/Pattern.cpp @@ -925,8 +925,9 @@ void PatternView::paintEvent( QPaintEvent * ) : ( m_pat->useStyleColor() ? painter.background().color() : m_pat->colorObj() ) );*/ QColor c = isSelected() ? selectedColor() : ( muted - ? mutedBackgroundColor() : ( m_pat->useStyleColor() - ? m_pat->colorObj() : painter.background().color() ) ); + ? mutedBackgroundColor() : ( m_pat->empty() + ? QColor ( 48, 48, 48 ) : ( ! m_pat->useStyleColor() + ? m_pat->colorObj() : painter.background().color() ) ) ); // invert the gradient for the background in the B&B editor QLinearGradient lingrad( 0, 0, 0, height() ); diff --git a/src/tracks/SampleTrack.cpp b/src/tracks/SampleTrack.cpp index 28007a2bfb4..116dc5fdb5e 100644 --- a/src/tracks/SampleTrack.cpp +++ b/src/tracks/SampleTrack.cpp @@ -56,9 +56,7 @@ SampleTCO::SampleTCO( Track * _track ) : TrackContentObject( _track ), m_sampleBuffer( new SampleBuffer ), - m_isPlaying( false ), - m_useStyleColor( true ), - m_color( 128, 128, 128 ) + m_isPlaying( false ) { saveJournallingState( false ); setSampleFile( "" ); @@ -277,8 +275,8 @@ void SampleTCO::saveSettings( QDomDocument & _doc, QDomElement & _this ) } _this.setAttribute( "sample_rate", m_sampleBuffer->sampleRate()); - _this.setAttribute( "stylecolor", m_useStyleColor ); - _this.setAttribute( "color", m_color.rgb() ); + _this.setAttribute( "stylecolor", useStyleColor() ); + _this.setAttribute( "color", color() ); // TODO: start- and end-frame } @@ -306,8 +304,8 @@ void SampleTCO::loadSettings( const QDomElement & _this ) if( _this.hasAttribute( "stylecolor" ) ) { - m_useStyleColor = _this.attribute( "stylecolor" ).toInt(); - m_color.setRgb( _this.attribute( "color" ).toUInt() ); + setUseStyleColor( _this.attribute( "stylecolor" ).toInt() ); + setColor( _this.attribute( "color" ).toUInt() ); } } @@ -517,8 +515,8 @@ void SampleTCOView::paintEvent( QPaintEvent * pe ) // state: selected, muted, normal c = isSelected() ? selectedColor() : ( muted ? mutedBackgroundColor() - : ( m_tco->m_useStyleColor ? painter.background().color() - : m_tco->colorObj() ) ); + : ( ! m_tco->useStyleColor() ? m_tco->colorObj() + : painter.background().color() ) ); lingrad.setColorAt( 1, c.darker( 300 ) ); lingrad.setColorAt( 0, c ); @@ -560,12 +558,12 @@ void SampleTCOView::paintEvent( QPaintEvent * pe ) p.setRenderHint( QPainter::Antialiasing, false ); // inner border - p.setPen( c.lighter( 160 ) ); + p.setPen( c.lighter( 135 ) ); p.drawRect( 1, 1, rect().right() - TCO_BORDER_WIDTH, rect().bottom() - TCO_BORDER_WIDTH ); // outer border - p.setPen( c.darker( 300 ) ); + p.setPen( c.darker( 200 ) ); p.drawRect( 0, 0, rect().right(), rect().bottom() ); // draw the 'muted' pixmap only if the pattern was manualy muted @@ -602,7 +600,7 @@ void SampleTCOView::setColor( QColor new_color ) if( new_color.rgb() != m_tco->color() ) { m_tco->setColor( new_color ); - m_tco->m_useStyleColor = false; + m_tco->setUseStyleColor( false ); Engine::getSong()->setModified(); update(); } @@ -610,9 +608,9 @@ void SampleTCOView::setColor( QColor new_color ) void SampleTCOView::trackColorReset() { - if( ! m_tco->m_useStyleColor ) + if( ! m_tco->useStyleColor() ) { - m_tco->m_useStyleColor = true; + m_tco->setUseStyleColor( true ); Engine::getSong()->setModified(); update(); } From 9846089bef58722bf9ab1b1aea578a65edf9e63e Mon Sep 17 00:00:00 2001 From: adi Date: Tue, 14 Jul 2020 15:11:59 +0530 Subject: [PATCH 07/63] Set QColorDialog colors to better colors --- src/core/Track.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/core/Track.cpp b/src/core/Track.cpp index cde28c2e7da..b2aed7c5baa 100644 --- a/src/core/Track.cpp +++ b/src/core/Track.cpp @@ -2041,7 +2041,19 @@ QColor TrackOperationsWidget::backgroundColor() void TrackOperationsWidget::changeTrackColor() { - QColor new_color = QColorDialog::getColor( m_backgroundColor ); + QColorDialog colorDialog( m_backgroundColor ); + QColor buffer( 0, 0, 0 ); + + for( int i = 0; i < 48; i += 6 ) + { + for( int j = 0; j < 6; j++ ) { + buffer.setHsl( qMax( 0, 44 * ( i / 6 ) - 1 ), 150 - 20 * j, 150 - 10 * j ); + colorDialog.setStandardColor( i + j, buffer ); + } + + } + + QColor new_color = colorDialog.getColor( m_backgroundColor ); if( ! new_color.isValid() ) { return; } From 006a5411087795ff733478b6d387471255eb061f Mon Sep 17 00:00:00 2001 From: adi Date: Wed, 15 Jul 2020 15:17:20 +0530 Subject: [PATCH 08/63] Color the side of the track according to TCO colors --- ...- Krem Kaakkuja (Second Flight Remix).mmpz | Bin 46081 -> 47511 bytes include/Track.h | 35 +++++- src/core/Track.cpp | 111 ++++++++++++++++-- 3 files changed, 133 insertions(+), 13 deletions(-) diff --git a/data/projects/demos/Greippi - Krem Kaakkuja (Second Flight Remix).mmpz b/data/projects/demos/Greippi - Krem Kaakkuja (Second Flight Remix).mmpz index 9ea29b34d3f1aaaf6fe86afe1e0bf10a162abe9a..143b4ab363faa3e8c7f758c2662083adbf5b3f47 100644 GIT binary patch literal 47511 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�VUSt~BROzy>Kt&nMA|Nih+7Kzl zsTVlDAqs9h(tdM8Em9AaDl}hN%gN&+ojPSbefaF@GjQZYk4C#1ZulvCNb)-aTc~`q z6Uj^KR{M@)Vz+yX4@u?2%BmQe&Wn;grOGa?Cpq7PIdM~bU~b3p+U{q-#`aI=>iGw+ zks;6hL^4)l8XI`)&r~Tt@quB_46` zDE!nb55XohZ(RURoAvP8FR@0LS5xK{hpiB#(L$>cp;Tp#-+ZV!c^m=91-1Ky-GuEzkUg7NEI=X(G{4!<-2t5J1 znT*g0hyvRB7y?%rB9v1F%%3f)TQu&#jkDO#6YaVg0u|&*m0>;_bW1SmKUoZ9Bb?*$L;%nsmMjitIKwi6&|=mCd>nueRFDg;PUlX z%mWu5xbWTNkMJ|&PSiiWpSd!jgKupI4&t)xSnuURo*lb5VeTRBoA&=Cnb_9@|dWd!tPw#dI!=yCw@^4;y&yL~)(;lay(Ikr4_ z`T8s7!3z&wc<{34!3$5!`R=jHo*i{?M?b|G1+U-{^B?Z!@0|=k9Y0XNON8+Z|E~oS`RV!Dy$ec{q1KVQkjm`s;k&R!BB6NKFiIO z(~K6r^UE<3RxEM8vSuNEXehDLhUtg)+ou{@^$JeD&#aMGm+)Q2Mo8hr(z#n2 zd+oxCA?l7t?HAqhv{tmLB9;_YA}OjWCIli%av%bhoHj^uOdK-r`K}RuY&-C%II>ch zLEk2kMof&cD!NFDD>jWNzEdpmouY{E6FrBl4g#_s0a$v~?dpD~ zZJh)}4<~;5U;>1=IYv3pC5j6n*pEPt-BIxD#6Y+Dj6L!|L@E_Bv&vFR6htEzDt{H- zGXDC8!m{h}ae5L2AGER>G{R8KBOkO(WF(1V7SJ&ee9&r+fnjGOah<&;5Cmq1{Cjv*Hbp zV&lD7gBF)w_CdQ5V6EK575Ap7Ln}C=wd;sT0B>MFE*MPx&_7_taDD{^TnA9I=fD zSf;Xc_q`XNJciWUSZm)~1S|pa6E7h4+~hMYApYd!Gp!*0?BxAcFg-ol zDiJ<64g6fp&%6TJdsBVA6~O&i0b#89iD>ZNhlp4uKn2S8Jw${wm^KdB72@exBFuD_ zDCRNoN8m?_dwcZ6j}*V=TKSP8KT_mJiu_3NQynRa2&=M~DS`DPjufGiF~gUiDDDy0 zfAonWjVz!_qz^bz6h(qnkmV?xpD0dF6lEE)+s7Yro+!#hlrxcypC^7#Eyd3h`FSEg zPn>DO&l7|Bz598hq)Mre<6<^f_h1iPQBogf?d1YgfKs1A?BxQWu}7c{F3!!3bSbAcj4AN;D7`M zM;tKbhy$|sQ&t^v%pP&@gDZY;#SgCd!PU2`8CZYq0R6|&}R6P(PsEl;AZ$!;b!=wzir5X5Nw7)uUP(O1E`zf z5Q^%CNW@BJB(4mN<5T{*8j9`D)eu)hTn)X48j?xeMmtwSvHiIk;%bPiq4!Wj@z?LT z8j9`D)eu)hTn)X48iEKZF^AsorH8m8;EI4Ng1uA(q7s+C!yS^?{#*}nJ;e3UyXYaJ zs5=adxFX?-ge#ISsYn!0Hn>B>^$^!XTn~Mm9#Yk~YXw{n#rEfVi0h%u7+kl|-tJ`Z z0C6GYLinYHkUIlu6p;v+Y;r}!6%kiNALb3jmwe?y$c2y#;g*Dudjn|{5rJ{{^|>PA ziYTr>S47+J1~#vEaIW|MR=l^3BXzqK1rb@6*RR{He$i?NqfW0u5w8HHFhw7)dJs1M z9Jk|hyz0T1Tr017z^fi)sCocqsvayD+mv_GV_#328iu6?HG9r+;4?5IIp;I5Up%Y1 zSY2>FcG;-AL^kTKYy=&_ji8I6!?#v<9J+gJb(g?Kgp;I=CQradm?!E+n3u(@lVAN{ znG&<}%teli92dFw5;;sjH1mUt92Yq*a_=Q_tXe%6IWBTsTHsn`#@hnXda-Wra7I{LXdVeD}pkZr{0mpHr3IBb{7Ta#hJyWlVRjD!Hm$UX`Bf%1C#vE4i-Zy7GJLN+=<| z#m;pl*OgpXM!IudnWCUA*Oig(IC1VwlWd@BQ*}>PwW+$R8=-D*HFcV`i^)uvsykQo z>!MD=8!@ev%r>dI%Nt1?H#1pKm!e!Uhax=rt3^y~8?%d4m&djX&JkDNf>hFA*%P%;79_MPc z%*lj&k|3PR9GAJTA#<^>H*uNcGRI}^-DFPn>NIni<1)u(Zf7zV_c|DtIWBWt=H5%@ z5RgT_hr(rUzhrLBN9^8-Z6kyapNe3j<4u3*QwjoYIC{@^=wytJ z>*BRGM1aw573_=8*UBIMWbW4&CbUFFB|Qyy?e0NI#s9+V=;>N4+Gyd zdzHp^pwA0J?X7LTQ2=fI&1{?F3F{hWz0sp`CyGCEZ&c}188cn;#q!M)<$;;To>bBn zL$lgz(BC1Fr~F=ft2FdZ$FKqndi|L+1)XPCIV(J!etTAKCL@_0_KRIJYBi(MV?NxE zoYB$g#HwuMIrZVU$uU&F_RZek>XduEes$f)OE3qwOIthrw%*aL(U{ForyqtquQOhK8v%W^EwOwU3q=^2JI~>qa>c(S$dXR_GkKBDQ zsXK$wJ>L zgk}!eNoQbKcGvKLfjpwnuI&1gx1Rg9Z8Pf9W{+m4Y7cMdbS=G074YPn^2B=yNB5fF z>7BaqH2w40YxBo&Y)!9L%}(7Lf&%h>C@dh0D*bt*Q1HpR38kwe`mb4Wsi;*9*R|h| z)DcL3naOc%%gs@-r&7ogeJON(VB9x!hQ8yT(YzTtPo?ol8+INP_F20Yug69DdGMfI z{vK-DE&E+`AIf!gTzR|Jbm{!Lj97cMe?(5Td#lnMBfb5nrF#9Jh7V4YwtuOsPo=`K zR$=1-`ddYHTD69DC!CToV&kg?`XBA3ZXA`RH|^FIJb3+6a#|#M`>rKCICVp-Gx%~* zy{`+kquajLERCVG&;vhk+As-_cy0R8x#t)u~cc|lHjeUao=x@>3p7TI^O77GuiscDUnVD{Pg;u zHNmAdCTzWQe6ylim$=g;{X23Zca7L*cr4GuG_Fajz^h z{80F3M0>p(4$AoO@cK~j@I}}BR;KH5D?+6#UTQAGAMQR~D?-B<+%f#XB4+p$+TG3{ zZSZW1Md`l(3kx28DZcQSuDAaz3=2=T)?oOS zu__u6+P^D@+W2yCSS(x})lUk4PVtdeK=80EJQi8L6Ex*Apr z7k1@blMBYtSbhFguNRbOP|~nt9T%0RcH1fpE^aS0_~ag!3;o-nU1&(|r8X*#kDG#Y zUv~=+uca$Z7)Zxs;pE|VSUA^P*P8r%SS+jB;~^-JOXZh_PtJ=?MSmLNf-67YXkd6# z92Z)DZk0mK0h;#q{QIOR3}2283-{Nzx0+CTIVr28@^(@8P*?1^u!t-xUt*EC>_076_ zE*$s4qegz6oQ@Txb5tq7+Vzu$q^q-{a&EuX3$|uIYh&yFtXwF+-n9z)@I=>!cYn^B zLe)L83lv8$nxfXu#;V@vxyu$E8wPdBw*kh2gkj zYH*~Ln#zBBu^u%B*AqQucDnuE88wp3Rsi)!&M_=QcbR>m_Sx?Dra$jQ(OP=d?dpD~ z4RkD6s$+d1plJiM-6ORql* zk1A$wjT|m*#LL4f8x<;p(3m1hba`d*{ z@AMYwu+UCS*$&6HOUGl-3tuBVcCQa}N4o1q_zbP)Gqkl(UvGCUvu3_$j6Z>JJkh@) zVt}_-Q|kqPPBt?gKM-f%MU+Uq90fo61A9h4POHXpj{i$!lAp&VT*vg`^rmlxrzN30 zP+;I`$ykDfi0M5okk*>!F;JBxzY#`;SvE^(3RCFBsqWxoyM3(!Z%~98zeF zzfc7ztASLbilKX}} z$r|Cf%noMKM&ycuQpe;lpSVdi4a=8651oT#pkZtt2WuP7gKKu`RKB~qqyL2nWRA}L z{u=Ghw}s}oCBlc0sp7P3C}TA*r)ETu7fB+Mfz|LsMqCDVx=j=Z?Thi^N4l{rPjNrp zSPZ_c8;jzyFv_~sqC6M4vTeI#PyJXJ__27k9}BnU$9^h>C}q%xh~RwU$x%cfCR$Ul z5_G5vmq83wVFVCYgR=lOQ-g4C)gb(~YLK0guTX>j5qmVCm$)KKRD|M^Q|!%DA_`nD<&;y9J)m^x#*obGfZnvm>rYx7fS!UHACUX27~ zc4(Sj6|Rhtm%$G;;Zm?Os_?7F$X}cnrF;gX41q}UVkTZp%>0_M%d5@ua=^3P7=_3A z@iXxw%##ed5koBHah9!YapeZ$k_m+TxD@W}ZgvD5=f;mq{$0aTi&7qD;73BTnQEY{ zwAD*z5HjR4z%%?9h4;ny@k8Slac|=m@w>(?@mU$B+sGX^Y^NGcIFwgMEgzrQ%C5Wb zDW~Bba@uAbl$LYTM#yow(*duYo4p95DSV?aIh7%c&6SXv&yvl6R=R*oCom0=m%yDd zxlwT6z~p{DlaOQ&)NJ+uWY;fyga(UU`_8=>7876pZZhSQ=;e-N}qV0Iy*dhyCuu?R27P>8q${1!rx_2MsNT1%3rt*v)20yv6xv2 z>TN9?;PXbpAI;TJh3u%<=W2{3@D5y^e7KiodPE@-l#q;PwwEa04quo$+J+FfrSVuBFaFS=rof^iAUTKBx^XvlLbl};xivsb*?yGFipM-g=LY9B$RV$Gt zg2nU>+xz>IbJN2RveGQvpPbHj8+v{d{SESRoC-e~7@b^ul^#z~Y(V-7Te7U!?s9RB z2+RSN^KxRXqR1{QYra^wb=q9a)*NSRE=8InHBS;fDiUpu@?xU{P8WM$m^HR!$zVlLog#PnVI)ufo z66+Doq>Dtcz74fq(YtO|MSb%6y~6zrUdP13Cguu7bKN8$;(Q`cf>k3{+>&xjD*6RpktuOuXDn_}%B> z?=`)2YFf6O3o%?osn>MsW zo}w2S6s%;pUkLJGb=J@lj!Fe~ru0M<8c!NZYPX{+!6;^1NjZ2idpU}PxC*H$N_%ZD zNoE^mqL!!B^DO}#9nd%KT_Z3yb8L|Kp4x1wmD|LpF2@v&HAzE@-R8G4zRhILFWpsJ;VrOV9 zOxQHRA-c50KsD+BAK;~FzNw>dSt5Bzf)pPp%9u!54(pTR@bp#8Vd^sGEF~gsUKJ#h zVWAD^pMAlmWz; zI!qZ(`r?(r%;OKqI$#OlyKs=}Hz|iRF^v^t*yFg9kuyvczs9G@u{5Gob;_8XEZhKlhc= zU0t}(aNl0UQhv$XDbc;+ zaq6z)R5{s+PW>K(nx}4CaHT~OsY@Yd$sXQ*kea-v)G;b62LR;BYhFYWL52$r8DdnJ zY<40sYT~L=ho>Tt^9l)8MG%l6RJR|VCQ@pxw3}64prpY3gir(%6=Yb^Cx}WBP*gF~ zrq5QR(nL{O8IsOv1rgGi6lJ&)v~ft9Jn>Z#>73|81t}6r&r+)+(qxGbBhtjFuL?%z zbXS4?<_>`VAd_iXxAmxw zOi{{~>qxF6cdR3km|ylT_@>2Msp?A1wF9ZKzDC$-y=)1bsj=*?qPK2sF6k+)Zztgl;?e7$$Phg75>PCXEz&1{=*euesA70`q0 z&jWhPtJ6ipz>>1RQSf)r0eKxN{T^i1A6crsW4O?}i06NgSQb9;zeoQ0XD~kcWYxWv zBR5|4Nm7E!3(td-qu9yLo|+hrk`!&GX$pxgNQ}=jdmv8aJSMF6ftNi2M8&gasgqYC z!v|o~S8SxACP==as;(Lbt;$spRW%=^`->P$B*R6En85>}t5OvJLTQ$VR+a)qIJ7oE zRFk*0(W=^=7|S%Eouv1OP*zw`>(q!ysNIQ3s%6S6m#L&&rn+L8NL447BQOwUIYZ@< z=-9!27D%&35w2RJh|;Z5T$RHzC$f?%N^*ufEHT3eU{~c?QAMPN75*suWI%0n>;UFU z{Uwr=NL!U^HHS2UMIvWl|LEue)K#^NXK_XVAX)e^I(PtdRsI&hARW^1s+_<%r9o6E z6EOqUqQeJZQF^RFEF*%mr1C}v4}h*zwK%1!#hFyCtP&_@xh|WaY4IvUK7%w#k$@s* zV72Jr0nn9-8>dvv;)#AJ1|9=EMkPRRMCx&9l*?B z1rYT~)GXI6qJsxOS6Ts*(h87OR$#`bk_b>?29!m|4q#?60SZwvJpm9MJOC=L^4iHX zlQ;PaK3U1EB(b9XM^&RgdF|_#Ii_(xI?_AU?{yh15;T>uqTp{B7C8@5kP2GGfX!_F9=FuALOPfbin3gt=$zfX7JSK^0X@1hGplS8puT=p) zT(vDf%~@JHQ@D0F>b+&6S)og{QVzQM2PtT-xmty{%7Z~xXV-P*W3x^3RpRd8w#wfn1+ry}YC z{Gf`>QB|wlpSfevJ$CDAz1!5a%G)n87O(Z1tvYwlCt4SFj+^9FyE_z|OZ&Ih*448n zzN|MCp*AeFv>rUWEaK8{b0`?&=b_ef`qyKO8qJFER=<|DmfF{v(%A@{2*rkUs&%Z+ zeUXsvgDZ@xcQ;x?96XdILAGuM$$fj$n#ZS)P0~JrKq!lUYMQC{p3B(mx37g${nXOh z7o9(2sc?c?!sF%JtM*#LFGbuRw1H3urvt6~a#|_M_PtmVhP}J7_IgpPmWfToX90Ao zSZmxCjV2y8&t0L?I8`-kbX#l6r-$~T@F?qtTK8AIPT>{siE#br_*i?z_w_M3Z`jv@ zBaDjLpnBFQ$|n}S6?!*kCtB;d(1w;u$Tpi`|keruGa;Z5mTuuGR`TIc1i(Ugxb zo+|=;63(?&q1G77{ad>(v@Xq()~@_A%hJV*-4ZTb^Fr$!KATOc_w;NFPm+GAb;d=L z_Lu1A{(xL+=JTyNmM_n+D`@vOSDHKQm}3cD+OD7;_pdYuyXF|Tuby4u@fclcZKX$l zC+u_0q@V3W`k5TD&-Huu`DDkR8GK1)pQ~&>?PvD+lzl#AzjqWme{yq4*C!pfuPD7b z>~o2(uTn%5ABQT%&rqZI;Gft1jQ^YZwbW-c>}yX?q2OhC{~<4!XZuKwVHvv1!aiA^ zJX{|<^p%&RWt#W+2!0*ckUff&(KSpyvdvJzgf*C7SfsDtW)XGXmvd`RbSmE;Mzp?3 zYEKm9#nmr-tjwTV?#j(CemiT1ad_R*(5vSxG40su~O4pdR($w#b&DOQv$ zN0py2`A9}cC0S|{f6nA1EJG?JaJR`v2tyIWEI{`x`v_vJVvvD3wvm1$i%^wu7Od@A z`Vk@kW+?2no$MndW2|IJq}j9VBLozrW+`dEjr1c0$O_D2>Gm!C2m=Cfmi)kN!Z^+^JwmH0guy2(ze(h)%#p6+Pd@uBY zVqUaLnqGltP4NueyDB*Ys&-qyERTWRZ6B(4;9{he%Y%9uo(!IC^>?XX)*kQvbc%3z zK_1ll;IXIuxhnRW$ZWkRs%sTWTIHb!%Ho}%wp6TiOs#hLM8@Fw&)`-)DVA03?(pbv zjGy(xicq>%t~9fbPKtQgxw{o^4sZWxtyAZ`ER}$HB0LmZZOt<4mrbdDG*W~=2#>XP z;rFkxgtg*OsOi5BHM??oS0=ZWhn8TejbB<it^*h`H3JtRiV~@F^sZ2ynDieVd+QOK)9%nNpbM}ARHCW&NX}3GMiX?EDePg z?%!w)qtGf6UFnvDb5sAVyVd}Ty&e5oXFS0DY+SIgX>YRC~HIKR(OS%P_t`h zuPiky&aFk*7dQfwR^XNrc}aLSSX3d1+9K~I4sJQrgA9sj|xXx_kJ)eOG8a53FYg; zv1V3l!!bUQm1_Z?%O{#Mym>2==Z^azRFCB|%{mj_n%FJ772)`oe6IEHdZQvK6e@M0 zQxY$RgwQoN@4x)|SR&0BXo#600Y%c%Rf;cdaHm=QE6~LFOr`j`9F(=eA%R8t*QiJF_1pQa*-x*qEH#WC z!+ngYp>D;Dw9i8rTA)hbgfmCP!m_osw=2(&5G8$x5XkE-uwbW zv(l_;ZR=TVN~h!(#n)4_rVa2pF3Nu_;ZW$^*BV;)OvGiWcPEsD`)bY9%s(AG#z(4f zEr`!AEzPkXr80Ty_8){w^QEn|Uw`*2!cqUFqxCN!DH7qxXbJ7^6XmaGi!`PC zo?#1D4^Nc8oZnh2fy=YCW^56y;~Ta44WlZAkGoR>q5|NMJ4%3FYP4OeA*S zWIhuqrr0;nMB^z!^l;ROVo{F?L zsYqe2j>PI9WjOZTSt3$$4oiwlb1dZ`c*0##qzoI!D>IRjr?uCaNJLUqnBgw|Crm^_ zn5bfwQ{~T@h$OPoG+7cgwvvdXNMfe!kbO%;!USP;=XH=&s`RpCdG1>xk|?VXNxQCt zBuhZbk~6ka~p|BkWgnq%%ITrDiKKr1ZTn6Hu8{=3MEP9c}P4D>BI9hs30hL z9LRz~9m*_^t?#Nz%0!{)Pg z_}cG|N0s8st@2xG7qrWZb5I^()u=0$)H>42%4Km33WYaY9d}P!+T#Z?KuTG<`Ejm7Jxg4HLj_**mHZpAWGT;o zb)kQ3Uu*T^OK~if%(rWyRd%1Wp5vS~vDrDog5DaMnscRGlx5-^w}e{=dYbM2x-QG* zLHSlVLl|rAYeOp%XWUc-MU;wK(;eK6$%zPTVO&ygw8q`xLsP0Krw>B+^5~D&mu{cR z7#%*I2sP)lrMZ6^dJ(hr3%}iqf!38qm9g9|bt=MDkK&_a6l+bne)fDK9BG%wZ2pa+ zbZy(uLgoCmq;>D^%_d>^62!yH8@8V27`I&MM7V#Z_-n(aRVH^gQbp+9-Tcvd9g0s` z9ZEx?)EyaG>kqJt(ksQU&@}H`TC*l}%cPFJXh2uU#nx)?K#soNWML0e>!KDlf$aUdp{3vNw|FK^tLsf1GN2hI~S+Atu zB>gkl6%IQ{)~uS*9}`!Thr;3InW9;@$AdC?eU^bxQ0`UDx^54e#BRt~DBPHWW?ftk z#-#l!D}qoTAF>KY!y;*ol|w-&7LT;n=zdrxrlOn(Dl8vstv(tyN&Qs07S!`*QENH+ za7>IFrca@4DA2v%` z>*94p5i?Ti0x`!IT2r_gmC1vwv;<-mFSRBajhf{CL~#X4EMIBO!Q*I5Zht95LAq#O zYfXoYi$r@=fPm%kFRfWI#!YfvQ?P*h#T%{p=Xg9Om$sq^;;?+HIgJh|5*z$F6fVZ{ zoz}d+2W4DpR!@Y=-T9r?5KcjHRmB*r&g5yZP1uEkG0{}L_ej&&XI*>TGnzL;=czOv z)_X@4GSnyC#8yC9PY}4^2`S=kC z1N#nXuT`mDlx`GEe{YYDw655$m!*^EQb~}1wU4##uX25i$@uwNz%Bhmvpa{4A|Bq@ z4+6TnIn_E!uR-B=@v|^CkI%KvquvQ%YrE%W8Q<5RTS9;EdZD#Xf!V|* z*|r7u%($Ym*)Yel@JMxAw|9T7wct&&EQ2=;gwDy?jn=x6n@#!kS4k0CuSC-L{R!942UX{PYIRhA!%-I7qV&3ny!IBt#QYeTvgs@h{&YxD+IQ9dRYw}Rfj{H-<4 zD^yqF-+!J3x}-;~UcIo!q(AIdgx}54vo=7mO=bN`Y6<1b_8)C2pE>2NRa|e%|u{3(PJfynx zwXV6RMY}B71D)!|qCstsF|?bKart^J9KGH*wO3H>7NrM^+_DrnOMAV!?3Sg=qswPO z>7cgO?TFo`bXcLfo7}v1G+S-G7BLcE>w;(*UCn;Fdo5%4p4bAszJJv^uJAg>X8+O^ zMop&M&m5gU%V%-SyimEZkqc3R+(oQ(gV&yeNWpUpv(Lk9Df6ug}~Q;aVymX+8HB)y>BZ zr6gS5o)@*=DH)C>tX^LW=SV)$+*;?YDD|H!55j46aH=`*;jJmP#xAuzpn0x2+R@us z(r>6PK74s9X|JvRs4U&SUbh5wbbhIIg_luNIy9@Ad9{Dw@Cgr9iK*3V*s+B-?Jun6ibwit!JRQ4dxCt;Mwv|p{ zC<>kd0%L%X5Cl=lkAHstkNMl-fCny$0i(a|c~7!816 zG<#d4={g;)vz^h{TIp!jO-B3iPi{MtVT+@qoouEcj%IFkZuPC=t+7>> z=i*Q$yW2V21r)M!VY^{dqnWoeMUna^CI~C)eJRtCVZ# z10$!?e_me9Ue2!NEPZ4+W~ZL(>MVJ*-Op9@&VTlD zH9Dc(kTziBwGE5yu$e9m3)*b7nq#;BE7xn7Y_oEddogI!QJ%BL9+iRzMV_5;a(czQ>rluS3 zCFoFIvpr2V%OXDu?6`oP9kAny|NDR0mouj?!GTQAZ2Lg0uG^cOo?Bhmwb>!I%np>S zF7Q7|Vpx3OXC*xS3XcSTYKGpLejl87h?5h%>3LZW{mA*pbS3Xu5K#<=Ei8;n*JF3; VlsO7kyX_tX3;5?h{vS{ZZ8r>Jit7LX literal 46081 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

a=cfHuPut%5ET*p%(#2Lhis||<#S<{^Udtt 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 diff --git a/include/Track.h b/include/Track.h index b69e92aa336..4177ab9dab7 100644 --- a/include/Track.h +++ b/include/Track.h @@ -482,9 +482,16 @@ class TrackOperationsWidget : public QWidget public: TrackOperationsWidget( TrackView * parent ); ~TrackOperationsWidget(); + + /*void saveSettings( QDomDocument & _doc, QDomElement & _parent ) override; + void loadSettings( const QDomElement & _this ) override;*/ void setBackgroundColor( QColor & ); - QColor backgroundColor(); + + void setTrackHasColor( bool b ) + { + hasColor = b; + } protected: @@ -502,6 +509,13 @@ private slots: void recordingOn(); void recordingOff(); void clearTrack(); + + void loadColorSettings( unsigned int ); + QColor backgroundColor(); + bool trackHasColor() + { + return hasColor; + } private: static QPixmap * s_grip; @@ -513,6 +527,8 @@ private slots: PixmapButton * m_soloBtn; QColor m_backgroundColor; + bool hasColor; + bool gradientNeedsUpdate; friend class TrackView; @@ -652,7 +668,12 @@ class LMMS_EXPORT Track : public Model, public JournallingObject { return m_processingLock.tryLock(); } - + + QColor backgroundColor() + { + return m_backgroundColor; + } + BoolModel* getMutedModel(); public slots: @@ -684,6 +705,9 @@ public slots: tcoVector m_trackContentObjects; QMutex m_processingLock; + + QColor m_backgroundColor; + bool hasColor; friend class TrackView; @@ -692,7 +716,10 @@ public slots: void destroyedTrack(); void nameChanged(); void trackContentObjectAdded( TrackContentObject * ); + void loadedColorSettings( unsigned int ); + QColor requestTrackBGColor(); + bool requestTrackHasColor(); } ; @@ -739,6 +766,8 @@ class TrackView : public QWidget, public ModelView, public JournallingObject { return m_action == MoveTrack; } + + virtual void update(); @@ -790,8 +819,8 @@ public slots: Track * m_track; TrackContainerView * m_trackContainerView; - TrackOperationsWidget m_trackOperationsWidget; + QWidget m_trackSettingsWidget; TrackContentWidget m_trackContentWidget; diff --git a/src/core/Track.cpp b/src/core/Track.cpp index b2aed7c5baa..f9b8b95435d 100644 --- a/src/core/Track.cpp +++ b/src/core/Track.cpp @@ -41,13 +41,13 @@ #include #include +#include #include #include #include #include #include - #include "AutomationPattern.h" #include "AutomationTrack.h" #include "AutomationEditor.h" @@ -1859,7 +1859,10 @@ QPixmap * TrackOperationsWidget::s_grip = NULL; /*!< grip pixmap */ */ TrackOperationsWidget::TrackOperationsWidget( TrackView * parent ) : QWidget( parent ), /*!< The parent widget */ - m_trackView( parent ) /*!< The parent track view */ + m_trackView( parent ), /*!< The parent track view */ + //m_backgroundColor(), + hasColor( false ), + gradientNeedsUpdate( false ) { ToolTip::add( this, tr( "Press <%1> while clicking on move-grip " "to begin a new drag'n'drop action." ).arg(UI_CTRL_KEY) ); @@ -1911,6 +1914,14 @@ TrackOperationsWidget::TrackOperationsWidget( TrackView * parent ) : m_trackView->trackContainerView(), SLOT( deleteTrackView( TrackView * ) ), Qt::QueuedConnection ); + + m_backgroundColor = m_trackView->getTrack()->backgroundColor(); + + if( m_backgroundColor != QColor( 0, 0, 0 ) ) + { + hasColor = true; + } + } @@ -1924,6 +1935,23 @@ TrackOperationsWidget::~TrackOperationsWidget() } +/*void TrackOperationsWidget::saveSettings( QDomDocument & _doc, QDomElement & _this ) +{ + _this.setAttribute( "type", "trackopwidget" ); + _this.setAttribute( "trackcolor", m_backgroundColor.rgb() ); + _this.setAttribute( "hascolor", hasColor ); +} + +void TrackOperationsWidget::loadSettings( const QDomElement & _this ) +{ + if( _this.hasAttribute( "hascolor" ) ) + { + hasColor = _this.attribute( "hascolor" ).toInt(); + m_backgroundColor.setRgb( _this.attribute( "trackcolor" ) ); + } + + update(); +}*/ /*! \brief Respond to trackOperationsWidget mouse events @@ -1973,7 +2001,20 @@ void TrackOperationsWidget::mousePressEvent( QMouseEvent * me ) void TrackOperationsWidget::paintEvent( QPaintEvent * pe ) { QPainter p( this ); - p.fillRect( rect(), palette().brush(QPalette::Background) ); + + if( hasColor ) + { + QLinearGradient gradient( rect().bottomLeft(), rect().bottomRight() ); + gradient.setColorAt( 0, m_backgroundColor ); + gradient.setColorAt( 0.8, palette().brush(QPalette::Background).color() ); + gradient.setColorAt( 1, palette().brush(QPalette::Background).color() ); + + p.fillRect( rect(), gradient ); + } + else + { + p.fillRect( rect(), palette().brush(QPalette::Background) ); + } if( m_trackView->isMovingTrack() == false ) { @@ -1989,6 +2030,12 @@ void TrackOperationsWidget::paintEvent( QPaintEvent * pe ) p.drawPixmap( 2, 2, *s_grip ); } + + if( gradientNeedsUpdate ) + { + gradientNeedsUpdate = false; + update(); + } } @@ -2058,12 +2105,16 @@ void TrackOperationsWidget::changeTrackColor() { return; } m_backgroundColor = new_color; + hasColor = true; emit colorChanged( m_backgroundColor ); + gradientNeedsUpdate = true; } void TrackOperationsWidget::resetTrackColor() { + hasColor = false; emit colorReset(); + gradientNeedsUpdate = true; } @@ -2129,6 +2180,14 @@ void TrackOperationsWidget::toggleRecording( bool on ) } +void TrackOperationsWidget::loadColorSettings( unsigned int c ) +{ + m_backgroundColor.setRgb( c ); + setTrackHasColor( true ); + gradientNeedsUpdate = true; + update(); +} + void TrackOperationsWidget::recordingOn() { @@ -2166,7 +2225,9 @@ Track::Track( TrackTypes type, TrackContainer * tc ) : m_soloModel( false, this, tr( "Solo" ) ), /*!< For controlling track soloing */ m_simpleSerializingMode( false ), - m_trackContentObjects() /*!< The track content objects (segments) */ + m_trackContentObjects(), /*!< The track content objects (segments) */ + m_backgroundColor( 0, 0, 0 ), + hasColor( false ) { m_trackContainer->addTrack( this ); m_height = -1; @@ -2311,7 +2372,17 @@ void Track::saveSettings( QDomDocument & doc, QDomElement & element ) { element.setAttribute( "trackheight", m_height ); } - + + if( hasColor ) + { + element.setAttribute( "trackbgcolor", m_backgroundColor.rgb() ); + element.setAttribute( "hascolor", 1 ); + } + else + { + element.setAttribute( "hascolor", 0 ); + } + QDomElement tsDe = doc.createElement( nodeName() ); // let actual track (InstrumentTrack, bbTrack, sampleTrack etc.) save // its settings @@ -2364,6 +2435,17 @@ void Track::loadSettings( const QDomElement & element ) // Older project files that didn't have this attribute will set the value to false (issue 5562) m_mutedBeforeSolo = QVariant( element.attribute( "mutedBeforeSolo", "0" ) ).toBool(); + if( element.hasAttribute( "hascolor" ) ) + { + unsigned int loadedHasColor = element.attribute( "hascolor" ).toUInt(); + if( loadedHasColor == 1 ) + { + unsigned int loadedColor = element.attribute( "trackbgcolor" ).toUInt(); + m_backgroundColor.setRgba( loadedColor ); + hasColor = true; + } + } + if( m_simpleSerializingMode ) { QDomNode node = element.firstChild(); @@ -2425,11 +2507,8 @@ void Track::loadSettings( const QDomElement & element ) */ TrackContentObject * Track::addTCO( TrackContentObject * tco ) { - if ( m_trackContentObjects.size() >= 1 ) - { - tco->setColor( m_trackContentObjects[0]->colorObj() ); - tco->setUseStyleColor( m_trackContentObjects[0]->useStyleColor() ); - } + tco->setColor( m_backgroundColor ); + tco->setUseStyleColor( ! hasColor ); m_trackContentObjects.push_back( tco ); @@ -2737,6 +2816,8 @@ void Track::trackColorChanged( QColor & c ) { m_trackContentObjects[i]->setBGColor(c); } + hasColor = true; + m_backgroundColor = c; } void Track::trackColorReset() @@ -2745,6 +2826,7 @@ void Track::trackColorReset() { m_trackContentObjects[i]->resetColor(); } + hasColor = false; } @@ -2822,6 +2904,15 @@ TrackView::TrackView( Track * track, TrackContainerView * tcv ) : connect( &m_trackOperationsWidget, SIGNAL( colorReset() ), m_track, SLOT( trackColorReset() ) ); + + connect( m_track, SIGNAL( loadedColorSettings( unsigned int ) ), + &m_trackOperationsWidget, SLOT( loadColorSettings( unsigned int ) ) ); + + connect( m_track, SIGNAL( requestTrackBGColor() ), + &m_trackOperationsWidget, SLOT( backgroundColor() ) ); + + connect( m_track, SIGNAL( requestTrackHasColor() ), + &m_trackOperationsWidget, SLOT( trackHasColor() ) ); // create views for already existing TCOs for( Track::tcoVector::iterator it = From 176593824ba3cdb161b4c622d5c1e9d34e933c44 Mon Sep 17 00:00:00 2001 From: adi Date: Wed, 15 Jul 2020 17:45:25 +0530 Subject: [PATCH 09/63] Disable color gradient when muted --- ...- Krem Kaakkuja (Second Flight Remix).mmpz | Bin 47511 -> 47493 bytes include/Track.h | 1 + src/core/Track.cpp | 49 +++++++----------- 3 files changed, 20 insertions(+), 30 deletions(-) diff --git a/data/projects/demos/Greippi - Krem Kaakkuja (Second Flight Remix).mmpz b/data/projects/demos/Greippi - Krem Kaakkuja (Second Flight Remix).mmpz index 143b4ab363faa3e8c7f758c2662083adbf5b3f47..acb7fa31c48943b617eb698be266a8b069aee1a0 100644 GIT binary patch literal 47493 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�VUSt~BROzy>Kt&nMA|Nih+7Kzl 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 VlsO7kyX_tX3;5?h{vS{ZZ8r>Jit7LX diff --git a/include/Track.h b/include/Track.h index 4177ab9dab7..f207217c6a6 100644 --- a/include/Track.h +++ b/include/Track.h @@ -511,6 +511,7 @@ private slots: void clearTrack(); void loadColorSettings( unsigned int ); + void updateColorGradient(); QColor backgroundColor(); bool trackHasColor() { diff --git a/src/core/Track.cpp b/src/core/Track.cpp index f9b8b95435d..0663b5d57a0 100644 --- a/src/core/Track.cpp +++ b/src/core/Track.cpp @@ -1860,7 +1860,6 @@ QPixmap * TrackOperationsWidget::s_grip = NULL; /*!< grip pixmap */ TrackOperationsWidget::TrackOperationsWidget( TrackView * parent ) : QWidget( parent ), /*!< The parent widget */ m_trackView( parent ), /*!< The parent track view */ - //m_backgroundColor(), hasColor( false ), gradientNeedsUpdate( false ) { @@ -1915,6 +1914,9 @@ TrackOperationsWidget::TrackOperationsWidget( TrackView * parent ) : SLOT( deleteTrackView( TrackView * ) ), Qt::QueuedConnection ); + connect( m_trackView->getTrack()->getMutedModel(), SIGNAL( dataChanged() ), + this, SLOT( updateColorGradient() ) ); + m_backgroundColor = m_trackView->getTrack()->backgroundColor(); if( m_backgroundColor != QColor( 0, 0, 0 ) ) @@ -1935,25 +1937,6 @@ TrackOperationsWidget::~TrackOperationsWidget() } -/*void TrackOperationsWidget::saveSettings( QDomDocument & _doc, QDomElement & _this ) -{ - _this.setAttribute( "type", "trackopwidget" ); - _this.setAttribute( "trackcolor", m_backgroundColor.rgb() ); - _this.setAttribute( "hascolor", hasColor ); -} - -void TrackOperationsWidget::loadSettings( const QDomElement & _this ) -{ - if( _this.hasAttribute( "hascolor" ) ) - { - hasColor = _this.attribute( "hascolor" ).toInt(); - m_backgroundColor.setRgb( _this.attribute( "trackcolor" ) ); - } - - update(); -}*/ - - /*! \brief Respond to trackOperationsWidget mouse events * * If it's the left mouse button, and Ctrl is held down, and we're @@ -2002,7 +1985,7 @@ void TrackOperationsWidget::paintEvent( QPaintEvent * pe ) { QPainter p( this ); - if( hasColor ) + if( hasColor && ! m_trackView->getTrack()->getMutedModel()->value() ) { QLinearGradient gradient( rect().bottomLeft(), rect().bottomRight() ); gradient.setColorAt( 0, m_backgroundColor ); @@ -2164,6 +2147,21 @@ void TrackOperationsWidget::updateMenu() tr( "Reset color to default" ), this, SLOT( resetTrackColor() ) ); } +void TrackOperationsWidget::updateColorGradient() +{ + gradientNeedsUpdate = true; + update(); +} + + +void TrackOperationsWidget::loadColorSettings( unsigned int c ) +{ + m_backgroundColor.setRgb( c ); + setTrackHasColor( true ); + gradientNeedsUpdate = true; + update(); +} + void TrackOperationsWidget::toggleRecording( bool on ) { @@ -2180,15 +2178,6 @@ void TrackOperationsWidget::toggleRecording( bool on ) } -void TrackOperationsWidget::loadColorSettings( unsigned int c ) -{ - m_backgroundColor.setRgb( c ); - setTrackHasColor( true ); - gradientNeedsUpdate = true; - update(); -} - - void TrackOperationsWidget::recordingOn() { toggleRecording( true ); From 5cb48b8d89780466146475aaaa3e126275015fb6 Mon Sep 17 00:00:00 2001 From: adi Date: Wed, 15 Jul 2020 18:27:51 +0530 Subject: [PATCH 10/63] Change selection color to depend on TCO color --- include/Track.h | 5 +++++ src/core/Track.cpp | 25 +++++++++++++++++++++++-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/include/Track.h b/include/Track.h index f207217c6a6..eb82bd85660 100644 --- a/include/Track.h +++ b/include/Track.h @@ -295,6 +295,8 @@ public slots: void cut(); void remove(); void update() override; + void changeSelectedColor( QColor & ); + void disableSelectedColor(); protected: virtual void constructContextMenu( QMenu * ) @@ -356,6 +358,7 @@ protected slots: QColor m_mutedColor; QColor m_mutedBackgroundColor; QColor m_selectedColor; + QColor m_customSelectedColor; QColor m_textColor; QColor m_textBackgroundColor; QColor m_textShadowColor; @@ -364,6 +367,8 @@ protected slots: QSize m_mouseHotspotHand; // QSize must be used because QPoint isn't supported by property system bool m_cursorSetYet; + bool m_usesCustomSelectedColor; + bool m_needsUpdate; inline void setInitialPos( QPoint pos ) { diff --git a/src/core/Track.cpp b/src/core/Track.cpp index 0663b5d57a0..0efdf6acac9 100644 --- a/src/core/Track.cpp +++ b/src/core/Track.cpp @@ -302,7 +302,8 @@ TrackContentObjectView::TrackContentObjectView( TrackContentObject * tco, m_gradient( true ), m_mouseHotspotHand( 0, 0 ), m_cursorSetYet( false ), - m_needsUpdate( true ) + m_needsUpdate( true ), + m_usesCustomSelectedColor( ! m_tco->useStyleColor() ) { if( s_textFloat == NULL ) { @@ -327,7 +328,15 @@ TrackContentObjectView::TrackContentObjectView( TrackContentObject * tco, connect( m_tco, SIGNAL( positionChanged() ), this, SLOT( updatePosition() ) ); connect( m_tco, SIGNAL( destroyedTCO() ), this, SLOT( close() ) ); + connect( m_tco, SIGNAL( trackColorChanged( QColor & ) ), this, SLOT( changeSelectedColor( QColor & ) ) ); + connect( m_tco, SIGNAL( trackColorReset() ), this, SLOT( disableSelectedColor() ) ); setModel( m_tco ); + + if( m_usesCustomSelectedColor ) + { + QColor tcoColor = m_tco->colorObj(); + changeSelectedColor( tcoColor ); + } m_trackView->getTrackContentWidget()->addTCOView( this ); updateLength(); @@ -392,6 +401,18 @@ bool TrackContentObjectView::fixedTCOs() } +void TrackContentObjectView::changeSelectedColor( QColor & c ) +{ + m_customSelectedColor = c.darker( 200 ); + m_usesCustomSelectedColor = true; +} + +void TrackContentObjectView::disableSelectedColor() +{ + m_usesCustomSelectedColor = false; +} + + // qproperty access functions, to be inherited & used by TCOviews //! \brief CSS theming qproperty access method @@ -402,7 +423,7 @@ QColor TrackContentObjectView::mutedBackgroundColor() const { return m_mutedBackgroundColor; } QColor TrackContentObjectView::selectedColor() const -{ return m_selectedColor; } +{ return ( m_usesCustomSelectedColor ? m_customSelectedColor : m_selectedColor ); } QColor TrackContentObjectView::textColor() const { return m_textColor; } From aab2dd5ec2ba8b16c41caad271a42b7d9a3f23cd Mon Sep 17 00:00:00 2001 From: adi Date: Thu, 16 Jul 2020 08:30:15 +0530 Subject: [PATCH 11/63] Fix breaking builds --- src/core/Track.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/Track.cpp b/src/core/Track.cpp index 0efdf6acac9..b681772efbb 100644 --- a/src/core/Track.cpp +++ b/src/core/Track.cpp @@ -302,8 +302,8 @@ TrackContentObjectView::TrackContentObjectView( TrackContentObject * tco, m_gradient( true ), m_mouseHotspotHand( 0, 0 ), m_cursorSetYet( false ), - m_needsUpdate( true ), - m_usesCustomSelectedColor( ! m_tco->useStyleColor() ) + m_usesCustomSelectedColor( ! m_tco->useStyleColor() ), + m_needsUpdate( true ) { if( s_textFloat == NULL ) { From 9e3e81b3f68e9f51cadec1913caef2ace5d3f176 Mon Sep 17 00:00:00 2001 From: adi Date: Thu, 16 Jul 2020 09:04:19 +0530 Subject: [PATCH 12/63] Bug fix --- src/gui/AutomationPatternView.cpp | 7 ++++--- src/tracks/BBTrack.cpp | 8 +++++--- src/tracks/Pattern.cpp | 13 +++++++------ src/tracks/SampleTrack.cpp | 7 ++++--- 4 files changed, 20 insertions(+), 15 deletions(-) diff --git a/src/gui/AutomationPatternView.cpp b/src/gui/AutomationPatternView.cpp index 60bad4b7070..48b39981575 100644 --- a/src/gui/AutomationPatternView.cpp +++ b/src/gui/AutomationPatternView.cpp @@ -175,10 +175,11 @@ void AutomationPatternView::setColor( QColor new_color ) if( new_color.rgb() != m_pat->color() ) { m_pat->setColor( new_color ); - m_pat->setUseStyleColor( false ); - Engine::getSong()->setModified(); - update(); } + + m_pat->setUseStyleColor( false ); + Engine::getSong()->setModified(); + update(); } void AutomationPatternView::trackColorReset() diff --git a/src/tracks/BBTrack.cpp b/src/tracks/BBTrack.cpp index 076ee0d09b6..b44eae2e161 100644 --- a/src/tracks/BBTrack.cpp +++ b/src/tracks/BBTrack.cpp @@ -363,10 +363,12 @@ void BBTCOView::setColor( QColor new_color ) if( new_color.rgb() != m_bbTCO->color() ) { m_bbTCO->setColor( new_color ); - m_bbTCO->setUseStyleColor( false ); - Engine::getSong()->setModified(); - update(); } + + m_bbTCO->setUseStyleColor( false ); + Engine::getSong()->setModified(); + update(); + //BBTrack::setLastTCOColor( new_color ); } diff --git a/src/tracks/Pattern.cpp b/src/tracks/Pattern.cpp index dd1495d29ac..c00ea870d0b 100644 --- a/src/tracks/Pattern.cpp +++ b/src/tracks/Pattern.cpp @@ -681,13 +681,14 @@ void PatternView::changeName() void PatternView::setColor( QColor new_color ) { + // change color only if it is different if( new_color.rgb() != m_pat->color() ) - { - m_pat->setColor( new_color ); - m_pat->setUseStyleColor( false ); - Engine::getSong()->setModified(); - update(); - } + { m_pat->setColor( new_color ); } + + // force TCO to use color + m_pat->setUseStyleColor( false ); + Engine::getSong()->setModified(); + update(); } void PatternView::trackColorReset() diff --git a/src/tracks/SampleTrack.cpp b/src/tracks/SampleTrack.cpp index 116dc5fdb5e..c190543f05b 100644 --- a/src/tracks/SampleTrack.cpp +++ b/src/tracks/SampleTrack.cpp @@ -600,10 +600,11 @@ void SampleTCOView::setColor( QColor new_color ) if( new_color.rgb() != m_tco->color() ) { m_tco->setColor( new_color ); - m_tco->setUseStyleColor( false ); - Engine::getSong()->setModified(); - update(); } + + m_tco->setUseStyleColor( false ); + Engine::getSong()->setModified(); + update(); } void SampleTCOView::trackColorReset() From fbedb4234e59b36188bb489a1954d9773db65bb4 Mon Sep 17 00:00:00 2001 From: adi Date: Thu, 16 Jul 2020 09:10:32 +0530 Subject: [PATCH 13/63] Fix another bug where BB track colors wouldn't load --- src/tracks/BBTrack.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/tracks/BBTrack.cpp b/src/tracks/BBTrack.cpp index b44eae2e161..63b6bd977ac 100644 --- a/src/tracks/BBTrack.cpp +++ b/src/tracks/BBTrack.cpp @@ -95,8 +95,10 @@ void BBTCO::loadSettings( const QDomElement & element ) // for files saved in 1.3-onwards if( element.hasAttribute( "stylecolor" ) ) { + QColor loadedColor; + loadedColor.setRgb( element.attribute( "color" ).toUInt() ); setUseStyleColor( element.attribute( "stylecolor" ).toUInt() ); - setColor( element.attribute( "color" ) ); + setColor( loadedColor ); } // for files saved before 1.3 From c01581cf50e9f71a255aa8b8227793737035c7a5 Mon Sep 17 00:00:00 2001 From: adi Date: Thu, 16 Jul 2020 09:16:14 +0530 Subject: [PATCH 14/63] Restore changed demo to original state --- ...- Krem Kaakkuja (Second Flight Remix).mmpz | Bin 47493 -> 46081 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/data/projects/demos/Greippi - Krem Kaakkuja (Second Flight Remix).mmpz b/data/projects/demos/Greippi - Krem Kaakkuja (Second Flight Remix).mmpz index acb7fa31c48943b617eb698be266a8b069aee1a0..9ea29b34d3f1aaaf6fe86afe1e0bf10a162abe9a 100644 GIT binary patch literal 46081 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

a=cfHuPut%5ET*p%(#2Lhis||<#S<{^Udtt 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 literal 47493 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 Date: Thu, 16 Jul 2020 12:22:52 +0530 Subject: [PATCH 15/63] Fix BB Editor bug --- src/tracks/Pattern.cpp | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/src/tracks/Pattern.cpp b/src/tracks/Pattern.cpp index c00ea870d0b..52c440fde46 100644 --- a/src/tracks/Pattern.cpp +++ b/src/tracks/Pattern.cpp @@ -917,18 +917,13 @@ void PatternView::paintEvent( QPaintEvent * ) bool const muted = m_pat->getTrack()->isMuted() || m_pat->isMuted(); bool current = gui->pianoRoll()->currentPattern() == m_pat; bool beatPattern = m_pat->m_patternType == Pattern::BeatPattern; + bool beatTrack = m_pat->getTrack()->type() == Track::BBTrack; - // state: selected, normal, beat pattern, muted - /*QColor c = isSelected() ? selectedColor() : ( ( !muted && !m_pat->useStyleColor() ) - ? painter.background().color() : ( m_pat->useStyleColor() - ? m_pat->colorObj() : mutedBackgroundColor() ) );*/ - /*QColor c = isSelected() ? selectedColor() : ( muted ? mutedBackgroundColor() - : ( m_pat->useStyleColor() ? painter.background().color() - : m_pat->colorObj() ) );*/ - QColor c = isSelected() ? selectedColor() : ( muted - ? mutedBackgroundColor() : ( m_pat->empty() - ? QColor ( 48, 48, 48 ) : ( ! m_pat->useStyleColor() - ? m_pat->colorObj() : painter.background().color() ) ) ); + // state: selected, normal, beat pattern, muted, colored + QColor c = isSelected() ? selectedColor() : ( ( !muted && m_pat->useStyleColor() && !beatPattern ) + ? painter.background().color() : ( beatPattern + ? BBPatternBackground() : ( muted + ? mutedBackgroundColor() : m_pat->colorObj() ) ) ); // invert the gradient for the background in the B&B editor QLinearGradient lingrad( 0, 0, 0, height() ); From 79e42d6329cf469ac49fefb4a504714dca9a363d Mon Sep 17 00:00:00 2001 From: adi Date: Thu, 16 Jul 2020 12:26:15 +0530 Subject: [PATCH 16/63] Fix breaking builds --- src/tracks/Pattern.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/tracks/Pattern.cpp b/src/tracks/Pattern.cpp index 52c440fde46..dd05e247004 100644 --- a/src/tracks/Pattern.cpp +++ b/src/tracks/Pattern.cpp @@ -917,7 +917,6 @@ void PatternView::paintEvent( QPaintEvent * ) bool const muted = m_pat->getTrack()->isMuted() || m_pat->isMuted(); bool current = gui->pianoRoll()->currentPattern() == m_pat; bool beatPattern = m_pat->m_patternType == Pattern::BeatPattern; - bool beatTrack = m_pat->getTrack()->type() == Track::BBTrack; // state: selected, normal, beat pattern, muted, colored QColor c = isSelected() ? selectedColor() : ( ( !muted && m_pat->useStyleColor() && !beatPattern ) From 1035594d864ce27f7260e51e4a05f5044949f630 Mon Sep 17 00:00:00 2001 From: adi Date: Sat, 18 Jul 2020 11:25:59 +0530 Subject: [PATCH 17/63] Allow random color picking --- include/Track.h | 1 + src/core/Track.cpp | 34 +++++++++++++++++++++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/include/Track.h b/include/Track.h index eb82bd85660..720d649b6d1 100644 --- a/include/Track.h +++ b/include/Track.h @@ -509,6 +509,7 @@ private slots: void removeTrack(); void updateMenu(); void changeTrackColor(); + void randomTrackColor(); void resetTrackColor(); void toggleRecording(bool on); void recordingOn(); diff --git a/src/core/Track.cpp b/src/core/Track.cpp index b681772efbb..5ff61fa8a7c 100644 --- a/src/core/Track.cpp +++ b/src/core/Track.cpp @@ -38,6 +38,8 @@ #include "Track.h" #include +#include +#include #include #include @@ -1945,6 +1947,8 @@ TrackOperationsWidget::TrackOperationsWidget( TrackView * parent ) : hasColor = true; } + srand( time( 0 ) ); + } @@ -2097,7 +2101,8 @@ void TrackOperationsWidget::changeTrackColor() for( int i = 0; i < 48; i += 6 ) { - for( int j = 0; j < 6; j++ ) { + for( int j = 0; j < 6; j++ ) + { buffer.setHsl( qMax( 0, 44 * ( i / 6 ) - 1 ), 150 - 20 * j, 150 - 10 * j ); colorDialog.setStandardColor( i + j, buffer ); } @@ -2121,6 +2126,31 @@ void TrackOperationsWidget::resetTrackColor() gradientNeedsUpdate = true; } +void TrackOperationsWidget::randomTrackColor() +{ + int index = rand() % 48; + QColor buffer( 0, 0, 0 ); + + for( int i = 0; i < 48; i += 6 ) + { + for( int j = 0; j < 6; j++ ) + { + if( i + j + 1 == index ) + { + buffer.setHsl( qMax( 0, 44 * ( i / 6 ) - 1 ), 150 - 20 * j, 150 - 10 * j ); + break; + } + } + + } + + m_backgroundColor = buffer; + emit colorChanged( m_backgroundColor ); + + hasColor = true; + gradientNeedsUpdate = true; +} + /*! \brief Update the trackOperationsWidget context menu * @@ -2166,6 +2196,8 @@ void TrackOperationsWidget::updateMenu() tr( "Change color" ), this, SLOT( changeTrackColor() ) ); toMenu->addAction( embed::getIconPixmap( "colorize" ), tr( "Reset color to default" ), this, SLOT( resetTrackColor() ) ); + toMenu->addAction( embed::getIconPixmap( "colorize" ), + tr( "Set random color" ), this, SLOT( randomTrackColor() ) ); } void TrackOperationsWidget::updateColorGradient() From 7481b8b39a9d470564c649731dccd9fe47ae00f2 Mon Sep 17 00:00:00 2001 From: adi Date: Mon, 20 Jul 2020 08:54:25 +0530 Subject: [PATCH 18/63] Fix copy-paste bug --- include/Track.h | 4 ++++ src/core/Track.cpp | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/include/Track.h b/include/Track.h index 720d649b6d1..4e58c411154 100644 --- a/include/Track.h +++ b/include/Track.h @@ -680,6 +680,10 @@ class LMMS_EXPORT Track : public Model, public JournallingObject { return m_backgroundColor; } + bool useColor() + { + return hasColor; + } BoolModel* getMutedModel(); diff --git a/src/core/Track.cpp b/src/core/Track.cpp index 5ff61fa8a7c..430c275b7ea 100644 --- a/src/core/Track.cpp +++ b/src/core/Track.cpp @@ -113,6 +113,11 @@ TrackContentObject::TrackContentObject( Track * track ) : if( getTrack() ) { getTrack()->addTCO( this ); + if( getTrack()->useColor() ) + { + m_useStyleColor = false; + m_color = getTrack()->backgroundColor(); + } } setJournalling( false ); movePosition( 0 ); @@ -213,6 +218,12 @@ void TrackContentObject::paste() const MidiTime pos = startPosition(); restoreState( *( Clipboard::getContent( nodeName() ) ) ); movePosition( pos ); + + if( getTrack()->useColor() ) + { + m_useStyleColor = false; + m_color = getTrack()->backgroundColor(); + } } AutomationPattern::resolveAllIDs(); GuiApplication::instance()->automationEditor()->m_editor->updateAfterPatternChange(); @@ -648,6 +659,17 @@ void TrackContentObjectView::dropEvent( QDropEvent * de ) QDomElement tcos = dataFile.content().firstChildElement( "tcos" ); m_tco->restoreState( tcos.firstChildElement().firstChildElement() ); m_tco->movePosition( pos ); + + if( m_trackView->getTrack()->useColor() ) + { + m_tco->setUseStyleColor( false ); + m_tco->setColor( m_trackView->getTrack()->backgroundColor() ); + } + else + { + m_tco->setUseStyleColor( true ); + } + AutomationPattern::resolveAllIDs(); de->accept(); } @@ -1704,6 +1726,16 @@ bool TrackContentWidget::pasteSelection( MidiTime tcoPos, QDropEvent * de ) { tco->selectViewOnCreate( true ); } + + if( t->useColor() ) + { + tco->setUseStyleColor( false ); + tco->setColor( t->backgroundColor() ); + } + else + { + tco->setUseStyleColor( true ); + } //check tco name, if the same as source track name dont copy QString sourceTrackName = outerTCOElement.attributeNode( "trackName" ).value(); From 99777401c710d8bc141687d7bd52cec307f28683 Mon Sep 17 00:00:00 2001 From: adi Date: Mon, 20 Jul 2020 09:52:25 +0530 Subject: [PATCH 19/63] Change how color is painted on a track --- include/Track.h | 5 +---- src/core/Track.cpp | 24 +++++++++++------------- 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/include/Track.h b/include/Track.h index 4e58c411154..1263a089ac7 100644 --- a/include/Track.h +++ b/include/Track.h @@ -487,9 +487,6 @@ class TrackOperationsWidget : public QWidget public: TrackOperationsWidget( TrackView * parent ); ~TrackOperationsWidget(); - - /*void saveSettings( QDomDocument & _doc, QDomElement & _parent ) override; - void loadSettings( const QDomElement & _this ) override;*/ void setBackgroundColor( QColor & ); @@ -535,7 +532,7 @@ private slots: QColor m_backgroundColor; bool hasColor; - bool gradientNeedsUpdate; + bool colorBarNeedsUpdate; friend class TrackView; diff --git a/src/core/Track.cpp b/src/core/Track.cpp index 430c275b7ea..785dfd9c0e2 100644 --- a/src/core/Track.cpp +++ b/src/core/Track.cpp @@ -1916,7 +1916,7 @@ TrackOperationsWidget::TrackOperationsWidget( TrackView * parent ) : QWidget( parent ), /*!< The parent widget */ m_trackView( parent ), /*!< The parent track view */ hasColor( false ), - gradientNeedsUpdate( false ) + colorBarNeedsUpdate( false ) { ToolTip::add( this, tr( "Press <%1> while clicking on move-grip " "to begin a new drag'n'drop action." ).arg(UI_CTRL_KEY) ); @@ -2044,12 +2044,10 @@ void TrackOperationsWidget::paintEvent( QPaintEvent * pe ) if( hasColor && ! m_trackView->getTrack()->getMutedModel()->value() ) { - QLinearGradient gradient( rect().bottomLeft(), rect().bottomRight() ); - gradient.setColorAt( 0, m_backgroundColor ); - gradient.setColorAt( 0.8, palette().brush(QPalette::Background).color() ); - gradient.setColorAt( 1, palette().brush(QPalette::Background).color() ); + QRect coloredRect( 0, 0, 10, m_trackView->getTrack()->getHeight() ); - p.fillRect( rect(), gradient ); + p.fillRect( rect(), palette().brush(QPalette::Background) ); + p.fillRect( coloredRect, m_backgroundColor ); } else { @@ -2071,9 +2069,9 @@ void TrackOperationsWidget::paintEvent( QPaintEvent * pe ) p.drawPixmap( 2, 2, *s_grip ); } - if( gradientNeedsUpdate ) + if( colorBarNeedsUpdate ) { - gradientNeedsUpdate = false; + colorBarNeedsUpdate = false; update(); } } @@ -2148,14 +2146,14 @@ void TrackOperationsWidget::changeTrackColor() m_backgroundColor = new_color; hasColor = true; emit colorChanged( m_backgroundColor ); - gradientNeedsUpdate = true; + colorBarNeedsUpdate = true; } void TrackOperationsWidget::resetTrackColor() { hasColor = false; emit colorReset(); - gradientNeedsUpdate = true; + colorBarNeedsUpdate = true; } void TrackOperationsWidget::randomTrackColor() @@ -2180,7 +2178,7 @@ void TrackOperationsWidget::randomTrackColor() emit colorChanged( m_backgroundColor ); hasColor = true; - gradientNeedsUpdate = true; + colorBarNeedsUpdate = true; } @@ -2234,7 +2232,7 @@ void TrackOperationsWidget::updateMenu() void TrackOperationsWidget::updateColorGradient() { - gradientNeedsUpdate = true; + colorBarNeedsUpdate = true; update(); } @@ -2243,7 +2241,7 @@ void TrackOperationsWidget::loadColorSettings( unsigned int c ) { m_backgroundColor.setRgb( c ); setTrackHasColor( true ); - gradientNeedsUpdate = true; + colorBarNeedsUpdate = true; update(); } From b76d0c0570a8d9273826688a435f6c4f2ba64d1b Mon Sep 17 00:00:00 2001 From: adi Date: Tue, 21 Jul 2020 13:43:28 +0530 Subject: [PATCH 20/63] Cleanup, and implement per-pattern colors --- include/AutomationPatternView.h | 2 ++ include/BBTrack.h | 3 +- include/Pattern.h | 2 ++ include/SampleTrack.h | 2 ++ include/Track.h | 12 ++++++- src/core/AutomationPattern.cpp | 2 ++ src/core/Track.cpp | 50 ++++++++++++++++++++++------ src/gui/AutomationPatternView.cpp | 46 ++++++++++++++++++++++++++ src/tracks/BBTrack.cpp | 54 +++++++++++++++++++------------ src/tracks/Pattern.cpp | 52 +++++++++++++++++++++++++++++ src/tracks/SampleTrack.cpp | 53 ++++++++++++++++++++++++++++++ 11 files changed, 247 insertions(+), 31 deletions(-) diff --git a/include/AutomationPatternView.h b/include/AutomationPatternView.h index a9ba5e29c32..66927e2be8f 100644 --- a/include/AutomationPatternView.h +++ b/include/AutomationPatternView.h @@ -62,6 +62,8 @@ protected slots: void flipY(); void flipX(); + void changeClipColor(); + void useTrackColor(); void trackColorChanged( QColor & ); void trackColorReset(); diff --git a/include/BBTrack.h b/include/BBTrack.h index ce781f98d47..cfef1857da5 100644 --- a/include/BBTrack.h +++ b/include/BBTrack.h @@ -83,7 +83,8 @@ protected slots: void openInBBEditor(); void resetName(); void changeName(); - void changeColor(); + void changeClipColor(); + void useTrackColor(); void resetColor(); void trackColorChanged( QColor & c ); diff --git a/include/Pattern.h b/include/Pattern.h index f72b833342b..d47f324c9bc 100644 --- a/include/Pattern.h +++ b/include/Pattern.h @@ -200,6 +200,8 @@ protected slots: void resetName(); void changeName(); + void changeClipColor(); + void useTrackColor(); void trackColorChanged( QColor & ); void trackColorReset(); diff --git a/include/SampleTrack.h b/include/SampleTrack.h index eb9eb0edb2c..b200d86b7d7 100644 --- a/include/SampleTrack.h +++ b/include/SampleTrack.h @@ -116,6 +116,8 @@ class SampleTCOView : public TrackContentObjectView public slots: void updateSample(); + void changeClipColor(); + void useTrackColor(); void trackColorChanged( QColor & ); void trackColorReset(); diff --git a/include/Track.h b/include/Track.h index 1263a089ac7..b5740e281e2 100644 --- a/include/Track.h +++ b/include/Track.h @@ -163,6 +163,13 @@ class LMMS_EXPORT TrackContentObject : public Model, public JournallingObject { return m_useStyleColor; } + + bool useCustomClipColor() + { + return m_useCustomClipColor; + } + + void setUseCustomClipColor( bool b ); virtual void movePosition( const MidiTime & pos ); virtual void changeLength( const MidiTime & length ); @@ -200,7 +207,9 @@ public slots: void positionChanged(); void destroyedTCO(); void trackColorChanged( QColor & ); + void clipColorChanged( QColor & ); void trackColorReset(); + void clipColorReset(); private: @@ -224,9 +233,9 @@ public slots: bool m_selectViewOnCreate; - QColor m_bgcolor; QColor m_color; bool m_useStyleColor; + bool m_useCustomClipColor; friend class TrackContentObjectView; @@ -297,6 +306,7 @@ public slots: void update() override; void changeSelectedColor( QColor & ); void disableSelectedColor(); + void disableClipSelectedColor(); protected: virtual void constructContextMenu( QMenu * ) diff --git a/src/core/AutomationPattern.cpp b/src/core/AutomationPattern.cpp index d5d8f03e972..08a68480483 100644 --- a/src/core/AutomationPattern.cpp +++ b/src/core/AutomationPattern.cpp @@ -539,6 +539,7 @@ void AutomationPattern::saveSettings( QDomDocument & _doc, QDomElement & _this ) _this.setAttribute( "tens", QString::number( getTension() ) ); _this.setAttribute( "mute", QString::number( isMuted() ) ); _this.setAttribute( "stylecolor", useStyleColor() ); + _this.setAttribute( "clipcolor", useCustomClipColor() ); _this.setAttribute( "color", color() ); for( timeMap::const_iterator it = m_timeMap.begin(); @@ -599,6 +600,7 @@ void AutomationPattern::loadSettings( const QDomElement & _this ) if( _this.hasAttribute( "stylecolor" ) ) { setUseStyleColor( _this.attribute( "stylecolor" ).toInt() ); + setUseCustomClipColor( _this.attribute( "clipcolor" ).toInt() ); setColor( _this.attribute( "color" ).toUInt() ); } diff --git a/src/core/Track.cpp b/src/core/Track.cpp index 785dfd9c0e2..71767a2643a 100644 --- a/src/core/Track.cpp +++ b/src/core/Track.cpp @@ -108,12 +108,13 @@ TrackContentObject::TrackContentObject( Track * track ) : m_mutedModel( false, this, tr( "Mute" ) ), m_selectViewOnCreate( false ), m_color( 128, 128, 128 ), - m_useStyleColor( true ) + m_useStyleColor( true ), + m_useCustomClipColor( false ) { if( getTrack() ) { getTrack()->addTCO( this ); - if( getTrack()->useColor() ) + if( getTrack()->useColor() && ! m_useCustomClipColor ) { m_useStyleColor = false; m_color = getTrack()->backgroundColor(); @@ -219,7 +220,7 @@ void TrackContentObject::paste() restoreState( *( Clipboard::getContent( nodeName() ) ) ); movePosition( pos ); - if( getTrack()->useColor() ) + if( getTrack()->useColor() && ! m_useCustomClipColor ) { m_useStyleColor = false; m_color = getTrack()->backgroundColor(); @@ -264,21 +265,33 @@ void TrackContentObject::setStartTimeOffset( const MidiTime &startTimeOffset ) void TrackContentObject::setBGColor( QColor & c ) { - m_bgcolor = c; - emit trackColorChanged( m_bgcolor ); + // since this function is called only from track, and track changes override local settings, remove custom clip color + m_useCustomClipColor = false; + + m_color = c; + emit trackColorChanged( m_color ); } QColor TrackContentObject::BGColor() { - return m_bgcolor; + return m_color; } void TrackContentObject::resetColor() { + m_useCustomClipColor = false; emit trackColorReset(); } +void TrackContentObject::setUseCustomClipColor( bool b ) +{ + m_useCustomClipColor = b; + b ? emit clipColorChanged( m_color ) : emit clipColorReset(); + +} + + @@ -315,7 +328,7 @@ TrackContentObjectView::TrackContentObjectView( TrackContentObject * tco, m_gradient( true ), m_mouseHotspotHand( 0, 0 ), m_cursorSetYet( false ), - m_usesCustomSelectedColor( ! m_tco->useStyleColor() ), + m_usesCustomSelectedColor( ! m_tco->useStyleColor() | m_tco->useCustomClipColor() ), m_needsUpdate( true ) { if( s_textFloat == NULL ) @@ -343,6 +356,8 @@ TrackContentObjectView::TrackContentObjectView( TrackContentObject * tco, connect( m_tco, SIGNAL( destroyedTCO() ), this, SLOT( close() ) ); connect( m_tco, SIGNAL( trackColorChanged( QColor & ) ), this, SLOT( changeSelectedColor( QColor & ) ) ); connect( m_tco, SIGNAL( trackColorReset() ), this, SLOT( disableSelectedColor() ) ); + connect( m_tco, SIGNAL( clipColorChanged( QColor & ) ), this, SLOT( changeSelectedColor( QColor & ) ) ); + connect( m_tco, SIGNAL( clipColorReset() ), this, SLOT( disableClipSelectedColor() ) ); setModel( m_tco ); if( m_usesCustomSelectedColor ) @@ -425,6 +440,19 @@ void TrackContentObjectView::disableSelectedColor() m_usesCustomSelectedColor = false; } +void TrackContentObjectView::disableClipSelectedColor() +{ + if( m_trackView->getTrack()->useColor() ) + { + m_customSelectedColor = m_trackView->getTrack()->backgroundColor().darker( 200 ); + m_usesCustomSelectedColor = true; + } + else + { + m_usesCustomSelectedColor = false; + } +} + // qproperty access functions, to be inherited & used by TCOviews @@ -663,7 +691,8 @@ void TrackContentObjectView::dropEvent( QDropEvent * de ) if( m_trackView->getTrack()->useColor() ) { m_tco->setUseStyleColor( false ); - m_tco->setColor( m_trackView->getTrack()->backgroundColor() ); + if( ! dynamic_cast( qwSource )->m_tco->useCustomClipColor() ) + m_tco->setColor( m_trackView->getTrack()->backgroundColor() ); } else { @@ -721,6 +750,7 @@ DataFile TrackContentObjectView::createTCODataFiles( tcoElement.setAttribute( "trackIndex", trackIndex ); tcoElement.setAttribute( "trackType", tcoTrack->type() ); tcoElement.setAttribute( "trackName", tcoTrack->name() ); + tcoElement.setAttribute( "clipColor", ( *it )->m_tco->useCustomClipColor() ); ( *it )->m_tco->saveState( dataFile, tcoElement ); tcoParent.appendChild( tcoElement ); } @@ -1730,7 +1760,9 @@ bool TrackContentWidget::pasteSelection( MidiTime tcoPos, QDropEvent * de ) if( t->useColor() ) { tco->setUseStyleColor( false ); - tco->setColor( t->backgroundColor() ); + + if( outerTCOElement.attributeNode( "clipColor" ).value() == "0" ) + tco->setColor( t->backgroundColor() ); } else { diff --git a/src/gui/AutomationPatternView.cpp b/src/gui/AutomationPatternView.cpp index 48b39981575..19f0ad095e8 100644 --- a/src/gui/AutomationPatternView.cpp +++ b/src/gui/AutomationPatternView.cpp @@ -23,6 +23,7 @@ */ #include "AutomationPatternView.h" +#include #include #include #include @@ -169,6 +170,47 @@ void AutomationPatternView::flipX() } +void AutomationPatternView::changeClipColor() +{ + QColorDialog colorDialog( m_pat->colorObj() ); + QColor buffer( 0, 0, 0 ); + + for( int i = 0; i < 48; i += 6 ) + { + for( int j = 0; j < 6; j++ ) + { + buffer.setHsl( qMax( 0, 44 * ( i / 6 ) - 1 ), 150 - 20 * j, 150 - 10 * j ); + colorDialog.setStandardColor( i + j, buffer ); + } + + } + + QColor new_color = colorDialog.getColor( m_pat->colorObj() ); + if( ! new_color.isValid() ) + { return; } + + setColor( new_color ); + m_pat->setUseCustomClipColor( true ); +} + + +void AutomationPatternView::useTrackColor() +{ + if( m_pat->getTrack()->useColor() ) + { + setColor( m_pat->getTrack()->backgroundColor() ); + m_pat->setUseStyleColor( false ); + } + else + { + m_pat->setUseStyleColor( true ); + } + + m_pat->setUseCustomClipColor( false ); + update(); +} + + void AutomationPatternView::setColor( QColor new_color ) { @@ -265,6 +307,10 @@ void AutomationPatternView::constructContextMenu( QMenu * _cm ) } _cm->addSeparator(); + _cm->addAction( embed::getIconPixmap( "colorize" ), + tr( "Set clip color" ), this, SLOT( changeClipColor() ) ); + _cm->addAction( embed::getIconPixmap( "colorize" ), + tr( "Use track color" ), this, SLOT( useTrackColor() ) ); } diff --git a/src/tracks/BBTrack.cpp b/src/tracks/BBTrack.cpp index 63b6bd977ac..993842c66ab 100644 --- a/src/tracks/BBTrack.cpp +++ b/src/tracks/BBTrack.cpp @@ -74,6 +74,7 @@ void BBTCO::saveSettings( QDomDocument & doc, QDomElement & element ) element.setAttribute( "muted", isMuted() ); element.setAttribute( "color", color() ); element.setAttribute( "stylecolor", useStyleColor() ); + element.setAttribute( "clipcolor", useCustomClipColor() ); } @@ -98,6 +99,7 @@ void BBTCO::loadSettings( const QDomElement & element ) QColor loadedColor; loadedColor.setRgb( element.attribute( "color" ).toUInt() ); setUseStyleColor( element.attribute( "stylecolor" ).toUInt() ); + setUseCustomClipColor( element.attribute( "clipcolor" ).toUInt() ); setColor( loadedColor ); } @@ -182,9 +184,9 @@ void BBTCOView::constructContextMenu( QMenu * _cm ) tr( "Change name" ), this, SLOT( changeName() ) ); _cm->addAction( embed::getIconPixmap( "colorize" ), - tr( "Change color" ), this, SLOT( changeColor() ) ); + tr( "Change clip color" ), this, SLOT( changeClipColor() ) ); _cm->addAction( embed::getIconPixmap( "colorize" ), - tr( "Reset color to default" ), this, SLOT( resetColor() ) ); + tr( "Use track color" ), this, SLOT( useTrackColor() ) ); } @@ -317,32 +319,44 @@ void BBTCOView::changeName() -void BBTCOView::changeColor() +void BBTCOView::changeClipColor() { - QColor new_color = QColorDialog::getColor( m_bbTCO->colorObj() ); - if( ! new_color.isValid() ) - { - return; - } - if( isSelected() ) + QColorDialog colorDialog( m_bbTCO->colorObj() ); + QColor buffer( 0, 0, 0 ); + + for( int i = 0; i < 48; i += 6 ) { - QVector selected = - gui->songEditor()->m_editor->selectedObjects(); - for( QVector::iterator it = - selected.begin(); - it != selected.end(); ++it ) + for( int j = 0; j < 6; j++ ) { - BBTCOView * bb_tcov = dynamic_cast( *it ); - if( bb_tcov ) - { - bb_tcov->setColor( new_color ); - } + buffer.setHsl( qMax( 0, 44 * ( i / 6 ) - 1 ), 150 - 20 * j, 150 - 10 * j ); + colorDialog.setStandardColor( i + j, buffer ); } + + } + + QColor new_color = colorDialog.getColor( m_bbTCO->colorObj() ); + if( ! new_color.isValid() ) + { return; } + + setColor( new_color ); + m_bbTCO->setUseCustomClipColor( true ); +} + + +void BBTCOView::useTrackColor() +{ + if( m_bbTCO->getTrack()->useColor() ) + { + setColor( m_bbTCO->getTrack()->backgroundColor() ); + m_bbTCO->setUseStyleColor( false ); } else { - setColor( new_color ); + m_bbTCO->setUseStyleColor( true ); } + + m_bbTCO->setUseCustomClipColor( false ); + update(); } diff --git a/src/tracks/Pattern.cpp b/src/tracks/Pattern.cpp index dd05e247004..f232ac998a6 100644 --- a/src/tracks/Pattern.cpp +++ b/src/tracks/Pattern.cpp @@ -25,6 +25,7 @@ #include "Pattern.h" #include +#include #include #include #include @@ -361,6 +362,7 @@ void Pattern::saveSettings( QDomDocument & _doc, QDomElement & _this ) _this.setAttribute( "type", m_patternType ); _this.setAttribute( "name", name() ); _this.setAttribute( "stylecolor", useStyleColor() ); + _this.setAttribute( "clipcolor", useCustomClipColor() ); _this.setAttribute( "color", color() ); // as the target of copied/dragged pattern is always an existing // pattern, we must not store actual position, instead we store -1 @@ -397,6 +399,7 @@ void Pattern::loadSettings( const QDomElement & _this ) if( _this.hasAttribute( "stylecolor" ) ) { setUseStyleColor( _this.attribute( "stylecolor" ).toInt() ); + setUseCustomClipColor( _this.attribute( "clipcolor" ).toInt() ); setColorRgb( _this.attribute( "color" ).toUInt() ); } @@ -679,6 +682,49 @@ void PatternView::changeName() m_pat->setName( s ); } + +void PatternView::changeClipColor() +{ + QColorDialog colorDialog( m_pat->colorObj() ); + QColor buffer( 0, 0, 0 ); + + for( int i = 0; i < 48; i += 6 ) + { + for( int j = 0; j < 6; j++ ) + { + buffer.setHsl( qMax( 0, 44 * ( i / 6 ) - 1 ), 150 - 20 * j, 150 - 10 * j ); + colorDialog.setStandardColor( i + j, buffer ); + } + + } + + QColor new_color = colorDialog.getColor( m_pat->colorObj() ); + if( ! new_color.isValid() ) + { return; } + + setColor( new_color ); + m_pat->setUseCustomClipColor( true ); +} + + +void PatternView::useTrackColor() +{ + if( m_pat->getTrack()->useColor() ) + { + setColor( m_pat->getTrack()->backgroundColor() ); + m_pat->setUseStyleColor( false ); + } + else + { + m_pat->setUseStyleColor( true ); + } + + m_pat->setUseCustomClipColor( false ); + update(); +} + + + void PatternView::setColor( QColor new_color ) { // change color only if it is different @@ -761,6 +807,12 @@ void PatternView::constructContextMenu( QMenu * _cm ) _cm->addAction( embed::getIconPixmap( "step_btn_duplicate" ), tr( "Clone Steps" ), m_pat, SLOT( cloneSteps() ) ); } + + _cm->addSeparator(); + _cm->addAction( embed::getIconPixmap( "colorize" ), + tr( "Set clip color" ), this, SLOT( changeClipColor() ) ); + _cm->addAction( embed::getIconPixmap( "colorize" ), + tr( "Use track color" ), this, SLOT( useTrackColor() ) ); } diff --git a/src/tracks/SampleTrack.cpp b/src/tracks/SampleTrack.cpp index c190543f05b..83f9fb3879d 100644 --- a/src/tracks/SampleTrack.cpp +++ b/src/tracks/SampleTrack.cpp @@ -24,6 +24,7 @@ */ #include "SampleTrack.h" +#include #include #include #include @@ -276,6 +277,7 @@ void SampleTCO::saveSettings( QDomDocument & _doc, QDomElement & _this ) _this.setAttribute( "sample_rate", m_sampleBuffer->sampleRate()); _this.setAttribute( "stylecolor", useStyleColor() ); + _this.setAttribute( "clipcolor", useCustomClipColor() ); _this.setAttribute( "color", color() ); // TODO: start- and end-frame } @@ -305,6 +307,7 @@ void SampleTCO::loadSettings( const QDomElement & _this ) if( _this.hasAttribute( "stylecolor" ) ) { setUseStyleColor( _this.attribute( "stylecolor" ).toInt() ); + setUseCustomClipColor( _this.attribute( "clipcolor" ).toInt() ); setColor( _this.attribute( "color" ).toUInt() ); } } @@ -382,6 +385,13 @@ void SampleTCOView::contextMenuEvent( QContextMenuEvent * _cme ) /*contextMenu.addAction( embed::getIconPixmap( "record" ), tr( "Set/clear record" ), m_tco, SLOT( toggleRecord() ) );*/ + + contextMenu.addSeparator(); + contextMenu.addAction( embed::getIconPixmap( "colorize" ), + tr( "Set clip color" ), this, SLOT( changeClipColor() ) ); + contextMenu.addAction( embed::getIconPixmap( "colorize" ), + tr( "Use track color" ), this, SLOT( useTrackColor() ) ); + constructContextMenu( &contextMenu ); contextMenu.exec( QCursor::pos() ); @@ -595,6 +605,49 @@ void SampleTCOView::paintEvent( QPaintEvent * pe ) painter.drawPixmap( 0, 0, m_paintPixmap ); } + +void SampleTCOView::changeClipColor() +{ + QColorDialog colorDialog( m_tco->colorObj() ); + QColor buffer( 0, 0, 0 ); + + for( int i = 0; i < 48; i += 6 ) + { + for( int j = 0; j < 6; j++ ) + { + buffer.setHsl( qMax( 0, 44 * ( i / 6 ) - 1 ), 150 - 20 * j, 150 - 10 * j ); + colorDialog.setStandardColor( i + j, buffer ); + } + + } + + QColor new_color = colorDialog.getColor( m_tco->colorObj() ); + if( ! new_color.isValid() ) + { return; } + + setColor( new_color ); + m_tco->setUseCustomClipColor( true ); +} + + +void SampleTCOView::useTrackColor() +{ + if( m_tco->getTrack()->useColor() ) + { + setColor( m_tco->getTrack()->backgroundColor() ); + m_tco->setUseStyleColor( false ); + } + else + { + m_tco->setUseStyleColor( true ); + } + + m_tco->setUseCustomClipColor( false ); + update(); +} + + + void SampleTCOView::setColor( QColor new_color ) { if( new_color.rgb() != m_tco->color() ) From 9f7c2ea1e4bafd44c6adbf06c396f000922d0c3b Mon Sep 17 00:00:00 2001 From: adi Date: Wed, 22 Jul 2020 13:59:10 +0530 Subject: [PATCH 21/63] Cleanup comments --- src/gui/AutomationPatternView.cpp | 4 +--- src/tracks/BBTrack.cpp | 2 +- src/tracks/SampleTrack.cpp | 2 +- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/gui/AutomationPatternView.cpp b/src/gui/AutomationPatternView.cpp index 19f0ad095e8..34a77d915df 100644 --- a/src/gui/AutomationPatternView.cpp +++ b/src/gui/AutomationPatternView.cpp @@ -353,9 +353,7 @@ void AutomationPatternView::paintEvent( QPaintEvent * ) bool muted = m_pat->getTrack()->isMuted() || m_pat->isMuted(); bool current = gui->automationEditor()->currentPattern() == m_pat; - // state: selected, muted, normal - /*c = isSelected() ? selectedColor() : ( muted ? mutedBackgroundColor() - : painter.background().color() );*/ + // state: selected, muted, colored, normal c = isSelected() ? selectedColor() : ( muted ? mutedBackgroundColor() : ( ! m_pat->useStyleColor() ? m_pat->colorObj() : painter.background().color() ) ); diff --git a/src/tracks/BBTrack.cpp b/src/tracks/BBTrack.cpp index 993842c66ab..57dbf39737c 100644 --- a/src/tracks/BBTrack.cpp +++ b/src/tracks/BBTrack.cpp @@ -223,7 +223,7 @@ void BBTCOView::paintEvent( QPaintEvent * ) QColor c; bool muted = m_bbTCO->getTrack()->isMuted() || m_bbTCO->isMuted(); - // state: selected, muted, default, user selected + // state: selected, muted, default, colored c = isSelected() ? selectedColor() : ( muted ? mutedBackgroundColor() : ( m_bbTCO->useStyleColor() ? painter.background().color() : m_bbTCO->colorObj() ) ); diff --git a/src/tracks/SampleTrack.cpp b/src/tracks/SampleTrack.cpp index 83f9fb3879d..df1eeadd5bf 100644 --- a/src/tracks/SampleTrack.cpp +++ b/src/tracks/SampleTrack.cpp @@ -523,7 +523,7 @@ void SampleTCOView::paintEvent( QPaintEvent * pe ) QColor c; bool muted = m_tco->getTrack()->isMuted() || m_tco->isMuted(); - // state: selected, muted, normal + // state: selected, muted, colored, normal c = isSelected() ? selectedColor() : ( muted ? mutedBackgroundColor() : ( ! m_tco->useStyleColor() ? m_tco->colorObj() : painter.background().color() ) ); From 44f1eb7efcf8857ef414a91d12103a26f3529da3 Mon Sep 17 00:00:00 2001 From: adi Date: Mon, 27 Jul 2020 11:58:47 +0530 Subject: [PATCH 22/63] Migrate some functions --- include/AutomationPatternView.h | 6 ----- include/BBTrack.h | 5 ---- include/Pattern.h | 7 ------ include/SampleTrack.h | 6 ----- include/Track.h | 6 +++++ src/core/Track.cpp | 14 +++++++++++ src/gui/AutomationPatternView.cpp | 17 ++------------ src/tracks/BBTrack.cpp | 20 ++-------------- src/tracks/Pattern.cpp | 39 ++----------------------------- src/tracks/SampleTrack.cpp | 18 ++------------ 10 files changed, 28 insertions(+), 110 deletions(-) diff --git a/include/AutomationPatternView.h b/include/AutomationPatternView.h index 66927e2be8f..2c5b5a15fb4 100644 --- a/include/AutomationPatternView.h +++ b/include/AutomationPatternView.h @@ -41,12 +41,6 @@ class AutomationPatternView : public TrackContentObjectView public: AutomationPatternView( AutomationPattern * _pat, TrackView * _parent ); virtual ~AutomationPatternView(); - - QColor color() const - { - return( m_pat->colorObj() ); - } - void setColor( QColor _new_color ); public slots: /// Opens this view's pattern in the global automation editor diff --git a/include/BBTrack.h b/include/BBTrack.h index cfef1857da5..cb6ec261021 100644 --- a/include/BBTrack.h +++ b/include/BBTrack.h @@ -70,11 +70,6 @@ class BBTCOView : public TrackContentObjectView BBTCOView( TrackContentObject * _tco, TrackView * _tv ); virtual ~BBTCOView() = default; - QColor color() const - { - return( m_bbTCO->colorObj() ); - } - void setColor( QColor _new_color ); public slots: void update() override; diff --git a/include/Pattern.h b/include/Pattern.h index d47f324c9bc..1558bf97561 100644 --- a/include/Pattern.h +++ b/include/Pattern.h @@ -183,12 +183,6 @@ class PatternView : public TrackContentObjectView QColor const & getMutedNoteBorderColor() const { return m_mutedNoteBorderColor; } void setMutedNoteBorderColor(QColor const & color) { m_mutedNoteBorderColor = color; } - QColor color() const - { - return( m_pat->color() ); - } - void setColor( QColor _new_color ); - public slots: void update() override; @@ -202,7 +196,6 @@ protected slots: void changeClipColor(); void useTrackColor(); - void trackColorChanged( QColor & ); void trackColorReset(); diff --git a/include/SampleTrack.h b/include/SampleTrack.h index b200d86b7d7..4db2ffca229 100644 --- a/include/SampleTrack.h +++ b/include/SampleTrack.h @@ -106,12 +106,6 @@ class SampleTCOView : public TrackContentObjectView public: SampleTCOView( SampleTCO * _tco, TrackView * _tv ); virtual ~SampleTCOView() = default; - - QColor color() const - { - return( m_tco->colorObj() ); - } - void setColor( QColor _new_color ); public slots: void updateSample(); diff --git a/include/Track.h b/include/Track.h index b5740e281e2..166505f0b4d 100644 --- a/include/Track.h +++ b/include/Track.h @@ -294,6 +294,11 @@ class TrackContentObjectView : public selectableObject, public ModelView void setBBPatternBackground( const QColor & c ); void setGradient( const bool & b ); void setMouseHotspotHand(const QSize & s); + + QColor color() const + { + return( m_tco->color() ); + }; // access needsUpdate member variable bool needsUpdate(); @@ -307,6 +312,7 @@ public slots: void changeSelectedColor( QColor & ); void disableSelectedColor(); void disableClipSelectedColor(); + void setColor( QColor & ); protected: virtual void constructContextMenu( QMenu * ) diff --git a/src/core/Track.cpp b/src/core/Track.cpp index 71767a2643a..1e56fd1c91f 100644 --- a/src/core/Track.cpp +++ b/src/core/Track.cpp @@ -359,6 +359,7 @@ TrackContentObjectView::TrackContentObjectView( TrackContentObject * tco, connect( m_tco, SIGNAL( clipColorChanged( QColor & ) ), this, SLOT( changeSelectedColor( QColor & ) ) ); connect( m_tco, SIGNAL( clipColorReset() ), this, SLOT( disableClipSelectedColor() ) ); setModel( m_tco ); + connect( m_tco, SIGNAL( trackColorChanged( QColor & ) ), this, SLOT( setColor( QColor & ) ) ); if( m_usesCustomSelectedColor ) { @@ -613,6 +614,19 @@ void TrackContentObjectView::updatePosition() +void TrackContentObjectView::setColor( QColor & new_color ) +{ + // change color only if it is different + if( new_color.rgb() != m_tco->color() ) + { m_tco->setColor( new_color ); } + + // force TCO to use color + m_tco->setUseStyleColor( false ); + Engine::getSong()->setModified(); + update(); +} + + /*! \brief Change the trackContentObjectView's display when something * being dragged enters it. * diff --git a/src/gui/AutomationPatternView.cpp b/src/gui/AutomationPatternView.cpp index 34a77d915df..21e9ffe7c94 100644 --- a/src/gui/AutomationPatternView.cpp +++ b/src/gui/AutomationPatternView.cpp @@ -54,8 +54,6 @@ AutomationPatternView::AutomationPatternView( AutomationPattern * _pattern, this, SLOT( update() ) ); connect( gui->automationEditor(), SIGNAL( currentPatternChanged() ), this, SLOT( update() ) ); - connect( m_pat, SIGNAL( trackColorChanged( QColor & ) ), - this, SLOT( trackColorChanged( QColor & ) ) ); connect( m_pat, SIGNAL( trackColorReset() ), this, SLOT( trackColorReset() ) ); @@ -198,7 +196,8 @@ void AutomationPatternView::useTrackColor() { if( m_pat->getTrack()->useColor() ) { - setColor( m_pat->getTrack()->backgroundColor() ); + QColor buffer = m_pat->getTrack()->backgroundColor(); + setColor( buffer ); m_pat->setUseStyleColor( false ); } else @@ -212,18 +211,6 @@ void AutomationPatternView::useTrackColor() -void AutomationPatternView::setColor( QColor new_color ) -{ - if( new_color.rgb() != m_pat->color() ) - { - m_pat->setColor( new_color ); - } - - m_pat->setUseStyleColor( false ); - Engine::getSong()->setModified(); - update(); -} - void AutomationPatternView::trackColorReset() { if( ! m_pat->useStyleColor() ) diff --git a/src/tracks/BBTrack.cpp b/src/tracks/BBTrack.cpp index 57dbf39737c..566c1a0a26f 100644 --- a/src/tracks/BBTrack.cpp +++ b/src/tracks/BBTrack.cpp @@ -160,8 +160,6 @@ BBTCOView::BBTCOView( TrackContentObject * _tco, TrackView * _tv ) : connect( _tco->getTrack(), SIGNAL( dataChanged() ), this, SLOT( update() ) ); - connect( _tco, SIGNAL( trackColorChanged( QColor & ) ), - this, SLOT( trackColorChanged( QColor & ) ) ); connect( _tco, SIGNAL( trackColorReset() ), this, SLOT( resetColor() ) ); @@ -347,7 +345,8 @@ void BBTCOView::useTrackColor() { if( m_bbTCO->getTrack()->useColor() ) { - setColor( m_bbTCO->getTrack()->backgroundColor() ); + QColor buffer = m_bbTCO->getTrack()->backgroundColor(); + setColor( buffer ); m_bbTCO->setUseStyleColor( false ); } else @@ -374,21 +373,6 @@ void BBTCOView::resetColor() -void BBTCOView::setColor( QColor new_color ) -{ - if( new_color.rgb() != m_bbTCO->color() ) - { - m_bbTCO->setColor( new_color ); - } - - m_bbTCO->setUseStyleColor( false ); - Engine::getSong()->setModified(); - update(); - - //BBTrack::setLastTCOColor( new_color ); -} - - void BBTCOView::update() { ToolTip::add(this, m_bbTCO->name()); diff --git a/src/tracks/Pattern.cpp b/src/tracks/Pattern.cpp index 5d5684408e8..46b5164bf16 100644 --- a/src/tracks/Pattern.cpp +++ b/src/tracks/Pattern.cpp @@ -599,8 +599,6 @@ PatternView::PatternView( Pattern* pattern, TrackView* parent ) : { connect( gui->pianoRoll(), SIGNAL( currentPatternChanged() ), this, SLOT( update() ) ); - connect( m_pat, SIGNAL( trackColorChanged( QColor & ) ), - this, SLOT( trackColorChanged( QColor & ) ) ); connect( m_pat, SIGNAL( trackColorReset() ), this, SLOT( trackColorReset() ) ); @@ -711,7 +709,8 @@ void PatternView::useTrackColor() { if( m_pat->getTrack()->useColor() ) { - setColor( m_pat->getTrack()->backgroundColor() ); + QColor buffer = m_pat->getTrack()->backgroundColor(); + setColor( buffer ); m_pat->setUseStyleColor( false ); } else @@ -724,19 +723,6 @@ void PatternView::useTrackColor() } - -void PatternView::setColor( QColor new_color ) -{ - // change color only if it is different - if( new_color.rgb() != m_pat->color() ) - { m_pat->setColor( new_color ); } - - // force TCO to use color - m_pat->setUseStyleColor( false ); - Engine::getSong()->setModified(); - update(); -} - void PatternView::trackColorReset() { if( ! m_pat->useStyleColor() ) @@ -747,27 +733,6 @@ void PatternView::trackColorReset() } } -void PatternView::trackColorChanged( QColor & c ) -{ - if( isSelected() ) - { - QVector selected = - gui->songEditor()->m_editor->selectedObjects(); - for( QVector::iterator it = - selected.begin(); - it != selected.end(); ++it ) - { - PatternView * pcov = dynamic_cast( *it ); - if( pcov ) - { - pcov->setColor( c ); - } - } - } - else - { setColor(c); } -} - void PatternView::constructContextMenu( QMenu * _cm ) { diff --git a/src/tracks/SampleTrack.cpp b/src/tracks/SampleTrack.cpp index df1eeadd5bf..0fb0d6c99f0 100644 --- a/src/tracks/SampleTrack.cpp +++ b/src/tracks/SampleTrack.cpp @@ -334,9 +334,6 @@ SampleTCOView::SampleTCOView( SampleTCO * _tco, TrackView * _tv ) : // track future changes of SampleTCO connect( m_tco, SIGNAL( sampleChanged() ), this, SLOT( updateSample() ) ); - - connect( m_tco, SIGNAL( trackColorChanged( QColor & ) ), - this, SLOT( trackColorChanged( QColor & ) ) ); connect( m_tco, SIGNAL( trackColorReset() ), this, SLOT( trackColorReset() ) ); @@ -634,7 +631,8 @@ void SampleTCOView::useTrackColor() { if( m_tco->getTrack()->useColor() ) { - setColor( m_tco->getTrack()->backgroundColor() ); + QColor buffer = m_tco->getTrack()->backgroundColor(); + setColor( buffer ); m_tco->setUseStyleColor( false ); } else @@ -648,18 +646,6 @@ void SampleTCOView::useTrackColor() -void SampleTCOView::setColor( QColor new_color ) -{ - if( new_color.rgb() != m_tco->color() ) - { - m_tco->setColor( new_color ); - } - - m_tco->setUseStyleColor( false ); - Engine::getSong()->setModified(); - update(); -} - void SampleTCOView::trackColorReset() { if( ! m_tco->useStyleColor() ) From ca9608c0377ca49b364a99cbe773641f402c1f64 Mon Sep 17 00:00:00 2001 From: adi Date: Mon, 27 Jul 2020 12:02:29 +0530 Subject: [PATCH 23/63] Remove redundant function --- include/AutomationPatternView.h | 1 - include/BBTrack.h | 1 - include/SampleTrack.h | 1 - src/gui/AutomationPatternView.cpp | 20 -------------------- src/tracks/BBTrack.cpp | 20 -------------------- src/tracks/SampleTrack.cpp | 21 --------------------- 6 files changed, 64 deletions(-) diff --git a/include/AutomationPatternView.h b/include/AutomationPatternView.h index 2c5b5a15fb4..421d13a38a1 100644 --- a/include/AutomationPatternView.h +++ b/include/AutomationPatternView.h @@ -58,7 +58,6 @@ protected slots: void changeClipColor(); void useTrackColor(); - void trackColorChanged( QColor & ); void trackColorReset(); protected: diff --git a/include/BBTrack.h b/include/BBTrack.h index cb6ec261021..bfd7befad04 100644 --- a/include/BBTrack.h +++ b/include/BBTrack.h @@ -81,7 +81,6 @@ protected slots: void changeClipColor(); void useTrackColor(); void resetColor(); - void trackColorChanged( QColor & c ); protected: diff --git a/include/SampleTrack.h b/include/SampleTrack.h index 4db2ffca229..5546062493a 100644 --- a/include/SampleTrack.h +++ b/include/SampleTrack.h @@ -112,7 +112,6 @@ public slots: void changeClipColor(); void useTrackColor(); - void trackColorChanged( QColor & ); void trackColorReset(); protected: diff --git a/src/gui/AutomationPatternView.cpp b/src/gui/AutomationPatternView.cpp index 21e9ffe7c94..b2878736652 100644 --- a/src/gui/AutomationPatternView.cpp +++ b/src/gui/AutomationPatternView.cpp @@ -221,26 +221,6 @@ void AutomationPatternView::trackColorReset() } } -void AutomationPatternView::trackColorChanged( QColor & c ) -{ - if( isSelected() ) - { - QVector selected = - gui->songEditor()->m_editor->selectedObjects(); - for( QVector::iterator it = - selected.begin(); - it != selected.end(); ++it ) - { - AutomationPatternView * apcov = dynamic_cast( *it ); - if( apcov ) - { - apcov->setColor( c ); - } - } - } - else - { setColor(c); } -} void AutomationPatternView::constructContextMenu( QMenu * _cm ) diff --git a/src/tracks/BBTrack.cpp b/src/tracks/BBTrack.cpp index 566c1a0a26f..44b138ad9ca 100644 --- a/src/tracks/BBTrack.cpp +++ b/src/tracks/BBTrack.cpp @@ -380,26 +380,6 @@ void BBTCOView::update() TrackContentObjectView::update(); } -void BBTCOView::trackColorChanged( QColor & c ) -{ - if( isSelected() ) - { - QVector selected = - gui->songEditor()->m_editor->selectedObjects(); - for( QVector::iterator it = - selected.begin(); - it != selected.end(); ++it ) - { - BBTCOView * bb_tcov = dynamic_cast( *it ); - if( bb_tcov ) - { - bb_tcov->setColor( c ); - } - } - } - else - { setColor(c); } -} QColor * BBTrack::s_lastTCOColor = NULL; diff --git a/src/tracks/SampleTrack.cpp b/src/tracks/SampleTrack.cpp index 0fb0d6c99f0..1df9e4b5f1d 100644 --- a/src/tracks/SampleTrack.cpp +++ b/src/tracks/SampleTrack.cpp @@ -656,27 +656,6 @@ void SampleTCOView::trackColorReset() } } -void SampleTCOView::trackColorChanged( QColor & c ) -{ - if( isSelected() ) - { - QVector selected = - gui->songEditor()->m_editor->selectedObjects(); - for( QVector::iterator it = - selected.begin(); - it != selected.end(); ++it ) - { - SampleTCOView * scov = dynamic_cast( *it ); - if( scov ) - { - scov->setColor( c ); - } - } - } - else - { setColor(c); } -} - From 3a3009648e23d613a5ec774469ee4d573a682cdd Mon Sep 17 00:00:00 2001 From: adi Date: Sun, 2 Aug 2020 14:17:44 +0530 Subject: [PATCH 24/63] Rename some functions --- include/Track.h | 16 ++++++------ src/core/AutomationPattern.cpp | 10 ++++---- src/core/Track.cpp | 24 +++++++++--------- src/gui/AutomationPatternView.cpp | 18 ++++++------- src/tracks/BBTrack.cpp | 42 +++++++++++++++---------------- src/tracks/Pattern.cpp | 30 +++++++++++----------- src/tracks/SampleTrack.cpp | 28 ++++++++++----------- 7 files changed, 84 insertions(+), 84 deletions(-) diff --git a/include/Track.h b/include/Track.h index 1a82638ba6f..cb588ed3f17 100644 --- a/include/Track.h +++ b/include/Track.h @@ -134,12 +134,12 @@ class LMMS_EXPORT TrackContentObject : public Model, public JournallingObject return m_autoResize; } - unsigned int color() const + unsigned int colorRgb() const { return( m_color.rgb() ); } - QColor colorObj() const + QColor color() const { return m_color; } @@ -154,22 +154,22 @@ class LMMS_EXPORT TrackContentObject : public Model, public JournallingObject m_color.setRgb( c ); } - void setUseStyleColor( bool b ) + void useStyleColor( bool b ) { m_useStyleColor = b; } - bool useStyleColor() + bool usesStyleColor() { return m_useStyleColor; } - bool useCustomClipColor() + void useCustomClipColor( bool b ); + + bool usesCustomClipColor() { return m_useCustomClipColor; } - - void setUseCustomClipColor( bool b ); virtual void movePosition( const MidiTime & pos ); virtual void changeLength( const MidiTime & length ); @@ -297,7 +297,7 @@ class TrackContentObjectView : public selectableObject, public ModelView QColor color() const { - return( m_tco->color() ); + return( m_tco->colorRgb() ); }; // access needsUpdate member variable diff --git a/src/core/AutomationPattern.cpp b/src/core/AutomationPattern.cpp index 08a68480483..75367f642f3 100644 --- a/src/core/AutomationPattern.cpp +++ b/src/core/AutomationPattern.cpp @@ -538,9 +538,9 @@ void AutomationPattern::saveSettings( QDomDocument & _doc, QDomElement & _this ) _this.setAttribute( "prog", QString::number( progressionType() ) ); _this.setAttribute( "tens", QString::number( getTension() ) ); _this.setAttribute( "mute", QString::number( isMuted() ) ); - _this.setAttribute( "stylecolor", useStyleColor() ); - _this.setAttribute( "clipcolor", useCustomClipColor() ); - _this.setAttribute( "color", color() ); + _this.setAttribute( "stylecolor", usesStyleColor() ); + _this.setAttribute( "clipcolor", usesCustomClipColor() ); + _this.setAttribute( "color", colorRgb() ); for( timeMap::const_iterator it = m_timeMap.begin(); it != m_timeMap.end(); ++it ) @@ -599,8 +599,8 @@ void AutomationPattern::loadSettings( const QDomElement & _this ) if( _this.hasAttribute( "stylecolor" ) ) { - setUseStyleColor( _this.attribute( "stylecolor" ).toInt() ); - setUseCustomClipColor( _this.attribute( "clipcolor" ).toInt() ); + useStyleColor( _this.attribute( "stylecolor" ).toInt() ); + useCustomClipColor( _this.attribute( "clipcolor" ).toInt() ); setColor( _this.attribute( "color" ).toUInt() ); } diff --git a/src/core/Track.cpp b/src/core/Track.cpp index 7c9d37759c2..219fa0f5baa 100644 --- a/src/core/Track.cpp +++ b/src/core/Track.cpp @@ -284,7 +284,7 @@ void TrackContentObject::resetColor() } -void TrackContentObject::setUseCustomClipColor( bool b ) +void TrackContentObject::useCustomClipColor( bool b ) { m_useCustomClipColor = b; b ? emit clipColorChanged( m_color ) : emit clipColorReset(); @@ -328,7 +328,7 @@ TrackContentObjectView::TrackContentObjectView( TrackContentObject * tco, m_gradient( true ), m_mouseHotspotHand( 0, 0 ), m_cursorSetYet( false ), - m_usesCustomSelectedColor( ! m_tco->useStyleColor() | m_tco->useCustomClipColor() ), + m_usesCustomSelectedColor( ! m_tco->usesStyleColor() | m_tco->usesCustomClipColor() ), m_needsUpdate( true ) { if( s_textFloat == NULL ) @@ -363,7 +363,7 @@ TrackContentObjectView::TrackContentObjectView( TrackContentObject * tco, if( m_usesCustomSelectedColor ) { - QColor tcoColor = m_tco->colorObj(); + QColor tcoColor = m_tco->color(); changeSelectedColor( tcoColor ); } @@ -617,11 +617,11 @@ void TrackContentObjectView::updatePosition() void TrackContentObjectView::setColor( QColor & new_color ) { // change color only if it is different - if( new_color.rgb() != m_tco->color() ) + if( new_color.rgb() != m_tco->colorRgb() ) { m_tco->setColor( new_color ); } // force TCO to use color - m_tco->setUseStyleColor( false ); + m_tco->useStyleColor( false ); Engine::getSong()->setModified(); update(); } @@ -704,13 +704,13 @@ void TrackContentObjectView::dropEvent( QDropEvent * de ) if( m_trackView->getTrack()->useColor() ) { - m_tco->setUseStyleColor( false ); - if( ! dynamic_cast( qwSource )->m_tco->useCustomClipColor() ) + m_tco->useStyleColor( false ); + if( ! dynamic_cast( qwSource )->m_tco->usesCustomClipColor() ) m_tco->setColor( m_trackView->getTrack()->backgroundColor() ); } else { - m_tco->setUseStyleColor( true ); + m_tco->useStyleColor( true ); } AutomationPattern::resolveAllIDs(); @@ -764,7 +764,7 @@ DataFile TrackContentObjectView::createTCODataFiles( tcoElement.setAttribute( "trackIndex", trackIndex ); tcoElement.setAttribute( "trackType", tcoTrack->type() ); tcoElement.setAttribute( "trackName", tcoTrack->name() ); - tcoElement.setAttribute( "clipColor", ( *it )->m_tco->useCustomClipColor() ); + tcoElement.setAttribute( "clipColor", ( *it )->m_tco->usesCustomClipColor() ); ( *it )->m_tco->saveState( dataFile, tcoElement ); tcoParent.appendChild( tcoElement ); } @@ -1773,14 +1773,14 @@ bool TrackContentWidget::pasteSelection( MidiTime tcoPos, QDropEvent * de ) if( t->useColor() ) { - tco->setUseStyleColor( false ); + tco->useStyleColor( false ); if( outerTCOElement.attributeNode( "clipColor" ).value() == "0" ) tco->setColor( t->backgroundColor() ); } else { - tco->setUseStyleColor( true ); + tco->useStyleColor( true ); } //check tco name, if the same as source track name dont copy @@ -2616,7 +2616,7 @@ void Track::loadSettings( const QDomElement & element ) TrackContentObject * Track::addTCO( TrackContentObject * tco ) { tco->setColor( m_backgroundColor ); - tco->setUseStyleColor( ! hasColor ); + tco->useStyleColor( ! hasColor ); m_trackContentObjects.push_back( tco ); diff --git a/src/gui/AutomationPatternView.cpp b/src/gui/AutomationPatternView.cpp index b2878736652..b4dab666b5f 100644 --- a/src/gui/AutomationPatternView.cpp +++ b/src/gui/AutomationPatternView.cpp @@ -170,7 +170,7 @@ void AutomationPatternView::flipX() void AutomationPatternView::changeClipColor() { - QColorDialog colorDialog( m_pat->colorObj() ); + QColorDialog colorDialog( m_pat->color() ); QColor buffer( 0, 0, 0 ); for( int i = 0; i < 48; i += 6 ) @@ -183,12 +183,12 @@ void AutomationPatternView::changeClipColor() } - QColor new_color = colorDialog.getColor( m_pat->colorObj() ); + QColor new_color = colorDialog.getColor( m_pat->color() ); if( ! new_color.isValid() ) { return; } setColor( new_color ); - m_pat->setUseCustomClipColor( true ); + m_pat->useCustomClipColor( true ); } @@ -198,14 +198,14 @@ void AutomationPatternView::useTrackColor() { QColor buffer = m_pat->getTrack()->backgroundColor(); setColor( buffer ); - m_pat->setUseStyleColor( false ); + m_pat->useStyleColor( false ); } else { - m_pat->setUseStyleColor( true ); + m_pat->useStyleColor( true ); } - m_pat->setUseCustomClipColor( false ); + m_pat->useCustomClipColor( false ); update(); } @@ -213,9 +213,9 @@ void AutomationPatternView::useTrackColor() void AutomationPatternView::trackColorReset() { - if( ! m_pat->useStyleColor() ) + if( ! m_pat->usesStyleColor() ) { - m_pat->setUseStyleColor( true ); + m_pat->useStyleColor( true ); Engine::getSong()->setModified(); update(); } @@ -322,7 +322,7 @@ void AutomationPatternView::paintEvent( QPaintEvent * ) // state: selected, muted, colored, normal c = isSelected() ? selectedColor() : ( muted ? mutedBackgroundColor() - : ( ! m_pat->useStyleColor() ? m_pat->colorObj() + : ( ! m_pat->usesStyleColor() ? m_pat->color() : painter.background().color() ) ); lingrad.setColorAt( 1, c.darker( 300 ) ); diff --git a/src/tracks/BBTrack.cpp b/src/tracks/BBTrack.cpp index 44b138ad9ca..4b1bea88e19 100644 --- a/src/tracks/BBTrack.cpp +++ b/src/tracks/BBTrack.cpp @@ -72,9 +72,9 @@ void BBTCO::saveSettings( QDomDocument & doc, QDomElement & element ) } element.setAttribute( "len", length() ); element.setAttribute( "muted", isMuted() ); - element.setAttribute( "color", color() ); - element.setAttribute( "stylecolor", useStyleColor() ); - element.setAttribute( "clipcolor", useCustomClipColor() ); + element.setAttribute( "color", colorRgb() ); + element.setAttribute( "stylecolor", usesStyleColor() ); + element.setAttribute( "clipcolor", usesCustomClipColor() ); } @@ -98,8 +98,8 @@ void BBTCO::loadSettings( const QDomElement & element ) { QColor loadedColor; loadedColor.setRgb( element.attribute( "color" ).toUInt() ); - setUseStyleColor( element.attribute( "stylecolor" ).toUInt() ); - setUseCustomClipColor( element.attribute( "clipcolor" ).toUInt() ); + useStyleColor( element.attribute( "stylecolor" ).toUInt() ); + useCustomClipColor( element.attribute( "clipcolor" ).toUInt() ); setColor( loadedColor ); } @@ -114,22 +114,22 @@ void BBTCO::loadSettings( const QDomElement & element ) { if( element.attribute( "usestyle" ).toUInt() == 1 ) { - setUseStyleColor( true ); + useStyleColor( true ); } else { - setUseStyleColor( false ); + useStyleColor( false ); } } else { - if( color() == qRgb( 128, 182, 175 ) || color() == qRgb( 64, 128, 255 ) ) // old or older default color + if( colorRgb() == qRgb( 128, 182, 175 ) || colorRgb() == qRgb( 64, 128, 255 ) ) // old or older default color { - setUseStyleColor( true ); + useStyleColor( true ); } else { - setUseStyleColor( false ); + useStyleColor( false ); } } } @@ -223,8 +223,8 @@ void BBTCOView::paintEvent( QPaintEvent * ) // state: selected, muted, default, colored c = isSelected() ? selectedColor() : ( muted ? mutedBackgroundColor() - : ( m_bbTCO->useStyleColor() ? painter.background().color() - : m_bbTCO->colorObj() ) ); + : ( m_bbTCO->usesStyleColor() ? painter.background().color() + : m_bbTCO->color() ) ); lingrad.setColorAt( 0, c.lighter( 130 ) ); lingrad.setColorAt( 1, c.lighter( 70 ) ); @@ -319,7 +319,7 @@ void BBTCOView::changeName() void BBTCOView::changeClipColor() { - QColorDialog colorDialog( m_bbTCO->colorObj() ); + QColorDialog colorDialog( m_bbTCO->color() ); QColor buffer( 0, 0, 0 ); for( int i = 0; i < 48; i += 6 ) @@ -332,12 +332,12 @@ void BBTCOView::changeClipColor() } - QColor new_color = colorDialog.getColor( m_bbTCO->colorObj() ); + QColor new_color = colorDialog.getColor( m_bbTCO->color() ); if( ! new_color.isValid() ) { return; } setColor( new_color ); - m_bbTCO->setUseCustomClipColor( true ); + m_bbTCO->useCustomClipColor( true ); } @@ -347,14 +347,14 @@ void BBTCOView::useTrackColor() { QColor buffer = m_bbTCO->getTrack()->backgroundColor(); setColor( buffer ); - m_bbTCO->setUseStyleColor( false ); + m_bbTCO->useStyleColor( false ); } else { - m_bbTCO->setUseStyleColor( true ); + m_bbTCO->useStyleColor( true ); } - m_bbTCO->setUseCustomClipColor( false ); + m_bbTCO->useCustomClipColor( false ); update(); } @@ -362,9 +362,9 @@ void BBTCOView::useTrackColor() /** \brief Makes the BB pattern use the colour defined in the stylesheet */ void BBTCOView::resetColor() { - if( ! m_bbTCO->useStyleColor() ) + if( ! m_bbTCO->usesStyleColor() ) { - m_bbTCO->setUseStyleColor( true ); + m_bbTCO->useStyleColor( true ); Engine::getSong()->setModified(); update(); } @@ -487,7 +487,7 @@ TrackContentObject * BBTrack::createTCO( const MidiTime & _pos ) if( s_lastTCOColor ) { bbtco->setColor( *s_lastTCOColor ); - bbtco->setUseStyleColor( false ); + bbtco->useStyleColor( false ); } return bbtco; } diff --git a/src/tracks/Pattern.cpp b/src/tracks/Pattern.cpp index 46b5164bf16..6a568814fa3 100644 --- a/src/tracks/Pattern.cpp +++ b/src/tracks/Pattern.cpp @@ -361,9 +361,9 @@ void Pattern::saveSettings( QDomDocument & _doc, QDomElement & _this ) { _this.setAttribute( "type", m_patternType ); _this.setAttribute( "name", name() ); - _this.setAttribute( "stylecolor", useStyleColor() ); - _this.setAttribute( "clipcolor", useCustomClipColor() ); - _this.setAttribute( "color", color() ); + _this.setAttribute( "stylecolor", usesStyleColor() ); + _this.setAttribute( "clipcolor", usesCustomClipColor() ); + _this.setAttribute( "color", colorRgb() ); // as the target of copied/dragged pattern is always an existing // pattern, we must not store actual position, instead we store -1 // which tells loadSettings() not to mess around with position @@ -398,8 +398,8 @@ void Pattern::loadSettings( const QDomElement & _this ) if( _this.hasAttribute( "stylecolor" ) ) { - setUseStyleColor( _this.attribute( "stylecolor" ).toInt() ); - setUseCustomClipColor( _this.attribute( "clipcolor" ).toInt() ); + useStyleColor( _this.attribute( "stylecolor" ).toInt() ); + useCustomClipColor( _this.attribute( "clipcolor" ).toInt() ); setColorRgb( _this.attribute( "color" ).toUInt() ); } @@ -683,7 +683,7 @@ void PatternView::changeName() void PatternView::changeClipColor() { - QColorDialog colorDialog( m_pat->colorObj() ); + QColorDialog colorDialog( m_pat->color() ); QColor buffer( 0, 0, 0 ); for( int i = 0; i < 48; i += 6 ) @@ -696,12 +696,12 @@ void PatternView::changeClipColor() } - QColor new_color = colorDialog.getColor( m_pat->colorObj() ); + QColor new_color = colorDialog.getColor( m_pat->color() ); if( ! new_color.isValid() ) { return; } setColor( new_color ); - m_pat->setUseCustomClipColor( true ); + m_pat->useCustomClipColor( true ); } @@ -711,23 +711,23 @@ void PatternView::useTrackColor() { QColor buffer = m_pat->getTrack()->backgroundColor(); setColor( buffer ); - m_pat->setUseStyleColor( false ); + m_pat->useStyleColor( false ); } else { - m_pat->setUseStyleColor( true ); + m_pat->useStyleColor( true ); } - m_pat->setUseCustomClipColor( false ); + m_pat->useCustomClipColor( false ); update(); } void PatternView::trackColorReset() { - if( ! m_pat->useStyleColor() ) + if( ! m_pat->usesStyleColor() ) { - m_pat->setUseStyleColor( true ); + m_pat->useStyleColor( true ); Engine::getSong()->setModified(); update(); } @@ -936,10 +936,10 @@ void PatternView::paintEvent( QPaintEvent * ) bool beatPattern = m_pat->m_patternType == Pattern::BeatPattern; // state: selected, normal, beat pattern, muted, colored - QColor c = isSelected() ? selectedColor() : ( ( !muted && m_pat->useStyleColor() && !beatPattern ) + QColor c = isSelected() ? selectedColor() : ( ( !muted && m_pat->usesStyleColor() && !beatPattern ) ? painter.background().color() : ( beatPattern ? BBPatternBackground() : ( muted - ? mutedBackgroundColor() : m_pat->colorObj() ) ) ); + ? mutedBackgroundColor() : m_pat->color() ) ) ); // invert the gradient for the background in the B&B editor QLinearGradient lingrad( 0, 0, 0, height() ); diff --git a/src/tracks/SampleTrack.cpp b/src/tracks/SampleTrack.cpp index 3a4050a0abb..6c100c381cb 100644 --- a/src/tracks/SampleTrack.cpp +++ b/src/tracks/SampleTrack.cpp @@ -277,9 +277,9 @@ void SampleTCO::saveSettings( QDomDocument & _doc, QDomElement & _this ) } _this.setAttribute( "sample_rate", m_sampleBuffer->sampleRate()); - _this.setAttribute( "stylecolor", useStyleColor() ); - _this.setAttribute( "clipcolor", useCustomClipColor() ); - _this.setAttribute( "color", color() ); + _this.setAttribute( "stylecolor", usesStyleColor() ); + _this.setAttribute( "clipcolor", usesCustomClipColor() ); + _this.setAttribute( "color", colorRgb() ); // TODO: start- and end-frame } @@ -307,8 +307,8 @@ void SampleTCO::loadSettings( const QDomElement & _this ) if( _this.hasAttribute( "stylecolor" ) ) { - setUseStyleColor( _this.attribute( "stylecolor" ).toInt() ); - setUseCustomClipColor( _this.attribute( "clipcolor" ).toInt() ); + useStyleColor( _this.attribute( "stylecolor" ).toInt() ); + useCustomClipColor( _this.attribute( "clipcolor" ).toInt() ); setColor( _this.attribute( "color" ).toUInt() ); } } @@ -523,7 +523,7 @@ void SampleTCOView::paintEvent( QPaintEvent * pe ) // state: selected, muted, colored, normal c = isSelected() ? selectedColor() : ( muted ? mutedBackgroundColor() - : ( ! m_tco->useStyleColor() ? m_tco->colorObj() + : ( ! m_tco->usesStyleColor() ? m_tco->color() : painter.background().color() ) ); lingrad.setColorAt( 1, c.darker( 300 ) ); @@ -605,7 +605,7 @@ void SampleTCOView::paintEvent( QPaintEvent * pe ) void SampleTCOView::changeClipColor() { - QColorDialog colorDialog( m_tco->colorObj() ); + QColorDialog colorDialog( m_tco->color() ); QColor buffer( 0, 0, 0 ); for( int i = 0; i < 48; i += 6 ) @@ -618,12 +618,12 @@ void SampleTCOView::changeClipColor() } - QColor new_color = colorDialog.getColor( m_tco->colorObj() ); + QColor new_color = colorDialog.getColor( m_tco->color() ); if( ! new_color.isValid() ) { return; } setColor( new_color ); - m_tco->setUseCustomClipColor( true ); + m_tco->useCustomClipColor( true ); } @@ -633,14 +633,14 @@ void SampleTCOView::useTrackColor() { QColor buffer = m_tco->getTrack()->backgroundColor(); setColor( buffer ); - m_tco->setUseStyleColor( false ); + m_tco->useStyleColor( false ); } else { - m_tco->setUseStyleColor( true ); + m_tco->useStyleColor( true ); } - m_tco->setUseCustomClipColor( false ); + m_tco->useCustomClipColor( false ); update(); } @@ -648,9 +648,9 @@ void SampleTCOView::useTrackColor() void SampleTCOView::trackColorReset() { - if( ! m_tco->useStyleColor() ) + if( ! m_tco->usesStyleColor() ) { - m_tco->setUseStyleColor( true ); + m_tco->useStyleColor( true ); Engine::getSong()->setModified(); update(); } From 9293a15e7e061de5e47c871e1dc4b27bf00651cb Mon Sep 17 00:00:00 2001 From: adi Date: Mon, 10 Aug 2020 12:37:54 +0530 Subject: [PATCH 25/63] Migrate duplicates to superclass --- include/AutomationPatternView.h | 4 --- include/BBTrack.h | 3 -- include/Pattern.h | 5 --- include/SampleTrack.h | 4 --- include/Track.h | 4 +++ src/core/Track.cpp | 57 +++++++++++++++++++++++++++++ src/gui/AutomationPatternView.cpp | 54 ---------------------------- src/tracks/BBTrack.cpp | 59 +------------------------------ src/tracks/Pattern.cpp | 53 --------------------------- src/tracks/SampleTrack.cpp | 54 ---------------------------- 10 files changed, 62 insertions(+), 235 deletions(-) diff --git a/include/AutomationPatternView.h b/include/AutomationPatternView.h index 421d13a38a1..059f0d4aa63 100644 --- a/include/AutomationPatternView.h +++ b/include/AutomationPatternView.h @@ -55,10 +55,6 @@ protected slots: void toggleRecording(); void flipY(); void flipX(); - - void changeClipColor(); - void useTrackColor(); - void trackColorReset(); protected: void constructContextMenu( QMenu * ) override; diff --git a/include/BBTrack.h b/include/BBTrack.h index bfd7befad04..c952dcfe120 100644 --- a/include/BBTrack.h +++ b/include/BBTrack.h @@ -78,9 +78,6 @@ protected slots: void openInBBEditor(); void resetName(); void changeName(); - void changeClipColor(); - void useTrackColor(); - void resetColor(); protected: diff --git a/include/Pattern.h b/include/Pattern.h index 1558bf97561..57361cc71b8 100644 --- a/include/Pattern.h +++ b/include/Pattern.h @@ -190,13 +190,8 @@ public slots: protected slots: void openInPianoRoll(); void setGhostInPianoRoll(); - void resetName(); void changeName(); - - void changeClipColor(); - void useTrackColor(); - void trackColorReset(); protected: diff --git a/include/SampleTrack.h b/include/SampleTrack.h index 5546062493a..cf8e1f49390 100644 --- a/include/SampleTrack.h +++ b/include/SampleTrack.h @@ -110,10 +110,6 @@ class SampleTCOView : public TrackContentObjectView public slots: void updateSample(); - void changeClipColor(); - void useTrackColor(); - void trackColorReset(); - protected: void contextMenuEvent( QContextMenuEvent * _cme ) override; void mousePressEvent( QMouseEvent * _me ) override; diff --git a/include/Track.h b/include/Track.h index cb588ed3f17..f3771519370 100644 --- a/include/Track.h +++ b/include/Track.h @@ -312,6 +312,10 @@ public slots: void changeSelectedColor( QColor & ); void disableSelectedColor(); void disableClipSelectedColor(); + + void changeClipColor(); + void useTrackColor(); + void trackColorReset(); void setColor( QColor & ); protected: diff --git a/src/core/Track.cpp b/src/core/Track.cpp index 219fa0f5baa..bb6df43c57a 100644 --- a/src/core/Track.cpp +++ b/src/core/Track.cpp @@ -614,6 +614,63 @@ void TrackContentObjectView::updatePosition() + +void TrackContentObjectView::changeClipColor() +{ + QColorDialog colorDialog( m_tco->color() ); + QColor buffer( 0, 0, 0 ); + + for( int i = 0; i < 48; i += 6 ) + { + for( int j = 0; j < 6; j++ ) + { + buffer.setHsl( qMax( 0, 44 * ( i / 6 ) - 1 ), 150 - 20 * j, 150 - 10 * j ); + colorDialog.setStandardColor( i + j, buffer ); + } + + } + + QColor new_color = colorDialog.getColor( m_tco->color() ); + if( ! new_color.isValid() ) + { return; } + + setColor( new_color ); + m_tco->useCustomClipColor( true ); +} + + + +void TrackContentObjectView::useTrackColor() +{ + if( m_tco->getTrack()->useColor() ) + { + QColor buffer = m_tco->getTrack()->backgroundColor(); + setColor( buffer ); + m_tco->useStyleColor( false ); + } + else + { + m_tco->useStyleColor( true ); + } + + m_tco->useCustomClipColor( false ); + update(); +} + + + +void TrackContentObjectView::trackColorReset() +{ + if( ! m_tco->usesStyleColor() ) + { + m_tco->useStyleColor( true ); + Engine::getSong()->setModified(); + update(); + } +} + + + void TrackContentObjectView::setColor( QColor & new_color ) { // change color only if it is different diff --git a/src/gui/AutomationPatternView.cpp b/src/gui/AutomationPatternView.cpp index b4dab666b5f..4c173d70a2d 100644 --- a/src/gui/AutomationPatternView.cpp +++ b/src/gui/AutomationPatternView.cpp @@ -168,60 +168,6 @@ void AutomationPatternView::flipX() } -void AutomationPatternView::changeClipColor() -{ - QColorDialog colorDialog( m_pat->color() ); - QColor buffer( 0, 0, 0 ); - - for( int i = 0; i < 48; i += 6 ) - { - for( int j = 0; j < 6; j++ ) - { - buffer.setHsl( qMax( 0, 44 * ( i / 6 ) - 1 ), 150 - 20 * j, 150 - 10 * j ); - colorDialog.setStandardColor( i + j, buffer ); - } - - } - - QColor new_color = colorDialog.getColor( m_pat->color() ); - if( ! new_color.isValid() ) - { return; } - - setColor( new_color ); - m_pat->useCustomClipColor( true ); -} - - -void AutomationPatternView::useTrackColor() -{ - if( m_pat->getTrack()->useColor() ) - { - QColor buffer = m_pat->getTrack()->backgroundColor(); - setColor( buffer ); - m_pat->useStyleColor( false ); - } - else - { - m_pat->useStyleColor( true ); - } - - m_pat->useCustomClipColor( false ); - update(); -} - - - -void AutomationPatternView::trackColorReset() -{ - if( ! m_pat->usesStyleColor() ) - { - m_pat->useStyleColor( true ); - Engine::getSong()->setModified(); - update(); - } -} - - void AutomationPatternView::constructContextMenu( QMenu * _cm ) { diff --git a/src/tracks/BBTrack.cpp b/src/tracks/BBTrack.cpp index 4b1bea88e19..03b2bdec77d 100644 --- a/src/tracks/BBTrack.cpp +++ b/src/tracks/BBTrack.cpp @@ -161,7 +161,7 @@ BBTCOView::BBTCOView( TrackContentObject * _tco, TrackView * _tv ) : this, SLOT( update() ) ); connect( _tco, SIGNAL( trackColorReset() ), - this, SLOT( resetColor() ) ); + this, SLOT( trackColorReset() ) ); setStyle( QApplication::style() ); } @@ -316,63 +316,6 @@ void BBTCOView::changeName() - -void BBTCOView::changeClipColor() -{ - QColorDialog colorDialog( m_bbTCO->color() ); - QColor buffer( 0, 0, 0 ); - - for( int i = 0; i < 48; i += 6 ) - { - for( int j = 0; j < 6; j++ ) - { - buffer.setHsl( qMax( 0, 44 * ( i / 6 ) - 1 ), 150 - 20 * j, 150 - 10 * j ); - colorDialog.setStandardColor( i + j, buffer ); - } - - } - - QColor new_color = colorDialog.getColor( m_bbTCO->color() ); - if( ! new_color.isValid() ) - { return; } - - setColor( new_color ); - m_bbTCO->useCustomClipColor( true ); -} - - -void BBTCOView::useTrackColor() -{ - if( m_bbTCO->getTrack()->useColor() ) - { - QColor buffer = m_bbTCO->getTrack()->backgroundColor(); - setColor( buffer ); - m_bbTCO->useStyleColor( false ); - } - else - { - m_bbTCO->useStyleColor( true ); - } - - m_bbTCO->useCustomClipColor( false ); - update(); -} - - -/** \brief Makes the BB pattern use the colour defined in the stylesheet */ -void BBTCOView::resetColor() -{ - if( ! m_bbTCO->usesStyleColor() ) - { - m_bbTCO->useStyleColor( true ); - Engine::getSong()->setModified(); - update(); - } - //BBTrack::clearLastTCOColor(); -} - - - void BBTCOView::update() { ToolTip::add(this, m_bbTCO->name()); diff --git a/src/tracks/Pattern.cpp b/src/tracks/Pattern.cpp index 6a568814fa3..0a18a47d92e 100644 --- a/src/tracks/Pattern.cpp +++ b/src/tracks/Pattern.cpp @@ -681,59 +681,6 @@ void PatternView::changeName() } -void PatternView::changeClipColor() -{ - QColorDialog colorDialog( m_pat->color() ); - QColor buffer( 0, 0, 0 ); - - for( int i = 0; i < 48; i += 6 ) - { - for( int j = 0; j < 6; j++ ) - { - buffer.setHsl( qMax( 0, 44 * ( i / 6 ) - 1 ), 150 - 20 * j, 150 - 10 * j ); - colorDialog.setStandardColor( i + j, buffer ); - } - - } - - QColor new_color = colorDialog.getColor( m_pat->color() ); - if( ! new_color.isValid() ) - { return; } - - setColor( new_color ); - m_pat->useCustomClipColor( true ); -} - - -void PatternView::useTrackColor() -{ - if( m_pat->getTrack()->useColor() ) - { - QColor buffer = m_pat->getTrack()->backgroundColor(); - setColor( buffer ); - m_pat->useStyleColor( false ); - } - else - { - m_pat->useStyleColor( true ); - } - - m_pat->useCustomClipColor( false ); - update(); -} - - -void PatternView::trackColorReset() -{ - if( ! m_pat->usesStyleColor() ) - { - m_pat->useStyleColor( true ); - Engine::getSong()->setModified(); - update(); - } -} - - void PatternView::constructContextMenu( QMenu * _cm ) { QAction * a = new QAction( embed::getIconPixmap( "piano" ), diff --git a/src/tracks/SampleTrack.cpp b/src/tracks/SampleTrack.cpp index 6c100c381cb..aeba51ee91d 100644 --- a/src/tracks/SampleTrack.cpp +++ b/src/tracks/SampleTrack.cpp @@ -603,60 +603,6 @@ void SampleTCOView::paintEvent( QPaintEvent * pe ) } -void SampleTCOView::changeClipColor() -{ - QColorDialog colorDialog( m_tco->color() ); - QColor buffer( 0, 0, 0 ); - - for( int i = 0; i < 48; i += 6 ) - { - for( int j = 0; j < 6; j++ ) - { - buffer.setHsl( qMax( 0, 44 * ( i / 6 ) - 1 ), 150 - 20 * j, 150 - 10 * j ); - colorDialog.setStandardColor( i + j, buffer ); - } - - } - - QColor new_color = colorDialog.getColor( m_tco->color() ); - if( ! new_color.isValid() ) - { return; } - - setColor( new_color ); - m_tco->useCustomClipColor( true ); -} - - -void SampleTCOView::useTrackColor() -{ - if( m_tco->getTrack()->useColor() ) - { - QColor buffer = m_tco->getTrack()->backgroundColor(); - setColor( buffer ); - m_tco->useStyleColor( false ); - } - else - { - m_tco->useStyleColor( true ); - } - - m_tco->useCustomClipColor( false ); - update(); -} - - - -void SampleTCOView::trackColorReset() -{ - if( ! m_tco->usesStyleColor() ) - { - m_tco->useStyleColor( true ); - Engine::getSong()->setModified(); - update(); - } -} - - SampleTrack::SampleTrack(TrackContainer* tc) : From 2eab5dfa4f072ce23e3d9e33f47b9dd6c5188cc7 Mon Sep 17 00:00:00 2001 From: adi Date: Fri, 14 Aug 2020 08:37:26 +0530 Subject: [PATCH 26/63] Use ColorChooser and reorder some includes --- src/core/Track.cpp | 48 +++---------------------------- src/gui/AutomationPatternView.cpp | 1 - src/tracks/BBTrack.cpp | 3 +- src/tracks/Pattern.cpp | 15 +++++----- src/tracks/SampleTrack.cpp | 1 - 5 files changed, 12 insertions(+), 56 deletions(-) diff --git a/src/core/Track.cpp b/src/core/Track.cpp index 9b4f95843bb..697ffd71e30 100644 --- a/src/core/Track.cpp +++ b/src/core/Track.cpp @@ -41,7 +41,6 @@ #include #include -#include #include #include #include @@ -59,6 +58,7 @@ #include "BBTrackContainer.h" #include "ConfigManager.h" #include "Clipboard.h" +#include "ColorChooser.h" #include "embed.h" #include "Engine.h" #include "GuiApplication.h" @@ -618,20 +618,7 @@ void TrackContentObjectView::updatePosition() void TrackContentObjectView::changeClipColor() { - QColorDialog colorDialog( m_tco->color() ); - QColor buffer( 0, 0, 0 ); - - for( int i = 0; i < 48; i += 6 ) - { - for( int j = 0; j < 6; j++ ) - { - buffer.setHsl( qMax( 0, 44 * ( i / 6 ) - 1 ), 150 - 20 * j, 150 - 10 * j ); - colorDialog.setStandardColor( i + j, buffer ); - } - - } - - QColor new_color = colorDialog.getColor( m_tco->color() ); + QColor new_color = ColorChooser( this ).withPalette( ColorChooser::Palette::Track )->getColor( m_tco->color() ); if( ! new_color.isValid() ) { return; } @@ -2457,20 +2444,7 @@ QColor TrackOperationsWidget::backgroundColor() void TrackOperationsWidget::changeTrackColor() { - QColorDialog colorDialog( m_backgroundColor ); - QColor buffer( 0, 0, 0 ); - - for( int i = 0; i < 48; i += 6 ) - { - for( int j = 0; j < 6; j++ ) - { - buffer.setHsl( qMax( 0, 44 * ( i / 6 ) - 1 ), 150 - 20 * j, 150 - 10 * j ); - colorDialog.setStandardColor( i + j, buffer ); - } - - } - - QColor new_color = colorDialog.getColor( m_backgroundColor ); + QColor new_color = ColorChooser( this ).withPalette( ColorChooser::Palette::Track )->getColor( m_backgroundColor ); if( ! new_color.isValid() ) { return; } @@ -2489,21 +2463,7 @@ void TrackOperationsWidget::resetTrackColor() void TrackOperationsWidget::randomTrackColor() { - int index = rand() % 48; - QColor buffer( 0, 0, 0 ); - - for( int i = 0; i < 48; i += 6 ) - { - for( int j = 0; j < 6; j++ ) - { - if( i + j + 1 == index ) - { - buffer.setHsl( qMax( 0, 44 * ( i / 6 ) - 1 ), 150 - 20 * j, 150 - 10 * j ); - break; - } - } - - } + QColor buffer = ColorChooser::getPalette( ColorChooser::Palette::Track )[ rand() % 48 ]; m_backgroundColor = buffer; emit colorChanged( m_backgroundColor ); diff --git a/src/gui/AutomationPatternView.cpp b/src/gui/AutomationPatternView.cpp index 4c173d70a2d..2262b83067a 100644 --- a/src/gui/AutomationPatternView.cpp +++ b/src/gui/AutomationPatternView.cpp @@ -23,7 +23,6 @@ */ #include "AutomationPatternView.h" -#include #include #include #include diff --git a/src/tracks/BBTrack.cpp b/src/tracks/BBTrack.cpp index 03b2bdec77d..d14adc4650a 100644 --- a/src/tracks/BBTrack.cpp +++ b/src/tracks/BBTrack.cpp @@ -23,7 +23,6 @@ */ #include "BBTrack.h" -#include #include #include @@ -32,8 +31,8 @@ #include "embed.h" #include "Engine.h" #include "gui_templates.h" -#include "MainWindow.h" #include "GuiApplication.h" +#include "MainWindow.h" #include "Mixer.h" #include "RenameDialog.h" #include "Song.h" diff --git a/src/tracks/Pattern.cpp b/src/tracks/Pattern.cpp index 0a18a47d92e..5e10435fca7 100644 --- a/src/tracks/Pattern.cpp +++ b/src/tracks/Pattern.cpp @@ -24,25 +24,24 @@ */ #include "Pattern.h" -#include -#include #include #include #include #include +#include -#include "InstrumentTrack.h" -#include "gui_templates.h" +#include "AudioSampleRecorder.h" +#include "BBTrackContainer.h" #include "embed.h" +#include "gui_templates.h" #include "GuiApplication.h" +#include "InstrumentTrack.h" +#include "MainWindow.h" #include "PianoRoll.h" #include "RenameDialog.h" #include "SampleBuffer.h" -#include "AudioSampleRecorder.h" -#include "BBTrackContainer.h" -#include "StringPairDrag.h" -#include "MainWindow.h" #include "SongEditor.h" +#include "StringPairDrag.h" #include diff --git a/src/tracks/SampleTrack.cpp b/src/tracks/SampleTrack.cpp index e7710ccdb26..283b5be99a5 100644 --- a/src/tracks/SampleTrack.cpp +++ b/src/tracks/SampleTrack.cpp @@ -24,7 +24,6 @@ */ #include "SampleTrack.h" -#include #include #include #include From cc453d8d64197ca3541e6622f21bc2abf072a85c Mon Sep 17 00:00:00 2001 From: adi Date: Fri, 14 Aug 2020 09:21:40 +0530 Subject: [PATCH 27/63] Change how colors are saved --- src/core/AutomationPattern.cpp | 22 ++++++++++++++-------- src/core/Track.cpp | 18 ++++-------------- src/tracks/BBTrack.cpp | 21 ++++++++++++--------- src/tracks/Pattern.cpp | 21 ++++++++++++++------- src/tracks/SampleTrack.cpp | 19 ++++++++++++------- 5 files changed, 56 insertions(+), 45 deletions(-) diff --git a/src/core/AutomationPattern.cpp b/src/core/AutomationPattern.cpp index 75367f642f3..f3f5be9d8b3 100644 --- a/src/core/AutomationPattern.cpp +++ b/src/core/AutomationPattern.cpp @@ -538,9 +538,12 @@ void AutomationPattern::saveSettings( QDomDocument & _doc, QDomElement & _this ) _this.setAttribute( "prog", QString::number( progressionType() ) ); _this.setAttribute( "tens", QString::number( getTension() ) ); _this.setAttribute( "mute", QString::number( isMuted() ) ); - _this.setAttribute( "stylecolor", usesStyleColor() ); - _this.setAttribute( "clipcolor", usesCustomClipColor() ); - _this.setAttribute( "color", colorRgb() ); + + if( ! usesStyleColor() ) + { + _this.setAttribute( "color", color().name() ); + _this.setAttribute( "isclipcolor", usesCustomClipColor() ); + } for( timeMap::const_iterator it = m_timeMap.begin(); it != m_timeMap.end(); ++it ) @@ -597,11 +600,14 @@ void AutomationPattern::loadSettings( const QDomElement & _this ) } } - if( _this.hasAttribute( "stylecolor" ) ) - { - useStyleColor( _this.attribute( "stylecolor" ).toInt() ); - useCustomClipColor( _this.attribute( "clipcolor" ).toInt() ); - setColor( _this.attribute( "color" ).toUInt() ); + if( _this.hasAttribute( "color" ) ) + { + useStyleColor( false ); + useCustomClipColor( _this.attribute( "isclipcolor" ).toInt() ); + + QColor loadedColor; + loadedColor.setNamedColor( _this.attribute( "color" ) ); + setColor( loadedColor ); } int len = _this.attribute( "len" ).toInt(); diff --git a/src/core/Track.cpp b/src/core/Track.cpp index 697ffd71e30..463126d1327 100644 --- a/src/core/Track.cpp +++ b/src/core/Track.cpp @@ -2738,12 +2738,7 @@ void Track::saveSettings( QDomDocument & doc, QDomElement & element ) if( hasColor ) { - element.setAttribute( "trackbgcolor", m_backgroundColor.rgb() ); - element.setAttribute( "hascolor", 1 ); - } - else - { - element.setAttribute( "hascolor", 0 ); + element.setAttribute( "trackbgcolor", m_backgroundColor.name() ); } QDomElement tsDe = doc.createElement( nodeName() ); @@ -2798,15 +2793,10 @@ void Track::loadSettings( const QDomElement & element ) // Older project files that didn't have this attribute will set the value to false (issue 5562) m_mutedBeforeSolo = QVariant( element.attribute( "mutedBeforeSolo", "0" ) ).toBool(); - if( element.hasAttribute( "hascolor" ) ) + if( element.hasAttribute( "trackbgcolor" ) ) { - unsigned int loadedHasColor = element.attribute( "hascolor" ).toUInt(); - if( loadedHasColor == 1 ) - { - unsigned int loadedColor = element.attribute( "trackbgcolor" ).toUInt(); - m_backgroundColor.setRgba( loadedColor ); - hasColor = true; - } + m_backgroundColor.setNamedColor( element.attribute( "trackbgcolor" ) ); + hasColor = true; } if( m_simpleSerializingMode ) diff --git a/src/tracks/BBTrack.cpp b/src/tracks/BBTrack.cpp index d14adc4650a..5b1c07b71d0 100644 --- a/src/tracks/BBTrack.cpp +++ b/src/tracks/BBTrack.cpp @@ -71,9 +71,11 @@ void BBTCO::saveSettings( QDomDocument & doc, QDomElement & element ) } element.setAttribute( "len", length() ); element.setAttribute( "muted", isMuted() ); - element.setAttribute( "color", colorRgb() ); - element.setAttribute( "stylecolor", usesStyleColor() ); - element.setAttribute( "clipcolor", usesCustomClipColor() ); + if( ! usesStyleColor() ) + { + element.setAttribute( "color", color().name() ); + element.setAttribute( "isclipcolor", usesCustomClipColor() ); + } } @@ -92,17 +94,18 @@ void BBTCO::loadSettings( const QDomElement & element ) toggleMute(); } - // for files saved in 1.3-onwards - if( element.hasAttribute( "stylecolor" ) ) + // for colors saved in 1.3-onwards + if( element.hasAttribute( "isclipcolor" ) ) { + useStyleColor( false ); + useCustomClipColor( element.attribute( "isclipcolor" ).toInt() ); + QColor loadedColor; - loadedColor.setRgb( element.attribute( "color" ).toUInt() ); - useStyleColor( element.attribute( "stylecolor" ).toUInt() ); - useCustomClipColor( element.attribute( "clipcolor" ).toUInt() ); + loadedColor.setNamedColor( element.attribute( "color" ) ); setColor( loadedColor ); } - // for files saved before 1.3 + // for colors saved before 1.3 else { if( element.hasAttribute( "color" ) ) diff --git a/src/tracks/Pattern.cpp b/src/tracks/Pattern.cpp index 5e10435fca7..eeb3229749f 100644 --- a/src/tracks/Pattern.cpp +++ b/src/tracks/Pattern.cpp @@ -360,9 +360,13 @@ void Pattern::saveSettings( QDomDocument & _doc, QDomElement & _this ) { _this.setAttribute( "type", m_patternType ); _this.setAttribute( "name", name() ); - _this.setAttribute( "stylecolor", usesStyleColor() ); - _this.setAttribute( "clipcolor", usesCustomClipColor() ); - _this.setAttribute( "color", colorRgb() ); + + if( ! usesStyleColor() ) + { + + _this.setAttribute( "color", color().name() ); + _this.setAttribute( "isclipcolor", usesCustomClipColor() ); + } // as the target of copied/dragged pattern is always an existing // pattern, we must not store actual position, instead we store -1 // which tells loadSettings() not to mess around with position @@ -395,11 +399,14 @@ void Pattern::loadSettings( const QDomElement & _this ) ).toInt() ); setName( _this.attribute( "name" ) ); - if( _this.hasAttribute( "stylecolor" ) ) + if( _this.hasAttribute( "color" ) ) { - useStyleColor( _this.attribute( "stylecolor" ).toInt() ); - useCustomClipColor( _this.attribute( "clipcolor" ).toInt() ); - setColorRgb( _this.attribute( "color" ).toUInt() ); + useStyleColor( false ); + useCustomClipColor( _this.attribute( "isclipcolor" ).toInt() ); + + QColor loadedColor; + loadedColor.setNamedColor( _this.attribute( "color" ) ); + setColor( loadedColor ); } if( _this.attribute( "pos" ).toInt() >= 0 ) diff --git a/src/tracks/SampleTrack.cpp b/src/tracks/SampleTrack.cpp index 283b5be99a5..8b6d70f719c 100644 --- a/src/tracks/SampleTrack.cpp +++ b/src/tracks/SampleTrack.cpp @@ -276,9 +276,11 @@ void SampleTCO::saveSettings( QDomDocument & _doc, QDomElement & _this ) } _this.setAttribute( "sample_rate", m_sampleBuffer->sampleRate()); - _this.setAttribute( "stylecolor", usesStyleColor() ); - _this.setAttribute( "clipcolor", usesCustomClipColor() ); - _this.setAttribute( "color", colorRgb() ); + if( ! usesStyleColor() ) + { + _this.setAttribute( "color", color().name() ); + _this.setAttribute( "isclipcolor", usesCustomClipColor() ); + } // TODO: start- and end-frame } @@ -304,11 +306,14 @@ void SampleTCO::loadSettings( const QDomElement & _this ) m_sampleBuffer->setSampleRate(_this.attribute("sample_rate").toInt()); } - if( _this.hasAttribute( "stylecolor" ) ) + if( _this.hasAttribute( "color" ) ) { - useStyleColor( _this.attribute( "stylecolor" ).toInt() ); - useCustomClipColor( _this.attribute( "clipcolor" ).toInt() ); - setColor( _this.attribute( "color" ).toUInt() ); + useStyleColor( false ); + useCustomClipColor( _this.attribute( "isclipcolor" ).toInt() ); + + QColor loadedColor; + loadedColor.setNamedColor( _this.attribute( "color" ) ); + setColor( loadedColor ); } } From f9d867dcfed3dbf64fc4c1409de43a33fa805a7d Mon Sep 17 00:00:00 2001 From: adi Date: Fri, 14 Aug 2020 09:33:56 +0530 Subject: [PATCH 28/63] Fix some formatting --- include/AutomationPattern.h | 1 + include/AutomationPatternView.h | 2 +- include/SampleTrack.h | 4 +++- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/include/AutomationPattern.h b/include/AutomationPattern.h index 312cec7c007..cad9d0a1d00 100644 --- a/include/AutomationPattern.h +++ b/include/AutomationPattern.h @@ -93,6 +93,7 @@ class LMMS_EXPORT AutomationPattern : public TrackContentObject void applyDragValue(); + bool isDragging() const { return m_dragging; diff --git a/include/AutomationPatternView.h b/include/AutomationPatternView.h index 059f0d4aa63..a6529b5d4a1 100644 --- a/include/AutomationPatternView.h +++ b/include/AutomationPatternView.h @@ -41,7 +41,7 @@ class AutomationPatternView : public TrackContentObjectView public: AutomationPatternView( AutomationPattern * _pat, TrackView * _parent ); virtual ~AutomationPatternView(); - + public slots: /// Opens this view's pattern in the global automation editor void openInAutomationEditor(); diff --git a/include/SampleTrack.h b/include/SampleTrack.h index cf8e1f49390..47cc0df3945 100644 --- a/include/SampleTrack.h +++ b/include/SampleTrack.h @@ -65,7 +65,6 @@ class SampleTCO : public TrackContentObject return m_sampleBuffer; } - MidiTime sampleLength() const; void setSampleStartFrame( f_cnt_t startFrame ); void setSamplePlayLength( f_cnt_t length ); @@ -89,6 +88,7 @@ public slots: BoolModel m_recordModel; bool m_isPlaying; + friend class SampleTCOView; @@ -110,6 +110,8 @@ class SampleTCOView : public TrackContentObjectView public slots: void updateSample(); + + protected: void contextMenuEvent( QContextMenuEvent * _cme ) override; void mousePressEvent( QMouseEvent * _me ) override; From d59d4fc20ff83df70c47ccfaade8a5e437baf0ff Mon Sep 17 00:00:00 2001 From: adi Date: Sat, 15 Aug 2020 10:22:02 +0530 Subject: [PATCH 29/63] Fix some code --- include/Pattern.h | 3 --- include/Track.h | 2 +- src/core/AutomationPattern.cpp | 5 +---- src/core/Track.cpp | 2 +- src/tracks/BBTrack.cpp | 5 +---- src/tracks/Pattern.cpp | 5 +---- src/tracks/SampleTrack.cpp | 5 +---- 7 files changed, 6 insertions(+), 21 deletions(-) diff --git a/include/Pattern.h b/include/Pattern.h index 57361cc71b8..355679b97d1 100644 --- a/include/Pattern.h +++ b/include/Pattern.h @@ -110,9 +110,6 @@ class LMMS_EXPORT Pattern : public TrackContentObject TrackContentObjectView * createView( TrackView * _tv ) override; - - void setBGColor( QColor & c ); - QColor BGColor(); using Model::dataChanged; diff --git a/include/Track.h b/include/Track.h index 682740c3e8e..e7145112df8 100644 --- a/include/Track.h +++ b/include/Track.h @@ -297,7 +297,7 @@ class TrackContentObjectView : public selectableObject, public ModelView QColor color() const { - return( m_tco->colorRgb() ); + return m_tco->color(); }; // access needsUpdate member variable diff --git a/src/core/AutomationPattern.cpp b/src/core/AutomationPattern.cpp index f3f5be9d8b3..aeac5b3b84d 100644 --- a/src/core/AutomationPattern.cpp +++ b/src/core/AutomationPattern.cpp @@ -604,10 +604,7 @@ void AutomationPattern::loadSettings( const QDomElement & _this ) { useStyleColor( false ); useCustomClipColor( _this.attribute( "isclipcolor" ).toInt() ); - - QColor loadedColor; - loadedColor.setNamedColor( _this.attribute( "color" ) ); - setColor( loadedColor ); + setColor( _this.attribute( "color" ) ); } int len = _this.attribute( "len" ).toInt(); diff --git a/src/core/Track.cpp b/src/core/Track.cpp index 463126d1327..e6e8f18a8f0 100644 --- a/src/core/Track.cpp +++ b/src/core/Track.cpp @@ -329,7 +329,7 @@ TrackContentObjectView::TrackContentObjectView( TrackContentObject * tco, m_gradient( true ), m_mouseHotspotHand( 0, 0 ), m_cursorSetYet( false ), - m_usesCustomSelectedColor( ! m_tco->usesStyleColor() | m_tco->usesCustomClipColor() ), + m_usesCustomSelectedColor( ! m_tco->usesStyleColor() || m_tco->usesCustomClipColor() ), m_needsUpdate( true ) { if( s_textFloat == NULL ) diff --git a/src/tracks/BBTrack.cpp b/src/tracks/BBTrack.cpp index 5b1c07b71d0..6d2f9027efc 100644 --- a/src/tracks/BBTrack.cpp +++ b/src/tracks/BBTrack.cpp @@ -99,10 +99,7 @@ void BBTCO::loadSettings( const QDomElement & element ) { useStyleColor( false ); useCustomClipColor( element.attribute( "isclipcolor" ).toInt() ); - - QColor loadedColor; - loadedColor.setNamedColor( element.attribute( "color" ) ); - setColor( loadedColor ); + setColor( element.attribute( "color" ) ); } // for colors saved before 1.3 diff --git a/src/tracks/Pattern.cpp b/src/tracks/Pattern.cpp index eeb3229749f..ccb1abe7de1 100644 --- a/src/tracks/Pattern.cpp +++ b/src/tracks/Pattern.cpp @@ -403,10 +403,7 @@ void Pattern::loadSettings( const QDomElement & _this ) { useStyleColor( false ); useCustomClipColor( _this.attribute( "isclipcolor" ).toInt() ); - - QColor loadedColor; - loadedColor.setNamedColor( _this.attribute( "color" ) ); - setColor( loadedColor ); + setColor( _this.attribute( "color" ) ); } if( _this.attribute( "pos" ).toInt() >= 0 ) diff --git a/src/tracks/SampleTrack.cpp b/src/tracks/SampleTrack.cpp index 8b6d70f719c..fb9d85acaba 100644 --- a/src/tracks/SampleTrack.cpp +++ b/src/tracks/SampleTrack.cpp @@ -310,10 +310,7 @@ void SampleTCO::loadSettings( const QDomElement & _this ) { useStyleColor( false ); useCustomClipColor( _this.attribute( "isclipcolor" ).toInt() ); - - QColor loadedColor; - loadedColor.setNamedColor( _this.attribute( "color" ) ); - setColor( loadedColor ); + setColor( _this.attribute( "color" ) ); } } From 6dea3abf00bda69bebe7dcff824f721dc89c9a8f Mon Sep 17 00:00:00 2001 From: adi Date: Sun, 16 Aug 2020 09:47:01 +0530 Subject: [PATCH 30/63] Change how clip colors work --- include/Track.h | 2 ++ src/core/AutomationPattern.cpp | 2 +- src/core/Track.cpp | 24 ++++++++++++++++-------- src/tracks/BBTrack.cpp | 2 +- src/tracks/Pattern.cpp | 2 +- src/tracks/SampleTrack.cpp | 2 +- 6 files changed, 22 insertions(+), 12 deletions(-) diff --git a/include/Track.h b/include/Track.h index e7145112df8..daf999f2f07 100644 --- a/include/Track.h +++ b/include/Track.h @@ -561,6 +561,7 @@ private slots: void changeTrackColor(); void randomTrackColor(); void resetTrackColor(); + void useTrackColor(); void toggleRecording(bool on); void recordingOn(); void recordingOff(); @@ -590,6 +591,7 @@ private slots: signals: void trackRemovalScheduled( TrackView * t ); void colorChanged( QColor & c ); + void colorParented(); void colorReset(); } ; diff --git a/src/core/AutomationPattern.cpp b/src/core/AutomationPattern.cpp index aeac5b3b84d..6e4ecb70c21 100644 --- a/src/core/AutomationPattern.cpp +++ b/src/core/AutomationPattern.cpp @@ -603,7 +603,7 @@ void AutomationPattern::loadSettings( const QDomElement & _this ) if( _this.hasAttribute( "color" ) ) { useStyleColor( false ); - useCustomClipColor( _this.attribute( "isclipcolor" ).toInt() ); + useCustomClipColor( _this.attribute( "isclipcolor" ) == "1" ? true : false ); setColor( _this.attribute( "color" ) ); } diff --git a/src/core/Track.cpp b/src/core/Track.cpp index e6e8f18a8f0..281bcaefae8 100644 --- a/src/core/Track.cpp +++ b/src/core/Track.cpp @@ -266,11 +266,11 @@ void TrackContentObject::setStartTimeOffset( const MidiTime &startTimeOffset ) void TrackContentObject::setBGColor( QColor & c ) { - // since this function is called only from track, and track changes override local settings, remove custom clip color - m_useCustomClipColor = false; - - m_color = c; - emit trackColorChanged( m_color ); + if( ! m_useCustomClipColor ) + { + m_color = c; + emit trackColorChanged( m_color ); + } } QColor TrackContentObject::BGColor() @@ -280,8 +280,7 @@ QColor TrackContentObject::BGColor() void TrackContentObject::resetColor() { - m_useCustomClipColor = false; - emit trackColorReset(); + if( ! m_useCustomClipColor ) emit trackColorReset(); } @@ -361,6 +360,7 @@ TrackContentObjectView::TrackContentObjectView( TrackContentObject * tco, connect( m_tco, SIGNAL( clipColorReset() ), this, SLOT( disableClipSelectedColor() ) ); setModel( m_tco ); connect( m_tco, SIGNAL( trackColorChanged( QColor & ) ), this, SLOT( setColor( QColor & ) ) ); + connect( m_trackView->getTrackOperationsWidget(), SIGNAL( colorParented() ), this, SLOT( useTrackColor() ) ); if( m_usesCustomSelectedColor ) { @@ -649,7 +649,7 @@ void TrackContentObjectView::useTrackColor() void TrackContentObjectView::trackColorReset() { - if( ! m_tco->usesStyleColor() ) + if( ! m_tco->usesStyleColor() && ! m_tco->usesCustomClipColor() ) { m_tco->useStyleColor( true ); Engine::getSong()->setModified(); @@ -2472,6 +2472,11 @@ void TrackOperationsWidget::randomTrackColor() colorBarNeedsUpdate = true; } +void TrackOperationsWidget::useTrackColor() +{ + emit colorParented(); +} + /*! \brief Update the trackOperationsWidget context menu * @@ -2519,6 +2524,9 @@ void TrackOperationsWidget::updateMenu() tr( "Reset color to default" ), this, SLOT( resetTrackColor() ) ); toMenu->addAction( embed::getIconPixmap( "colorize" ), tr( "Set random color" ), this, SLOT( randomTrackColor() ) ); + toMenu->addSeparator(); + toMenu->addAction( embed::getIconPixmap( "colorize" ), + tr( "Use track color in clips" ), this, SLOT( useTrackColor() ) ); } void TrackOperationsWidget::updateColorGradient() diff --git a/src/tracks/BBTrack.cpp b/src/tracks/BBTrack.cpp index 6d2f9027efc..3fe46a5a772 100644 --- a/src/tracks/BBTrack.cpp +++ b/src/tracks/BBTrack.cpp @@ -98,7 +98,7 @@ void BBTCO::loadSettings( const QDomElement & element ) if( element.hasAttribute( "isclipcolor" ) ) { useStyleColor( false ); - useCustomClipColor( element.attribute( "isclipcolor" ).toInt() ); + useCustomClipColor( element.attribute( "isclipcolor" ) == "1" ? true : false ); setColor( element.attribute( "color" ) ); } diff --git a/src/tracks/Pattern.cpp b/src/tracks/Pattern.cpp index ccb1abe7de1..d1a29db9355 100644 --- a/src/tracks/Pattern.cpp +++ b/src/tracks/Pattern.cpp @@ -402,7 +402,7 @@ void Pattern::loadSettings( const QDomElement & _this ) if( _this.hasAttribute( "color" ) ) { useStyleColor( false ); - useCustomClipColor( _this.attribute( "isclipcolor" ).toInt() ); + useCustomClipColor( _this.attribute( "isclipcolor" ) == "1" ? true : false ); setColor( _this.attribute( "color" ) ); } diff --git a/src/tracks/SampleTrack.cpp b/src/tracks/SampleTrack.cpp index fb9d85acaba..94ddb8c7ad4 100644 --- a/src/tracks/SampleTrack.cpp +++ b/src/tracks/SampleTrack.cpp @@ -309,7 +309,7 @@ void SampleTCO::loadSettings( const QDomElement & _this ) if( _this.hasAttribute( "color" ) ) { useStyleColor( false ); - useCustomClipColor( _this.attribute( "isclipcolor" ).toInt() ); + useCustomClipColor( _this.attribute( "isclipcolor" ) == "1" ? true : false ); setColor( _this.attribute( "color" ) ); } } From 25edb518cfc57507fe1f238c3c7930188e116d91 Mon Sep 17 00:00:00 2001 From: adi Date: Mon, 17 Aug 2020 09:03:37 +0530 Subject: [PATCH 31/63] Fix some unexpected behaviors --- src/core/AutomationPattern.cpp | 2 +- src/core/Track.cpp | 24 +++++++++++++++--------- src/tracks/BBTrack.cpp | 2 +- src/tracks/Pattern.cpp | 2 +- src/tracks/SampleTrack.cpp | 2 +- 5 files changed, 19 insertions(+), 13 deletions(-) diff --git a/src/core/AutomationPattern.cpp b/src/core/AutomationPattern.cpp index 6e4ecb70c21..4006543b717 100644 --- a/src/core/AutomationPattern.cpp +++ b/src/core/AutomationPattern.cpp @@ -603,7 +603,7 @@ void AutomationPattern::loadSettings( const QDomElement & _this ) if( _this.hasAttribute( "color" ) ) { useStyleColor( false ); - useCustomClipColor( _this.attribute( "isclipcolor" ) == "1" ? true : false ); + useCustomClipColor( _this.attribute( "isclipcolor" ) == "1" ); setColor( _this.attribute( "color" ) ); } diff --git a/src/core/Track.cpp b/src/core/Track.cpp index 281bcaefae8..49fdcd94730 100644 --- a/src/core/Track.cpp +++ b/src/core/Track.cpp @@ -746,16 +746,19 @@ void TrackContentObjectView::dropEvent( QDropEvent * de ) QDomElement tcos = dataFile.content().firstChildElement( "tcos" ); m_tco->restoreState( tcos.firstChildElement().firstChildElement() ); m_tco->movePosition( pos ); + auto old_tco = dynamic_cast( qwSource )->m_tco; - if( m_trackView->getTrack()->useColor() ) + if( old_tco->usesCustomClipColor() ) { m_tco->useStyleColor( false ); - if( ! dynamic_cast( qwSource )->m_tco->usesCustomClipColor() ) - m_tco->setColor( m_trackView->getTrack()->backgroundColor() ); + m_tco->useCustomClipColor( true ); + m_tco->setColor( old_tco->color() ); } else { - m_tco->useStyleColor( true ); + m_tco->useStyleColor( ! m_trackView->getTrack()->useColor() ); + m_tco->useCustomClipColor( false ); + m_tco->setColor( m_trackView->getTrack()->backgroundColor() ); } AutomationPattern::resolveAllIDs(); @@ -809,6 +812,8 @@ DataFile TrackContentObjectView::createTCODataFiles( tcoElement.setAttribute( "trackIndex", trackIndex ); tcoElement.setAttribute( "trackType", tcoTrack->type() ); tcoElement.setAttribute( "trackName", tcoTrack->name() ); + tcoElement.setAttribute( "color", ( *it )->m_tco->color().name() ); + tcoElement.setAttribute( "styleColor", ( *it )->m_tco->usesStyleColor() ); tcoElement.setAttribute( "clipColor", ( *it )->m_tco->usesCustomClipColor() ); ( *it )->m_tco->saveState( dataFile, tcoElement ); tcoParent.appendChild( tcoElement ); @@ -2016,16 +2021,17 @@ bool TrackContentWidget::pasteSelection( MidiTime tcoPos, const QMimeData * md, tco->selectViewOnCreate( true ); } - if( t->useColor() ) + if( outerTCOElement.attributeNode( "clipColor" ).value() == "1" ) { tco->useStyleColor( false ); - - if( outerTCOElement.attributeNode( "clipColor" ).value() == "0" ) - tco->setColor( t->backgroundColor() ); + tco->useCustomClipColor( true ); + tco->setColor( outerTCOElement.attributeNode( "color" ).value() ); } else { - tco->useStyleColor( true ); + tco->useStyleColor( ! t->useColor() ); + tco->useCustomClipColor( false ); + tco->setColor( t->backgroundColor() ); } //check tco name, if the same as source track name dont copy diff --git a/src/tracks/BBTrack.cpp b/src/tracks/BBTrack.cpp index 3fe46a5a772..a72b1a1cfd4 100644 --- a/src/tracks/BBTrack.cpp +++ b/src/tracks/BBTrack.cpp @@ -98,7 +98,7 @@ void BBTCO::loadSettings( const QDomElement & element ) if( element.hasAttribute( "isclipcolor" ) ) { useStyleColor( false ); - useCustomClipColor( element.attribute( "isclipcolor" ) == "1" ? true : false ); + useCustomClipColor( element.attribute( "isclipcolor" ) == "1" ); setColor( element.attribute( "color" ) ); } diff --git a/src/tracks/Pattern.cpp b/src/tracks/Pattern.cpp index d1a29db9355..a4e50b371ac 100644 --- a/src/tracks/Pattern.cpp +++ b/src/tracks/Pattern.cpp @@ -402,7 +402,7 @@ void Pattern::loadSettings( const QDomElement & _this ) if( _this.hasAttribute( "color" ) ) { useStyleColor( false ); - useCustomClipColor( _this.attribute( "isclipcolor" ) == "1" ? true : false ); + useCustomClipColor( _this.attribute( "isclipcolor" ) == "1" ); setColor( _this.attribute( "color" ) ); } diff --git a/src/tracks/SampleTrack.cpp b/src/tracks/SampleTrack.cpp index 94ddb8c7ad4..775763b5ef0 100644 --- a/src/tracks/SampleTrack.cpp +++ b/src/tracks/SampleTrack.cpp @@ -309,7 +309,7 @@ void SampleTCO::loadSettings( const QDomElement & _this ) if( _this.hasAttribute( "color" ) ) { useStyleColor( false ); - useCustomClipColor( _this.attribute( "isclipcolor" ) == "1" ? true : false ); + useCustomClipColor( _this.attribute( "isclipcolor" ) == "1" ); setColor( _this.attribute( "color" ) ); } } From 54295df197a77bb6eceb335a54002898221f25ab Mon Sep 17 00:00:00 2001 From: adi Date: Mon, 17 Aug 2020 09:18:37 +0530 Subject: [PATCH 32/63] Fix note border coloring being green on colored tracks --- src/tracks/Pattern.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/tracks/Pattern.cpp b/src/tracks/Pattern.cpp index a4e50b371ac..38a882b9040 100644 --- a/src/tracks/Pattern.cpp +++ b/src/tracks/Pattern.cpp @@ -1002,7 +1002,8 @@ void PatternView::paintEvent( QPaintEvent * ) // set colour based on mute status QColor noteFillColor = muted ? getMutedNoteFillColor() : getNoteFillColor(); - QColor noteBorderColor = muted ? getMutedNoteBorderColor() : getNoteBorderColor(); + QColor noteBorderColor = muted ? getMutedNoteBorderColor() + : ( m_pat->usesStyleColor() ? getNoteBorderColor() : c.lighter( 200 ) ); bool const drawAsLines = height() < 64; if (drawAsLines) From c3860ee7172642f32613cf7728db554ad0048b92 Mon Sep 17 00:00:00 2001 From: adi Date: Tue, 18 Aug 2020 12:49:54 +0530 Subject: [PATCH 33/63] Change name of an option --- src/core/Track.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/Track.cpp b/src/core/Track.cpp index 49fdcd94730..bcebdd203f0 100644 --- a/src/core/Track.cpp +++ b/src/core/Track.cpp @@ -2532,7 +2532,7 @@ void TrackOperationsWidget::updateMenu() tr( "Set random color" ), this, SLOT( randomTrackColor() ) ); toMenu->addSeparator(); toMenu->addAction( embed::getIconPixmap( "colorize" ), - tr( "Use track color in clips" ), this, SLOT( useTrackColor() ) ); + tr( "Clear clip colors" ), this, SLOT( useTrackColor() ) ); } void TrackOperationsWidget::updateColorGradient() From a9d6256f24abf957c2dac1fddcc33cd29dc31707 Mon Sep 17 00:00:00 2001 From: adi Date: Fri, 28 Aug 2020 09:54:46 +0530 Subject: [PATCH 34/63] Remove redundant code --- include/Pattern.h | 1 + include/Track.h | 22 ++++----- src/core/Track.cpp | 114 ++++++++++++++------------------------------- 3 files changed, 44 insertions(+), 93 deletions(-) diff --git a/include/Pattern.h b/include/Pattern.h index 355679b97d1..45f7f875b5f 100644 --- a/include/Pattern.h +++ b/include/Pattern.h @@ -111,6 +111,7 @@ class LMMS_EXPORT Pattern : public TrackContentObject TrackContentObjectView * createView( TrackView * _tv ) override; + using Model::dataChanged; diff --git a/include/Track.h b/include/Track.h index daf999f2f07..0da6f1f261b 100644 --- a/include/Track.h +++ b/include/Track.h @@ -323,7 +323,6 @@ public slots: void cut(); void remove(); void update() override; - void changeSelectedColor( QColor & ); void disableSelectedColor(); void disableClipSelectedColor(); @@ -545,7 +544,7 @@ class TrackOperationsWidget : public QWidget void setTrackHasColor( bool b ) { - hasColor = b; + m_hasColor = b; } @@ -567,12 +566,11 @@ private slots: void recordingOff(); void clearTrack(); - void loadColorSettings( unsigned int ); void updateColorGradient(); QColor backgroundColor(); bool trackHasColor() { - return hasColor; + return m_hasColor; } private: @@ -582,8 +580,8 @@ private slots: PixmapButton * m_muteBtn; PixmapButton * m_soloBtn; - QColor m_backgroundColor; - bool hasColor; + QColor m_color; + bool m_hasColor; bool colorBarNeedsUpdate; friend class TrackView; @@ -728,11 +726,11 @@ class LMMS_EXPORT Track : public Model, public JournallingObject QColor backgroundColor() { - return m_backgroundColor; + return m_color; } bool useColor() { - return hasColor; + return m_hasColor; } BoolModel* getMutedModel(); @@ -767,8 +765,8 @@ public slots: QMutex m_processingLock; - QColor m_backgroundColor; - bool hasColor; + QColor m_color; + bool m_hasColor; friend class TrackView; @@ -777,10 +775,6 @@ public slots: void destroyedTrack(); void nameChanged(); void trackContentObjectAdded( TrackContentObject * ); - void loadedColorSettings( unsigned int ); - - QColor requestTrackBGColor(); - bool requestTrackHasColor(); } ; diff --git a/src/core/Track.cpp b/src/core/Track.cpp index bcebdd203f0..0f5712dc3ca 100644 --- a/src/core/Track.cpp +++ b/src/core/Track.cpp @@ -39,7 +39,6 @@ #include #include -#include #include #include @@ -321,14 +320,13 @@ TrackContentObjectView::TrackContentObjectView( TrackContentObject * tco, m_hint( NULL ), m_mutedColor( 0, 0, 0 ), m_mutedBackgroundColor( 0, 0, 0 ), - m_selectedColor( 0, 0, 0 ), m_textColor( 0, 0, 0 ), m_textShadowColor( 0, 0, 0 ), m_BBPatternBackground( 0, 0, 0 ), m_gradient( true ), m_mouseHotspotHand( 0, 0 ), m_cursorSetYet( false ), - m_usesCustomSelectedColor( ! m_tco->usesStyleColor() || m_tco->usesCustomClipColor() ), + m_usesCustomSelectedColor( ! m_tco->usesStyleColor() ), m_needsUpdate( true ) { if( s_textFloat == NULL ) @@ -354,19 +352,11 @@ TrackContentObjectView::TrackContentObjectView( TrackContentObject * tco, connect( m_tco, SIGNAL( positionChanged() ), this, SLOT( updatePosition() ) ); connect( m_tco, SIGNAL( destroyedTCO() ), this, SLOT( close() ) ); - connect( m_tco, SIGNAL( trackColorChanged( QColor & ) ), this, SLOT( changeSelectedColor( QColor & ) ) ); connect( m_tco, SIGNAL( trackColorReset() ), this, SLOT( disableSelectedColor() ) ); - connect( m_tco, SIGNAL( clipColorChanged( QColor & ) ), this, SLOT( changeSelectedColor( QColor & ) ) ); connect( m_tco, SIGNAL( clipColorReset() ), this, SLOT( disableClipSelectedColor() ) ); setModel( m_tco ); connect( m_tco, SIGNAL( trackColorChanged( QColor & ) ), this, SLOT( setColor( QColor & ) ) ); connect( m_trackView->getTrackOperationsWidget(), SIGNAL( colorParented() ), this, SLOT( useTrackColor() ) ); - - if( m_usesCustomSelectedColor ) - { - QColor tcoColor = m_tco->color(); - changeSelectedColor( tcoColor ); - } m_trackView->getTrackContentWidget()->addTCOView( this ); updateLength(); @@ -431,28 +421,15 @@ bool TrackContentObjectView::fixedTCOs() } -void TrackContentObjectView::changeSelectedColor( QColor & c ) -{ - m_customSelectedColor = c.darker( 200 ); - m_usesCustomSelectedColor = true; -} - void TrackContentObjectView::disableSelectedColor() { m_usesCustomSelectedColor = false; } + void TrackContentObjectView::disableClipSelectedColor() { - if( m_trackView->getTrack()->useColor() ) - { - m_customSelectedColor = m_trackView->getTrack()->backgroundColor().darker( 200 ); - m_usesCustomSelectedColor = true; - } - else - { - m_usesCustomSelectedColor = false; - } + m_usesCustomSelectedColor = m_trackView->getTrack()->useColor(); } @@ -466,7 +443,7 @@ QColor TrackContentObjectView::mutedBackgroundColor() const { return m_mutedBackgroundColor; } QColor TrackContentObjectView::selectedColor() const -{ return ( m_usesCustomSelectedColor ? m_customSelectedColor : m_selectedColor ); } +{ return ( m_usesCustomSelectedColor ? color().darker(200) : m_selectedColor ); } QColor TrackContentObjectView::textColor() const { return m_textColor; } @@ -667,6 +644,8 @@ void TrackContentObjectView::setColor( QColor & new_color ) // force TCO to use color m_tco->useStyleColor( false ); + m_usesCustomSelectedColor = true; + Engine::getSong()->setModified(); update(); } @@ -2245,7 +2224,7 @@ void TrackContentWidget::setEmbossColor( const QBrush & c ) TrackOperationsWidget::TrackOperationsWidget( TrackView * parent ) : QWidget( parent ), /*!< The parent widget */ m_trackView( parent ), /*!< The parent track view */ - hasColor( false ), + m_hasColor( false ), colorBarNeedsUpdate( false ) { ToolTip::add( this, tr( "Press <%1> while clicking on move-grip " @@ -2302,15 +2281,13 @@ TrackOperationsWidget::TrackOperationsWidget( TrackView * parent ) : connect( m_trackView->getTrack()->getMutedModel(), SIGNAL( dataChanged() ), this, SLOT( updateColorGradient() ) ); - m_backgroundColor = m_trackView->getTrack()->backgroundColor(); + m_color = m_trackView->getTrack()->backgroundColor(); - if( m_backgroundColor != QColor( 0, 0, 0 ) ) + if( m_color != QColor( 0, 0, 0 ) ) { - hasColor = true; + m_hasColor = true; } - srand( time( 0 ) ); - } @@ -2372,16 +2349,13 @@ void TrackOperationsWidget::paintEvent( QPaintEvent * pe ) { QPainter p( this ); - if( hasColor && ! m_trackView->getTrack()->getMutedModel()->value() ) + p.fillRect( rect(), palette().brush(QPalette::Background) ); + + if( m_hasColor && ! m_trackView->getTrack()->getMutedModel()->value() ) { QRect coloredRect( 0, 0, 10, m_trackView->getTrack()->getHeight() ); - p.fillRect( rect(), palette().brush(QPalette::Background) ); - p.fillRect( coloredRect, m_backgroundColor ); - } - else - { - p.fillRect( rect(), palette().brush(QPalette::Background) ); + p.fillRect( coloredRect, m_color ); } if( m_trackView->isMovingTrack() == false ) @@ -2444,25 +2418,25 @@ void TrackOperationsWidget::removeTrack() } void TrackOperationsWidget::setBackgroundColor( QColor & c ) -{ m_backgroundColor = c; } +{ m_color = c; } QColor TrackOperationsWidget::backgroundColor() -{ return m_backgroundColor; } +{ return m_color; } void TrackOperationsWidget::changeTrackColor() { - QColor new_color = ColorChooser( this ).withPalette( ColorChooser::Palette::Track )->getColor( m_backgroundColor ); + QColor new_color = ColorChooser( this ).withPalette( ColorChooser::Palette::Track )->getColor( m_color ); if( ! new_color.isValid() ) { return; } - m_backgroundColor = new_color; - hasColor = true; - emit colorChanged( m_backgroundColor ); + m_color = new_color; + m_hasColor = true; + emit colorChanged( m_color ); colorBarNeedsUpdate = true; } void TrackOperationsWidget::resetTrackColor() { - hasColor = false; + m_hasColor = false; emit colorReset(); colorBarNeedsUpdate = true; } @@ -2471,10 +2445,10 @@ void TrackOperationsWidget::randomTrackColor() { QColor buffer = ColorChooser::getPalette( ColorChooser::Palette::Track )[ rand() % 48 ]; - m_backgroundColor = buffer; - emit colorChanged( m_backgroundColor ); + m_color = buffer; + emit colorChanged( m_color ); - hasColor = true; + m_hasColor = true; colorBarNeedsUpdate = true; } @@ -2542,15 +2516,6 @@ void TrackOperationsWidget::updateColorGradient() } -void TrackOperationsWidget::loadColorSettings( unsigned int c ) -{ - m_backgroundColor.setRgb( c ); - setTrackHasColor( true ); - colorBarNeedsUpdate = true; - update(); -} - - void TrackOperationsWidget::toggleRecording( bool on ) { AutomationTrackView * atv = dynamic_cast( m_trackView ); @@ -2603,8 +2568,8 @@ Track::Track( TrackTypes type, TrackContainer * tc ) : /*!< For controlling track soloing */ m_simpleSerializingMode( false ), m_trackContentObjects(), /*!< The track content objects (segments) */ - m_backgroundColor( 0, 0, 0 ), - hasColor( false ) + m_color( 0, 0, 0 ), + m_hasColor( false ) { m_trackContainer->addTrack( this ); m_height = -1; @@ -2750,9 +2715,9 @@ void Track::saveSettings( QDomDocument & doc, QDomElement & element ) element.setAttribute( "trackheight", m_height ); } - if( hasColor ) + if( m_hasColor ) { - element.setAttribute( "trackbgcolor", m_backgroundColor.name() ); + element.setAttribute( "trackbgcolor", m_color.name() ); } QDomElement tsDe = doc.createElement( nodeName() ); @@ -2809,8 +2774,8 @@ void Track::loadSettings( const QDomElement & element ) if( element.hasAttribute( "trackbgcolor" ) ) { - m_backgroundColor.setNamedColor( element.attribute( "trackbgcolor" ) ); - hasColor = true; + m_color.setNamedColor( element.attribute( "trackbgcolor" ) ); + m_hasColor = true; } if( m_simpleSerializingMode ) @@ -2874,8 +2839,8 @@ void Track::loadSettings( const QDomElement & element ) */ TrackContentObject * Track::addTCO( TrackContentObject * tco ) { - tco->setColor( m_backgroundColor ); - tco->useStyleColor( ! hasColor ); + tco->setColor( m_color ); + tco->useStyleColor( ! m_hasColor ); m_trackContentObjects.push_back( tco ); @@ -3199,8 +3164,8 @@ void Track::trackColorChanged( QColor & c ) { m_trackContentObjects[i]->setBGColor(c); } - hasColor = true; - m_backgroundColor = c; + m_hasColor = true; + m_color = c; } void Track::trackColorReset() @@ -3209,7 +3174,7 @@ void Track::trackColorReset() { m_trackContentObjects[i]->resetColor(); } - hasColor = false; + m_hasColor = false; } @@ -3287,15 +3252,6 @@ TrackView::TrackView( Track * track, TrackContainerView * tcv ) : connect( &m_trackOperationsWidget, SIGNAL( colorReset() ), m_track, SLOT( trackColorReset() ) ); - - connect( m_track, SIGNAL( loadedColorSettings( unsigned int ) ), - &m_trackOperationsWidget, SLOT( loadColorSettings( unsigned int ) ) ); - - connect( m_track, SIGNAL( requestTrackBGColor() ), - &m_trackOperationsWidget, SLOT( backgroundColor() ) ); - - connect( m_track, SIGNAL( requestTrackHasColor() ), - &m_trackOperationsWidget, SLOT( trackHasColor() ) ); // create views for already existing TCOs for( Track::tcoVector::iterator it = From 4b1d12694ac2d2fff5c590b404691eba639f5304 Mon Sep 17 00:00:00 2001 From: adi Date: Fri, 28 Aug 2020 09:55:48 +0530 Subject: [PATCH 35/63] Fix ghost changes --- include/Pattern.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/Pattern.h b/include/Pattern.h index 45f7f875b5f..5192da9faf8 100644 --- a/include/Pattern.h +++ b/include/Pattern.h @@ -188,6 +188,7 @@ public slots: protected slots: void openInPianoRoll(); void setGhostInPianoRoll(); + void resetName(); void changeName(); From e99ff575a8245fc5ba3589d0e89f424be0b88b31 Mon Sep 17 00:00:00 2001 From: adi Date: Fri, 28 Aug 2020 10:02:24 +0530 Subject: [PATCH 36/63] Remove colorRgb --- include/Track.h | 10 ---------- src/core/Track.cpp | 2 +- src/tracks/BBTrack.cpp | 27 ++++++--------------------- 3 files changed, 7 insertions(+), 32 deletions(-) diff --git a/include/Track.h b/include/Track.h index 0da6f1f261b..65e5a28aa80 100644 --- a/include/Track.h +++ b/include/Track.h @@ -134,11 +134,6 @@ class LMMS_EXPORT TrackContentObject : public Model, public JournallingObject return m_autoResize; } - unsigned int colorRgb() const - { - return( m_color.rgb() ); - } - QColor color() const { return m_color; @@ -148,11 +143,6 @@ class LMMS_EXPORT TrackContentObject : public Model, public JournallingObject { m_color = QColor( c ); } - - void setColorRgb( const unsigned int & c ) - { - m_color.setRgb( c ); - } void useStyleColor( bool b ) { diff --git a/src/core/Track.cpp b/src/core/Track.cpp index 0f5712dc3ca..4d9e0dc04b5 100644 --- a/src/core/Track.cpp +++ b/src/core/Track.cpp @@ -639,7 +639,7 @@ void TrackContentObjectView::trackColorReset() void TrackContentObjectView::setColor( QColor & new_color ) { // change color only if it is different - if( new_color.rgb() != m_tco->colorRgb() ) + if( new_color.rgb() != m_tco->color().rgb() ) { m_tco->setColor( new_color ); } // force TCO to use color diff --git a/src/tracks/BBTrack.cpp b/src/tracks/BBTrack.cpp index a72b1a1cfd4..5912f73ba6b 100644 --- a/src/tracks/BBTrack.cpp +++ b/src/tracks/BBTrack.cpp @@ -106,30 +106,15 @@ void BBTCO::loadSettings( const QDomElement & element ) else { if( element.hasAttribute( "color" ) ) - { - setColor( QColor( element.attribute( "color" ).toUInt() ) ); - } + { setColor( QColor( element.attribute( "color" ).toUInt() ) ); } + if( element.hasAttribute( "usestyle" ) ) - { - if( element.attribute( "usestyle" ).toUInt() == 1 ) - { - useStyleColor( true ); - } - else - { - useStyleColor( false ); - } - } + { useStyleColor ( element.attribute( "usestyle" ).toUInt() == 1 ); } + else { - if( colorRgb() == qRgb( 128, 182, 175 ) || colorRgb() == qRgb( 64, 128, 255 ) ) // old or older default color - { - useStyleColor( true ); - } - else - { - useStyleColor( false ); - } + useStyleColor( color().rgb() == qRgb( 128, 182, 175 ) + || color().rgb() == qRgb( 64, 128, 255 ) ); // old or older default color } } } From 3b0aaf02b2e6fce7986c39e920b552ff4286c63e Mon Sep 17 00:00:00 2001 From: adi Date: Fri, 28 Aug 2020 10:50:43 +0530 Subject: [PATCH 37/63] Rename backgroundColor, remove some variables we don't use --- include/Track.h | 18 ++---------------- src/core/Track.cpp | 43 +++++++++++++------------------------------ 2 files changed, 15 insertions(+), 46 deletions(-) diff --git a/include/Track.h b/include/Track.h index 65e5a28aa80..28188a2a4df 100644 --- a/include/Track.h +++ b/include/Track.h @@ -530,13 +530,6 @@ class TrackOperationsWidget : public QWidget TrackOperationsWidget( TrackView * parent ); ~TrackOperationsWidget(); - void setBackgroundColor( QColor & ); - - void setTrackHasColor( bool b ) - { - m_hasColor = b; - } - protected: void mousePressEvent( QMouseEvent * me ) override; @@ -557,11 +550,6 @@ private slots: void clearTrack(); void updateColorGradient(); - QColor backgroundColor(); - bool trackHasColor() - { - return m_hasColor; - } private: TrackView * m_trackView; @@ -569,9 +557,7 @@ private slots: QPushButton * m_trackOps; PixmapButton * m_muteBtn; PixmapButton * m_soloBtn; - - QColor m_color; - bool m_hasColor; + bool colorBarNeedsUpdate; friend class TrackView; @@ -714,7 +700,7 @@ class LMMS_EXPORT Track : public Model, public JournallingObject return m_processingLock.tryLock(); } - QColor backgroundColor() + QColor color() { return m_color; } diff --git a/src/core/Track.cpp b/src/core/Track.cpp index 4d9e0dc04b5..da72890fff0 100644 --- a/src/core/Track.cpp +++ b/src/core/Track.cpp @@ -117,7 +117,7 @@ TrackContentObject::TrackContentObject( Track * track ) : if( getTrack()->useColor() && ! m_useCustomClipColor ) { m_useStyleColor = false; - m_color = getTrack()->backgroundColor(); + m_color = getTrack()->color(); } } setJournalling( false ); @@ -223,7 +223,7 @@ void TrackContentObject::paste() if( getTrack()->useColor() && ! m_useCustomClipColor ) { m_useStyleColor = false; - m_color = getTrack()->backgroundColor(); + m_color = getTrack()->color(); } } AutomationPattern::resolveAllIDs(); @@ -609,7 +609,7 @@ void TrackContentObjectView::useTrackColor() { if( m_tco->getTrack()->useColor() ) { - QColor buffer = m_tco->getTrack()->backgroundColor(); + QColor buffer = m_tco->getTrack()->color(); setColor( buffer ); m_tco->useStyleColor( false ); } @@ -737,7 +737,7 @@ void TrackContentObjectView::dropEvent( QDropEvent * de ) { m_tco->useStyleColor( ! m_trackView->getTrack()->useColor() ); m_tco->useCustomClipColor( false ); - m_tco->setColor( m_trackView->getTrack()->backgroundColor() ); + m_tco->setColor( m_trackView->getTrack()->color() ); } AutomationPattern::resolveAllIDs(); @@ -2010,7 +2010,7 @@ bool TrackContentWidget::pasteSelection( MidiTime tcoPos, const QMimeData * md, { tco->useStyleColor( ! t->useColor() ); tco->useCustomClipColor( false ); - tco->setColor( t->backgroundColor() ); + tco->setColor( t->color() ); } //check tco name, if the same as source track name dont copy @@ -2224,7 +2224,6 @@ void TrackContentWidget::setEmbossColor( const QBrush & c ) TrackOperationsWidget::TrackOperationsWidget( TrackView * parent ) : QWidget( parent ), /*!< The parent widget */ m_trackView( parent ), /*!< The parent track view */ - m_hasColor( false ), colorBarNeedsUpdate( false ) { ToolTip::add( this, tr( "Press <%1> while clicking on move-grip " @@ -2281,13 +2280,6 @@ TrackOperationsWidget::TrackOperationsWidget( TrackView * parent ) : connect( m_trackView->getTrack()->getMutedModel(), SIGNAL( dataChanged() ), this, SLOT( updateColorGradient() ) ); - m_color = m_trackView->getTrack()->backgroundColor(); - - if( m_color != QColor( 0, 0, 0 ) ) - { - m_hasColor = true; - } - } @@ -2351,11 +2343,11 @@ void TrackOperationsWidget::paintEvent( QPaintEvent * pe ) p.fillRect( rect(), palette().brush(QPalette::Background) ); - if( m_hasColor && ! m_trackView->getTrack()->getMutedModel()->value() ) + if( m_trackView->getTrack()->useColor() && ! m_trackView->getTrack()->getMutedModel()->value() ) { QRect coloredRect( 0, 0, 10, m_trackView->getTrack()->getHeight() ); - p.fillRect( coloredRect, m_color ); + p.fillRect( coloredRect, m_trackView->getTrack()->color() ); } if( m_trackView->isMovingTrack() == false ) @@ -2417,26 +2409,20 @@ void TrackOperationsWidget::removeTrack() emit trackRemovalScheduled( m_trackView ); } -void TrackOperationsWidget::setBackgroundColor( QColor & c ) -{ m_color = c; } -QColor TrackOperationsWidget::backgroundColor() -{ return m_color; } - void TrackOperationsWidget::changeTrackColor() { - QColor new_color = ColorChooser( this ).withPalette( ColorChooser::Palette::Track )->getColor( m_color ); + QColor new_color = ColorChooser( this ).withPalette( ColorChooser::Palette::Track )-> \ + getColor( m_trackView->getTrack()->color() ); + if( ! new_color.isValid() ) { return; } - - m_color = new_color; - m_hasColor = true; - emit colorChanged( m_color ); + + emit colorChanged( new_color ); colorBarNeedsUpdate = true; } void TrackOperationsWidget::resetTrackColor() { - m_hasColor = false; emit colorReset(); colorBarNeedsUpdate = true; } @@ -2445,10 +2431,7 @@ void TrackOperationsWidget::randomTrackColor() { QColor buffer = ColorChooser::getPalette( ColorChooser::Palette::Track )[ rand() % 48 ]; - m_color = buffer; - emit colorChanged( m_color ); - - m_hasColor = true; + emit colorChanged( buffer ); colorBarNeedsUpdate = true; } From 368fd1e033ef5f7b15bf9a766579711f264b9578 Mon Sep 17 00:00:00 2001 From: adi Date: Fri, 28 Aug 2020 11:01:44 +0530 Subject: [PATCH 38/63] Remove a redundant variable --- include/Track.h | 4 ---- src/core/Track.cpp | 18 +----------------- 2 files changed, 1 insertion(+), 21 deletions(-) diff --git a/include/Track.h b/include/Track.h index 28188a2a4df..7086ae36c13 100644 --- a/include/Track.h +++ b/include/Track.h @@ -313,8 +313,6 @@ public slots: void cut(); void remove(); void update() override; - void disableSelectedColor(); - void disableClipSelectedColor(); void changeClipColor(); void useTrackColor(); @@ -400,8 +398,6 @@ protected slots: QSize m_mouseHotspotHand; // QSize must be used because QPoint isn't supported by property system bool m_cursorSetYet; - bool m_usesCustomSelectedColor; - bool m_needsUpdate; inline void setInitialPos( QPoint pos ) { diff --git a/src/core/Track.cpp b/src/core/Track.cpp index da72890fff0..21b9e2489ae 100644 --- a/src/core/Track.cpp +++ b/src/core/Track.cpp @@ -326,7 +326,6 @@ TrackContentObjectView::TrackContentObjectView( TrackContentObject * tco, m_gradient( true ), m_mouseHotspotHand( 0, 0 ), m_cursorSetYet( false ), - m_usesCustomSelectedColor( ! m_tco->usesStyleColor() ), m_needsUpdate( true ) { if( s_textFloat == NULL ) @@ -352,8 +351,6 @@ TrackContentObjectView::TrackContentObjectView( TrackContentObject * tco, connect( m_tco, SIGNAL( positionChanged() ), this, SLOT( updatePosition() ) ); connect( m_tco, SIGNAL( destroyedTCO() ), this, SLOT( close() ) ); - connect( m_tco, SIGNAL( trackColorReset() ), this, SLOT( disableSelectedColor() ) ); - connect( m_tco, SIGNAL( clipColorReset() ), this, SLOT( disableClipSelectedColor() ) ); setModel( m_tco ); connect( m_tco, SIGNAL( trackColorChanged( QColor & ) ), this, SLOT( setColor( QColor & ) ) ); connect( m_trackView->getTrackOperationsWidget(), SIGNAL( colorParented() ), this, SLOT( useTrackColor() ) ); @@ -421,18 +418,6 @@ bool TrackContentObjectView::fixedTCOs() } -void TrackContentObjectView::disableSelectedColor() -{ - m_usesCustomSelectedColor = false; -} - - -void TrackContentObjectView::disableClipSelectedColor() -{ - m_usesCustomSelectedColor = m_trackView->getTrack()->useColor(); -} - - // qproperty access functions, to be inherited & used by TCOviews //! \brief CSS theming qproperty access method @@ -443,7 +428,7 @@ QColor TrackContentObjectView::mutedBackgroundColor() const { return m_mutedBackgroundColor; } QColor TrackContentObjectView::selectedColor() const -{ return ( m_usesCustomSelectedColor ? color().darker(200) : m_selectedColor ); } +{ return ( m_tco->usesStyleColor() ? m_selectedColor : color().darker( 200 ) ); } QColor TrackContentObjectView::textColor() const { return m_textColor; } @@ -644,7 +629,6 @@ void TrackContentObjectView::setColor( QColor & new_color ) // force TCO to use color m_tco->useStyleColor( false ); - m_usesCustomSelectedColor = true; Engine::getSong()->setModified(); update(); From 1bf904a1a86b5c31023a62dc24d2168aa121b306 Mon Sep 17 00:00:00 2001 From: adi Date: Fri, 28 Aug 2020 11:14:12 +0530 Subject: [PATCH 39/63] Migrate some duplicates to superclass --- src/core/Track.cpp | 10 +++++++++- src/gui/AutomationPatternView.cpp | 6 ------ src/tracks/BBTrack.cpp | 4 ---- src/tracks/Pattern.cpp | 6 ------ src/tracks/SampleTrack.cpp | 3 ++- 5 files changed, 11 insertions(+), 18 deletions(-) diff --git a/src/core/Track.cpp b/src/core/Track.cpp index 21b9e2489ae..9f0f189f16e 100644 --- a/src/core/Track.cpp +++ b/src/core/Track.cpp @@ -709,9 +709,10 @@ void TrackContentObjectView::dropEvent( QDropEvent * de ) QDomElement tcos = dataFile.content().firstChildElement( "tcos" ); m_tco->restoreState( tcos.firstChildElement().firstChildElement() ); m_tco->movePosition( pos ); + auto old_tco = dynamic_cast( qwSource )->m_tco; - if( old_tco->usesCustomClipColor() ) + if( old_tco->usesCustomClipColor() && qwSource != NULL ) { m_tco->useStyleColor( false ); m_tco->useCustomClipColor( true ); @@ -1292,6 +1293,13 @@ void TrackContentObjectView::contextMenuEvent( QContextMenuEvent * cme ) : "Mute/unmute selection (<%1> + middle click)" ).arg(UI_CTRL_KEY), [this](){ contextMenuAction( Mute ); } ); + contextMenu.addSeparator(); + + contextMenu.addAction( embed::getIconPixmap( "colorize" ), + tr( "Set clip color" ), this, SLOT( changeClipColor() ) ); + contextMenu.addAction( embed::getIconPixmap( "colorize" ), + tr( "Use track color" ), this, SLOT( useTrackColor() ) ); + constructContextMenu( &contextMenu ); contextMenu.exec( QCursor::pos() ); diff --git a/src/gui/AutomationPatternView.cpp b/src/gui/AutomationPatternView.cpp index 2262b83067a..30c592daa7a 100644 --- a/src/gui/AutomationPatternView.cpp +++ b/src/gui/AutomationPatternView.cpp @@ -217,12 +217,6 @@ void AutomationPatternView::constructContextMenu( QMenu * _cm ) this, SLOT( disconnectObject( QAction * ) ) ); _cm->addMenu( m ); } - - _cm->addSeparator(); - _cm->addAction( embed::getIconPixmap( "colorize" ), - tr( "Set clip color" ), this, SLOT( changeClipColor() ) ); - _cm->addAction( embed::getIconPixmap( "colorize" ), - tr( "Use track color" ), this, SLOT( useTrackColor() ) ); } diff --git a/src/tracks/BBTrack.cpp b/src/tracks/BBTrack.cpp index 5912f73ba6b..f8bf8ea0505 100644 --- a/src/tracks/BBTrack.cpp +++ b/src/tracks/BBTrack.cpp @@ -165,10 +165,6 @@ void BBTCOView::constructContextMenu( QMenu * _cm ) _cm->addAction( embed::getIconPixmap( "edit_rename" ), tr( "Change name" ), this, SLOT( changeName() ) ); - _cm->addAction( embed::getIconPixmap( "colorize" ), - tr( "Change clip color" ), this, SLOT( changeClipColor() ) ); - _cm->addAction( embed::getIconPixmap( "colorize" ), - tr( "Use track color" ), this, SLOT( useTrackColor() ) ); } diff --git a/src/tracks/Pattern.cpp b/src/tracks/Pattern.cpp index 38a882b9040..19df1f5b56b 100644 --- a/src/tracks/Pattern.cpp +++ b/src/tracks/Pattern.cpp @@ -722,12 +722,6 @@ void PatternView::constructContextMenu( QMenu * _cm ) _cm->addAction( embed::getIconPixmap( "step_btn_duplicate" ), tr( "Clone Steps" ), m_pat, SLOT( cloneSteps() ) ); } - - _cm->addSeparator(); - _cm->addAction( embed::getIconPixmap( "colorize" ), - tr( "Set clip color" ), this, SLOT( changeClipColor() ) ); - _cm->addAction( embed::getIconPixmap( "colorize" ), - tr( "Use track color" ), this, SLOT( useTrackColor() ) ); } diff --git a/src/tracks/SampleTrack.cpp b/src/tracks/SampleTrack.cpp index 775763b5ef0..8dfb065e574 100644 --- a/src/tracks/SampleTrack.cpp +++ b/src/tracks/SampleTrack.cpp @@ -412,8 +412,9 @@ void SampleTCOView::contextMenuEvent( QContextMenuEvent * _cme ) /*contextMenu.addAction( embed::getIconPixmap( "record" ), tr( "Set/clear record" ), m_tco, SLOT( toggleRecord() ) );*/ - + contextMenu.addSeparator(); + contextMenu.addAction( embed::getIconPixmap( "colorize" ), tr( "Set clip color" ), this, SLOT( changeClipColor() ) ); contextMenu.addAction( embed::getIconPixmap( "colorize" ), From ed3884b400ccf5a15b64ea6b8b57e6b98e9a74d0 Mon Sep 17 00:00:00 2001 From: adi Date: Fri, 11 Sep 2020 17:27:04 +0530 Subject: [PATCH 40/63] Check for nullpointer --- src/core/Track.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/core/Track.cpp b/src/core/Track.cpp index 9f0f189f16e..5d5aa6bd76c 100644 --- a/src/core/Track.cpp +++ b/src/core/Track.cpp @@ -710,13 +710,13 @@ void TrackContentObjectView::dropEvent( QDropEvent * de ) m_tco->restoreState( tcos.firstChildElement().firstChildElement() ); m_tco->movePosition( pos ); - auto old_tco = dynamic_cast( qwSource )->m_tco; + auto old_tcov = dynamic_cast( qwSource ); - if( old_tco->usesCustomClipColor() && qwSource != NULL ) + if( old_tcov && old_tcov->m_tco->usesCustomClipColor() ) { m_tco->useStyleColor( false ); m_tco->useCustomClipColor( true ); - m_tco->setColor( old_tco->color() ); + m_tco->setColor( old_tcov->color() ); } else { From 391550d4ba8f4143f35fe9d221e3780b2dcd8f4a Mon Sep 17 00:00:00 2001 From: adi Date: Fri, 11 Sep 2020 17:39:50 +0530 Subject: [PATCH 41/63] Remove redundant variable --- include/Track.h | 2 -- src/core/Track.cpp | 16 ++++------------ 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/include/Track.h b/include/Track.h index 7086ae36c13..e944a274736 100644 --- a/include/Track.h +++ b/include/Track.h @@ -553,8 +553,6 @@ private slots: QPushButton * m_trackOps; PixmapButton * m_muteBtn; PixmapButton * m_soloBtn; - - bool colorBarNeedsUpdate; friend class TrackView; diff --git a/src/core/Track.cpp b/src/core/Track.cpp index 5d5aa6bd76c..a09d18e02ef 100644 --- a/src/core/Track.cpp +++ b/src/core/Track.cpp @@ -2215,8 +2215,7 @@ void TrackContentWidget::setEmbossColor( const QBrush & c ) */ TrackOperationsWidget::TrackOperationsWidget( TrackView * parent ) : QWidget( parent ), /*!< The parent widget */ - m_trackView( parent ), /*!< The parent track view */ - colorBarNeedsUpdate( false ) + m_trackView( parent ) /*!< The parent track view */ { ToolTip::add( this, tr( "Press <%1> while clicking on move-grip " "to begin a new drag'n'drop action." ).arg(UI_CTRL_KEY) ); @@ -2350,12 +2349,6 @@ void TrackOperationsWidget::paintEvent( QPaintEvent * pe ) { p.drawPixmap( 2, 2, embed::getIconPixmap("track_op_grip_c")); } - - if( colorBarNeedsUpdate ) - { - colorBarNeedsUpdate = false; - update(); - } } @@ -2410,13 +2403,13 @@ void TrackOperationsWidget::changeTrackColor() { return; } emit colorChanged( new_color ); - colorBarNeedsUpdate = true; + update(); } void TrackOperationsWidget::resetTrackColor() { emit colorReset(); - colorBarNeedsUpdate = true; + update(); } void TrackOperationsWidget::randomTrackColor() @@ -2424,7 +2417,7 @@ void TrackOperationsWidget::randomTrackColor() QColor buffer = ColorChooser::getPalette( ColorChooser::Palette::Track )[ rand() % 48 ]; emit colorChanged( buffer ); - colorBarNeedsUpdate = true; + update(); } void TrackOperationsWidget::useTrackColor() @@ -2486,7 +2479,6 @@ void TrackOperationsWidget::updateMenu() void TrackOperationsWidget::updateColorGradient() { - colorBarNeedsUpdate = true; update(); } From d8ee30fe38680176b0621c11a97cbcefbd3c6b28 Mon Sep 17 00:00:00 2001 From: adi Date: Sun, 13 Sep 2020 14:17:42 +0530 Subject: [PATCH 42/63] Update some logic --- include/Track.h | 1 - src/core/Track.cpp | 2 +- src/gui/AutomationPatternView.cpp | 26 +++++++++++++++++++++++--- src/tracks/BBTrack.cpp | 25 ++++++++++++++++++++++--- src/tracks/Pattern.cpp | 31 +++++++++++++++++++++++++++---- src/tracks/SampleTrack.cpp | 26 +++++++++++++++++++++++--- 6 files changed, 96 insertions(+), 15 deletions(-) diff --git a/include/Track.h b/include/Track.h index e944a274736..d8adce13adf 100644 --- a/include/Track.h +++ b/include/Track.h @@ -389,7 +389,6 @@ protected slots: QColor m_mutedColor; QColor m_mutedBackgroundColor; QColor m_selectedColor; - QColor m_customSelectedColor; QColor m_textColor; QColor m_textBackgroundColor; QColor m_textShadowColor; diff --git a/src/core/Track.cpp b/src/core/Track.cpp index d064102e18d..25220e1dcb2 100644 --- a/src/core/Track.cpp +++ b/src/core/Track.cpp @@ -428,7 +428,7 @@ QColor TrackContentObjectView::mutedBackgroundColor() const { return m_mutedBackgroundColor; } QColor TrackContentObjectView::selectedColor() const -{ return ( m_tco->usesStyleColor() ? m_selectedColor : color().darker( 200 ) ); } +{ return m_selectedColor; } QColor TrackContentObjectView::textColor() const { return m_textColor; } diff --git a/src/gui/AutomationPatternView.cpp b/src/gui/AutomationPatternView.cpp index 30c592daa7a..69395733394 100644 --- a/src/gui/AutomationPatternView.cpp +++ b/src/gui/AutomationPatternView.cpp @@ -260,9 +260,29 @@ void AutomationPatternView::paintEvent( QPaintEvent * ) bool current = gui->automationEditor()->currentPattern() == m_pat; // state: selected, muted, colored, normal - c = isSelected() ? selectedColor() : ( muted ? mutedBackgroundColor() - : ( ! m_pat->usesStyleColor() ? m_pat->color() - : painter.background().color() ) ); + if( isSelected() ) + { + c = m_pat->usesStyleColor() + ? selectedColor() + : ( muted + ? m_pat->color().darker( 300 ) + : m_pat->color().darker( 150 ) ); + } + else + { + if( muted ) + { + c = m_pat->usesStyleColor() + ? mutedBackgroundColor() + : m_pat->color().darker( 200 ); + } + else + { + c = ! m_pat->usesStyleColor() + ? m_pat->color() + : painter.background().color(); + } + } lingrad.setColorAt( 1, c.darker( 300 ) ); lingrad.setColorAt( 0, c ); diff --git a/src/tracks/BBTrack.cpp b/src/tracks/BBTrack.cpp index f8bf8ea0505..27a5475a682 100644 --- a/src/tracks/BBTrack.cpp +++ b/src/tracks/BBTrack.cpp @@ -202,9 +202,28 @@ void BBTCOView::paintEvent( QPaintEvent * ) bool muted = m_bbTCO->getTrack()->isMuted() || m_bbTCO->isMuted(); // state: selected, muted, default, colored - c = isSelected() ? selectedColor() : ( muted ? mutedBackgroundColor() - : ( m_bbTCO->usesStyleColor() ? painter.background().color() - : m_bbTCO->color() ) ); + if( isSelected() ) + { + c = m_bbTCO->usesStyleColor() + ? selectedColor() + : ( muted ? m_bbTCO->color().darker( 300 ) + : m_bbTCO->color().darker( 150 ) ); + } + else + { + if( muted ) + { + c = m_bbTCO->usesStyleColor() + ? mutedBackgroundColor() + : m_bbTCO->color().darker( 200 ); + } + else + { + c = m_bbTCO->usesStyleColor() + ? painter.background().color() + : m_bbTCO->color(); + } + } lingrad.setColorAt( 0, c.lighter( 130 ) ); lingrad.setColorAt( 1, c.lighter( 70 ) ); diff --git a/src/tracks/Pattern.cpp b/src/tracks/Pattern.cpp index e295c124902..c423d2780b9 100644 --- a/src/tracks/Pattern.cpp +++ b/src/tracks/Pattern.cpp @@ -874,15 +874,38 @@ void PatternView::paintEvent( QPaintEvent * ) QPainter p( &m_paintPixmap ); + QColor c; bool const muted = m_pat->getTrack()->isMuted() || m_pat->isMuted(); bool current = gui->pianoRoll()->currentPattern() == m_pat; bool beatPattern = m_pat->m_patternType == Pattern::BeatPattern; // state: selected, normal, beat pattern, muted, colored - QColor c = isSelected() ? selectedColor() : ( ( !muted && m_pat->usesStyleColor() && !beatPattern ) - ? painter.background().color() : ( beatPattern - ? BBPatternBackground() : ( muted - ? mutedBackgroundColor() : m_pat->color() ) ) ); + if( isSelected() ) + { + c = m_pat->usesStyleColor() + ? selectedColor() + : ( muted ? m_pat->color().darker( 300 ) : m_pat->color().darker( 150 ) ); + } + else + { + if( !muted && m_pat->usesStyleColor() && !beatPattern ) + { + c = painter.background().color(); + } + else + { + if( muted ) + { + c = m_pat->usesStyleColor() + ? mutedBackgroundColor() + : m_pat->color().darker( 200 ); + } + else + { + c = m_pat->color(); + } + } + } // invert the gradient for the background in the B&B editor QLinearGradient lingrad( 0, 0, 0, height() ); diff --git a/src/tracks/SampleTrack.cpp b/src/tracks/SampleTrack.cpp index b7fda891040..dce6da65cd8 100644 --- a/src/tracks/SampleTrack.cpp +++ b/src/tracks/SampleTrack.cpp @@ -552,9 +552,29 @@ void SampleTCOView::paintEvent( QPaintEvent * pe ) bool muted = m_tco->getTrack()->isMuted() || m_tco->isMuted(); // state: selected, muted, colored, normal - c = isSelected() ? selectedColor() : ( muted ? mutedBackgroundColor() - : ( ! m_tco->usesStyleColor() ? m_tco->color() - : painter.background().color() ) ); + if( isSelected() ) + { + c = m_tco->usesStyleColor() + ? selectedColor() + : ( muted + ? m_tco->color().darker( 300 ) + : m_tco->color().darker( 150 ) ); + } + else + { + if( muted ) + { + c = m_tco->usesStyleColor() + ? mutedBackgroundColor() + : m_tco->color().darker( 200 ); + } + else + { + c = ! m_tco->usesStyleColor() + ? m_tco->color() + : painter.background().color(); + } + } lingrad.setColorAt( 1, c.darker( 300 ) ); lingrad.setColorAt( 0, c ); From 7d06af17801ad12553ad8bae4106b34c7bf1ec87 Mon Sep 17 00:00:00 2001 From: adi Date: Wed, 16 Sep 2020 17:59:31 +0530 Subject: [PATCH 43/63] Change how muted colors are displayed --- src/gui/AutomationPatternView.cpp | 8 +++++--- src/tracks/BBTrack.cpp | 8 +++++--- src/tracks/Pattern.cpp | 8 +++++--- src/tracks/SampleTrack.cpp | 8 +++++--- 4 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/gui/AutomationPatternView.cpp b/src/gui/AutomationPatternView.cpp index 69395733394..298123ae962 100644 --- a/src/gui/AutomationPatternView.cpp +++ b/src/gui/AutomationPatternView.cpp @@ -255,9 +255,11 @@ void AutomationPatternView::paintEvent( QPaintEvent * ) QPainter p( &m_paintPixmap ); QLinearGradient lingrad( 0, 0, 0, height() ); - QColor c; + QColor c, mutedCustomColor; bool muted = m_pat->getTrack()->isMuted() || m_pat->isMuted(); bool current = gui->automationEditor()->currentPattern() == m_pat; + mutedCustomColor = m_pat->color(); + mutedCustomColor.setHsv( mutedCustomColor.hsvHue(), mutedCustomColor.hsvSaturation() / 4, mutedCustomColor.value() ); // state: selected, muted, colored, normal if( isSelected() ) @@ -265,7 +267,7 @@ void AutomationPatternView::paintEvent( QPaintEvent * ) c = m_pat->usesStyleColor() ? selectedColor() : ( muted - ? m_pat->color().darker( 300 ) + ? mutedCustomColor.darker( 300 ) : m_pat->color().darker( 150 ) ); } else @@ -274,7 +276,7 @@ void AutomationPatternView::paintEvent( QPaintEvent * ) { c = m_pat->usesStyleColor() ? mutedBackgroundColor() - : m_pat->color().darker( 200 ); + : mutedCustomColor.darker( 200 ); } else { diff --git a/src/tracks/BBTrack.cpp b/src/tracks/BBTrack.cpp index 27a5475a682..9c9caf348e5 100644 --- a/src/tracks/BBTrack.cpp +++ b/src/tracks/BBTrack.cpp @@ -198,15 +198,17 @@ void BBTCOView::paintEvent( QPaintEvent * ) QPainter p( &m_paintPixmap ); QLinearGradient lingrad( 0, 0, 0, height() ); - QColor c; + QColor c, mutedCustomColor; bool muted = m_bbTCO->getTrack()->isMuted() || m_bbTCO->isMuted(); + mutedCustomColor = m_bbTCO->color(); + mutedCustomColor.setHsv( mutedCustomColor.hsvHue(), mutedCustomColor.hsvSaturation() / 4, mutedCustomColor.value() ); // state: selected, muted, default, colored if( isSelected() ) { c = m_bbTCO->usesStyleColor() ? selectedColor() - : ( muted ? m_bbTCO->color().darker( 300 ) + : ( muted ? mutedCustomColor.darker( 300 ) : m_bbTCO->color().darker( 150 ) ); } else @@ -215,7 +217,7 @@ void BBTCOView::paintEvent( QPaintEvent * ) { c = m_bbTCO->usesStyleColor() ? mutedBackgroundColor() - : m_bbTCO->color().darker( 200 ); + : mutedCustomColor.darker( 200 ); } else { diff --git a/src/tracks/Pattern.cpp b/src/tracks/Pattern.cpp index c423d2780b9..b728b6ac000 100644 --- a/src/tracks/Pattern.cpp +++ b/src/tracks/Pattern.cpp @@ -874,17 +874,19 @@ void PatternView::paintEvent( QPaintEvent * ) QPainter p( &m_paintPixmap ); - QColor c; + QColor c, mutedCustomColor; bool const muted = m_pat->getTrack()->isMuted() || m_pat->isMuted(); bool current = gui->pianoRoll()->currentPattern() == m_pat; bool beatPattern = m_pat->m_patternType == Pattern::BeatPattern; + mutedCustomColor = m_pat->color(); + mutedCustomColor.setHsv( mutedCustomColor.hsvHue(), mutedCustomColor.hsvSaturation() / 4, mutedCustomColor.value() ); // state: selected, normal, beat pattern, muted, colored if( isSelected() ) { c = m_pat->usesStyleColor() ? selectedColor() - : ( muted ? m_pat->color().darker( 300 ) : m_pat->color().darker( 150 ) ); + : ( muted ? mutedCustomColor.darker( 300 ) : m_pat->color().darker( 150 ) ); } else { @@ -898,7 +900,7 @@ void PatternView::paintEvent( QPaintEvent * ) { c = m_pat->usesStyleColor() ? mutedBackgroundColor() - : m_pat->color().darker( 200 ); + : mutedCustomColor.darker( 200 ); } else { diff --git a/src/tracks/SampleTrack.cpp b/src/tracks/SampleTrack.cpp index dce6da65cd8..3a4e549b8fa 100644 --- a/src/tracks/SampleTrack.cpp +++ b/src/tracks/SampleTrack.cpp @@ -548,8 +548,10 @@ void SampleTCOView::paintEvent( QPaintEvent * pe ) QPainter p( &m_paintPixmap ); QLinearGradient lingrad( 0, 0, 0, height() ); - QColor c; + QColor c, mutedCustomColor; bool muted = m_tco->getTrack()->isMuted() || m_tco->isMuted(); + mutedCustomColor = m_tco->color(); + mutedCustomColor.setHsv( mutedCustomColor.hsvHue(), mutedCustomColor.hsvSaturation() / 4, mutedCustomColor.value() ); // state: selected, muted, colored, normal if( isSelected() ) @@ -557,7 +559,7 @@ void SampleTCOView::paintEvent( QPaintEvent * pe ) c = m_tco->usesStyleColor() ? selectedColor() : ( muted - ? m_tco->color().darker( 300 ) + ? mutedCustomColor.darker( 300 ) : m_tco->color().darker( 150 ) ); } else @@ -566,7 +568,7 @@ void SampleTCOView::paintEvent( QPaintEvent * pe ) { c = m_tco->usesStyleColor() ? mutedBackgroundColor() - : m_tco->color().darker( 200 ); + : mutedCustomColor.darker( 200 ); } else { From 1c672c66642d0fdf60fa8860a2bbee4fd112db7f Mon Sep 17 00:00:00 2001 From: adi Date: Wed, 16 Sep 2020 18:36:07 +0530 Subject: [PATCH 44/63] Change how dark muted tracks become --- src/gui/AutomationPatternView.cpp | 4 ++-- src/tracks/BBTrack.cpp | 4 ++-- src/tracks/Pattern.cpp | 4 ++-- src/tracks/SampleTrack.cpp | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/gui/AutomationPatternView.cpp b/src/gui/AutomationPatternView.cpp index 298123ae962..57960ccdc07 100644 --- a/src/gui/AutomationPatternView.cpp +++ b/src/gui/AutomationPatternView.cpp @@ -267,7 +267,7 @@ void AutomationPatternView::paintEvent( QPaintEvent * ) c = m_pat->usesStyleColor() ? selectedColor() : ( muted - ? mutedCustomColor.darker( 300 ) + ? mutedCustomColor.darker( 350 ) : m_pat->color().darker( 150 ) ); } else @@ -276,7 +276,7 @@ void AutomationPatternView::paintEvent( QPaintEvent * ) { c = m_pat->usesStyleColor() ? mutedBackgroundColor() - : mutedCustomColor.darker( 200 ); + : mutedCustomColor.darker( 250 ); } else { diff --git a/src/tracks/BBTrack.cpp b/src/tracks/BBTrack.cpp index 9c9caf348e5..07077599508 100644 --- a/src/tracks/BBTrack.cpp +++ b/src/tracks/BBTrack.cpp @@ -208,7 +208,7 @@ void BBTCOView::paintEvent( QPaintEvent * ) { c = m_bbTCO->usesStyleColor() ? selectedColor() - : ( muted ? mutedCustomColor.darker( 300 ) + : ( muted ? mutedCustomColor.darker( 350 ) : m_bbTCO->color().darker( 150 ) ); } else @@ -217,7 +217,7 @@ void BBTCOView::paintEvent( QPaintEvent * ) { c = m_bbTCO->usesStyleColor() ? mutedBackgroundColor() - : mutedCustomColor.darker( 200 ); + : mutedCustomColor.darker( 250 ); } else { diff --git a/src/tracks/Pattern.cpp b/src/tracks/Pattern.cpp index b728b6ac000..20083e4e404 100644 --- a/src/tracks/Pattern.cpp +++ b/src/tracks/Pattern.cpp @@ -886,7 +886,7 @@ void PatternView::paintEvent( QPaintEvent * ) { c = m_pat->usesStyleColor() ? selectedColor() - : ( muted ? mutedCustomColor.darker( 300 ) : m_pat->color().darker( 150 ) ); + : ( muted ? mutedCustomColor.darker( 350 ) : m_pat->color().darker( 150 ) ); } else { @@ -900,7 +900,7 @@ void PatternView::paintEvent( QPaintEvent * ) { c = m_pat->usesStyleColor() ? mutedBackgroundColor() - : mutedCustomColor.darker( 200 ); + : mutedCustomColor.darker( 250 ); } else { diff --git a/src/tracks/SampleTrack.cpp b/src/tracks/SampleTrack.cpp index 3a4e549b8fa..7f9959f28b0 100644 --- a/src/tracks/SampleTrack.cpp +++ b/src/tracks/SampleTrack.cpp @@ -559,7 +559,7 @@ void SampleTCOView::paintEvent( QPaintEvent * pe ) c = m_tco->usesStyleColor() ? selectedColor() : ( muted - ? mutedCustomColor.darker( 300 ) + ? mutedCustomColor.darker( 350 ) : m_tco->color().darker( 150 ) ); } else @@ -568,7 +568,7 @@ void SampleTCOView::paintEvent( QPaintEvent * pe ) { c = m_tco->usesStyleColor() ? mutedBackgroundColor() - : mutedCustomColor.darker( 200 ); + : mutedCustomColor.darker( 250 ); } else { From 25688c022e10ea9b9f769adf97fd719989b6f8ef Mon Sep 17 00:00:00 2001 From: adi Date: Fri, 25 Sep 2020 09:00:06 +0530 Subject: [PATCH 45/63] Place setModified() in appropriate places --- src/core/Track.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/core/Track.cpp b/src/core/Track.cpp index 7755f73ff7e..aabcc0050fa 100644 --- a/src/core/Track.cpp +++ b/src/core/Track.cpp @@ -614,7 +614,6 @@ void TrackContentObjectView::trackColorReset() if( ! m_tco->usesStyleColor() && ! m_tco->usesCustomClipColor() ) { m_tco->useStyleColor( true ); - Engine::getSong()->setModified(); update(); } } @@ -629,8 +628,6 @@ void TrackContentObjectView::setColor( QColor & new_color ) // force TCO to use color m_tco->useStyleColor( false ); - - Engine::getSong()->setModified(); update(); } @@ -2396,12 +2393,15 @@ void TrackOperationsWidget::changeTrackColor() { return; } emit colorChanged( new_color ); + + Engine::getSong()->setModified(); update(); } void TrackOperationsWidget::resetTrackColor() { emit colorReset(); + Engine::getSong()->setModified(); update(); } @@ -2410,12 +2410,14 @@ void TrackOperationsWidget::randomTrackColor() QColor buffer = ColorChooser::getPalette( ColorChooser::Palette::Track )[ rand() % 48 ]; emit colorChanged( buffer ); + Engine::getSong()->setModified(); update(); } void TrackOperationsWidget::useTrackColor() { emit colorParented(); + Engine::getSong()->setModified(); } From c5ef16400e9d78ec0187847edadc113a2189d3cb Mon Sep 17 00:00:00 2001 From: adi Date: Fri, 25 Sep 2020 09:42:11 +0530 Subject: [PATCH 46/63] Make getColorForDisplay() function --- include/Track.h | 2 ++ src/core/Track.cpp | 37 ++++++++++++++++++++++++++++ src/gui/AutomationPatternView.cpp | 29 +--------------------- src/tracks/BBTrack.cpp | 29 +--------------------- src/tracks/Pattern.cpp | 40 +++++++++++-------------------- src/tracks/SampleTrack.cpp | 29 +--------------------- 6 files changed, 56 insertions(+), 110 deletions(-) diff --git a/include/Track.h b/include/Track.h index d8adce13adf..e6f7e478e89 100644 --- a/include/Track.h +++ b/include/Track.h @@ -307,6 +307,8 @@ class TrackContentObjectView : public selectableObject, public ModelView // some metadata to be written to the clipboard. static void remove( QVector tcovs ); static void toggleMute( QVector tcovs ); + + QColor getColorForDisplay( QColor ); public slots: virtual bool close(); diff --git a/src/core/Track.cpp b/src/core/Track.cpp index aabcc0050fa..ff89f16f771 100644 --- a/src/core/Track.cpp +++ b/src/core/Track.cpp @@ -1535,6 +1535,43 @@ MidiTime TrackContentObjectView::draggedTCOPos( QMouseEvent * me ) } +QColor TrackContentObjectView::getColorForDisplay( QColor defaultColor ) +{ + QColor c, mutedCustomColor; + bool muted = m_tco->getTrack()->isMuted() || m_tco->isMuted(); + mutedCustomColor = m_tco->color(); + mutedCustomColor.setHsv( mutedCustomColor.hsvHue(), mutedCustomColor.hsvSaturation() / 4, mutedCustomColor.value() ); + + // state: selected, muted, colored, normal + if( isSelected() ) + { + c = m_tco->usesStyleColor() + ? selectedColor() + : ( muted + ? mutedCustomColor.darker( 350 ) + : m_tco->color().darker( 150 ) ); + } + else + { + if( muted ) + { + c = m_tco->usesStyleColor() + ? mutedBackgroundColor() + : mutedCustomColor.darker( 250 ); + } + else + { + c = ! m_tco->usesStyleColor() + ? m_tco->color() + : defaultColor; + } + } + + return c; +} + + + // =========================================================================== diff --git a/src/gui/AutomationPatternView.cpp b/src/gui/AutomationPatternView.cpp index 57960ccdc07..7399f7e31f5 100644 --- a/src/gui/AutomationPatternView.cpp +++ b/src/gui/AutomationPatternView.cpp @@ -255,36 +255,9 @@ void AutomationPatternView::paintEvent( QPaintEvent * ) QPainter p( &m_paintPixmap ); QLinearGradient lingrad( 0, 0, 0, height() ); - QColor c, mutedCustomColor; + QColor c = getColorForDisplay( painter.background().color() ); bool muted = m_pat->getTrack()->isMuted() || m_pat->isMuted(); bool current = gui->automationEditor()->currentPattern() == m_pat; - mutedCustomColor = m_pat->color(); - mutedCustomColor.setHsv( mutedCustomColor.hsvHue(), mutedCustomColor.hsvSaturation() / 4, mutedCustomColor.value() ); - - // state: selected, muted, colored, normal - if( isSelected() ) - { - c = m_pat->usesStyleColor() - ? selectedColor() - : ( muted - ? mutedCustomColor.darker( 350 ) - : m_pat->color().darker( 150 ) ); - } - else - { - if( muted ) - { - c = m_pat->usesStyleColor() - ? mutedBackgroundColor() - : mutedCustomColor.darker( 250 ); - } - else - { - c = ! m_pat->usesStyleColor() - ? m_pat->color() - : painter.background().color(); - } - } lingrad.setColorAt( 1, c.darker( 300 ) ); lingrad.setColorAt( 0, c ); diff --git a/src/tracks/BBTrack.cpp b/src/tracks/BBTrack.cpp index d3b94876976..7d0ccef7def 100644 --- a/src/tracks/BBTrack.cpp +++ b/src/tracks/BBTrack.cpp @@ -198,34 +198,7 @@ void BBTCOView::paintEvent( QPaintEvent * ) QPainter p( &m_paintPixmap ); QLinearGradient lingrad( 0, 0, 0, height() ); - QColor c, mutedCustomColor; - bool muted = m_bbTCO->getTrack()->isMuted() || m_bbTCO->isMuted(); - mutedCustomColor = m_bbTCO->color(); - mutedCustomColor.setHsv( mutedCustomColor.hsvHue(), mutedCustomColor.hsvSaturation() / 4, mutedCustomColor.value() ); - - // state: selected, muted, default, colored - if( isSelected() ) - { - c = m_bbTCO->usesStyleColor() - ? selectedColor() - : ( muted ? mutedCustomColor.darker( 350 ) - : m_bbTCO->color().darker( 150 ) ); - } - else - { - if( muted ) - { - c = m_bbTCO->usesStyleColor() - ? mutedBackgroundColor() - : mutedCustomColor.darker( 250 ); - } - else - { - c = m_bbTCO->usesStyleColor() - ? painter.background().color() - : m_bbTCO->color(); - } - } + QColor c = getColorForDisplay( painter.background().color() ); lingrad.setColorAt( 0, c.lighter( 130 ) ); lingrad.setColorAt( 1, c.lighter( 70 ) ); diff --git a/src/tracks/Pattern.cpp b/src/tracks/Pattern.cpp index 38a1b65a6e7..f758afe1652 100644 --- a/src/tracks/Pattern.cpp +++ b/src/tracks/Pattern.cpp @@ -870,39 +870,18 @@ void PatternView::paintEvent( QPaintEvent * ) QPainter p( &m_paintPixmap ); - QColor c, mutedCustomColor; + QColor c; bool const muted = m_pat->getTrack()->isMuted() || m_pat->isMuted(); bool current = gui->pianoRoll()->currentPattern() == m_pat; bool beatPattern = m_pat->m_patternType == Pattern::BeatPattern; - mutedCustomColor = m_pat->color(); - mutedCustomColor.setHsv( mutedCustomColor.hsvHue(), mutedCustomColor.hsvSaturation() / 4, mutedCustomColor.value() ); - - // state: selected, normal, beat pattern, muted, colored - if( isSelected() ) + + if( beatPattern ) { - c = m_pat->usesStyleColor() - ? selectedColor() - : ( muted ? mutedCustomColor.darker( 350 ) : m_pat->color().darker( 150 ) ); + c = BBPatternBackground(); } else { - if( !muted && m_pat->usesStyleColor() && !beatPattern ) - { - c = painter.background().color(); - } - else - { - if( muted ) - { - c = m_pat->usesStyleColor() - ? mutedBackgroundColor() - : mutedCustomColor.darker( 250 ); - } - else - { - c = m_pat->color(); - } - } + c = getColorForDisplay( painter.background().color() ); } // invert the gradient for the background in the B&B editor @@ -1122,6 +1101,15 @@ void PatternView::paintEvent( QPaintEvent * ) } } // end for loop + // NOTE FOR REVIEWERS: is this worth adding? + // draw a transparent rectangle over colored patterns + /*if ( !m_pat->usesStyleColor() ) + { + p.setBrush( m_pat->color() ); + p.setOpacity( 0.25 ); + p.drawRect( 0, 0, width(), height() ); + }*/ + // draw a transparent rectangle over muted patterns if ( muted ) { diff --git a/src/tracks/SampleTrack.cpp b/src/tracks/SampleTrack.cpp index 7f9959f28b0..3094857d04e 100644 --- a/src/tracks/SampleTrack.cpp +++ b/src/tracks/SampleTrack.cpp @@ -548,35 +548,8 @@ void SampleTCOView::paintEvent( QPaintEvent * pe ) QPainter p( &m_paintPixmap ); QLinearGradient lingrad( 0, 0, 0, height() ); - QColor c, mutedCustomColor; + QColor c = getColorForDisplay( painter.background().color() ); bool muted = m_tco->getTrack()->isMuted() || m_tco->isMuted(); - mutedCustomColor = m_tco->color(); - mutedCustomColor.setHsv( mutedCustomColor.hsvHue(), mutedCustomColor.hsvSaturation() / 4, mutedCustomColor.value() ); - - // state: selected, muted, colored, normal - if( isSelected() ) - { - c = m_tco->usesStyleColor() - ? selectedColor() - : ( muted - ? mutedCustomColor.darker( 350 ) - : m_tco->color().darker( 150 ) ); - } - else - { - if( muted ) - { - c = m_tco->usesStyleColor() - ? mutedBackgroundColor() - : mutedCustomColor.darker( 250 ); - } - else - { - c = ! m_tco->usesStyleColor() - ? m_tco->color() - : painter.background().color(); - } - } lingrad.setColorAt( 1, c.darker( 300 ) ); lingrad.setColorAt( 0, c ); From be89ef255492f039fd93ddf7bc7a17d10c691d6c Mon Sep 17 00:00:00 2001 From: adi Date: Fri, 25 Sep 2020 11:53:25 +0530 Subject: [PATCH 47/63] Change how colors are organised and saved --- include/Track.h | 5 ++--- src/core/AutomationPattern.cpp | 20 +++++++++++++++----- src/core/Track.cpp | 29 ++++++++++++++--------------- src/tracks/BBTrack.cpp | 20 +++++++++++++++----- src/tracks/Pattern.cpp | 21 +++++++++++++++------ src/tracks/SampleTrack.cpp | 24 +++++++++++++++++------- 6 files changed, 78 insertions(+), 41 deletions(-) diff --git a/include/Track.h b/include/Track.h index e6f7e478e89..6f84d127644 100644 --- a/include/Track.h +++ b/include/Track.h @@ -182,8 +182,7 @@ class LMMS_EXPORT TrackContentObject : public Model, public JournallingObject MidiTime startTimeOffset() const; void setStartTimeOffset( const MidiTime &startTimeOffset ); - void setBGColor( QColor & c ); - QColor BGColor(); + void updateColor(); void resetColor(); public slots: @@ -196,7 +195,7 @@ public slots: void lengthChanged(); void positionChanged(); void destroyedTCO(); - void trackColorChanged( QColor & ); + void trackColorChanged(); void clipColorChanged( QColor & ); void trackColorReset(); void clipColorReset(); diff --git a/src/core/AutomationPattern.cpp b/src/core/AutomationPattern.cpp index 4006543b717..f9ced78be6d 100644 --- a/src/core/AutomationPattern.cpp +++ b/src/core/AutomationPattern.cpp @@ -541,8 +541,15 @@ void AutomationPattern::saveSettings( QDomDocument & _doc, QDomElement & _this ) if( ! usesStyleColor() ) { - _this.setAttribute( "color", color().name() ); - _this.setAttribute( "isclipcolor", usesCustomClipColor() ); + if( usesCustomClipColor() ) + { + _this.setAttribute( "color", color().name() ); + _this.setAttribute( "usesclipcolor", true ); + } + else + { + _this.setAttribute( "usesclipcolor", false ); + } } for( timeMap::const_iterator it = m_timeMap.begin(); @@ -600,11 +607,14 @@ void AutomationPattern::loadSettings( const QDomElement & _this ) } } - if( _this.hasAttribute( "color" ) ) + if( _this.hasAttribute( "usesclipcolor" ) ) { useStyleColor( false ); - useCustomClipColor( _this.attribute( "isclipcolor" ) == "1" ); - setColor( _this.attribute( "color" ) ); + useCustomClipColor( _this.attribute( "usesclipcolor" ) == "1" ); + if( usesCustomClipColor() ) + { + setColor( _this.attribute( "color" ) ); + } } int len = _this.attribute( "len" ).toInt(); diff --git a/src/core/Track.cpp b/src/core/Track.cpp index ff89f16f771..e5ab5bf568d 100644 --- a/src/core/Track.cpp +++ b/src/core/Track.cpp @@ -263,20 +263,15 @@ void TrackContentObject::setStartTimeOffset( const MidiTime &startTimeOffset ) m_startTimeOffset = startTimeOffset; } -void TrackContentObject::setBGColor( QColor & c ) +void TrackContentObject::updateColor() { if( ! m_useCustomClipColor ) { - m_color = c; - emit trackColorChanged( m_color ); + m_useStyleColor = false; + emit trackColorChanged(); } } -QColor TrackContentObject::BGColor() -{ - return m_color; -} - void TrackContentObject::resetColor() { if( ! m_useCustomClipColor ) emit trackColorReset(); @@ -352,7 +347,7 @@ TrackContentObjectView::TrackContentObjectView( TrackContentObject * tco, this, SLOT( updatePosition() ) ); connect( m_tco, SIGNAL( destroyedTCO() ), this, SLOT( close() ) ); setModel( m_tco ); - connect( m_tco, SIGNAL( trackColorChanged( QColor & ) ), this, SLOT( setColor( QColor & ) ) ); + connect( m_tco, SIGNAL( trackColorChanged() ), this, SLOT( update() ) ); connect( m_trackView->getTrackOperationsWidget(), SIGNAL( colorParented() ), this, SLOT( useTrackColor() ) ); m_trackView->getTrackContentWidget()->addTCOView( this ); @@ -1537,9 +1532,15 @@ MidiTime TrackContentObjectView::draggedTCOPos( QMouseEvent * me ) QColor TrackContentObjectView::getColorForDisplay( QColor defaultColor ) { + auto tcoColor = m_tco->usesStyleColor() + ? defaultColor + : m_tco->usesCustomClipColor() + ? m_tco->color() + : m_tco->getTrack()->color(); + QColor c, mutedCustomColor; bool muted = m_tco->getTrack()->isMuted() || m_tco->isMuted(); - mutedCustomColor = m_tco->color(); + mutedCustomColor = tcoColor; mutedCustomColor.setHsv( mutedCustomColor.hsvHue(), mutedCustomColor.hsvSaturation() / 4, mutedCustomColor.value() ); // state: selected, muted, colored, normal @@ -1549,7 +1550,7 @@ QColor TrackContentObjectView::getColorForDisplay( QColor defaultColor ) ? selectedColor() : ( muted ? mutedCustomColor.darker( 350 ) - : m_tco->color().darker( 150 ) ); + : tcoColor.darker( 150 ) ); } else { @@ -1561,9 +1562,7 @@ QColor TrackContentObjectView::getColorForDisplay( QColor defaultColor ) } else { - c = ! m_tco->usesStyleColor() - ? m_tco->color() - : defaultColor; + c = tcoColor; } } @@ -3161,7 +3160,7 @@ void Track::trackColorChanged( QColor & c ) { for (int i = 0; i < numOfTCOs(); i++) { - m_trackContentObjects[i]->setBGColor(c); + m_trackContentObjects[i]->updateColor(); } m_hasColor = true; m_color = c; diff --git a/src/tracks/BBTrack.cpp b/src/tracks/BBTrack.cpp index 7d0ccef7def..7c778e2994b 100644 --- a/src/tracks/BBTrack.cpp +++ b/src/tracks/BBTrack.cpp @@ -73,8 +73,15 @@ void BBTCO::saveSettings( QDomDocument & doc, QDomElement & element ) element.setAttribute( "muted", isMuted() ); if( ! usesStyleColor() ) { - element.setAttribute( "color", color().name() ); - element.setAttribute( "isclipcolor", usesCustomClipColor() ); + if( usesCustomClipColor() ) + { + element.setAttribute( "color", color().name() ); + element.setAttribute( "usesclipcolor", true ); + } + else + { + element.setAttribute( "usesclipcolor", false ); + } } } @@ -95,11 +102,14 @@ void BBTCO::loadSettings( const QDomElement & element ) } // for colors saved in 1.3-onwards - if( element.hasAttribute( "isclipcolor" ) ) + if( element.hasAttribute( "usesclipcolor" ) ) { useStyleColor( false ); - useCustomClipColor( element.attribute( "isclipcolor" ) == "1" ); - setColor( element.attribute( "color" ) ); + useCustomClipColor( element.attribute( "usesclipcolor" ) == "1" ); + if( usesCustomClipColor() ) + { + setColor( element.attribute( "color" ) ); + } } // for colors saved before 1.3 diff --git a/src/tracks/Pattern.cpp b/src/tracks/Pattern.cpp index f758afe1652..7785cf02b17 100644 --- a/src/tracks/Pattern.cpp +++ b/src/tracks/Pattern.cpp @@ -361,9 +361,15 @@ void Pattern::saveSettings( QDomDocument & _doc, QDomElement & _this ) if( ! usesStyleColor() ) { - - _this.setAttribute( "color", color().name() ); - _this.setAttribute( "isclipcolor", usesCustomClipColor() ); + if( usesCustomClipColor() ) + { + _this.setAttribute( "color", color().name() ); + _this.setAttribute( "usesclipcolor", true ); + } + else + { + _this.setAttribute( "usesclipcolor", false ); + } } // as the target of copied/dragged pattern is always an existing // pattern, we must not store actual position, instead we store -1 @@ -397,11 +403,14 @@ void Pattern::loadSettings( const QDomElement & _this ) ).toInt() ); setName( _this.attribute( "name" ) ); - if( _this.hasAttribute( "color" ) ) + if( _this.hasAttribute( "usesclipcolor" ) ) { useStyleColor( false ); - useCustomClipColor( _this.attribute( "isclipcolor" ) == "1" ); - setColor( _this.attribute( "color" ) ); + useCustomClipColor( _this.attribute( "usesclipcolor" ) == "1" ); + if( usesCustomClipColor() ) + { + setColor( _this.attribute( "color" ) ); + } } if( _this.attribute( "pos" ).toInt() >= 0 ) diff --git a/src/tracks/SampleTrack.cpp b/src/tracks/SampleTrack.cpp index 3094857d04e..fb31bd6e823 100644 --- a/src/tracks/SampleTrack.cpp +++ b/src/tracks/SampleTrack.cpp @@ -278,8 +278,15 @@ void SampleTCO::saveSettings( QDomDocument & _doc, QDomElement & _this ) _this.setAttribute( "sample_rate", m_sampleBuffer->sampleRate()); if( ! usesStyleColor() ) { - _this.setAttribute( "color", color().name() ); - _this.setAttribute( "isclipcolor", usesCustomClipColor() ); + if( usesCustomClipColor() ) + { + _this.setAttribute( "color", color().name() ); + _this.setAttribute( "usesclipcolor", true ); + } + else + { + _this.setAttribute( "usesclipcolor", false ); + } } // TODO: start- and end-frame } @@ -302,15 +309,18 @@ void SampleTCO::loadSettings( const QDomElement & _this ) setMuted( _this.attribute( "muted" ).toInt() ); setStartTimeOffset( _this.attribute( "off" ).toInt() ); - if (_this.hasAttribute("sample_rate")) { - m_sampleBuffer->setSampleRate(_this.attribute("sample_rate").toInt()); + if ( _this.hasAttribute( "sample_rate" ) ) { + m_sampleBuffer->setSampleRate( _this.attribute( "sample_rate" ).toInt() ); } - if( _this.hasAttribute( "color" ) ) + if( _this.hasAttribute( "usesclipcolor" ) ) { useStyleColor( false ); - useCustomClipColor( _this.attribute( "isclipcolor" ) == "1" ); - setColor( _this.attribute( "color" ) ); + useCustomClipColor( _this.attribute( "usesclipcolor" ) == "1" ); + if( usesCustomClipColor() ) + { + setColor( _this.attribute( "color" ) ); + } } } From a601b50c212a12e83e889ca8f211967e63bdb593 Mon Sep 17 00:00:00 2001 From: adi Date: Tue, 29 Sep 2020 11:11:51 +0530 Subject: [PATCH 48/63] Remove m_useStyleColor --- include/Track.h | 11 +------- src/core/AutomationPattern.cpp | 3 +- src/core/Track.cpp | 50 +++++++++++++--------------------- src/tracks/BBTrack.cpp | 13 ++------- src/tracks/Pattern.cpp | 5 ++-- src/tracks/SampleTrack.cpp | 3 +- 6 files changed, 26 insertions(+), 59 deletions(-) diff --git a/include/Track.h b/include/Track.h index 6f84d127644..ff05675c2c6 100644 --- a/include/Track.h +++ b/include/Track.h @@ -143,16 +143,8 @@ class LMMS_EXPORT TrackContentObject : public Model, public JournallingObject { m_color = QColor( c ); } - - void useStyleColor( bool b ) - { - m_useStyleColor = b; - } - bool usesStyleColor() - { - return m_useStyleColor; - } + bool hasColor(); void useCustomClipColor( bool b ); @@ -223,7 +215,6 @@ public slots: bool m_selectViewOnCreate; QColor m_color; - bool m_useStyleColor; bool m_useCustomClipColor; friend class TrackContentObjectView; diff --git a/src/core/AutomationPattern.cpp b/src/core/AutomationPattern.cpp index f9ced78be6d..491c5a50d6b 100644 --- a/src/core/AutomationPattern.cpp +++ b/src/core/AutomationPattern.cpp @@ -539,7 +539,7 @@ void AutomationPattern::saveSettings( QDomDocument & _doc, QDomElement & _this ) _this.setAttribute( "tens", QString::number( getTension() ) ); _this.setAttribute( "mute", QString::number( isMuted() ) ); - if( ! usesStyleColor() ) + if( hasColor() ) { if( usesCustomClipColor() ) { @@ -609,7 +609,6 @@ void AutomationPattern::loadSettings( const QDomElement & _this ) if( _this.hasAttribute( "usesclipcolor" ) ) { - useStyleColor( false ); useCustomClipColor( _this.attribute( "usesclipcolor" ) == "1" ); if( usesCustomClipColor() ) { diff --git a/src/core/Track.cpp b/src/core/Track.cpp index e5ab5bf568d..864094ea507 100644 --- a/src/core/Track.cpp +++ b/src/core/Track.cpp @@ -108,7 +108,6 @@ TrackContentObject::TrackContentObject( Track * track ) : m_mutedModel( false, this, tr( "Mute" ) ), m_selectViewOnCreate( false ), m_color( 128, 128, 128 ), - m_useStyleColor( true ), m_useCustomClipColor( false ) { if( getTrack() ) @@ -116,7 +115,6 @@ TrackContentObject::TrackContentObject( Track * track ) : getTrack()->addTCO( this ); if( getTrack()->useColor() && ! m_useCustomClipColor ) { - m_useStyleColor = false; m_color = getTrack()->color(); } } @@ -222,7 +220,6 @@ void TrackContentObject::paste() if( getTrack()->useColor() && ! m_useCustomClipColor ) { - m_useStyleColor = false; m_color = getTrack()->color(); } } @@ -267,7 +264,6 @@ void TrackContentObject::updateColor() { if( ! m_useCustomClipColor ) { - m_useStyleColor = false; emit trackColorChanged(); } } @@ -286,6 +282,12 @@ void TrackContentObject::useCustomClipColor( bool b ) } +bool TrackContentObject::hasColor() +{ + return usesCustomClipColor() || getTrack()->useColor(); +} + + @@ -591,11 +593,6 @@ void TrackContentObjectView::useTrackColor() { QColor buffer = m_tco->getTrack()->color(); setColor( buffer ); - m_tco->useStyleColor( false ); - } - else - { - m_tco->useStyleColor( true ); } m_tco->useCustomClipColor( false ); @@ -606,9 +603,8 @@ void TrackContentObjectView::useTrackColor() void TrackContentObjectView::trackColorReset() { - if( ! m_tco->usesStyleColor() && ! m_tco->usesCustomClipColor() ) + if( m_tco->hasColor() && ! m_tco->usesCustomClipColor() ) { - m_tco->useStyleColor( true ); update(); } } @@ -620,9 +616,6 @@ void TrackContentObjectView::setColor( QColor & new_color ) // change color only if it is different if( new_color.rgb() != m_tco->color().rgb() ) { m_tco->setColor( new_color ); } - - // force TCO to use color - m_tco->useStyleColor( false ); update(); } @@ -706,13 +699,11 @@ void TrackContentObjectView::dropEvent( QDropEvent * de ) if( old_tcov && old_tcov->m_tco->usesCustomClipColor() ) { - m_tco->useStyleColor( false ); m_tco->useCustomClipColor( true ); m_tco->setColor( old_tcov->color() ); } else { - m_tco->useStyleColor( ! m_trackView->getTrack()->useColor() ); m_tco->useCustomClipColor( false ); m_tco->setColor( m_trackView->getTrack()->color() ); } @@ -769,7 +760,7 @@ DataFile TrackContentObjectView::createTCODataFiles( tcoElement.setAttribute( "trackType", tcoTrack->type() ); tcoElement.setAttribute( "trackName", tcoTrack->name() ); tcoElement.setAttribute( "color", ( *it )->m_tco->color().name() ); - tcoElement.setAttribute( "styleColor", ( *it )->m_tco->usesStyleColor() ); + tcoElement.setAttribute( "styleColor", ! ( *it )->m_tco->hasColor() ); tcoElement.setAttribute( "clipColor", ( *it )->m_tco->usesCustomClipColor() ); ( *it )->m_tco->saveState( dataFile, tcoElement ); tcoParent.appendChild( tcoElement ); @@ -1532,11 +1523,11 @@ MidiTime TrackContentObjectView::draggedTCOPos( QMouseEvent * me ) QColor TrackContentObjectView::getColorForDisplay( QColor defaultColor ) { - auto tcoColor = m_tco->usesStyleColor() - ? defaultColor - : m_tco->usesCustomClipColor() + auto tcoColor = m_tco->hasColor() + ? m_tco->usesCustomClipColor() ? m_tco->color() - : m_tco->getTrack()->color(); + : m_tco->getTrack()->color() + : defaultColor; QColor c, mutedCustomColor; bool muted = m_tco->getTrack()->isMuted() || m_tco->isMuted(); @@ -1546,19 +1537,19 @@ QColor TrackContentObjectView::getColorForDisplay( QColor defaultColor ) // state: selected, muted, colored, normal if( isSelected() ) { - c = m_tco->usesStyleColor() - ? selectedColor() - : ( muted + c = m_tco->hasColor() + ? ( muted ? mutedCustomColor.darker( 350 ) - : tcoColor.darker( 150 ) ); + : tcoColor.darker( 150 ) ) + : selectedColor(); } else { if( muted ) { - c = m_tco->usesStyleColor() - ? mutedBackgroundColor() - : mutedCustomColor.darker( 250 ); + c = m_tco->hasColor() + ? mutedCustomColor.darker( 250 ) + : mutedBackgroundColor(); } else { @@ -2027,13 +2018,11 @@ bool TrackContentWidget::pasteSelection( MidiTime tcoPos, const QMimeData * md, if( outerTCOElement.attributeNode( "clipColor" ).value() == "1" ) { - tco->useStyleColor( false ); tco->useCustomClipColor( true ); tco->setColor( outerTCOElement.attributeNode( "color" ).value() ); } else { - tco->useStyleColor( ! t->useColor() ); tco->useCustomClipColor( false ); tco->setColor( t->color() ); } @@ -2838,7 +2827,6 @@ void Track::loadSettings( const QDomElement & element ) TrackContentObject * Track::addTCO( TrackContentObject * tco ) { tco->setColor( m_color ); - tco->useStyleColor( ! m_hasColor ); m_trackContentObjects.push_back( tco ); diff --git a/src/tracks/BBTrack.cpp b/src/tracks/BBTrack.cpp index 7c778e2994b..ee14adbdc98 100644 --- a/src/tracks/BBTrack.cpp +++ b/src/tracks/BBTrack.cpp @@ -71,7 +71,7 @@ void BBTCO::saveSettings( QDomDocument & doc, QDomElement & element ) } element.setAttribute( "len", length() ); element.setAttribute( "muted", isMuted() ); - if( ! usesStyleColor() ) + if( hasColor() ) { if( usesCustomClipColor() ) { @@ -104,7 +104,6 @@ void BBTCO::loadSettings( const QDomElement & element ) // for colors saved in 1.3-onwards if( element.hasAttribute( "usesclipcolor" ) ) { - useStyleColor( false ); useCustomClipColor( element.attribute( "usesclipcolor" ) == "1" ); if( usesCustomClipColor() ) { @@ -118,14 +117,7 @@ void BBTCO::loadSettings( const QDomElement & element ) if( element.hasAttribute( "color" ) ) { setColor( QColor( element.attribute( "color" ).toUInt() ) ); } - if( element.hasAttribute( "usestyle" ) ) - { useStyleColor ( element.attribute( "usestyle" ).toUInt() == 1 ); } - - else - { - useStyleColor( color().rgb() == qRgb( 128, 182, 175 ) - || color().rgb() == qRgb( 64, 128, 255 ) ); // old or older default color - } + // usestyle attribute is no longer used } } @@ -411,7 +403,6 @@ TrackContentObject * BBTrack::createTCO( const MidiTime & _pos ) if( s_lastTCOColor ) { bbtco->setColor( *s_lastTCOColor ); - bbtco->useStyleColor( false ); } return bbtco; } diff --git a/src/tracks/Pattern.cpp b/src/tracks/Pattern.cpp index 7785cf02b17..03c06019213 100644 --- a/src/tracks/Pattern.cpp +++ b/src/tracks/Pattern.cpp @@ -359,7 +359,7 @@ void Pattern::saveSettings( QDomDocument & _doc, QDomElement & _this ) _this.setAttribute( "type", m_patternType ); _this.setAttribute( "name", name() ); - if( ! usesStyleColor() ) + if( hasColor() ) { if( usesCustomClipColor() ) { @@ -405,7 +405,6 @@ void Pattern::loadSettings( const QDomElement & _this ) if( _this.hasAttribute( "usesclipcolor" ) ) { - useStyleColor( false ); useCustomClipColor( _this.attribute( "usesclipcolor" ) == "1" ); if( usesCustomClipColor() ) { @@ -1005,7 +1004,7 @@ void PatternView::paintEvent( QPaintEvent * ) // set colour based on mute status QColor noteFillColor = muted ? getMutedNoteFillColor() : getNoteFillColor(); QColor noteBorderColor = muted ? getMutedNoteBorderColor() - : ( m_pat->usesStyleColor() ? getNoteBorderColor() : c.lighter( 200 ) ); + : ( m_pat->hasColor() ? c.lighter( 200 ) : getNoteBorderColor() ); bool const drawAsLines = height() < 64; if (drawAsLines) diff --git a/src/tracks/SampleTrack.cpp b/src/tracks/SampleTrack.cpp index fb31bd6e823..257869ffbfb 100644 --- a/src/tracks/SampleTrack.cpp +++ b/src/tracks/SampleTrack.cpp @@ -276,7 +276,7 @@ void SampleTCO::saveSettings( QDomDocument & _doc, QDomElement & _this ) } _this.setAttribute( "sample_rate", m_sampleBuffer->sampleRate()); - if( ! usesStyleColor() ) + if( hasColor() ) { if( usesCustomClipColor() ) { @@ -315,7 +315,6 @@ void SampleTCO::loadSettings( const QDomElement & _this ) if( _this.hasAttribute( "usesclipcolor" ) ) { - useStyleColor( false ); useCustomClipColor( _this.attribute( "usesclipcolor" ) == "1" ); if( usesCustomClipColor() ) { From 747528e556283fb3819571eb0e8a7bd09a8ef82f Mon Sep 17 00:00:00 2001 From: adi Date: Wed, 30 Sep 2020 08:19:32 +0530 Subject: [PATCH 49/63] Remove a comment --- src/tracks/Pattern.cpp | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/tracks/Pattern.cpp b/src/tracks/Pattern.cpp index 03c06019213..0fce47852f8 100644 --- a/src/tracks/Pattern.cpp +++ b/src/tracks/Pattern.cpp @@ -1109,15 +1109,6 @@ void PatternView::paintEvent( QPaintEvent * ) } } // end for loop - // NOTE FOR REVIEWERS: is this worth adding? - // draw a transparent rectangle over colored patterns - /*if ( !m_pat->usesStyleColor() ) - { - p.setBrush( m_pat->color() ); - p.setOpacity( 0.25 ); - p.drawRect( 0, 0, width(), height() ); - }*/ - // draw a transparent rectangle over muted patterns if ( muted ) { From 9515a66b885b3fb7b54faeea32b3e6983594427f Mon Sep 17 00:00:00 2001 From: adi Date: Thu, 1 Oct 2020 09:36:17 +0530 Subject: [PATCH 50/63] Quick changes --- include/Track.h | 5 +---- src/core/Track.cpp | 37 ++++++------------------------------- 2 files changed, 7 insertions(+), 35 deletions(-) diff --git a/include/Track.h b/include/Track.h index ff05675c2c6..373691809c9 100644 --- a/include/Track.h +++ b/include/Track.h @@ -141,7 +141,7 @@ class LMMS_EXPORT TrackContentObject : public Model, public JournallingObject void setColor( const QColor & c ) { - m_color = QColor( c ); + m_color = c; } bool hasColor(); @@ -175,7 +175,6 @@ class LMMS_EXPORT TrackContentObject : public Model, public JournallingObject void setStartTimeOffset( const MidiTime &startTimeOffset ); void updateColor(); - void resetColor(); public slots: void copy(); @@ -188,9 +187,7 @@ public slots: void positionChanged(); void destroyedTCO(); void trackColorChanged(); - void clipColorChanged( QColor & ); void trackColorReset(); - void clipColorReset(); private: diff --git a/src/core/Track.cpp b/src/core/Track.cpp index 864094ea507..d4d38ff9332 100644 --- a/src/core/Track.cpp +++ b/src/core/Track.cpp @@ -113,10 +113,6 @@ TrackContentObject::TrackContentObject( Track * track ) : if( getTrack() ) { getTrack()->addTCO( this ); - if( getTrack()->useColor() && ! m_useCustomClipColor ) - { - m_color = getTrack()->color(); - } } setJournalling( false ); movePosition( 0 ); @@ -217,11 +213,6 @@ void TrackContentObject::paste() const MidiTime pos = startPosition(); restoreState( *( Clipboard::getContent( nodeName() ) ) ); movePosition( pos ); - - if( getTrack()->useColor() && ! m_useCustomClipColor ) - { - m_color = getTrack()->color(); - } } AutomationPattern::resolveAllIDs(); GuiApplication::instance()->automationEditor()->m_editor->updateAfterPatternChange(); @@ -268,17 +259,11 @@ void TrackContentObject::updateColor() } } -void TrackContentObject::resetColor() -{ - if( ! m_useCustomClipColor ) emit trackColorReset(); -} - void TrackContentObject::useCustomClipColor( bool b ) { m_useCustomClipColor = b; - b ? emit clipColorChanged( m_color ) : emit clipColorReset(); - + updateColor(); } @@ -589,12 +574,6 @@ void TrackContentObjectView::changeClipColor() void TrackContentObjectView::useTrackColor() { - if( m_tco->getTrack()->useColor() ) - { - QColor buffer = m_tco->getTrack()->color(); - setColor( buffer ); - } - m_tco->useCustomClipColor( false ); update(); } @@ -613,9 +592,7 @@ void TrackContentObjectView::trackColorReset() void TrackContentObjectView::setColor( QColor & new_color ) { - // change color only if it is different - if( new_color.rgb() != m_tco->color().rgb() ) - { m_tco->setColor( new_color ); } + m_tco->setColor( new_color ); update(); } @@ -2704,7 +2681,7 @@ void Track::saveSettings( QDomDocument & doc, QDomElement & element ) if( m_hasColor ) { - element.setAttribute( "trackbgcolor", m_color.name() ); + element.setAttribute( "color", m_color.name() ); } QDomElement tsDe = doc.createElement( nodeName() ); @@ -2759,9 +2736,9 @@ void Track::loadSettings( const QDomElement & element ) // Older project files that didn't have this attribute will set the value to false (issue 5562) m_mutedBeforeSolo = QVariant( element.attribute( "mutedBeforeSolo", "0" ) ).toBool(); - if( element.hasAttribute( "trackbgcolor" ) ) + if( element.hasAttribute( "color" ) ) { - m_color.setNamedColor( element.attribute( "trackbgcolor" ) ); + m_color.setNamedColor( element.attribute( "color" ) ); m_hasColor = true; } @@ -2826,8 +2803,6 @@ void Track::loadSettings( const QDomElement & element ) */ TrackContentObject * Track::addTCO( TrackContentObject * tco ) { - tco->setColor( m_color ); - m_trackContentObjects.push_back( tco ); emit trackContentObjectAdded( tco ); @@ -3158,7 +3133,7 @@ void Track::trackColorReset() { for (int i = 0; i < numOfTCOs(); i++) { - m_trackContentObjects[i]->resetColor(); + m_trackContentObjects[i]->updateColor(); } m_hasColor = false; } From 8e780ec95206298edc7aaf1d21cf4c50163b90bd Mon Sep 17 00:00:00 2001 From: adi Date: Thu, 1 Oct 2020 13:35:20 +0530 Subject: [PATCH 51/63] Change how colors are saved --- src/core/AutomationPattern.cpp | 21 +++++---------------- src/tracks/BBTrack.cpp | 21 +++++---------------- src/tracks/Pattern.cpp | 21 +++++---------------- src/tracks/SampleTrack.cpp | 21 +++++---------------- 4 files changed, 20 insertions(+), 64 deletions(-) diff --git a/src/core/AutomationPattern.cpp b/src/core/AutomationPattern.cpp index 491c5a50d6b..c1b19a1acac 100644 --- a/src/core/AutomationPattern.cpp +++ b/src/core/AutomationPattern.cpp @@ -539,17 +539,9 @@ void AutomationPattern::saveSettings( QDomDocument & _doc, QDomElement & _this ) _this.setAttribute( "tens", QString::number( getTension() ) ); _this.setAttribute( "mute", QString::number( isMuted() ) ); - if( hasColor() ) + if( hasColor() && usesCustomClipColor() ) { - if( usesCustomClipColor() ) - { - _this.setAttribute( "color", color().name() ); - _this.setAttribute( "usesclipcolor", true ); - } - else - { - _this.setAttribute( "usesclipcolor", false ); - } + _this.setAttribute( "color", color().name() ); } for( timeMap::const_iterator it = m_timeMap.begin(); @@ -607,13 +599,10 @@ void AutomationPattern::loadSettings( const QDomElement & _this ) } } - if( _this.hasAttribute( "usesclipcolor" ) ) + if( _this.hasAttribute( "color" ) ) { - useCustomClipColor( _this.attribute( "usesclipcolor" ) == "1" ); - if( usesCustomClipColor() ) - { - setColor( _this.attribute( "color" ) ); - } + useCustomClipColor( true ); + setColor( _this.attribute( "color" ) ); } int len = _this.attribute( "len" ).toInt(); diff --git a/src/tracks/BBTrack.cpp b/src/tracks/BBTrack.cpp index ee14adbdc98..b240fc3da93 100644 --- a/src/tracks/BBTrack.cpp +++ b/src/tracks/BBTrack.cpp @@ -71,17 +71,9 @@ void BBTCO::saveSettings( QDomDocument & doc, QDomElement & element ) } element.setAttribute( "len", length() ); element.setAttribute( "muted", isMuted() ); - if( hasColor() ) + if( hasColor() && usesCustomClipColor() ) { - if( usesCustomClipColor() ) - { - element.setAttribute( "color", color().name() ); - element.setAttribute( "usesclipcolor", true ); - } - else - { - element.setAttribute( "usesclipcolor", false ); - } + element.setAttribute( "color", color().name() ); } } @@ -102,13 +94,10 @@ void BBTCO::loadSettings( const QDomElement & element ) } // for colors saved in 1.3-onwards - if( element.hasAttribute( "usesclipcolor" ) ) + if( element.hasAttribute( "color" ) && !element.hasAttribute( "usestyle" ) ) { - useCustomClipColor( element.attribute( "usesclipcolor" ) == "1" ); - if( usesCustomClipColor() ) - { - setColor( element.attribute( "color" ) ); - } + useCustomClipColor( true ); + setColor( element.attribute( "color" ) ); } // for colors saved before 1.3 diff --git a/src/tracks/Pattern.cpp b/src/tracks/Pattern.cpp index 0fce47852f8..519ccf3a36c 100644 --- a/src/tracks/Pattern.cpp +++ b/src/tracks/Pattern.cpp @@ -359,17 +359,9 @@ void Pattern::saveSettings( QDomDocument & _doc, QDomElement & _this ) _this.setAttribute( "type", m_patternType ); _this.setAttribute( "name", name() ); - if( hasColor() ) + if( hasColor() && usesCustomClipColor() ) { - if( usesCustomClipColor() ) - { - _this.setAttribute( "color", color().name() ); - _this.setAttribute( "usesclipcolor", true ); - } - else - { - _this.setAttribute( "usesclipcolor", false ); - } + _this.setAttribute( "color", color().name() ); } // as the target of copied/dragged pattern is always an existing // pattern, we must not store actual position, instead we store -1 @@ -403,13 +395,10 @@ void Pattern::loadSettings( const QDomElement & _this ) ).toInt() ); setName( _this.attribute( "name" ) ); - if( _this.hasAttribute( "usesclipcolor" ) ) + if( _this.hasAttribute( "color" ) ) { - useCustomClipColor( _this.attribute( "usesclipcolor" ) == "1" ); - if( usesCustomClipColor() ) - { - setColor( _this.attribute( "color" ) ); - } + useCustomClipColor( true ); + setColor( _this.attribute( "color" ) ); } if( _this.attribute( "pos" ).toInt() >= 0 ) diff --git a/src/tracks/SampleTrack.cpp b/src/tracks/SampleTrack.cpp index 257869ffbfb..9b2520e3d1d 100644 --- a/src/tracks/SampleTrack.cpp +++ b/src/tracks/SampleTrack.cpp @@ -276,17 +276,9 @@ void SampleTCO::saveSettings( QDomDocument & _doc, QDomElement & _this ) } _this.setAttribute( "sample_rate", m_sampleBuffer->sampleRate()); - if( hasColor() ) + if( hasColor() && usesCustomClipColor() ) { - if( usesCustomClipColor() ) - { - _this.setAttribute( "color", color().name() ); - _this.setAttribute( "usesclipcolor", true ); - } - else - { - _this.setAttribute( "usesclipcolor", false ); - } + _this.setAttribute( "color", color().name() ); } // TODO: start- and end-frame } @@ -313,13 +305,10 @@ void SampleTCO::loadSettings( const QDomElement & _this ) m_sampleBuffer->setSampleRate( _this.attribute( "sample_rate" ).toInt() ); } - if( _this.hasAttribute( "usesclipcolor" ) ) + if( _this.hasAttribute( "color" ) ) { - useCustomClipColor( _this.attribute( "usesclipcolor" ) == "1" ); - if( usesCustomClipColor() ) - { - setColor( _this.attribute( "color" ) ); - } + useCustomClipColor( true ); + setColor( _this.attribute( "color" ) ); } } From 1fcb161f4270aeeb1d65cc07ce36651cb5e96374 Mon Sep 17 00:00:00 2001 From: adi Date: Sat, 3 Oct 2020 19:11:30 +0530 Subject: [PATCH 52/63] Remove redundant stuff --- include/Track.h | 4 ---- src/core/AutomationPattern.cpp | 2 +- src/core/Track.cpp | 15 +++------------ src/gui/AutomationPatternView.cpp | 4 ++-- src/tracks/BBTrack.cpp | 6 +++--- src/tracks/Pattern.cpp | 6 +++--- src/tracks/SampleTrack.cpp | 6 +++--- 7 files changed, 15 insertions(+), 28 deletions(-) diff --git a/include/Track.h b/include/Track.h index 373691809c9..802221614fe 100644 --- a/include/Track.h +++ b/include/Track.h @@ -187,7 +187,6 @@ public slots: void positionChanged(); void destroyedTCO(); void trackColorChanged(); - void trackColorReset(); private: @@ -306,7 +305,6 @@ public slots: void changeClipColor(); void useTrackColor(); void trackColorReset(); - void setColor( QColor & ); protected: enum ContextMenuAction @@ -532,8 +530,6 @@ private slots: void recordingOn(); void recordingOff(); void clearTrack(); - - void updateColorGradient(); private: TrackView * m_trackView; diff --git a/src/core/AutomationPattern.cpp b/src/core/AutomationPattern.cpp index c1b19a1acac..8886d7ea5e6 100644 --- a/src/core/AutomationPattern.cpp +++ b/src/core/AutomationPattern.cpp @@ -539,7 +539,7 @@ void AutomationPattern::saveSettings( QDomDocument & _doc, QDomElement & _this ) _this.setAttribute( "tens", QString::number( getTension() ) ); _this.setAttribute( "mute", QString::number( isMuted() ) ); - if( hasColor() && usesCustomClipColor() ) + if( usesCustomClipColor() ) { _this.setAttribute( "color", color().name() ); } diff --git a/src/core/Track.cpp b/src/core/Track.cpp index d4d38ff9332..956544c1211 100644 --- a/src/core/Track.cpp +++ b/src/core/Track.cpp @@ -566,8 +566,9 @@ void TrackContentObjectView::changeClipColor() if( ! new_color.isValid() ) { return; } - setColor( new_color ); + m_tco->setColor( new_color ); m_tco->useCustomClipColor( true ); + update(); } @@ -590,11 +591,6 @@ void TrackContentObjectView::trackColorReset() -void TrackContentObjectView::setColor( QColor & new_color ) -{ - m_tco->setColor( new_color ); - update(); -} /*! \brief Change the trackContentObjectView's display when something @@ -2261,7 +2257,7 @@ TrackOperationsWidget::TrackOperationsWidget( TrackView * parent ) : Qt::QueuedConnection ); connect( m_trackView->getTrack()->getMutedModel(), SIGNAL( dataChanged() ), - this, SLOT( updateColorGradient() ) ); + this, SLOT( update() ) ); } @@ -2474,11 +2470,6 @@ void TrackOperationsWidget::updateMenu() tr( "Clear clip colors" ), this, SLOT( useTrackColor() ) ); } -void TrackOperationsWidget::updateColorGradient() -{ - update(); -} - void TrackOperationsWidget::toggleRecording( bool on ) { diff --git a/src/gui/AutomationPatternView.cpp b/src/gui/AutomationPatternView.cpp index 7399f7e31f5..76b5407a582 100644 --- a/src/gui/AutomationPatternView.cpp +++ b/src/gui/AutomationPatternView.cpp @@ -53,8 +53,8 @@ AutomationPatternView::AutomationPatternView( AutomationPattern * _pattern, this, SLOT( update() ) ); connect( gui->automationEditor(), SIGNAL( currentPatternChanged() ), this, SLOT( update() ) ); - connect( m_pat, SIGNAL( trackColorReset() ), - this, SLOT( trackColorReset() ) ); + /*connect( m_pat, SIGNAL( trackColorReset() ), + this, SLOT( trackColorReset() ) );*/ setAttribute( Qt::WA_OpaquePaintEvent, true ); diff --git a/src/tracks/BBTrack.cpp b/src/tracks/BBTrack.cpp index b240fc3da93..47fd5d9af99 100644 --- a/src/tracks/BBTrack.cpp +++ b/src/tracks/BBTrack.cpp @@ -71,7 +71,7 @@ void BBTCO::saveSettings( QDomDocument & doc, QDomElement & element ) } element.setAttribute( "len", length() ); element.setAttribute( "muted", isMuted() ); - if( hasColor() && usesCustomClipColor() ) + if( usesCustomClipColor() ) { element.setAttribute( "color", color().name() ); } @@ -135,8 +135,8 @@ BBTCOView::BBTCOView( TrackContentObject * _tco, TrackView * _tv ) : connect( _tco->getTrack(), SIGNAL( dataChanged() ), this, SLOT( update() ) ); - connect( _tco, SIGNAL( trackColorReset() ), - this, SLOT( trackColorReset() ) ); + /*connect( _tco, SIGNAL( trackColorReset() ), + this, SLOT( trackColorReset() ) );*/ setStyle( QApplication::style() ); } diff --git a/src/tracks/Pattern.cpp b/src/tracks/Pattern.cpp index 519ccf3a36c..77f038dc11d 100644 --- a/src/tracks/Pattern.cpp +++ b/src/tracks/Pattern.cpp @@ -359,7 +359,7 @@ void Pattern::saveSettings( QDomDocument & _doc, QDomElement & _this ) _this.setAttribute( "type", m_patternType ); _this.setAttribute( "name", name() ); - if( hasColor() && usesCustomClipColor() ) + if( usesCustomClipColor() ) { _this.setAttribute( "color", color().name() ); } @@ -597,8 +597,8 @@ PatternView::PatternView( Pattern* pattern, TrackView* parent ) : { connect( gui->pianoRoll(), SIGNAL( currentPatternChanged() ), this, SLOT( update() ) ); - connect( m_pat, SIGNAL( trackColorReset() ), - this, SLOT( trackColorReset() ) ); + /*connect( m_pat, SIGNAL( trackColorReset() ), + this, SLOT( trackColorReset() ) );*/ if( s_stepBtnOn0 == NULL ) { diff --git a/src/tracks/SampleTrack.cpp b/src/tracks/SampleTrack.cpp index 9b2520e3d1d..88fbc1ac873 100644 --- a/src/tracks/SampleTrack.cpp +++ b/src/tracks/SampleTrack.cpp @@ -276,7 +276,7 @@ void SampleTCO::saveSettings( QDomDocument & _doc, QDomElement & _this ) } _this.setAttribute( "sample_rate", m_sampleBuffer->sampleRate()); - if( hasColor() && usesCustomClipColor() ) + if( usesCustomClipColor() ) { _this.setAttribute( "color", color().name() ); } @@ -335,8 +335,8 @@ SampleTCOView::SampleTCOView( SampleTCO * _tco, TrackView * _tv ) : connect( m_tco, SIGNAL( sampleChanged() ), this, SLOT( updateSample() ) ); - connect( m_tco, SIGNAL( trackColorReset() ), - this, SLOT( trackColorReset() ) ); + /*connect( m_tco, SIGNAL( trackColorReset() ), + this, SLOT( trackColorReset() ) );*/ setStyle( QApplication::style() ); } From 5492049894a1f780149a635d7850560c4ee504ac Mon Sep 17 00:00:00 2001 From: adi Date: Sat, 3 Oct 2020 19:19:18 +0530 Subject: [PATCH 53/63] Remove redundant stuff pt. 2 --- include/Track.h | 1 - src/core/Track.cpp | 10 ---------- 2 files changed, 11 deletions(-) diff --git a/include/Track.h b/include/Track.h index 802221614fe..0293c86258d 100644 --- a/include/Track.h +++ b/include/Track.h @@ -304,7 +304,6 @@ public slots: void changeClipColor(); void useTrackColor(); - void trackColorReset(); protected: enum ContextMenuAction diff --git a/src/core/Track.cpp b/src/core/Track.cpp index 956544c1211..8826f468b07 100644 --- a/src/core/Track.cpp +++ b/src/core/Track.cpp @@ -581,16 +581,6 @@ void TrackContentObjectView::useTrackColor() -void TrackContentObjectView::trackColorReset() -{ - if( m_tco->hasColor() && ! m_tco->usesCustomClipColor() ) - { - update(); - } -} - - - /*! \brief Change the trackContentObjectView's display when something From a341ee9df363cd9007e5f9e09a0a005b5a88cf92 Mon Sep 17 00:00:00 2001 From: adi Date: Sat, 3 Oct 2020 19:28:14 +0530 Subject: [PATCH 54/63] Change how colors are copied --- src/core/Track.cpp | 26 +------------------------- 1 file changed, 1 insertion(+), 25 deletions(-) diff --git a/src/core/Track.cpp b/src/core/Track.cpp index 8826f468b07..1c132d3a43b 100644 --- a/src/core/Track.cpp +++ b/src/core/Track.cpp @@ -658,19 +658,6 @@ void TrackContentObjectView::dropEvent( QDropEvent * de ) m_tco->restoreState( tcos.firstChildElement().firstChildElement() ); m_tco->movePosition( pos ); - auto old_tcov = dynamic_cast( qwSource ); - - if( old_tcov && old_tcov->m_tco->usesCustomClipColor() ) - { - m_tco->useCustomClipColor( true ); - m_tco->setColor( old_tcov->color() ); - } - else - { - m_tco->useCustomClipColor( false ); - m_tco->setColor( m_trackView->getTrack()->color() ); - } - AutomationPattern::resolveAllIDs(); de->accept(); } @@ -1977,18 +1964,7 @@ bool TrackContentWidget::pasteSelection( MidiTime tcoPos, const QMimeData * md, if( wasSelection ) { tco->selectViewOnCreate( true ); - } - - if( outerTCOElement.attributeNode( "clipColor" ).value() == "1" ) - { - tco->useCustomClipColor( true ); - tco->setColor( outerTCOElement.attributeNode( "color" ).value() ); - } - else - { - tco->useCustomClipColor( false ); - tco->setColor( t->color() ); - } + } } AutomationPattern::resolveAllIDs(); From eff524b5b2cb410764a7017057a648d032949096 Mon Sep 17 00:00:00 2001 From: adi Date: Sun, 4 Oct 2020 09:24:15 +0530 Subject: [PATCH 55/63] Fixes pt. 3 --- src/core/Track.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/core/Track.cpp b/src/core/Track.cpp index 1c132d3a43b..1d4d43da99e 100644 --- a/src/core/Track.cpp +++ b/src/core/Track.cpp @@ -709,9 +709,6 @@ DataFile TrackContentObjectView::createTCODataFiles( tcoElement.setAttribute( "trackIndex", trackIndex ); tcoElement.setAttribute( "trackType", tcoTrack->type() ); tcoElement.setAttribute( "trackName", tcoTrack->name() ); - tcoElement.setAttribute( "color", ( *it )->m_tco->color().name() ); - tcoElement.setAttribute( "styleColor", ! ( *it )->m_tco->hasColor() ); - tcoElement.setAttribute( "clipColor", ( *it )->m_tco->usesCustomClipColor() ); ( *it )->m_tco->saveState( dataFile, tcoElement ); tcoParent.appendChild( tcoElement ); } From e9a49f88b998c514fdb0dc2d558668ecf5be5578 Mon Sep 17 00:00:00 2001 From: adi Date: Sun, 4 Oct 2020 09:29:36 +0530 Subject: [PATCH 56/63] Fixes pt. 4 --- include/Track.h | 5 ----- 1 file changed, 5 deletions(-) diff --git a/include/Track.h b/include/Track.h index 0293c86258d..de5d8b292f2 100644 --- a/include/Track.h +++ b/include/Track.h @@ -270,11 +270,6 @@ class TrackContentObjectView : public selectableObject, public ModelView void setBBPatternBackground( const QColor & c ); void setGradient( const bool & b ); void setMouseHotspotHand(const QSize & s); - - QColor color() const - { - return m_tco->color(); - }; // access needsUpdate member variable bool needsUpdate(); From 25f1e9c8013dbe3958f8ca3687049b8d48394baa Mon Sep 17 00:00:00 2001 From: adi Date: Sun, 4 Oct 2020 09:31:23 +0530 Subject: [PATCH 57/63] Change spaces to tabs --- src/core/Track.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/Track.cpp b/src/core/Track.cpp index 1d4d43da99e..75a17af7b89 100644 --- a/src/core/Track.cpp +++ b/src/core/Track.cpp @@ -1961,7 +1961,7 @@ bool TrackContentWidget::pasteSelection( MidiTime tcoPos, const QMimeData * md, if( wasSelection ) { tco->selectViewOnCreate( true ); - } + } } AutomationPattern::resolveAllIDs(); From 1c06c173be1a675805df64e2ceaf80db386bb143 Mon Sep 17 00:00:00 2001 From: adi Date: Sun, 4 Oct 2020 09:48:01 +0530 Subject: [PATCH 58/63] Fix pseudochanges --- include/Track.h | 5 ++--- src/core/Track.cpp | 5 ++++- src/gui/AutomationPatternView.cpp | 3 +-- src/tracks/BBTrack.cpp | 4 +--- src/tracks/Pattern.cpp | 4 ++-- src/tracks/SampleTrack.cpp | 5 ++--- 6 files changed, 12 insertions(+), 14 deletions(-) diff --git a/include/Track.h b/include/Track.h index de5d8b292f2..c7ce3b39ca9 100644 --- a/include/Track.h +++ b/include/Track.h @@ -532,6 +532,7 @@ private slots: PixmapButton * m_muteBtn; PixmapButton * m_soloBtn; + friend class TrackView; signals: @@ -769,8 +770,6 @@ class TrackView : public QWidget, public ModelView, public JournallingObject { return m_action == MoveTrack; } - - virtual void update(); @@ -822,8 +821,8 @@ public slots: Track * m_track; TrackContainerView * m_trackContainerView; + TrackOperationsWidget m_trackOperationsWidget; - QWidget m_trackSettingsWidget; TrackContentWidget m_trackContentWidget; diff --git a/src/core/Track.cpp b/src/core/Track.cpp index 75a17af7b89..da39ecc6a92 100644 --- a/src/core/Track.cpp +++ b/src/core/Track.cpp @@ -49,6 +49,7 @@ #include #include + #include "AutomationPattern.h" #include "AutomationTrack.h" #include "AutomationEditor.h" @@ -302,6 +303,7 @@ TrackContentObjectView::TrackContentObjectView( TrackContentObject * tco, m_hint( NULL ), m_mutedColor( 0, 0, 0 ), m_mutedBackgroundColor( 0, 0, 0 ), + m_selectedColor( 0, 0, 0), m_textColor( 0, 0, 0 ), m_textShadowColor( 0, 0, 0 ), m_BBPatternBackground( 0, 0, 0 ), @@ -657,7 +659,6 @@ void TrackContentObjectView::dropEvent( QDropEvent * de ) QDomElement tcos = dataFile.content().firstChildElement( "tcos" ); m_tco->restoreState( tcos.firstChildElement().firstChildElement() ); m_tco->movePosition( pos ); - AutomationPattern::resolveAllIDs(); de->accept(); } @@ -2235,6 +2236,8 @@ TrackOperationsWidget::~TrackOperationsWidget() } + + /*! \brief Respond to trackOperationsWidget mouse events * * If it's the left mouse button, and Ctrl is held down, and we're diff --git a/src/gui/AutomationPatternView.cpp b/src/gui/AutomationPatternView.cpp index 76b5407a582..1c9ac03a418 100644 --- a/src/gui/AutomationPatternView.cpp +++ b/src/gui/AutomationPatternView.cpp @@ -53,8 +53,6 @@ AutomationPatternView::AutomationPatternView( AutomationPattern * _pattern, this, SLOT( update() ) ); connect( gui->automationEditor(), SIGNAL( currentPatternChanged() ), this, SLOT( update() ) ); - /*connect( m_pat, SIGNAL( trackColorReset() ), - this, SLOT( trackColorReset() ) );*/ setAttribute( Qt::WA_OpaquePaintEvent, true ); @@ -168,6 +166,7 @@ void AutomationPatternView::flipX() + void AutomationPatternView::constructContextMenu( QMenu * _cm ) { QAction * a = new QAction( embed::getIconPixmap( "automation" ), diff --git a/src/tracks/BBTrack.cpp b/src/tracks/BBTrack.cpp index 47fd5d9af99..f53987ca74e 100644 --- a/src/tracks/BBTrack.cpp +++ b/src/tracks/BBTrack.cpp @@ -134,9 +134,6 @@ BBTCOView::BBTCOView( TrackContentObject * _tco, TrackView * _tv ) : { connect( _tco->getTrack(), SIGNAL( dataChanged() ), this, SLOT( update() ) ); - - /*connect( _tco, SIGNAL( trackColorReset() ), - this, SLOT( trackColorReset() ) );*/ setStyle( QApplication::style() ); } @@ -286,6 +283,7 @@ void BBTCOView::update() } + QColor * BBTrack::s_lastTCOColor = NULL; BBTrack::BBTrack( TrackContainer* tc ) : diff --git a/src/tracks/Pattern.cpp b/src/tracks/Pattern.cpp index 77f038dc11d..d8159cbc725 100644 --- a/src/tracks/Pattern.cpp +++ b/src/tracks/Pattern.cpp @@ -597,8 +597,6 @@ PatternView::PatternView( Pattern* pattern, TrackView* parent ) : { connect( gui->pianoRoll(), SIGNAL( currentPatternChanged() ), this, SLOT( update() ) ); - /*connect( m_pat, SIGNAL( trackColorReset() ), - this, SLOT( trackColorReset() ) );*/ if( s_stepBtnOn0 == NULL ) { @@ -676,6 +674,8 @@ void PatternView::changeName() } + + void PatternView::constructContextMenu( QMenu * _cm ) { QAction * a = new QAction( embed::getIconPixmap( "piano" ), diff --git a/src/tracks/SampleTrack.cpp b/src/tracks/SampleTrack.cpp index 88fbc1ac873..9cd505139a2 100644 --- a/src/tracks/SampleTrack.cpp +++ b/src/tracks/SampleTrack.cpp @@ -334,9 +334,6 @@ SampleTCOView::SampleTCOView( SampleTCO * _tco, TrackView * _tv ) : // track future changes of SampleTCO connect( m_tco, SIGNAL( sampleChanged() ), this, SLOT( updateSample() ) ); - - /*connect( m_tco, SIGNAL( trackColorReset() ), - this, SLOT( trackColorReset() ) );*/ setStyle( QApplication::style() ); } @@ -628,6 +625,8 @@ void SampleTCOView::paintEvent( QPaintEvent * pe ) + + SampleTrack::SampleTrack(TrackContainer* tc) : Track(Track::SampleTrack, tc), m_volumeModel(DefaultVolume, MinVolume, MaxVolume, 0.1f, this, tr("Volume")), From c518669654d6bc5df6df6011cc1aa270da3a6d4e Mon Sep 17 00:00:00 2001 From: adi Date: Mon, 5 Oct 2020 08:25:58 +0530 Subject: [PATCH 59/63] Remove s_lastTCOColor --- src/tracks/BBTrack.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/tracks/BBTrack.cpp b/src/tracks/BBTrack.cpp index f53987ca74e..4f0ba38e2df 100644 --- a/src/tracks/BBTrack.cpp +++ b/src/tracks/BBTrack.cpp @@ -284,8 +284,6 @@ void BBTCOView::update() -QColor * BBTrack::s_lastTCOColor = NULL; - BBTrack::BBTrack( TrackContainer* tc ) : Track( Track::BBTrack, tc ) { @@ -387,10 +385,6 @@ TrackView * BBTrack::createView( TrackContainerView* tcv ) TrackContentObject * BBTrack::createTCO( const MidiTime & _pos ) { BBTCO * bbtco = new BBTCO( this ); - if( s_lastTCOColor ) - { - bbtco->setColor( *s_lastTCOColor ); - } return bbtco; } From d53dd00c7af69efb3258f3b56d9fe556f08f4205 Mon Sep 17 00:00:00 2001 From: adi Date: Mon, 5 Oct 2020 08:32:10 +0530 Subject: [PATCH 60/63] Fix pseudochanges pt. 2 --- include/Track.h | 1 + src/core/Track.cpp | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/include/Track.h b/include/Track.h index c7ce3b39ca9..f646c66b28b 100644 --- a/include/Track.h +++ b/include/Track.h @@ -724,6 +724,7 @@ public slots: void destroyedTrack(); void nameChanged(); void trackContentObjectAdded( TrackContentObject * ); + } ; diff --git a/src/core/Track.cpp b/src/core/Track.cpp index da39ecc6a92..7eb4b88eecc 100644 --- a/src/core/Track.cpp +++ b/src/core/Track.cpp @@ -303,7 +303,7 @@ TrackContentObjectView::TrackContentObjectView( TrackContentObject * tco, m_hint( NULL ), m_mutedColor( 0, 0, 0 ), m_mutedBackgroundColor( 0, 0, 0 ), - m_selectedColor( 0, 0, 0), + m_selectedColor( 0, 0, 0 ), m_textColor( 0, 0, 0 ), m_textShadowColor( 0, 0, 0 ), m_BBPatternBackground( 0, 0, 0 ), @@ -2452,6 +2452,7 @@ void TrackOperationsWidget::toggleRecording( bool on ) } + void TrackOperationsWidget::recordingOn() { toggleRecording( true ); From 55bbe6793e2affaa1b721b2b9bd5d313f0530f4c Mon Sep 17 00:00:00 2001 From: adi Date: Mon, 5 Oct 2020 11:13:35 +0530 Subject: [PATCH 61/63] Fix breaking builds --- include/BBTrack.h | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/include/BBTrack.h b/include/BBTrack.h index c952dcfe120..36a10884547 100644 --- a/include/BBTrack.h +++ b/include/BBTrack.h @@ -133,27 +133,6 @@ class LMMS_EXPORT BBTrack : public Track m_disabledTracks.removeAll( _track ); } - static void setLastTCOColor( const QColor & c ) - { - if( ! s_lastTCOColor ) - { - s_lastTCOColor = new QColor( c ); - } - else - { - *s_lastTCOColor = QColor( c ); - } - } - - static void clearLastTCOColor() - { - if( s_lastTCOColor ) - { - delete s_lastTCOColor; - } - s_lastTCOColor = NULL; - } - protected: inline QString nodeName() const override { @@ -167,8 +146,6 @@ class LMMS_EXPORT BBTrack : public Track typedef QMap infoMap; static infoMap s_infoMap; - static QColor * s_lastTCOColor; - friend class BBTrackView; } ; From 602ea8d00f974bae9850492aa62885ffc3a9c606 Mon Sep 17 00:00:00 2001 From: Kumar Date: Thu, 8 Oct 2020 10:29:38 +0530 Subject: [PATCH 62/63] Add files via upload --- ...- Krem Kaakkuja (Second Flight Remix).mmpz | Bin 46081 -> 46520 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/data/projects/demos/Greippi - Krem Kaakkuja (Second Flight Remix).mmpz b/data/projects/demos/Greippi - Krem Kaakkuja (Second Flight Remix).mmpz index 9ea29b34d3f1aaaf6fe86afe1e0bf10a162abe9a..d08ca6e04c176c2516b85769f6f8bf4f3f0c96fb 100644 GIT binary patch literal 46520 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 EPE)HV{Qv*} literal 46081 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

a=cfHuPut%5ET*p%(#2Lhis||<#S<{^Udtt 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 From 01ffe71fc949da1faf3d0990836556a146ecfc6c Mon Sep 17 00:00:00 2001 From: adi Date: Sun, 18 Oct 2020 10:52:22 +0530 Subject: [PATCH 63/63] Add comments (again) --- src/core/Track.cpp | 9 ++++++++- src/tracks/Pattern.cpp | 1 + 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/core/Track.cpp b/src/core/Track.cpp index 7eb4b88eecc..83d1a0c8a20 100644 --- a/src/core/Track.cpp +++ b/src/core/Track.cpp @@ -252,6 +252,7 @@ void TrackContentObject::setStartTimeOffset( const MidiTime &startTimeOffset ) m_startTimeOffset = startTimeOffset; } +// Update TCO color if it follows the track color void TrackContentObject::updateColor() { if( ! m_useCustomClipColor ) @@ -564,10 +565,12 @@ void TrackContentObjectView::updatePosition() void TrackContentObjectView::changeClipColor() { + // Get a color from the user QColor new_color = ColorChooser( this ).withPalette( ColorChooser::Palette::Track )->getColor( m_tco->color() ); if( ! new_color.isValid() ) { return; } + // Use that color m_tco->setColor( new_color ); m_tco->useCustomClipColor( true ); update(); @@ -1469,20 +1472,23 @@ MidiTime TrackContentObjectView::draggedTCOPos( QMouseEvent * me ) } +// Return the color that the TCO's background should be QColor TrackContentObjectView::getColorForDisplay( QColor defaultColor ) { + // Get the pure TCO color auto tcoColor = m_tco->hasColor() ? m_tco->usesCustomClipColor() ? m_tco->color() : m_tco->getTrack()->color() : defaultColor; + // Set variables QColor c, mutedCustomColor; bool muted = m_tco->getTrack()->isMuted() || m_tco->isMuted(); mutedCustomColor = tcoColor; mutedCustomColor.setHsv( mutedCustomColor.hsvHue(), mutedCustomColor.hsvSaturation() / 4, mutedCustomColor.value() ); - // state: selected, muted, colored, normal + // Change the pure color by state: selected, muted, colored, normal if( isSelected() ) { c = m_tco->hasColor() @@ -1505,6 +1511,7 @@ QColor TrackContentObjectView::getColorForDisplay( QColor defaultColor ) } } + // Return color to caller return c; } diff --git a/src/tracks/Pattern.cpp b/src/tracks/Pattern.cpp index d8159cbc725..69d575813b6 100644 --- a/src/tracks/Pattern.cpp +++ b/src/tracks/Pattern.cpp @@ -874,6 +874,7 @@ void PatternView::paintEvent( QPaintEvent * ) if( beatPattern ) { + // Do not paint BBTCOs how we paint pattern TCOs c = BBPatternBackground(); } else