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