bool AudioCdTrackReader::seek( qint64 pos ) { if( d->cdParanoiaLib && d->initialized ) { Msf msfPos = Msf::fromAudioBytes( pos ); const int start = d->source.toc()[d->source.cdTrackNumber()-1].firstSector().lba(); d->cdParanoiaLib->initReading( start + d->source.startOffset().lba() + msfPos.lba(), start + d->source.lastSector().lba() ); return QIODevice::seek( pos ); } else { return false; } }
void K3b::FillStatusDisplayWidget::paintEvent( QPaintEvent* ) { QPainter p( this ); const QPalette::ColorGroup colorGroup = isEnabled() ? QPalette::Normal : QPalette::Disabled; const Msf docSize = d->doc->length(); const Msf cdSize = d->cdSize; const Msf maxValue = (cdSize > docSize ? cdSize : docSize) + ( 10*60*75 ); const Msf tolerance = 60*75; QBrush fillBrush; if( docSize <= cdSize - tolerance ) { fillBrush = KColorScheme( colorGroup, KColorScheme::Selection ).background( KColorScheme::PositiveBackground ); } else if( docSize > cdSize + tolerance ) { fillBrush = KColorScheme( colorGroup, KColorScheme::Selection ).background( KColorScheme::NegativeBackground ); } else { fillBrush = KColorScheme( colorGroup, KColorScheme::Selection ).background( KColorScheme::NeutralBackground ); } const QPen normalPen = KColorScheme( colorGroup, KColorScheme::Window ).foreground( KColorScheme::NormalText ).color(); const QPen fillPen = KColorScheme( colorGroup, KColorScheme::Selection ).foreground( KColorScheme::NormalText ).color(); QStyleOptionProgressBarV2 sopb; sopb.direction = layoutDirection(); sopb.fontMetrics = fontMetrics(); sopb.palette = palette(); sopb.palette.setBrush( QPalette::Highlight, fillBrush ); sopb.rect = rect(); sopb.state = isEnabled() ? QStyle::State_Enabled : QStyle::State_None; sopb.minimum = 0; sopb.maximum = maxValue.totalFrames(); sopb.progress = docSize.totalFrames(); style()->drawControl( QStyle::CE_ProgressBar, &sopb, &p ); const QRect barRect = style()->subElementRect( QStyle::SE_ProgressBarContents, &sopb ); // so split width() in maxValue pieces double one = (double)barRect.width() / (double)maxValue.totalFrames(); QRect crect( barRect ); crect.setWidth( (int)(one*(double)docSize.totalFrames()) ); // ==================================================================================== // Now the colored bar is painted // Continue with the texts // ==================================================================================== // first we determine the text to display // ==================================================================================== QString docSizeText; if( d->showTime ) docSizeText = i18n("%1 min", d->doc->length().toString(false)); else docSizeText = KIO::convertSize( d->doc->size() ); QString overSizeText; if( d->cdSize.mode1Bytes() >= d->doc->size() ) overSizeText = i18n("Available: %1 of %2", d->showTime ? i18n("%1 min", (cdSize - d->doc->length()).toString(false) ) : KIO::convertSize( (cdSize - d->doc->length()).mode1Bytes() ), d->showTime ? i18n("%1 min", cdSize.toString(false)) : KIO::convertSize( cdSize.mode1Bytes() ) ); else overSizeText = i18n("Capacity exceeded by %1", d->showTime ? i18n("%1 min", (d->doc->length() - cdSize ).toString(false)) : KIO::convertSize( (long long)d->doc->size() - cdSize.mode1Bytes() ) ); // ==================================================================================== // calculate the medium size marker // ==================================================================================== int mediumSizeMarkerPos = barRect.left() + (int)(one*cdSize.lba()); QPoint mediumSizeMarkerFrom( mediumSizeMarkerPos, barRect.bottom() ); QPoint mediumSizeMarkerTo( mediumSizeMarkerPos, barRect.top() + barRect.height()/2 ); // ==================================================================================== // we want to draw the docSizeText centered in the filled area // if there is not enough space we just align it left // ==================================================================================== int docSizeTextPos = 0; int docSizeTextLength = fontMetrics().width(docSizeText); if( docSizeTextLength + 5 > crect.width() ) { docSizeTextPos = crect.left() + 5; // a little margin } else { docSizeTextPos = ( crect.width() - docSizeTextLength ) / 2; // make sure the text does not cross the medium size marker if( docSizeTextPos <= mediumSizeMarkerPos && mediumSizeMarkerPos <= docSizeTextPos + docSizeTextLength ) docSizeTextPos = qMax( crect.left() + 5, mediumSizeMarkerPos - docSizeTextLength - 5 ); } // ==================================================================================== // calculate the over size text // ==================================================================================== QFont overSizeFont(font()); overSizeFont.setPointSize( qMax( 8, overSizeFont.pointSize()-4 ) ); overSizeFont.setBold(false); QRect overSizeTextRect( barRect ); int overSizeTextLength = QFontMetrics(overSizeFont).width(overSizeText); if( overSizeTextLength + 5 > overSizeTextRect.width() - (int)(one*cdSize.totalFrames()) ) { // we don't have enough space on the right, so we paint to the left of the line overSizeTextRect.setLeft( (int)(one*cdSize.totalFrames()) - overSizeTextLength - 5 ); } else { overSizeTextRect.setLeft( mediumSizeMarkerPos + 5 ); } // make sure the two text do not overlap (this does not cover all cases though) if( overSizeTextRect.left() < docSizeTextPos + docSizeTextLength ) docSizeTextPos = qMax( crect.left() + 5, qMin( overSizeTextRect.left() - docSizeTextLength - 5, mediumSizeMarkerPos - docSizeTextLength - 5 ) ); QRect docTextRect( barRect ); docTextRect.setLeft( docSizeTextPos ); // Draw the fill part p.setPen( fillPen ); p.setClipRect( QStyle::visualRect( layoutDirection(), barRect, crect ) ); p.drawLine( QStyle::visualPos( layoutDirection(), barRect, mediumSizeMarkerFrom ), QStyle::visualPos( layoutDirection(), barRect, mediumSizeMarkerTo ) ); p.drawText( QStyle::visualRect( layoutDirection(), barRect, docTextRect ), QStyle::visualAlignment( layoutDirection(), Qt::AlignLeft | Qt::AlignVCenter ), docSizeText ); p.setFont(overSizeFont); p.drawText( QStyle::visualRect( layoutDirection(), barRect, overSizeTextRect ), QStyle::visualAlignment( layoutDirection(), Qt::AlignLeft | Qt::AlignVCenter ), overSizeText ); // Draw the remain part p.setPen( normalPen ); p.setClipRect( QStyle::visualRect( layoutDirection(), barRect, QRect( crect.right(), barRect.top(), barRect.width()-crect.width(), barRect.height() ) ) ); p.drawLine( QStyle::visualPos( layoutDirection(), barRect, mediumSizeMarkerFrom ), QStyle::visualPos( layoutDirection(), barRect, mediumSizeMarkerTo ) ); p.setFont( font() ); p.drawText( QStyle::visualRect( layoutDirection(), barRect, docTextRect ), QStyle::visualAlignment( layoutDirection(), Qt::AlignLeft | Qt::AlignVCenter ), docSizeText ); p.setFont(overSizeFont); p.drawText( QStyle::visualRect( layoutDirection(), barRect, overSizeTextRect ), QStyle::visualAlignment( layoutDirection(), Qt::AlignLeft | Qt::AlignVCenter ), overSizeText ); // ==================================================================================== }
bool K3b::IsOverburnAllowed( const Msf& projectSize, const Msf& capacity, const Msf& usedCapacity ) { return( k3bcore->globalSettings()->overburn() && (projectSize + usedCapacity) <= ( capacity.lba() + capacity.lba() / 4 ) ); // 25% tolerance in overburn mode }