mirror of
https://gitee.com/vnotex/vnote.git
synced 2025-07-05 13:59:52 +08:00
248 lines
6.3 KiB
C++
248 lines
6.3 KiB
C++
#include "vlistue.h"
|
|
|
|
#include <QListWidgetItem>
|
|
#include <QLabel>
|
|
#include <QVBoxLayout>
|
|
|
|
#include "vlistwidgetdoublerows.h"
|
|
#include "vdirectory.h"
|
|
#include "vdirectorytree.h"
|
|
#include "vmainwindow.h"
|
|
#include "vnote.h"
|
|
#include "utils/viconutils.h"
|
|
#include "vnotefile.h"
|
|
#include "vsearchue.h"
|
|
#include "utils/vutils.h"
|
|
#include "vnotebook.h"
|
|
#include "vuetitlecontentpanel.h"
|
|
#include "vhistorylist.h"
|
|
#include "vuniversalentry.h"
|
|
|
|
extern VMainWindow *g_mainWin;
|
|
|
|
extern VNote *g_vnote;
|
|
|
|
VListUE::VListUE(QObject *p_parent)
|
|
: IUniversalEntry(p_parent),
|
|
m_listWidget(NULL)
|
|
{
|
|
}
|
|
|
|
QString VListUE::description(int p_id) const
|
|
{
|
|
switch (p_id) {
|
|
case ID::History:
|
|
return tr("List and search history");
|
|
|
|
default:
|
|
Q_ASSERT(false);
|
|
return tr("Invalid ID %1").arg(p_id);
|
|
}
|
|
}
|
|
|
|
void VListUE::init()
|
|
{
|
|
if (m_initialized) {
|
|
return;
|
|
}
|
|
|
|
m_initialized = true;
|
|
|
|
m_noteIcon = VIconUtils::treeViewIcon(":/resources/icons/note_item.svg");
|
|
m_folderIcon = VIconUtils::treeViewIcon(":/resources/icons/dir_item.svg");
|
|
|
|
m_listWidget = new VListWidgetDoubleRows(m_widgetParent);
|
|
m_listWidget->setFitContent(true);
|
|
connect(m_listWidget, SIGNAL(itemActivated(QListWidgetItem *)),
|
|
this, SLOT(activateItem(QListWidgetItem *)));
|
|
|
|
m_panel = new VUETitleContentPanel(m_listWidget, m_widgetParent);
|
|
m_panel->hide();
|
|
}
|
|
|
|
QWidget *VListUE::widget(int p_id)
|
|
{
|
|
Q_UNUSED(p_id);
|
|
|
|
init();
|
|
|
|
return m_panel;
|
|
}
|
|
|
|
void VListUE::processCommand(int p_id, const QString &p_cmd)
|
|
{
|
|
Q_UNUSED(p_id);
|
|
|
|
init();
|
|
|
|
clear(-1);
|
|
|
|
switch (p_id) {
|
|
case ID::History:
|
|
listHistory(p_cmd);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
m_listWidget->updateGeometry();
|
|
emit widgetUpdated();
|
|
emit stateUpdated(State::Success);
|
|
}
|
|
|
|
void VListUE::clear(int p_id)
|
|
{
|
|
Q_UNUSED(p_id);
|
|
|
|
m_panel->clearTitle();
|
|
m_listWidget->clearAll();
|
|
m_data.clear();
|
|
}
|
|
|
|
void VListUE::selectNextItem(int p_id, bool p_forward)
|
|
{
|
|
Q_UNUSED(p_id);
|
|
|
|
m_listWidget->selectNextItem(p_forward);
|
|
}
|
|
|
|
void VListUE::activate(int p_id)
|
|
{
|
|
Q_UNUSED(p_id);
|
|
activateItem(m_listWidget->currentItem());
|
|
}
|
|
|
|
const QSharedPointer<VSearchResultItem> &VListUE::itemResultData(const QListWidgetItem *p_item) const
|
|
{
|
|
Q_ASSERT(p_item);
|
|
int idx = p_item->data(Qt::UserRole).toInt();
|
|
Q_ASSERT(idx >= 0 && idx < m_data.size());
|
|
return m_data[idx];
|
|
}
|
|
|
|
void VListUE::activateItem(QListWidgetItem *p_item)
|
|
{
|
|
if (!p_item) {
|
|
return;
|
|
}
|
|
|
|
emit requestHideUniversalEntry();
|
|
|
|
VSearchUE::activateItem(itemResultData(p_item));
|
|
}
|
|
|
|
void VListUE::sort(int p_id)
|
|
{
|
|
Q_UNUSED(p_id);
|
|
static bool noteFirst = false;
|
|
|
|
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;
|
|
}
|
|
|
|
void VListUE::addResultItem(const QSharedPointer<VSearchResultItem> &p_item)
|
|
{
|
|
m_data.append(p_item);
|
|
|
|
QString first, second;
|
|
if (p_item->m_text.isEmpty()) {
|
|
first = p_item->m_path;
|
|
} else {
|
|
if (p_item->m_type != VSearchResultItem::Notebook) {
|
|
first = VUniversalEntry::fileNameWithDir(p_item->m_text, p_item->m_path);
|
|
} else {
|
|
first = p_item->m_text;
|
|
}
|
|
second = p_item->m_path;
|
|
}
|
|
|
|
QIcon *icon = NULL;
|
|
switch (p_item->m_type) {
|
|
case VSearchResultItem::Note:
|
|
icon = &m_noteIcon;
|
|
break;
|
|
|
|
case VSearchResultItem::Folder:
|
|
icon = &m_folderIcon;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
QListWidgetItem *item = m_listWidget->addDoubleRowsItem(*icon, first, second);
|
|
item->setData(Qt::UserRole, m_data.size() - 1);
|
|
item->setToolTip(p_item->m_path);
|
|
|
|
if (m_listWidget->count() == 1) {
|
|
m_listWidget->setCurrentRow(0);
|
|
}
|
|
}
|
|
|
|
void VListUE::listHistory(const QString &p_cmd)
|
|
{
|
|
m_panel->setTitle(tr("History"));
|
|
|
|
VHistoryList *history = g_mainWin->getHistoryList();
|
|
const QLinkedList<VHistoryEntry> &entries = history->getHistoryEntries();
|
|
if (p_cmd.isEmpty()) {
|
|
// List the content.
|
|
for (auto it = entries.rbegin(); it != entries.rend(); ++it) {
|
|
QSharedPointer<VSearchResultItem> item(new VSearchResultItem(it->m_isFolder ? VSearchResultItem::Folder : VSearchResultItem::Note,
|
|
VSearchResultItem::LineNumber,
|
|
VUtils::fileNameFromPath(it->m_file),
|
|
it->m_file));
|
|
addResultItem(item);
|
|
}
|
|
} else {
|
|
// Search the content.
|
|
VSearchConfig config(VSearchConfig::CurrentFolder,
|
|
VSearchConfig::Name,
|
|
VSearchConfig::Note | VSearchConfig::Folder,
|
|
VSearchConfig::Internal,
|
|
VSearchConfig::NoneOption,
|
|
p_cmd,
|
|
QString());
|
|
|
|
for (auto it = entries.rbegin(); it != entries.rend(); ++it) {
|
|
QString name = VUtils::fileNameFromPath(it->m_file);
|
|
if (!config.m_token.matched(name)) {
|
|
continue;
|
|
}
|
|
|
|
QSharedPointer<VSearchResultItem> item(new VSearchResultItem(it->m_isFolder ? VSearchResultItem::Folder : VSearchResultItem::Note,
|
|
VSearchResultItem::LineNumber,
|
|
name,
|
|
it->m_file));
|
|
addResultItem(item);
|
|
}
|
|
}
|
|
}
|