ExtraBrowsersDelegate.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. #include "ExtraBrowsersDelegate.hpp"
  2. #include "ExtraBrowsersModel.hpp"
  3. #include <components/EditWidget.hpp>
  4. #include <qt-wrappers.hpp>
  5. #include <QKeyEvent>
  6. #include "moc_ExtraBrowsersDelegate.cpp"
  7. QWidget *ExtraBrowsersDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &,
  8. const QModelIndex &index) const
  9. {
  10. QLineEdit *text = new EditWidget(parent, index);
  11. text->installEventFilter(const_cast<ExtraBrowsersDelegate *>(this));
  12. text->setSizePolicy(QSizePolicy(QSizePolicy::Policy::Expanding, QSizePolicy::Policy::Expanding,
  13. QSizePolicy::ControlType::LineEdit));
  14. return text;
  15. }
  16. void ExtraBrowsersDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
  17. {
  18. QLineEdit *text = reinterpret_cast<QLineEdit *>(editor);
  19. text->blockSignals(true);
  20. text->setText(index.data().toString());
  21. text->blockSignals(false);
  22. }
  23. bool ExtraBrowsersDelegate::eventFilter(QObject *object, QEvent *event)
  24. {
  25. QLineEdit *edit = qobject_cast<QLineEdit *>(object);
  26. if (!edit)
  27. return false;
  28. if (LineEditCanceled(event)) {
  29. RevertText(edit);
  30. }
  31. if (LineEditChanged(event)) {
  32. UpdateText(edit);
  33. if (event->type() == QEvent::KeyPress) {
  34. QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
  35. if (keyEvent->key() == Qt::Key_Tab) {
  36. model->TabSelection(true);
  37. } else if (keyEvent->key() == Qt::Key_Backtab) {
  38. model->TabSelection(false);
  39. }
  40. }
  41. return true;
  42. }
  43. return false;
  44. }
  45. bool ExtraBrowsersDelegate::ValidName(const QString &name) const
  46. {
  47. for (auto &item : model->items) {
  48. if (name.compare(item.title, Qt::CaseInsensitive) == 0) {
  49. return false;
  50. }
  51. }
  52. return true;
  53. }
  54. void ExtraBrowsersDelegate::RevertText(QLineEdit *edit_)
  55. {
  56. EditWidget *edit = reinterpret_cast<EditWidget *>(edit_);
  57. int row = edit->index.row();
  58. int col = edit->index.column();
  59. bool newItem = (row == model->items.size());
  60. QString oldText;
  61. if (col == (int)Column::Title) {
  62. oldText = newItem ? model->newTitle : model->items[row].title;
  63. } else {
  64. oldText = newItem ? model->newURL : model->items[row].url;
  65. }
  66. edit->setText(oldText);
  67. }
  68. bool ExtraBrowsersDelegate::UpdateText(QLineEdit *edit_)
  69. {
  70. EditWidget *edit = reinterpret_cast<EditWidget *>(edit_);
  71. int row = edit->index.row();
  72. int col = edit->index.column();
  73. bool newItem = (row == model->items.size());
  74. QString text = edit->text().trimmed();
  75. if (!newItem && text.isEmpty()) {
  76. return false;
  77. }
  78. if (col == (int)Column::Title) {
  79. QString oldText = newItem ? model->newTitle : model->items[row].title;
  80. bool same = oldText.compare(text, Qt::CaseInsensitive) == 0;
  81. if (!same && !ValidName(text)) {
  82. edit->setText(oldText);
  83. return false;
  84. }
  85. }
  86. if (!newItem) {
  87. /* if edited existing item, update it*/
  88. switch (col) {
  89. case (int)Column::Title:
  90. model->items[row].title = text;
  91. break;
  92. case (int)Column::Url:
  93. model->items[row].url = text;
  94. break;
  95. }
  96. } else {
  97. /* if both new values filled out, create new one */
  98. switch (col) {
  99. case (int)Column::Title:
  100. model->newTitle = text;
  101. break;
  102. case (int)Column::Url:
  103. model->newURL = text;
  104. break;
  105. }
  106. model->CheckToAdd();
  107. }
  108. emit commitData(edit);
  109. return true;
  110. }