diff options
author | Arno <am@disconnect.de> | 2012-02-26 08:54:00 +0100 |
---|---|---|
committer | Arno <am@disconnect.de> | 2012-02-26 08:54:00 +0100 |
commit | 7b373a2a860d1e779664fffe98db769be34d5591 (patch) | |
tree | 83369d25d97216023b7464b3b86b85450986114b /pictureswidget.cpp | |
parent | 26530f47ff13e20d46472c12abc7567a61c14e57 (diff) | |
download | SheMov-7b373a2a860d1e779664fffe98db769be34d5591.tar.gz SheMov-7b373a2a860d1e779664fffe98db769be34d5591.tar.bz2 SheMov-7b373a2a860d1e779664fffe98db769be34d5591.zip |
Implement PicturesWidget
Create a tab to show the archived pictures. It's far from complete, but
it already does:
* show pictures
* hover
* delete pictures from archive
Diffstat (limited to 'pictureswidget.cpp')
-rw-r--r-- | pictureswidget.cpp | 228 |
1 files changed, 228 insertions, 0 deletions
diff --git a/pictureswidget.cpp b/pictureswidget.cpp new file mode 100644 index 0000000..4bc2aad --- /dev/null +++ b/pictureswidget.cpp @@ -0,0 +1,228 @@ +/* + 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) any later version. +*/ + +#include <QSplitter> +#include <QHBoxLayout> +#include <QSqlQuery> +#include <QSortFilterProxyModel> +#include <QLocale> +#include <QHideEvent> +#include <QHoverEvent> +#include <QEvent> +#include <QHeaderView> +#include <QSettings> +#include <QMessageBox> +#include <QMenu> +#include <QFile> + +#include "pictureswidget.h" +#include "mappingtreewidget.h" +#include "smtreeitem.h" +#include "helper.h" +#include "hoverwindow.h" + +PicturesWidget::PicturesWidget(QWidget *parent) : QWidget(parent) { + //setup gui + QSplitter *splitter = new QSplitter; + mMappingTree = new MappingTreeWidget; + mPictureView = new PictureView; + connect(mMappingTree, SIGNAL(mappingChanged(int)), mPictureView, SLOT(mappingChanged(int))); + splitter->addWidget(mMappingTree); + splitter->addWidget(mPictureView); + splitter->setStretchFactor(0, 1); + splitter->setStretchFactor(1, 3); + + //put it all togehter + QHBoxLayout *mainLayout = new QHBoxLayout; + mainLayout->addWidget(splitter); + setLayout(mainLayout); +} + +PictureView::PictureView(QWidget *parent) : QTreeView(parent) { + //setup model + mModel = new PicFilesModel(QStringList() << tr("Filename") << tr("SizeNum") << tr("Format") << tr("Full Path") << tr("Id") << tr("Added") << tr("Md5Sum") << tr("Size"), this); + mProxy = new QSortFilterProxyModel(this); + mProxy->setSourceModel(mModel); + setModel(mProxy); + + //read settings + QSettings s; + QByteArray pvHeader = s.value("ui/pvheader").toByteArray(); + mCursorOffset = s.value("ui/cursoroffset").toInt(); + if(!pvHeader.isEmpty()){ + header()->restoreState(pvHeader); + } + + //hover window + mHoverWin = new HoverWindow; + + //misc settings + setSortingEnabled(true); + setAttribute(Qt::WA_Hover); + setSelectionMode(QAbstractItemView::ExtendedSelection); + setAlternatingRowColors(true); + setColumnHidden(1, true); + setColumnHidden(4, true); +} + +void PictureView::mappingChanged(int mapping){ + mModel->setMapping(mapping); + mModel->populate(); + for(int i = 0; i < PicFilesModel::NumFields; ++i){ + resizeColumnToContents(i); + } +} + + +void PictureView::deletePics(){ + QModelIndexList sel = selectionModel()->selectedRows(); + if(sel.isEmpty()){ + return; + } + QString msg = QString(tr("Really delete %1 pics from archive?")).arg(sel.count()); + int retval = QMessageBox::question(this, tr("Question"), msg, QMessageBox::Yes | QMessageBox::No); + if(retval == QMessageBox::No){ + return; + } + QList<QPersistentModelIndex> real; + foreach(QModelIndex i, sel){ + real << QPersistentModelIndex(mProxy->mapToSource(i)); + } + mModel->removeFiles(real); +} + +void PictureView::hideEvent(QHideEvent *){ + QByteArray pvHeader = header()->saveState(); + QSettings s; + s.setValue("ui/pvheader", pvHeader); +} + +bool PictureView::event(QEvent *e){ + QHoverEvent *hEvent = static_cast<QHoverEvent*>(e); + if(!hEvent){ + return QTreeView::event(e); + } + QPoint hotSpot(hEvent->pos().x(), hEvent->pos().y() + mCursorOffset); + QModelIndex curIdx = indexAt(hotSpot); + if(e->type() == QEvent::HoverEnter || e->type() == QEvent::HoverMove){ + if(!curIdx.isValid() || curIdx.column() != PicFilesModel::FileName){ + mHoverWin->setVisible(false); + mCurHover = QModelIndex(); + return true; + } + } + if(e->type() == QEvent::HoverEnter){ + mCurHover = curIdx; + QPixmap pm; + pm.load(mCurHover.data(PicFilesModel::FullPathRole).toString()); + mHoverWin->setPixmap(pm); + mHoverWin->setPos(); + mHoverWin->setCaption(mCurHover.data().toString()); + mHoverWin->setVisible(true); + return true; + } + if(e->type() == QEvent::HoverMove){ + if(curIdx != mCurHover){ + mCurHover = curIdx; + QPixmap pm; + pm.load(mCurHover.data(PicFilesModel::FullPathRole).toString()); + mHoverWin->setPixmap(pm); + mHoverWin->setPos(); + mHoverWin->setCaption(mCurHover.data().toString()); + mHoverWin->setVisible(true); + return true; + } + } + return QTreeView::event(e); +} + +void PictureView::contextMenuEvent(QContextMenuEvent *e){ + QMenu ctxMenu; + ctxMenu.addActions(actions()); + ctxMenu.exec(e->globalPos()); +} + +PicFilesModel::PicFilesModel(const QStringList &headers, QObject *parent) : SmTreeModel(headers, parent) { + //setup database + mDb = QSqlDatabase::database("treedb"); + mPopulateQ = new QSqlQuery(mDb); + mPopulateQ->prepare("SELECT pics.tfilename, pics.isize, pics.tformat, pics.dtadded, pics.cmd5sum, pics.ipicsid FROM pics, pics_mappings WHERE pics_mappings.imapping_id = :mapid AND pics_mappings.ipics_id = pics.ipicsid ORDER BY pics.tfilename"); + mDeleteFileQ = new QSqlQuery(mDb); + mDeleteFileQ->prepare("DELETE FROM pics WHERE ipicsid = :id"); +} + +QVariant PicFilesModel::data(const QModelIndex &index, int role) const { + if(role == Qt::FontRole){ + if(index.column() == Md5Sum){ + return QFont("courier"); + } + } + if(role == Qt::ForegroundRole){ + if(index.column() == SizeDisplay){ + int fileSize = index.data(SizeRole).toInt(); + if(fileSize > 1024 * 1024 * 1024){ + return QColor(Qt::red); + }else{ + return QColor(Qt::green); + } + } + } + SmTreeItem *item = itemAt(index); + if(role == FileNameRole){ + return item->data(FileName); + } + if(role == SizeRole){ + return item->data(Size); + } + if(role == MimeTypeRole){ + return item->data(MimeType); + } + if(role == FullPathRole){ + return item->data(FullPath); + } + if(role == IdRole){ + return item->data(Id); + } + if(role == AddedRole){ + return item->data(Added); + } + if(role == Md5SumRole){ + return item->data(Md5Sum); + } + if(role == SizeDisplayRole){ + return item->data(SizeDisplay); + } + return SmTreeModel::data(index, role); +} + +void PicFilesModel::removeFiles(const QList<QPersistentModelIndex> &files){ + foreach(QPersistentModelIndex pi, files){ + mDeleteFileQ->bindValue(":id", pi.data(IdRole)); + if(mDeleteFileQ->exec()){ + QFile::remove(pi.data(FullPathRole).toString()); + removeRows(pi.row(), 1, QModelIndex()); + } + } +} + +void PicFilesModel::populate(){ + SmTreeItem *root = new SmTreeItem(NumFields); + mPopulateQ->bindValue(":mapid", mMappingId); + if(mPopulateQ->exec()){ + while(mPopulateQ->next()){ + QList<QVariant> data; + data << mPopulateQ->value(0) << mPopulateQ->value(1) << mPopulateQ->value(2); // Filename, size and Mime type + data << Helper::createArchivePath(mPopulateQ->value(0).toString(), mPopulateQ->value(4).toString()); // full path; + data << mPopulateQ->value(5) << mPopulateQ->value(3) << mPopulateQ->value(4); //Id, added and md5 + QLocale l; + data << l.toString(mPopulateQ->value(1).toInt()); + SmTreeItem *child = new SmTreeItem(data, root); + root->appendChild(child); + } + setRoot(root); + } +} |