mirror of
https://gitee.com/vnotex/vnote.git
synced 2025-07-05 13:59:52 +08:00
258 lines
6.2 KiB
C++
258 lines
6.2 KiB
C++
#include "voutlineue.h"
|
|
|
|
#include <QTreeWidgetItem>
|
|
#include <QListWidgetItem>
|
|
|
|
#include "vtreewidget.h"
|
|
#include "vlistwidget.h"
|
|
#include "voutline.h"
|
|
#include "vmainwindow.h"
|
|
#include "vedittab.h"
|
|
#include "veditarea.h"
|
|
#include "vsearchconfig.h"
|
|
#include "vtableofcontent.h"
|
|
|
|
extern VMainWindow *g_mainWin;
|
|
|
|
VOutlineUE::VOutlineUE(QObject *p_parent)
|
|
: IUniversalEntry(p_parent),
|
|
m_listWidget(NULL),
|
|
m_treeWidget(NULL),
|
|
m_listOutline(true)
|
|
{
|
|
}
|
|
|
|
QString VOutlineUE::description(int p_id) const
|
|
{
|
|
Q_UNUSED(p_id);
|
|
|
|
return tr("List and search the outline of current note");
|
|
}
|
|
|
|
void VOutlineUE::init()
|
|
{
|
|
if (m_initialized) {
|
|
return;
|
|
}
|
|
|
|
Q_ASSERT(m_widgetParent);
|
|
|
|
m_initialized = true;
|
|
|
|
m_listWidget = new VListWidget(m_widgetParent);
|
|
m_listWidget->setFitContent(true);
|
|
m_listWidget->hide();
|
|
connect(m_listWidget, SIGNAL(itemActivated(QListWidgetItem *)),
|
|
this, SLOT(activateItem(QListWidgetItem *)));
|
|
|
|
m_treeWidget = new VTreeWidget(m_widgetParent);
|
|
m_treeWidget->setColumnCount(1);
|
|
m_treeWidget->setHeaderHidden(true);
|
|
m_treeWidget->setSelectionMode(QAbstractItemView::SingleSelection);
|
|
m_treeWidget->setExpandsOnDoubleClick(false);
|
|
m_treeWidget->setFitContent(true);
|
|
m_treeWidget->hide();
|
|
|
|
connect(m_treeWidget, SIGNAL(itemActivated(QTreeWidgetItem *, int)),
|
|
this, SLOT(activateItem(QTreeWidgetItem *, int)));
|
|
connect(m_treeWidget, &VTreeWidget::itemExpandedOrCollapsed,
|
|
this, &VOutlineUE::widgetUpdated);
|
|
}
|
|
|
|
QWidget *VOutlineUE::widget(int p_id)
|
|
{
|
|
Q_UNUSED(p_id);
|
|
init();
|
|
|
|
if (m_listOutline) {
|
|
return m_treeWidget;
|
|
} else {
|
|
return m_listWidget;
|
|
}
|
|
}
|
|
|
|
void VOutlineUE::processCommand(int p_id, const QString &p_cmd)
|
|
{
|
|
Q_UNUSED(p_id);
|
|
|
|
init();
|
|
|
|
clear(-1);
|
|
|
|
emit stateUpdated(State::Busy);
|
|
|
|
VEditTab *tab = g_mainWin->getCurrentTab();
|
|
if (p_cmd.isEmpty()) {
|
|
// List the outline.
|
|
m_listOutline = true;
|
|
|
|
if (tab) {
|
|
const VTableOfContent &outline = tab->getOutline();
|
|
VOutline::updateTreeFromOutline(m_treeWidget, outline);
|
|
|
|
VTreeWidget::expandCollapseAll(m_treeWidget);
|
|
|
|
const VHeaderPointer &header = tab->getCurrentHeader();
|
|
if (outline.isMatched(header)) {
|
|
VOutline::selectHeader(m_treeWidget, outline, header);
|
|
}
|
|
}
|
|
} else {
|
|
// Search the outline.
|
|
m_listOutline = false;
|
|
|
|
if (tab) {
|
|
VSearchConfig config(VSearchConfig::CurrentNote,
|
|
VSearchConfig::Content,
|
|
VSearchConfig::Note,
|
|
VSearchConfig::Internal,
|
|
VSearchConfig::NoneOption,
|
|
p_cmd,
|
|
QString());
|
|
|
|
const VTableOfContent &outline = tab->getOutline();
|
|
const QVector<VTableOfContentItem> &table = outline.getTable();
|
|
for (auto const & it : table) {
|
|
if (it.isEmpty()) {
|
|
continue;
|
|
}
|
|
|
|
if (!config.m_token.matched(it.m_name)) {
|
|
continue;
|
|
}
|
|
|
|
// Add item to list.
|
|
QListWidgetItem *item = new QListWidgetItem(it.m_name, m_listWidget);
|
|
item->setData(Qt::UserRole, it.m_index);
|
|
item->setToolTip(it.m_name);
|
|
|
|
if (!m_listWidget->currentItem()) {
|
|
m_listWidget->setCurrentItem(item);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
emit stateUpdated(State::Success);
|
|
updateWidget();
|
|
}
|
|
|
|
void VOutlineUE::updateWidget()
|
|
{
|
|
QWidget *wid = m_listWidget;
|
|
if (m_listOutline) {
|
|
if (m_treeWidget->topLevelItemCount() > 0) {
|
|
m_treeWidget->resizeColumnToContents(0);
|
|
} else {
|
|
QTreeWidgetItem *item = new QTreeWidgetItem(m_treeWidget, QStringList("test"));
|
|
m_treeWidget->resizeColumnToContents(0);
|
|
delete item;
|
|
}
|
|
|
|
wid = m_treeWidget;
|
|
}
|
|
|
|
wid->updateGeometry();
|
|
emit widgetUpdated();
|
|
}
|
|
|
|
void VOutlineUE::clear(int p_id)
|
|
{
|
|
Q_UNUSED(p_id);
|
|
m_treeWidget->clearAll();
|
|
m_listWidget->clearAll();
|
|
}
|
|
|
|
void VOutlineUE::entryHidden(int p_id)
|
|
{
|
|
Q_UNUSED(p_id);
|
|
clear(-1);
|
|
}
|
|
|
|
void VOutlineUE::entryShown(int p_id, const QString &p_cmd)
|
|
{
|
|
processCommand(p_id, p_cmd);
|
|
}
|
|
|
|
void VOutlineUE::selectNextItem(int p_id, bool p_forward)
|
|
{
|
|
Q_UNUSED(p_id);
|
|
|
|
if (m_listOutline) {
|
|
m_treeWidget->selectNextItem(p_forward);
|
|
} else {
|
|
m_listWidget->selectNextItem(p_forward);
|
|
}
|
|
}
|
|
|
|
void VOutlineUE::activate(int p_id)
|
|
{
|
|
Q_UNUSED(p_id);
|
|
if (m_listOutline) {
|
|
activateItem(m_treeWidget->currentItem(), 0);
|
|
} else {
|
|
activateItem(m_listWidget->currentItem());
|
|
}
|
|
}
|
|
|
|
void VOutlineUE::activateItem(QListWidgetItem *p_item)
|
|
{
|
|
if (!p_item) {
|
|
return;
|
|
}
|
|
|
|
int idx = p_item->data(Qt::UserRole).toInt();
|
|
|
|
emit requestHideUniversalEntry();
|
|
|
|
VHeaderPointer hp(g_mainWin->getCurrentFile(), idx);
|
|
g_mainWin->getEditArea()->scrollToHeader(hp);
|
|
}
|
|
|
|
void VOutlineUE::activateItem(QTreeWidgetItem *p_item, int p_col)
|
|
{
|
|
Q_UNUSED(p_col);
|
|
if (!p_item) {
|
|
return;
|
|
}
|
|
|
|
VEditTab *tab = g_mainWin->getCurrentTab();
|
|
Q_ASSERT(tab);
|
|
const VTableOfContent &outline = tab->getOutline();
|
|
const VTableOfContentItem *header = VOutline::getHeaderFromItem(p_item, outline);
|
|
Q_ASSERT(header);
|
|
if (!header->isEmpty()) {
|
|
emit requestHideUniversalEntry();
|
|
|
|
VHeaderPointer hp(outline.getFile(), header->m_index);
|
|
g_mainWin->getEditArea()->scrollToHeader(hp);
|
|
}
|
|
}
|
|
|
|
void VOutlineUE::selectParentItem(int p_id)
|
|
{
|
|
Q_UNUSED(p_id);
|
|
if (m_listOutline) {
|
|
m_treeWidget->selectParentItem();
|
|
}
|
|
}
|
|
|
|
void VOutlineUE::toggleItemExpanded(int p_id)
|
|
{
|
|
Q_UNUSED(p_id);
|
|
if (m_listOutline) {
|
|
QTreeWidgetItem *item = m_treeWidget->currentItem();
|
|
if (item) {
|
|
item->setExpanded(!item->isExpanded());
|
|
}
|
|
}
|
|
}
|
|
|
|
void VOutlineUE::expandCollapseAll(int p_id)
|
|
{
|
|
Q_UNUSED(p_id);
|
|
if (m_listOutline) {
|
|
VTreeWidget::expandCollapseAll(m_treeWidget);
|
|
}
|
|
}
|