File indexing completed on 2024-05-05 03:50:56

0001 // SPDX-License-Identifier: LGPL-2.1-or-later
0002 //
0003 // SPDX-FileCopyrightText: 2009 Bastian Holst <bastianholst@gmx.de>
0004 //
0005 
0006 // Self
0007 #include "WikipediaItem.h"
0008 
0009 // Qt
0010 #include <QAction>
0011 #include <QPainter>
0012 
0013 // Marble
0014 #include "MarbleDebug.h"
0015 #include "ViewportParams.h"
0016 #include "TinyWebBrowser.h"
0017 #include "MarbleWidget.h"
0018 #include "MarbleModel.h"
0019 #include "RenderPlugin.h"
0020 #include "PluginManager.h"
0021 #include "layers/PopupLayer.h"
0022 
0023 using namespace Marble;
0024 /* TRANSLATOR Marble::WikipediaItem */
0025 
0026 // The Wikipedia icon is not a square
0027 const QRect wikiIconRect( 0, 0, 22, 19 );
0028 const QSize miniWikiIconSize( 22, 19 );
0029 const int miniWikiIconBorder = 3;
0030 
0031 WikipediaItem::WikipediaItem( MarbleWidget* widget, QObject *parent )
0032     : AbstractDataPluginItem( parent ),
0033       m_marbleWidget( widget ),
0034       m_rank( 0.0 ),
0035       m_browser( nullptr ),
0036       m_wikiIcon(),
0037       m_showThumbnail( false )
0038 {
0039     m_action = new QAction( this );
0040     connect( m_action, SIGNAL(triggered()), this, SLOT(openBrowser()) );
0041     setCacheMode( ItemCoordinateCache );
0042 }
0043 
0044 WikipediaItem::~WikipediaItem()
0045 {
0046     delete m_browser;
0047 }
0048 
0049 QString WikipediaItem::name() const
0050 {
0051     return id();
0052 }
0053 
0054 void WikipediaItem::setName( const QString& name )
0055 {
0056     setId( name );
0057     updateToolTip();
0058 }
0059 
0060 bool WikipediaItem::initialized() const
0061 {
0062     return true;
0063 }
0064     
0065 void WikipediaItem::addDownloadedFile( const QString& url, const QString& type )
0066 {
0067     if (type == QLatin1String("thumbnail")) {
0068         m_thumbnail.load( url );
0069         updateSize();
0070         emit updated();
0071     }
0072 }
0073 
0074 bool WikipediaItem::operator<( const AbstractDataPluginItem *other ) const
0075 {
0076     WikipediaItem const * otherItem = dynamic_cast<WikipediaItem const *>( other );
0077     return otherItem ? m_rank > otherItem->m_rank : id() < other->id();
0078 }
0079    
0080 void WikipediaItem::paint( QPainter *painter )
0081 {
0082     if ( !showThumbnail() ) {
0083         m_wikiIcon.paint( painter, wikiIconRect );
0084     }
0085     else {
0086         painter->drawPixmap( 0, 0, m_thumbnail );
0087         QSize minSize = miniWikiIconSize;
0088         minSize *= 2;
0089         QSize thumbnailSize = m_thumbnail.size();
0090 
0091         if ( thumbnailSize.width() >= minSize.width()
0092              && thumbnailSize.height() >= minSize.height() )
0093         {
0094             QRect wikiRect( QPoint( 0, 0 ), miniWikiIconSize );
0095             wikiRect.moveBottomRight( QPoint( m_thumbnail.width() - miniWikiIconBorder,
0096                                               m_thumbnail.height() - miniWikiIconBorder ) );
0097             m_wikiIcon.paint( painter, wikiRect );
0098         }
0099     }
0100 }
0101 
0102 qreal WikipediaItem::longitude() const
0103 {
0104     return coordinate().longitude();
0105 }
0106     
0107 void WikipediaItem::setLongitude( qreal longitude )
0108 {
0109     GeoDataCoordinates updatedCoordinates = coordinate();
0110     updatedCoordinates.setLongitude( longitude );
0111     setCoordinate( updatedCoordinates );
0112 }
0113     
0114 qreal WikipediaItem::latitude() const
0115 {
0116     return coordinate().latitude();
0117 }
0118 
0119 void WikipediaItem::setLatitude( qreal latitude )
0120 {
0121     GeoDataCoordinates updatedCoordinates = coordinate();
0122     updatedCoordinates.setLatitude( latitude );
0123     setCoordinate( updatedCoordinates );
0124 }
0125 
0126 QUrl WikipediaItem::url() const
0127 {
0128     return m_url;
0129 }
0130 
0131 void WikipediaItem::setUrl( const QUrl& url )
0132 {
0133     m_url = url;
0134 }
0135 
0136 QUrl WikipediaItem::thumbnailImageUrl() const
0137 {
0138     return m_thumbnailImageUrl;
0139 }
0140 
0141 void WikipediaItem::setThumbnailImageUrl( const QUrl& thumbnailImageUrl )
0142 {
0143     m_thumbnailImageUrl = thumbnailImageUrl;
0144 }
0145 
0146 QString WikipediaItem::summary() const
0147 {
0148     return m_summary;
0149 }
0150 
0151 void WikipediaItem::setSummary( const QString& summary )
0152 {
0153     m_summary = summary;
0154     updateToolTip();
0155 }
0156 
0157 QAction *WikipediaItem::action()
0158 {
0159     m_action->setText( id() );
0160     return m_action;
0161 }
0162 
0163 void WikipediaItem::openBrowser( )
0164 {
0165     if ( m_marbleWidget ) {
0166         PopupLayer* popup = m_marbleWidget->popupLayer();
0167         popup->setCoordinates( coordinate(), Qt::AlignRight | Qt::AlignVCenter );
0168         popup->setSize(QSizeF(520, 570));
0169         popup->setUrl( url() );
0170         popup->popup();
0171     } else {
0172         if ( !m_browser ) {
0173             m_browser = new TinyWebBrowser();
0174         }
0175         m_browser->load( url() );
0176         m_browser->show();
0177     }
0178 }
0179     
0180 void WikipediaItem::setIcon( const QIcon& icon )
0181 {
0182     m_action->setIcon( icon );
0183     m_wikiIcon = icon;
0184 
0185     updateSize();
0186 }
0187 
0188 void WikipediaItem::setSettings( const QHash<QString, QVariant>& settings )
0189 {
0190     const bool showThumbnail = settings.value(QStringLiteral("showThumbnails"), false).toBool();
0191 
0192     if ( showThumbnail != m_showThumbnail ) {
0193         m_showThumbnail = showThumbnail;
0194         updateSize();
0195         updateToolTip();
0196         update();
0197     }
0198 }
0199 
0200 void WikipediaItem::setRank( double rank )
0201 {
0202     m_rank = rank;
0203 }
0204 
0205 double WikipediaItem::rank() const
0206 {
0207     return m_rank;
0208 }
0209 
0210 void WikipediaItem::updateSize()
0211 {
0212     if ( showThumbnail() ) {
0213         setSize( m_thumbnail.size() );
0214     }
0215     else {
0216         setSize( wikiIconRect.size() );
0217     }
0218 }
0219 
0220 void WikipediaItem::updateToolTip()
0221 {
0222     QString toolTip = QLatin1String(
0223         "<html><head><meta name=\"qrichtext\" content=\"1\" />"
0224         "<style type=\"text/css\">\\np, li { white-space: pre-wrap; }\\n</style></head>"
0225         "<body style=\" font-family:'Sans Serif'; font-size:9pt; font-weight:400; "
0226         "font-style:normal;\"><p style=\" margin-top:0px; margin-bottom:0px; "
0227         "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">");
0228     if ( summary().isEmpty() ) {
0229         toolTip += name() + QLatin1String("</p></body></html>\n");
0230         setToolTip(toolTip);
0231     }
0232     else {
0233         toolTip += tr("<b>%1</b><br>%2", "Title:\nSummary") + QLatin1String("</p></body></html>\n");
0234         setToolTip( toolTip.arg( name() ).arg( summary() ) );
0235     }
0236 }
0237 
0238 bool WikipediaItem::showThumbnail() const
0239 {
0240     return m_showThumbnail && !m_thumbnail.isNull();
0241 }
0242 
0243 #include "moc_WikipediaItem.cpp"