MuseScore/src/framework/global/iinteractive.h
2023-05-19 18:18:58 +03:00

205 lines
7.4 KiB
C++

/*
* SPDX-License-Identifier: GPL-3.0-only
* MuseScore-CLA-applies
*
* MuseScore
* Music Composition & Notation
*
* Copyright (C) 2021 MuseScore BVBA and others
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef MU_FRAMEWORK_IINTERACTIVE_H
#define MU_FRAMEWORK_IINTERACTIVE_H
#include "modularity/imoduleinterface.h"
#include "io/path.h"
#include "types/val.h"
#include "types/retval.h"
#include "types/uri.h"
#include "types/flags.h"
#include "progress.h"
namespace mu::framework {
class IInteractive : MODULE_EXPORT_INTERFACE
{
INTERFACE_ID(IInteractive)
public:
virtual ~IInteractive() = default;
// question
enum class Button {
NoButton,
Ok,
Save,
SaveAll,
DontSave,
Open,
Yes,
YesToAll,
No,
NoToAll,
Abort,
Retry,
Ignore,
Close,
Cancel,
Discard,
Help,
Apply,
Reset,
Continue,
CustomButton
};
using Buttons = std::vector<Button>;
struct ButtonData {
int btn = int(Button::CustomButton);
std::string text;
bool accent = false;
ButtonData(int btn, const std::string& text)
: btn(btn), text(text) {}
ButtonData(Button btn, const std::string& text)
: btn(int(btn)), text(text) {}
ButtonData(int btn, const std::string& text, bool accent)
: btn(btn), text(text), accent(accent) {}
ButtonData(Button btn, const std::string& text, bool accent)
: btn(int(btn)), text(text), accent(accent) {}
};
using ButtonDatas = std::vector<ButtonData>;
enum class TextFormat {
Auto = 0,
PlainText,
RichText
};
struct Text {
std::string text;
TextFormat format = TextFormat::Auto;
Text() = default;
Text(const char* t)
: text(t), format(TextFormat::Auto) {}
Text(const std::string& t, const TextFormat& f = TextFormat::Auto)
: text(t), format(f) {}
};
struct Result
{
Result() = default;
Result(const int& button)
: m_button(button) {}
Result(const int& button, bool showAgain)
: m_button(button), m_showAgain(showAgain) {}
Button standardButton() const { return static_cast<Button>(m_button); }
int button() const { return m_button; }
bool showAgain() const { return m_showAgain; }
private:
int m_button = int(Button::NoButton);
bool m_showAgain = true;
};
enum Option {
NoOptions = 0x0,
WithIcon = 0x1,
WithDontShowAgainCheckBox = 0x2
};
DECLARE_FLAGS(Options, Option)
virtual Result question(const std::string& title, const std::string& text, const Buttons& buttons, const Button& def = Button::NoButton,
const Options& options = {}) const = 0;
virtual Result question(const std::string& title, const Text& text, const ButtonDatas& buttons, int defBtn = int(Button::NoButton),
const Options& options = {}) const = 0;
virtual ButtonData buttonData(Button b) const = 0;
// info
virtual Result info(const std::string& title, const std::string& text, const Buttons& buttons = {}, int defBtn = int(Button::NoButton),
const Options& options = {}) const = 0;
virtual Result info(const std::string& title, const Text& text, const ButtonDatas& buttons = {}, int defBtn = int(Button::NoButton),
const Options& options = {}) const = 0;
// warning
virtual Result warning(const std::string& title, const std::string& text, const Buttons& buttons = {},
const Button& def = Button::NoButton, const Options& options = { WithIcon }) const = 0;
virtual Result warning(const std::string& title, const Text& text, const ButtonDatas& buttons = {}, int defBtn = int(Button::NoButton),
const Options& options = { WithIcon }) const = 0;
virtual Result warning(const std::string& title, const Text& text, const std::string& detailedText, const ButtonDatas& buttons = {},
int defBtn = int(Button::NoButton), const Options& options = { WithIcon }) const = 0;
// error
virtual Result error(const std::string& title, const std::string& text, const Buttons& buttons = {},
const Button& def = Button::NoButton, const Options& options = { WithIcon }) const = 0;
virtual Result error(const std::string& title, const Text& text, const ButtonDatas& buttons = {}, int defBtn = int(Button::NoButton),
const Options& options = { WithIcon }) const = 0;
virtual Result error(const std::string& title, const Text& text, const std::string& detailedText, const ButtonDatas& buttons = {},
int defBtn = int(Button::NoButton), const Options& options = { WithIcon }) const = 0;
// progress
virtual Ret showProgress(const std::string& title, framework::Progress* progress) const = 0;
// files
virtual io::path_t selectOpeningFile(const QString& title, const io::path_t& dir, const std::vector<std::string>& filter) = 0;
virtual io::path_t selectSavingFile(const QString& title, const io::path_t& path, const std::vector<std::string>& filter,
bool confirmOverwrite = true) = 0;
// dirs
virtual io::path_t selectDirectory(const QString& title, const io::path_t& dir) = 0;
virtual io::paths_t selectMultipleDirectories(const QString& title, const io::path_t& dir, const io::paths_t& selectedDirectories) = 0;
// color
virtual QColor selectColor(const QColor& color = Qt::white, const QString& title = "") = 0;
// custom
virtual RetVal<Val> open(const std::string& uri) const = 0;
virtual RetVal<Val> open(const Uri& uri) const = 0;
virtual RetVal<Val> open(const UriQuery& uri) const = 0;
virtual RetVal<bool> isOpened(const std::string& uri) const = 0;
virtual RetVal<bool> isOpened(const Uri& uri) const = 0;
virtual RetVal<bool> isOpened(const UriQuery& uri) const = 0;
virtual async::Channel<Uri> opened() const = 0;
virtual void raise(const UriQuery& uri) = 0;
virtual void close(const std::string& uri) = 0;
virtual void close(const Uri& uri) = 0;
virtual void close(const UriQuery& uri) = 0;
virtual void closeAllDialogs() = 0;
virtual ValCh<Uri> currentUri() const = 0;
virtual std::vector<Uri> stack() const = 0;
virtual Ret openUrl(const std::string& url) const = 0;
virtual Ret openUrl(const QUrl& url) const = 0;
/// Opens a file browser at the parent directory of filePath,
/// and selects the file at filePath on OSs that support it
virtual Ret revealInFileBrowser(const io::path_t& filePath) const = 0;
};
DECLARE_OPERATORS_FOR_FLAGS(IInteractive::Options)
}
#endif // MU_FRAMEWORK_IINTERACTIVE_H