diff options
Diffstat (limited to 'src/utilities/cameragui/freespacewidget.cpp')
| -rw-r--r-- | src/utilities/cameragui/freespacewidget.cpp | 252 | 
1 files changed, 252 insertions, 0 deletions
| diff --git a/src/utilities/cameragui/freespacewidget.cpp b/src/utilities/cameragui/freespacewidget.cpp new file mode 100644 index 00000000..0d7a26b1 --- /dev/null +++ b/src/utilities/cameragui/freespacewidget.cpp @@ -0,0 +1,252 @@ +/* ============================================================ + * + * This file is a part of digiKam project + * http://www.digikam.org + * + * Date        : 2007-08-31 + * Description : a widget to display free space for a mount-point. + *  + * Copyright (C) 2007 by Gilles Caulier <caulier dot gilles at gmail dot com> + * + * 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, 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. + *  + * ============================================================ */ + +// TQt includes. + +#include <tqwhatsthis.h> +#include <tqtooltip.h> +#include <tqpainter.h> +#include <tqpixmap.h> +#include <tqpalette.h> +#include <tqcolor.h> +#include <tqtimer.h> +#include <tqfont.h>  +#include <tqfontmetrics.h>  + +// KDE includes. + +#include <kurl.h> +#include <tdelocale.h> +#include <kdiskfreesp.h> +#include <tdeio/global.h> +#include <kiconloader.h> + +// Local includes. + +#include "albumsettings.h" +#include "freespacewidget.h" +#include "freespacewidget.moc" + +namespace Digikam +{ + +class FreeSpaceWidgetPriv +{ +public: + +    FreeSpaceWidgetPriv() +    { +        timer       = 0; +        isValid     = false; +        kBSize      = 0; +        kBUsed      = 0; +        kBAvail     = 0; +        dSizeKb     = 0; +        percentUsed = 0; +    } + +    bool           isValid; +     +    int            percentUsed; + +    unsigned long  dSizeKb; +    unsigned long  kBSize; +    unsigned long  kBUsed; +    unsigned long  kBAvail; +     +    TQString        mountPoint; + +    TQTimer        *timer; +     +    TQPixmap        pix; +}; + +FreeSpaceWidget::FreeSpaceWidget(TQWidget* parent, int width) +               : TQWidget(parent, 0, WResizeNoErase|WRepaintNoErase) +{ +    d = new FreeSpaceWidgetPriv; +    setBackgroundMode(TQt::NoBackground); +    setFixedWidth(width); +    setMaximumHeight(fontMetrics().height()+4); +    slotTimeout(); +     +    d->timer = new TQTimer(this); +     +    connect(d->timer, TQ_SIGNAL(timeout()), +            this, TQ_SLOT(slotTimeout())); + +    d->timer->start(10000); +} + +FreeSpaceWidget::~FreeSpaceWidget() +{ +    d->timer->stop(); +    delete d->timer; +    delete d; +} + +void FreeSpaceWidget::setEstimatedDSizeKb(unsigned long dSize) +{ +    d->dSizeKb = dSize; +    updatePixmap(); +    repaint(); +} + +unsigned long FreeSpaceWidget::estimatedDSizeKb() +{ +    return d->dSizeKb; +} + +bool FreeSpaceWidget::isValid() +{ +    return d->isValid; +} + +int FreeSpaceWidget::percentUsed()  +{ +    return d->percentUsed; +} + +unsigned long FreeSpaceWidget::kBSize() +{ +    return d->kBSize; +} + +unsigned long FreeSpaceWidget::kBUsed() +{ +    return d->kBUsed; +} + +unsigned long FreeSpaceWidget::kBAvail() +{ +    return d->kBAvail; +} + +TQString FreeSpaceWidget::mountPoint() +{ +    return d->mountPoint; +} + +void FreeSpaceWidget::updatePixmap() +{ +    TQPixmap fimgPix = SmallIcon("folder_image"); +    d->pix          = TQPixmap(size()); +    d->pix.fill(colorGroup().background()); +     +    TQPainter p(&d->pix); +    p.setPen(colorGroup().mid()); +    p.drawRect(0, 0, d->pix.width(), d->pix.height()); +    p.drawPixmap(2, d->pix.height()/2-fimgPix.height()/2,  +                 fimgPix, 0, 0, fimgPix.width(), fimgPix.height()); +                  +    if (isValid()) +    { +        // We will compute the estimated % of space size used to download and process. +        unsigned long eUsedKb = d->dSizeKb + d->kBUsed; +        int peUsed            = (int)(100.0*((double)eUsedKb/(double)d->kBSize)); +        int pClamp            = peUsed > 100 ? 100 : peUsed; +        p.setBrush(peUsed > 95 ? TQt::red : TQt::darkGreen); +        p.setPen(TQt::white); +        TQRect gRect(fimgPix.height()+2, 1, +                    (int)(((double)d->pix.width()-2.0-fimgPix.width()-2.0)*(pClamp/100.0)), +                    d->pix.height()-2); +        p.drawRect(gRect); + +        TQRect tRect(fimgPix.height()+2, 1, d->pix.width()-2-fimgPix.width()-2, d->pix.height()-2); +        TQString text = TQString("%1%").arg(peUsed); +        p.setPen(colorGroup().text()); +        TQFontMetrics fontMt = p.fontMetrics(); +        TQRect fontRect      = fontMt.boundingRect(tRect.x(), tRect.y(), +                                                  tRect.width(), tRect.height(), 0, text); +        p.drawText(tRect, TQt::AlignCenter, text); + +        TQString tipText, value;  +        TQString header = i18n("Album Library"); +        TQString headBeg("<tr bgcolor=\"orange\"><td colspan=\"2\">" +                        "<nobr><font size=\"-1\" color=\"black\"><b>"); +        TQString headEnd("</b></font></nobr></td></tr>"); +        TQString cellBeg("<tr><td><nobr><font size=-1>"); +        TQString cellMid("</font></nobr></td><td><nobr><font size=-1>"); +        TQString cellEnd("</font></nobr></td></tr>"); +        tipText  = "<table cellspacing=0 cellpadding=0>"; +        tipText += headBeg + header + headEnd; + +        if (d->dSizeKb > 0) +        { +            tipText += cellBeg + i18n("Capacity:") + cellMid; +            tipText += TDEIO::convertSizeFromKB(d->kBSize) + cellEnd; + +            tipText += cellBeg + i18n("Available:") + cellMid; +            tipText += TDEIO::convertSizeFromKB(d->kBAvail) + cellEnd; + +            tipText += cellBeg + i18n("Require:") + cellMid; +            tipText += TDEIO::convertSizeFromKB(d->dSizeKb) + cellEnd; +        } +        else +        { +            tipText += cellBeg + i18n("Capacity:") + cellMid; +            tipText += TDEIO::convertSizeFromKB(d->kBSize) + cellEnd; + +            tipText += cellBeg + i18n("Available:") + cellMid; +            tipText += TDEIO::convertSizeFromKB(d->kBAvail) + cellEnd; +        } + +        tipText += "</table>"; + +        TQWhatsThis::add(this, tipText); +        TQToolTip::add(this, tipText); +    } +     +    p.end(); +}     + +void FreeSpaceWidget::paintEvent(TQPaintEvent*) +{ +    bitBlt(this, 0, 0, &d->pix); +} + +void FreeSpaceWidget::slotTimeout() +{ +    TQString mountPoint = TDEIO::findPathMountPoint(AlbumSettings::instance()->getAlbumLibraryPath()); +    KDiskFreeSp *job   = new KDiskFreeSp; +    connect(job, TQ_SIGNAL(foundMountPoint(const unsigned long&, const unsigned long&, +                                        const unsigned long&, const TQString&)), +            this, TQ_SLOT(slotAvailableFreeSpace(const unsigned long&, const unsigned long&, +                                              const unsigned long&, const TQString&))); +    job->readDF(mountPoint); +} + +void FreeSpaceWidget::slotAvailableFreeSpace(const unsigned long& kBSize, const unsigned long& kBUsed, +                                             const unsigned long& kBAvail, const TQString& mountPoint) +{ +    d->mountPoint  = mountPoint; +    d->kBSize      = kBSize; +    d->kBUsed      = kBUsed; +    d->kBAvail     = kBAvail; +    d->percentUsed = 100 - (int)(100.0*kBAvail/kBSize); +    d->isValid     = true; +    updatePixmap(); +    repaint(); +} + +}  // namespace Digikam | 
