add nf7::Config interface

This commit is contained in:
falsycat 2022-11-06 12:07:44 +09:00
parent 7ee26d431e
commit 2ec4422c56
16 changed files with 140 additions and 55 deletions

View File

@ -67,12 +67,14 @@ target_sources(nf7
common/aggregate_command.hh
common/aggregate_promise.hh
common/audio_queue.hh
common/config.hh
common/dir.hh
common/dir_item.hh
common/factory.hh
common/file_base.hh
common/font_queue.hh
common/future.hh
common/generic_config.hh
common/generic_context.hh
common/generic_history.hh
common/generic_memento.hh
@ -87,7 +89,6 @@ target_sources(nf7
common/gui.cc
common/gui_config.hh
common/gui_dnd.hh
common/gui_node.hh
common/gui_timeline.hh
common/gui_timeline.cc
common/gui_value.hh
@ -107,7 +108,6 @@ target_sources(nf7
common/luajit_thread.cc
common/memento.hh
common/memento_recorder.hh
common/mutable_memento.hh
common/mutex.hh
common/nfile.hh
common/nfile_watcher.hh

22
common/config.hh Normal file
View File

@ -0,0 +1,22 @@
#pragma once
#include <string>
#include "nf7.hh"
namespace nf7 {
class Config : public nf7::File::Interface {
public:
Config() = default;
Config(const Config&) = delete;
Config(Config&&) = delete;
Config& operator=(const Config&) = delete;
Config& operator=(Config&&) = delete;
virtual std::string Stringify() const noexcept = 0;
virtual void Parse(const std::string&) = 0;
};
} // namespace nf7

52
common/generic_config.hh Normal file
View File

@ -0,0 +1,52 @@
#pragma once
#include <functional>
#include <string>
#include "nf7.hh"
#include "common/config.hh"
#include "common/generic_memento.hh"
namespace nf7 {
template <typename T>
concept ConfigData = requires (T& x) {
{ x.Stringify() } -> std::convertible_to<std::string>;
x.Parse(std::string {});
};
class GenericConfig : public nf7::Config {
public:
GenericConfig() = delete;
template <ConfigData T>
GenericConfig(nf7::GenericMemento<T>& mem) noexcept {
stringify_ = [&mem]() {
return mem->Stringify();
};
parse_ = [&mem](auto& str) {
mem->Parse(str);
mem.Commit();
};
}
GenericConfig(const GenericConfig&) = delete;
GenericConfig(GenericConfig&&) = delete;
GenericConfig& operator=(const GenericConfig&) = delete;
GenericConfig& operator=(GenericConfig&&) = delete;
std::string Stringify() const noexcept override {
return stringify_();
}
void Parse(const std::string& str) override {
parse_(str);
}
private:
std::function<std::string()> stringify_;
std::function<void(const std::string&)> parse_;
};
} // namespace nf7

View File

@ -7,13 +7,13 @@
#include "nf7.hh"
#include "common/mutable_memento.hh"
#include "common/memento.hh"
namespace nf7 {
template <typename T>
class GenericMemento : public nf7::MutableMemento {
class GenericMemento : public nf7::Memento {
public:
class CustomTag;
@ -52,12 +52,12 @@ class GenericMemento : public nf7::MutableMemento {
onRestore();
if (file_) file_->Touch();
}
void Commit() noexcept override {
void Commit() noexcept {
tag_ = nullptr;
onCommit();
if (file_) file_->Touch();
}
void CommitAmend() noexcept override {
void CommitAmend() noexcept {
if (!tag_) return;
auto itr = map_.find(tag_->id());
assert(itr != map_.end());

View File

@ -1,20 +0,0 @@
#pragma once
#include "common/memento.hh"
namespace nf7 {
class MutableMemento : public nf7::Memento {
public:
MutableMemento() = default;
MutableMemento(const MutableMemento&) = delete;
MutableMemento(MutableMemento&&) = delete;
MutableMemento& operator=(const MutableMemento&) = delete;
MutableMemento& operator=(MutableMemento&&) = delete;
virtual void Commit() noexcept = 0;
virtual void CommitAmend() noexcept = 0;
};
} // namespace nf7

View File

@ -22,9 +22,11 @@
#include "nf7.hh"
#include "common/audio_queue.hh"
#include "common/config.hh"
#include "common/dir_item.hh"
#include "common/file_base.hh"
#include "common/future.hh"
#include "common/generic_config.hh"
#include "common/generic_context.hh"
#include "common/generic_memento.hh"
#include "common/generic_type_info.hh"
@ -44,7 +46,8 @@ using namespace std::literals;
namespace nf7 {
namespace {
class Device final : public nf7::FileBase, public nf7::DirItem, public nf7::Node {
class Device final : public nf7::FileBase,
public nf7::GenericConfig, public nf7::DirItem, public nf7::Node {
public:
static inline const nf7::GenericTypeInfo<Device> kType = {
"Audio/Device", {"nf7::DirItem",}};
@ -82,7 +85,6 @@ class Device final : public nf7::FileBase, public nf7::DirItem, public nf7::Node
Data() noexcept { }
std::string Stringify() const noexcept;
void Parse(const std::string&);
void serialize(auto& ar) {
ar(ctxpath, mode, devname, fmt, srate, ch);
}
@ -101,6 +103,7 @@ class Device final : public nf7::FileBase, public nf7::DirItem, public nf7::Node
Device(nf7::Env& env, Data&& data = {}) noexcept :
nf7::FileBase(kType, env),
nf7::GenericConfig(mem_),
nf7::DirItem(nf7::DirItem::kMenu | nf7::DirItem::kTooltip),
nf7::Node(nf7::Node::kNone),
life_(*this), log_(*this), mem_(std::move(data), *this) {
@ -135,7 +138,7 @@ class Device final : public nf7::FileBase, public nf7::DirItem, public nf7::Node
File::Interface* interface(const std::type_info& t) noexcept override {
return nf7::InterfaceSelector<
nf7::DirItem, nf7::Memento, nf7::Node>(t).Select(this, &mem_);
nf7::Config, nf7::DirItem, nf7::Memento, nf7::Node>(t).Select(this, &mem_);
}
private:

View File

@ -21,6 +21,7 @@
#include "common/font_face.hh"
#include "common/font_queue.hh"
#include "common/future.hh"
#include "common/generic_config.hh"
#include "common/generic_type_info.hh"
#include "common/generic_memento.hh"
#include "common/gui_config.hh"
@ -37,7 +38,7 @@ namespace nf7 {
namespace {
class FontFace final : public nf7::FileBase,
public nf7::DirItem, public nf7::Node,
public nf7::GenericConfig, public nf7::DirItem, public nf7::Node,
public nf7::AsyncFactory<std::shared_ptr<nf7::font::Face>> {
public:
static inline const nf7::GenericTypeInfo<FontFace> kType = {"Font/Face", {"nf7::DirItem",}};
@ -70,6 +71,7 @@ class FontFace final : public nf7::FileBase,
FontFace(nf7::Env& env, Data&& d = {}) noexcept :
nf7::FileBase(kType, env),
nf7::GenericConfig(mem_),
nf7::DirItem(nf7::DirItem::kMenu |
nf7::DirItem::kTooltip),
nf7::Node(nf7::Node::kNone),
@ -119,7 +121,7 @@ class FontFace final : public nf7::FileBase,
nf7::File::Interface* interface(const std::type_info& t) noexcept {
return nf7::InterfaceSelector<
nf7::DirItem, nf7::Memento, nf7::Node>(t).Select(this, &mem_);
nf7::Config, nf7::DirItem, nf7::Memento, nf7::Node>(t).Select(this, &mem_);
}
private:

View File

@ -30,6 +30,7 @@
#include "common/dir_item.hh"
#include "common/factory.hh"
#include "common/file_base.hh"
#include "common/generic_config.hh"
#include "common/generic_context.hh"
#include "common/generic_memento.hh"
#include "common/generic_type_info.hh"
@ -78,7 +79,7 @@ concept HasWindow = requires(T& x) {
template <typename T>
class ObjBase : public nf7::FileBase,
public nf7::DirItem, public nf7::Node,
public nf7::GenericConfig, public nf7::DirItem, public nf7::Node,
public nf7::AsyncFactory<nf7::Mutex::Resource<std::shared_ptr<typename T::Product>>> {
public:
using ThisObjBase = ObjBase<T>;
@ -96,6 +97,7 @@ class ObjBase : public nf7::FileBase,
ObjBase(nf7::Env& env, T&& data = {}) noexcept :
nf7::FileBase(TypeInfo::kType, env),
nf7::GenericConfig(mem_),
nf7::DirItem(nf7::DirItem::kMenu |
nf7::DirItem::kTooltip),
nf7::Node(nf7::Node::kNone),
@ -225,7 +227,7 @@ class ObjBase : public nf7::FileBase,
nf7::File::Interface* interface(const std::type_info& t) noexcept override {
return nf7::InterfaceSelector<
nf7::DirItem, nf7::Memento, nf7::Node, ThisFactory>(t).Select(this, &mem_);
nf7::Config, nf7::DirItem, nf7::Memento, nf7::Node, ThisFactory>(t).Select(this, &mem_);
}
private:

View File

@ -19,8 +19,9 @@
#include "common/dir_item.hh"
#include "common/file_base.hh"
#include "common/generic_type_info.hh"
#include "common/generic_config.hh"
#include "common/generic_memento.hh"
#include "common/generic_type_info.hh"
#include "common/gui.hh"
#include "common/gui_config.hh"
#include "common/life.hh"
@ -40,7 +41,8 @@ using namespace std::literals;
namespace nf7 {
namespace {
class Node final : public nf7::FileBase, public nf7::DirItem, public nf7::Node {
class Node final : public nf7::FileBase,
public nf7::GenericConfig, public nf7::DirItem, public nf7::Node {
public:
static inline const nf7::GenericTypeInfo<Node> kType =
{"LuaJIT/Node", {"nf7::DirItem", "nf7::Node"}};
@ -62,6 +64,7 @@ class Node final : public nf7::FileBase, public nf7::DirItem, public nf7::Node {
Node(nf7::Env& env, Data&& data = {}) noexcept :
nf7::FileBase(kType, env),
nf7::GenericConfig(mem_),
nf7::DirItem(nf7::DirItem::kMenu | nf7::DirItem::kWidget),
nf7::Node(nf7::Node::kCustomNode),
life_(*this),
@ -104,7 +107,7 @@ class Node final : public nf7::FileBase, public nf7::DirItem, public nf7::Node {
File::Interface* interface(const std::type_info& t) noexcept override {
return nf7::InterfaceSelector<
nf7::DirItem, nf7::Memento, nf7::Node>(t).Select(this, &mem_);
nf7::Config, nf7::DirItem, nf7::Memento, nf7::Node>(t).Select(this, &mem_);
}
private:

View File

@ -26,6 +26,7 @@
#include "common/dir_item.hh"
#include "common/file_base.hh"
#include "common/generic_config.hh"
#include "common/generic_context.hh"
#include "common/generic_memento.hh"
#include "common/generic_type_info.hh"
@ -49,7 +50,8 @@ using namespace std::literals;
namespace nf7 {
namespace {
class Network final : public nf7::FileBase, public nf7::DirItem, public nf7::Node {
class Network final : public nf7::FileBase,
public nf7::GenericConfig, public nf7::DirItem, public nf7::Node {
public:
static inline const GenericTypeInfo<Network> kType = {
"Node/Network", {"nf7::DirItem", "nf7::Node"}};
@ -112,6 +114,7 @@ class Network final : public nf7::FileBase, public nf7::DirItem, public nf7::Nod
nf7::NodeLinkStore&& links = {},
Data&& d = {}) :
nf7::FileBase(kType, env),
nf7::GenericConfig(mem_),
nf7::DirItem(nf7::DirItem::kMenu |
nf7::DirItem::kTooltip |
nf7::DirItem::kWidget),
@ -170,7 +173,8 @@ class Network final : public nf7::FileBase, public nf7::DirItem, public nf7::Nod
}
File::Interface* interface(const std::type_info& t) noexcept override {
return InterfaceSelector<nf7::DirItem, nf7::Node>(t).Select(this);
return nf7::InterfaceSelector<
nf7::Config, nf7::DirItem, nf7::Node>(t).Select(this);
}
private:

View File

@ -29,7 +29,8 @@
namespace nf7 {
namespace {
class Adaptor final : public nf7::FileBase, public nf7::Sequencer {
class Adaptor final : public nf7::FileBase,
public nf7::Sequencer {
public:
static inline const nf7::GenericTypeInfo<Adaptor> kType =
{"Sequencer/Adaptor", {"nf7::Sequencer"}};
@ -66,9 +67,9 @@ class Adaptor final : public nf7::FileBase, public nf7::Sequencer {
Adaptor(nf7::Env& env, Data&& d = {}) noexcept :
nf7::FileBase(kType, env),
Sequencer(Sequencer::kCustomItem |
Sequencer::kTooltip |
Sequencer::kParamPanel),
nf7::Sequencer(Sequencer::kCustomItem |
Sequencer::kTooltip |
Sequencer::kParamPanel),
life_(*this), mem_(std::move(d), *this) {
}

View File

@ -16,11 +16,12 @@
#include "common/dir_item.hh"
#include "common/file_base.hh"
#include "common/gui.hh"
#include "common/gui_config.hh"
#include "common/generic_config.hh"
#include "common/generic_context.hh"
#include "common/generic_memento.hh"
#include "common/generic_type_info.hh"
#include "common/gui.hh"
#include "common/gui_config.hh"
#include "common/life.hh"
#include "common/logger.hh"
#include "common/logger_ref.hh"
@ -33,7 +34,8 @@
namespace nf7 {
namespace {
class Event final : public nf7::FileBase, public nf7::DirItem, public nf7::Node {
class Event final : public nf7::FileBase,
public nf7::GenericConfig, public nf7::DirItem, public nf7::Node {
public:
static inline const nf7::GenericTypeInfo<Event> kType = {
"System/Event", {"nf7::DirItem"}};
@ -71,6 +73,7 @@ class Event final : public nf7::FileBase, public nf7::DirItem, public nf7::Node
Event(nf7::Env& env, Data&& d = {}) noexcept :
nf7::FileBase(kType, env),
nf7::GenericConfig(mem_),
nf7::DirItem(nf7::DirItem::kMenu),
nf7::Node(nf7::Node::kMenu_DirItem),
life_(*this), log_(*this),
@ -102,7 +105,8 @@ class Event final : public nf7::FileBase, public nf7::DirItem, public nf7::Node
void UpdateMenu() noexcept override;
nf7::File::Interface* interface(const std::type_info& t) noexcept override {
return nf7::InterfaceSelector<nf7::DirItem, nf7::Node>(t).Select(this);
return nf7::InterfaceSelector<
nf7::Config, nf7::DirItem, nf7::Node>(t).Select(this);
}
private:

View File

@ -18,6 +18,7 @@
#include "nf7.hh"
#include "common/dir_item.hh"
#include "common/generic_config.hh"
#include "common/generic_memento.hh"
#include "common/generic_type_info.hh"
#include "common/gui_config.hh"
@ -32,7 +33,8 @@ using namespace std::literals;
namespace nf7 {
namespace {
class ImGui_ final : public nf7::File, public nf7::DirItem {
class ImGui_ final : public nf7::File,
public nf7::GenericConfig, public nf7::DirItem {
public:
static inline const nf7::GenericTypeInfo<ImGui_> kType = {"System/ImGui", {}};
@ -71,6 +73,7 @@ class ImGui_ final : public nf7::File, public nf7::DirItem {
ImGui_(nf7::Env& env) noexcept :
nf7::File(kType, env),
nf7::GenericConfig(mem_),
nf7::DirItem(nf7::DirItem::kMenu |
nf7::DirItem::kEarlyUpdate),
mem_({}, *this) {
@ -97,7 +100,8 @@ class ImGui_ final : public nf7::File, public nf7::DirItem {
void UpdateMenu() noexcept override;
nf7::File::Interface* interface(const std::type_info& t) noexcept override {
return nf7::InterfaceSelector<nf7::DirItem>(t).Select(this);
return nf7::InterfaceSelector<
nf7::Config, nf7::DirItem>(t).Select(this);
}
private:

View File

@ -18,6 +18,7 @@
#include "common/dir_item.hh"
#include "common/file_base.hh"
#include "common/generic_config.hh"
#include "common/generic_context.hh"
#include "common/generic_memento.hh"
#include "common/generic_type_info.hh"
@ -36,7 +37,7 @@ namespace nf7 {
namespace {
class Logger final : public nf7::FileBase,
public nf7::DirItem {
public nf7::GenericConfig, public nf7::DirItem {
public:
static inline const nf7::GenericTypeInfo<Logger> kType = {
"System/Logger", {"nf7::DirItem"}};
@ -111,7 +112,9 @@ class Logger final : public nf7::FileBase,
};
Logger(nf7::Env& env, Data&& d = {}) noexcept :
nf7::FileBase(kType, env), nf7::DirItem(DirItem::kMenu),
nf7::FileBase(kType, env),
nf7::GenericConfig(mem_),
nf7::DirItem(DirItem::kMenu),
mem_(std::move(d), *this), win_(*this, "Log View") {
mem_.onCommit = mem_.onRestore = [this]() {
store_->param(mem_.data());
@ -151,7 +154,7 @@ class Logger final : public nf7::FileBase,
void UpdateRowMenu(const Row&) noexcept;
nf7::File::Interface* interface(const std::type_info& t) noexcept override {
return InterfaceSelector<nf7::DirItem, nf7::Logger>(t).
return nf7::InterfaceSelector<nf7::Config, nf7::DirItem, nf7::Logger>(t).
Select(this, store_.get());
}

View File

@ -18,6 +18,7 @@
#include "common/dir_item.hh"
#include "common/file_base.hh"
#include "common/generic_config.hh"
#include "common/generic_context.hh"
#include "common/generic_memento.hh"
#include "common/generic_type_info.hh"
@ -37,7 +38,7 @@ namespace nf7 {
namespace {
class NFile final : public nf7::FileBase,
public nf7::DirItem, public nf7::Node {
public nf7::GenericConfig, public nf7::DirItem, public nf7::Node {
public:
static inline const nf7::GenericTypeInfo<NFile> kType = {
"System/NFile", {"nf7::DirItem", "nf7::Node"}};
@ -113,6 +114,7 @@ class NFile final : public nf7::FileBase,
NFile(nf7::Env& env, Data&& data = {}) noexcept :
nf7::FileBase(kType, env),
nf7::GenericConfig(mem_),
nf7::DirItem(nf7::DirItem::kMenu |
nf7::DirItem::kTooltip),
nf7::Node(nf7::Node::kMenu_DirItem),
@ -156,7 +158,8 @@ class NFile final : public nf7::FileBase,
void UpdateTooltip() noexcept override;
File::Interface* interface(const std::type_info& t) noexcept override {
return InterfaceSelector<nf7::DirItem, nf7::Node>(t).Select(this);
return nf7::InterfaceSelector<
nf7::Config, nf7::DirItem, nf7::Node>(t).Select(this);
}
private:

View File

@ -21,6 +21,7 @@
#include "common/dir_item.hh"
#include "common/file_base.hh"
#include "common/generic_config.hh"
#include "common/generic_memento.hh"
#include "common/generic_type_info.hh"
#include "common/gui_config.hh"
@ -111,6 +112,7 @@ class Plot final : public nf7::FileBase,
Plot(nf7::Env& env, Data&& data = {}) noexcept :
nf7::FileBase(kType, env),
nf7::GenericConfig(mem_),
nf7::DirItem(nf7::DirItem::kMenu),
nf7::Node(nf7::Node::kNone),
life_(*this), log_(*this), win_(*this, "Plot"), mem_(std::move(data)) {
@ -143,8 +145,8 @@ class Plot final : public nf7::FileBase,
void UpdateMenu() noexcept override;
nf7::File::Interface* interface(const std::type_info& t) noexcept override {
return InterfaceSelector<
nf7::DirItem, nf7::Memento, nf7::Node>(t).Select(this, &mem_);
return nf7::InterfaceSelector<
nf7::Config, nf7::DirItem, nf7::Memento, nf7::Node>(t).Select(this, &mem_);
}
private: