vinsertlinkdialog.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. #include "vinsertlinkdialog.h"
  2. #include <QtWidgets>
  3. #include "vmetawordlineedit.h"
  4. VInsertLinkDialog::VInsertLinkDialog(const QString &p_title,
  5. const QString &p_text,
  6. const QString &p_info,
  7. const QString &p_linkText,
  8. const QString &p_linkUrl,
  9. QWidget *p_parent)
  10. : QDialog(p_parent)
  11. {
  12. setupUI(p_title, p_text, p_info, p_linkText, p_linkUrl);
  13. fetchLinkFromClipboard();
  14. handleInputChanged();
  15. }
  16. void VInsertLinkDialog::setupUI(const QString &p_title,
  17. const QString &p_text,
  18. const QString &p_info,
  19. const QString &p_linkText,
  20. const QString &p_linkUrl)
  21. {
  22. QLabel *textLabel = NULL;
  23. if (!p_text.isEmpty()) {
  24. textLabel = new QLabel(p_text);
  25. textLabel->setWordWrap(true);
  26. }
  27. QLabel *infoLabel = NULL;
  28. if (!p_info.isEmpty()) {
  29. infoLabel = new QLabel(p_info);
  30. infoLabel->setWordWrap(true);
  31. }
  32. m_linkTextEdit = new VMetaWordLineEdit(p_linkText);
  33. m_linkTextEdit->selectAll();
  34. m_linkUrlEdit = new VLineEdit(p_linkUrl);
  35. m_linkUrlEdit->setToolTip(tr("Absolute or relative path of the link"));
  36. QFormLayout *inputLayout = new QFormLayout();
  37. inputLayout->addRow(tr("&Text:"), m_linkTextEdit);
  38. inputLayout->addRow(tr("&URL:"), m_linkUrlEdit);
  39. // Ok is the default button.
  40. m_btnBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
  41. connect(m_btnBox, &QDialogButtonBox::accepted, this, &QDialog::accept);
  42. connect(m_btnBox, &QDialogButtonBox::rejected, this, &QDialog::reject);
  43. QPushButton *okBtn = m_btnBox->button(QDialogButtonBox::Ok);
  44. okBtn->setProperty("SpecialBtn", true);
  45. m_linkTextEdit->setMinimumWidth(okBtn->sizeHint().width() * 3);
  46. QVBoxLayout *mainLayout = new QVBoxLayout;
  47. if (textLabel) {
  48. mainLayout->addWidget(textLabel);
  49. }
  50. if (infoLabel) {
  51. mainLayout->addWidget(infoLabel);
  52. }
  53. mainLayout->addLayout(inputLayout);
  54. mainLayout->addWidget(m_btnBox);
  55. setLayout(mainLayout);
  56. setWindowTitle(p_title);
  57. connect(m_linkTextEdit, &VMetaWordLineEdit::textChanged,
  58. this, &VInsertLinkDialog::handleInputChanged);
  59. connect(m_linkUrlEdit, &VLineEdit::textChanged,
  60. this, &VInsertLinkDialog::handleInputChanged);
  61. }
  62. void VInsertLinkDialog::handleInputChanged()
  63. {
  64. bool textOk = true;
  65. if (m_linkTextEdit->getEvaluatedText().isEmpty()) {
  66. textOk = false;
  67. }
  68. bool urlOk = true;
  69. if (m_linkUrlEdit->text().isEmpty()) {
  70. urlOk = false;
  71. }
  72. QPushButton *okBtn = m_btnBox->button(QDialogButtonBox::Ok);
  73. okBtn->setEnabled(textOk && urlOk);
  74. }
  75. void VInsertLinkDialog::fetchLinkFromClipboard()
  76. {
  77. if (!m_linkUrlEdit->text().isEmpty()
  78. || !m_linkTextEdit->text().isEmpty()) {
  79. return;
  80. }
  81. QClipboard *clipboard = QApplication::clipboard();
  82. const QMimeData *mimeData = clipboard->mimeData();
  83. if (!mimeData->hasText()) {
  84. return;
  85. }
  86. QString text = mimeData->text();
  87. text = text.trimmed();
  88. if (text.isEmpty()) {
  89. return;
  90. }
  91. QUrl url = QUrl::fromUserInput(text);
  92. if (url.isValid()) {
  93. if (m_linkUrlEdit->text().isEmpty()) {
  94. m_linkUrlEdit->setText(text);
  95. }
  96. } else if (m_linkTextEdit->text().isEmpty()) {
  97. m_linkTextEdit->setText(text);
  98. }
  99. }
  100. QString VInsertLinkDialog::getLinkText() const
  101. {
  102. return m_linkTextEdit->getEvaluatedText();
  103. }
  104. QString VInsertLinkDialog::getLinkUrl() const
  105. {
  106. return m_linkUrlEdit->text();
  107. }
  108. void VInsertLinkDialog::showEvent(QShowEvent *p_event)
  109. {
  110. QDialog::showEvent(p_event);
  111. if (!m_linkTextEdit->text().isEmpty() && m_linkUrlEdit->text().isEmpty()) {
  112. m_linkUrlEdit->setFocus();
  113. }
  114. }