Skip to content

Commit

Permalink
User group merge added
Browse files Browse the repository at this point in the history
  • Loading branch information
eskrut committed Oct 12, 2014
1 parent be3aca6 commit 42050d0
Show file tree
Hide file tree
Showing 9 changed files with 177 additions and 4 deletions.
2 changes: 2 additions & 0 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ file(GLOB SRC_LIST_loc
singleimageitem.cpp
groupedimages.cpp
viewer.cpp
dirview.cpp
)
file(GLOB UI_LIST_loc
)
Expand All @@ -13,6 +14,7 @@ file(GLOB MOC_LIST_loc
singleimageitem.h
groupedimages.h
viewer.h
dirview.h
)

set(SRC_LIST ${SRC_LIST} ${SRC_LIST_loc} PARENT_SCOPE)
Expand Down
118 changes: 116 additions & 2 deletions src/dirmodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#include "groupedimages.h"
#include <QDebug>
#include <QMutex>
#include <QMimeData>

DirModel::DirModel(QObject *parent) :
QStandardItemModel(parent),
Expand Down Expand Up @@ -129,9 +130,11 @@ void DirModel::setup(const QStringList &entries)
else if(cl.size() > 1) {
GroupedImages *gr = new GroupedImages();
QString text;
for(auto i : cl) text += i->text() + ";";
for(auto i : cl) {
text += i->text() + ";";
gr->appendRow(i);
}
gr->setText(text);
gr->setData(cl.front()->data(Qt::DecorationRole), Qt::DecorationRole);
newItems.push_back(gr);
}
}
Expand All @@ -145,3 +148,114 @@ void DirModel::emitDataChanged()
emit dataChanged(QModelIndex(), QModelIndex());
emit updateRequest();
}

Qt::ItemFlags DirModel::flags(const QModelIndex &index) const
{
return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled;
}

bool DirModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent)
{
if (!data->hasFormat("image/sort-data"))
return false;

if (action == Qt::IgnoreAction)
return true;

if (column > 0)
return false;

if (!parent.isValid())
return false;

SingleImageItem *sParent = dynamic_cast<SingleImageItem*>(itemFromIndex(parent));
GroupedImages *gParent = dynamic_cast<GroupedImages*>(itemFromIndex(parent));
Q_ASSERT(sParent || gParent);

QByteArray encodedData = data->data("image/sort-data");
QDataStream stream(&encodedData, QIODevice::ReadOnly);

qDebug() << QString("Trying to decode") << row << column << parent.data();
while (!stream.atEnd()) {
QStandardItem *item = nullptr;
quintptr ptr;
stream >> ptr;
item = reinterpret_cast<QStandardItem*>(ptr);
SingleImageItem *single = dynamic_cast<SingleImageItem*>(item);
if(single != nullptr) {
takeItem(item->row(), item->column());
if(gParent) {
gParent->appendRow(single);
gParent->setText(gParent->text() + ";" + single->text());
}
else {
gParent = new GroupedImages;
gParent->setText(sParent->text());
int row = sParent->row();
gParent->appendRow(takeItem(sParent->row(), sParent->column()));
gParent->appendRow(single);
gParent->setText(gParent->text() + ";" + single->text());
invisibleRootItem()->insertRow(row, gParent);
sParent = nullptr;
}
}
else {
GroupedImages *group = dynamic_cast<GroupedImages*>(item);
for(int ct = group->rowCount() - 1; ct >= 0; --ct) {
auto single = group->takeChild(ct, 0);
if(gParent) {
gParent->appendRow(single);
gParent->setText(gParent->text() + ";" + single->text());
}
else {
gParent = new GroupedImages;
gParent->setText(sParent->text());
int row = sParent->row();
gParent->appendRow(takeItem(sParent->row(), sParent->column()));
gParent->appendRow(single);
gParent->setText(gParent->text() + ";" + single->text());
invisibleRootItem()->insertRow(row, gParent);
sParent = nullptr;
}
}
takeItem(group->row(), group->column());
}
}

sort(0);
emitDataChanged();

return true;
}

QMimeData *DirModel::mimeData(const QModelIndexList &indexes) const
{
QMimeData *mimeData = new QMimeData();
QByteArray encodedData;

QDataStream stream(&encodedData, QIODevice::WriteOnly);

foreach (QModelIndex index, indexes) {
if (index.isValid()) {
quintptr ptr(reinterpret_cast<quintptr>(itemFromIndex(index)));
stream << ptr;
qDebug() << ptr;
}
}
qDebug() << QString("Data encoded");

mimeData->setData("image/sort-data", encodedData);
return mimeData;
}

QStringList DirModel::mimeTypes() const
{
QStringList types;
types << "image/sort-data";
return types;
}

Qt::DropActions DirModel::supportedDropActions() const
{
return /*Qt::MoveAction | */Qt::CopyAction;
}
10 changes: 10 additions & 0 deletions src/dirmodel.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,16 @@ public slots:
void setup(const QStringList &entries);
private slots:
void emitDataChanged();
public:
// QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
Qt::ItemFlags flags(const QModelIndex &index) const;
// bool removeRows(int row, int count, const QModelIndex &parent);

bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent);
QMimeData *mimeData(const QModelIndexList &indexes) const;
QStringList mimeTypes() const;
// int rowCount(const QModelIndex &parent) const;
Qt::DropActions supportedDropActions() const;

};

Expand Down
9 changes: 9 additions & 0 deletions src/dirview.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
#include "dirview.h"

DirView::DirView(QWidget *parent) :
QListView(parent)
{

setDragEnabled(true);
setDropIndicatorShown(true);
}
18 changes: 18 additions & 0 deletions src/dirview.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#ifndef DIRVIEW_H
#define DIRVIEW_H

#include <QListView>

class DirView : public QListView
{
Q_OBJECT
public:
explicit DirView(QWidget *parent = 0);

signals:

public slots:

};

#endif // DIRVIEW_H
12 changes: 12 additions & 0 deletions src/groupedimages.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,24 @@
GroupedImages::GroupedImages():
QStandardItem()
{
outputIDs_.push_back(0);
}

QVariant GroupedImages::data(int role) const
{
switch (role) {
case Qt::DecorationRole:
if(outputIDs_.size() && rowCount())
return child(outputIDs_.front())->data(Qt::DecorationRole);
else
return QVariant();
break;
default:
return QStandardItem::data(role);
}
}

QString GroupedImages::toolTip() const
{
return QString("%1 Images").arg(rowCount());
}
6 changes: 6 additions & 0 deletions src/groupedimages.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,14 @@ class GroupedImages : public QStandardItem
public:
GroupedImages();
QVariant data(int role) const;
enum class Role{
NumSingles = Qt::UserRole + 1
};

private:
std::vector<int> outputIDs_;
public:
QString toolTip() const;
};

#endif // GROUPEDIMAGES_H
3 changes: 2 additions & 1 deletion src/mainwindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,12 @@ MainWindow::MainWindow(QWidget *parent) :
QFrame *frame = new QFrame;
auto lo = new QHBoxLayout(frame);

dirView_ = new QListView();
dirView_ = new DirView();
lo->addWidget(dirView_);
dirView_->setViewMode(QListView::IconMode);
dirView_->setGridSize(QSize(300, 300));
dirView_->setResizeMode(QListView::Adjust);
dirView_->setMovement(QListView::Snap);

setCentralWidget(frame);

Expand Down
3 changes: 2 additions & 1 deletion src/mainwindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
#include <QListView>
#include <QMainWindow>
#include "dirmodel.h"
#include "dirview.h"
#include "viewer.h"

class MainWindow : public QMainWindow
Expand All @@ -12,7 +13,7 @@ class MainWindow : public QMainWindow
public:
explicit MainWindow(QWidget *parent = 0);
private:
QListView *dirView_;
DirView *dirView_;
DirModel *model_;
Viewer *viewer_;

Expand Down

0 comments on commit 42050d0

Please sign in to comment.