voutlineue.cpp 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. #include "voutlineue.h"
  2. #include <QTreeWidgetItem>
  3. #include <QListWidgetItem>
  4. #include "vtreewidget.h"
  5. #include "vlistwidget.h"
  6. #include "voutline.h"
  7. #include "vmainwindow.h"
  8. #include "vedittab.h"
  9. #include "veditarea.h"
  10. #include "vsearchconfig.h"
  11. #include "vtableofcontent.h"
  12. extern VMainWindow *g_mainWin;
  13. VOutlineUE::VOutlineUE(QObject *p_parent)
  14. : IUniversalEntry(p_parent),
  15. m_listWidget(NULL),
  16. m_treeWidget(NULL),
  17. m_listOutline(true)
  18. {
  19. }
  20. QString VOutlineUE::description(int p_id) const
  21. {
  22. Q_UNUSED(p_id);
  23. return tr("List and search the outline of current note");
  24. }
  25. void VOutlineUE::init()
  26. {
  27. if (m_initialized) {
  28. return;
  29. }
  30. Q_ASSERT(m_widgetParent);
  31. m_initialized = true;
  32. m_listWidget = new VListWidget(m_widgetParent);
  33. m_listWidget->setFitContent(true);
  34. m_listWidget->hide();
  35. connect(m_listWidget, SIGNAL(itemActivated(QListWidgetItem *)),
  36. this, SLOT(activateItem(QListWidgetItem *)));
  37. m_treeWidget = new VTreeWidget(m_widgetParent);
  38. m_treeWidget->setColumnCount(1);
  39. m_treeWidget->setHeaderHidden(true);
  40. m_treeWidget->setSelectionMode(QAbstractItemView::SingleSelection);
  41. m_treeWidget->setExpandsOnDoubleClick(false);
  42. m_treeWidget->setFitContent(true);
  43. m_treeWidget->hide();
  44. connect(m_treeWidget, SIGNAL(itemActivated(QTreeWidgetItem *, int)),
  45. this, SLOT(activateItem(QTreeWidgetItem *, int)));
  46. connect(m_treeWidget, &VTreeWidget::itemExpandedOrCollapsed,
  47. this, &VOutlineUE::widgetUpdated);
  48. }
  49. QWidget *VOutlineUE::widget(int p_id)
  50. {
  51. Q_UNUSED(p_id);
  52. init();
  53. if (m_listOutline) {
  54. return m_treeWidget;
  55. } else {
  56. return m_listWidget;
  57. }
  58. }
  59. void VOutlineUE::processCommand(int p_id, const QString &p_cmd)
  60. {
  61. Q_UNUSED(p_id);
  62. init();
  63. clear(-1);
  64. emit stateUpdated(State::Busy);
  65. VEditTab *tab = g_mainWin->getCurrentTab();
  66. if (p_cmd.isEmpty()) {
  67. // List the outline.
  68. m_listOutline = true;
  69. if (tab) {
  70. const VTableOfContent &outline = tab->getOutline();
  71. VOutline::updateTreeFromOutline(m_treeWidget, outline);
  72. VTreeWidget::expandCollapseAll(m_treeWidget);
  73. const VHeaderPointer &header = tab->getCurrentHeader();
  74. if (outline.isMatched(header)) {
  75. VOutline::selectHeader(m_treeWidget, outline, header);
  76. }
  77. }
  78. } else {
  79. // Search the outline.
  80. m_listOutline = false;
  81. if (tab) {
  82. VSearchConfig config(VSearchConfig::CurrentNote,
  83. VSearchConfig::Content,
  84. VSearchConfig::Note,
  85. VSearchConfig::Internal,
  86. VSearchConfig::NoneOption,
  87. p_cmd,
  88. QString());
  89. const VTableOfContent &outline = tab->getOutline();
  90. const QVector<VTableOfContentItem> &table = outline.getTable();
  91. for (auto const & it : table) {
  92. if (it.isEmpty()) {
  93. continue;
  94. }
  95. if (!config.m_token.matched(it.m_name)) {
  96. continue;
  97. }
  98. // Add item to list.
  99. QListWidgetItem *item = new QListWidgetItem(it.m_name, m_listWidget);
  100. item->setData(Qt::UserRole, it.m_index);
  101. item->setToolTip(it.m_name);
  102. if (!m_listWidget->currentItem()) {
  103. m_listWidget->setCurrentItem(item);
  104. }
  105. }
  106. }
  107. }
  108. emit stateUpdated(State::Success);
  109. updateWidget();
  110. }
  111. void VOutlineUE::updateWidget()
  112. {
  113. QWidget *wid = m_listWidget;
  114. if (m_listOutline) {
  115. if (m_treeWidget->topLevelItemCount() > 0) {
  116. m_treeWidget->resizeColumnToContents(0);
  117. } else {
  118. QTreeWidgetItem *item = new QTreeWidgetItem(m_treeWidget, QStringList("test"));
  119. m_treeWidget->resizeColumnToContents(0);
  120. delete item;
  121. }
  122. wid = m_treeWidget;
  123. }
  124. wid->updateGeometry();
  125. emit widgetUpdated();
  126. }
  127. void VOutlineUE::clear(int p_id)
  128. {
  129. Q_UNUSED(p_id);
  130. m_treeWidget->clearAll();
  131. m_listWidget->clearAll();
  132. }
  133. void VOutlineUE::entryHidden(int p_id)
  134. {
  135. Q_UNUSED(p_id);
  136. clear(-1);
  137. }
  138. void VOutlineUE::entryShown(int p_id, const QString &p_cmd)
  139. {
  140. processCommand(p_id, p_cmd);
  141. }
  142. void VOutlineUE::selectNextItem(int p_id, bool p_forward)
  143. {
  144. Q_UNUSED(p_id);
  145. if (m_listOutline) {
  146. m_treeWidget->selectNextItem(p_forward);
  147. } else {
  148. m_listWidget->selectNextItem(p_forward);
  149. }
  150. }
  151. void VOutlineUE::activate(int p_id)
  152. {
  153. Q_UNUSED(p_id);
  154. if (m_listOutline) {
  155. activateItem(m_treeWidget->currentItem(), 0);
  156. } else {
  157. activateItem(m_listWidget->currentItem());
  158. }
  159. }
  160. void VOutlineUE::activateItem(QListWidgetItem *p_item)
  161. {
  162. if (!p_item) {
  163. return;
  164. }
  165. int idx = p_item->data(Qt::UserRole).toInt();
  166. emit requestHideUniversalEntry();
  167. VHeaderPointer hp(g_mainWin->getCurrentFile(), idx);
  168. g_mainWin->getEditArea()->scrollToHeader(hp);
  169. }
  170. void VOutlineUE::activateItem(QTreeWidgetItem *p_item, int p_col)
  171. {
  172. Q_UNUSED(p_col);
  173. if (!p_item) {
  174. return;
  175. }
  176. VEditTab *tab = g_mainWin->getCurrentTab();
  177. Q_ASSERT(tab);
  178. const VTableOfContent &outline = tab->getOutline();
  179. const VTableOfContentItem *header = VOutline::getHeaderFromItem(p_item, outline);
  180. Q_ASSERT(header);
  181. if (!header->isEmpty()) {
  182. emit requestHideUniversalEntry();
  183. VHeaderPointer hp(outline.getFile(), header->m_index);
  184. g_mainWin->getEditArea()->scrollToHeader(hp);
  185. }
  186. }
  187. void VOutlineUE::selectParentItem(int p_id)
  188. {
  189. Q_UNUSED(p_id);
  190. if (m_listOutline) {
  191. m_treeWidget->selectParentItem();
  192. }
  193. }
  194. void VOutlineUE::toggleItemExpanded(int p_id)
  195. {
  196. Q_UNUSED(p_id);
  197. if (m_listOutline) {
  198. QTreeWidgetItem *item = m_treeWidget->currentItem();
  199. if (item) {
  200. item->setExpanded(!item->isExpanded());
  201. }
  202. }
  203. }
  204. void VOutlineUE::expandCollapseAll(int p_id)
  205. {
  206. Q_UNUSED(p_id);
  207. if (m_listOutline) {
  208. VTreeWidget::expandCollapseAll(m_treeWidget);
  209. }
  210. }