gcamview.cpp
来自「一个语言识别引擎」· C++ 代码 · 共 630 行 · 第 1/2 页
CPP
630 行
return (TRUE);
}
static gint menuImageFramerate_CB(GtkWidget *widget, gpointer data)
{
GtkWidget *dialog;
GtkWidget *hbox;
GtkWidget *stock;
GtkWidget *label;
GtkWidget *spinner;
GtkAdjustment *spinner_adj;
gint response;
dialog = gtk_dialog_new_with_buttons ("New Refresh Time",
GTK_WINDOW (mainWindow),
GTK_DIALOG_MODAL,
GTK_STOCK_OK,
GTK_RESPONSE_OK,
GTK_STOCK_CANCEL,
GTK_RESPONSE_CANCEL,
NULL);
hbox = gtk_hbox_new (FALSE, 8);
gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
stock = gtk_image_new_from_stock (GTK_STOCK_DIALOG_QUESTION, GTK_ICON_SIZE_DIALOG);
gtk_box_pack_start (GTK_BOX (hbox), stock, FALSE, FALSE, 0);
label = gtk_label_new_with_mnemonic ("Insert new refresh time (in mSec):");
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
spinner_adj = (GtkAdjustment *) gtk_adjustment_new (_options.refreshTime, 10.0, 1000.0, 1.0, 5.0, 5.0);
spinner = gtk_spin_button_new (spinner_adj, 1.0, 0);
gtk_box_pack_start (GTK_BOX (hbox), spinner, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), hbox, FALSE, FALSE, 0);
gtk_widget_show_all (hbox);
response = gtk_dialog_run (GTK_DIALOG (dialog));
if (response == GTK_RESPONSE_OK)
{
_options.refreshTime = (int) gtk_spin_button_get_value (GTK_SPIN_BUTTON(spinner));
gtk_timeout_remove (_options.refreshTime);
timeout_ID = gtk_timeout_add (_options.refreshTime, timeout_CB, NULL);
updateStatusbar(GTK_STATUSBAR (statusbar));
}
gtk_widget_destroy (dialog);
return (TRUE);
}
static gint clickDA_CB (GtkWidget *widget, GdkEventButton *event, gpointer data)
{
int imageX, imageY;
int clickX, clickY;
int daWidth, daHeight;
int imageWidth, imageHeight;
double ratioX, ratioY;
imageWidth = _imgRecv.GetWidth();
imageHeight = _imgRecv.GetHeight();
if ( (imageWidth != 0) && (imageHeight != 0) )
{
daWidth = widget->allocation.width;
daHeight = widget->allocation.height;
clickX = (int) event->x;
clickY = (int) event->y;
ratioX = double(clickX) / double(daWidth);
ratioY = double(clickY) / double(daHeight);
imageX = int(imageWidth * ratioX + 0.5);
imageY = int(imageHeight * ratioY + 0.5);
printf("Transmitting click information...\n");
if (_pOutPort!=NULL) {
yarp::os::Bottle& bot = _pOutPort->prepare();
bot.clear();
bot.addInt(imageX);
bot.addInt(imageY);
//_pOutPort->Content() = _outBottle;
_pOutPort->write();
}
} else {
printf("I would send a position, but there's no image for scaling\n");
}
return TRUE;
}
//-------------------------------------------------
// Non Modal Dialogs
//-------------------------------------------------
GtkWidget* createSaveSingleDialog(void)
{
GtkWidget *dialog = NULL;
GtkWidget *button;
GtkWidget *hbox;
dialog = gtk_dialog_new ();
gtk_window_set_title(GTK_WINDOW(dialog), "Save Snapshot");
gtk_window_set_modal(GTK_WINDOW(dialog), FALSE);
gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(mainWindow));
//gtk_window_resize(GTK_WINDOW(dialog), 185, 40);
gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE);
//gtk_window_set_default_size(GTK_WINDOW(dialog), 185, 40);
gtk_window_set_destroy_with_parent(GTK_WINDOW(dialog), TRUE);
gtk_dialog_set_has_separator (GTK_DIALOG(dialog), FALSE);
hbox = gtk_hbox_new (TRUE, 8); // parameters (gboolean homogeneous_space, gint spacing);
button = gtk_button_new_from_stock(GTK_STOCK_SAVE);
gtk_widget_set_size_request (GTK_WIDGET(button), 150,50);
gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 16); // parameters (GtkBox *box, GtkWidget *child, gboolean expand, gboolean fill, guint padding);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), hbox, FALSE, FALSE, 8); // parameters (GtkBox *box, GtkWidget *child, gboolean expand, gboolean fill, guint padding);
gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (saveSingleClicked_CB), NULL);
gtk_signal_connect (GTK_OBJECT (dialog), "delete_event", GTK_SIGNAL_FUNC (saveSingleDelete_CB), NULL);
//gtk_container_set_border_width(GTK_CONTAINER(hbox), 5);
return dialog;
}
GtkWidget* createSaveSetDialog(void)
{
GtkWidget *dialog = NULL;
GtkWidget *saveButton;
GtkWidget *stopButton;
GtkWidget *hbox;
dialog = gtk_dialog_new ();
gtk_window_set_title(GTK_WINDOW(dialog), "Save Image Set");
gtk_window_set_modal(GTK_WINDOW(dialog), FALSE);
gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(mainWindow));
gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE);
//gtk_window_set_default_size(GTK_WINDOW(dialog), 190, 40);
gtk_window_set_destroy_with_parent(GTK_WINDOW(dialog), TRUE);
gtk_dialog_set_has_separator (GTK_DIALOG(dialog), FALSE);
#if GTK_CHECK_VERSION(2,6,0)
saveButton = gtk_button_new_from_stock(GTK_STOCK_MEDIA_RECORD);
stopButton = gtk_button_new_from_stock(GTK_STOCK_MEDIA_STOP);
#else
printf("Missing functionality on older GTK version, sorry\n");
#endif
gtk_widget_set_size_request (GTK_WIDGET(saveButton), 80,50);
gtk_widget_set_size_request (GTK_WIDGET(stopButton), 80,50);
hbox = gtk_hbox_new (TRUE, 8); // parameters (gboolean homogeneous_space, gint spacing);
gtk_box_pack_start (GTK_BOX (hbox), saveButton, TRUE, TRUE, 8); // parameters (GtkBox *box, GtkWidget *child, gboolean expand, gboolean fill, guint padding);
gtk_box_pack_start (GTK_BOX (hbox), stopButton, TRUE, TRUE, 8); // parameters (GtkBox *box, GtkWidget *child, gboolean expand, gboolean fill, guint padding);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), hbox, FALSE, FALSE, 8); // parameters (GtkBox *box, GtkWidget *child, gboolean expand, gboolean fill, guint padding);
gtk_signal_connect (GTK_OBJECT (saveButton), "clicked", GTK_SIGNAL_FUNC (saveSetStartClicked_CB), NULL);
gtk_signal_connect (GTK_OBJECT (stopButton), "clicked", GTK_SIGNAL_FUNC (saveSetStopClicked_CB), NULL);
gtk_signal_connect (GTK_OBJECT (dialog), "delete_event", GTK_SIGNAL_FUNC (saveSetDelete_CB), NULL);
return dialog;
}
//-------------------------------------------------
// Main Window Menubar
//-------------------------------------------------
GtkWidget* createMenubar(void)
{
GtkWidget *menubar;
menubar = gtk_menu_bar_new ();
GtkWidget *menuSeparator;
// Submenus Items on menubar
fileItem = gtk_menu_item_new_with_label ("File");
imageItem = gtk_menu_item_new_with_label ("Image");
helpItem = gtk_menu_item_new_with_label ("Help");
// Submenu: File
fileMenu = gtk_menu_new();
fileSingleItem = gtk_check_menu_item_new_with_label ("Save single image..");
gtk_menu_append( GTK_MENU(fileMenu), fileSingleItem);
gtk_signal_connect( GTK_OBJECT(fileSingleItem), "toggled", GTK_SIGNAL_FUNC(menuFileSingle_CB), mainWindow);
fileSetItem = gtk_check_menu_item_new_with_label ("Save a set of images..");
gtk_menu_append( GTK_MENU(fileMenu), fileSetItem);
gtk_signal_connect( GTK_OBJECT(fileSetItem), "toggled", GTK_SIGNAL_FUNC(menuFileSet_CB), mainWindow);
menuSeparator = gtk_separator_menu_item_new();
gtk_menu_append( GTK_MENU(fileMenu), menuSeparator);
fileQuitItem = gtk_menu_item_new_with_label ("Quit");
gtk_menu_append( GTK_MENU(fileMenu), fileQuitItem);
gtk_signal_connect( GTK_OBJECT(fileQuitItem), "activate", GTK_SIGNAL_FUNC(menuFileQuit_CB), mainWindow);
// Submenu: Image
imageMenu = gtk_menu_new();
imageSizeItem = gtk_menu_item_new_with_label ("Original size");
gtk_menu_append( GTK_MENU(imageMenu), imageSizeItem);
gtk_signal_connect( GTK_OBJECT(imageSizeItem), "activate", GTK_SIGNAL_FUNC(menuImageSize_CB), mainWindow);
imageRatioItem = gtk_menu_item_new_with_label ("Original aspect ratio");
gtk_menu_append( GTK_MENU(imageMenu), imageRatioItem);
gtk_signal_connect( GTK_OBJECT(imageRatioItem), "activate", GTK_SIGNAL_FUNC(menuImageRatio_CB), mainWindow);
menuSeparator = gtk_separator_menu_item_new();
gtk_menu_append( GTK_MENU(imageMenu), menuSeparator);
imageFreezeItem = gtk_check_menu_item_new_with_label ("Freeze");
gtk_menu_append( GTK_MENU(imageMenu), imageFreezeItem);
gtk_signal_connect( GTK_OBJECT(imageFreezeItem), "toggled", GTK_SIGNAL_FUNC(menuImageFreeze_CB), mainWindow);
menuSeparator = gtk_separator_menu_item_new();
gtk_menu_append( GTK_MENU(imageMenu), menuSeparator);
imageFramerateItem = gtk_menu_item_new_with_label ("Change refresh interval..");
gtk_menu_append( GTK_MENU(imageMenu), imageFramerateItem);
gtk_signal_connect( GTK_OBJECT(imageFramerateItem), "activate", GTK_SIGNAL_FUNC(menuImageFramerate_CB), mainWindow);
imageIntervalItem = gtk_menu_item_new_with_label ("Show Interval..");
gtk_menu_append( GTK_MENU(imageMenu), imageIntervalItem);
gtk_signal_connect( GTK_OBJECT(imageIntervalItem), "activate", GTK_SIGNAL_FUNC(menuImageInterval_CB), mainWindow);
// Submenu: Help
helpMenu = gtk_menu_new();
helpAboutItem = gtk_menu_item_new_with_label ("About..");
gtk_menu_append( GTK_MENU(helpMenu), helpAboutItem);
gtk_signal_connect( GTK_OBJECT(helpAboutItem), "activate", GTK_SIGNAL_FUNC(menuHelpAbout_CB), mainWindow);
// linking the submenus to items on menubar
gtk_menu_item_set_submenu(GTK_MENU_ITEM(fileItem), fileMenu);
gtk_menu_item_set_submenu(GTK_MENU_ITEM(imageItem), imageMenu);
gtk_menu_item_set_submenu(GTK_MENU_ITEM(helpItem), helpMenu);
// appending the submenus to the menubar
gtk_menu_bar_append(GTK_MENU_BAR(menubar), fileItem);
gtk_menu_bar_append(GTK_MENU_BAR(menubar), imageItem);
gtk_menu_item_set_right_justified (GTK_MENU_ITEM (helpItem), TRUE);
gtk_menu_bar_append(GTK_MENU_BAR(menubar), helpItem);
return menubar;
}
//-------------------------------------------------
// Main Window Statusbar
//-------------------------------------------------
void updateStatusbar (GtkStatusbar *statusbar)
{
gchar *msg;
float fps;
fps = 1000 / float(_options.refreshTime);
gtk_statusbar_pop (statusbar, 0); // clear any previous message, underflow is allowed
msg = g_strdup_printf ("%s - %.1f fps",_options.portName, fps);
gtk_statusbar_push (statusbar, 0, msg);
g_free (msg);
}
//-------------------------------------------------
// Main Window
//-------------------------------------------------
GtkWidget* createMainWindow(void)
{
GtkRequisition actualSize;
GtkWidget* window;
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW (window), "YARP GTK Image Viewer");
gtk_window_set_default_size(GTK_WINDOW (window), _options.windWidth, _options.windHeight);
gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
// When the window is given the "delete_event" signal (this is given
// by the window manager, usually by the "close" option, or on the
// titlebar), we ask it to call the delete_event () function
// as defined above. The data passed to the callback
// function is NULL and is ignored in the callback function.
g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (delete_event), NULL);
// Box for main window
GtkWidget *box;
box = gtk_vbox_new (FALSE, 0); // parameters (gboolean homogeneous_space, gint spacing);
gtk_container_add (GTK_CONTAINER (window), box);
// MenuBar for main window
menubar = createMenubar();
gtk_box_pack_start (GTK_BOX (box), menubar, FALSE, TRUE, 0); // parameters (GtkBox *box, GtkWidget *child, gboolean expand, gboolean fill, guint padding);
gtk_widget_size_request(menubar, &actualSize);
// Drawing Area : here the image will be drawed
da = gtk_drawing_area_new ();
g_signal_connect (da, "expose_event", G_CALLBACK (expose_CB), NULL);
if (_options.outputEnabled == 1)
{
g_signal_connect (da, "button_press_event", G_CALLBACK (clickDA_CB), NULL);
// Ask to receive events the drawing area doesn't normally subscribe to
gtk_widget_set_events (da, gtk_widget_get_events (da) | GDK_BUTTON_PRESS_MASK);
}
gtk_box_pack_start(GTK_BOX(box), da, TRUE, TRUE, 0);
// StatusBar for main window
statusbar = gtk_statusbar_new ();
updateStatusbar(GTK_STATUSBAR (statusbar));
gtk_box_pack_start (GTK_BOX (box), statusbar, FALSE, TRUE, 0);
gtk_widget_size_request(statusbar, &actualSize);
_occupiedHeight += 2*(actualSize.height);
frame = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8, _options.windWidth, _options.windHeight);
// TimeOut used to refresh the screen
timeout_ID = gtk_timeout_add (_options.refreshTime, timeout_CB, NULL);
return window;
}
//-------------------------------------------------
// Service Fuctions
//-------------------------------------------------
void saveCurrentFrame()
{
char fileName[256];
sprintf(fileName,"%03d.ppm",_frameN);
_imgRecv.SaveLastImage(fileName);
}
bool getImage()
{
bool ret = false;
ret = _imgRecv.Update();
if (ret == false)
return false;
_semaphore.wait();
ret = _imgRecv.GetLastImage(&_inputImg);
_semaphore.post();
return ret;
}
bool yarpImage2pixbuf(yarp::sig::ImageOf<yarp::sig::PixelRgb> *sourceImg,
GdkPixbuf* destPixbuf)
{
// il pixbuf deve essere gi
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?