| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257 |
- #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);
- }
- }
|