itemviews.h 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. // Copyright (C) 2016 The Qt Company Ltd.
  2. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
  3. #pragma once
  4. #include "utils_global.h"
  5. #include <QKeyEvent>
  6. #include <QListView>
  7. #include <QListWidget>
  8. #include <QTreeView>
  9. #include <QTreeWidget>
  10. static const char activationModeC[] = "ActivationMode";
  11. namespace Utils {
  12. enum ActivationMode {
  13. DoubleClickActivation = 0,
  14. SingleClickActivation = 1,
  15. PlatformDefaultActivation = 2
  16. };
  17. template<class BaseT>
  18. class View : public BaseT
  19. {
  20. public:
  21. View(QWidget *parent = nullptr)
  22. : BaseT(parent)
  23. {}
  24. void setActivationMode(ActivationMode mode)
  25. {
  26. if (mode == PlatformDefaultActivation)
  27. BaseT::setProperty(activationModeC, QVariant());
  28. else
  29. BaseT::setProperty(activationModeC, QVariant(bool(mode)));
  30. }
  31. ActivationMode activationMode() const
  32. {
  33. QVariant v = BaseT::property(activationModeC);
  34. if (!v.isValid())
  35. return PlatformDefaultActivation;
  36. return v.toBool() ? SingleClickActivation : DoubleClickActivation;
  37. }
  38. void keyPressEvent(QKeyEvent *event) override
  39. {
  40. // Note: This always eats the event
  41. // whereas QAbstractItemView never eats it
  42. if ((event->key() == Qt::Key_Return
  43. || event->key() == Qt::Key_Enter)
  44. && event->modifiers() == 0
  45. && BaseT::currentIndex().isValid()
  46. && BaseT::state() != QAbstractItemView::EditingState) {
  47. emit BaseT::activated(BaseT::currentIndex());
  48. return;
  49. }
  50. BaseT::keyPressEvent(event);
  51. }
  52. virtual bool userWantsContextMenu(const QMouseEvent *) const
  53. {
  54. return false;
  55. }
  56. void mousePressEvent(QMouseEvent *e) override
  57. {
  58. if (!userWantsContextMenu(e))
  59. BaseT::mousePressEvent(e);
  60. }
  61. void mouseReleaseEvent(QMouseEvent *e) override
  62. {
  63. if (!userWantsContextMenu(e))
  64. BaseT::mouseReleaseEvent(e);
  65. }
  66. };
  67. class QTCREATOR_UTILS_EXPORT TreeView : public View<QTreeView>
  68. {
  69. public:
  70. TreeView(QWidget *parent = nullptr);
  71. void setSearchRole(int role);
  72. };
  73. class QTCREATOR_UTILS_EXPORT ListView : public View<QListView>
  74. {
  75. public:
  76. ListView(QWidget *parent = nullptr);
  77. };
  78. class QTCREATOR_UTILS_EXPORT ListWidget : public View<QListWidget>
  79. {
  80. public:
  81. ListWidget(QWidget *parent = nullptr);
  82. };
  83. namespace Internal {
  84. using ViewSearchCallback = std::function<void(QAbstractItemView *view, int role)>;
  85. QTCREATOR_UTILS_EXPORT void setViewSearchCallback(const ViewSearchCallback &cb);
  86. } // Internal
  87. } // Utils