From 1c1870ce3a220efa7bab64b66926b84069e64fbb Mon Sep 17 00:00:00 2001 From: Paul Giblock Date: Fri, 29 Feb 2008 09:15:15 +0000 Subject: [PATCH] various graphical enhancements git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/trunk/lmms@736 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 17 +++ Makefile.am | 1 + data/themes/default/lcd_19red.png | Bin 0 -> 7765 bytes include/lcd_spinbox.h | 21 +++- include/lmms_style.h | 44 +++++++ src/core/main.cpp | 3 + src/core/track.cpp | 30 ++++- src/widgets/lcd_spinbox.cpp | 189 +++++++++++++++++++++++------- 8 files changed, 252 insertions(+), 53 deletions(-) create mode 100644 data/themes/default/lcd_19red.png create mode 100644 include/lmms_style.h diff --git a/ChangeLog b/ChangeLog index e91703a34..b3ba4b3ec 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,20 @@ +2008-02-29 Paul Giblock + + * include/lcd_spinbox.h: + * src/widgets/lcd_spinbox.cpp: + * data/themes/default/lcd_19red.png: + new non-QLcdSpinBox pixmap-based LCD spinbox + + * include/lmms_style.h: + * src/core/main.cpp: + * Makefile.am: + added lmmsStyle to aim for a consistant interface. Some Qt themes + make LMMS look really bad. Hopefully, overtime, we can make a style + the unifies all our gui elements + + * src/core/track.cpp: + playing with alternating colors per tact + 2008-02-28 Tobias Doerffel * src/core/plugin.cpp: diff --git a/Makefile.am b/Makefile.am index 0884e7991..fb79103fe 100644 --- a/Makefile.am +++ b/Makefile.am @@ -272,6 +272,7 @@ lmms_SOURCES = \ $(srcdir)/include/interpolation.h \ $(srcdir)/include/lmms_constants.h \ $(srcdir)/include/lmms_math.h \ + $(srcdir)/include/lmms_style.h \ $(srcdir)/include/mixer.h \ $(srcdir)/include/pattern.h \ $(srcdir)/include/instrument_track.h \ diff --git a/data/themes/default/lcd_19red.png b/data/themes/default/lcd_19red.png new file mode 100644 index 0000000000000000000000000000000000000000..7748a363175fd0f8c8ce5ba41170d88951c5a431 GIT binary patch literal 7765 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 bpaA|aTx}Q-1%3E_00000NkvXXu0mjfx#917 literal 0 HcmV?d00001 diff --git a/include/lcd_spinbox.h b/include/lcd_spinbox.h index 6c4c86a1a..a272893fc 100644 --- a/include/lcd_spinbox.h +++ b/include/lcd_spinbox.h @@ -40,7 +40,11 @@ class lcdSpinBox : public QWidget, public automatableModelView Q_OBJECT public: lcdSpinBox( int _num_digits, QWidget * _parent, const QString & _name = - QString::null ); + QString::null ); + + lcdSpinBox( int _num_digits, const QString & _lcd_style, + QWidget * _parent, const QString & _name = QString::null ); + virtual ~lcdSpinBox(); void setLabel( const QString & _txt ); @@ -69,13 +73,22 @@ protected: virtual void mouseMoveEvent( QMouseEvent * _me ); virtual void mouseReleaseEvent( QMouseEvent * _me ); virtual void wheelEvent( QWheelEvent * _we ); - + virtual void paintEvent( QPaintEvent * _me ); private: + + static const int charsPerPixmap = 12; + QMap m_textForValue; - QLCDNumber * m_number; - QLabel * m_label; + QString m_display; + + QString m_label; + QPixmap * m_lcdPixmap; + + int m_cellWidth; + int m_cellHeight; + int m_numDigits; QPoint m_origMousePos; diff --git a/include/lmms_style.h b/include/lmms_style.h new file mode 100644 index 000000000..a44a15049 --- /dev/null +++ b/include/lmms_style.h @@ -0,0 +1,44 @@ +/* + * lmms_style.h - the graphical style used my LMMS to create a consistent interface + * + * Copyright (c) 2004-2007 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. + * + */ + + +#ifndef _LMMS_STYLE_H +#define _LMMS_STYLE_H + +#include + +class lmmsStyle : public QPlastiqueStyle +{ +public: + lmmsStyle() : + QPlastiqueStyle () + { + } + + virtual ~lmmsStyle() + { + } +}; + +#endif diff --git a/src/core/main.cpp b/src/core/main.cpp index bf5fadc2c..1a5055674 100644 --- a/src/core/main.cpp +++ b/src/core/main.cpp @@ -45,6 +45,7 @@ #include "song.h" #include "gui_templates.h" #include "automatable_model_templates.h" +#include "lmms_style.h" #warning TODO: move somewhere else static inline QString baseName( const QString & _file ) @@ -175,6 +176,8 @@ int main( int argc, char * * argv ) if( gui_startup ) { + QApplication::setStyle( new lmmsStyle() ); + // set palette QPalette pal = app.palette(); pal.setColor( QPalette::Background, QColor( 128, 128, 128 ) ); diff --git a/src/core/track.cpp b/src/core/track.cpp index 4348e2d2f..23ad56ed3 100644 --- a/src/core/track.cpp +++ b/src/core/track.cpp @@ -614,10 +614,10 @@ trackContentWidget::trackContentWidget( trackView * _parent ) : QWidget( _parent ), m_trackView( _parent ) { - setAutoFillBackground( TRUE ); - QPalette pal; - pal.setColor( backgroundRole(), QColor( 96, 96, 96 ) ); - setPalette( pal ); + //setAutoFillBackground( TRUE ); + //QPalette pal; + //pal.setColor( backgroundRole(), QColor( 96, 96, 96 ) ); + //setPalette( pal ); setAcceptDrops( TRUE ); connect( _parent->getTrackContainerView(), @@ -696,6 +696,7 @@ void trackContentWidget::changePosition( const midiTime & _new_pos ) { // const int tcos = numOfTCOs(); + if( m_trackView->getTrackContainerView() == engine::getBBEditor() ) { const int cur_bb = engine::getBBTrackContainer()->currentBB(); @@ -759,6 +760,9 @@ void trackContentWidget::changePosition( const midiTime & _new_pos ) tcov->hide(); } } + + // redraw backgroun + update(); } @@ -833,15 +837,29 @@ void trackContentWidget::mousePressEvent( QMouseEvent * _me ) void trackContentWidget::paintEvent( QPaintEvent * _pe ) { QPainter p( this ); - p.fillRect( rect(), QColor( 96, 96, 96 ) ); + //p.fillRect( rect(), QColor( 23, 34, 37 ) ); const trackContainerView * tcv = m_trackView->getTrackContainerView(); + bool flip = TRUE; if( !tcv->fixedTCOs() ) { const int offset = (int)( ( tcv->currentPosition() % 4 ) * tcv->pixelsPerTact() ); + + flip = tcv->currentPosition() % 256 < 128; + int flipper = (tcv->currentPosition()/64) % 8; + + for( int x = 0; x < width(); x+= (int) tcv->pixelsPerTact() ) { + p.fillRect( QRect(x, 0, + (int) tcv->pixelsPerTact(), height()), + (flipper<4) ? + QColor( 23, 34, 37 ) : + QColor( 31, 45, 50 )); + flipper = (flipper+1)%8; + } + // draw vertical lines - p.setPen( QColor( 128, 128, 128 ) ); + p.setPen( QColor( 54, 65, 69 ) ); for( int x = -offset; x < width(); x += (int) tcv->pixelsPerTact() ) { diff --git a/src/widgets/lcd_spinbox.cpp b/src/widgets/lcd_spinbox.cpp index abd3e2673..71001e81b 100644 --- a/src/widgets/lcd_spinbox.cpp +++ b/src/widgets/lcd_spinbox.cpp @@ -30,6 +30,10 @@ #include #include #include +#include +#include +#include + #include "automatable_model_templates.h" #include "caption_menu.h" @@ -42,28 +46,47 @@ lcdSpinBox::lcdSpinBox( int _num_digits, QWidget * _parent, const QString & _name ) : QWidget( _parent ), autoModelView( new autoModel( 0, 0, 0, 1, NULL, TRUE ) ), - m_number( new QLCDNumber( _num_digits, this ) ), - m_label( NULL ), + m_label(), + m_numDigits( _num_digits ), m_origMousePos() -{ - m_number->setFrameShape( QFrame::Panel ); - m_number->setFrameShadow( QFrame::Sunken ); - m_number->setSegmentStyle( QLCDNumber::Flat ); - - QPalette pal; - pal.setColor( QPalette::Light, Qt::gray ); - pal.setColor( QPalette::Mid, Qt::darkGray ); - pal.setColor( QPalette::Dark, Qt::black ); - pal.setColor( m_number->backgroundRole(), Qt::black ); - m_number->setPalette( pal ); - m_number->setAutoFillBackground( TRUE ); - +{ setEnabled( TRUE ); setAccessibleName( _name ); - m_number->setFixedSize( m_number->sizeHint() * 0.9 ); - setFixedSize( m_number->size() ); + m_lcdPixmap = new QPixmap( embed::getIconPixmap( "lcd_19red" ) ); + + int margin = 1; //QStyle::PM_DefaultFrameWidth; + + m_cellWidth = m_lcdPixmap->size().width() / lcdSpinBox::charsPerPixmap; + m_cellHeight = m_lcdPixmap->size().height() / 2; + + setFixedSize( m_cellWidth * (_num_digits+1) + (2*margin), + m_cellHeight + (2*margin) ); +} + +lcdSpinBox::lcdSpinBox( int _num_digits, const QString & _lcd_style, + QWidget * _parent, const QString & _name ) : + QWidget( _parent ), + autoModelView( new autoModel( 0, 0, 0, 1, NULL, TRUE ) ), + m_label(), + m_numDigits( _num_digits ), + m_origMousePos() +{ + setEnabled( TRUE ); + + setAccessibleName( _name ); + + m_lcdPixmap = new QPixmap( embed::getIconPixmap( QString( "lcd_" + + _lcd_style ).toAscii().constData() ) ); + + int margin = 1; //QStyle::PM_DefaultFrameWidth; + + m_cellWidth = m_lcdPixmap->size().width() / lcdSpinBox::charsPerPixmap; + m_cellHeight = m_lcdPixmap->size().height() / 2; + + setFixedSize( m_cellWidth * (_num_digits+1) + (2*margin), + m_cellHeight + (2*margin) ); } @@ -74,6 +97,95 @@ lcdSpinBox::~lcdSpinBox() } +void lcdSpinBox::paintEvent( QPaintEvent * _me ) +{ + QRect ur = _me->rect(); + + QPainter p( this ); + + QSize cellSize( m_cellWidth, m_cellHeight ); + + QRect cellRect( 0, 0, m_cellWidth, m_cellHeight ); + + int i; + + int margin = 1;// QStyle::PM_DefaultFrameWidth; + int lcdWidth = m_cellWidth * (m_numDigits+1) + (margin*2); + + p.translate( width() / 2 - lcdWidth / 2, 0 ); + p.save(); + + p.translate( margin, margin ); + + // Left Margin + p.drawPixmap( cellRect, *m_lcdPixmap, + QRect( QPoint( charsPerPixmap*m_cellWidth, + isEnabled()?0:m_cellHeight ), + cellSize ) ); + + p.translate( (m_cellWidth+1) / 2, 0 ); + + // Padding + for( int i=0; i < m_numDigits - m_display.length(); i++ ) + { + p.drawPixmap( cellRect, *m_lcdPixmap, + QRect( QPoint( 10 * m_cellWidth, isEnabled()?0:m_cellHeight) , cellSize ) ); + p.translate( m_cellWidth, 0 ); + } + + // Digits + for( int i=0; i < m_display.length(); i++ ) + { + int val = m_display[i].digitValue(); + if( val < 0 ) + { + if( m_display[i] == '-' ) + val = 11; + else + val = 10; + } + p.drawPixmap( cellRect, *m_lcdPixmap, + QRect( QPoint( val*m_cellWidth, + isEnabled()?0:m_cellHeight ), + cellSize ) ); + p.translate( m_cellWidth, 0 ); + } + + // Right Margin + p.drawPixmap( QRect( 0, 0, m_cellWidth / 2, m_cellHeight ), *m_lcdPixmap, + QRect( charsPerPixmap*m_cellWidth, isEnabled()?0:m_cellHeight, + m_cellWidth / 2, m_cellHeight ) ); + + + p.restore(); + + // Border + QStyleOptionFrame opt; + opt.initFrom( this ); + opt.state = QStyle::State_Sunken; + opt.rect = QRect( 0, 0, m_cellWidth * (m_numDigits+1) + (margin*2), + m_cellHeight + (margin*2) ); + + style()->drawPrimitive( QStyle::PE_Frame, &opt, &p, this ); + + p.resetTransform(); + + // Label + if( !m_label.isEmpty() ) + { + p.setFont( pointSize<6>( p.font() ) ); + p.setPen( QColor( 64, 64, 64 ) ); + p.drawText( width() / 2 - + p.fontMetrics().width( m_label ) / 2 + 1, + height() - 1, m_label ); + p.setPen( QColor( 255, 255, 255 ) ); + p.drawText( width() / 2 - + p.fontMetrics().width( m_label ) / 2, + height() - 2, m_label ); + } + +} + void lcdSpinBox::update( void ) @@ -82,12 +194,16 @@ void lcdSpinBox::update( void ) if( s == "" ) { s = QString::number( model()->value() ); - while( (int) s.length() < m_number->numDigits() ) + // TODO: if pad == true + /* + while( (int) s.length() < m_numDigits ) { s = "0" + s; } + */ } - m_number->display( s ); + m_display = s; + QWidget::update(); } @@ -96,19 +212,16 @@ void lcdSpinBox::update( void ) void lcdSpinBox::setLabel( const QString & _txt ) { - if( m_label == NULL ) - { - m_label = new QLabel( _txt, this ); - m_label->setFont( pointSize<6>( m_label->font() ) ); - m_label->setGeometry( 0, y() + height(), - QFontMetrics( m_label->font() ).width( _txt ), 7 ); - setFixedSize( tMax( width(), m_label->width() ), - height() + m_label->height() ); - } - else - { - m_label->setText( _txt ); - } + int margin = 1; + m_label = _txt; + + setFixedSize( m_cellWidth * (m_numDigits+1) + (2*margin), + m_cellHeight + (2*margin) ); + + setFixedSize( tMax( m_cellWidth*(m_numDigits+1) + (2*margin), + QFontMetrics( pointSize<6>( font() ) ).width( m_label ) ), + m_cellHeight + (2*margin) + 10 ); + update(); } @@ -116,16 +229,6 @@ void lcdSpinBox::setLabel( const QString & _txt ) void lcdSpinBox::setEnabled( bool _on ) { - QColor fg( 255, 180, 0 ); - if( _on == FALSE ) - { - fg = QColor( 160, 160, 160 ); - } - QPalette pal = m_number->palette(); - pal.setColor( QPalette::Background, QColor( 32, 32, 32 ) ); - pal.setColor( QPalette::Foreground, fg ); - m_number->setPalette( pal ); - QWidget::setEnabled( _on ); } @@ -161,7 +264,7 @@ void lcdSpinBox::contextMenuEvent( QContextMenuEvent * _me ) void lcdSpinBox::mousePressEvent( QMouseEvent * _me ) { - if( _me->button() == Qt::LeftButton && _me->y() < m_number->height() ) + if( _me->button() == Qt::LeftButton && _me->y() < m_cellHeight + 2 ) { m_origMousePos = _me->globalPos(); QApplication::setOverrideCursor( Qt::BlankCursor );