summaryrefslogtreecommitdiffstats
path: root/kipi-plugins/flickrexport/flickrwindow.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kipi-plugins/flickrexport/flickrwindow.cpp')
-rw-r--r--kipi-plugins/flickrexport/flickrwindow.cpp588
1 files changed, 588 insertions, 0 deletions
diff --git a/kipi-plugins/flickrexport/flickrwindow.cpp b/kipi-plugins/flickrexport/flickrwindow.cpp
new file mode 100644
index 0000000..5f6a345
--- /dev/null
+++ b/kipi-plugins/flickrexport/flickrwindow.cpp
@@ -0,0 +1,588 @@
+/* ============================================================
+ *
+ * This file is a part of kipi-plugins project
+ * http://www.kipi-plugins.org
+ *
+ * Date : 2005-17-06
+ * Description : a kipi plugin to export images to Flickr web service
+ *
+ * Copyright (C) 2005-2008 by Vardhman Jain <vardhman at gmail dot com>
+ * Copyright (C) 2008 by Gilles Caulier <caulier dot gilles at gmail dot 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 2, 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.
+ *
+ * ============================================================ */
+
+// Qt includes.
+
+#include <qpushbutton.h>
+#include <qtimer.h>
+#include <qpixmap.h>
+#include <qcursor.h>
+#include <qprogressdialog.h>
+#include <qspinbox.h>
+#include <qcheckbox.h>
+#include <qstringlist.h>
+#include <qradiobutton.h>
+
+// KDE includes.
+
+#include <klineedit.h>
+#include <khelpmenu.h>
+#include <kpopupmenu.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kapplication.h>
+#include <kiconloader.h>
+#include <khtml_part.h>
+#include <khtmlview.h>
+#include <ktabwidget.h>
+#include <krun.h>
+#include <kdebug.h>
+#include <kconfig.h>
+#include <kdeversion.h>
+#if KDE_IS_VERSION(3,2,0)
+#include <kwallet.h>
+#endif
+
+// Libkipi includes.
+
+#include <libkipi/interface.h>
+#include <libkipi/imagedialog.h>
+
+// Local includes.
+
+#include "kpaboutdata.h"
+#include "pluginsversion.h"
+#include "login.h"
+#include "imageslist.h"
+#include "flickrtalker.h"
+#include "flickritem.h"
+#include "flickrviewitem.h"
+#include "flickrwidget.h"
+#include "flickralbumdialog.h"
+#include "flickrwindow.h"
+#include "flickrwindow.moc"
+
+namespace KIPIFlickrExportPlugin
+{
+
+FlickrWindow::FlickrWindow(KIPI::Interface* interface, const QString &tmpFolder, QWidget *parent)
+ : KDialogBase(parent, 0, false, i18n("Export to Flickr Web Service"),
+ Help|User1|Close, Close, false)
+{
+ m_tmp = tmpFolder;
+ m_interface = interface;
+ m_uploadCount = 0;
+ m_uploadTotal = 0;
+// m_wallet = 0;
+ m_widget = new FlickrWidget(this, interface);
+ m_photoView = m_widget->m_photoView;
+// m_newAlbumBtn = m_widget->m_newAlbumBtn;
+ m_resizeCheckBox = m_widget->m_resizeCheckBox;
+ m_publicCheckBox = m_widget->m_publicCheckBox;
+ m_familyCheckBox = m_widget->m_familyCheckBox;
+ m_friendsCheckBox = m_widget->m_friendsCheckBox;
+ m_dimensionSpinBox = m_widget->m_dimensionSpinBox;
+ m_imageQualitySpinBox = m_widget->m_imageQualitySpinBox;
+ m_tagsLineEdit = m_widget->m_tagsLineEdit;
+ m_exportHostTagsCheckBox = m_widget->m_exportHostTagsCheckBox;
+ m_stripSpaceTagsCheckBox = m_widget->m_stripSpaceTagsCheckBox;
+ m_changeUserButton = m_widget->m_changeUserButton;
+ m_userNameDisplayLabel = m_widget->m_userNameDisplayLabel;
+ m_imglst = m_widget->m_imglst;
+
+ setButtonGuiItem(User1, KGuiItem(i18n("Start Uploading"), SmallIcon("network")));
+ setMainWidget(m_widget);
+ m_widget->setMinimumSize(600, 400);
+
+ connect(m_imglst, SIGNAL(signalImageListChanged(bool)),
+ this, SLOT(slotImageListChanged(bool)));
+
+ //m_startUploadButton->setEnabled(false);
+ //m_albumView->setRootIsDecorated(true);
+ //m_newAlbumBtn->setEnabled(false);
+
+ // --------------------------------------------------------------------------
+ // About data and help button.
+
+ m_about = new KIPIPlugins::KPAboutData(I18N_NOOP("Flickr Export"),
+ 0,
+ KAboutData::License_GPL,
+ I18N_NOOP("A Kipi plugin to export image collection to "
+ "Flickr web service."),
+ "(c) 2005-2008, Vardhman Jain\n"
+ "(c) 2008, Gilles Caulier");
+
+ m_about->addAuthor("Vardhman Jain", I18N_NOOP("Author and maintainer"),
+ "Vardhman at gmail dot com");
+
+ m_about->addAuthor("Gilles Caulier", I18N_NOOP("Developer"),
+ "caulier dot gilles at gmail dot com");
+
+ KHelpMenu* helpMenu = new KHelpMenu(this, m_about, false);
+ helpMenu->menu()->removeItemAt(0);
+ helpMenu->menu()->insertItem(i18n("Plugin Handbook"), this, SLOT(slotHelp()), 0, -1, 0);
+ actionButton(Help)->setPopup(helpMenu->menu());
+
+ // --------------------------------------------------------------------------
+
+ m_talker = new FlickrTalker(this);
+
+ connect(m_talker, SIGNAL( signalError( const QString& ) ),
+ m_talker, SLOT( slotError( const QString& ) ));
+
+ connect(m_talker, SIGNAL( signalBusy( bool ) ),
+ this, SLOT( slotBusy( bool ) ));
+
+ connect(m_talker, SIGNAL( signalAddPhotoSucceeded() ),
+ this, SLOT( slotAddPhotoSucceeded() ));
+
+ connect(m_talker, SIGNAL( signalAddPhotoFailed( const QString& ) ),
+ this, SLOT( slotAddPhotoFailed( const QString& ) ));
+
+ connect(m_talker, SIGNAL( signalListPhotoSetsSucceeded( const QValueList<FPhotoSet>& ) ),
+ this, SLOT( slotListPhotoSetsResponse( const QValueList<FPhotoSet>& ) ));
+
+ //connect( m_talker, SIGNAL( signalAlbums( const QValueList<GAlbum>& ) ),
+ // SLOT( slotAlbums( const QValueList<GAlbum>& ) ) );
+
+ //connect( m_talker, SIGNAL( signalPhotos( const QValueList<GPhoto>& ) ),
+ // SLOT( slotPhotos( const QValueList<GPhoto>& ) ) );
+
+ // --------------------------------------------------------------------------
+
+ m_progressDlg = new QProgressDialog(this, 0, true);
+ m_progressDlg->setAutoReset(true);
+ m_progressDlg->setAutoClose(true);
+
+ connect(m_progressDlg, SIGNAL( canceled() ),
+ this, SLOT( slotAddPhotoCancel() ));
+
+ connect(m_changeUserButton, SIGNAL( clicked() ),
+ this, SLOT( slotUserChangeRequest() ));
+
+ connect(m_talker, SIGNAL( signalTokenObtained(const QString&) ),
+ this, SLOT( slotTokenObtained(const QString&) ));
+
+ //connect( m_tagView, SIGNAL( selectionChanged() ),
+ // SLOT( slotTagSelected() ) );
+
+ //connect( m_photoView->browserExtension(), SIGNAL( openURLRequest( const KURL&, const KParts::URLArgs& ) ),
+ // SLOT( slotOpenPhoto( const KURL& ) ) );
+
+ //connect( m_newAlbumBtn, SIGNAL( clicked() ),
+ // SLOT( slotNewAlbum() ) );
+
+ // --------------------------------------------------------------------------
+
+ readSettings();
+
+ m_authProgressDlg = new QProgressDialog(this, 0, true);
+ m_authProgressDlg->setAutoReset(true);
+ m_authProgressDlg->setAutoClose(true);
+
+ connect(m_authProgressDlg, SIGNAL( canceled() ),
+ this, SLOT( slotAuthCancel() ));
+
+ m_talker->m_authProgressDlg = m_authProgressDlg;
+ m_widget->setEnabled(false);
+
+ kdDebug() << "Calling auth methods" << endl;
+
+ if(m_token.length()< 1)
+ m_talker->getFrob();
+ else
+ m_talker->checkToken(m_token);
+}
+
+FlickrWindow::~FlickrWindow()
+{
+#if KDE_IS_VERSION(3,2,0)
+// if (m_wallet)
+// delete m_wallet;
+#endif
+
+ delete m_progressDlg;
+ delete m_authProgressDlg;
+ delete m_talker;
+ delete m_widget;
+ delete m_about;
+}
+
+void FlickrWindow::readSettings()
+{
+ KConfig config("kipirc");
+ config.setGroup("FlickrExport Settings");
+ m_token = config.readEntry("token");
+
+ if (config.readBoolEntry("Resize", false))
+ {
+ m_resizeCheckBox->setChecked(true);
+ m_dimensionSpinBox->setEnabled(true);
+ }
+ else
+ {
+ m_resizeCheckBox->setChecked(false);
+ m_dimensionSpinBox->setEnabled(false);
+ }
+
+ m_dimensionSpinBox->setValue(config.readNumEntry("Maximum Width", 1600));
+ m_imageQualitySpinBox->setValue(config.readNumEntry("Image Quality", 85));
+ m_exportHostTagsCheckBox->setChecked(config.readBoolEntry("Export Host Tags", false));
+ m_stripSpaceTagsCheckBox->setChecked(config.readBoolEntry("Strip Space Host Tags", false));
+ m_stripSpaceTagsCheckBox->setEnabled(m_exportHostTagsCheckBox->isChecked());
+
+ if(!m_interface->hasFeature(KIPI::HostSupportsTags))
+ {
+ m_exportHostTagsCheckBox->setEnabled(false);
+ m_stripSpaceTagsCheckBox->setEnabled(false);
+ }
+
+ m_publicCheckBox->setChecked(config.readBoolEntry("Public Sharing", false));
+ m_familyCheckBox->setChecked(config.readBoolEntry("Family Sharing", false));
+ m_friendsCheckBox->setChecked(config.readBoolEntry("Friends Sharing", false));
+
+ resize(configDialogSize(config, QString("FlickrExport Dialog")));
+}
+
+void FlickrWindow::writeSettings()
+{
+ KConfig config("kipirc");
+ config.setGroup("FlickrExport Settings");
+ config.writeEntry("token", m_token);
+ config.writeEntry("Resize", m_resizeCheckBox->isChecked());
+ config.writeEntry("Maximum Width", m_dimensionSpinBox->value());
+ config.writeEntry("Image Quality", m_imageQualitySpinBox->value());
+ config.writeEntry("Export Host Tags", m_exportHostTagsCheckBox->isChecked());
+ config.writeEntry("Strip Space Host Tags", m_stripSpaceTagsCheckBox->isChecked());
+ config.writeEntry("Public Sharing", m_publicCheckBox->isChecked());
+ config.writeEntry("Family Sharing", m_familyCheckBox->isChecked());
+ config.writeEntry("Friends Sharing", m_friendsCheckBox->isChecked());
+ saveDialogSize(config, QString("FlickrExport Dialog"));
+ config.sync();
+}
+
+void FlickrWindow::slotHelp()
+{
+ KApplication::kApplication()->invokeHelp("flickrexport", "kipi-plugins");
+}
+
+void FlickrWindow::slotDoLogin()
+{
+}
+
+void FlickrWindow::slotClose()
+{
+ writeSettings();
+ done(Close);
+}
+
+void FlickrWindow::slotTokenObtained(const QString& token)
+{
+ m_token = token;
+ m_username = m_talker->getUserName();
+ m_userId = m_talker->getUserId();
+ kdDebug() << "SlotTokenObtained invoked setting user Display name to " << m_username << endl;
+ m_userNameDisplayLabel->setText(QString("<qt><b>%1</b></qt>").arg(m_username));
+ m_widget->setEnabled(true);
+}
+
+void FlickrWindow::slotBusy(bool val)
+{
+ if (val)
+ {
+ setCursor(QCursor::WaitCursor);
+// m_newAlbumBtn->setEnabled( false );
+// m_addPhotoButton->setEnabled( false );
+ }
+ else
+ {
+ setCursor(QCursor::ArrowCursor);
+// m_newAlbumBtn->setEnabled( loggedIn );
+// m_addPhotoButton->setEnabled( loggedIn && m_albumView->selectedItem() );
+ }
+}
+
+void FlickrWindow::slotError(const QString& msg)
+{
+ //m_talker->slotError(msg);
+ KMessageBox::error( this, msg );
+}
+
+void FlickrWindow::slotUserChangeRequest()
+{
+ kdDebug() << "Slot Change User Request " << endl;
+ m_talker->getFrob();
+// m_addPhotoButton->setEnabled(m_selectImagesButton->isChecked());
+}
+
+/*
+void FlickrWindow::slotAlbums( const QValueList<GAlbum>& albumList )
+{
+ m_albumDict.clear();
+ m_tagView->clear();
+ //m_photoView->begin();
+ //m_photoView->write( "<html></html>" );
+ //m_photoView->end();
+
+ KIconLoader* iconLoader = KApplication::kApplication()->iconLoader();
+ QPixmap pix = iconLoader->loadIcon( "folder", KIcon::NoGroup, 32 );
+
+ typedef QValueList<GAlbum> GAlbumList;
+ GAlbumList::const_iterator iter;
+ for ( iter = albumList.begin(); iter != albumList.end(); ++iter )
+ {
+ const GAlbum& album = *iter;
+
+ if ( album.parent_ref_num == 0 )
+ {
+ GAlbumViewItem* item = new GAlbumViewItem( m_tagView, album.name,
+ album );
+ item->setPixmap( 0, pix );
+ m_albumDict.insert( album.ref_num, item );
+ }
+ else
+ {
+ QListViewItem* parent = m_albumDict.find( album.parent_ref_num );
+ if ( parent )
+ {
+ GAlbumViewItem* item = new GAlbumViewItem( parent, album.name,
+ album);
+ item->setPixmap( 0, pix );
+ m_albumDict.insert( album.ref_num, item );
+ }
+ else
+ {
+ kdWarning() << "Failed to find parent for album "
+ << album.name
+ << "with id " << album.ref_num;
+ }
+ }
+ }
+
+
+ // find and select the last selected album
+ int lastSelectedID = 0;
+ for ( iter = albumList.begin(); iter != albumList.end(); ++iter )
+ {
+ if ((*iter).name == m_lastSelectedAlbum)
+ {
+ lastSelectedID = (*iter).ref_num;
+ break;
+ }
+ }
+
+ if (lastSelectedID > 0)
+ {
+ GAlbumViewItem* lastSelectedItem = m_albumDict.find( lastSelectedID );
+ if (lastSelectedItem)
+ {
+ m_tagView->setSelected( lastSelectedItem, true );
+ m_tagView->ensureItemVisible( lastSelectedItem );
+ }
+ }
+}
+*/
+
+void FlickrWindow::slotAuthCancel()
+{
+ m_talker->cancel();
+ m_authProgressDlg->hide();
+}
+
+/*
+void FlickrWindow::slotPhotos( const QValueList<GPhoto>& photoList)
+{
+ // TODO
+}
+
+void FlickrWindow::slotTagSelected()
+{
+ // TODO
+}
+void FlickrWindow::slotOpenPhoto( const KURL& url )
+{
+ new KRun(url);
+}
+*/
+
+void FlickrWindow::slotListPhotoSetsResponse(const QValueList <FPhotoSet>& /*photoSetList*/)
+{
+ kdDebug() << "SlotListPhotoSetsResponse invoked" << endl;
+ // TODO
+}
+
+void FlickrWindow::slotNewPhotoSet()
+{
+ // TODO
+}
+
+/** This slot is call when 'Start Uploading' button is pressed.
+*/
+void FlickrWindow::slotUser1()
+{
+ kdDebug() << "SlotUploadImages invoked" << endl;
+
+ m_widget->m_tab->setCurrentPage(FlickrWidget::FILELIST);
+ KURL::List urls = m_imglst->imageUrls();
+
+ if (urls.isEmpty())
+ return;
+
+ typedef QPair<KURL, FPhotoInfo> Pair;
+
+ m_uploadQueue.clear();
+
+ for (KURL::List::iterator it = urls.begin(); it != urls.end(); ++it)
+ {
+ KIPI::ImageInfo info = m_interface->info(*it);
+ kdDebug() << "Adding images to the list" << endl;
+ FPhotoInfo temp;
+
+ temp.title = info.title();
+ temp.description = info.description();
+ temp.is_public = m_publicCheckBox->isChecked();
+ temp.is_family = m_familyCheckBox->isChecked();
+ temp.is_friend = m_friendsCheckBox->isChecked();
+ QStringList tagsFromDialog = QStringList::split(" ", m_tagsLineEdit->text(), false);
+
+ QStringList allTags;
+ QStringList::Iterator itTags;
+
+ // Tags from the dialog
+ itTags = tagsFromDialog.begin();
+ while(itTags != tagsFromDialog.end())
+ {
+ allTags.append(*itTags);
+ ++itTags;
+ }
+
+ // Tags from the database
+ QMap <QString, QVariant> attribs = info.attributes();
+ QStringList tagsFromDatabase;
+
+ if(m_exportHostTagsCheckBox->isChecked())
+ {
+ tagsFromDatabase = attribs["tags"].asStringList();
+ if (m_stripSpaceTagsCheckBox->isChecked())
+ {
+ for (QStringList::iterator it = tagsFromDatabase.begin(); it != tagsFromDatabase.end() ; ++it)
+ *it = (*it).stripWhiteSpace().remove(" ");
+ }
+ }
+
+ itTags = tagsFromDatabase.begin();
+
+ while(itTags != tagsFromDatabase.end())
+ {
+ allTags.append(*itTags);
+ ++itTags;
+ }
+
+ itTags = allTags.begin();
+
+ while(itTags != allTags.end())
+ {
+ kdDebug() << "Tags list: " << (*itTags) << endl;
+ ++itTags;
+ }
+
+ temp.tags = allTags;
+ m_uploadQueue.append(Pair(*it, temp));
+ }
+
+ m_uploadTotal = m_uploadQueue.count();
+ m_uploadCount = 0;
+ m_progressDlg->reset();
+ slotAddPhotoNext();
+ kdDebug() << "SlotUploadImages done" << endl;
+}
+
+void FlickrWindow::slotAddPhotoNext()
+{
+ if (m_uploadQueue.isEmpty())
+ {
+ m_progressDlg->reset();
+ m_progressDlg->hide();
+ //slotAlbumSelected();
+ return;
+ }
+
+ typedef QPair<KURL, FPhotoInfo> Pair;
+ Pair pathComments = m_uploadQueue.first();
+ FPhotoInfo info = pathComments.second;
+ bool res = m_talker->addPhoto(pathComments.first.path(), //the file path
+ info,
+ m_resizeCheckBox->isChecked(),
+ m_dimensionSpinBox->value(),
+ m_imageQualitySpinBox->value());
+ if (!res)
+ {
+ slotAddPhotoFailed("");
+ return;
+ }
+
+ m_progressDlg->setLabelText(i18n("Uploading file %1").arg(pathComments.first.filename()));
+
+ if (m_progressDlg->isHidden())
+ m_progressDlg->show();
+}
+
+void FlickrWindow::slotAddPhotoSucceeded()
+{
+ // Remove photo uploaded from the list
+ m_imglst->removeItemByUrl(m_uploadQueue.first().first);
+ m_uploadQueue.pop_front();
+ m_uploadCount++;
+ m_progressDlg->setProgress(m_uploadCount, m_uploadTotal);
+ slotAddPhotoNext();
+}
+
+void FlickrWindow::slotAddPhotoFailed(const QString& msg)
+{
+ if (KMessageBox::warningContinueCancel(this,
+ i18n("Failed to upload photo into Flickr. %1\nDo you want to continue?").arg(msg))
+ != KMessageBox::Continue)
+ {
+ m_uploadQueue.clear();
+ m_progressDlg->reset();
+ m_progressDlg->hide();
+ // refresh the thumbnails
+ //slotTagSelected();
+ }
+ else
+ {
+ m_uploadQueue.pop_front();
+ m_uploadTotal--;
+ m_progressDlg->setProgress(m_uploadCount, m_uploadTotal);
+ slotAddPhotoNext();
+ }
+}
+
+void FlickrWindow::slotAddPhotoCancel()
+{
+ m_uploadQueue.clear();
+ m_progressDlg->reset();
+ m_progressDlg->hide();
+
+ m_talker->cancel();
+
+ // refresh the thumbnails
+ //slotTagSelected();
+}
+
+void FlickrWindow::slotImageListChanged(bool state)
+{
+ enableButton(User1, !state);
+}
+
+} // namespace KIPIFlickrExportPlugin