Skip to content

Commit 2e77042

Browse files
committed
Add models for menu bar components
1 parent f6d5027 commit 2e77042

File tree

11 files changed

+588
-0
lines changed

11 files changed

+588
-0
lines changed

src/uicomponents/CMakeLists.txt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,15 @@ set(MODULE_QML_FILES
55
CustomToolButton.qml
66
HoverToolTip.qml
77
)
8+
set(MODULE_SRC
9+
menubarmodel.cpp
10+
menubarmodel.h
11+
menumodel.cpp
12+
menumodel.h
13+
menuitemmodel.cpp
14+
menuitemmodel.h
15+
)
816

917
include(${PROJECT_SOURCE_DIR}/build/module.cmake)
18+
19+
add_subdirectory(test)

src/uicomponents/menubarmodel.cpp

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
// SPDX-License-Identifier: GPL-3.0-or-later
2+
3+
#include "menubarmodel.h"
4+
5+
using namespace scratchcpp::uicomponents;
6+
7+
MenuBarModel::MenuBarModel(QObject *parent) :
8+
QObject(parent)
9+
{
10+
}
11+
12+
QQmlListProperty<MenuModel> MenuBarModel::menus()
13+
{
14+
return QQmlListProperty<MenuModel>(this, &m_menus);
15+
}
16+
17+
const QList<MenuModel *> &MenuBarModel::getMenus() const
18+
{
19+
return m_menus;
20+
}
21+
22+
void MenuBarModel::addMenu(MenuModel *menu)
23+
{
24+
m_menus.push_back(menu);
25+
emit menusChanged();
26+
}
27+
28+
void MenuBarModel::removeMenu(MenuModel *menu)
29+
{
30+
m_menus.erase(std::remove(m_menus.begin(), m_menus.end(), menu), m_menus.end());
31+
emit menusChanged();
32+
}
33+
34+
void MenuBarModel::clear()
35+
{
36+
m_menus.clear();
37+
emit menusChanged();
38+
}

src/uicomponents/menubarmodel.h

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
// SPDX-License-Identifier: GPL-3.0-or-later
2+
3+
#pragma once
4+
5+
#include <QQmlEngine>
6+
7+
Q_MOC_INCLUDE("menumodel.h")
8+
9+
namespace scratchcpp::uicomponents
10+
{
11+
12+
class MenuModel;
13+
14+
class MenuBarModel : public QObject
15+
{
16+
Q_OBJECT
17+
QML_ELEMENT
18+
Q_PROPERTY(QQmlListProperty<MenuModel> menus READ menus NOTIFY menusChanged)
19+
20+
public:
21+
explicit MenuBarModel(QObject *parent = nullptr);
22+
23+
QQmlListProperty<MenuModel> menus();
24+
const QList<MenuModel *> &getMenus() const;
25+
26+
void addMenu(MenuModel *menu);
27+
void removeMenu(MenuModel *menu);
28+
void clear();
29+
30+
signals:
31+
void menusChanged();
32+
33+
private:
34+
QList<MenuModel *> m_menus;
35+
};
36+
37+
} // namespace scratchcpp::uicomponents

src/uicomponents/menuitemmodel.cpp

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
// SPDX-License-Identifier: GPL-3.0-or-later
2+
3+
#include "menuitemmodel.h"
4+
5+
using namespace scratchcpp::uicomponents;
6+
7+
MenuItemModel::MenuItemModel(QObject *parent) :
8+
QObject(parent)
9+
{
10+
}
11+
12+
const QString &MenuItemModel::text() const
13+
{
14+
return m_text;
15+
}
16+
17+
void MenuItemModel::setText(const QString &newText)
18+
{
19+
if (m_text == newText)
20+
return;
21+
22+
m_text = newText;
23+
emit textChanged();
24+
}
25+
26+
MenuModel *MenuItemModel::submenu() const
27+
{
28+
return m_submenu;
29+
}
30+
31+
void MenuItemModel::setSubmenu(MenuModel *newSubmenu)
32+
{
33+
if (m_submenu == newSubmenu)
34+
return;
35+
36+
m_submenu = newSubmenu;
37+
emit submenuChanged();
38+
}
39+
40+
bool MenuItemModel::isSeparator() const
41+
{
42+
return m_isSeparator;
43+
}
44+
45+
void MenuItemModel::setIsSeparator(bool newIsSeparator)
46+
{
47+
if (m_isSeparator == newIsSeparator)
48+
return;
49+
50+
m_isSeparator = newIsSeparator;
51+
emit isSeparatorChanged();
52+
}
53+
54+
bool MenuItemModel::checkable() const
55+
{
56+
return m_checkable;
57+
}
58+
59+
void MenuItemModel::setCheckable(bool newCheckable)
60+
{
61+
if (m_checkable == newCheckable)
62+
return;
63+
64+
m_checkable = newCheckable;
65+
emit checkableChanged();
66+
}
67+
68+
bool MenuItemModel::checked() const
69+
{
70+
return m_checked;
71+
}
72+
73+
void MenuItemModel::setChecked(bool newChecked)
74+
{
75+
if (m_checked == newChecked)
76+
return;
77+
78+
m_checked = newChecked;
79+
emit checkedChanged();
80+
}
81+
82+
bool MenuItemModel::enabled() const
83+
{
84+
return m_enabled;
85+
}
86+
87+
void MenuItemModel::setEnabled(bool newEnabled)
88+
{
89+
if (m_enabled == newEnabled)
90+
return;
91+
92+
m_enabled = newEnabled;
93+
emit enabledChanged();
94+
}

src/uicomponents/menuitemmodel.h

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
// SPDX-License-Identifier: GPL-3.0-or-later
2+
3+
#pragma once
4+
5+
#include <QQmlEngine>
6+
7+
namespace scratchcpp::uicomponents
8+
{
9+
10+
class MenuModel;
11+
12+
class MenuItemModel : public QObject
13+
{
14+
Q_OBJECT
15+
QML_ELEMENT
16+
Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged)
17+
Q_PROPERTY(MenuModel *submenu READ submenu WRITE setSubmenu NOTIFY submenuChanged)
18+
Q_PROPERTY(bool isSeparator READ isSeparator WRITE setIsSeparator NOTIFY isSeparatorChanged)
19+
Q_PROPERTY(bool checkable READ checkable WRITE setCheckable NOTIFY checkableChanged)
20+
Q_PROPERTY(bool checked READ checked WRITE setChecked NOTIFY checkedChanged)
21+
Q_PROPERTY(bool enabled READ enabled WRITE setEnabled NOTIFY enabledChanged)
22+
23+
public:
24+
explicit MenuItemModel(QObject *parent = nullptr);
25+
26+
const QString &text() const;
27+
void setText(const QString &newText);
28+
29+
MenuModel *submenu() const;
30+
void setSubmenu(MenuModel *newSubmenu);
31+
32+
bool isSeparator() const;
33+
void setIsSeparator(bool newIsSeparator);
34+
35+
bool checkable() const;
36+
void setCheckable(bool newCheckable);
37+
38+
bool checked() const;
39+
void setChecked(bool newChecked);
40+
41+
bool enabled() const;
42+
void setEnabled(bool newEnabled);
43+
44+
signals:
45+
void textChanged();
46+
void submenuChanged();
47+
void isSeparatorChanged();
48+
void checkableChanged();
49+
void checkedChanged();
50+
void enabledChanged();
51+
void clicked();
52+
53+
private:
54+
QString m_text;
55+
MenuModel *m_submenu = nullptr;
56+
bool m_isSeparator = false;
57+
bool m_checkable = false;
58+
bool m_checked = false;
59+
bool m_enabled = true;
60+
};
61+
62+
} // namespace scratchcpp::uicomponents

src/uicomponents/menumodel.cpp

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
// SPDX-License-Identifier: GPL-3.0-or-later
2+
3+
#include "menumodel.h"
4+
5+
using namespace scratchcpp::uicomponents;
6+
7+
MenuModel::MenuModel(QObject *parent) :
8+
QObject(parent)
9+
{
10+
}
11+
12+
const QString &MenuModel::title() const
13+
{
14+
return m_title;
15+
}
16+
17+
void MenuModel::setTitle(const QString &newTitle)
18+
{
19+
if (m_title == newTitle)
20+
return;
21+
22+
m_title = newTitle;
23+
emit titleChanged();
24+
}
25+
26+
QQmlListProperty<MenuItemModel> MenuModel::items()
27+
{
28+
return QQmlListProperty<MenuItemModel>(this, &m_items);
29+
}
30+
31+
const QList<MenuItemModel *> &MenuModel::getItems() const
32+
{
33+
return m_items;
34+
}
35+
36+
void MenuModel::addItem(MenuItemModel *item)
37+
{
38+
m_items.push_back(item);
39+
emit itemsChanged();
40+
}
41+
42+
void MenuModel::removeItem(MenuItemModel *item)
43+
{
44+
m_items.erase(std::remove(m_items.begin(), m_items.end(), item), m_items.end());
45+
emit itemsChanged();
46+
}
47+
48+
void MenuModel::clear()
49+
{
50+
m_items.clear();
51+
emit itemsChanged();
52+
}

src/uicomponents/menumodel.h

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
// SPDX-License-Identifier: GPL-3.0-or-later
2+
3+
#pragma once
4+
5+
#include <QQmlEngine>
6+
7+
namespace scratchcpp::uicomponents
8+
{
9+
10+
class MenuItemModel;
11+
12+
class MenuModel : public QObject
13+
{
14+
Q_OBJECT
15+
QML_ELEMENT
16+
Q_PROPERTY(QString title READ title WRITE setTitle NOTIFY titleChanged)
17+
Q_PROPERTY(QQmlListProperty<MenuItemModel> items READ items NOTIFY itemsChanged)
18+
19+
public:
20+
explicit MenuModel(QObject *parent = nullptr);
21+
22+
const QString &title() const;
23+
void setTitle(const QString &newTitle);
24+
25+
QQmlListProperty<MenuItemModel> items();
26+
const QList<MenuItemModel *> &getItems() const;
27+
28+
void addItem(MenuItemModel *item);
29+
void removeItem(MenuItemModel *item);
30+
void clear();
31+
32+
signals:
33+
void titleChanged();
34+
void itemsChanged();
35+
36+
private:
37+
QString m_title;
38+
QList<MenuItemModel *> m_items;
39+
};
40+
41+
} // namespace scratchcpp::uicomponents
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
set(MODULE_TEST_SRC
2+
menuitemmodel.cpp
3+
menumodel.cpp
4+
menubarmodel.cpp
5+
)
6+
7+
include(${PROJECT_SOURCE_DIR}/build/module_test.cmake)

0 commit comments

Comments
 (0)