23#include "fuse_viewer_gui.h"
25#include <core/exception.h>
26#include <fvcams/net.h>
27#include <fvwidgets/fuse_image_list_widget.h>
28#include <fvwidgets/image_widget.h>
29#include <gui_utils/avahi_dispatcher.h>
34using namespace firevision;
52 const Glib::RefPtr<Gtk::Builder> builder)
55 builder->get_widget(
"swFuseList", image_list_scroll_);
56 builder->get_widget(
"vpImage", image_viewport_);
57 builder->get_widget(
"afSaveType", save_box_);
58 builder->get_widget(
"fcbSaveTo", save_filechooser_);
59 builder->get_widget(
"cbtAutoSave", auto_save_);
60 builder->get_widget(
"btSaveImage", save_btn_);
61 builder->get_widget(
"stb", statusbar_);
65 sigc::mem_fun(*
this, &FuseViewerGtkWindow::on_fuse_image_selected));
67 image_list_scroll_->add(*img_list_widget_);
69 save_type_ = Gtk::manage(
new Gtk::ComboBoxText);
70 save_box_->add(*save_type_);
72 std::vector<Gdk::PixbufFormat> fmts = Gdk::Pixbuf::get_formats();
73 std::vector<Gdk::PixbufFormat>::const_iterator it = fmts.begin();
74#if GTK_VERSION_GE(3, 0)
75 save_type_->append(
"Don't save");
77 save_type_->append_text(
"Don't save");
79 for (; it != fmts.end(); ++it) {
80 if ((*it).is_writable()) {
81#if GTK_VERSION_GE(3, 0)
82 save_type_->append((*it).get_name());
84 save_type_->append_text((*it).get_name());
89 save_type_->set_active(0);
90 save_type_->set_sensitive(
false);
91 save_type_->signal_changed().connect(
92 sigc::mem_fun(*
this, &FuseViewerGtkWindow::on_save_type_change));
93 auto_save_->signal_toggled().connect(
94 sigc::mem_fun(*
this, &FuseViewerGtkWindow::on_auto_save_cbt_change));
95 save_btn_->signal_clicked().connect(
96 sigc::mem_fun(*
this, &FuseViewerGtkWindow::on_save_image_clicked));
99 cur_service_name_ =
"";
110 sigc::mem_fun(*
this, &FuseViewerGtkWindow::on_service_added));
112 sigc::mem_fun(*
this, &FuseViewerGtkWindow::on_service_removed));
114 avahi_thread_->
watch_service(
"_fountain._tcp", avahi_dispatcher_);
115 avahi_thread_->
start();
121 delete avahi_thread_;
122 delete avahi_dispatcher_;
129 const char *name = service->
name();
130 const char *host = service->
host();
132 host_service_map_[host] = name;
142 if (cur_service_name_ == service->
name()) {
146 std::map<std::string, std::string>::const_iterator it = host_service_map_.begin();
147 for (; it != host_service_map_.end(); ++it) {
148 if (cur_service_name_ == it->second) {
149 host_service_map_.erase(it->first);
157FuseViewerGtkWindow::on_fuse_image_selected()
159 img_list_widget_->set_sensitive(
false);
162 std::string image_id;
170 cam_ =
new NetworkCamera(host.c_str(), port, image_id.c_str(), compression);
173 cur_service_name_ = host_service_map_[host];
176 image_viewport_->add(*img_widget_);
179 save_type_->set_sensitive(
true);
181 set_status(image_id, host, port);
187 img_list_widget_->set_sensitive(
true);
192FuseViewerGtkWindow::on_auto_save_cbt_change()
194 if (auto_save_->get_active()) {
195 save_btn_->set_sensitive(
false);
198 save_filechooser_->get_current_folder(),
199 save_type_->get_active_text(),
205 save_btn_->set_sensitive(
true);
211FuseViewerGtkWindow::on_save_type_change()
213 if (save_type_->get_active_row_number()) {
214 auto_save_->set_sensitive(
true);
216 if (auto_save_->get_active())
218 on_auto_save_cbt_change();
220 auto_save_->set_active(
false);
221 auto_save_->set_sensitive(
false);
222 save_btn_->set_sensitive(
false);
228FuseViewerGtkWindow::on_save_image_clicked()
233 save_filechooser_->get_current_folder().c_str(),
235 save_type_->get_active_text().c_str())
237 Glib::ustring fn = ctmp;
240 img_widget_->
save_image(fn, save_type_->get_active_text());
242 printf(
"Could not save file, asprintf() ran out of memory");
253FuseViewerGtkWindow::set_status(std::string img_id, std::string host,
unsigned short port)
255 if (!img_id.length()) {
256 statusbar_->push(Glib::ustring(
"Not connected."));
259 if (asprintf(&ctmp,
"Host: %s:%u\tId: %s", host.c_str(), port, img_id.c_str())) {
260 statusbar_->push(Glib::ustring(ctmp));
268FuseViewerGtkWindow::close_image()
271 image_viewport_->remove();
274 save_type_->set_sensitive(
false);
virtual ~FuseViewerGtkWindow()
Destructor.
FuseViewerGtkWindow(BaseObjectType *cobject, const Glib::RefPtr< Gtk::Builder > builder)
Constructor.
sigc::signal< void, NetworkService * > signal_service_removed()
Get "service remove" signal.
sigc::signal< void, NetworkService * > signal_service_added()
Get "service added" signal.
void watch_service(const char *service_type, ServiceBrowseHandler *h)
Add a result handler.
Base class for exceptions in Fawkes.
void print_trace() noexcept
Prints trace to stderr.
Representation of a service announced or found via service discovery (i.e.
unsigned short int port() const
Get port of service.
const char * name() const
Get name of service.
const char * host() const
Get host of service.
void start(bool wait=true)
Call this method to start the thread.
virtual void open()
Open the camera.
virtual unsigned int pixel_height()
Height of image in pixels.
virtual void stop()
Stop image transfer from the camera.
virtual void start()
Start image transfer from the camera.
virtual void close()
Close camera.
virtual unsigned int pixel_width()
Width of image in pixels.
Fawkes library namespace.