UniversalEntry: Ctrl+S to sort items

This commit is contained in:
Le Tan 2018-04-01 12:33:02 +08:00
parent 31dbdbfe4d
commit 0749ce178e
8 changed files with 112 additions and 23 deletions

View File

@ -74,6 +74,11 @@ public:
Q_UNUSED(p_id); Q_UNUSED(p_id);
} }
virtual void sort(int p_id)
{
Q_UNUSED(p_id);
}
void setWidgetParent(QWidget *p_parent) void setWidgetParent(QWidget *p_parent)
{ {
m_widgetParent = p_parent; m_widgetParent = p_parent;

View File

@ -35,3 +35,12 @@ void VDoubleRowItemWidget::setText(const QString &p_firstText,
m_secondLabel->hide(); m_secondLabel->hide();
} }
} }
VDoubleRowItemWidget *VDoubleRowItemWidget::cloneWidget(VDoubleRowItemWidget *p_widget,
QWidget *p_parent)
{
VDoubleRowItemWidget *widget = new VDoubleRowItemWidget(p_parent);
widget->setText(p_widget->m_firstLabel->text(), p_widget->m_secondLabel->text());
return widget;
}

View File

@ -13,6 +13,9 @@ public:
void setText(const QString &p_firstText, const QString &p_secondText); void setText(const QString &p_firstText, const QString &p_secondText);
static VDoubleRowItemWidget *cloneWidget(VDoubleRowItemWidget *p_widget,
QWidget *p_parent = nullptr);
private: private:
QLabel *m_firstLabel; QLabel *m_firstLabel;
QLabel *m_secondLabel; QLabel *m_secondLabel;

View File

@ -2,6 +2,7 @@
#include <QListWidgetItem> #include <QListWidgetItem>
#include <QScrollBar> #include <QScrollBar>
#include <QDebug>
#include "vdoublerowitemwidget.h" #include "vdoublerowitemwidget.h"
@ -10,14 +11,7 @@ VListWidgetDoubleRows::VListWidgetDoubleRows(QWidget *p_parent)
{ {
} }
QListWidgetItem *VListWidgetDoubleRows::addItem(const QIcon &p_icon, QListWidgetItem *VListWidgetDoubleRows::insertDoubleRowsItem(int p_row,
const QString &p_firstRow,
const QString &p_secondRow)
{
return VListWidgetDoubleRows::insertItem(count(), p_icon, p_firstRow, p_secondRow);
}
QListWidgetItem *VListWidgetDoubleRows::insertItem(int p_row,
const QIcon &p_icon, const QIcon &p_icon,
const QString &p_firstRow, const QString &p_firstRow,
const QString &p_secondRow) const QString &p_secondRow)
@ -42,8 +36,8 @@ QListWidgetItem *VListWidgetDoubleRows::insertItem(int p_row,
item->setSizeHint(sz); item->setSizeHint(sz);
VListWidget::insertItem(p_row, item); insertItem(p_row, item);
VListWidget::setItemWidget(item, itemWidget); setItemWidget(item, itemWidget);
return item; return item;
} }
@ -52,8 +46,9 @@ void VListWidgetDoubleRows::clearAll()
// Delete the item widget for each item. // Delete the item widget for each item.
int cnt = count(); int cnt = count();
for (int i = 0; i < cnt; ++i) { for (int i = 0; i < cnt; ++i) {
QWidget *wid = itemWidget(item(i)); QListWidgetItem *it = item(i);
removeItemWidget(item(i)); QWidget *wid = itemWidget(it);
removeItemWidget(it);
delete wid; delete wid;
} }
@ -61,3 +56,20 @@ void VListWidgetDoubleRows::clearAll()
setIconSize(QSize()); setIconSize(QSize());
} }
void VListWidgetDoubleRows::moveItem(int p_srcRow, int p_destRow)
{
QListWidgetItem *it = item(p_srcRow);
QWidget *wid = itemWidget(it);
takeItem(p_srcRow);
insertItem(p_destRow, it);
if (wid) {
QWidget *newWid = VDoubleRowItemWidget::cloneWidget(static_cast<VDoubleRowItemWidget *>(wid), this);
removeItemWidget(it);
delete wid;
setItemWidget(it, newWid);
}
}

View File

@ -14,15 +14,13 @@ class VListWidgetDoubleRows : public VListWidget
public: public:
explicit VListWidgetDoubleRows(QWidget *p_parent = nullptr); explicit VListWidgetDoubleRows(QWidget *p_parent = nullptr);
QListWidgetItem *addItem(const QIcon &p_icon, QListWidgetItem *insertDoubleRowsItem(int p_row,
const QString &p_firstRow,
const QString &p_secondRow);
QListWidgetItem *insertItem(int p_row,
const QIcon &p_icon, const QIcon &p_icon,
const QString &p_firstRow, const QString &p_firstRow,
const QString &p_secondRow); const QString &p_secondRow);
void moveItem(int p_srcRow, int p_destRow);
void clearAll() Q_DECL_OVERRIDE; void clearAll() Q_DECL_OVERRIDE;
}; };

View File

@ -642,7 +642,7 @@ void VSearchUE::appendItemToList(const QSharedPointer<VSearchResultItem> &p_item
break; break;
} }
QListWidgetItem *item = m_listWidget->insertItem(row, *icon, first, second); QListWidgetItem *item = m_listWidget->insertDoubleRowsItem(row, *icon, first, second);
item->setData(Qt::UserRole, m_data.size() - 1); item->setData(Qt::UserRole, m_data.size() - 1);
item->setToolTip(p_item->m_path); item->setToolTip(p_item->m_path);
@ -932,3 +932,52 @@ void VSearchUE::toggleItemExpanded(int p_id)
break; break;
} }
} }
void VSearchUE::sort(int p_id)
{
static bool noteFirst = false;
switch (p_id) {
case ID::Name_Notebook_AllNotebook:
case ID::Name_FolderNote_AllNotebook:
case ID::Name_FolderNote_CurrentNotebook:
case ID::Name_FolderNote_CurrentFolder:
case ID::Name_Note_Buffer:
case ID::Path_FolderNote_AllNotebook:
case ID::Path_FolderNote_CurrentNotebook:
{
int cnt = m_listWidget->count();
if (noteFirst) {
int idx = cnt - 1;
while (true) {
if (itemResultData(m_listWidget->item(idx))->m_type != VSearchResultItem::Note) {
// Move it to the first row.
m_listWidget->moveItem(idx, 0);
} else {
break;
}
}
} else {
int idx = 0;
while (true) {
if (itemResultData(m_listWidget->item(idx))->m_type != VSearchResultItem::Note) {
// Move it to the last row.
m_listWidget->moveItem(idx, cnt - 1);
} else {
break;
}
}
}
if (cnt) {
m_listWidget->setCurrentRow(0);
}
noteFirst = !noteFirst;
break;
}
default:
break;
}
}

View File

@ -77,6 +77,8 @@ public:
void toggleItemExpanded(int p_id) Q_DECL_OVERRIDE; void toggleItemExpanded(int p_id) Q_DECL_OVERRIDE;
void sort(int p_id) Q_DECL_OVERRIDE;
protected: protected:
void init() Q_DECL_OVERRIDE; void init() Q_DECL_OVERRIDE;

View File

@ -353,6 +353,17 @@ void VUniversalEntry::keyPressEvent(QKeyEvent *p_event)
return; return;
} }
case Qt::Key_S:
if (VUtils::isControlModifierForVim(modifiers)) {
// Ctrl+S to sort the items.
// UE could just alternate among all the sort modes.
if (m_lastEntry) {
m_lastEntry->m_entry->sort(m_lastEntry->m_id);
}
return;
}
break; break;
default: default: