256 lines
7.2 KiB
C++
256 lines
7.2 KiB
C++
#include "./filesystemitemmodel.h"
|
|
#include "./filesystemitem.h"
|
|
|
|
#include <QApplication>
|
|
#include <QBrush>
|
|
#include <QFont>
|
|
#include <QStyle>
|
|
|
|
#include <forward_list>
|
|
|
|
using namespace std;
|
|
|
|
namespace RenamingUtility {
|
|
|
|
/*
|
|
TRANSLATOR RenamingUtility::FileSystemItemModel
|
|
Necessary for lupdate.
|
|
*/
|
|
|
|
FileSystemItemModel::FileSystemItemModel(FileSystemItem *rootItem, QObject *parent)
|
|
: QAbstractItemModel(parent)
|
|
, m_rootItem(rootItem)
|
|
{
|
|
}
|
|
|
|
void FileSystemItemModel::setRootItem(FileSystemItem *rootItem)
|
|
{
|
|
if (m_rootItem == rootItem) {
|
|
return;
|
|
}
|
|
beginResetModel();
|
|
m_rootItem = rootItem;
|
|
endResetModel();
|
|
}
|
|
|
|
FileSystemItem *FileSystemItemModel::fileSystemItemFromIndex(const QModelIndex &index)
|
|
{
|
|
return index.isValid() ? reinterpret_cast<FileSystemItem *>(index.internalPointer()) : nullptr;
|
|
}
|
|
|
|
const FileSystemItem *FileSystemItemModel::fileSystemItemFromIndex(const QModelIndex &index) const
|
|
{
|
|
return const_cast<FileSystemItemModel *>(this)->fileSystemItemFromIndex(index);
|
|
}
|
|
|
|
QVariant FileSystemItemModel::data(const QModelIndex &index, int role) const
|
|
{
|
|
const auto *const item = fileSystemItemFromIndex(index);
|
|
if (!item) {
|
|
return QVariant();
|
|
}
|
|
switch (role) {
|
|
case Qt::DisplayRole:
|
|
switch (index.column()) {
|
|
case 0:
|
|
switch (item->status()) {
|
|
case ItemStatus::Current:
|
|
return item->name();
|
|
case ItemStatus::New:
|
|
return item->counterpart() ? item->counterpart()->name() : item->name();
|
|
}
|
|
break;
|
|
case 1:
|
|
switch (item->status()) {
|
|
case ItemStatus::Current:
|
|
return item->counterpart() ? item->counterpart()->name() : item->name();
|
|
case ItemStatus::New:
|
|
return item->name();
|
|
}
|
|
break;
|
|
case 2:
|
|
return item->note();
|
|
default:;
|
|
}
|
|
break;
|
|
case Qt::DecorationRole:
|
|
switch (index.column()) {
|
|
case 0:
|
|
case 1:
|
|
switch (item->type()) {
|
|
case ItemType::Dir:
|
|
return QApplication::style()->standardIcon(QStyle::SP_DirIcon);
|
|
default:;
|
|
}
|
|
break;
|
|
default:;
|
|
}
|
|
break;
|
|
case Qt::FontRole: {
|
|
QFont font;
|
|
if ((index.column() == 0 && item->status() == ItemStatus::New && !item->counterpart())
|
|
|| (index.column() == 1 && item->status() == ItemStatus::Current && !item->counterpart())) {
|
|
font.setItalic(true);
|
|
}
|
|
return font;
|
|
}
|
|
case Qt::ForegroundRole:
|
|
if (item->errorOccured()) {
|
|
return QBrush(Qt::red);
|
|
} else if (item->applied()) {
|
|
return QBrush(Qt::darkGreen);
|
|
} else if ((index.column() == 0 && item->status() == ItemStatus::New && !item->counterpart())
|
|
|| (index.column() == 1 && item->status() == ItemStatus::Current && !item->counterpart())) {
|
|
return QBrush(Qt::gray);
|
|
}
|
|
break;
|
|
case ErrorStatusRole:
|
|
return item->errorOccured();
|
|
default:;
|
|
}
|
|
return QVariant();
|
|
}
|
|
|
|
bool FileSystemItemModel::setData(const QModelIndex &index, const QVariant &value, int role)
|
|
{
|
|
auto *const item = fileSystemItemFromIndex(index);
|
|
if (!item) {
|
|
return false;
|
|
}
|
|
switch (role) {
|
|
case Qt::DisplayRole:
|
|
switch (index.column()) {
|
|
case 0:
|
|
if (item->setCurrentName(value.toString())) {
|
|
emit dataChanged(index, index, QVector<int>() << role);
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
case 1:
|
|
item->setNewName(value.toString());
|
|
emit dataChanged(index, index, QVector<int>() << role);
|
|
return true;
|
|
case 2:
|
|
item->setNote(value.toString());
|
|
emit dataChanged(index, index, QVector<int>() << role);
|
|
return true;
|
|
default:;
|
|
}
|
|
break;
|
|
case ErrorStatusRole:
|
|
item->setErrorOccured(value.toBool());
|
|
emit dataChanged(index, index, QVector<int>() << role << Qt::DecorationRole);
|
|
return true;
|
|
default:;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
QVariant FileSystemItemModel::headerData(int section, Qt::Orientation orientation, int role) const
|
|
{
|
|
switch (orientation) {
|
|
case Qt::Horizontal:
|
|
switch (role) {
|
|
case Qt::DisplayRole:
|
|
switch (section) {
|
|
case 0:
|
|
return tr("Current name");
|
|
case 1:
|
|
return tr("New name");
|
|
case 2:
|
|
return tr("Note");
|
|
default:;
|
|
}
|
|
break;
|
|
default:;
|
|
}
|
|
break;
|
|
default:;
|
|
}
|
|
return QVariant();
|
|
}
|
|
|
|
QModelIndex FileSystemItemModel::index(int row, int column, const QModelIndex &parent) const
|
|
{
|
|
const auto *const parentItem = parent.isValid() ? reinterpret_cast<FileSystemItem *>(parent.internalPointer()) : m_rootItem;
|
|
if (!parentItem) {
|
|
return QModelIndex();
|
|
}
|
|
const auto &children = parentItem->children();
|
|
return row < children.size() ? createIndex(row, column, children.at(row)) : QModelIndex();
|
|
}
|
|
|
|
QModelIndex FileSystemItemModel::index(FileSystemItem *item, int column) const
|
|
{
|
|
forward_list<FileSystemItem *> path;
|
|
path.push_front(item);
|
|
auto *parent = item->parent();
|
|
while (parent) {
|
|
path.push_front(parent);
|
|
parent = parent->parent();
|
|
}
|
|
if (path.front() != m_rootItem) {
|
|
return QModelIndex();
|
|
}
|
|
path.pop_front();
|
|
QModelIndex index;
|
|
for (auto *const pathItem : path) {
|
|
index = this->index(pathItem->row(), column, index);
|
|
if (pathItem == item || !index.isValid()) {
|
|
return index;
|
|
}
|
|
}
|
|
return QModelIndex();
|
|
}
|
|
|
|
QModelIndex FileSystemItemModel::parent(const QModelIndex &index) const
|
|
{
|
|
const auto *const item = fileSystemItemFromIndex(index);
|
|
if (!item) {
|
|
return QModelIndex();
|
|
}
|
|
auto *const parent = item->parent();
|
|
if (!parent || index.row() >= parent->children().size()) {
|
|
return QModelIndex();
|
|
}
|
|
return createIndex(parent->row(), index.column(), parent);
|
|
}
|
|
|
|
QModelIndex FileSystemItemModel::counterpart(const QModelIndex &index, int column = -1)
|
|
{
|
|
const auto *const item = fileSystemItemFromIndex(index);
|
|
if (!item) {
|
|
return QModelIndex();
|
|
}
|
|
if (column < 0) {
|
|
column = index.column();
|
|
}
|
|
return item->counterpart() ? this->index(item->counterpart(), column) : QModelIndex();
|
|
}
|
|
|
|
int FileSystemItemModel::rowCount(const QModelIndex &parent) const
|
|
{
|
|
if (const auto *const parentItem = (parent.isValid() ? reinterpret_cast<FileSystemItem *>(parent.internalPointer()) : m_rootItem)) {
|
|
return parentItem->children().size();
|
|
} else {
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
bool FileSystemItemModel::hasChildren(const QModelIndex &parent) const
|
|
{
|
|
if (const auto *const parentItem = (parent.isValid() ? reinterpret_cast<const FileSystemItem *>(parent.internalPointer()) : m_rootItem)) {
|
|
return parentItem->children().size() > 0;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
int FileSystemItemModel::columnCount(const QModelIndex &) const
|
|
{
|
|
return 3;
|
|
}
|
|
|
|
} // namespace RenamingUtility
|