31 #include <QProgressBar>
34 #include <SimoxUtility/algorithm/string/string_tools.h>
51 const Progress invalid_progress{0, 1, -1};
52 const Progress indefinite_progress{0, 0, 0};
55 set_progress(QProgressBar* progress_bar,
const Progress& progress)
57 progress_bar->setMinimum(progress.min);
58 progress_bar->setMaximum(progress.max);
59 progress_bar->setValue(progress.val);
66 const std::string& image_provider_name,
67 const visionx::imrec::ChannelConfigs& channel_configs) :
68 QWidget(parent), m_iceman{iceman}, m_image_provider_name{image_provider_name}
70 m_widget.setupUi(
this);
74 &ImageProviderConfigWidget::state_changed);
75 connect(m_widget.remove_image_provider,
76 &QPushButton::clicked,
78 &ImageProviderConfigWidget::image_provider_removed);
80 const QString q_image_provider_name = QString::fromStdString(m_image_provider_name);
81 m_widget.configs->setTitle(QString{
"Image provider: "} + q_image_provider_name);
84 set_progress(m_widget.write_progress, ::invalid_progress);
85 m_widget.ice_proxy_finder_placeholder->deleteLater();
88 m_blink_timer =
new QTimer(
this);
89 m_blink_timer->setSingleShot(
false);
90 m_blink_timer->setInterval(750);
91 connect(m_blink_timer, &QTimer::timeout,
this, &ImageProviderConfigWidget::blink);
95 m_widget.ice_proxy_finder->layout()->addWidget(m_ice_proxy_finder);
96 m_ice_proxy_finder->setIceManager(iceman);
97 m_ice_proxy_finder->setDefaultSelectedProxyAsItem(q_image_provider_name);
98 m_ice_proxy_finder->setSearchMask(
"*");
99 connect(m_ice_proxy_finder->getProxyNameComboBox(),
100 SIGNAL(editTextChanged(QString)),
102 SLOT(image_provider_renamed(QString)));
105 std::vector<imrec::ChannelPreferences> channel_prefs_list;
106 std::vector<imrec::ChannelPreferences> reported_channel_prefs_list = get_channel_prefs();
107 const bool use_default_channel_prefs =
108 reported_channel_prefs_list.size() != channel_configs.size();
109 for (
unsigned int i = 0; i < channel_configs.size(); ++i)
111 imrec::ChannelPreferences channel_prefs;
112 if (use_default_channel_prefs)
115 channel_prefs.requiresLossless =
false;
119 channel_prefs = reported_channel_prefs_list.at(i);
121 channel_prefs_list.push_back(channel_prefs);
124 build_ui_from_configs(channel_configs, channel_prefs_list);
134 m_widget.configs->setTitle(QString::fromStdString(
"Image provider: " + new_name));
135 m_ice_proxy_finder->setDefaultSelectedProxyAsItem(QString::fromStdString(new_name));
136 m_image_provider_name = new_name;
137 update_channel_list();
144 ARMARX_WARNING <<
"Invalid name '" << new_name <<
"' for image provider (already taken).";
147 std::vector<visionx::imrec::ChannelConfig>
150 const bool disabled =
false ;
151 std::vector<visionx::imrec::ChannelConfig> ccs;
153 m_channel_config_widgets.end(),
154 std::back_inserter(ccs),
155 [&](
const auto* ccw) { return ccw->toChannelConfig(disabled); });
161 std::optional<visionx::imrec::Status>
status)
163 const std::optional<imrec::State> old_state = m_current_state;
164 std::optional<imrec::State> new_state;
167 new_state =
status.value().type;
174 const imrec::Status
s =
status.value();
176 if (
s.type == imrec::State::ready and
s.framesWritten == 0 and
s.framesBuffered == 0)
178 progress = ::invalid_progress;
180 else if (
s.type == imrec::State::scheduled)
182 progress = ::indefinite_progress;
187 progress.max =
s.framesWritten +
s.framesBuffered;
188 progress.val =
s.framesWritten;
193 progress = ::invalid_progress;
196 set_progress(m_widget.write_progress, progress);
198 m_current_state = new_state;
199 if (old_state != new_state)
201 emit imageProviderStateChanged(old_state, new_state);
211 m_widget.line->show();
212 m_widget.channel_configs->show();
213 m_widget.buttons->show();
214 m_widget.label_name->show();
215 m_widget.ice_proxy_finder->show();
218 m_widget.line->hide();
219 m_widget.channel_configs->hide();
220 m_widget.buttons->hide();
221 m_widget.label_name->hide();
222 m_widget.ice_proxy_finder->hide();
228 visionx::ImageProviderConfigWidget::build_ui_from_configs(
229 const std::vector<imrec::ChannelConfig>& configs,
230 const std::vector<imrec::ChannelPreferences>& prefs_list)
236 m_widget.channel_configs->layout()->removeWidget(config_widget);
237 config_widget->deleteLater();
240 for (
unsigned int i = 0; i < configs.size(); ++i)
242 add_channel_conf_widget(configs.at(i), prefs_list.at(i));
247 visionx::ImageProviderConfigWidget::add_channel_conf_widget(
248 const imrec::ChannelConfig& channel_config,
249 const imrec::ChannelPreferences& channel_prefs)
252 ARMARX_CHECK(is_channel_name_unique(channel_config.name));
254 ChannelConfigWidget* ccw =
255 new ChannelConfigWidget{m_widget.channel_configs, channel_config, channel_prefs};
257 m_channel_config_widgets.push_back(ccw);
258 m_widget.channel_configs->layout()->addWidget(ccw);
263 &ImageProviderConfigWidget::channel_renamed);
267 visionx::ImageProviderConfigWidget::update_channel_list()
269 std::vector<imrec::ChannelPreferences> prefs_list = get_channel_prefs();
271 if (prefs_list.empty())
276 const bool image_provider_changed = m_channel_config_widgets.size() != prefs_list.size();
277 if (image_provider_changed)
280 for (ChannelConfigWidget* ccw : m_channel_config_widgets)
282 m_widget.channel_configs->layout()->removeWidget(ccw);
285 m_channel_config_widgets.clear();
288 std::vector<imrec::ChannelConfig> ccs;
289 for (
const imrec::ChannelPreferences& prefs : prefs_list)
291 imrec::ChannelConfig cc;
293 cc.name = prefs.name;
297 build_ui_from_configs(ccs, prefs_list);
301 std::vector<visionx::imrec::ChannelPreferences>
302 visionx::ImageProviderConfigWidget::get_channel_prefs()
306 return m_iceman->getProxy<RecordingImageProviderInterfacePrx>(m_image_provider_name,
"")
307 ->getImageRecordingChannelPreferences();
316 visionx::ImageProviderConfigWidget::is_channel_name_unique(
const std::string& name)
318 return std::find_if(m_channel_config_widgets.begin(),
319 m_channel_config_widgets.end(),
321 { return e->getChannelName() == name; }) == m_channel_config_widgets.end();
325 visionx::ImageProviderConfigWidget::state_changed(std::optional<imrec::State>,
326 std::optional<imrec::State> new_state)
328 if (new_state.has_value() and
329 (new_state.value() == imrec::State::running or new_state.value() == imrec::State::writing))
331 if (new_state.value() == imrec::State::running)
333 m_current_icon_name =
"imrec_running";
337 m_current_icon_name =
"imrec_write";
339 m_blink_timer->start();
343 m_blink_timer->stop();
348 if (new_state.has_value())
350 switch (new_state.value())
352 case imrec::State::ready:
353 m_widget.status->setText(
"ready");
354 icon_name =
":/icons/imrec_ready.ico";
356 case imrec::State::scheduled:
357 m_widget.status->setText(
"scheduled");
358 icon_name =
":/icons/imrec_scheduled.ico";
360 case imrec::State::running:
361 m_widget.status->setText(
"recording");
362 icon_name =
":/icons/imrec_running.ico";
364 case imrec::State::stopping:
365 m_widget.status->setText(
"stopping");
366 icon_name =
":/icons/imrec_stopping.ico";
368 case imrec::State::writing:
369 m_widget.status->setText(
"writing");
370 icon_name =
":/icons/imrec_write.ico";
373 m_widget.status->setText(
"offline");
374 icon_name =
":/icons/imrec_offline.ico";
380 m_widget.status->setText(
"not configured");
381 icon_name =
":/icons/imrec_not_configured.ico";
385 icon.addFile(icon_name, QSize(), QIcon::Normal,
QIcon::On);
386 m_widget.icon_placeholder->setPixmap(icon.pixmap(20, 20));
390 visionx::ImageProviderConfigWidget::blink()
395 icon_name = QString::fromStdString(
":/icons/" + m_current_icon_name +
".ico");
399 icon_name = QString::fromStdString(
":/icons/" + m_current_icon_name +
"_dark.ico");
401 m_icon_blink = not m_icon_blink;
404 icon.addFile(icon_name, QSize(), QIcon::Normal,
QIcon::On);
405 m_widget.icon_placeholder->setPixmap(icon.pixmap(20, 20));
409 visionx::ImageProviderConfigWidget::channel_renamed(
const std::string& old_name,
410 const std::string& new_name)
412 auto it = std::find_if(m_channel_config_widgets.begin(),
413 m_channel_config_widgets.end(),
414 [&](
const auto&
c) { return c->getChannelName() == old_name; });
415 if (it == m_channel_config_widgets.end())
417 ARMARX_ERROR <<
"Internal error, a channel was renamed which is not known to parent "
418 <<
"widget. Old name: '" << old_name <<
"'. New name: '" << new_name <<
"'.";
421 ChannelConfigWidget* ccw = *it;
422 is_channel_name_unique(new_name) ? ccw->confirmChannelName(new_name)
423 : ccw->rejectChannelName(new_name);
427 visionx::ImageProviderConfigWidget::image_provider_renamed(
const QString& q_new_name)
429 const std::string new_name = simox::alg::trim_copy(q_new_name.toStdString());
430 const std::string old_name = m_image_provider_name;
432 if (not q_new_name.isEmpty())
434 if (new_name != old_name)
436 emit imageProviderRenamed(old_name, new_name);
441 m_ice_proxy_finder->setDefaultSelectedProxy(QString::fromStdString(old_name));
446 visionx::ImageProviderConfigWidget::image_provider_removed()
448 emit imageProviderRemoved(m_image_provider_name);