1 // SPDX-License-Identifier: LGPL-2.1-or-later
2 //
3 // SPDX-FileCopyrightText: 2009 Bastian Holst <bastianholst@gmx.de>
4 // SPDX-FileCopyrightText: 2012 Mohammed Nafees <nafees.technocool@gmail.com>
5 //
6 
7 
8 // Self
9 #include "PhotoPluginItem.h"
10 
11 // Plugin
12 #include "CoordinatesParser.h"
13 #include "PhotoPluginModel.h"
14 
15 // Marble
16 #include "GeoDataCoordinates.h"
17 #include "GeoPainter.h"
18 #include "MarbleGraphicsGridLayout.h"
19 #include "TinyWebBrowser.h"
20 #include "ViewportParams.h"
21 #include "MarbleDebug.h"
22 #include "MarbleWidget.h"
23 #include "MarbleModel.h"
24 #include "RenderPlugin.h"
25 #include "PluginManager.h"
26 #include "layers/PopupLayer.h"
27 
28 // Qt
29 #include <QAction>
30 #include <QIcon>
31 #include <QFile>
32 #include <QHash>
33 #include <QUrl>
34 #include <QPixmap>
35 
36 using namespace Marble;
37 
PhotoPluginItem(MarbleWidget * widget,QObject * parent)38 PhotoPluginItem::PhotoPluginItem( MarbleWidget *widget, QObject *parent )
39     : AbstractDataPluginItem( parent ),
40       m_marbleWidget( widget ),
41       m_image( this ),
42       m_browser( nullptr )
43 {
44     m_action = new QAction( this );
45     connect( m_action, SIGNAL(triggered()), this, SLOT(openBrowser()) );
46     setCacheMode( ItemCoordinateCache );
47 
48     m_image.setFrame( FrameGraphicsItem::ShadowFrame );
49     m_image.setBorderBrush( QBrush( QColor( Qt::white ) ) );
50     m_image.setBorderWidth( 2.0 );
51     m_image.setMargin( 5 );
52     MarbleGraphicsGridLayout *layout = new MarbleGraphicsGridLayout( 1, 1 );
53     layout->addItem( &m_image, 0, 0 );
54     setLayout( layout );
55 }
56 
~PhotoPluginItem()57 PhotoPluginItem::~PhotoPluginItem()
58 {
59     delete m_browser;
60 }
61 
name() const62 QString PhotoPluginItem::name() const
63 {
64     return title();
65 }
66 
initialized() const67 bool PhotoPluginItem::initialized() const
68 {
69     return !m_smallImage.isNull() && coordinate().isValid();
70 }
71 
addDownloadedFile(const QString & url,const QString & type)72 void PhotoPluginItem::addDownloadedFile( const QString& url, const QString& type )
73 {
74     if (type == QLatin1String("thumbnail")) {
75         m_smallImage.load( url );
76         m_image.setImage( m_smallImage.scaled( QSize( 50, 50 ) ) );
77     }
78     else if (type == QLatin1String("info")) {
79         QFile file( url );
80         if( !file.open( QIODevice::ReadOnly | QIODevice::Text ) ) {
81             return;
82         }
83 
84         GeoDataCoordinates coordinates;
85         CoordinatesParser parser( &coordinates );
86 
87         if( parser.read( &file ) ) {
88             setCoordinate( coordinates );
89         }
90     }
91 
92     if ( initialized() ) {
93         emit updated();
94     }
95 }
96 
operator <(const AbstractDataPluginItem * other) const97 bool PhotoPluginItem::operator<( const AbstractDataPluginItem *other ) const
98 {
99     return this->id() < other->id();
100 }
101 
photoUrl() const102 QUrl PhotoPluginItem::photoUrl() const
103 {
104     QString url = "https://farm%1.static.flickr.com/%2/%3_%4_s.jpg";
105 
106     return QUrl( url.arg( farm() ).arg( server() ).arg( id() ).arg( secret() ) );
107 }
108 
infoUrl() const109 QUrl PhotoPluginItem::infoUrl() const
110 {
111     QHash<QString,QString> options;
112 
113     options.insert( "photo_id", id() );
114 
115     return PhotoPluginModel::generateUrl( "flickr", "flickr.photos.geo.getLocation", options );
116 }
117 
server() const118 QString PhotoPluginItem::server() const
119 {
120     return m_server;
121 }
122 
setServer(const QString & server)123 void PhotoPluginItem::setServer( const QString& server )
124 {
125     m_server = server;
126 }
127 
farm() const128 QString PhotoPluginItem::farm() const
129 {
130     return m_farm;
131 }
132 
setFarm(const QString & farm)133 void PhotoPluginItem::setFarm( const QString& farm )
134 {
135     m_farm = farm;
136 }
137 
secret() const138 QString PhotoPluginItem::secret() const
139 {
140     return m_secret;
141 }
142 
setSecret(const QString & secret)143 void PhotoPluginItem::setSecret( const QString& secret )
144 {
145     m_secret = secret;
146 }
147 
owner() const148 QString PhotoPluginItem::owner() const
149 {
150     return m_owner;
151 }
152 
setOwner(const QString & owner)153 void PhotoPluginItem::setOwner( const QString& owner )
154 {
155     m_owner = owner;
156 }
157 
title() const158 QString PhotoPluginItem::title() const
159 {
160     return m_title;
161 }
162 
setTitle(const QString & title)163 void PhotoPluginItem::setTitle( const QString& title )
164 {
165     m_title = title;
166     m_action->setText( title );
167 }
168 
action()169 QAction *PhotoPluginItem::action()
170 {
171     if( m_action->icon().isNull() ) {
172         m_action->setIcon( QIcon( QPixmap::fromImage( m_smallImage ) ) );
173     }
174     return m_action;
175 }
176 
openBrowser()177 void PhotoPluginItem::openBrowser()
178 {
179     if ( m_marbleWidget ) {
180         PopupLayer* popup = m_marbleWidget->popupLayer();
181         popup->setCoordinates( coordinate(), Qt::AlignRight | Qt::AlignVCenter );
182         popup->setSize(QSizeF(720, 470));
183         popup->setUrl(QUrl(QLatin1String("http://m.flickr.com/photos/") + owner() + QLatin1Char('/') + id() + QLatin1Char('/')));
184         popup->popup();
185     } else {
186         if( !m_browser ) {
187             m_browser = new TinyWebBrowser();
188         }
189 
190         QString url = "http://www.flickr.com/photos/%1/%2/";
191         m_browser->load( QUrl( url.arg( owner() ).arg( id() ) ) );
192         m_browser->show();
193     }
194 }
195 
196 #include "moc_PhotoPluginItem.cpp"
197