cart: support sorting by drag&drop or dialog

This commit is contained in:
Le Tan 2018-03-16 21:37:31 +08:00
parent eb4d2a7ba3
commit 407658bead
6 changed files with 83 additions and 5 deletions

View File

@ -378,13 +378,11 @@ void VAttachmentList::sortItems()
QTreeWidget *tree = dialog.getTreeWidget(); QTreeWidget *tree = dialog.getTreeWidget();
tree->clear(); tree->clear();
tree->setColumnCount(1); tree->setColumnCount(1);
QStringList headers; QStringList headers(tr("Name"));
headers << tr("Name");
tree->setHeaderLabels(headers); tree->setHeaderLabels(headers);
for (int i = 0; i < attas.size(); ++i) { for (int i = 0; i < attas.size(); ++i) {
QTreeWidgetItem *item = new QTreeWidgetItem(tree, QStringList(attas[i].m_name)); QTreeWidgetItem *item = new QTreeWidgetItem(tree, QStringList(attas[i].m_name));
item->setData(0, Qt::UserRole, i); item->setData(0, Qt::UserRole, i);
} }

View File

@ -7,6 +7,8 @@
#include "vmainwindow.h" #include "vmainwindow.h"
#include "vnote.h" #include "vnote.h"
#include "vnotefile.h" #include "vnotefile.h"
#include "vlistwidget.h"
#include "dialog/vsortdialog.h"
extern VMainWindow *g_mainWin; extern VMainWindow *g_mainWin;
@ -54,6 +56,7 @@ void VCart::setupUI()
m_itemList->setAttribute(Qt::WA_MacShowFocusRect, false); m_itemList->setAttribute(Qt::WA_MacShowFocusRect, false);
m_itemList->setContextMenuPolicy(Qt::CustomContextMenu); m_itemList->setContextMenuPolicy(Qt::CustomContextMenu);
m_itemList->setSelectionMode(QAbstractItemView::ExtendedSelection); m_itemList->setSelectionMode(QAbstractItemView::ExtendedSelection);
m_itemList->setDragDropMode(QAbstractItemView::InternalMove);
connect(m_itemList, &QListWidget::customContextMenuRequested, connect(m_itemList, &QListWidget::customContextMenuRequested,
this, &VCart::handleContextMenuRequested); this, &VCart::handleContextMenuRequested);
connect(m_itemList, &QListWidget::itemActivated, connect(m_itemList, &QListWidget::itemActivated,
@ -87,6 +90,13 @@ void VCart::initActions()
m_deleteAct->setToolTip(tr("Delete selected items from Cart")); m_deleteAct->setToolTip(tr("Delete selected items from Cart"));
connect(m_deleteAct, &QAction::triggered, connect(m_deleteAct, &QAction::triggered,
this, &VCart::deleteSelectedItems); this, &VCart::deleteSelectedItems);
m_sortAct = new QAction(VIconUtils::menuIcon(":/resources/icons/sort.svg"),
tr("&Sort"),
this);
m_sortAct->setToolTip(tr("Sort items in Cart"));
connect(m_sortAct, &QAction::triggered,
this, &VCart::sortItems);
} }
void VCart::handleContextMenuRequested(QPoint p_pos) void VCart::handleContextMenuRequested(QPoint p_pos)
@ -105,9 +115,17 @@ void VCart::handleContextMenuRequested(QPoint p_pos)
menu.addAction(m_deleteAct); menu.addAction(m_deleteAct);
} }
if (!menu.actions().isEmpty()) { if (m_itemList->count() == 0) {
menu.exec(m_itemList->mapToGlobal(p_pos)); return;
} }
if (!menu.actions().isEmpty()) {
menu.addSeparator();
}
menu.addAction(m_sortAct);
menu.exec(m_itemList->mapToGlobal(p_pos));
} }
void VCart::addFile(const QString &p_filePath) void VCart::addFile(const QString &p_filePath)
@ -207,3 +225,41 @@ QVector<QString> VCart::getFiles() const
return files; return files;
} }
void VCart::sortItems()
{
if (m_itemList->count() < 2) {
return;
}
VSortDialog dialog(tr("Sort Cart"),
tr("Sort items in Cart."),
this);
QTreeWidget *tree = dialog.getTreeWidget();
tree->clear();
tree->setColumnCount(1);
QStringList headers(tr("Name"));
tree->setHeaderLabels(headers);
int cnt = m_itemList->count();
for (int i = 0; i < cnt; ++i) {
QListWidgetItem *it = m_itemList->item(i);
QTreeWidgetItem *item = new QTreeWidgetItem(tree,
QStringList(it->text()));
item->setToolTip(0, getFilePath(it));
item->setData(0, Qt::UserRole, i);
}
dialog.treeUpdated();
if (dialog.exec()) {
QVector<QVariant> data = dialog.getSortedData();
Q_ASSERT(data.size() == cnt);
QVector<int> sortedIdx(data.size(), -1);
for (int i = 0; i < data.size(); ++i) {
sortedIdx[i] = data[i].toInt();
}
VListWidget::sortListWidget(m_itemList, sortedIdx);
}
}

View File

@ -37,6 +37,8 @@ private slots:
void locateCurrentItem(); void locateCurrentItem();
void sortItems();
private: private:
void setupUI(); void setupUI();
@ -56,6 +58,7 @@ private:
QAction *m_openAct; QAction *m_openAct;
QAction *m_locateAct; QAction *m_locateAct;
QAction *m_deleteAct; QAction *m_deleteAct;
QAction *m_sortAct;
}; };
#endif // VCART_H #endif // VCART_H

View File

@ -142,3 +142,19 @@ void VListWidget::selectNextItem(bool p_forward)
Q_UNUSED(p_forward); Q_UNUSED(p_forward);
Q_ASSERT(false); Q_ASSERT(false);
} }
void VListWidget::sortListWidget(QListWidget *p_list, const QVector<int> &p_sortedIdx)
{
int cnt = p_list->count();
Q_ASSERT(cnt == p_sortedIdx.size());
QVector<QListWidgetItem *> sortedItems(cnt);
for (int i = 0; i < cnt; ++i) {
sortedItems[i] = p_list->item(p_sortedIdx[i]);
}
for (int i = 0; i < cnt; ++i) {
QListWidgetItem *it = p_list->takeItem(p_list->row(sortedItems[i]));
p_list->insertItem(i, it);
}
}

View File

@ -2,6 +2,7 @@
#define VLISTWIDGET_H #define VLISTWIDGET_H
#include <QListWidget> #include <QListWidget>
#include <QVector>
#include "vsimplesearchinput.h" #include "vsimplesearchinput.h"
@ -31,6 +32,9 @@ public:
virtual void selectNextItem(bool p_forward) Q_DECL_OVERRIDE; virtual void selectNextItem(bool p_forward) Q_DECL_OVERRIDE;
// Sort @p_list according to @p_sortedIdx.
static void sortListWidget(QListWidget *p_list, const QVector<int> &p_sortedIdx);
private slots: private slots:
void handleSearchModeTriggered(bool p_inSearchMode); void handleSearchModeTriggered(bool p_inSearchMode);

View File

@ -99,6 +99,7 @@ void VSearcher::setupUI()
m_keywordCB->setEditable(true); m_keywordCB->setEditable(true);
m_keywordCB->setLineEdit(new VLineEdit(this)); m_keywordCB->setLineEdit(new VLineEdit(this));
m_keywordCB->setToolTip(tr("Keywords to search for")); m_keywordCB->setToolTip(tr("Keywords to search for"));
m_keywordCB->lineEdit()->setPlaceholderText(tr("Supports space, &&, and ||"));
connect(m_keywordCB, &QComboBox::currentTextChanged, connect(m_keywordCB, &QComboBox::currentTextChanged,
this, &VSearcher::handleInputChanged); this, &VSearcher::handleInputChanged);
connect(m_keywordCB->lineEdit(), &QLineEdit::returnPressed, connect(m_keywordCB->lineEdit(), &QLineEdit::returnPressed,