20#include "lomirimenumodelstack.h"
23#include <ayatanamenumodel.h>
25class LomiriMenuModelEntry :
public QObject {
28 LomiriMenuModelEntry(AyatanaMenuModel* model, AyatanaMenuModel* parentModel,
int index)
30 m_parentModel(parentModel),
34 QObject::connect(m_parentModel, &AyatanaMenuModel::rowsInserted,
this, &LomiriMenuModelEntry::onRowsInserted);
35 QObject::connect(m_parentModel, &AyatanaMenuModel::rowsRemoved,
this, &LomiriMenuModelEntry::onRowsRemoved);
36 QObject::connect(m_parentModel, &AyatanaMenuModel::modelReset,
this, &LomiriMenuModelEntry::onModelReset);
40 AyatanaMenuModel* model()
const {
return m_model; }
43 void onRowsInserted(
const QModelIndex&,
int start,
int end)
45 int delta = end-start + 1;
46 if (start <= m_index) {
51 void onRowsRemoved(
const QModelIndex&,
int start,
int end)
53 int delta = end-start + 1;
54 if (start <= m_index) {
55 if (start + delta > m_index) {
58 disconnect(m_parentModel, 0,
this, 0);
68 disconnect(m_parentModel, 0,
this, 0);
75 AyatanaMenuModel* m_model;
76 AyatanaMenuModel* m_parentModel;
80LomiriMenuModelStack::LomiriMenuModelStack(QObject* parent)
85LomiriMenuModelStack::~LomiriMenuModelStack()
87 qDeleteAll(m_menuModels);
91AyatanaMenuModel* LomiriMenuModelStack::head()
const
93 return !m_menuModels.isEmpty() ? m_menuModels.first()->model() :
nullptr;
96void LomiriMenuModelStack::setHead(AyatanaMenuModel* model)
98 if (head() != model) {
99 qDeleteAll(m_menuModels);
100 m_menuModels.clear();
103 Q_EMIT headChanged(model);
107AyatanaMenuModel* LomiriMenuModelStack::tail()
const
109 return !m_menuModels.isEmpty() ? m_menuModels.last()->model() :
nullptr;
112int LomiriMenuModelStack::count()
const
114 return m_menuModels.count();
117void LomiriMenuModelStack::push(AyatanaMenuModel* model,
int index)
119 LomiriMenuModelEntry* entry =
new LomiriMenuModelEntry(model, tail(), index);
120 QObject::connect(entry, &LomiriMenuModelEntry::remove,
this, &LomiriMenuModelStack::onRemove);
122 m_menuModels << entry;
123 Q_EMIT tailChanged(model);
124 Q_EMIT countChanged(m_menuModels.count());
127AyatanaMenuModel* LomiriMenuModelStack::pop()
129 if (m_menuModels.isEmpty()) {
132 LomiriMenuModelEntry* entry = m_menuModels.takeLast();
133 AyatanaMenuModel* model = entry->model();
134 entry->deleteLater();
136 Q_EMIT tailChanged(tail());
137 if (m_menuModels.isEmpty()) {
138 Q_EMIT headChanged(
nullptr);
140 Q_EMIT countChanged(m_menuModels.count());
145void LomiriMenuModelStack::onRemove()
147 LomiriMenuModelEntry* removed = qobject_cast<LomiriMenuModelEntry*>(sender());
148 if (!m_menuModels.contains(removed))
151 for (
int i = m_menuModels.count() -1; i >= 0; i--) {
152 LomiriMenuModelEntry* entry = m_menuModels[i];
154 if (entry == removed) {
160#include "lomirimenumodelstack.moc"