• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdevelop API Reference
  • KDE Home
  • Contact Us
 

kdevplatform/language/duchain

  • sources
  • kfour-appscomplete
  • kdevelop
  • kdevplatform
  • language
  • duchain
  • navigation
quickopenembeddedwidgetcombiner.cpp
Go to the documentation of this file.
1 /*
2  * This file is part of KDevelop
3  *
4  * Copyright 2019 Milian Wolff <[email protected]>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU Library General Public License as
8  * published by the Free Software Foundation; either version 2 of the
9  * License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public
17  * License along with this program; if not, write to the
18  * Free Software Foundation, Inc.,
19  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20  */
21 
22 #include "quickopenembeddedwidgetcombiner.h"
23 
24 #include <QVBoxLayout>
25 
26 using namespace KDevelop;
27 
28 QuickOpenEmbeddedWidgetInterface* toInterface(QObject *object)
29 {
30  return qobject_cast<QuickOpenEmbeddedWidgetInterface*>(object);
31 }
32 
33 class KDevelop::QuickOpenEmbeddedWidgetCombinerPrivate
34 {
35 public:
36  QuickOpenEmbeddedWidgetInterface* currentChild = nullptr;
37 
38  bool init(const QObjectList& children)
39  {
40  if (currentChild)
41  return true;
42 
43  currentChild = nextChild(Next, children);
44  return currentChild;
45  }
46 
47  enum Action
48  {
49  Next,
50  Previous,
51  Up,
52  Down,
53  };
54  QuickOpenEmbeddedWidgetInterface* nextChild(Action action, const QObjectList& children) const
55  {
56  if (action == Next || action == Down) {
57  return nextChild(children.begin(), children.end());
58  } else {
59  return nextChild(children.rbegin(), children.rend());
60  }
61  }
62 
63  template<typename It>
64  QuickOpenEmbeddedWidgetInterface* nextChild(const It start, const It end) const
65  {
66  if (start == end)
67  return nullptr;
68 
69  auto current = start;
70  if (currentChild) {
71  current = std::find_if(start, end, [this](QObject *child) {
72  return toInterface(child) == currentChild;
73  });
74  }
75 
76  auto it = std::find_if(current + 1, end, toInterface);
77  if (it == end && current != start) {
78  // cycle
79  it = std::find_if(start, current, toInterface);
80  }
81  return (it != end) ? toInterface(*it) : nullptr;
82  }
83 
84  bool navigate(Action action, const QObjectList& children)
85  {
86  if (!init(children)) {
87  return false;
88  }
89 
90  auto applyAction = [action](QuickOpenEmbeddedWidgetInterface* interface)
91  {
92  switch (action) {
93  case Next:
94  return interface->next();
95  case Previous:
96  return interface->previous();
97  case Up:
98  return interface->up();
99  case Down:
100  return interface->down();
101  }
102  Q_UNREACHABLE();
103  };
104 
105  if (applyAction(currentChild)) {
106  return true;
107  }
108 
109  if (auto *next = nextChild(action, children)) {
110  currentChild->resetNavigationState();
111  currentChild = next;
112  auto ret = applyAction(currentChild);
113  return ret;
114  }
115  return false;
116  }
117 };
118 
119 QuickOpenEmbeddedWidgetCombiner::QuickOpenEmbeddedWidgetCombiner(QWidget* parent)
120  : QWidget(parent)
121  , d_ptr(new QuickOpenEmbeddedWidgetCombinerPrivate)
122 {
123  setLayout(new QVBoxLayout);
124  layout()->setContentsMargins(2, 2, 2, 2);
125  layout()->setSpacing(0);
126 }
127 
128 QuickOpenEmbeddedWidgetCombiner::~QuickOpenEmbeddedWidgetCombiner() = default;
129 
130 bool QuickOpenEmbeddedWidgetCombiner::next()
131 {
132  Q_D(QuickOpenEmbeddedWidgetCombiner);
133 
134  return d->navigate(QuickOpenEmbeddedWidgetCombinerPrivate::Next, children());
135 }
136 
137 bool QuickOpenEmbeddedWidgetCombiner::previous()
138 {
139  Q_D(QuickOpenEmbeddedWidgetCombiner);
140 
141  return d->navigate(QuickOpenEmbeddedWidgetCombinerPrivate::Previous, children());
142 }
143 
144 bool QuickOpenEmbeddedWidgetCombiner::up()
145 {
146  Q_D(QuickOpenEmbeddedWidgetCombiner);
147 
148  return d->navigate(QuickOpenEmbeddedWidgetCombinerPrivate::Up, children());
149 }
150 
151 bool QuickOpenEmbeddedWidgetCombiner::down()
152 {
153  Q_D(QuickOpenEmbeddedWidgetCombiner);
154 
155  return d->navigate(QuickOpenEmbeddedWidgetCombinerPrivate::Down, children());
156 }
157 
158 void QuickOpenEmbeddedWidgetCombiner::back()
159 {
160  Q_D(QuickOpenEmbeddedWidgetCombiner);
161 
162  if (d->currentChild) {
163  d->currentChild->back();
164  }
165 }
166 
167 void QuickOpenEmbeddedWidgetCombiner::accept()
168 {
169  Q_D(QuickOpenEmbeddedWidgetCombiner);
170 
171  if (d->currentChild) {
172  d->currentChild->accept();
173  }
174 }
175 
176 void QuickOpenEmbeddedWidgetCombiner::resetNavigationState()
177 {
178  for (auto* child : children()) {
179  if (auto* interface = toInterface(child)) {
180  interface->resetNavigationState();
181  }
182  }
183 }
QVBoxLayout
KDevelop::QuickOpenEmbeddedWidgetCombiner::accept
void accept() override
Definition: quickopenembeddedwidgetcombiner.cpp:167
QuickOpenEmbeddedWidgetInterface
QWidget::layout
QLayout * layout() const
toInterface
QuickOpenEmbeddedWidgetInterface * toInterface(QObject *object)
Definition: quickopenembeddedwidgetcombiner.cpp:28
QWidget
QObject
KDevelop::QuickOpenEmbeddedWidgetCombiner
A widget that implements the QuickOpenEmbeddedWidgetInterface by asking its direct children.
Definition: quickopenembeddedwidgetcombiner.h:37
KDevelop::QuickOpenEmbeddedWidgetCombiner::up
bool up() override
Definition: quickopenembeddedwidgetcombiner.cpp:144
KDevelop::QuickOpenEmbeddedWidgetCombiner::QuickOpenEmbeddedWidgetCombiner
QuickOpenEmbeddedWidgetCombiner(QWidget *parent=nullptr)
Definition: quickopenembeddedwidgetcombiner.cpp:119
QObject::child
QObject * child(const char *objName, const char *inheritsClass, bool recursiveSearch) const
KDevelop::QuickOpenEmbeddedWidgetCombiner::next
bool next() override
Definition: quickopenembeddedwidgetcombiner.cpp:130
QLayout::setContentsMargins
void setContentsMargins(int left, int top, int right, int bottom)
KDevelop
Definition: abstractfunctiondeclaration.cpp:27
QLayout::setSpacing
void setSpacing(int)
KDevelop::QuickOpenEmbeddedWidgetCombiner::previous
bool previous() override
Definition: quickopenembeddedwidgetcombiner.cpp:137
KDevelop::QuickOpenEmbeddedWidgetCombiner::resetNavigationState
void resetNavigationState() override
Definition: quickopenembeddedwidgetcombiner.cpp:176
KDevelop::QuickOpenEmbeddedWidgetCombiner::~QuickOpenEmbeddedWidgetCombiner
~QuickOpenEmbeddedWidgetCombiner() override
KDevelop::QuickOpenEmbeddedWidgetCombiner::back
void back() override
Definition: quickopenembeddedwidgetcombiner.cpp:158
QWidget::setLayout
void setLayout(QLayout *layout)
quickopenembeddedwidgetcombiner.h
QObject::children
const QObjectList & children() const
KDevelop::QuickOpenEmbeddedWidgetCombiner::down
bool down() override
Definition: quickopenembeddedwidgetcombiner.cpp:151
This file is part of the KDE documentation.
Documentation copyright © 1996-2021 The KDE developers.
Generated on Mon Mar 8 2021 23:29:50 by doxygen 1.8.16 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kdevplatform/language/duchain

Skip menu "kdevplatform/language/duchain"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdevelop API Reference

Skip menu "kdevelop API Reference"
  • kdevplatform
  •   debugger
  •   documentation
  •   interfaces
  •   language
  •     assistant
  •     backgroundparser
  •     checks
  •     classmodel
  •     codecompletion
  •     codegen
  •     duchain
  •     editor
  •     highlighting
  •     interfaces
  •     util
  •   outputview
  •   project
  •   serialization
  •   shell
  •   sublime
  •   tests
  •   util
  •   vcs

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal