23 #include "fuse_viewer_gui.h" 25 #include <gui_utils/avahi_dispatcher.h> 26 #include <core/exception.h> 27 #include <fvwidgets/fuse_image_list_widget.h> 28 #include <fvwidgets/image_widget.h> 29 #include <fvcams/net.h> 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);
64 __img_list_widget->
image_selected().connect( sigc::mem_fun(*
this, &FuseViewerGtkWindow::on_fuse_image_selected) );
66 __image_list_scroll->add(*__img_list_widget);
68 __save_type = Gtk::manage(
new Gtk::ComboBoxText);
69 __save_box->add(*__save_type);
71 std::vector<Gdk::PixbufFormat> fmts = Gdk::Pixbuf::get_formats();
72 std::vector<Gdk::PixbufFormat>::const_iterator it = fmts.begin();
73 #if GTK_VERSION_GE(3,0) 74 __save_type->append(
"Don't save");
76 __save_type->append_text(
"Don't save");
78 for (; it != fmts.end(); ++it) {
79 if ((*it).is_writable()) {
80 #if GTK_VERSION_GE(3,0) 81 __save_type->append((*it).get_name());
83 __save_type->append_text((*it).get_name());
88 __save_type->set_active(0);
89 __save_type->set_sensitive(
false);
90 __save_type->signal_changed().connect( sigc::mem_fun(*
this, &FuseViewerGtkWindow::on_save_type_change) );
91 __auto_save->signal_toggled().connect( sigc::mem_fun(*
this, &FuseViewerGtkWindow::on_auto_save_cbt_change) );
92 __save_btn->signal_clicked().connect( sigc::mem_fun(*
this, &FuseViewerGtkWindow::on_save_image_clicked) );
95 __cur_service_name =
"";
105 __avahi_dispatcher->
signal_service_added().connect( sigc::mem_fun( *
this, &FuseViewerGtkWindow::on_service_added ) );
106 __avahi_dispatcher->
signal_service_removed().connect( sigc::mem_fun( *
this, &FuseViewerGtkWindow::on_service_removed ) );
108 __avahi_thread->
watch_service(
"_fountain._tcp", __avahi_dispatcher);
109 __avahi_thread->
start();
115 delete __avahi_thread;
116 delete __avahi_dispatcher;
123 const char* name = service->
name();
124 const char* host = service->
host();
126 __host_service_map[host] = name;
139 if (__cur_service_name == service->
name()) {
143 std::map<std::string, std::string>::const_iterator it = __host_service_map.begin();
144 for (; it != __host_service_map.end(); ++it) {
145 if (__cur_service_name == it->second) {
146 __host_service_map.erase(it->first);
154 FuseViewerGtkWindow::on_fuse_image_selected()
156 __img_list_widget->set_sensitive(Gtk::SENSITIVITY_OFF);
159 std::string image_id;
167 __cam =
new NetworkCamera( host.c_str(), port, image_id.c_str(), compression );
170 __cur_service_name = __host_service_map[host];
173 __image_viewport->add(*__img_widget);
176 __save_type->set_sensitive(Gtk::SENSITIVITY_ON);
178 set_status(image_id, host, port);
185 __img_list_widget->set_sensitive(Gtk::SENSITIVITY_ON);
190 FuseViewerGtkWindow::on_auto_save_cbt_change()
192 if (__auto_save->get_active()) {
193 __save_btn->set_sensitive(
false);
196 __save_filechooser->get_current_folder(),
197 __save_type->get_active_text(),
204 __save_btn->set_sensitive(
true);
210 FuseViewerGtkWindow::on_save_type_change()
212 if (__save_type->get_active_row_number()) {
213 __auto_save->set_sensitive(
true);
215 if (__auto_save->get_active()) __img_num = __img_widget->
get_image_num();
216 on_auto_save_cbt_change();
219 __auto_save->set_active(
false);
220 __auto_save->set_sensitive(
false);
221 __save_btn->set_sensitive(
false);
227 FuseViewerGtkWindow::on_save_image_clicked()
230 if (asprintf(&ctmp,
"%s/%06u.%s", __save_filechooser->get_current_folder().c_str(),
231 ++__img_num, __save_type->get_active_text().c_str()) != -1) {
232 Glib::ustring fn = ctmp;
235 __img_widget->
save_image(fn, __save_type->get_active_text());
237 printf(
"Could not save file, asprintf() ran out of memory");
248 FuseViewerGtkWindow::set_status(std::string img_id, std::string host,
unsigned short port)
250 if (!img_id.length()) {
251 __statusbar->push(Glib::ustring(
"Not connected."));
255 if (asprintf(&ctmp,
"Host: %s:%u\tId: %s",
256 host.c_str(), port, img_id.c_str())) {
257 __statusbar->push(Glib::ustring(ctmp));
265 FuseViewerGtkWindow::close_image()
268 __image_viewport->remove();
271 __save_type->set_sensitive(Gtk::SENSITIVITY_OFF);
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.