All pastes #956078 Raw Edit

Someone

public text v1 · immutable
#956078 ·published 2008-03-25 00:45 UTC
rendered paste body
/*
** Originally based on the KWorldClock program
** written by Matthias Hölzer-Klüpfel
** Copyright (C) 1998-2001 by Matthias Hölzer-Klüpfel <hoelzer@kde.org>
**
** Copyright (C) 2008 by Henry de Valence <hdevalence@gmail.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 3 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 in a file called COPYING; if not, write to
** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
** MA 02110-1301, USA.
*/

#include <QPainter>
#include <QGraphicsProxyWidget>
#include <QGraphicsLinearLayout>
#include <QGraphicsWidget>

#include <plasma/theme.h>
#include <plasma/dataengine.h>

#include <marble/MarbleWidget.h>

#include <kdebug.h>

#include "plasmamap.h"


WorldClock::WorldClock(QObject *parent, const QVariantList &args)
    : Plasma::Applet(parent, args)
{
    setDrawStandardBackground(true);
    resize(QSize(400, 200));
    m_proxy = new QGraphicsProxyWidget( );
    m_map = new MarbleWidget(  );
    m_proxy->setWidget( m_map );
    m_map->setProjection( Equirectangular );
    m_map->setGeometry( 0, 0, 400, 200 );
    m_map->show();
    m_proxy->show();
    m_layout = new QGraphicsLinearLayout();
    m_layout->addItem( m_proxy );
    m_widget = new QGraphicsWidget(this);
    m_widget->setLayout( m_layout );
    m_widget->show();
}


WorldClock::~WorldClock()
{
    delete m_proxy;
}

void WorldClock::connectToEngine()
{
    Plasma::DataEngine* timeEngine = dataEngine("time");
    timeEngine->connectSource("Local", this, 6000, Plasma::AlignToMinute);
}

void WorldClock::init()
{
}

/*

void WorldClock::setHovered( bool state )
{
    m_isHovered = state;
    update();
}

void WorldClock::hoverMoveEvent( QGraphicsSceneHoverEvent * event )
{
    if(m_lastRender.isNull()) {
        Applet::hoverMoveEvent( event );
        return;
    }
    m_isHovered = true;
    kDebug() << "hoverMoveEvent";
    m_hoverPoint = event->pos().toPoint();
    m_cityLocation = QPoint(0,0);
    QString previous = m_currentCity->name();
    m_currentCity = m_cityList->getNearestCity(m_contentsRect.width(), m_contentsRect.height(),
                                               m_lastGmtPosition, m_hoverPoint.x(),
                                               m_hoverPoint.y(), m_cityLocation);

    Applet::hoverMoveEvent( event );
    if( previous != m_currentCity->name() )
        update();
    //QTimer::singleShot( 3000, this, SLOT( setHovered( false ) ) );
}


void WorldClock::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
{
    if(m_lastRender.isNull()) {
        Applet::hoverEnterEvent(event);
        return;
    }
    m_isHovered = true;
    kDebug() << "hoverenterevent";
    m_hoverPoint = event->pos().toPoint();
    m_cityLocation = QPoint(0,0);
    QString previous = m_currentCity->name();
    m_currentCity = m_cityList->getNearestCity(m_contentsRect.width(), m_contentsRect.height(),
                                               m_lastGmtPosition, m_hoverPoint.x(),
                                               m_hoverPoint.y(), m_cityLocation);

    Applet::hoverEnterEvent(event);
    if( previous != m_currentCity->name() )
        update();
    //QTimer::singleShot( 3000, this, SLOT( setHovered( false ) ) );
}

void WorldClock::hoverLeaveEvent(QGraphicsSceneHoverEvent *event)
{
    if(m_lastRender.isNull()) {
        Applet::hoverLeaveEvent(event);
        return;
    }
    m_isHovered = false;
    kDebug() << "hoverleaveevent";
    m_hoverPoint = QPoint(0,0);
    Applet::hoverLeaveEvent(event);
    update();
}
*/

void WorldClock::dataUpdated(const QString &name, const Plasma::DataEngine::Data &data)
{
    /*
    m_time = data["Time"].toTime();
    if ( m_nextRenderTime <= m_time ) {
        m_nextRenderTime = m_time.addSecs( 10 * 60 );
        calculatePixmap();
    } */
    update();
}
/*
//much of this is based on the mapwidget code
void WorldClock::calculatePixmap()
{
    time_t local = time(NULL);
    struct tm *curtime = gmtime(&local);
    int sec = curtime->tm_hour*60*60 + curtime->tm_min*60 + curtime->tm_sec;
    int gmt_position = m_contentsRect.width() * sec / 86400;
    m_lastGmtPosition = gmt_position;

    kDebug() << "loading theme 'daynight' width=" << m_contentsRect.width()
             << " height=" << m_contentsRect.height();
    MapLoader::load(static_cast<unsigned int>(m_contentsRect.width()),
                    "daynight", static_cast<unsigned int>(m_contentsRect.height()));

    QPixmap map = darkMap();
    QPixmap clean = lightMap();

    kDebug() << "m_contentsRect = " << m_contentsRect.size();
    kDebug() << "QPixmap map = " << map.size();
    kDebug() << "QPixmap clean = " << clean.size();

    QPainter mp(&map);
    clean.setAlphaChannel(darkMask(map.width(), map.height()));
    mp.drawPixmap(0,0, clean);

    if (m_lastRender.isNull() ) {
        m_lastRender = QPixmap( m_contentsRect.size() );
    }

    QPainter p(&m_lastRender);

    int greenwich = map.width()/2;

    if (gmt_position >= greenwich) {
        p.drawPixmap(gmt_position-greenwich, 0, map);
        p.drawPixmap(0, 0, map, map.width()-gmt_position+greenwich, 0, gmt_position-greenwich, -1);
    } else {
        p.drawPixmap(0,0, map, greenwich-gmt_position, 0, map.width()+gmt_position-greenwich, -1);
        p.drawPixmap(map.width()+gmt_position-greenwich, 0, map, 0, 0, greenwich-gmt_position, -1);
    }

    kDebug() << "made new rendering at " << QTime::currentTime() ;

    return;
} */

void WorldClock::paintInterface(QPainter *p, const QStyleOptionGraphicsItem *option,
                                const QRect &contentsRect)
{
/*
    //Something like this to keep a constant shape ??
    if( ( contentsRect.width() / contentsRect.height() ) != 0.5 ) {
        if( ( contentsRect.width() / contentsRect.height() ) > 0.5 ) {
            contentsRect.setHeight( ( contentsRect.width() / 2 ) );
        } else {
            contentsRect.setWidth( ( contentsRect.height() / 2 ) );
        }
    } */ /*
    kDebug() << "updating..";
    p->setRenderHint(QPainter::SmoothPixmapTransform);
    p->setRenderHint(QPainter::Antialiasing);
    if ( m_map->size() != contentsRect.size() ) {
        m_map->setGeometry( 0, 0, contentsRect.width(), contentsRect.height() );
    } */

/*
    QTime time = QTime::currentTime();
    p->setPen(Qt::white);
    p->drawText( 0,0, "last painted at " + time.toString("hh:mm:ss.zzz") );
*/
}

//originally MapWidget::cityTime(const QString &city)
/* This needs to be replaced with something else,
 * because I think that it's not platform-independent
 * at all. I don't know what the best  way to fix the
 * problem is though.
 */ /*
QString WorldClock::cityTime(const QString &city)
{
    QString result = i18n(city.toLatin1()); // Time zone translation
    int pos = result.indexOf('/');
    if (pos >= 0)
        result = result.mid(pos+1);
    result.replace(QRegExp("_"), " ");
    result.append(": ");

    char *initial_TZ = getenv("TZ");
    setenv("TZ", city.toLatin1(), 1);
    tzset();

    time_t t = time(NULL);
    QDateTime dt;
    dt.setTime_t(t);
    result.append(QString("%1, %2").arg( KGlobal::locale()->formatTime(dt.time(), true)
                  ).arg( KGlobal::locale()->formatDate(dt.date(), KLocale::ShortDate)) );

    if (initial_TZ != 0)
        setenv("TZ", initial_TZ, 1);
    else
        unsetenv("TZ");
    tzset();
    return result;
}
*/

#include "plasmamap.moc"