📄 controlwidgetbase.cpp
字号:
void ControlWidgetBase::setFullscreen( bool b ){ setToggleButton( FullscreenButton, b );}void ControlWidgetBase::setSeekable( bool b ){ slider.setEnabled( b );}void ControlWidgetBase::setToggleButton( MediaButtonType butType, bool down ){ for ( int i = 0; i < buttonCount; i++ ) if ( buttons[i].buttonType == butType ) if ( down != buttons[i].isDown ) toggleButton( i );}void ControlWidgetBase::toggleButton( int i ){ buttons[i].isDown = !buttons[i].isDown; QPainter p( this ); paintButton( p, i );}void ControlWidgetBase::getButtonPix( bool down ){ if ( !buttonPixCreated[down] ) { // QImage tmpImg = fastScale( tmpButtonImg[down], actualScaleW, actualScaleH ); QImage tmpImg = tmpButtonImg[down].smoothScale( actualScaleW, actualScaleH ); if (!tmpImg.isNull()) { QPoint pt( xoff, yoff ); buttonPix[down].resize( actualScaleW, actualScaleH ); QPainter p; p.begin( &buttonPix[down] ); p.drawTiledPixmap( buttonPix[down].rect(), bgPix, pt ); p.drawImage( 0, 0, tmpImg ); p.end(); buttonPixCreated[down] = TRUE; //qDebug("scaled %s buttons", skinType.latin1() ); } }}void ControlWidgetBase::getButtonMask( int button ){ if ( imgButtonMask.isNull() ) return; if ( !buttonMaskCreated[button] && tmpButtonMaskLoaded[button] ) { buttonMaskCreated[button] = TRUE; if ( buttons[button].hasImage ) { getButtonPix( TRUE ); //qDebug( "creating %s %s file", skinType.latin1(), buttons[button].skinImage ); int w = actualScaleW; int h = actualScaleH; int iw = tmpButtonMask[button].width(); int ih = tmpButtonMask[button].height(); int dx = iw * 65535 / w; int dy = ih * 65535 / h; uchar **src = tmpButtonMask[button].jumpTable(); uchar **dest = imgButtonMask.jumpTable(); uchar bits[(((w+8)*(h+1))/8)+32]; // over allocate just to be safe uchar *dst = bits - 1; for ( int j = 0, y = 0; j < h; j++, y+=dy ) { uchar *srcLine = src[y>>16]; uchar *line = dest[j]; for ( int i = 0, x = 0, bit = 8; i < w; i++, x+=dx, bit++ ) { int srcBit = 7 - ((x>>16) % 8); int srcOfs = (x>>16) / 8; uint pixel = srcLine[ srcOfs ] & (1 << srcBit); if ( bit == 8 ) { bit = 0; *(++dst) = 0; } if ( pixel ) { line[i] = button + 1; *dst |= 1 << bit; } } } buttonMask[button] = QBitmap( w, h, bits, TRUE ); } }}void ControlWidgetBase::paintButton( QPainter& p, int i ){ if ( !canPaint || !imagesLoaded || !imagesScaled || !buttons[i].hasImage ) return; getButtonMask( i ); bool down = buttons[i].isDown; buttonPix[down].setMask( buttonMask[i] ); p.drawPixmap( xoff, yoff, buttonPix[down] );}void ControlWidgetBase::paintAllButtons( QPainter& p ){ // Get something there quick, effectively paints all buttons up buttonPix[0].setMask( QBitmap() ); p.drawPixmap( xoff, yoff, buttonPix[0] ); canPaint = TRUE; // Paint any down buttons for ( int i = 0; i < buttonCount; i++ ) { getButtonMask( i ); if ( buttons[i].isDown ) paintButton( p, i ); }}void ControlWidgetBase::sliderPressed(){ sliderBeingMoved = TRUE;}void ControlWidgetBase::sliderReleased(){ if ( sliderBeingMoved ) { sliderBeingMoved = FALSE; if ( slider.width() == 0 ) return; mediaPlayerState->startTemporaryMute(); // Use double precision to avoid integer overflows which can happen easily otherwise long val = long((double)slider.value() * mediaPlayerState->length() / slider.width()); mediaPlayerState->setPosition( val ); mediaPlayerState->stopTemporaryMute( 1000 ); }}void ControlWidgetBase::setPosition( long ){ virtualUpdateSlider();}void ControlWidgetBase::setLength( long ){ virtualUpdateSlider();}QString ControlWidgetBase::toTimeString( long length ){ int minutes = length / 60; int seconds = length % 60; return QString("%1:%2%3").arg( minutes ).arg( seconds / 10 ).arg( seconds % 10 );}QString ControlWidgetBase::timeAsString( long length ){ if ( mediaPlayerState->decoder() ) { if ( mediaPlayerState->decoder()->videoStreams() > 0 ) { double frameRate = mediaPlayerState->decoder()->videoFrameRate( 0 ); if ( frameRate == 0.0 ) frameRate = 1.0; length = long((double)length / frameRate); } else { int freq = mediaPlayerState->decoder()->audioFrequency( 0 ); if ( freq ) length /= freq; } } return toTimeString( length );} void ControlWidgetBase::updateSlider(){ int i = mediaPlayerState->position(); int max = mediaPlayerState->length(); QString currentTime; QString totalTime; // Work out currentTime and totalTime strings if ( mediaPlayerState->decoderVersion() == Decoder_1_6 ) { MediaPlayerDecoder_1_6 *decoder = (MediaPlayerDecoder_1_6 *)mediaPlayerState->decoder(); if ( decoder->currentTimeAvailable() ) currentTime = toTimeString( decoder->currentTime() / 1000 ); else currentTime = "?:??"; if ( decoder->totalTimeAvailable() ) totalTime = " / " + toTimeString( decoder->totalTime() / 1000 ); } else { currentTime = timeAsString( i ); if ( max > 1 ) totalTime = " / " + timeAsString( max ); } time.setText( currentTime + totalTime ); if ( max == 0 ) return; // Will flicker too much if we don't do this. // Scale position to the pixel along the slider. int width = slider.width(); int val = int((double)i * width / max); if ( !sliderBeingMoved ) { if ( slider.value() != val ) slider.setValue( val ); if ( slider.maxValue() != width ) slider.setMaxValue( width ); }}void ControlWidgetBase::stopPlaying(){ mediaPlayerState->setPlaying( FALSE ); setPosition( 0 ); slider.setValue( 0 );}void ControlWidgetBase::mouseMoveEvent( QMouseEvent *event ){ for ( int i = 0; i < buttonCount; i++ ) { if ( buttons[i].hasImage ) { if ( event->state() == QMouseEvent::LeftButton ) { // The test to see if the mouse click is inside the button or not int x = event->pos().x() - xoff; int y = event->pos().y() - yoff; bool isOnButton = ( x > 0 && y > 0 && x < imgButtonMask.width() && y < imgButtonMask.height() && imgButtonMask.pixelIndex( x, y ) == i + 1 ); if ( isOnButton && !buttons[i].isHeld ) { buttons[i].isHeld = TRUE; toggleButton(i); switch ( buttons[i].buttonType ) { case VolumeUpButton: emit moreClicked(); return; case VolumeDownButton: emit lessClicked(); return; case ForwardButton: emit forwardClicked(); return; case BackwardButton: emit backwardClicked(); return; default: break; } } else if ( !isOnButton && buttons[i].isHeld ) { buttons[i].isHeld = FALSE; toggleButton(i); switch ( buttons[i].buttonType ) { case VolumeUpButton: emit moreReleased(); return; case VolumeDownButton: emit lessReleased(); return; case ForwardButton: emit forwardReleased(); return; case BackwardButton: emit backwardReleased(); return; default: break; } } } else { if ( buttons[i].isHeld ) { buttons[i].isHeld = FALSE; if ( !buttons[i].isToggle && buttons[i].isDown ) toggleButton( i ); switch ( buttons[i].buttonType ) { case PlayButton: if ( mediaPlayerState->playing() ) mediaPlayerState->setPaused( !buttons[i].isDown ); else mediaPlayerState->setPlaying( TRUE ); return; case StopButton: stopPlaying(); return; case PauseButton: mediaPlayerState->setPaused( buttons[i].isDown ); return; case NextButton: mediaPlayerState->setNext(); return; case PreviousButton: mediaPlayerState->setPrev(); return; case LoopButton: mediaPlayerState->setLooping( buttons[i].isDown ); return; case VolumeUpButton: emit moreReleased(); return; case VolumeDownButton: emit lessReleased(); return; case ForwardButton: emit forwardReleased(); return; case BackwardButton: emit backwardReleased(); return; case PlayListButton: mediaPlayerState->setList(); return; //case FullscreenButton: mediaPlayerState->setFullscreen( TRUE ); makeVisible(); return; default: break; } } } } }}void ControlWidgetBase::mousePressEvent( QMouseEvent *event ){ mouseMoveEvent( event );}void ControlWidgetBase::mouseReleaseEvent( QMouseEvent *event ){ mouseMoveEvent( event );}void ControlWidgetBase::closeEvent( QCloseEvent* ){ mediaPlayerState->closeView();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -