21 #include "internal/intro/berryIntroConstants.h" 22 #include "internal/berryKeywordRegistry.h" 37 ViewTreeItem(ViewTreeModel* model)
42 virtual ~ViewTreeItem()
44 QList<ViewTreeItem*> children = m_children;
45 if (m_parent) m_parent->removeChild(
this);
49 virtual QVariant data(
int role)
53 if (m_keywordCache.isEmpty())
55 m_keywordCache = QStringList(keywordLabels().toList());
57 return m_keywordCache;
62 virtual Qt::ItemFlags flags()
const 64 return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
67 virtual QSet<QString> keywordLabels()
const 69 return QSet<QString>();
72 void appendChild(ViewTreeItem* child)
74 m_children.push_back(child);
75 child->m_parent =
this;
79 void removeChild(ViewTreeItem* child)
81 m_children.removeAll(child);
84 QList<ViewTreeItem*> takeChildren()
86 QList<ViewTreeItem*> children = m_children;
91 ViewTreeItem* childItem(
int row)
const 93 if (row < 0 || row >= m_children.size())
return nullptr;
94 return m_children.at(row);
97 ViewTreeItem* parentItem()
const 102 int childCount()
const 104 return m_children.size();
109 if (m_parent)
return m_parent->rowIndex(
this);
113 int rowIndex(
const ViewTreeItem* child)
const 115 return m_children.indexOf(const_cast<ViewTreeItem*>(child));
118 QList<ViewTreeItem*> m_children;
119 ViewTreeItem* m_parent;
120 ViewTreeModel* m_model;
124 QStringList m_keywordCache;
130 return item1->data(Qt::DisplayRole).toString() < item2->data(Qt::DisplayRole).toString();
133 struct RootTreeItem : ViewTreeItem
137 QVariant data(
int )
override {
return QVariant(); }
140 struct DescriptorTreeItem : ViewTreeItem
144 QVariant data(
int role)
override;
148 QSet<QString> keywordLabels()
const override;
153 struct CategoryTreeItem : ViewTreeItem
157 QVariant data(
int role)
override;
159 Qt::ItemFlags flags()
const override;
163 QSet<QString> keywordLabels()
const override;
169 void RemoveIntroView(QList<IViewDescriptor::Pointer>& list);
173 void CreateChildren();
181 struct ViewTreeModel::Impl
193 QScopedPointer<RootTreeItem> rootItem;
197 : QAbstractItemModel(parent)
198 , d(new Impl(window))
200 d->rootItem.reset(
new RootTreeItem(
this));
202 QList<CategoryTreeItem*> categoryItems;
204 QList<IViewCategory::Pointer> categories = d->viewRegistry.GetCategories();
205 for (
auto category : categories)
207 if (category->GetViews().isEmpty())
continue;
208 CategoryTreeItem* categoryItem =
new CategoryTreeItem(
this, category);
209 if (categoryItem->childCount() == 0)
215 categoryItems.push_back(categoryItem);
221 if (categoryItems.size() == 1)
223 QList<ViewTreeItem*> items = categoryItems.front()->takeChildren();
224 for (
auto item : items)
226 d->rootItem->appendChild(item);
228 qDeleteAll(categoryItems);
232 for (
auto category : categoryItems)
234 d->rootItem->appendChild(category);
246 if (!index.isValid())
return QVariant();
248 return static_cast<ViewTreeItem*
>(index.internalPointer())->
data(role);
253 if (!index.isValid())
return nullptr;
255 return static_cast<ViewTreeItem*
>(index.internalPointer())->
flags();
260 if (role == Qt::DisplayRole && section == 0)
269 if (!hasIndex(row, column, parent))
271 return QModelIndex();
274 ViewTreeItem* parentItem =
nullptr;
275 if (!parent.isValid())
277 parentItem = d->rootItem.data();
281 parentItem =
static_cast<ViewTreeItem*
>(parent.internalPointer());
284 ViewTreeItem* childItem = parentItem->childItem(row);
287 return createIndex(row, column, childItem);
289 return QModelIndex();
294 if (!child.isValid())
296 return QModelIndex();
299 ViewTreeItem* childItem =
static_cast<ViewTreeItem*
>(child.internalPointer());
300 ViewTreeItem* parentItem = childItem->parentItem();
302 if (parentItem == d->rootItem.data())
304 return QModelIndex();
306 return createIndex(parentItem->row(), 0, parentItem);
311 ViewTreeItem* parentItem =
nullptr;
312 if (parent.column() > 0)
return 0;
314 if (!parent.isValid())
316 parentItem = d->rootItem.data();
320 parentItem =
static_cast<ViewTreeItem*
>(parent.internalPointer());
322 return parentItem->childCount();
338 : ViewTreeItem(model)
339 , m_descriptor(descriptor)
341 if (parent) parent->appendChild(
this);
344 QVariant DescriptorTreeItem::data(
int role)
346 if (role == Qt::DisplayRole)
348 return m_descriptor->GetLabel();
350 else if (role == Qt::DecorationRole)
352 return m_descriptor->GetImageDescriptor();
354 else if (role == Qt::ForegroundRole)
359 if (page->FindViewReference(m_descriptor->GetId()).IsNotNull())
361 return QBrush(QColor(Qt::gray));
367 return m_descriptor->GetDescription();
371 return m_descriptor->GetId();
373 return ViewTreeItem::data(role);
376 QSet<QString> DescriptorTreeItem::keywordLabels()
const 378 KeywordRegistry* registry = KeywordRegistry::GetInstance();
379 QStringList ids = m_descriptor->GetKeywordReferences();
380 QSet<QString> keywords;
381 keywords.insert(m_descriptor->GetLabel());
384 QString label = registry->GetKeywordLabel(
id);
385 for (
auto keyword : label.split(
' ', QString::SkipEmptyParts))
387 keywords.insert(keyword);
396 : ViewTreeItem(model)
397 , m_category(category)
399 if (parent) parent->appendChild(
this);
400 this->CreateChildren();
403 QVariant CategoryTreeItem::data(
int role)
405 if (role == Qt::DisplayRole)
407 return m_category->GetLabel();
409 else if (role == Qt::DecorationRole)
411 return QIcon::fromTheme(
"folder");
415 return m_category->GetId();
417 return ViewTreeItem::data(role);
420 Qt::ItemFlags CategoryTreeItem::flags()
const 422 return Qt::ItemIsEnabled;
425 QSet<QString> CategoryTreeItem::keywordLabels()
const 427 QSet<QString> keywords;
428 for(
auto child : this->m_children)
432 keywords.insert(keyword);
438 void CategoryTreeItem::CreateChildren()
440 auto viewDescriptors = m_category->GetViews();
441 RemoveIntroView(viewDescriptors);
442 for(
auto viewDescriptor : viewDescriptors)
444 new DescriptorTreeItem(this->m_model, viewDescriptor,
this);
448 void CategoryTreeItem::RemoveIntroView(QList<IViewDescriptor::Pointer>& list)
450 for (
auto view = list.begin(); view != list.end();)
452 if ((*view)->GetId() == IntroConstants::INTRO_VIEW_ID)
454 view = list.erase(view);
int rowCount(const QModelIndex &parent=QModelIndex()) const override
ViewTreeModel(const IWorkbenchWindow *window, QObject *parent=nullptr)
QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const override
QVariant data(const QModelIndex &index, int role) const override
Qt::ItemFlags flags(const QModelIndex &index) const override
const IWorkbenchWindow * GetWorkbenchWindow() const
bool CompareViewTreeItem(ViewTreeItem *item1, ViewTreeItem *item2)
~ViewTreeModel() override
int columnCount(const QModelIndex &parent=QModelIndex()) const override
QVariant headerData(int section, Qt::Orientation orientation, int role=Qt::DisplayRole) const override
QModelIndex parent(const QModelIndex &child) const override
virtual IViewRegistry * GetViewRegistry() const =0
virtual IWorkbench * GetWorkbench() const =0