swift
actionmodel.cpp
1 // SPDX-FileCopyrightText: Copyright (C) 2015 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
5 
6 #include <QString>
7 #include <QStringBuilder>
8 #include <QStringList>
9 #include <QtGlobal>
10 
11 #include "core/application.h"
12 #include "gui/models/actionitem.h"
13 #include "misc/icons.h"
14 
15 using namespace swift::misc;
16 using namespace swift::core;
17 
18 namespace swift::gui::models
19 {
20  CActionModel::CActionModel(QObject *parent)
21  : QAbstractItemModel(parent), m_rootItem(new CActionItem(QString(), QString()))
22  {
23  setupModelData();
24  }
25 
27 
28  int CActionModel::columnCount(const QModelIndex &parent) const
29  {
30  return parent.isValid() ? static_cast<CActionItem *>(parent.internalPointer())->getColumnCount() :
31  m_rootItem->getColumnCount();
32  }
33 
34  QVariant CActionModel::data(const QModelIndex &index, int role) const
35  {
36  if (!index.isValid()) { return QVariant(); }
37 
38  const CActionItem *item = static_cast<CActionItem *>(index.internalPointer());
39  Q_ASSERT_X(item, Q_FUNC_INFO, "Missing item");
40 
41  if (role == ActionRole) { return item->getAction(); }
42  if (role == Qt::DisplayRole) { return item->getActionName(); }
43  if (role == Qt::DecorationRole) { return item->getIcon(); }
44 
45  return {};
46  }
47 
48  Qt::ItemFlags CActionModel::flags(const QModelIndex &index) const
49  {
50  if (!index.isValid()) { return Qt::NoItemFlags; }
51  const CActionItem *item = static_cast<CActionItem *>(index.internalPointer());
52  const Qt::ItemFlags flags = QAbstractItemModel::flags(index);
53  const bool selectable = item && !item->hasChildren(); // only leafs are selectable
54  return selectable ? flags | Qt::ItemIsSelectable : flags & ~Qt::ItemIsSelectable;
55  }
56 
57  QModelIndex CActionModel::index(int row, int column, const QModelIndex &parent) const
58  {
59  if (!hasIndex(row, column, parent)) { return QModelIndex(); }
60 
61  const CActionItem *parentItem =
62  parent.isValid() ? static_cast<CActionItem *>(parent.internalPointer()) : m_rootItem.data();
63 
64  CActionItem *childItem = parentItem->getChildByRow(row);
65  return childItem ? createIndex(row, column, childItem) : QModelIndex();
66  }
67 
68  QModelIndex CActionModel::parent(const QModelIndex &index) const
69  {
70  if (!index.isValid()) { return {}; }
71 
72  CActionItem *childItem = static_cast<CActionItem *>(index.internalPointer());
73  CActionItem *parentItem = childItem->getParentItem();
74 
75  if (parentItem == m_rootItem.data()) { return {}; }
76 
77  return createIndex(parentItem->getRow(), 0, parentItem);
78  }
79 
80  int CActionModel::rowCount(const QModelIndex &parent) const
81  {
82  if (parent.column() > 0) { return 0; }
83  const CActionItem *parentItem =
84  parent.isValid() ? static_cast<CActionItem *>(parent.internalPointer()) : m_rootItem.data();
85  return parentItem->getChildCount();
86  }
87 
88  void CActionModel::setupModelData()
89  {
90  m_rootItem.reset(new CActionItem(QString(), QString()));
91 
92  Q_ASSERT_X(sApp && sApp->getInputManager(), Q_FUNC_INFO, "Missing input manager");
93  const QMap<QString, swift::misc::CIcons::IconIndex> availableActionsAndIcons =
95  QStringList keys = availableActionsAndIcons.keys();
96  keys.sort();
97  for (const QString &actionPath : std::as_const(keys))
98  {
99  QString currentPath;
100  const QStringList tokens = actionPath.split("/", Qt::SkipEmptyParts);
101  CActionItem *parentItem = m_rootItem.data();
102  for (const auto &token : tokens)
103  {
104  currentPath += u'/' % token;
105  CActionItem *child = parentItem->findChildByName(token);
106  if (child == nullptr)
107  {
108  const bool isAction = currentPath == actionPath; // action istelf, or just a node?
109  const swift::misc::CIcons::IconIndex icon =
110  isAction ? availableActionsAndIcons[actionPath] : CIcons::StandardIconEmpty16;
111  child = new CActionItem(isAction ? actionPath : "", token, icon, parentItem);
112  parentItem->appendChild(child);
113  }
114  Q_ASSERT(child);
115  parentItem = child;
116  }
117  }
118  }
119 } // namespace swift::gui::models
SWIFT_CORE_EXPORT swift::core::CApplication * sApp
Single instance of application object.
Definition: application.cpp:71
CInputManager * getInputManager() const
The input manager, if available.
Definition: application.h:302
QMap< QString, swift::misc::CIcons::IconIndex > allAvailableActionsAndIcons() const
All actions and their icons (if any)
Definition: inputmanager.h:78
One single action item in a tree.
Definition: actionitem.h:19
QString getAction() const
Returns the stored action.
Definition: actionitem.cpp:46
int getRow() const
Get row of this item.
Definition: actionitem.cpp:52
bool hasChildren() const
Has children?
Definition: actionitem.cpp:42
int getChildCount() const
Number of children.
Definition: actionitem.cpp:40
void appendChild(CActionItem *child)
Append a new child.
Definition: actionitem.cpp:27
CActionItem * getParentItem() const
Get parent item.
Definition: actionitem.cpp:50
CActionItem * getChildByRow(int row) const
Get child by row.
Definition: actionitem.cpp:38
CActionItem * findChildByName(const QString &name) const
Find child by its name.
Definition: actionitem.cpp:29
QString getActionName() const
Get action name.
Definition: actionitem.cpp:48
const QPixmap & getIcon() const
Icon.
Definition: actionitem.h:53
QVariant data(const QModelIndex &index, int role) const
Definition: actionmodel.cpp:34
QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const
Definition: actionmodel.cpp:57
Qt::ItemFlags flags(const QModelIndex &index) const
Definition: actionmodel.cpp:48
int rowCount(const QModelIndex &parent=QModelIndex()) const
Definition: actionmodel.cpp:80
virtual ~CActionModel()
Destructor.
Definition: actionmodel.cpp:26
QModelIndex parent(const QModelIndex &index) const
Definition: actionmodel.cpp:68
int columnCount(const QModelIndex &parent=QModelIndex()) const
Definition: actionmodel.cpp:28
IconIndex
Index for each icon, allows to send them via DBus, efficiently store them, etc.
Definition: icons.h:32
Backend services of the swift project, like dealing with the network or the simulators.
Definition: actionbind.cpp:7
Models to be used with views, mainly QTableView.
Free functions in swift::misc.