--- nono/lib/monitor.cpp 2026/04/29 17:05:30 1.1.1.6 +++ nono/lib/monitor.cpp 2026/04/29 17:05:56 1.1.1.8 @@ -66,11 +66,27 @@ MonitorManager::~MonitorManager() gMonitorManager = NULL; } -// 登録(というか初期化というか確保というか)。 +// モニタを登録。 +Monitor * +MonitorManager::Regist(uint id_, Object *parent_) +{ + return RegistCommon(id_, parent_, NULL); +} + +// 呼び出し側で作成したモニタを登録。 +Monitor * +MonitorManager::Regist(Monitor *monitor_) +{ + return RegistCommon(monitor_->GetId(), monitor_->obj, monitor_); +} + +// id_, parent_ のモニタを登録。 +// monitor_ は通常 NULL を指定しておけばこちらで標準モニタを作成する。 +// 呼び出し元で派生クラスなどを生成していればそれを指定。 // 成功すればモニターを返す。通常失敗しない。 // 失敗すればいずれのケースも assert で終了する。 Monitor * -MonitorManager::Regist(uint id_, Object *parent_) +MonitorManager::RegistCommon(uint id_, Object *parent_, Monitor *monitor_) { assert(id_ < ID_SUBWIN_MAX); @@ -81,9 +97,13 @@ MonitorManager::Regist(uint id_, Object assertmsg((bool)monitors[id_] == false, "%s already registered", Monitor::GetIdText(id_)); - // 生成。 - monitors[id_].reset(new Monitor(id_, parent_)); - assertmsg((bool)monitors[id_], "cannot create new monitor"); + // 登録、もしくはここで生成。 + if (monitor_) { + monitors[id_].reset(monitor_); + } else { + monitors[id_].reset(new Monitor(id_, parent_)); + assertmsg((bool)monitors[id_], "cannot create new monitor"); + } // 名前が衝突していないことを確認。 // どのケースの衝突も検出できるよう、追加後に全部列挙して.. @@ -164,17 +184,17 @@ MonitorManager::GetList() const return list; } -// id リストから一覧表示用の文字列を生成して返す -/*static*/ std::string -MonitorManager::MakeListString(std::vector list) +// id リストから一覧表示用の文字列リストを生成して返す +std::vector +MonitorManager::MakeListString(std::vector list) const { - std::string str; + std::vector rv; // id をモニター情報内の1つ目の名前順にソートする std::sort(list.begin(), list.end(), - [](const auto& a_id, const auto& b_id) { - const auto& a_alias = gMonitorManager->GetAliases(a_id); - const auto& b_alias = gMonitorManager->GetAliases(b_id); + [&](const auto& a_id, const auto& b_id) { + const auto& a_alias = GetAliases(a_id); + const auto& b_alias = GetAliases(b_id); const std::string a_name = a_alias[0]; const std::string b_name = b_alias[0]; @@ -183,11 +203,10 @@ MonitorManager::MakeListString(std::vect ); for (const auto id : list) { - const auto& aliases = gMonitorManager->GetAliases(id); + const auto& aliases = GetAliases(id); assert(aliases.empty() == false); - str += ' '; - str += aliases[0]; + std::string str = aliases[0]; if (aliases.size() > 1) { str += " (alias:"; for (int i = 1, sz = aliases.size(); i < sz; i++) { @@ -196,7 +215,7 @@ MonitorManager::MakeListString(std::vect } str += ')'; } - str += '\n'; + rv.push_back(str); } - return str; + return rv; }