From 312764b38cee8d5f6d3b5272f7724665764cc67d Mon Sep 17 00:00:00 2001 From: Cyrille Bollu Date: Sun, 21 Feb 2016 22:06:44 +0100 Subject: [PATCH] TabWidget is 20 pixels tall when it's going to display artwork tabs. --- data/themes/default/fx_active.png | Bin 230 -> 1783 bytes data/themes/default/fx_inactive.png | Bin 378 -> 1783 bytes data/themes/default/midi_active.png | Bin 235 -> 642 bytes data/themes/default/midi_inactive.png | Bin 961 -> 672 bytes data/themes/default/miscellaneous_active.png | Bin 242 -> 1783 bytes .../themes/default/miscellaneous_inactive.png | Bin 378 -> 1783 bytes include/TabWidget.h | 21 ++-- src/gui/widgets/TabWidget.cpp | 90 ++++++++++++------ src/tracks/InstrumentTrack.cpp | 16 ++-- 9 files changed, 78 insertions(+), 49 deletions(-) diff --git a/data/themes/default/fx_active.png b/data/themes/default/fx_active.png index b9cbd64854fafdf5ffe69ebdebefa1c5c0128540..80680b092f17836a58525d1488d1cd44ede1109b 100644 GIT binary patch literal 1783 zcmdT^ODlw76n+QIeF)=D&B9uivSVf%UouUMu#ihesA2Gxm1N3dia#L#K=}j8hCg7d z$Oa|X2vcs)`DWhf%sXSSbDneQeDCE;gn|K=z1}W_aA{q>UT8PLYR0;eXmUZB z$GZbQXh_n#y8>m4bqy^F;ix2-#O78lNQJhk8cye>{i))6wB#u&L^%;G;R))5PdxaIJ&!oOo^l}lY;r5;G+z{Y2EN?G{&cLBaWbZq39-zQ zj+E#vd^tUBON`}y*-!?g<~?uV(4CXg4nyWiZN$_)lm)7`gLq}+F|)JGpEjg@<$G(* z>cX5t4e51Ap{v1vO?08xWe~cL*%^~axgT-Z{C?4aoMkdoh7IZ&xKj8m_aU9cn^D3w ykniV^!>fhoD5Ov02LRWYf`2k`Bs5(<-U$B9#d#7M4p%oH&~%zV=-cTWjei0>vvlJC literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^GC<77!2~2X7rqV#Qk(@Ik;M!Q+`=Ht$S`Y;1W=H@ z#M9T6{Q;8@zp~8lErPB-!PC{xWt~$(69BEdP{jZM diff --git a/data/themes/default/fx_inactive.png b/data/themes/default/fx_inactive.png index 901f730ad3581fcd197faf4b3bab4271d0b8c081..3f8754196add49e8c9afba520d608123e36e5c80 100644 GIT binary patch literal 1783 zcmdT^OG^S#6rQQ@nTlmk5QNr6%LrPOiVmSj8a*~W$f&@w8fXy_2`z;B1JOSS`UCxg zcF`^f+SDR?QdmM|-%;;y@5O=I)q!u$Ip6ut;m)0VC!dH%T#inMq9`sc8XAH35o{Jb z_w#-ioMm=65`u>ngD2Z?_H1-wT~VCP1XVdWYzJx8wOH7CRoCL{@kEr#FHjwNcw7&z zWHRYxT?wwGXY}-3U}I5V2t>44Vr<9VhUrsUXfW01Ra2IuB6|Lll}e>Eg1qM6@C{OP z0C|DuFsuoA7x2OJ)i?kz=<6g=2|0a?vQ>xeB5?v9Vvx;Q(cphgbOH8Q5kASq zl@J4x+`i-x8|Mpg0l4OyklTSb;Ev~o7{!;W$QVWfaQDEIAU5HJMrdw;BCZ_&0cZ}b gf`4V=$jtak^-n%G&)uip{(&?tP7B9F$3xS(Z+Ig!PXGV_ literal 378 zcmV-=0fqjFP)p(4#cnqmcbg)JurDXB?wSM6`R9fKY=_t2x7=}erVAM_4qh$E? z*C(&aLwaq3_ENCRVq~73pFTZ4W8{QCg|($?q~ot1be%yEti`n*E4sd+(^b07*qoM6N<$g1X(E=>Px# diff --git a/data/themes/default/midi_active.png b/data/themes/default/midi_active.png index f7ea1e830fc9f4255684d4168644aa4c80b7b1bb..a1333d08052c81b1d61a2a7525c3eda4d8cb9d76 100644 GIT binary patch delta 623 zcmV-#0+9Xd0fGfHiBL{Q4GJ0x0000DNk~Le0000K0000K2nGNE0F8+q4FCWD24YJ` zL;(K){{a7>y{D6rAs~Mh6c7xb%n&&M000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2H zM@dakSAh-}0005%NklM`(M3`egp0^U(JuT7u7ox% z{S57dK0`rnTGc`jTC@`^NfK*SU0P<@rX(a^$a`8ePabc#7o>lI;XHTF{Qq}m&dj8o zvy_sYGe{{xg`qeh$C={nU>%(jmvjEqfa)_h(2hK;Ga5CjDez^ zn*JMzyZ-Q<4Q#7vl^kdD7<;%_L{}ArRaffESPg8A+@yc{C2F-AjXdD*GKnh@z%ZUQ z5hm=1)3AS+{$hdzN2+?Ha#X3x8P5NKFr!n&)@bAN5s7nP+gR@l!w!zeB$Tp)*I2@< zsMBE4x6Mksj|X`7r{%DZ=a??Q(_!2H-E!!)zV2W^rl+z2v1j!!rN?002ov JPDHLkV1nmi9ijjL literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^GC<77!2~2X7rqV#Qk(@Ik;M!Q+`=Ht$S`Y;1W=H@ z#M9T6{Q;8@kBl{ont?Y^sLRvEF~mY}>*RyH2NZaiGp{<{sAoEsC=wLewTQ)FsV=`r zPq77m(62<WwsH0nIFuutg)CttXCfLCGL@7bsF dOJAK%W|qw~(knb+uombl22WQ%mvv4FO#qJiO+)|y diff --git a/data/themes/default/midi_inactive.png b/data/themes/default/midi_inactive.png index 2bafb3217e976f62d6c9a696515efda79cc45aa4..94b89d7fbd31801f56926b58deb675e543e43d84 100644 GIT binary patch delta 599 zcmV-d0;v7L2cQKZiBL{Q4GJ0x0000DNk~Le0000K0000K2nGNE0F8+q4Ur);2NVx6 z3jR{Iky|H!0tiV&K~y-)rIbBuQ*ji=f9LYYNC!DDy7g-m z`~XfF>=zIUfi5eJeuN>x%r(vBu&Rnloct5fcGBsI)I=G>dW zvZLAs)`2xgHxJzOGjH3PeRhpmmeh<0k_*rR?l_e#;0e$NE(43eecvqt?|?@@!$rGh z>|05H8_Cr?56l?!0eA(x06qZ=z%72tYv8#nf5WyJbJUZ+l6=tv=75K8jSEc5MW9=1 zsUFZYM^+dsz(-&Oc;+^_3e-$YssC!etJ-(P*a~Kq&!QMZ;7TdFtVEcNrM?bq8k+zW zsebjp+H{}Q_`9@#>keQRcv(akz{pOs{JT_tOA~}SBAb%RaV0BWd1?6nM+D>J?)*B?9ox#eq%QE-|Nd!2^nY2>r3l9& lqn(pfnW%tN@m-pN;|CIDdsZ9pL9qY;002ovPDHLkV1l4f51{}6 literal 961 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xawj^(N7l!{JxM1({$v_d#0*}aI z1_o|n5N2eUHAey{$X?><>&pIsNt92GeZuCtB%qLFiEBiObAE1aYF-J0b5UwyNotBh zd1gt5g1e`0KzJjcI0FN-rl*Tzh=wSm9P`6Jj6h8&;Q#;s8bARi6hQ`te~gTbH_*fw z7=Vhw1_0?zK#U7)0%-(Fg4M!p1gSHA%gD4pLK9CJk0|Hub zjZjldA>vrcQY6=CF@kk7FkA%*k^r>P57RnDN3C;-wOTi3k@FfS_Ga&uTh7%tLdeZ$kI0PpUOE|hUDe!l zqVxHq>}gp?{p4joeq&-HbKQ6G$;_yqxfZ)U?vKS%Ub_F%-Ghf!eb`I%40bhy2Ez|G z)Msy1y^V4;YSS*xiFNT=>{=8X5%0uzu_TU*U8_w!pNc;PC^{qpRTX$Ae}na9y-Xn` zzwDx1{9nNj>hwx5Lc}UooWldTX89lH>yV)H&%EUr(KFE{SU~)WBea4POBbLZqxdcG zJA}PSMEQBagH2zQtcj0i5YLDgf+CFIM-g~D1jsi9uMW12?kR5;|HJ|NCamL5;~Vv5 zP|jX?Rr#{$#*}zEMVYsHVeRmkM#l8v@6I0@(Krh9dV56JL z&Y|7h8c)es5zHNs;|0oAFR;N*Z|skP%$=z?H?Jhxb|^86F8I1|p6w`-;{}R+R!M9j wPECtot2_{V&hW}ARMssu`MYW@Snm}%QGxoD9bTNfKk$SGUa~Lo_`=BaU#w7uqJ7|mX~D>OMl8w m@d;V`#NEgLZPq?Daq}cqwTb#07XAe~j=|H_&t;ucLK6U87glco diff --git a/data/themes/default/miscellaneous_inactive.png b/data/themes/default/miscellaneous_inactive.png index af5052159da2511756ba026c43eadb7291f113e6..e02105331cfb0e3c47722b396772069e4db5d83f 100644 GIT binary patch literal 1783 zcmds&O=wd=5XaxEHK{34q%GQlHbq3FHw7tpC^ZS`Qxb{<{J2=fKs{7NpLi5|>%mJA z1o0wX1i_=1f+ugKlpa0!fdv&xp@P^(ZR77Bb|BTfJOob;{4%pMJF~m9Z^`snsgO?f zr996|2cx;u=x))G;P>A2zBDRv=~N+yMylD_JE$GkN6+2#yv{D+dk-J&#hDC)Vm|r4 zt*86I;mniAC0xB>{%n}NHaS_j8hY6qm5X8Ja_07xa3WI(ieqQ)?%YH53qfwAJha;{ zC!STw`M2W7m8;ci9n2Yoepv8*|6N>8WL(8y9F|}WW?>*QAud4jA(#gf6+Pc7udP*( znC@5iWug{s*r1t?EBJ{d^{nQSb&IRcZmQbN%Td()U7+Nj&aWN4h9TGn^0(Y!y`U>r zWU^2}?P3$O$PuuUB(aB?uZ2y%U@UU`%jWQya1`FaCTzfu2IMo5{T-@~b@VDcfF2dJ zmHV-KK}VENJ2&Jrk-Z)C425>A-JXQ~P*0LxfLCx_14PZ&(bcz3sJF)X)JMf6((CX7 zK0tj((mM74>KLflSCC}j790f0TeuHP8aVm0hZgx=v&bOKfqExo>lsFh^)Pb6-v<7V zg8INs8g27!(e^oPaW)Lru=SqpDaw{FQsN4JCi5xSQZrE5Jh1jh=?Nb zC7?-Z2_GQ|9UV0_r{NxS90G2@8DbY8L9}Lf$&86s2=J0v_Es~0-hTZZgr+^<=-?U0 zvEw+FW$8M$Hy=uA+qPZTnP9;fvu#`96^5bj`$bV?S*F0iq^@fKFxvaaCs9Vs^L+FQ zfZ*B4CMpQ-U=65UW=81HN{0HA5pG=D*XIUTvvGLaBcQ;`8r*E=ieC`@#~(KZ diff --git a/include/TabWidget.h b/include/TabWidget.h index f7d76a437..c8a9365fc 100644 --- a/include/TabWidget.h +++ b/include/TabWidget.h @@ -29,16 +29,14 @@ #include #include -#include - class TabWidget : public QWidget { Q_OBJECT public: - TabWidget( const QString & _caption, QWidget * _parent ); + TabWidget( const QString & _caption, QWidget * _parent, bool usePixmap = false ); virtual ~TabWidget(); - void addTab( QWidget * _w, const QString & _name, const char * pixmapName, int _idx = -1 ); + void addTab( QWidget *_w, const QString &_name, const char *activePixmap = NULL, const char *inactivePixmap = NULL, int _idx = -1 ); void setActiveTab( int _idx ); @@ -58,17 +56,20 @@ protected: private: struct widgetDesc { - QWidget * w; // ptr to widget - const char *pixmapName; // artwork for the widget - QString name; // name for widget - int nwidth; // width of name when painting + QWidget * w; // ptr to widget + const char *activePixmap; // artwork for the widget + const char *inactivePixmap; // artwork for the widget + QString name; // name for widget + int nwidth; // width of name when painting (only valid for text tab) } ; typedef QMap widgetStack; widgetStack m_widgets; - int m_activeTab; + + int m_activeTab; QString m_caption; - quint8 m_tabheight; + quint8 m_tabheight; + bool m_usePixmap; // true if the tabs are to be displayed with icons. False for text tabs. } ; #endif diff --git a/src/gui/widgets/TabWidget.cpp b/src/gui/widgets/TabWidget.cpp index 9eaed1a7d..cb41f771e 100644 --- a/src/gui/widgets/TabWidget.cpp +++ b/src/gui/widgets/TabWidget.cpp @@ -33,14 +33,27 @@ #include "gui_templates.h" #include "embed.h" +const int GRAPHICAL_TAB_HEIGHT = 20; +const int TEXT_TAB_HEIGHT = 14; - -TabWidget::TabWidget( const QString & _caption, QWidget * _parent ) : +TabWidget::TabWidget( const QString & _caption, QWidget * _parent, bool usePixmap ) : QWidget( _parent ), m_activeTab( 0 ), m_caption( _caption ), m_tabheight( _caption.isEmpty() ? 11: 10 ) { + + // TabWidget with artwork tabs have a height of 20 pixels + if ( usePixmap ) + { + m_usePixmap = true; + m_tabheight = GRAPHICAL_TAB_HEIGHT; + } else + { + m_usePixmap = false; + m_tabheight = _caption.isEmpty() ? TEXT_TAB_HEIGHT - 3 : TEXT_TAB_HEIGHT - 4; + } + setFont( pointSize<8>( font() ) ); setAutoFillBackground( true ); @@ -62,7 +75,7 @@ TabWidget::~TabWidget() -void TabWidget::addTab( QWidget * _w, const QString & _name, const char * pixmapName, int _idx ) +void TabWidget::addTab( QWidget * _w, const QString & _name, const char *activePixmap, const char *inactivePixmap, int _idx ) { setFont( pointSize<8>( font() ) ); @@ -78,14 +91,21 @@ void TabWidget::addTab( QWidget * _w, const QString & _name, const char * pixma int w = fontMetrics().width( _name ) + 10; // Register new tab - widgetDesc d = { _w, pixmapName, _name, w } ; + widgetDesc d = { _w, activePixmap, inactivePixmap, _name, w } ; m_widgets[_idx] = d; - // Initialize tab's window - _w->setFixedSize( width() - 4, height() - 14 ); - _w->move( 2, 13 ); + // Position tab's window + if (m_usePixmap) { + _w->setFixedSize( width() - 4, height() - GRAPHICAL_TAB_HEIGHT ); + _w->move( 2, GRAPHICAL_TAB_HEIGHT -1 ); + } else + { + _w->setFixedSize( width() - 4, height() - TEXT_TAB_HEIGHT ); + _w->move( 2, TEXT_TAB_HEIGHT - 1 ); + } _w->hide(); + // Show tab's window if it's active if( m_widgets.contains( m_activeTab ) ) { // make sure new tab doesn't overlap current widget @@ -119,7 +139,9 @@ void TabWidget::setActiveTab( int _idx ) void TabWidget::mousePressEvent( QMouseEvent * _me ) { - if( _me->y() > 1 && _me->y() < 13 ) + int height = ( m_usePixmap ? GRAPHICAL_TAB_HEIGHT -1 : TEXT_TAB_HEIGHT -1 ); + + if( _me->y() > 1 && _me->y() < height ) { int cx = ( ( m_caption == "" ) ? 4 : 14 ) + fontMetrics().width( m_caption ); @@ -146,7 +168,12 @@ void TabWidget::resizeEvent( QResizeEvent * ) for( widgetStack::iterator it = m_widgets.begin(); it != m_widgets.end(); ++it ) { - ( *it ).w->setFixedSize( width() - 4, height() - 14 ); + if ( m_usePixmap ) { + ( *it ).w->setFixedSize( width() - 4, height() - GRAPHICAL_TAB_HEIGHT ); + } else + { + ( *it ).w->setFixedSize( width() - 4, height() - TEXT_TAB_HEIGHT ); + } } } @@ -206,19 +233,38 @@ void TabWidget::paintEvent( QPaintEvent * _pe ) // Draw all tabs widgetStack::iterator first = m_widgets.begin(); widgetStack::iterator last = m_widgets.end(); - int size = std::distance(first,last); for( widgetStack::iterator it = first ; it != last ; ++it ) { - // Draw a text tab when no artwork has been defined for the tab. - if ( (*it ).pixmapName == NULL ) + // Draw a text tab or a artwork tab. + if ( m_usePixmap ) { + // Recompute tab's width, because original size is only correct for text tabs + int size = std::distance(first,last); + ( *it ).nwidth = width() / size; + + // Get active or inactive artwork + QPixmap *artwork; + if( it.key() == m_activeTab ) + { + artwork = new QPixmap( embed::getIconPixmap( ( *it ).activePixmap ) ); + p.fillRect( tab_x_offset, 1, width() / size, GRAPHICAL_TAB_HEIGHT, cap_col ); + } else + { + artwork = new QPixmap( embed::getIconPixmap( ( *it ).inactivePixmap ) ); + } + + // Draw artwork + p.drawPixmap(tab_x_offset + ( ( *it ).nwidth - ( *artwork ).width() ) / 2, 1, *artwork ); + + } else + { // Highlight tab when active if( it.key() == m_activeTab ) { p.setPen( QColor( 32, 48, 64 ) ); - p.fillRect( tab_x_offset, 2, ( *it ).nwidth - 6, 10, cap_col ); + p.fillRect( tab_x_offset, 2, ( *it ).nwidth - 6, TEXT_TAB_HEIGHT - 4, cap_col ); } // Draw text @@ -226,24 +272,6 @@ void TabWidget::paintEvent( QPaintEvent * _pe ) // Reset text color p.setPen( cap_col ); - - - } else - { - // Get artwork - QPixmap *artwork = new QPixmap( embed::getIconPixmap( ( *it ).pixmapName ) ); - - if( it.key() == m_activeTab ) - { - p.fillRect( tab_x_offset, 1, width() / size, 12, cap_col ); - } - - // Draw artwork - p.drawPixmap(tab_x_offset + ( width() / ( size * 2 ) ) - 7, 0, *artwork ); - - // Recompute tab's width, because original size is only correct for text tabs - ( *it).nwidth = width() / size; - } // Next tab's horizontal position diff --git a/src/tracks/InstrumentTrack.cpp b/src/tracks/InstrumentTrack.cpp index eee8b98f2..2bb6d945f 100644 --- a/src/tracks/InstrumentTrack.cpp +++ b/src/tracks/InstrumentTrack.cpp @@ -1406,8 +1406,8 @@ InstrumentTrackWindow::InstrumentTrackWindow( InstrumentTrackView * _itv ) : generalSettingsLayout->addLayout( basicControlsLayout ); - m_tabWidget = new TabWidget( "", this ); - m_tabWidget->setFixedHeight( INSTRUMENT_HEIGHT + 10 ); + m_tabWidget = new TabWidget( "", this, true ); + m_tabWidget->setFixedHeight( INSTRUMENT_HEIGHT + 16 ); // create tab-widgets @@ -1434,11 +1434,11 @@ InstrumentTrackWindow::InstrumentTrackWindow( InstrumentTrackView * _itv ) : m_miscView = new InstrumentMiscView( m_track, m_tabWidget ); - m_tabWidget->addTab( m_ssView, tr( "ENV/LFO" ), "env_lfo", 1 ); - m_tabWidget->addTab( instrumentFunctions, tr( "FUNC" ), "functions", 2 ); - m_tabWidget->addTab( m_effectView, tr( "FX" ), "fx", 3 ); - m_tabWidget->addTab( m_midiView, tr( "MIDI" ), "midi_inactive", 4 ); - m_tabWidget->addTab( m_miscView, tr( "MISC" ), "miscellaneous", 5 ); + m_tabWidget->addTab( m_ssView, tr( "ENV/LFO" ), "env_lfo_active", "env_lfo_inactive", 1 ); + m_tabWidget->addTab( instrumentFunctions, tr( "FUNC" ), "functions_active", "functions_inactive", 2 ); + m_tabWidget->addTab( m_effectView, tr( "FX" ), "fx_active", "fx_inactive", 3 ); + m_tabWidget->addTab( m_midiView, tr( "MIDI" ), "midi_active", "midi_inactive", 4 ); + m_tabWidget->addTab( m_miscView, tr( "MISC" ), "miscellaneous_active", "miscellaneous_inactive", 5 ); // setup piano-widget m_pianoView = new PianoView( this ); @@ -1611,7 +1611,7 @@ void InstrumentTrackWindow::updateInstrumentView() if( m_track->m_instrument != NULL ) { m_instrumentView = m_track->m_instrument->createView( m_tabWidget ); - m_tabWidget->addTab( m_instrumentView, tr( "PLUGIN" ), "plugin", 0 ); + m_tabWidget->addTab( m_instrumentView, tr( "PLUGIN" ), "plugin_active", "plugin_inactive", 0 ); m_tabWidget->setActiveTab( 0 ); m_ssView->setFunctionsHidden( m_track->m_instrument->flags().testFlag( Instrument::IsSingleStreamed ) );