diff --git a/.clang-format b/.clang-format new file mode 100644 index 00000000..167a8fa7 --- /dev/null +++ b/.clang-format @@ -0,0 +1,24 @@ +UseTab: true +IndentWidth: 4 +TabWidth: 4 +ConstructorInitializerIndentWidth: 4 +AccessModifierOffset: -4 +IndentCaseLabels: false +IndentFunctionDeclarationAfterType: false +NamespaceIndentation: None + +BreakBeforeBraces: Allman +AllowShortIfStatementsOnASingleLine: false +ColumnLimit: 96 +MaxEmptyLinesToKeep: 1 + +Standard: Cpp11 +Cpp11BracedListStyle: true + +SpacesInParentheses: false +SpaceInEmptyParentheses: false +SpacesInCStyleCastParentheses: false +SpaceAfterControlStatementKeyword: true + +AlignTrailingComments: true +SpacesBeforeTrailingComments: 1 diff --git a/CMakeLists.txt b/CMakeLists.txt index 44a28c57..e2a85950 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -23,17 +23,17 @@ find_package(Qt5Widgets REQUIRED) include_directories(${Qt5Core_INCLUDE_DIRS} ${Qt5Gui_INCLUDE_DIRS} ${Qt5Widgets_INCLUDE_DIRS}) set(SOURCES - main.cpp - main.h + main.cpp + main.h - CategorizedView.h - CategorizedView.cpp - CategorizedViewCategory.h - CategorizedViewCategory.cpp - CategorizedProxyModel.h - CategorizedProxyModel.cpp - InstanceDelegate.h - InstanceDelegate.cpp + GroupView.h + GroupView.cpp + Group.h + Group.cpp + GroupedProxyModel.h + GroupedProxyModel.cpp + InstanceDelegate.h + InstanceDelegate.cpp ) add_executable(GroupView ${SOURCES}) diff --git a/CategorizedProxyModel.h b/CategorizedProxyModel.h deleted file mode 100644 index 6e4f3fdc..00000000 --- a/CategorizedProxyModel.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef CATEGORIZEDPROXYMODEL_H -#define CATEGORIZEDPROXYMODEL_H - -#include - -class CategorizedProxyModel : public QSortFilterProxyModel -{ - Q_OBJECT - -public: - CategorizedProxyModel(QObject *parent = 0); - -protected: - bool lessThan(const QModelIndex &left, const QModelIndex &right) const; -}; - - -#endif // CATEGORIZEDPROXYMODEL_H diff --git a/CategorizedViewCategory.cpp b/Group.cpp similarity index 64% rename from CategorizedViewCategory.cpp rename to Group.cpp index b82ffc96..f23066c5 100644 --- a/CategorizedViewCategory.cpp +++ b/Group.cpp @@ -1,32 +1,34 @@ -#include "CategorizedViewCategory.h" +#include "Group.h" #include #include #include -#include "CategorizedView.h" +#include "GroupView.h" -CategorizedViewCategory::CategorizedViewCategory(const QString &text, CategorizedView *view) +Group::Group(const QString &text, GroupView *view) : view(view), text(text), collapsed(false) { } -CategorizedViewCategory::CategorizedViewCategory(const CategorizedViewCategory *other) : - view(other->view), text(other->text), collapsed(other->collapsed), iconRect(other->iconRect), textRect(other->textRect) +Group::Group(const Group *other) + : view(other->view), text(other->text), collapsed(other->collapsed), + iconRect(other->iconRect), textRect(other->textRect) { } -void CategorizedViewCategory::update() +void Group::update() { firstRow = firstItem().row(); rowHeights = QVector(numRows()); for (int i = 0; i < numRows(); ++i) { - rowHeights[i] = view->categoryRowHeight(view->model()->index(i * view->itemsPerRow() + firstRow, 0)); + rowHeights[i] = view->categoryRowHeight( + view->model()->index(i * view->itemsPerRow() + firstRow, 0)); } } -void CategorizedViewCategory::drawHeader(QPainter *painter, const int y) +void Group::drawHeader(QPainter *painter, const int y) { painter->save(); @@ -51,23 +53,27 @@ void CategorizedViewCategory::drawHeader(QPainter *painter, const int y) int textWidth = painter->fontMetrics().width(text); textRect = QRect(iconRect.right() + 4, y, textWidth, headerHeight()); painter->setBrush(view->viewOptions().palette.text()); - view->style()->drawItemText(painter, textRect, Qt::AlignHCenter | Qt::AlignVCenter, view->viewport()->palette(), true, text); + view->style()->drawItemText(painter, textRect, Qt::AlignHCenter | Qt::AlignVCenter, + view->viewport()->palette(), true, text); // the line - painter->drawLine(textRect.right() + 4, y + headerHeight() / 2, view->contentWidth() - view->m_rightMargin, y + headerHeight() / 2); + painter->drawLine(textRect.right() + 4, y + headerHeight() / 2, + view->contentWidth() - view->m_rightMargin, y + headerHeight() / 2); painter->restore(); } -int CategorizedViewCategory::totalHeight() const +int Group::totalHeight() const { return headerHeight() + 5 + contentHeight(); } -int CategorizedViewCategory::headerHeight() const + +int Group::headerHeight() const { return view->viewport()->fontMetrics().height() + 4; } -int CategorizedViewCategory::contentHeight() const + +int Group::contentHeight() const { if (collapsed) { @@ -80,14 +86,16 @@ int CategorizedViewCategory::contentHeight() const } return result; } -int CategorizedViewCategory::numRows() const + +int Group::numRows() const { return qMax(1, qCeil((qreal)numItems() / (qreal)view->itemsPerRow())); } -int CategorizedViewCategory::top() const + +int Group::top() const { int res = 0; - const QList cats = view->m_categories; + const QList cats = view->m_categories; for (int i = 0; i < cats.size(); ++i) { if (cats.at(i) == this) @@ -99,7 +107,7 @@ int CategorizedViewCategory::top() const return res; } -QList CategorizedViewCategory::items() const +QList Group::items() const { QList indices; for (int i = 0; i < view->model()->rowCount(); ++i) @@ -112,16 +120,19 @@ QList CategorizedViewCategory::items() const } return indices; } -int CategorizedViewCategory::numItems() const + +int Group::numItems() const { return items().size(); } -QModelIndex CategorizedViewCategory::firstItem() const + +QModelIndex Group::firstItem() const { QList indices = items(); return indices.isEmpty() ? QModelIndex() : indices.first(); } -QModelIndex CategorizedViewCategory::lastItem() const + +QModelIndex Group::lastItem() const { QList indices = items(); return indices.isEmpty() ? QModelIndex() : indices.last(); diff --git a/CategorizedViewCategory.h b/Group.h similarity index 63% rename from CategorizedViewCategory.h rename to Group.h index cb6ef8c5..6a8fadeb 100644 --- a/CategorizedViewCategory.h +++ b/Group.h @@ -1,19 +1,18 @@ -#ifndef CATEGORIZEDVIEWROW_H -#define CATEGORIZEDVIEWROW_H +#pragma once #include #include #include -class CategorizedView; +class GroupView; class QPainter; class QModelIndex; -struct CategorizedViewCategory +struct Group { - CategorizedViewCategory(const QString &text, CategorizedView *view); - CategorizedViewCategory(const CategorizedViewCategory *other); - CategorizedView *view; + Group(const QString &text, GroupView *view); + Group(const Group *other); + GroupView *view; QString text; bool collapsed; QRect iconRect; @@ -35,5 +34,3 @@ struct CategorizedViewCategory QModelIndex firstItem() const; QModelIndex lastItem() const; }; - -#endif // CATEGORIZEDVIEWROW_H diff --git a/CategorizedView.cpp b/GroupView.cpp similarity index 68% rename from CategorizedView.cpp rename to GroupView.cpp index 60230661..e3bc1055 100644 --- a/CategorizedView.cpp +++ b/GroupView.cpp @@ -1,4 +1,4 @@ -#include "CategorizedView.h" +#include "GroupView.h" #include #include @@ -11,12 +11,11 @@ #include #include -#include "CategorizedViewCategory.h" +#include "Group.h" -template -bool listsIntersect(const QList &l1, const QList t2) +template bool listsIntersect(const QList &l1, const QList t2) { - foreach (const T &item, l1) + for (auto &item : l1) { if (t2.contains(item)) { @@ -26,31 +25,33 @@ bool listsIntersect(const QList &l1, const QList t2) return false; } -CategorizedView::CategorizedView(QWidget *parent) - : QListView(parent), m_leftMargin(5), m_rightMargin(5), m_bottomMargin(5), m_categoryMargin(5)//, m_updatesDisabled(false), m_categoryEditor(0), m_editedCategory(0) +GroupView::GroupView(QWidget *parent) + : QListView(parent), m_leftMargin(5), m_rightMargin(5), m_bottomMargin(5), + m_categoryMargin(5) //, m_updatesDisabled(false), m_categoryEditor(0), m_editedCategory(0) { setViewMode(IconMode); - setMovement(Snap); + //setMovement(Snap); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); setWordWrap(true); - setDragDropMode(QListView::InternalMove); + //setDragDropMode(QListView::InternalMove); setAcceptDrops(true); setSpacing(10); } -CategorizedView::~CategorizedView() +GroupView::~GroupView() { qDeleteAll(m_categories); m_categories.clear(); } -void CategorizedView::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector &roles) +void GroupView::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, + const QVector &roles) { -// if (m_updatesDisabled) -// { -// return; -// } + // if (m_updatesDisabled) + // { + // return; + // } QListView::dataChanged(topLeft, bottomRight, roles); @@ -60,24 +61,25 @@ void CategorizedView::dataChanged(const QModelIndex &topLeft, const QModelIndex update(); } } -void CategorizedView::rowsInserted(const QModelIndex &parent, int start, int end) +void GroupView::rowsInserted(const QModelIndex &parent, int start, int end) { -// if (m_updatesDisabled) -// { -// return; -// } + // if (m_updatesDisabled) + // { + // return; + // } QListView::rowsInserted(parent, start, end); updateGeometries(); update(); } -void CategorizedView::rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end) + +void GroupView::rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end) { -// if (m_updatesDisabled) -// { -// return; -// } + // if (m_updatesDisabled) + // { + // return; + // } QListView::rowsAboutToBeRemoved(parent, start, end); @@ -85,27 +87,28 @@ void CategorizedView::rowsAboutToBeRemoved(const QModelIndex &parent, int start, update(); } -void CategorizedView::updateGeometries() +void GroupView::updateGeometries() { QListView::updateGeometries(); int previousScroll = verticalScrollBar()->value(); - QMap cats; + QMap cats; for (int i = 0; i < model()->rowCount(); ++i) { - const QString category = model()->index(i, 0).data(CategorizedViewRoles::CategoryRole).toString(); + const QString category = + model()->index(i, 0).data(CategorizedViewRoles::CategoryRole).toString(); if (!cats.contains(category)) { - CategorizedViewCategory *old = this->category(category); + Group *old = this->category(category); if (old) { - cats.insert(category, new CategorizedViewCategory(old)); + cats.insert(category, new Group(old)); } else { - cats.insert(category, new CategorizedViewCategory(category, this)); + cats.insert(category, new Group(category, this)); } } } @@ -130,14 +133,14 @@ void CategorizedView::updateGeometries() else { int totalHeight = 0; - foreach (const CategorizedViewCategory *category, m_categories) + for (auto category : m_categories) { totalHeight += category->totalHeight() + m_categoryMargin; } // remove the last margin (we don't want it) totalHeight -= m_categoryMargin; totalHeight += m_bottomMargin; - verticalScrollBar()->setRange(0, totalHeight- height()); + verticalScrollBar()->setRange(0, totalHeight - height()); } verticalScrollBar()->setValue(qMin(previousScroll, verticalScrollBar()->maximum())); @@ -145,9 +148,9 @@ void CategorizedView::updateGeometries() update(); } -bool CategorizedView::isIndexHidden(const QModelIndex &index) const +bool GroupView::isIndexHidden(const QModelIndex &index) const { - CategorizedViewCategory *cat = category(index); + Group *cat = category(index); if (cat) { return cat->collapsed; @@ -158,11 +161,12 @@ bool CategorizedView::isIndexHidden(const QModelIndex &index) const } } -CategorizedViewCategory *CategorizedView::category(const QModelIndex &index) const +Group *GroupView::category(const QModelIndex &index) const { return category(index.data(CategorizedViewRoles::CategoryRole).toString()); } -CategorizedViewCategory *CategorizedView::category(const QString &cat) const + +Group *GroupView::category(const QString &cat) const { for (int i = 0; i < m_categories.size(); ++i) { @@ -173,7 +177,8 @@ CategorizedViewCategory *CategorizedView::category(const QString &cat) const } return 0; } -CategorizedViewCategory *CategorizedView::categoryAt(const QPoint &pos) const + +Group *GroupView::categoryAt(const QPoint &pos) const { for (int i = 0; i < m_categories.size(); ++i) { @@ -185,25 +190,28 @@ CategorizedViewCategory *CategorizedView::categoryAt(const QPoint &pos) const return 0; } -int CategorizedView::itemsPerRow() const +int GroupView::itemsPerRow() const { - return qFloor((qreal)(contentWidth()) / (qreal)(itemWidth() + spacing())); + return qFloor((qreal)(contentWidth()) / (qreal)(itemWidth() + /* spacing */ 10)); } -int CategorizedView::contentWidth() const + +int GroupView::contentWidth() const { return width() - m_leftMargin - m_rightMargin; } -int CategorizedView::itemWidth() const +int GroupView::itemWidth() const { - return itemDelegate()->sizeHint(viewOptions(), model()->index(model()->rowCount() -1, 0)).width(); + return itemDelegate() + ->sizeHint(viewOptions(), model()->index(model()->rowCount() - 1, 0)) + .width(); } -int CategorizedView::categoryRowHeight(const QModelIndex &index) const +int GroupView::categoryRowHeight(const QModelIndex &index) const { QModelIndexList indices; int internalRow = categoryInternalPosition(index).second; - foreach (const QModelIndex &i, category(index)->items()) + for (auto &i : category(index)->items()) { if (categoryInternalPosition(i).second == internalRow) { @@ -212,14 +220,15 @@ int CategorizedView::categoryRowHeight(const QModelIndex &index) const } int largestHeight = 0; - foreach (const QModelIndex &i, indices) + for (auto &i : indices) { - largestHeight = qMax(largestHeight, itemDelegate()->sizeHint(viewOptions(), i).height()); + largestHeight = + qMax(largestHeight, itemDelegate()->sizeHint(viewOptions(), i).height()); } return largestHeight; } -QPair CategorizedView::categoryInternalPosition(const QModelIndex &index) const +QPair GroupView::categoryInternalPosition(const QModelIndex &index) const { QList indices = category(index)->items(); int x = 0; @@ -240,9 +249,10 @@ QPair CategorizedView::categoryInternalPosition(const QModelIndex &ind } return qMakePair(x, y); } -int CategorizedView::categoryInternalRowTop(const QModelIndex &index) const + +int GroupView::categoryInternalRowTop(const QModelIndex &index) const { - CategorizedViewCategory *cat = category(index); + Group *cat = category(index); int categoryInternalRow = categoryInternalPosition(index).second; int result = 0; for (int i = 0; i < categoryInternalRow; ++i) @@ -251,9 +261,11 @@ int CategorizedView::categoryInternalRowTop(const QModelIndex &index) const } return result; } -int CategorizedView::itemHeightForCategoryRow(const CategorizedViewCategory *category, const int internalRow) const + +int GroupView::itemHeightForCategoryRow(const Group *category, + const int internalRow) const { - foreach (const QModelIndex &i, category->items()) + for (auto &i : category->items()) { QPair pos = categoryInternalPosition(i); if (pos.second == internalRow) @@ -264,9 +276,9 @@ int CategorizedView::itemHeightForCategoryRow(const CategorizedViewCategory *cat return -1; } -void CategorizedView::mousePressEvent(QMouseEvent *event) +void GroupView::mousePressEvent(QMouseEvent *event) { - //endCategoryEditor(); + // endCategoryEditor(); QPoint pos = event->pos() + offset(); QPersistentModelIndex index = indexAt(pos); @@ -297,13 +309,15 @@ void CategorizedView::mousePressEvent(QMouseEvent *event) // signal handlers may change the model emit pressed(index); - - } else { + } + else + { // Forces a finalize() even if mouse is pressed, but not on a item selectionModel()->select(QModelIndex(), QItemSelectionModel::Select); } } -void CategorizedView::mouseMoveEvent(QMouseEvent *event) + +void GroupView::mouseMoveEvent(QMouseEvent *event) { QPoint topLeft; QPoint bottomRight = event->pos(); @@ -337,10 +351,8 @@ void CategorizedView::mouseMoveEvent(QMouseEvent *event) topLeft = bottomRight; } - if (m_pressedIndex.isValid() - && (state() != DragSelectingState) - && (event->buttons() != Qt::NoButton) - && !selectedIndexes().isEmpty()) + if (m_pressedIndex.isValid() && (state() != DragSelectingState) && + (event->buttons() != Qt::NoButton) && !selectedIndexes().isEmpty()) { setState(DraggingState); return; @@ -350,7 +362,8 @@ void CategorizedView::mouseMoveEvent(QMouseEvent *event) { setState(DragSelectingState); QItemSelectionModel::SelectionFlags command = selectionCommand(index, event); - if (m_ctrlDragSelectionFlag != QItemSelectionModel::NoUpdate && command.testFlag(QItemSelectionModel::Toggle)) + if (m_ctrlDragSelectionFlag != QItemSelectionModel::NoUpdate && + command.testFlag(QItemSelectionModel::Toggle)) { command &= ~QItemSelectionModel::Toggle; command |= m_ctrlDragSelectionFlag; @@ -361,20 +374,21 @@ void CategorizedView::mouseMoveEvent(QMouseEvent *event) setSelection(selectionRect, command); // set at the end because it might scroll the view - if (index.isValid() - && (index != selectionModel()->currentIndex()) - && (index.flags() & Qt::ItemIsEnabled)) + if (index.isValid() && (index != selectionModel()->currentIndex()) && + (index.flags() & Qt::ItemIsEnabled)) { selectionModel()->setCurrentIndex(index, QItemSelectionModel::NoUpdate); } } } -void CategorizedView::mouseReleaseEvent(QMouseEvent *event) + +void GroupView::mouseReleaseEvent(QMouseEvent *event) { QPoint pos = event->pos() + offset(); QPersistentModelIndex index = indexAt(pos); - bool click = (index == m_pressedIndex && index.isValid()) || (m_pressedCategory && m_pressedCategory == categoryAt(pos)); + bool click = (index == m_pressedIndex && index.isValid()) || + (m_pressedCategory && m_pressedCategory == categoryAt(pos)); if (click && m_pressedCategory) { @@ -411,23 +425,22 @@ void CategorizedView::mouseReleaseEvent(QMouseEvent *event) { option.state |= QStyle::State_Selected; } - if ((model()->flags(index) & Qt::ItemIsEnabled) - && style()->styleHint(QStyle::SH_ItemView_ActivateItemOnSingleClick, &option, this)) + if ((model()->flags(index) & Qt::ItemIsEnabled) && + style()->styleHint(QStyle::SH_ItemView_ActivateItemOnSingleClick, &option, this)) { emit activated(index); } } } -void CategorizedView::mouseDoubleClickEvent(QMouseEvent *event) + +void GroupView::mouseDoubleClickEvent(QMouseEvent *event) { QModelIndex index = indexAt(event->pos()); - if (!index.isValid() - || !(index.flags() & Qt::ItemIsEnabled) - || (m_pressedIndex != index)) + if (!index.isValid() || !(index.flags() & Qt::ItemIsEnabled) || (m_pressedIndex != index)) { - QMouseEvent me(QEvent::MouseButtonPress, - event->localPos(), event->windowPos(), event->screenPos(), - event->button(), event->buttons(), event->modifiers()); + QMouseEvent me(QEvent::MouseButtonPress, event->localPos(), event->windowPos(), + event->screenPos(), event->button(), event->buttons(), + event->modifiers()); mousePressEvent(&me); return; } @@ -435,7 +448,8 @@ void CategorizedView::mouseDoubleClickEvent(QMouseEvent *event) QPersistentModelIndex persistent = index; emit doubleClicked(persistent); } -void CategorizedView::paintEvent(QPaintEvent *event) + +void GroupView::paintEvent(QPaintEvent *event) { QPainter painter(this->viewport()); painter.translate(-offset()); @@ -443,7 +457,7 @@ void CategorizedView::paintEvent(QPaintEvent *event) int y = 0; for (int i = 0; i < m_categories.size(); ++i) { - CategorizedViewCategory *category = m_categories.at(i); + Group *category = m_categories.at(i); category->drawHeader(&painter, y); y += category->totalHeight() + m_categoryMargin; } @@ -459,10 +473,11 @@ void CategorizedView::paintEvent(QPaintEvent *event) QStyleOptionViewItemV4 option(viewOptions()); option.rect = visualRect(index); option.widget = this; - option.features |= wordWrap() ? QStyleOptionViewItemV2::WrapText : QStyleOptionViewItemV2::None; + option.features |= QStyleOptionViewItemV2::WrapText; // FIXME: what is the meaning of this anyway? if (flags & Qt::ItemIsSelectable && selectionModel()->isSelected(index)) { - option.state |= selectionModel()->isSelected(index) ? QStyle::State_Selected : QStyle::State_None; + option.state |= selectionModel()->isSelected(index) ? QStyle::State_Selected + : QStyle::State_None; } else { @@ -478,8 +493,8 @@ void CategorizedView::paintEvent(QPaintEvent *event) if (!m_lastDragPosition.isNull()) { - QPair pair = rowDropPos(m_lastDragPosition); - CategorizedViewCategory *category = pair.first; + QPair pair = rowDropPos(m_lastDragPosition); + Group *category = pair.first; int row = pair.second; if (category) { @@ -502,19 +517,21 @@ void CategorizedView::paintEvent(QPaintEvent *event) } } } -void CategorizedView::resizeEvent(QResizeEvent *event) + +void GroupView::resizeEvent(QResizeEvent *event) { QListView::resizeEvent(event); -// if (m_categoryEditor) -// { -// m_categoryEditor->resize(qMax(contentWidth() / 2, m_editedCategory->textRect.width()), m_categoryEditor->height()); -// } + // if (m_categoryEditor) + // { + // m_categoryEditor->resize(qMax(contentWidth() / 2, m_editedCategory->textRect.width()), + //m_categoryEditor->height()); + // } updateGeometries(); } -void CategorizedView::dragEnterEvent(QDragEnterEvent *event) +void GroupView::dragEnterEvent(QDragEnterEvent *event) { if (!isDragEventAccepted(event)) { @@ -524,7 +541,8 @@ void CategorizedView::dragEnterEvent(QDragEnterEvent *event) viewport()->update(); event->accept(); } -void CategorizedView::dragMoveEvent(QDragMoveEvent *event) + +void GroupView::dragMoveEvent(QDragMoveEvent *event) { if (!isDragEventAccepted(event)) { @@ -534,12 +552,14 @@ void CategorizedView::dragMoveEvent(QDragMoveEvent *event) viewport()->update(); event->accept(); } -void CategorizedView::dragLeaveEvent(QDragLeaveEvent *event) + +void GroupView::dragLeaveEvent(QDragLeaveEvent *event) { m_lastDragPosition = QPoint(); viewport()->update(); } -void CategorizedView::dropEvent(QDropEvent *event) + +void GroupView::dropEvent(QDropEvent *event) { m_lastDragPosition = QPoint(); @@ -551,8 +571,8 @@ void CategorizedView::dropEvent(QDropEvent *event) return; } - QPair dropPos = rowDropPos(event->pos() + offset()); - const CategorizedViewCategory *category = dropPos.first; + QPair dropPos = rowDropPos(event->pos() + offset()); + const Group *category = dropPos.first; const int row = dropPos.second; if (row == -1) @@ -564,7 +584,8 @@ void CategorizedView::dropEvent(QDropEvent *event) const QString categoryText = category->text; if (model()->dropMimeData(event->mimeData(), Qt::MoveAction, row, 0, QModelIndex())) { - model()->setData(model()->index(row, 0), categoryText, CategorizedViewRoles::CategoryRole); + model()->setData(model()->index(row, 0), categoryText, + CategorizedViewRoles::CategoryRole); event->setDropAction(Qt::MoveAction); event->accept(); } @@ -572,7 +593,7 @@ void CategorizedView::dropEvent(QDropEvent *event) viewport()->update(); } -void CategorizedView::startDrag(Qt::DropActions supportedActions) +void GroupView::startDrag(Qt::DropActions supportedActions) { QModelIndexList indexes = selectionModel()->selectedIndexes(); if (indexes.count() > 0) @@ -585,13 +606,14 @@ void CategorizedView::startDrag(Qt::DropActions supportedActions) QRect rect; QPixmap pixmap = renderToPixmap(indexes, &rect); rect.translate(offset()); - //rect.adjust(horizontalOffset(), verticalOffset(), 0, 0); + // rect.adjust(horizontalOffset(), verticalOffset(), 0, 0); QDrag *drag = new QDrag(this); drag->setPixmap(pixmap); drag->setMimeData(data); drag->setHotSpot(m_pressedPosition - rect.topLeft()); Qt::DropAction defaultDropAction = Qt::IgnoreAction; - if (this->defaultDropAction() != Qt::IgnoreAction && (supportedActions & this->defaultDropAction())) + if (this->defaultDropAction() != Qt::IgnoreAction && + (supportedActions & this->defaultDropAction())) { defaultDropAction = this->defaultDropAction(); } @@ -599,7 +621,8 @@ void CategorizedView::startDrag(Qt::DropActions supportedActions) { const QItemSelection selection = selectionModel()->selection(); - for (auto it = selection.constBegin(); it != selection.constEnd(); ++it) { + for (auto it = selection.constBegin(); it != selection.constEnd(); ++it) + { QModelIndex parent = (*it).parent(); if ((*it).left() != 0) { @@ -616,21 +639,21 @@ void CategorizedView::startDrag(Qt::DropActions supportedActions) } } -QRect CategorizedView::visualRect(const QModelIndex &index) const +QRect GroupView::visualRect(const QModelIndex &index) const { if (!index.isValid() || isIndexHidden(index) || index.column() > 0) { return QRect(); } - const CategorizedViewCategory *cat = category(index); + const Group *cat = category(index); QPair pos = categoryInternalPosition(index); int x = pos.first; int y = pos.second; QRect out; out.setTop(cat->top() + cat->headerHeight() + 5 + categoryInternalRowTop(index)); - out.setLeft(spacing() + x * itemWidth() + x * spacing()); + out.setLeft(/*spacing*/ 10 + x * itemWidth() + x * /*spacing()*/ 10); out.setSize(itemDelegate()->sizeHint(viewOptions(), index)); return out; @@ -649,7 +672,8 @@ void CategorizedView::startCategoryEditor(Category *category) m_categoryEditor->setGeometry(rect); m_categoryEditor->show(); m_categoryEditor->setFocus(); - connect(m_categoryEditor, &QLineEdit::returnPressed, this, &CategorizedView::endCategoryEditor); + connect(m_categoryEditor, &QLineEdit::returnPressed, this, +&CategorizedView::endCategoryEditor); } void CategorizedView::endCategoryEditor() @@ -662,7 +686,8 @@ void CategorizedView::endCategoryEditor() m_updatesDisabled = true; foreach (const QModelIndex &index, itemsForCategory(m_editedCategory)) { - const_cast(index.model())->setData(index, m_categoryEditor->text(), CategoryRole); + const_cast(index.model())->setData(index, +m_categoryEditor->text(), CategoryRole); } m_updatesDisabled = false; delete m_categoryEditor; @@ -672,7 +697,7 @@ void CategorizedView::endCategoryEditor() } */ -QModelIndex CategorizedView::indexAt(const QPoint &point) const +QModelIndex GroupView::indexAt(const QPoint &point) const { for (int i = 0; i < model()->rowCount(); ++i) { @@ -684,7 +709,9 @@ QModelIndex CategorizedView::indexAt(const QPoint &point) const } return QModelIndex(); } -void CategorizedView::setSelection(const QRect &rect, const QItemSelectionModel::SelectionFlags commands) + +void GroupView::setSelection(const QRect &rect, + const QItemSelectionModel::SelectionFlags commands) { for (int i = 0; i < model()->rowCount(); ++i) { @@ -697,10 +724,10 @@ void CategorizedView::setSelection(const QRect &rect, const QItemSelectionModel: update(); } -QPixmap CategorizedView::renderToPixmap(const QModelIndexList &indices, QRect *r) const +QPixmap GroupView::renderToPixmap(const QModelIndexList &indices, QRect *r) const { Q_ASSERT(r); - QList > paintPairs = draggablePaintPairs(indices, r); + auto paintPairs = draggablePaintPairs(indices, r); if (paintPairs.isEmpty()) { return QPixmap(); @@ -718,16 +745,20 @@ QPixmap CategorizedView::renderToPixmap(const QModelIndexList &indices, QRect *r } return pixmap; } -QList > CategorizedView::draggablePaintPairs(const QModelIndexList &indices, QRect *r) const + +QList> +GroupView::draggablePaintPairs(const QModelIndexList &indices, QRect *r) const { Q_ASSERT(r); QRect &rect = *r; const QRect viewportRect = viewport()->rect(); - QList > ret; - for (int i = 0; i < indices.count(); ++i) { + QList> ret; + for (int i = 0; i < indices.count(); ++i) + { const QModelIndex &index = indices.at(i); const QRect current = visualRect(index); - if (current.intersects(viewportRect)) { + if (current.intersects(viewportRect)) + { ret += qMakePair(current, index); rect |= current; } @@ -736,7 +767,7 @@ QList > CategorizedView::draggablePaintPairs(const QMo return ret; } -bool CategorizedView::isDragEventAccepted(QDropEvent *event) +bool GroupView::isDragEventAccepted(QDropEvent *event) { if (event->source() != this) { @@ -746,19 +777,21 @@ bool CategorizedView::isDragEventAccepted(QDropEvent *event) { return false; } - if (!model()->canDropMimeData(event->mimeData(), event->dropAction(), rowDropPos(event->pos()).second, 0, QModelIndex())) + if (!model()->canDropMimeData(event->mimeData(), event->dropAction(), + rowDropPos(event->pos()).second, 0, QModelIndex())) { return false; } return true; } -QPair CategorizedView::rowDropPos(const QPoint &pos) + +QPair GroupView::rowDropPos(const QPoint &pos) { // check that we aren't on a category header and calculate which category we're in - CategorizedViewCategory *category = 0; + Group *category = 0; { int y = 0; - foreach (CategorizedViewCategory *cat, m_categories) + foreach(Group * cat, m_categories) { if (pos.y() > y && pos.y() < (y + cat->headerHeight())) { @@ -789,12 +822,9 @@ QPair CategorizedView::rowDropPos(const QPoint & } else { - for (int i = 0, c = 0; - i < contentWidth(); - i += itemWidth + spacing(), ++c) + for (int i = 0, c = 0; i < contentWidth(); i += itemWidth + 10 /*spacing()*/, ++c) { - if (pos.x() > (i - itemWidth / 2) && - pos.x() <= (i + itemWidth / 2)) + if (pos.x() > (i - itemWidth / 2) && pos.x() <= (i + itemWidth / 2)) { internalColumn = c; break; @@ -812,7 +842,8 @@ QPair CategorizedView::rowDropPos(const QPoint & { // FIXME rework the drag and drop code const int top = category->top(); - for (int r = 0, h = top; r < category->numRows(); h += itemHeightForCategoryRow(category, r), ++r) + for (int r = 0, h = top; r < category->numRows(); + h += itemHeightForCategoryRow(category, r), ++r) { if (pos.y() > h && pos.y() < (h + itemHeightForCategoryRow(category, r))) { @@ -844,7 +875,7 @@ QPair CategorizedView::rowDropPos(const QPoint & return qMakePair(category, indices.at(categoryRow).row()); } -QPoint CategorizedView::offset() const +QPoint GroupView::offset() const { return QPoint(horizontalOffset(), verticalOffset()); } diff --git a/CategorizedView.h b/GroupView.h similarity index 68% rename from CategorizedView.h rename to GroupView.h index 0550c7f8..e949d892 100644 --- a/CategorizedView.h +++ b/GroupView.h @@ -1,5 +1,4 @@ -#ifndef WIDGET_H -#define WIDGET_H +#pragma once #include #include @@ -14,22 +13,25 @@ struct CategorizedViewRoles }; }; -struct CategorizedViewCategory; +struct Group; -class CategorizedView : public QListView +class GroupView : public QListView { Q_OBJECT public: - CategorizedView(QWidget *parent = 0); - ~CategorizedView(); + GroupView(QWidget *parent = 0); + ~GroupView(); virtual QRect visualRect(const QModelIndex &index) const; QModelIndex indexAt(const QPoint &point) const; - void setSelection(const QRect &rect, const QItemSelectionModel::SelectionFlags commands) override; + void setSelection(const QRect &rect, + const QItemSelectionModel::SelectionFlags commands) override; -protected slots: - void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector &roles); +protected +slots: + void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, + const QVector &roles); virtual void rowsInserted(const QModelIndex &parent, int start, int end); virtual void rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end); virtual void updateGeometries(); @@ -51,20 +53,20 @@ protected: void startDrag(Qt::DropActions supportedActions) override; private: - friend struct CategorizedViewCategory; + friend struct Group; - QList m_categories; + QList m_categories; int m_leftMargin; int m_rightMargin; int m_bottomMargin; int m_categoryMargin; - //bool m_updatesDisabled; + // bool m_updatesDisabled; - CategorizedViewCategory *category(const QModelIndex &index) const; - CategorizedViewCategory *category(const QString &cat) const; - CategorizedViewCategory *categoryAt(const QPoint &pos) const; + Group *category(const QModelIndex &index) const; + Group *category(const QString &cat) const; + Group *categoryAt(const QPoint &pos) const; int itemsPerRow() const; int contentWidth() const; @@ -84,22 +86,22 @@ private: QPoint m_pressedPosition; QPersistentModelIndex m_pressedIndex; bool m_pressedAlreadySelected; - CategorizedViewCategory *m_pressedCategory; + Group *m_pressedCategory; QItemSelectionModel::SelectionFlag m_ctrlDragSelectionFlag; QPoint m_lastDragPosition; QPair categoryInternalPosition(const QModelIndex &index) const; int categoryInternalRowTop(const QModelIndex &index) const; - int itemHeightForCategoryRow(const CategorizedViewCategory *category, const int internalRow) const; + int itemHeightForCategoryRow(const Group *category, + const int internalRow) const; QPixmap renderToPixmap(const QModelIndexList &indices, QRect *r) const; - QList > draggablePaintPairs(const QModelIndexList &indices, QRect *r) const; + QList> draggablePaintPairs(const QModelIndexList &indices, + QRect *r) const; bool isDragEventAccepted(QDropEvent *event); - QPair rowDropPos(const QPoint &pos); + QPair rowDropPos(const QPoint &pos); QPoint offset() const; }; - -#endif // WIDGET_H diff --git a/CategorizedProxyModel.cpp b/GroupedProxyModel.cpp similarity index 55% rename from CategorizedProxyModel.cpp rename to GroupedProxyModel.cpp index efcf13c8..ab00a412 100644 --- a/CategorizedProxyModel.cpp +++ b/GroupedProxyModel.cpp @@ -1,12 +1,12 @@ -#include "CategorizedProxyModel.h" +#include "GroupedProxyModel.h" -#include "CategorizedView.h" +#include "GroupView.h" -CategorizedProxyModel::CategorizedProxyModel(QObject *parent) - : QSortFilterProxyModel(parent) +GroupedProxyModel::GroupedProxyModel(QObject *parent) : QSortFilterProxyModel(parent) { } -bool CategorizedProxyModel::lessThan(const QModelIndex &left, const QModelIndex &right) const + +bool GroupedProxyModel::lessThan(const QModelIndex &left, const QModelIndex &right) const { const QString leftCategory = left.data(CategorizedViewRoles::CategoryRole).toString(); const QString rightCategory = right.data(CategorizedViewRoles::CategoryRole).toString(); diff --git a/GroupedProxyModel.h b/GroupedProxyModel.h new file mode 100644 index 00000000..cae87ecd --- /dev/null +++ b/GroupedProxyModel.h @@ -0,0 +1,14 @@ +#pragma once + +#include + +class GroupedProxyModel : public QSortFilterProxyModel +{ + Q_OBJECT + +public: + GroupedProxyModel(QObject *parent = 0); + +protected: + bool lessThan(const QModelIndex &left, const QModelIndex &right) const; +}; diff --git a/InstanceDelegate.cpp b/InstanceDelegate.cpp index 50cead55..056db99d 100644 --- a/InstanceDelegate.cpp +++ b/InstanceDelegate.cpp @@ -20,7 +20,7 @@ #include #include -#include "CategorizedView.h" +#include "GroupView.h" // Origin: Qt static void viewItemTextLayout(QTextLayout &textLayout, int lineWidth, qreal &height, @@ -88,7 +88,8 @@ void drawFocusRect(QPainter *painter, const QStyleOptionViewItemV4 &option, cons } // TODO this can be made a lot prettier -void drawProgressOverlay(QPainter *painter, const QStyleOptionViewItemV4 &option, const int value, const int maximum) +void drawProgressOverlay(QPainter *painter, const QStyleOptionViewItemV4 &option, + const int value, const int maximum) { if (maximum == 0 || value == maximum) { @@ -251,7 +252,8 @@ void ListViewDelegate::paint(QPainter *painter, const QStyleOptionViewItem &opti line.draw(painter, position); } - drawProgressOverlay(painter, opt, index.data(CategorizedViewRoles::ProgressValueRole).toInt(), + drawProgressOverlay(painter, opt, + index.data(CategorizedViewRoles::ProgressValueRole).toInt(), index.data(CategorizedViewRoles::ProgressMaximumRole).toInt()); painter->restore(); diff --git a/InstanceDelegate.h b/InstanceDelegate.h index 6f924405..de2f429b 100644 --- a/InstanceDelegate.h +++ b/InstanceDelegate.h @@ -20,8 +20,10 @@ class ListViewDelegate : public QStyledItemDelegate { public: - explicit ListViewDelegate ( QObject* parent = 0 ); + explicit ListViewDelegate(QObject *parent = 0); + protected: - void paint ( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) const; - QSize sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const; + void paint(QPainter *painter, const QStyleOptionViewItem &option, + const QModelIndex &index) const; + QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const; }; diff --git a/main.cpp b/main.cpp index bd6a44f9..b9ecde8f 100644 --- a/main.cpp +++ b/main.cpp @@ -5,8 +5,8 @@ #include #include -#include "CategorizedView.h" -#include "CategorizedProxyModel.h" +#include "GroupView.h" +#include "GroupedProxyModel.h" #include "InstanceDelegate.h" Progresser *progresser; @@ -25,18 +25,20 @@ QPixmap icon(const int number) font.setBold(true); font.setPixelSize(28); painter.setFont(font); - painter.drawText(QRect(QPoint(0, 0), p.size()), Qt::AlignVCenter | Qt::AlignHCenter, QString::number(number)); + painter.drawText(QRect(QPoint(0, 0), p.size()), Qt::AlignVCenter | Qt::AlignHCenter, + QString::number(number)); painter.end(); return p; } -QStandardItem *createItem(const Qt::GlobalColor color, const QString &text, const QString &category) +QStandardItem *createItem(const Qt::GlobalColor color, const QString &text, + const QString &category) { QStandardItem *item = new QStandardItem; item->setText(text); item->setData(icon(color), Qt::DecorationRole); item->setData(category, CategorizedViewRoles::CategoryRole); item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); - //progresser->addTrackedIndex(item); + // progresser->addTrackedIndex(item); return item; } QStandardItem *createItem(const int index, const QString &category) @@ -46,7 +48,7 @@ QStandardItem *createItem(const int index, const QString &category) item->setData(icon(index), Qt::DecorationRole); item->setData(category, CategorizedViewRoles::CategoryRole); item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); - //progresser->addTrackedIndex(item); + // progresser->addTrackedIndex(item); return item; } @@ -62,7 +64,10 @@ int main(int argc, char *argv[]) model.setRowCount(10); model.setColumnCount(1); - model.setItem(0, createItem(Qt::red, "Red is a color. Some more text. I'm out of ideas. 42. What's your name?", "Colorful")); + model.setItem( + 0, createItem(Qt::red, + "Red is a color. Some more text. I'm out of ideas. 42. What's your name?", + "Colorful")); model.setItem(1, createItem(Qt::blue, "Blue", "Colorful")); model.setItem(2, createItem(Qt::yellow, "Yellow", "Colorful")); @@ -77,13 +82,13 @@ int main(int argc, char *argv[]) for (int i = 0; i < 20; ++i) { - model.setItem(i + 10, createItem(i+1, "Items 1-20")); + model.setItem(i + 10, createItem(i + 1, "Items 1-20")); } - CategorizedProxyModel pModel; + GroupedProxyModel pModel; pModel.setSourceModel(&model); - CategorizedView w; + GroupView w; w.setItemDelegate(new ListViewDelegate); w.setModel(&pModel); w.resize(640, 480); diff --git a/main.h b/main.h index f4c7a3f8..a1e7f432 100644 --- a/main.h +++ b/main.h @@ -1,5 +1,4 @@ -#ifndef MAIN_H -#define MAIN_H +#pragma once #include #include @@ -7,7 +6,7 @@ #include #include -#include "CategorizedView.h" +#include "GroupView.h" class Progresser : public QObject { @@ -27,10 +26,11 @@ public: return item; } -public slots: +public +slots: void timeout() { - foreach (QStandardItem *item, m_items) + foreach(QStandardItem * item, m_items) { int value = item->data(CategorizedViewRoles::ProgressValueRole).toInt(); value += qrand() % 3; @@ -49,5 +49,3 @@ public slots: private: QList m_items; }; - -#endif // MAIN_H