rendered paste body#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 codevoid 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"