summaryrefslogtreecommitdiffstats
path: root/pictureswidget.cpp
diff options
context:
space:
mode:
authorArno <am@disconnect.de>2012-02-26 08:54:00 +0100
committerArno <am@disconnect.de>2012-02-26 08:54:00 +0100
commit7b373a2a860d1e779664fffe98db769be34d5591 (patch)
tree83369d25d97216023b7464b3b86b85450986114b /pictureswidget.cpp
parent26530f47ff13e20d46472c12abc7567a61c14e57 (diff)
downloadSheMov-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.cpp228
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);
+ }
+}