Line data Source code
1 : /*
2 : * SPDX-License-Identifier: GPL-3.0-only
3 : * MuseScore-CLA-applies
4 : *
5 : * MuseScore Studio
6 : * Music Composition & Notation
7 : *
8 : * Copyright (C) 2021 MuseScore Limited and others
9 : *
10 : * This program is free software: you can redistribute it and/or modify
11 : * it under the terms of the GNU General Public License version 3 as
12 : * published by the Free Software Foundation.
13 : *
14 : * This program is distributed in the hope that it will be useful,
15 : * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 : * GNU General Public License for more details.
18 : *
19 : * You should have received a copy of the GNU General Public License
20 : * along with this program. If not, see <https://www.gnu.org/licenses/>.
21 : */
22 :
23 : #pragma once
24 :
25 : #include <QObject>
26 : #include <QQuickItem>
27 : #include <qqmlintegration.h>
28 :
29 : #include "translation.h"
30 : #include "qmllistproperty.h"
31 :
32 : namespace muse::uicomponents {
33 : class ButtonBoxModel : public QObject
34 : {
35 : Q_OBJECT
36 : QML_ELEMENT;
37 :
38 : Q_PROPERTY(ButtonLayout buttonLayout READ buttonLayout WRITE setButtonLayout NOTIFY buttonLayoutChanged)
39 :
40 : Q_PROPERTY(QQmlListProperty<QQuickItem> buttonsItems READ buttonsItems NOTIFY buttonsItemsChanged)
41 :
42 : public:
43 : explicit ButtonBoxModel(QObject* parent = nullptr);
44 :
45 : enum ButtonType {
46 : NoButton,
47 : Ok,
48 : Continue,
49 : RestoreDefaults,
50 : Reset,
51 : Apply,
52 : Help,
53 : Discard,
54 : Cancel,
55 : Close,
56 : Ignore,
57 : Retry,
58 : Abort,
59 : NoToAll,
60 : No,
61 : YesToAll,
62 : Yes,
63 : Open,
64 : DontSave,
65 : SaveAll,
66 : Save,
67 : Next,
68 : Back,
69 : Select,
70 : Clear,
71 : Done,
72 :
73 : CustomButton,
74 :
75 : FirstButton = Ok,
76 : LastButton = CustomButton
77 : };
78 0 : Q_ENUM(ButtonType)
79 :
80 : enum ButtonRole { // Keep updated with buttonRoleLayouts
81 : AcceptRole,
82 : RejectRole,
83 : DestructiveRole,
84 : ResetRole,
85 : ApplyRole,
86 : RetryRole,
87 : HelpRole,
88 : ContinueRole,
89 : BackRole,
90 : CustomRole
91 : };
92 0 : Q_ENUM(ButtonRole)
93 :
94 : enum ButtonLayout {
95 : UnknownLayout = -1,
96 : WinLayout,
97 : MacLayout,
98 : LinuxLayout
99 : };
100 0 : Q_ENUM(ButtonLayout)
101 :
102 : Q_INVOKABLE QList<int> load();
103 : Q_INVOKABLE void setButtons(const QVariantList& buttons);
104 :
105 : ButtonLayout buttonLayout() const;
106 : void setButtonLayout(ButtonLayout newButtonLayout);
107 :
108 : QQmlListProperty<QQuickItem> buttonsItems();
109 :
110 : signals:
111 : void buttonLayoutChanged();
112 : void buttonsItemsChanged();
113 :
114 : void addButton(QString text, int buttonType, ButtonRole buttonRole, bool isAccent, bool isLeftSide);
115 : void reloadRequested();
116 :
117 : private:
118 : const std::vector<ButtonRole>& chooseButtonLayoutType();
119 :
120 : struct LayoutButton {
121 : QString text;
122 : int buttonType = int(ButtonType::NoButton);
123 : ButtonRole buttonRole = ButtonRole::CustomRole;
124 : bool isAccent = false;
125 : bool isLeftSide = false;
126 :
127 0 : LayoutButton(QString _text, int _buttonType, ButtonRole _buttonRole, bool _isAccent, bool _isLeftSide = false)
128 0 : : text(_text), buttonType(_buttonType), buttonRole(_buttonRole), isAccent(_isAccent), isLeftSide(_isLeftSide)
129 : {
130 0 : }
131 : };
132 :
133 : LayoutButton* layoutButton(const QQuickItem* item) const;
134 :
135 : QHash<ButtonType, LayoutButton*> m_layoutButtons {
136 : { NoButton, new LayoutButton(muse::qtrc("uicomponents", "No button"), NoButton, RejectRole, true) },
137 : { Ok, new LayoutButton(muse::qtrc("uicomponents", "OK"), Ok, AcceptRole, true) },
138 : { Save, new LayoutButton(muse::qtrc("uicomponents", "Save"), Save, ApplyRole, true) },
139 : { SaveAll, new LayoutButton(muse::qtrc("uicomponents", "Save all"), SaveAll, ApplyRole, false) },
140 : { DontSave, new LayoutButton(muse::qtrc("uicomponents", "Don’t save"), DontSave, DestructiveRole, false) },
141 : { Open, new LayoutButton(muse::qtrc("uicomponents", "Open"), Open, AcceptRole, true) },
142 : { Yes, new LayoutButton(muse::qtrc("uicomponents", "Yes"), Yes, AcceptRole, true) },
143 : { YesToAll, new LayoutButton(muse::qtrc("uicomponents", "Yes to all"), YesToAll, AcceptRole, false) },
144 : { No, new LayoutButton(muse::qtrc("uicomponents", "No"), No, RejectRole, false) },
145 : { NoToAll, new LayoutButton(muse::qtrc("uicomponents", "No to all"), NoToAll, RejectRole, false) },
146 : { Abort, new LayoutButton(muse::qtrc("uicomponents", "Abort"), Abort, RejectRole, false) },
147 : { Retry, new LayoutButton(muse::qtrc("uicomponents", "Retry"), Retry, RetryRole, false) },
148 : { Ignore, new LayoutButton(muse::qtrc("uicomponents", "Ignore"), Ignore, DestructiveRole, false) },
149 : { Close, new LayoutButton(muse::qtrc("uicomponents", "Close"), Close, RejectRole, false) },
150 : { Cancel, new LayoutButton(muse::qtrc("uicomponents", "Cancel"), Cancel, RejectRole, false) },
151 : { Discard, new LayoutButton(muse::qtrc("uicomponents", "Discard"), Discard, DestructiveRole, false) },
152 : { Help, new LayoutButton(muse::qtrc("uicomponents", "Help"), Help, HelpRole, false) },
153 : { Apply, new LayoutButton(muse::qtrc("uicomponents", "Apply"), Apply, ApplyRole, false) },
154 : { Reset, new LayoutButton(muse::qtrc("uicomponents", "Reset"), Reset, ResetRole, false) },
155 : { RestoreDefaults, new LayoutButton(muse::qtrc("uicomponents", "Restore defaults"), RestoreDefaults, ResetRole, false) },
156 : { Continue, new LayoutButton(muse::qtrc("uicomponents", "Continue"), Continue, ContinueRole, true) },
157 : { Next, new LayoutButton(muse::qtrc("uicomponents", "Next"), Next, ContinueRole, false) },
158 : { Back, new LayoutButton(muse::qtrc("uicomponents", "Back"), Back, BackRole, false) },
159 : { Select, new LayoutButton(muse::qtrc("uicomponents", "Select"), Select, AcceptRole, true) },
160 : { Clear, new LayoutButton(muse::qtrc("uicomponents", "Clear"), Clear, DestructiveRole, false) },
161 : { Done, new LayoutButton(muse::qtrc("uicomponents", "Done"), Done, AcceptRole, true) }
162 : };
163 :
164 : std::vector<std::vector<ButtonRole> > buttonRoleLayouts = {
165 : // WinLayout
166 : std::vector <ButtonRole> { CustomRole, ResetRole, RetryRole, BackRole, AcceptRole, ApplyRole, ContinueRole, DestructiveRole,
167 : RejectRole, HelpRole },
168 :
169 : // MacLayout
170 : std::vector <ButtonRole> { CustomRole, HelpRole, RetryRole, DestructiveRole, RejectRole, ResetRole, BackRole, AcceptRole,
171 : ApplyRole, ContinueRole },
172 :
173 : // LinuxLayout
174 : std::vector <ButtonRole> { CustomRole, HelpRole, RetryRole, DestructiveRole, RejectRole, ResetRole, BackRole, AcceptRole,
175 : ApplyRole, ContinueRole }
176 : };
177 :
178 : ButtonLayout m_buttonLayout = ButtonLayout::UnknownLayout;
179 : QmlListProperty<QQuickItem> m_buttonsItems;
180 : };
181 : }
|