mirror of
https://bitbucket.org/smil3y/kde-extraapps.git
synced 2025-02-23 18:32:53 +00:00
231 lines
5.5 KiB
C++
231 lines
5.5 KiB
C++
/* Copyright 2008 Rolf Eike Beer <kde@opensource.sf-tec.de>
|
|
*
|
|
* 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 of
|
|
* the License or (at your option) version 3 or any later version
|
|
* accepted by the membership of KDE e.V. (or its successor approved
|
|
* by the membership of KDE e.V.), which shall act as a proxy
|
|
* defined in Section 14 of version 3 of the license.
|
|
*
|
|
* 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.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
#include "keytreeview.h"
|
|
|
|
#include "model/keylistproxymodel.h"
|
|
#include "model/kgpgitemmodel.h"
|
|
#include "model/kgpgitemnode.h"
|
|
#include "transactions/kgpgexport.h"
|
|
#include "transactions/kgpgimport.h"
|
|
|
|
#include <KConfigGroup>
|
|
#include <KLocale>
|
|
#include <KMessageBox>
|
|
#include <QDragMoveEvent>
|
|
#include <QDropEvent>
|
|
#include <QHeaderView>
|
|
|
|
KeyTreeView::KeyTreeView(QWidget *parent, KeyListProxyModel *model)
|
|
: QTreeView(parent), m_proxy(model)
|
|
{
|
|
setModel(model);
|
|
setDragEnabled(true);
|
|
setDragDropMode(DragDrop);
|
|
setAcceptDrops(true);
|
|
setEditTriggers(QTreeView::NoEditTriggers);
|
|
}
|
|
|
|
QList<KGpgNode *>
|
|
KeyTreeView::selectedNodes(bool *psame, KgpgCore::KgpgItemType *pt) const
|
|
{
|
|
QModelIndexList selidx = selectedIndexes();
|
|
QList<KGpgNode *> ndlist;
|
|
KgpgItemType tp = 0;
|
|
bool sametype = true;
|
|
|
|
if (selidx.count() == 0) {
|
|
if (pt != NULL)
|
|
*pt = tp;
|
|
if (psame != NULL)
|
|
*psame = sametype;
|
|
return ndlist;
|
|
}
|
|
|
|
tp = m_proxy->nodeForIndex(selidx[0])->getType();
|
|
|
|
for (int i = 0; i < selidx.count(); i++) {
|
|
if (selidx[i].column() != 0)
|
|
continue;
|
|
KGpgNode *nd = m_proxy->nodeForIndex(selidx[i]);
|
|
|
|
if (nd->getType() != tp) {
|
|
tp |= nd->getType();
|
|
sametype = false;
|
|
}
|
|
|
|
ndlist << nd;
|
|
}
|
|
|
|
if (pt != NULL)
|
|
*pt = tp;
|
|
if (psame != NULL)
|
|
*psame = sametype;
|
|
return ndlist;
|
|
}
|
|
|
|
KGpgNode *
|
|
KeyTreeView::selectedNode() const
|
|
{
|
|
QModelIndexList selidx = selectedIndexes();
|
|
|
|
if (selidx.isEmpty())
|
|
return NULL;
|
|
|
|
return m_proxy->nodeForIndex(selidx[0]);
|
|
}
|
|
|
|
void
|
|
KeyTreeView::selectNode(KGpgNode *nd)
|
|
{
|
|
if (nd == NULL)
|
|
return;
|
|
|
|
QModelIndex idx = m_proxy->nodeIndex(nd);
|
|
|
|
selectionModel()->select(idx, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Rows);
|
|
selectionModel()->setCurrentIndex(idx, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Rows);
|
|
}
|
|
|
|
void
|
|
KeyTreeView::restoreLayout(KConfigGroup &cg)
|
|
{
|
|
QStringList cols(cg.readEntry("ColumnWidths", QStringList()));
|
|
int i = 0;
|
|
|
|
QStringList::ConstIterator it(cols.constBegin());
|
|
const QStringList::ConstIterator itEnd(cols.constEnd());
|
|
for (; it != itEnd; ++it)
|
|
setColumnWidth(i++, (*it).toInt());
|
|
|
|
while (i < model()->columnCount(QModelIndex())) {
|
|
int width = 100;
|
|
switch (i) {
|
|
case KEYCOLUMN_NAME:
|
|
width = 250;
|
|
break;
|
|
case KEYCOLUMN_EMAIL:
|
|
width = 150;
|
|
break;
|
|
case KEYCOLUMN_TRUST:
|
|
// the trust column needs to be only that big as the header which is done automatically
|
|
i++;
|
|
continue;
|
|
}
|
|
setColumnWidth(i, width);
|
|
i++;
|
|
}
|
|
|
|
if (cg.hasKey("SortColumn")) {
|
|
Qt::SortOrder order = cg.readEntry("SortAscending", true) ? Qt::AscendingOrder : Qt::DescendingOrder;
|
|
sortByColumn(cg.readEntry("SortColumn", 0), order);
|
|
}
|
|
}
|
|
|
|
void
|
|
KeyTreeView::saveLayout(KConfigGroup &cg) const
|
|
{
|
|
QStringList widths;
|
|
|
|
const int colCount = model()->columnCount();
|
|
|
|
for (int i = 0; i < colCount; ++i) {
|
|
widths << QString::number(columnWidth(i));
|
|
}
|
|
cg.writeEntry("ColumnWidths", widths);
|
|
cg.writeEntry( "SortColumn", header ()->sortIndicatorSection () );
|
|
cg.writeEntry( "SortAscending", ( header()->sortIndicatorOrder () == Qt::AscendingOrder ) );
|
|
}
|
|
|
|
void
|
|
KeyTreeView::contentsDragMoveEvent(QDragMoveEvent *e)
|
|
{
|
|
e->setAccepted(KUrl::List::canDecode(e->mimeData()));
|
|
}
|
|
|
|
void
|
|
KeyTreeView::contentsDropEvent(QDropEvent *o)
|
|
{
|
|
KUrl::List uriList = KUrl::List::fromMimeData(o->mimeData());
|
|
if (!uriList.isEmpty()) {
|
|
if (KMessageBox::questionYesNo(this, i18n("<p>Do you want to import file <b>%1</b> into your key ring?</p>",
|
|
uriList.first().path()), QString(), KGuiItem(i18n("Import")),
|
|
KGuiItem(i18n("Do Not Import"))) != KMessageBox::Yes)
|
|
return;
|
|
|
|
emit importDrop(uriList);
|
|
}
|
|
}
|
|
|
|
void
|
|
KeyTreeView::startDrag(Qt::DropActions supportedActions)
|
|
{
|
|
QList<KGpgNode *> nodes = selectedNodes();
|
|
|
|
if (nodes.isEmpty())
|
|
return;
|
|
|
|
KGpgNode *nd = nodes.first();
|
|
QString keyid = nd->getId();
|
|
|
|
if (!(nd->getType() & ITYPE_PUBLIC))
|
|
return;
|
|
|
|
KGpgExport *exp = new KGpgExport(this, QStringList(keyid));
|
|
exp->start();
|
|
|
|
int result = exp->waitForFinished();
|
|
|
|
if (result == KGpgTransaction::TS_OK) {
|
|
QMimeData *m = new QMimeData();
|
|
m->setText(QString::fromLatin1( exp->getOutputData() ));
|
|
QDrag *drag = new QDrag(this);
|
|
drag->setMimeData(m);
|
|
drag->exec(supportedActions, Qt::IgnoreAction);
|
|
// do NOT delete drag.
|
|
}
|
|
|
|
delete exp;
|
|
}
|
|
|
|
void
|
|
KeyTreeView::resizeColumnsToContents()
|
|
{
|
|
for (int i = m_proxy->columnCount() - 1; i >= 0; i--)
|
|
resizeColumnToContents(i);
|
|
}
|
|
|
|
void
|
|
KeyTreeView::keyPressEvent(QKeyEvent *event)
|
|
{
|
|
if (event->key() == Qt::Key_Return) {
|
|
if (!event->isAutoRepeat())
|
|
emit returnPressed();
|
|
|
|
return;
|
|
}
|
|
QTreeView::keyPressEvent(event);
|
|
}
|
|
|
|
bool
|
|
KeyTreeView::isEditing() const
|
|
{
|
|
return (state() == EditingState);
|
|
}
|
|
|
|
#include "keytreeview.moc"
|