vtabwidget.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. #include <QtWidgets>
  2. #include <QtDebug>
  3. #include "vtabwidget.h"
  4. #include "veditor.h"
  5. #include "vnote.h"
  6. #include "vconfigmanager.h"
  7. extern VConfigManager vconfig;
  8. VTabWidget::VTabWidget(QWidget *parent)
  9. : QTabWidget(parent)
  10. {
  11. setTabsClosable(true);
  12. connect(tabBar(), &QTabBar::tabCloseRequested,
  13. this, &VTabWidget::handleTabCloseRequest);
  14. openWelcomePage();
  15. }
  16. void VTabWidget::openWelcomePage()
  17. {
  18. int idx = openFileInTab(vconfig.getWelcomePagePath(), "", false);
  19. setTabText(idx, "Welcome to VNote");
  20. setTabToolTip(idx, "VNote");
  21. }
  22. int VTabWidget::insertTabWithData(int index, QWidget *page, const QString &label,
  23. const QJsonObject &tabData)
  24. {
  25. int idx = insertTab(index, page, label);
  26. QTabBar *tabs = tabBar();
  27. tabs->setTabData(idx, tabData);
  28. Q_ASSERT(tabs->tabText(idx) == label);
  29. return idx;
  30. }
  31. int VTabWidget::appendTabWithData(QWidget *page, const QString &label, const QJsonObject &tabData)
  32. {
  33. return insertTabWithData(count(), page, label, tabData);
  34. }
  35. void VTabWidget::openFile(QJsonObject fileJson)
  36. {
  37. if (fileJson.isEmpty()) {
  38. return;
  39. }
  40. qDebug() << "open file:" << fileJson;
  41. QString path = fileJson["path"].toString();
  42. QString name = fileJson["name"].toString();
  43. // Find if it has been opened already
  44. int idx = findTabByFile(path, name);
  45. if (idx > -1) {
  46. setCurrentIndex(idx);
  47. return;
  48. }
  49. idx = openFileInTab(path, name, true);
  50. setCurrentIndex(idx);
  51. }
  52. int VTabWidget::openFileInTab(const QString &path, const QString &name, bool modifiable)
  53. {
  54. VEditor *editor = new VEditor(path, name, modifiable);
  55. QJsonObject tabJson;
  56. tabJson["path"] = path;
  57. tabJson["name"] = name;
  58. int idx = appendTabWithData(editor, name, tabJson);
  59. setTabToolTip(idx, path);
  60. return idx;
  61. }
  62. int VTabWidget::findTabByFile(const QString &path, const QString &name)
  63. {
  64. QTabBar *tabs = tabBar();
  65. int nrTabs = tabs->count();
  66. for (int i = 0; i < nrTabs; ++i) {
  67. QJsonObject tabJson = tabs->tabData(i).toJsonObject();
  68. if (tabJson["name"] == name && tabJson["path"] == path) {
  69. return i;
  70. }
  71. }
  72. return -1;
  73. }
  74. void VTabWidget::handleTabCloseRequest(int index)
  75. {
  76. qDebug() << "request closing tab" << index;
  77. VEditor *editor = dynamic_cast<VEditor *>(widget(index));
  78. Q_ASSERT(editor);
  79. bool ok = editor->requestClose();
  80. if (ok) {
  81. removeTab(index);
  82. delete editor;
  83. }
  84. }
  85. void VTabWidget::readFile()
  86. {
  87. VEditor *editor = dynamic_cast<VEditor *>(currentWidget());
  88. Q_ASSERT(editor);
  89. editor->readFile();
  90. }
  91. void VTabWidget::editFile()
  92. {
  93. VEditor *editor = dynamic_cast<VEditor *>(currentWidget());
  94. Q_ASSERT(editor);
  95. editor->editFile();
  96. }
  97. void VTabWidget::saveFile()
  98. {
  99. VEditor *editor = dynamic_cast<VEditor *>(currentWidget());
  100. Q_ASSERT(editor);
  101. editor->saveFile();
  102. }