diff --git a/include/InlineAutomation.h b/include/InlineAutomation.h index 89f3e9164..70cefbec9 100644 --- a/include/InlineAutomation.h +++ b/include/InlineAutomation.h @@ -52,9 +52,7 @@ public: inline bool hasAutomation() const { return m_autoPattern != NULL && - !typeInfo::isEqual( - m_autoPattern->getTimeMap()[0], - defaultValue() ); + m_autoPattern->getTimeMap().isEmpty() == false; } AutomationPattern * automationPattern() diff --git a/include/lmms_style.h b/include/LmmsStyle.h similarity index 51% rename from include/lmms_style.h rename to include/LmmsStyle.h index 3cf0fe7e0..48c48d449 100644 --- a/include/lmms_style.h +++ b/include/LmmsStyle.h @@ -1,8 +1,8 @@ /* - * lmms_style.h - the graphical style used by LMMS to create a consistent + * LmmsStyle.h - the graphical style used by LMMS to create a consistent * interface * - * Copyright (c) 2007-2008 Tobias Doerffel + * Copyright (c) 2007-2014 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -30,16 +30,46 @@ #include -class lmmsStyle : public QPlastiqueStyle +class LmmsStyle : public QPlastiqueStyle { public: - lmmsStyle(); - virtual ~lmmsStyle() + enum ColorRole + { + AutomationBarFill, + AutomationBarValue, + AutomationSelectedBarFill, + AutomationCrosshair, + PianoRollStepNote, + PianoRollSelectedNote, + PianoRollDefaultNote, + PianoRollFrozenNote, + PianoRollMutedNote, + PianoRollEditHandle, + PianoRollVolumeLevel, + PianoRollPanningLevel, + PianoRollSelectedLevel, + TimelineForecolor, + StandardGraphLine, + StandardGraphHandle, + StandardGraphHandleBorder, + StandardGraphCrosshair, + TextFloatForecolor, + TextFloatFill, + VisualizationLevelLow, + VisualizationLevelMid, + VisualizationLevelPeak, + NumColorRoles + }; + + LmmsStyle(); + virtual ~LmmsStyle() { } virtual QPalette standardPalette( void ) const; + virtual void drawControl( ControlElement element, const QStyleOption* option, QPainter* painter, const QWidget* widget ) const; + virtual void drawComplexControl( ComplexControl control, const QStyleOptionComplex * option, @@ -54,6 +84,14 @@ public: const QStyleOption * option = 0, const QWidget * widget = 0 ) const; + QSize sizeFromContents( ContentsType type, const QStyleOption* option, const QSize& size, const QWidget* widget ) const; + QRect subControlRect( ComplexControl control, const QStyleOptionComplex *option, SubControl subControl, const QWidget *widget ) const; + +private: + QImage colorizeXpm( const char * const * xpm, const QBrush& fill ) const; + void hoverColors( bool sunken, bool hover, bool active, QColor& color, QColor& blend ) const; + QColor m_colors[ LmmsStyle::NumColorRoles ]; + } ; #endif diff --git a/src/core/FxMixer.cpp b/src/core/FxMixer.cpp index 5739cc2a6..60048c6ae 100644 --- a/src/core/FxMixer.cpp +++ b/src/core/FxMixer.cpp @@ -121,8 +121,8 @@ void FxChannel::doProcessing( sampleFrame * _buf ) { m_fxChain.startRunning(); m_stillRunning = m_fxChain.processAudioBuffer( _buf, fpp ); - m_peakLeft = engine::mixer()->peakValueLeft( _buf, fpp ) * v; - m_peakRight = engine::mixer()->peakValueRight( _buf, fpp ) * v; + m_peakLeft = qMax( m_peakLeft, engine::mixer()->peakValueLeft( _buf, fpp ) * v ); + m_peakRight = qMax( m_peakRight, engine::mixer()->peakValueRight( _buf, fpp ) * v ); } } diff --git a/src/core/main.cpp b/src/core/main.cpp index df7943389..346d76c0e 100644 --- a/src/core/main.cpp +++ b/src/core/main.cpp @@ -1,7 +1,7 @@ /* * main.cpp - just main.cpp which is starting up app... * - * Copyright (c) 2004-2013 Tobias Doerffel + * Copyright (c) 2004-2014 Tobias Doerffel * Copyright (c) 2012-2013 Paul Giblock

* * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net @@ -58,7 +58,7 @@ #include "config_mgr.h" #include "embed.h" #include "engine.h" -#include "lmms_style.h" +#include "LmmsStyle.h" #include "ImportFilter.h" #include "MainWindow.h" #include "ProjectRenderer.h" @@ -386,7 +386,7 @@ int main( int argc, char * * argv ) if( render_out.isEmpty() ) { // init style and palette - QApplication::setStyle( new lmmsStyle() ); + QApplication::setStyle( new LmmsStyle() ); // init splash screen - this is a bit difficult as we have a // semi-transparent splash-image therefore we first need to grab diff --git a/src/gui/FxMixerView.cpp b/src/gui/FxMixerView.cpp index 3ee54e6f2..6c3e69f15 100644 --- a/src/gui/FxMixerView.cpp +++ b/src/gui/FxMixerView.cpp @@ -458,17 +458,18 @@ void FxMixerView::updateFaders() const float fall_off = 1.2; if( m->m_fxChannels[i]->m_peakLeft > opl ) { - m_fxChannelViews[i]->m_fader->setPeak_L( - m->m_fxChannels[i]->m_peakLeft ); + m_fxChannelViews[i]->m_fader->setPeak_L( m->m_fxChannels[i]->m_peakLeft ); + m->m_fxChannels[i]->m_peakLeft = 0; } else { m_fxChannelViews[i]->m_fader->setPeak_L( opl/fall_off ); } + if( m->m_fxChannels[i]->m_peakRight > opr ) { - m_fxChannelViews[i]->m_fader->setPeak_R( - m->m_fxChannels[i]->m_peakRight ); + m_fxChannelViews[i]->m_fader->setPeak_R( m->m_fxChannels[i]->m_peakRight ); + m->m_fxChannels[i]->m_peakRight = 0; } else { diff --git a/src/gui/LmmsStyle.cpp b/src/gui/LmmsStyle.cpp new file mode 100644 index 000000000..16a244ea7 --- /dev/null +++ b/src/gui/LmmsStyle.cpp @@ -0,0 +1,836 @@ +/* + * LmmsStyle.cpp - the graphical style used by LMMS to create a consistent + * interface + * + * Copyright (c) 2007-2014 Tobias Doerffel + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + * + */ + + +#include +#include +#include +#include +#include +#include + +#include "LmmsStyle.h" + + +const int BUTTON_LENGTH = 24; + +static const char * const s_scrollbarArrowUpXpm[] = { + "7 6 8 1", + " g None", + ". g #000000", + "+ g #101010", + "@ g #A0A0A0", + "# g #C0C0C0", + "$ g #FFFFFF", + "% g #808080", + "& g #202020", + "..+@+..", + "..#$#..", + ".%$$$%.", + "&$$$$$&", + "@$$$$$@", + "@#####@"}; + +static const char * const s_scrollbarArrowRightXpm[] = { + "6 7 8 1", + " c None", + ". c #A0A0A0", + "+ c #202020", + "@ c #000000", + "# c #C0C0C0", + "$ c #FFFFFF", + "% c #808080", + "& c #101010", + "..+@@@", + "#$$%@@", + "#$$$#&", + "#$$$$.", + "#$$$#&", + "#$$%@@", + "..+@@@"}; + +static const char * const s_scrollbarArrowDownXpm[] = { + "7 6 8 1", + " g None", + ". g #000000", + "+ g #101010", + "@ g #A0A0A0", + "# g #C0C0C0", + "$ g #FFFFFF", + "% g #808080", + "& g #202020", + "@#####@", + "@$$$$$@", + "&$$$$$&", + ".%$$$%.", + "..#$#..", + "..+@+.."}; + +static const char * const s_scrollbarArrowLeftXpm[] = { + "6 7 8 1", + " g None", + ". g #000000", + "+ g #202020", + "@ g #A0A0A0", + "# g #808080", + "$ g #FFFFFF", + "% g #C0C0C0", + "& g #101010", + "...+@@", + "..#$$%", + "&%$$$%", + "@$$$$%", + "&%$$$%", + "..#$$%", + "...+@@"}; + + + +QLinearGradient getGradient( const QColor & _col, const QRectF & _rect ) +{ + QLinearGradient g( _rect.topLeft(), _rect.bottomLeft() ); + + qreal hue = _col.hueF(); + qreal value = _col.valueF(); + qreal saturation = _col.saturationF(); + + QColor c = _col; + c.setHsvF( hue, 0.42 * saturation, 0.98 * value ); // TODO: pattern: 1.08 + g.setColorAt( 0, c ); + c.setHsvF( hue, 0.58 * saturation, 0.95 * value ); // TODO: pattern: 1.05 + g.setColorAt( 0.25, c ); + c.setHsvF( hue, 0.70 * saturation, 0.93 * value ); // TODO: pattern: 1.03 + g.setColorAt( 0.5, c ); + + c.setHsvF( hue, 0.95 * saturation, 0.9 * value ); + g.setColorAt( 0.501, c ); + c.setHsvF( hue * 0.95, 0.95 * saturation, 0.95 * value ); + g.setColorAt( 0.75, c ); + c.setHsvF( hue * 0.90, 0.95 * saturation, 1 * value ); + g.setColorAt( 1.0, c ); + + return g; +} + + + +QLinearGradient darken( const QLinearGradient & _gradient ) +{ + QGradientStops stops = _gradient.stops(); + for (int i = 0; i < stops.size(); ++i) { + QColor color = stops.at(i).second; + stops[i].second = color.lighter(133); + } + + QLinearGradient g = _gradient; + g.setStops(stops); + return g; +} + + + +void drawPath( QPainter *p, const QPainterPath &path, + const QColor &col, const QColor &borderCol, + bool dark = false ) +{ + const QRectF pathRect = path.boundingRect(); + + const QLinearGradient baseGradient = getGradient(col, pathRect); + const QLinearGradient darkGradient = darken(baseGradient); + + p->setOpacity(0.25); + + // glow + if (dark) + p->strokePath(path, QPen(darkGradient, 4)); + else + p->strokePath(path, QPen(baseGradient, 4)); + + p->setOpacity(1.0); + + // fill + if (dark) + p->fillPath(path, darkGradient); + else + p->fillPath(path, baseGradient); + + // TODO: Remove?? + /* + QLinearGradient g(pathRect.topLeft(), pathRect.topRight()); + g.setCoordinateMode(QGradient::ObjectBoundingMode); + + p->setOpacity(0.2); + p->fillPath(path, g);*/ + // END: Remove?? + + p->setOpacity(0.5); + + // highlight (bb) + if (dark) + p->strokePath(path, QPen(borderCol.lighter(133), 2)); + else + p->strokePath(path, QPen(borderCol, 2)); +} + + + +static QString getCacheKey( const QString & _key, + const QStyleOption * _option, const QSize & _size ) +{ + QString tmp; + const QStyleOptionComplex *complexOption = + qstyleoption_cast ( _option ); + tmp.sprintf( "%s,%d,%d,%d,%lld,%dx%d", + _key.toLatin1().constData(), + uint( _option->state ), + complexOption ? uint( complexOption->activeSubControls ) : uint( 0 ), + _option->direction, + _option->palette.cacheKey(), + _size.width(), + _size.height() ); + return tmp; +} + + +LmmsStyle::LmmsStyle() : + QPlastiqueStyle() +{ + QFile file( "resources:style.css" ); + file.open( QIODevice::ReadOnly ); + qApp->setStyleSheet( file.readAll() ); + + qApp->setPalette( standardPalette() ); +} + + + + +QPalette LmmsStyle::standardPalette( void ) const +{ + QPalette pal = QPlastiqueStyle::standardPalette(); +/* pal.setColor( QPalette::Background, QColor( 91, 101, 113 ) ); + pal.setColor( QPalette::WindowText, QColor( 240, 240, 240 ) ); + pal.setColor( QPalette::Base, QColor( 128, 128, 128 ) ); + pal.setColor( QPalette::Text, QColor( 224, 224, 224 ) ); + pal.setColor( QPalette::Button, QColor( 201, 201, 201 ) ); + pal.setColor( QPalette::Shadow, QColor( 0, 0, 0 ) ); + pal.setColor( QPalette::ButtonText, QColor( 0, 0, 0 ) ); + pal.setColor( QPalette::BrightText, QColor( 74, 253, 133 ) ); + pal.setColor( QPalette::Highlight, QColor( 100, 100, 100 ) ); + pal.setColor( QPalette::HighlightedText, QColor( 255, 255, 255 ) );*/ + + QStringList paletteData = qApp->styleSheet().split( '\n' ).filter( QRegExp( "^palette:*" ) ); + foreach( QString s, paletteData ) + { + if (s.contains("background")) { pal.setColor( QPalette::Background, QColor( s.mid( s.indexOf("#"), 7 ) ) ); } + else if (s.contains("windowtext")) { pal.setColor( QPalette::WindowText, QColor( s.mid( s.indexOf("#"), 7 ) ) ); } + else if (s.contains("base")) { pal.setColor( QPalette::Base, QColor( s.mid( s.indexOf("#"), 7 ) ) ); } + else if (s.contains("buttontext")) { pal.setColor( QPalette::ButtonText, QColor( s.mid( s.indexOf("#"), 7 ) ) ); } + else if (s.contains("brighttext")) { pal.setColor( QPalette::BrightText, QColor( s.mid( s.indexOf("#"), 7 ) ) ); } + else if (s.contains("text")) { pal.setColor( QPalette::Text, QColor( s.mid( s.indexOf("#"), 7 ) ) ); } + else if (s.contains("button")) { pal.setColor( QPalette::Button, QColor( s.mid( s.indexOf("#"), 7 ) ) ); } + else if (s.contains("shadow")) { pal.setColor( QPalette::Shadow, QColor( s.mid( s.indexOf("#"), 7 ) ) ); } + else if (s.contains("highlightedtext")) { pal.setColor( QPalette::HighlightedText, QColor( s.mid( s.indexOf("#"), 7 ) ) ); } + else if (s.contains("highlight")) { pal.setColor( QPalette::Highlight, QColor( s.mid( s.indexOf("#"), 7 ) ) ); }; + } + + return( pal ); +} + + + + +void LmmsStyle::drawControl( ControlElement element, const QStyleOption* option, QPainter* painter, const QWidget* widget ) const +{ + + switch( element ) + { + case CE_ScrollBarAddLine: + if( const QStyleOptionSlider * scrollBar = qstyleoption_cast( option ) ) + { + + bool horizontal = scrollBar->orientation == Qt::Horizontal; + bool isEnabled = scrollBar->state & State_Enabled; + bool sunken = scrollBar->state & State_Sunken; + bool hover = scrollBar->state & State_MouseOver; + + QString pixmapName = getCacheKey( QLatin1String( "ScrollBarAddLine" ), option, option->rect.size() ); + + QPixmap cache; + if( !QPixmapCache::find( pixmapName, cache ) ) + { + cache = QPixmap( option->rect.size() ); + QPainter cachePainter( &cache ); + + cache.fill( QColor( 48, 48, 48 ) ); + QColor sliderColor; + QColor blurColor; + hoverColors(sunken, hover, + scrollBar->activeSubControls & SC_ScrollBarAddLine && isEnabled, + sliderColor, blurColor); + + int scrollBarExtent = pixelMetric( PM_ScrollBarExtent, option, widget ); + cachePainter.setPen( QPen( sliderColor, 0 ) ); + if( horizontal ) + { + int r = cache.rect().right(); + cachePainter.fillRect(0, 2, BUTTON_LENGTH-2, + scrollBarExtent-4, sliderColor); + + cachePainter.drawLine( r, 4, r, scrollBarExtent - 5 ); + cachePainter.drawLine( r - 1, 3, r - 1, scrollBarExtent - 4 ); + + const QPointF points[4] = { + QPoint( r, 3 ), QPoint( r, scrollBarExtent - 4 ), + QPoint( r - 1, 2 ), QPoint( r - 1, scrollBarExtent - 3 )}; + + cachePainter.setPen( QPen( blurColor, 0 ) ); + cachePainter.drawPoints( points, 4 ); + + QImage arrow = colorizeXpm( s_scrollbarArrowRightXpm, option->palette.foreground().color() ); + if( ( scrollBar->activeSubControls & SC_ScrollBarAddLine ) && sunken ) + { + cachePainter.translate( 1, 1 ); + } + cachePainter.drawImage( cache.rect().center() - QPoint( 3, 3 ), arrow ); + } + else + { + int b = cache.rect().bottom(); + cachePainter.fillRect( 2, 0, scrollBarExtent - 4, BUTTON_LENGTH - 2, sliderColor ); + cachePainter.drawLine( 4, b, scrollBarExtent - 5, b ); + cachePainter.drawLine( 3, b - 1, scrollBarExtent - 4, b - 1 ); + + const QPointF points[4] = { + QPoint( 3, b ), QPoint( scrollBarExtent - 4, b ), + QPoint( 2, b - 1 ), QPoint( scrollBarExtent - 3, b - 1 )}; + + cachePainter.setPen( QPen( blurColor, 0 ) ); + cachePainter.drawPoints( points, 4 ); + + QImage arrow = colorizeXpm( s_scrollbarArrowDownXpm, option->palette.foreground().color() ); + if( ( scrollBar->activeSubControls & SC_ScrollBarAddLine ) && sunken ) + { + cachePainter.translate( 1, 1 ); + } + cachePainter.drawImage( cache.rect().center() - QPoint( 3, 3 ), arrow ); + } + QPixmapCache::insert( pixmapName, cache ); + } + painter->drawPixmap( option->rect.topLeft(), cache ); + + } + break; + + case CE_ScrollBarSubLine: + if(const QStyleOptionSlider *scrollBar = qstyleoption_cast( option ) ) + { + bool horizontal = scrollBar->orientation == Qt::Horizontal; + bool isEnabled = scrollBar->state & State_Enabled; + bool sunken = scrollBar->state & State_Sunken; + bool hover = scrollBar->state & State_MouseOver; + + QString pixmapName = getCacheKey( QLatin1String( "ScrollBarSubLine" ), option, option->rect.size() ); + QPixmap cache; + if( !QPixmapCache::find( pixmapName, cache ) ) + { + cache = QPixmap( option->rect.size() ); + QPainter cachePainter( &cache ); + + cache.fill( QColor( 48, 48, 48 ) ); // TODO: Fill with CSS background + QColor sliderColor; + QColor blurColor; + hoverColors(sunken, hover, + scrollBar->activeSubControls & SC_ScrollBarSubLine && isEnabled, + sliderColor, blurColor); + + int scrollBarExtent = pixelMetric( PM_ScrollBarExtent, option, widget ); + cachePainter.setPen( QPen( sliderColor, 0 ) ); + if( horizontal ) + { + cachePainter.fillRect( 2, 2, BUTTON_LENGTH - 2, scrollBarExtent - 4, sliderColor ); + cachePainter.drawLine( 0, 4, 0, scrollBarExtent - 5 ); + cachePainter.drawLine( 1, 3, 1, scrollBarExtent - 4 ); + + const QPointF points[4] = { + QPoint( 0, 3 ), QPoint( 0, scrollBarExtent - 4 ), + QPoint( 1, 2 ), QPoint( 1, scrollBarExtent - 3 )}; + + cachePainter.setPen( QPen( blurColor, 0 ) ); + cachePainter.drawPoints( points, 4 ); + + QImage arrow = colorizeXpm( s_scrollbarArrowLeftXpm, option->palette.foreground().color() ); + if( ( scrollBar->activeSubControls & SC_ScrollBarSubLine ) && sunken ) + { + cachePainter.translate( 1, 1 ); + } + cachePainter.drawImage( cache.rect().center() - QPoint( 3, 3 ), arrow ); + } + else + { + cachePainter.fillRect( 2, 2, scrollBarExtent - 4, BUTTON_LENGTH - 2, sliderColor ); + cachePainter.drawLine( 4, 0, scrollBarExtent - 5, 0 ); + cachePainter.drawLine( 3, 1, scrollBarExtent - 4, 1 ); + + const QPointF points[4] = { + QPoint( 3, 0 ), QPoint( scrollBarExtent - 4, 0 ), + QPoint( 2, 1 ), QPoint( scrollBarExtent - 3, 1 )}; + + cachePainter.setPen( QPen( blurColor, 0 ) ); + cachePainter.drawPoints( points, 4 ); + + QImage arrow = colorizeXpm( s_scrollbarArrowUpXpm, option->palette.foreground().color() ); + if( ( scrollBar->activeSubControls & SC_ScrollBarSubLine ) && sunken ) + { + cachePainter.translate( 1, 1 ); + } + cachePainter.drawImage( cache.rect().center() - QPoint( 3, 3 ), arrow ); + } + QPixmapCache::insert( pixmapName, cache ); + } + painter->drawPixmap( option->rect.topLeft(), cache ); + + } + break; + + case CE_ScrollBarSubPage: + case CE_ScrollBarAddPage: + break; + + case CE_ScrollBarSlider: + if( const QStyleOptionSlider* scrollBar = qstyleoption_cast( option ) ) + { + bool horizontal = scrollBar->orientation == Qt::Horizontal; + bool isEnabled = scrollBar->state & State_Enabled; + bool sunken = scrollBar->state & State_Sunken; + bool hover = scrollBar->state & State_MouseOver; + + QColor sliderColor, blendColor; + hoverColors( sunken, hover, (scrollBar->activeSubControls & SC_ScrollBarSlider) && isEnabled, sliderColor, blendColor); + + QRect rc = scrollBar->rect; + if( horizontal ) + { + painter->fillRect( rc.left(), rc.top() + 2, rc.width(), rc.height() - 4, sliderColor ); + } + else + { + painter->fillRect( rc.left() + 2, rc.top(), rc.width() - 4, rc.height(), sliderColor ); + } + } + break; + + default: + QPlastiqueStyle::drawControl( element, option, painter, widget ); + break; + } +} + + + +void LmmsStyle::drawComplexControl( ComplexControl control, + const QStyleOptionComplex * option, + QPainter *painter, + const QWidget *widget ) const +{ + // fix broken titlebar styling on win32 + if( control == CC_TitleBar ) + { + const QStyleOptionTitleBar * titleBar = + qstyleoption_cast(option ); + if( titleBar ) + { + QStyleOptionTitleBar so( *titleBar ); + so.palette = standardPalette(); + so.palette.setColor( QPalette::HighlightedText, + ( titleBar->titleBarState & State_Active ) ? + QColor( 255, 255, 255 ) : + QColor( 192, 192, 192 ) ); + so.palette.setColor( QPalette::Text, + QColor( 64, 64, 64 ) ); + QPlastiqueStyle::drawComplexControl( control, &so, + painter, widget ); + return; + } + } + else if( control == CC_ScrollBar ) + { + QColor background = QColor( 48, 48, 48 ); + painter->fillRect( option->rect, background ); + + } + QPlastiqueStyle::drawComplexControl( control, option, painter, widget ); +} + + + + +void LmmsStyle::drawPrimitive( PrimitiveElement element, + const QStyleOption *option, QPainter *painter, + const QWidget *widget) const +{ + if( element == QStyle::PE_Frame || + element == QStyle::PE_FrameLineEdit || + element == QStyle::PE_PanelLineEdit ) + { + const QRect rect = option->rect; + + QColor black = QColor( 0, 0, 0 ); + QColor shadow = option->palette.shadow().color(); + QColor highlight = option->palette.highlight().color(); + + int a100 = 165; + int a75 = static_cast( a100 * .75 ); + int a50 = static_cast( a100 * .6 ); + int a25 = static_cast( a100 * .33 ); + + QLine lines[4]; + QPoint points[4]; + + // black inside lines + // 50% + black.setAlpha(a100); + painter->setPen(QPen(black, 0)); + lines[0] = QLine(rect.left() + 2, rect.top() + 1, + rect.right() - 2, rect.top() + 1); + lines[1] = QLine(rect.left() + 2, rect.bottom() - 1, + rect.right() - 2, rect.bottom() - 1); + lines[2] = QLine(rect.left() + 1, rect.top() + 2, + rect.left() + 1, rect.bottom() - 2); + lines[3] = QLine(rect.right() - 1, rect.top() + 2, + rect.right() - 1, rect.bottom() - 2); + painter->drawLines(lines, 4); + + // black inside dots + black.setAlpha(a50); + painter->setPen(QPen(black, 0)); + points[0] = QPoint(rect.left() + 2, rect.top() + 2); + points[1] = QPoint(rect.left() + 2, rect.bottom() - 2); + points[2] = QPoint(rect.right() - 2, rect.top() + 2); + points[3] = QPoint(rect.right() - 2, rect.bottom() - 2); + painter->drawPoints(points, 4); + + + // outside lines - shadow + // 100% + shadow.setAlpha(a75); + painter->setPen(QPen(shadow, 0)); + lines[0] = QLine(rect.left() + 2, rect.top(), + rect.right() - 2, rect.top()); + lines[1] = QLine(rect.left(), rect.top() + 2, + rect.left(), rect.bottom() - 2); + painter->drawLines(lines, 2); + + // outside corner dots - shadow + // 75% + shadow.setAlpha(a50); + painter->setPen(QPen(shadow, 0)); + points[0] = QPoint(rect.left() + 1, rect.top() + 1); + points[1] = QPoint(rect.right() - 1, rect.top() + 1); + painter->drawPoints(points, 2); + + // outside end dots - shadow + // 50% + shadow.setAlpha(a25); + painter->setPen(QPen(shadow, 0)); + points[0] = QPoint(rect.left() + 1, rect.top()); + points[1] = QPoint(rect.left(), rect.top() + 1); + points[2] = QPoint(rect.right() - 1, rect.top()); + points[3] = QPoint(rect.left(), rect.bottom() - 1); + painter->drawPoints(points, 4); + + + // outside lines - highlight + // 100% + highlight.setAlpha(a75); + painter->setPen(QPen(highlight, 0)); + lines[0] = QLine(rect.left() + 2, rect.bottom(), + rect.right() - 2, rect.bottom()); + lines[1] = QLine(rect.right(), rect.top() + 2, + rect.right(), rect.bottom() - 2); + painter->drawLines(lines, 2); + + // outside corner dots - highlight + // 75% + highlight.setAlpha(a50); + painter->setPen(QPen(highlight, 0)); + points[0] = QPoint(rect.left() + 1, rect.bottom() - 1); + points[1] = QPoint(rect.right() - 1, rect.bottom() - 1); + painter->drawPoints(points, 2); + + // outside end dots - highlight + // 50% + highlight.setAlpha(a25); + painter->setPen(QPen(highlight, 0)); + points[0] = QPoint(rect.right() - 1, rect.bottom()); + points[1] = QPoint(rect.right(), rect.bottom() - 1); + points[2] = QPoint(rect.left() + 1, rect.bottom()); + points[3] = QPoint(rect.right(), rect.top() + 1); + painter->drawPoints(points, 4); + } + else + { + QPlastiqueStyle::drawPrimitive( element, option, painter, + widget ); + } + +} + + +int LmmsStyle::pixelMetric( PixelMetric _metric, const QStyleOption * _option, + const QWidget * _widget ) const +{ + switch( _metric ) + { + case QStyle::PM_ButtonMargin: + return 3; + + case QStyle::PM_ButtonIconSize: + return 20; + + case QStyle::PM_ToolBarItemMargin: + return 1; + + case QStyle::PM_ToolBarItemSpacing: + return 2; + + case QStyle::PM_TitleBarHeight: + return 24; + + default: + return QPlastiqueStyle::pixelMetric( _metric, _option, + _widget ); + } +} + +// QStyle::SH_TitleBar_NoBorder + +QSize LmmsStyle::sizeFromContents( ContentsType type, const QStyleOption* option, const QSize& size, const QWidget* widget ) const +{ + if( type == CT_ScrollBar ) + { + if( const QStyleOptionSlider * scrollBar = qstyleoption_cast( option ) ) + { + int scrollBarExtent = pixelMetric( PM_ScrollBarExtent, option, widget ); + int scrollBarSliderMinimum = pixelMetric( PM_ScrollBarSliderMin, option, widget ); + if( scrollBar->orientation == Qt::Horizontal ) + { + return QSize( BUTTON_LENGTH * 2 + scrollBarSliderMinimum, scrollBarExtent ); + } + else + { + return QSize( scrollBarExtent, BUTTON_LENGTH * 2 + scrollBarSliderMinimum ); + } + } + } + + return QPlastiqueStyle::sizeFromContents( type, option, size, widget ); +} + + +QRect LmmsStyle::subControlRect( ComplexControl control, const QStyleOptionComplex* option, SubControl subControl, const QWidget* widget ) const +{ + QRect rect = QPlastiqueStyle::subControlRect( control, option, subControl, widget ); + + switch( control ) + { + case CC_ScrollBar: + if( const QStyleOptionSlider* scrollBar = qstyleoption_cast( option ) ) + { + int scrollBarExtent = pixelMetric( PM_ScrollBarExtent, scrollBar, widget ); + int sliderMaxLength = ( + ( scrollBar->orientation == Qt::Horizontal ) ? + scrollBar->rect.width() : + scrollBar->rect.height() ) - + ( BUTTON_LENGTH * 2 + 6 ); + int sliderMinLength = pixelMetric( PM_ScrollBarSliderMin, scrollBar, widget ); + int sliderLength; + + // calculate slider length + if( scrollBar->maximum != scrollBar->minimum ) + { + uint valueRange = scrollBar->maximum - scrollBar->minimum; + sliderLength = ( scrollBar->pageStep * sliderMaxLength ) / + ( valueRange + scrollBar->pageStep ); + + if( sliderLength < sliderMinLength || valueRange > ( INT_MAX ) / 2 ) + { + sliderLength = sliderMinLength; + } + if( sliderLength > sliderMaxLength ) + { + sliderLength = sliderMaxLength; + } + } + else + { + sliderLength = sliderMaxLength; + } + + int sliderStart = BUTTON_LENGTH + 3 + sliderPositionFromValue( + scrollBar->minimum, + scrollBar->maximum, + scrollBar->sliderPosition, + sliderMaxLength - sliderLength, + scrollBar->upsideDown ); + + QRect scrollBarRect = scrollBar->rect; + + switch( subControl ) + { + case SC_ScrollBarSubLine: // top/left button + if( scrollBar->orientation == Qt::Horizontal ) + { + rect.setRect( scrollBarRect.left() + 2, scrollBarRect.top(), + BUTTON_LENGTH, scrollBarExtent ); + } + else + { + rect.setRect( scrollBarRect.left(), scrollBarRect.top() + 2, + scrollBarExtent, BUTTON_LENGTH ); + } + break; + + case SC_ScrollBarAddLine: // bottom/right button + if( scrollBar->orientation == Qt::Horizontal ) + { + rect.setRect( scrollBarRect.right() - 1 - BUTTON_LENGTH, + scrollBarRect.top(), BUTTON_LENGTH, scrollBarExtent ); + } + else + { + rect.setRect( scrollBarRect.left(), + scrollBarRect.bottom() - 1 - BUTTON_LENGTH, + scrollBarExtent, BUTTON_LENGTH ); + } + break; + + case SC_ScrollBarSubPage: + if( scrollBar->orientation == Qt::Horizontal ) + { + rect.setRect( scrollBarRect.left() + 2 + BUTTON_LENGTH, + scrollBarRect.top(), + sliderStart - ( scrollBarRect.left() + 2 + BUTTON_LENGTH ), + scrollBarExtent ); + } + else + { + rect.setRect( scrollBarRect.left(), + scrollBarRect.top() + 2 + BUTTON_LENGTH, scrollBarExtent, + sliderStart - ( scrollBarRect.left() + 2 + BUTTON_LENGTH ) ); + } + break; + + case SC_ScrollBarAddPage: + if( scrollBar->orientation == Qt::Horizontal ) + { + rect.setRect( sliderStart + sliderLength, 0, + sliderMaxLength - sliderStart - sliderLength, + scrollBarExtent ); + } + else + rect.setRect( 0, sliderStart + sliderLength, scrollBarExtent, + sliderMaxLength - sliderStart - sliderLength ); + break; + + case SC_ScrollBarGroove: + if( scrollBar->orientation == Qt::Horizontal ) + { + rect = scrollBarRect.adjusted( BUTTON_LENGTH, 0, -BUTTON_LENGTH, 0 ); + } + else + { + rect = scrollBarRect.adjusted( 0, BUTTON_LENGTH, 0, -BUTTON_LENGTH ); + } + break; + + case SC_ScrollBarSlider: + if( scrollBar->orientation == Qt::Horizontal ) + { + rect.setRect( sliderStart, 0, sliderLength, scrollBarExtent ); + } + else + { + rect.setRect( 0, sliderStart, scrollBarExtent, sliderLength ); + } + break; + + default: + break; + } + rect = visualRect( scrollBar->direction, scrollBarRect, rect ); + } + break; + + default: + break; + } + + return rect; +} + + + + +QImage LmmsStyle::colorizeXpm( const char * const * xpm, const QBrush& fill ) const +{ + QImage arrowXpm( xpm ); + QImage arrow( arrowXpm.size(), QImage::Format_ARGB32 ); + QPainter arrowPainter( &arrow ); + arrowPainter.fillRect( arrow.rect(), fill ); + arrowPainter.end(); + arrow.setAlphaChannel( arrowXpm ); + + return arrow; +} + + +void LmmsStyle::hoverColors( bool sunken, bool hover, bool active, QColor& color, QColor& blend ) const +{ + if( active ) + { + if( sunken ) + { + color = QColor( 75, 75, 75 ); + blend = QColor( 65, 65, 65 ); + } + else if( hover ) + { + color = QColor( 100, 100, 100 ); + blend = QColor( 75, 75, 75 ); + } + else + { + color = QColor( 21, 21, 21 ); + blend = QColor( 33, 33, 33 ); + } + } + else + { + color = QColor( 21, 21, 21 ); + blend = QColor( 33, 33, 33 ); + } +} + diff --git a/src/gui/lmms_style.cpp b/src/gui/lmms_style.cpp deleted file mode 100644 index 663454f9f..000000000 --- a/src/gui/lmms_style.cpp +++ /dev/null @@ -1,253 +0,0 @@ -/* - * lmms_style.cpp - the graphical style used by LMMS to create a consistent - * interface - * - * Copyright (c) 2007-2008 Tobias Doerffel - * - * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program (see COPYING); if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - */ - - -#include -#include -#include -#include -#include - -#include "lmms_style.h" - - -lmmsStyle::lmmsStyle() : - QPlastiqueStyle() -{ - QFile file( "resources:style.css" ); - file.open( QIODevice::ReadOnly ); - qApp->setStyleSheet( file.readAll() ); - - qApp->setPalette( standardPalette() ); -} - - - - -QPalette lmmsStyle::standardPalette( void ) const -{ - QPalette pal = QPlastiqueStyle::standardPalette(); -/* pal.setColor( QPalette::Background, QColor( 91, 101, 113 ) ); - pal.setColor( QPalette::WindowText, QColor( 240, 240, 240 ) ); - pal.setColor( QPalette::Base, QColor( 128, 128, 128 ) ); - pal.setColor( QPalette::Text, QColor( 224, 224, 224 ) ); - pal.setColor( QPalette::Button, QColor( 201, 201, 201 ) ); - pal.setColor( QPalette::Shadow, QColor( 0, 0, 0 ) ); - pal.setColor( QPalette::ButtonText, QColor( 0, 0, 0 ) ); - pal.setColor( QPalette::BrightText, QColor( 74, 253, 133 ) ); - pal.setColor( QPalette::Highlight, QColor( 100, 100, 100 ) ); - pal.setColor( QPalette::HighlightedText, QColor( 255, 255, 255 ) );*/ - - QStringList paletteData = qApp->styleSheet().split( '\n' ).filter( QRegExp( "^palette:*" ) ); - foreach( QString s, paletteData ) - { - if (s.contains("background")) { pal.setColor( QPalette::Background, QColor( s.mid( s.indexOf("#"), 7 ) ) ); } - else if (s.contains("windowtext")) { pal.setColor( QPalette::WindowText, QColor( s.mid( s.indexOf("#"), 7 ) ) ); } - else if (s.contains("base")) { pal.setColor( QPalette::Base, QColor( s.mid( s.indexOf("#"), 7 ) ) ); } - else if (s.contains("buttontext")) { pal.setColor( QPalette::ButtonText, QColor( s.mid( s.indexOf("#"), 7 ) ) ); } - else if (s.contains("brighttext")) { pal.setColor( QPalette::BrightText, QColor( s.mid( s.indexOf("#"), 7 ) ) ); } - else if (s.contains("text")) { pal.setColor( QPalette::Text, QColor( s.mid( s.indexOf("#"), 7 ) ) ); } - else if (s.contains("button")) { pal.setColor( QPalette::Button, QColor( s.mid( s.indexOf("#"), 7 ) ) ); } - else if (s.contains("shadow")) { pal.setColor( QPalette::Shadow, QColor( s.mid( s.indexOf("#"), 7 ) ) ); } - else if (s.contains("highlightedtext")) { pal.setColor( QPalette::HighlightedText, QColor( s.mid( s.indexOf("#"), 7 ) ) ); } - else if (s.contains("highlight")) { pal.setColor( QPalette::Highlight, QColor( s.mid( s.indexOf("#"), 7 ) ) ); }; - } - - return( pal ); -} - - - - -void lmmsStyle::drawComplexControl( ComplexControl control, - const QStyleOptionComplex * option, - QPainter *painter, - const QWidget *widget ) const -{ - // fix broken titlebar styling on win32 - if( control == CC_TitleBar ) - { - const QStyleOptionTitleBar * titleBar = - qstyleoption_cast(option ); - if( titleBar ) - { - QStyleOptionTitleBar so( *titleBar ); - so.palette = standardPalette(); - so.palette.setColor( QPalette::HighlightedText, - ( titleBar->titleBarState & State_Active ) ? - QColor( 255, 255, 255 ) : - QColor( 192, 192, 192 ) ); - so.palette.setColor( QPalette::Text, - QColor( 64, 64, 64 ) ); - QPlastiqueStyle::drawComplexControl( control, &so, - painter, widget ); - return; - } - } - QPlastiqueStyle::drawComplexControl( control, option, painter, widget ); -} - - - - -void lmmsStyle::drawPrimitive( PrimitiveElement element, - const QStyleOption *option, QPainter *painter, - const QWidget *widget) const -{ - if( element == QStyle::PE_Frame || - element == QStyle::PE_FrameLineEdit || - element == QStyle::PE_PanelLineEdit ) - { - const QRect rect = option->rect; - - QColor black = QColor( 0, 0, 0 ); - QColor shadow = option->palette.shadow().color(); - QColor highlight = option->palette.highlight().color(); - - int a100 = 165; - int a75 = static_cast( a100 * .75 ); - int a50 = static_cast( a100 * .6 ); - int a25 = static_cast( a100 * .33 ); - - QLine lines[4]; - QPoint points[4]; - - // black inside lines - // 50% - black.setAlpha(a100); - painter->setPen(QPen(black, 0)); - lines[0] = QLine(rect.left() + 2, rect.top() + 1, - rect.right() - 2, rect.top() + 1); - lines[1] = QLine(rect.left() + 2, rect.bottom() - 1, - rect.right() - 2, rect.bottom() - 1); - lines[2] = QLine(rect.left() + 1, rect.top() + 2, - rect.left() + 1, rect.bottom() - 2); - lines[3] = QLine(rect.right() - 1, rect.top() + 2, - rect.right() - 1, rect.bottom() - 2); - painter->drawLines(lines, 4); - - // black inside dots - black.setAlpha(a50); - painter->setPen(QPen(black, 0)); - points[0] = QPoint(rect.left() + 2, rect.top() + 2); - points[1] = QPoint(rect.left() + 2, rect.bottom() - 2); - points[2] = QPoint(rect.right() - 2, rect.top() + 2); - points[3] = QPoint(rect.right() - 2, rect.bottom() - 2); - painter->drawPoints(points, 4); - - - // outside lines - shadow - // 100% - shadow.setAlpha(a75); - painter->setPen(QPen(shadow, 0)); - lines[0] = QLine(rect.left() + 2, rect.top(), - rect.right() - 2, rect.top()); - lines[1] = QLine(rect.left(), rect.top() + 2, - rect.left(), rect.bottom() - 2); - painter->drawLines(lines, 2); - - // outside corner dots - shadow - // 75% - shadow.setAlpha(a50); - painter->setPen(QPen(shadow, 0)); - points[0] = QPoint(rect.left() + 1, rect.top() + 1); - points[1] = QPoint(rect.right() - 1, rect.top() + 1); - painter->drawPoints(points, 2); - - // outside end dots - shadow - // 50% - shadow.setAlpha(a25); - painter->setPen(QPen(shadow, 0)); - points[0] = QPoint(rect.left() + 1, rect.top()); - points[1] = QPoint(rect.left(), rect.top() + 1); - points[2] = QPoint(rect.right() - 1, rect.top()); - points[3] = QPoint(rect.left(), rect.bottom() - 1); - painter->drawPoints(points, 4); - - - // outside lines - highlight - // 100% - highlight.setAlpha(a75); - painter->setPen(QPen(highlight, 0)); - lines[0] = QLine(rect.left() + 2, rect.bottom(), - rect.right() - 2, rect.bottom()); - lines[1] = QLine(rect.right(), rect.top() + 2, - rect.right(), rect.bottom() - 2); - painter->drawLines(lines, 2); - - // outside corner dots - highlight - // 75% - highlight.setAlpha(a50); - painter->setPen(QPen(highlight, 0)); - points[0] = QPoint(rect.left() + 1, rect.bottom() - 1); - points[1] = QPoint(rect.right() - 1, rect.bottom() - 1); - painter->drawPoints(points, 2); - - // outside end dots - highlight - // 50% - highlight.setAlpha(a25); - painter->setPen(QPen(highlight, 0)); - points[0] = QPoint(rect.right() - 1, rect.bottom()); - points[1] = QPoint(rect.right(), rect.bottom() - 1); - points[2] = QPoint(rect.left() + 1, rect.bottom()); - points[3] = QPoint(rect.right(), rect.top() + 1); - painter->drawPoints(points, 4); - } - else - { - QPlastiqueStyle::drawPrimitive( element, option, painter, - widget ); - } - -} - - -int lmmsStyle::pixelMetric( PixelMetric _metric, const QStyleOption * _option, - const QWidget * _widget ) const -{ - switch( _metric ) - { - case QStyle::PM_ButtonMargin: - return 3; - - case QStyle::PM_ButtonIconSize: - return 20; - - case QStyle::PM_ToolBarItemMargin: - return 1; - - case QStyle::PM_ToolBarItemSpacing: - return 2; - - case QStyle::PM_TitleBarHeight: - return 24; - - default: - return QPlastiqueStyle::pixelMetric( _metric, _option, - _widget ); - } -} - -// QStyle::SH_TitleBar_NoBorder diff --git a/src/gui/piano_roll.cpp b/src/gui/piano_roll.cpp index 1728b1c03..6679120a1 100644 --- a/src/gui/piano_roll.cpp +++ b/src/gui/piano_roll.cpp @@ -618,7 +618,7 @@ pianoRoll::pianoRoll() : if( engine::mainWindow()->workspace() ) { engine::mainWindow()->workspace()->addSubWindow( this ); - parentWidget()->setMinimumWidth( tb_layout->minimumSize().width()+10 ); + parentWidget()->setMinimumSize( tb_layout->minimumSize().width()+10, 200 ); parentWidget()->resize( tb_layout->minimumSize().width()+10, INITIAL_PIANOROLL_HEIGHT ); parentWidget()->hide(); @@ -917,6 +917,9 @@ inline void pianoRoll::drawDetuningInfo( QPainter & _p, note * _n, int _x, int middle_y = _y + KEY_LINE_HEIGHT / 2; _p.setPen( QColor( 0xFF, 0xDF, 0x20 ) ); + int old_x = 0; + int old_y = 0; + timeMap & map = _n->detuning()->automationPattern()->getTimeMap(); for( timeMap::ConstIterator it = map.begin(); it != map.end(); ++it ) { @@ -929,10 +932,28 @@ inline void pianoRoll::drawDetuningInfo( QPainter & _p, note * _n, int _x, const float level = it.value(); - int pos_y = (int)( middle_y - level * KEY_LINE_HEIGHT / 10 ); + int pos_y = (int)( middle_y - level * KEY_LINE_HEIGHT ); + + if( old_x != 0 && old_y != 0 ) + { + switch( _n->detuning()->automationPattern()->progressionType() ) + { + case AutomationPattern::DiscreteProgression: + _p.drawLine( old_x, old_y, pos_x, old_y ); + _p.drawLine( pos_x, old_y, pos_x, pos_y ); + break; + case AutomationPattern::CubicHermiteProgression: /* TODO */ + case AutomationPattern::LinearProgression: + _p.drawLine( old_x, old_y, pos_x, pos_y ); + break; + } + } _p.drawLine( pos_x - 1, pos_y, pos_x + 1, pos_y ); _p.drawLine( pos_x, pos_y - 1, pos_x, pos_y + 1 ); + + old_x = pos_x; + old_y = pos_y; } }