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> 34 using namespace firevision;
52 const Glib::RefPtr<Gtk::Builder> builder)
53 : Gtk::Window(cobject)
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);
157 FuseViewerGtkWindow::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);
192 FuseViewerGtkWindow::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);
211 FuseViewerGtkWindow::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);
228 FuseViewerGtkWindow::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");
253 FuseViewerGtkWindow::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));
268 FuseViewerGtkWindow::close_image()
271 image_viewport_->remove();
274 save_type_->set_sensitive(
false);
virtual unsigned int pixel_height()
Height of image in pixels.
Fawkes library namespace.
const char * host() const
Get host of service.
virtual void open()
Open the camera.
unsigned short int port() const
Get port of service.
sigc::signal< void, NetworkService * > signal_service_removed()
Get "service remove" signal.
virtual ~FuseViewerGtkWindow()
Destructor.
Base class for exceptions in Fawkes.
virtual void start()
Start image transfer from the camera.
void watch_service(const char *service_type, ServiceBrowseHandler *h)
Add a result handler.
virtual unsigned int pixel_width()
Width of image in pixels.
Representation of a service announced or found via service discovery (i.e.
virtual void close()
Close camera.
void print_trace()
Prints trace to stderr.
virtual void stop()
Stop image transfer from the camera.
FuseViewerGtkWindow(BaseObjectType *cobject, const Glib::RefPtr< Gtk::Builder > builder)
Constructor.
sigc::signal< void, NetworkService * > signal_service_added()
Get "service added" signal.
void start(bool wait=true)
Call this method to start the thread.
const char * name() const
Get name of service.