improve nf7::FileBase interface to prevent from forgetting calling super method

This commit is contained in:
2022-11-06 23:03:22 +09:00
parent 61865f4d26
commit 5894acda8c
8 changed files with 43 additions and 54 deletions

View File

@@ -30,7 +30,10 @@ class FileBase : public nf7::File {
using nf7::File::File;
nf7::File* Find(std::string_view name) const noexcept override {
nf7::File* Find(std::string_view name) const noexcept final {
if (auto ret = PreFind(name)) {
return ret;
}
for (auto feat : feats_) {
if (auto ret = feat->Find(name)) {
return ret;
@@ -38,17 +41,30 @@ class FileBase : public nf7::File {
}
return nullptr;
}
void Handle(const nf7::File::Event& ev) noexcept override {
void Handle(const nf7::File::Event& ev) noexcept final {
PreHandle(ev);
for (auto feat : feats_) {
feat->Handle(ev);
}
PostHandle(ev);
}
void Update() noexcept override {
void Update() noexcept final {
PreUpdate();
for (auto feat : feats_) {
feat->Update();
}
PostUpdate();
}
protected:
virtual nf7::File* PreFind(std::string_view) const noexcept { return nullptr; }
virtual void PreHandle(const nf7::File::Event&) noexcept { }
virtual void PostHandle(const nf7::File::Event&) noexcept { }
virtual void PreUpdate() noexcept { }
virtual void PostUpdate() noexcept { }
private:
std::vector<Feature*> feats_;
};

View File

@@ -99,7 +99,7 @@ class Node final : public nf7::FileBase,
nf7::Future<std::shared_ptr<nf7::luajit::Ref>> Build() noexcept;
void Update() noexcept override;
void PostUpdate() noexcept override;
void UpdateNode(nf7::Node::Editor&) noexcept override;
File::Interface* interface(const std::type_info& t) noexcept override {
@@ -228,9 +228,7 @@ try {
}
void Node::Update() noexcept {
nf7::FileBase::Update();
void Node::PostUpdate() noexcept {
if (last_build_ < importer_->GetLatestMod()) {
cache_ = std::nullopt;
}

View File

@@ -151,11 +151,11 @@ class Network final : public nf7::FileBase,
env, std::move(items), NodeLinkStore(links_));
}
File* Find(std::string_view name) const noexcept;
File* PreFind(std::string_view name) const noexcept override;
void Handle(const Event& ev) noexcept override;
void PostHandle(const Event& ev) noexcept override;
void Update() noexcept override;
void PostUpdate() noexcept override;
void UpdateMenu() noexcept override;
void UpdateTooltip() noexcept override;
void UpdateWidget() noexcept override;
@@ -873,7 +873,7 @@ void Network::Sanitize() {
}
}
}
File* Network::Find(std::string_view name) const noexcept
File* Network::PreFind(std::string_view name) const noexcept
try {
size_t idx;
const auto id = std::stol(std::string(name), &idx);
@@ -891,9 +891,7 @@ std::shared_ptr<Node::Lambda> Network::CreateLambda(
lambdas_running_.emplace_back(ret);
return ret;
}
void Network::Handle(const Event& ev) noexcept {
nf7::FileBase::Handle(ev);
void Network::PostHandle(const Event& ev) noexcept {
switch (ev.type) {
case Event::kAdd:
for (const auto& item : items_) item->Attach(*this);
@@ -969,9 +967,7 @@ void Network::Item::Watcher::Handle(const File::Event& ev) noexcept {
}
void Network::Update() noexcept {
nf7::FileBase::Update();
void Network::PostUpdate() noexcept {
// forget expired lambdas
lambdas_running_.erase(
std::remove_if(lambdas_running_.begin(), lambdas_running_.end(),

View File

@@ -99,8 +99,8 @@ class TL final : public nf7::FileBase, public nf7::DirItem, public nf7::Node {
return kOutputs;
}
void Handle(const nf7::File::Event& ev) noexcept;
void Update() noexcept override;
void PostHandle(const nf7::File::Event& ev) noexcept;
void PostUpdate() noexcept override;
void UpdateMenu() noexcept override;
nf7::File::Interface* interface(const std::type_info& t) noexcept override {
@@ -1092,9 +1092,7 @@ std::unique_ptr<nf7::File> TL::Clone(nf7::Env& env) const noexcept {
}
return std::make_unique<TL>(env, std::move(layers), next);
}
void TL::Handle(const Event& ev) noexcept {
nf7::FileBase::Handle(ev);
void TL::PostHandle(const Event& ev) noexcept {
switch (ev.type) {
case Event::kAdd:
if (layers_.size() == 0) {
@@ -1124,9 +1122,7 @@ void TL::Handle(const Event& ev) noexcept {
}
}
void TL::Update() noexcept {
nf7::FileBase::Update();
void TL::PostUpdate() noexcept {
// display param panel window
if (win_.shown()) {
const auto em = ImGui::GetFontSize();

View File

@@ -87,7 +87,7 @@ class Dir final : public nf7::FileBase,
return std::make_unique<Dir>(env, std::move(items));
}
File* Find(std::string_view name) const noexcept override {
File* PreFind(std::string_view name) const noexcept override {
auto itr = items_.find(std::string(name));
if (itr == items_.end()) return nullptr;
return itr->second.get();
@@ -113,15 +113,15 @@ class Dir final : public nf7::FileBase,
return ret;
}
void Update() noexcept override;
void UpdateChildren(bool early) noexcept;
void PreUpdate() noexcept override { UpdateChildren(true); }
void PostUpdate() noexcept override { UpdateChildren(false); }
void UpdateTree() noexcept override;
void UpdateMenu() noexcept override;
void UpdateTooltip() noexcept override;
void UpdateDragDropTarget() noexcept override;
void Handle(const Event& ev) noexcept override {
nf7::FileBase::Handle(ev);
void PostHandle(const Event& ev) noexcept override {
switch (ev.type) {
case Event::kAdd:
// force to show window if this is the root
@@ -173,29 +173,15 @@ class Dir final : public nf7::FileBase,
bool ValidateName(const std::string& name) noexcept;
};
void Dir::Update() noexcept {
// update children flagged as kEarlyUpdate
std::vector<nf7::File*> later;
later.reserve(items_.size());
void Dir::UpdateChildren(bool early) noexcept {
for (const auto& item : items_) {
auto& f = *item.second;
if (TestFlags(f, nf7::DirItem::kEarlyUpdate)) {
if (early == TestFlags(f, nf7::DirItem::kEarlyUpdate)) {
ImGui::PushID(&f);
f.Update();
ImGui::PopID();
} else {
later.push_back(&f);
}
}
nf7::FileBase::Update();
// update children
for (auto f : later) {
ImGui::PushID(f);
f->Update();
ImGui::PopID();
}
}
void Dir::UpdateTree() noexcept {
for (const auto& item : items_) {

View File

@@ -100,7 +100,7 @@ class Event final : public nf7::FileBase,
return {};
}
void Update() noexcept override;
void PostUpdate() noexcept override;
void UpdateMenu() noexcept override;
nf7::File::Interface* interface(const std::type_info& t) noexcept override {
@@ -178,9 +178,7 @@ std::shared_ptr<nf7::Node::Lambda> Event::CreateLambda(
}
void Event::Update() noexcept {
nf7::FileBase::Update();
void Event::PostUpdate() noexcept {
const auto& io = ImGui::GetIO();
const auto in = GetHandlerInputs();

View File

@@ -97,7 +97,7 @@ class ImGui_ final : public nf7::FileBase,
return std::make_unique<ImGui_>(env);
}
void Update() noexcept override;
void PostUpdate() noexcept override;
void UpdateMenu() noexcept override;
nf7::File::Interface* interface(const std::type_info& t) noexcept override {
@@ -110,7 +110,7 @@ class ImGui_ final : public nf7::FileBase,
};
void ImGui_::Update() noexcept {
void ImGui_::PostUpdate() noexcept {
const auto em = ImGui::GetFontSize();
ImGui::DockSpaceOverViewport(ImGui::GetMainViewport(), ImGuiDockNodeFlags_PassthruCentralNode);

View File

@@ -138,8 +138,7 @@ class Logger final : public nf7::FileBase,
return std::make_unique<Logger>(env, Data {mem_.data()});
}
void Handle(const nf7::File::Event& ev) noexcept override {
nf7::FileBase::Handle(ev);
void PostHandle(const nf7::File::Event& ev) noexcept override {
switch (ev.type) {
case Event::kAdd:
store_ = std::make_shared<ItemStore>(*this);