fb2dock.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. #include "fb2dock.hpp"
  2. #include "fb2code.hpp"
  3. #include "fb2head.hpp"
  4. #include "fb2text.hpp"
  5. #include <QLayout>
  6. #include <QtDebug>
  7. //---------------------------------------------------------------------------
  8. // FbModeAction
  9. //---------------------------------------------------------------------------
  10. FbModeAction::FbModeAction(FbMainDock *parent, Fb::Mode mode, const QString &text)
  11. : QAction(text, parent)
  12. , m_dock(parent)
  13. , m_mode(mode)
  14. {
  15. setCheckable(true);
  16. connect(this, SIGNAL(triggered()), SLOT(switchMode()));
  17. }
  18. void FbModeAction::switchMode()
  19. {
  20. m_dock->setMode(m_mode);
  21. }
  22. //---------------------------------------------------------------------------
  23. // FbMainDock
  24. //---------------------------------------------------------------------------
  25. FbMainDock::FbMainDock(QWidget *parent)
  26. : QStackedWidget(parent)
  27. , isSwitched(false)
  28. {
  29. textFrame = new FbTextFrame(this);
  30. m_text = new FbTextEdit(textFrame, parent);
  31. textFrame->layout()->addWidget(m_text);
  32. m_head = new FbHeadEdit(this, m_text);
  33. m_code = new FbCodeEdit(this);
  34. addWidget(textFrame);
  35. addWidget(m_head);
  36. addWidget(m_code);
  37. }
  38. void FbMainDock::setMode(Fb::Mode mode)
  39. {
  40. if (mode == m_mode) return;
  41. enableMenu(mode == Fb::Text);
  42. switch (m_mode = mode) {
  43. case Fb::Text: setModeText(); break;
  44. case Fb::Head: setModeHead(); break;
  45. case Fb::Code: setModeCode(); break;
  46. case Fb::Html: setModeHtml(); break;
  47. }
  48. }
  49. void FbMainDock::setModeText()
  50. {
  51. m_mode = Fb::Text;
  52. setCurrentWidget(textFrame);
  53. m_head->disconnectActions();
  54. m_code->disconnectActions();
  55. m_text->connectActions(m_tool);
  56. }
  57. void FbMainDock::setModeHead()
  58. {
  59. m_mode = Fb::Head;
  60. m_text->hideDocks();
  61. setCurrentWidget(m_head);
  62. m_text->disconnectActions();
  63. m_code->disconnectActions();
  64. m_head->connectActions(m_tool);
  65. }
  66. void FbMainDock::setModeCode()
  67. {
  68. m_mode = Fb::Code;
  69. m_text->hideDocks();
  70. setCurrentWidget(m_code);
  71. m_text->disconnectActions();
  72. m_head->disconnectActions();
  73. m_code->connectActions(m_tool);
  74. }
  75. void FbMainDock::setModeHtml()
  76. {
  77. m_mode = Fb::Html;
  78. m_text->hideDocks();
  79. setCurrentWidget(m_code);
  80. m_text->disconnectActions();
  81. m_head->disconnectActions();
  82. m_code->connectActions(m_tool);
  83. }
  84. bool FbMainDock::load(const QString &filename)
  85. {
  86. QFile file(filename);
  87. if (!file.open(QFile::ReadOnly | QFile::Text)) {
  88. qCritical() << QObject::tr("Cannot read file %1: %2.").arg(filename).arg(file.errorString());
  89. return false;
  90. }
  91. if (currentWidget() == m_code) {
  92. m_code->clear();
  93. return m_code->read(&file);
  94. }
  95. return false;
  96. }
  97. bool FbMainDock::save(QIODevice *device, const QString &codec)
  98. {
  99. if (currentWidget() == m_code) {
  100. QTextStream out(device);
  101. out << m_code->toPlainText();
  102. } else {
  103. isSwitched = false;
  104. m_text->save(device, codec);
  105. }
  106. return true;
  107. }
  108. bool FbMainDock::isModified() const
  109. {
  110. if (isSwitched) return true;
  111. QWidget * current = currentWidget();
  112. if (current == textFrame) return m_text->isModified();
  113. if (current == m_head) return m_text->isModified();
  114. if (current == m_code) return m_code->isModified();
  115. return false;
  116. }
  117. void FbMainDock::addMenu(QMenu *menu)
  118. {
  119. m_menus.append(menu);
  120. }
  121. void FbMainDock::enableMenu(bool value)
  122. {
  123. foreach (QMenu *menu, m_menus) {
  124. menu->setEnabled(value);
  125. }
  126. }