mirror of
https://bitbucket.org/smil3y/kde-playground.git
synced 2025-02-23 18:32:51 +00:00
142 lines
4.7 KiB
C++
142 lines
4.7 KiB
C++
/*
|
|
Copyright (C) 2010 Klarälvdalens Datakonsult AB,
|
|
a KDAB Group company, info@kdab.net,
|
|
author Stephen Kelly <stephen@kdab.com>
|
|
|
|
This library is free software; you can redistribute it and/or modify it
|
|
under the terms of the GNU Library General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or (at your
|
|
option) any later version.
|
|
|
|
This library 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 Library General Public
|
|
License for more details.
|
|
|
|
You should have received a copy of the GNU Library General Public License
|
|
along with this library; see the file COPYING.LIB. If not, write to the
|
|
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
02110-1301, USA.
|
|
*/
|
|
|
|
#include "notecreatorandselector.h"
|
|
|
|
#include <KLocale>
|
|
|
|
#include <KMime/Message>
|
|
|
|
#include <akonadi/item.h>
|
|
#include <akonadi/entitydisplayattribute.h>
|
|
#include <akonadi/itemcreatejob.h>
|
|
|
|
#include "note.h"
|
|
#include <Akonadi/EntityTreeModel>
|
|
|
|
using namespace Akonadi;
|
|
|
|
using namespace Akonotes;
|
|
|
|
NoteCreatorAndSelector::NoteCreatorAndSelector(QItemSelectionModel* primaryModel, QItemSelectionModel* secondaryModel, QObject* parent)
|
|
: QObject(parent),
|
|
m_primarySelectionModel(primaryModel),
|
|
m_secondarySelectionModel(secondaryModel == 0 ? primaryModel : secondaryModel),
|
|
m_containerCollectionId(-1),
|
|
m_newNoteId(-1),
|
|
m_giveupTimer(new QTimer(this))
|
|
{
|
|
// If the note doesn't exist after 5 seconds, give up waiting for it.
|
|
m_giveupTimer->setInterval(5000);
|
|
connect(m_giveupTimer, SIGNAL(timeout()), SLOT(deleteLater()));
|
|
}
|
|
|
|
NoteCreatorAndSelector::~NoteCreatorAndSelector()
|
|
{
|
|
}
|
|
|
|
|
|
void NoteCreatorAndSelector::createNote(const Akonadi::Collection& containerCollection)
|
|
{
|
|
m_containerCollectionId = containerCollection.id();
|
|
|
|
if (m_primarySelectionModel == m_secondarySelectionModel)
|
|
doCreateNote();
|
|
else
|
|
{
|
|
m_giveupTimer->start();
|
|
connect(m_primarySelectionModel->model(), SIGNAL(rowsInserted(QModelIndex,int,int)), SLOT(trySelectCollection()));
|
|
trySelectCollection();
|
|
}
|
|
}
|
|
|
|
void NoteCreatorAndSelector::trySelectCollection()
|
|
{
|
|
QModelIndex idx = EntityTreeModel::modelIndexForCollection(m_primarySelectionModel->model(), Collection(m_containerCollectionId));
|
|
if (!idx.isValid())
|
|
return;
|
|
|
|
m_giveupTimer->stop();
|
|
m_primarySelectionModel->select(QItemSelection(idx, idx), QItemSelectionModel::Select);
|
|
disconnect(m_primarySelectionModel->model(), SIGNAL(rowsInserted(QModelIndex,int,int)), this, SLOT(trySelectCollection()));
|
|
doCreateNote();
|
|
}
|
|
|
|
void NoteCreatorAndSelector::doCreateNote()
|
|
{
|
|
Item newItem;
|
|
newItem.setMimeType( Note::mimeType() );
|
|
|
|
KMime::Message::Ptr newPage = KMime::Message::Ptr( new KMime::Message() );
|
|
|
|
QString title = i18nc( "The default name for new pages.", "New Page" );
|
|
QByteArray encoding( "utf-8" );
|
|
|
|
newPage->subject( true )->fromUnicodeString( title, encoding );
|
|
newPage->contentType( true )->setMimeType( "text/plain" );
|
|
newPage->contentType()->setCharset("utf-8");
|
|
newPage->contentTransferEncoding(true)->setEncoding(KMime::Headers::CEquPr);
|
|
newPage->date( true )->setDateTime( KDateTime::currentLocalDateTime() );
|
|
newPage->from( true )->fromUnicodeString( QString::fromLatin1( "Kjots@kde4" ), encoding );
|
|
// Need a non-empty body part so that the serializer regards this as a valid message.
|
|
newPage->mainBodyPart()->fromUnicodeString( QString::fromLatin1( " " ) );
|
|
|
|
newPage->assemble();
|
|
|
|
newItem.setPayload( newPage );
|
|
|
|
Akonadi::EntityDisplayAttribute *eda = new Akonadi::EntityDisplayAttribute();
|
|
eda->setIconName( QString::fromLatin1( "text-plain" ) );
|
|
newItem.addAttribute(eda);
|
|
|
|
Akonadi::ItemCreateJob *job = new Akonadi::ItemCreateJob( newItem, Collection(m_containerCollectionId), this );
|
|
connect( job, SIGNAL(result(KJob*)), SLOT(noteCreationFinished(KJob*)) );
|
|
|
|
}
|
|
|
|
void NoteCreatorAndSelector::noteCreationFinished(KJob* job)
|
|
{
|
|
if (job->error())
|
|
{
|
|
kWarning() << job->errorString();
|
|
return;
|
|
}
|
|
Akonadi::ItemCreateJob *createJob = qobject_cast<Akonadi::ItemCreateJob*>(job);
|
|
Q_ASSERT(createJob);
|
|
|
|
Item newItem = createJob->item();
|
|
m_newNoteId = newItem.id();
|
|
|
|
m_giveupTimer->start();
|
|
connect(m_primarySelectionModel->model(), SIGNAL(rowsInserted(QModelIndex,int,int)), SLOT(trySelectNote()));
|
|
trySelectNote();
|
|
}
|
|
|
|
void NoteCreatorAndSelector::trySelectNote()
|
|
{
|
|
QModelIndexList list = EntityTreeModel::modelIndexesForItem(m_secondarySelectionModel->model(), Item(m_newNoteId));
|
|
if (list.isEmpty())
|
|
return;
|
|
|
|
const QModelIndex idx = list.first();
|
|
m_secondarySelectionModel->select(QItemSelection(idx, idx), QItemSelectionModel::ClearAndSelect);
|
|
}
|
|
|