summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Vogelgesang <matthias.vogelgesang@gmail.com>2014-01-08 09:21:31 -0800
committerMatthias Vogelgesang <matthias.vogelgesang@gmail.com>2014-01-08 09:21:31 -0800
commit3f11e8e5c884f57facb507e62faa12e7e7973909 (patch)
tree3d94cf3b00b4f1d9557bb28c540430e9ef551385
parentc937734ceab15c51c551274435f20128d1904485 (diff)
parente62f4f920e007d548fade076f2229d2526d47d38 (diff)
downloadlibuca-3f11e8e5c884f57facb507e62faa12e7e7973909.tar.gz
libuca-3f11e8e5c884f57facb507e62faa12e7e7973909.tar.bz2
libuca-3f11e8e5c884f57facb507e62faa12e7e7973909.tar.xz
libuca-3f11e8e5c884f57facb507e62faa12e7e7973909.zip
Merge pull request #24 from ufo-kit/roi
Draw ROI-rectangle
-rw-r--r--bin/gui/control.c59
-rw-r--r--bin/gui/control.glade74
2 files changed, 104 insertions, 29 deletions
diff --git a/bin/gui/control.c b/bin/gui/control.c
index c4248f0..545c095 100644
--- a/bin/gui/control.c
+++ b/bin/gui/control.c
@@ -20,6 +20,7 @@
#include <gdk/gdk.h>
#include <gdk/gdkkeysyms.h>
#include <math.h>
+#include <cairo.h>
#include "config.h"
#include "uca-camera.h"
@@ -47,6 +48,7 @@ typedef struct {
GtkWidget *zoom_in_button;
GtkWidget *zoom_out_button;
GtkWidget *zoom_normal_button;
+ GtkWidget *rect_color_button;
GtkWidget *acquisition_expander;
GtkWidget *properties_expander;
GtkWidget *colormap_box;
@@ -98,6 +100,10 @@ typedef struct {
gint from_x, from_y;
gint to_x, to_y;
gint adj_width, adj_height;
+ gint rect_x, rect_y;
+ gint rect_evx, rect_evy;
+ cairo_t *cr;
+ gdouble red, green, blue;
} ThreadData;
static UcaPluginManager *plugin_manager;
@@ -357,6 +363,8 @@ on_motion_notify (GtkWidget *event_box, GdkEventMotion *event, ThreadData *data)
gint start_hval = gtk_adjustment_get_value (GTK_ADJUSTMENT (data->vadjustment));
page_width += start_wval;
page_height += start_hval;
+ data->rect_evx = event->x;
+ data->rect_evy = event->y;
if ((data->display_width < page_width) && (data->display_height < page_height)) {
gint startx = (page_width - data->display_width) / 2;
@@ -424,6 +432,16 @@ on_motion_notify (GtkWidget *event_box, GdkEventMotion *event, ThreadData *data)
g_string_free (string, TRUE);
}
+ if (data->cr != NULL) {
+ gdouble dash = 5.0;
+ cairo_set_source_rgb (data->cr, data->red, data->green, data->blue);
+ gint rect_width = data->rect_evx - data->rect_x;
+ gint rect_height = data->rect_evy - data->rect_y;
+ cairo_rectangle (data->cr, data->rect_x, data->rect_y, rect_width, rect_height);
+ cairo_set_dash (data->cr, &dash, 1, 0);
+ cairo_stroke (data->cr);
+ gtk_widget_queue_draw (event_box);
+ }
}
static void
@@ -445,6 +463,10 @@ normalize_event_coords (ThreadData *data)
static void
on_button_press (GtkWidget *event_box, GdkEventMotion *event, ThreadData *data)
{
+ data->cr = gdk_cairo_create(event_box->window);
+ data->rect_x = event->x;
+ data->rect_y = event->y;
+
normalize_event_coords (data);
gtk_adjustment_set_upper (GTK_ADJUSTMENT (data->x_adjustment), data->display_width);
@@ -461,6 +483,9 @@ on_button_press (GtkWidget *event_box, GdkEventMotion *event, ThreadData *data)
static void
on_button_release (GtkWidget *event_box, GdkEventMotion *event, ThreadData *data)
{
+ cairo_destroy (data->cr);
+ data->cr = NULL;
+
normalize_event_coords (data);
gtk_adjustment_set_upper (GTK_ADJUSTMENT (data->width_adjustment), data->display_width);
@@ -494,6 +519,22 @@ on_button_release (GtkWidget *event_box, GdkEventMotion *event, ThreadData *data
update_pixbuf (data);
}
+static gboolean
+on_expose (GtkWidget *event_box, GdkEventExpose *event, ThreadData *data)
+{
+ if (data->cr != NULL) {
+ gdouble dash = 5.0;
+ cairo_set_source_rgb (data->cr, data->red, data->green, data->blue);
+ gint rect_width = data->rect_evx - data->rect_x;
+ gint rect_height = data->rect_evy - data->rect_y;
+ cairo_rectangle (data->cr, data->rect_x, data->rect_y, rect_width, rect_height);
+ cairo_set_dash (data->cr, &dash, 1, 0);
+ cairo_stroke (data->cr);
+ gtk_widget_queue_draw (event_box);
+ }
+ return FALSE;
+}
+
static void
update_pixbuf (ThreadData *data)
{
@@ -987,6 +1028,21 @@ on_zoom_normal_button_clicked (GtkWidget *widget, ThreadData *data)
}
static void
+on_rect_color_button_clicked (GtkWidget *widget, ThreadData *data)
+{
+ if ((data->red == 0.0 && data->green == 0.0) && data->blue == 0.0) {
+ data->red = 1.0;
+ data->green = 1.0;
+ data->blue = 1.0;
+ }
+ else {
+ data->red = 0.0;
+ data->green = 0.0;
+ data->blue = 0.0;
+ }
+}
+
+static void
on_histogram_changed (EggHistogramView *view, ThreadData *data)
{
if (data->state == IDLE)
@@ -1084,6 +1140,7 @@ create_main_window (GtkBuilder *builder, const gchar* camera_name)
td.zoom_in_button = GTK_WIDGET (gtk_builder_get_object (builder, "zoom-in-button"));
td.zoom_out_button = GTK_WIDGET (gtk_builder_get_object (builder, "zoom-out-button"));
td.zoom_normal_button = GTK_WIDGET (gtk_builder_get_object (builder, "zoom-normal-button"));
+ td.rect_color_button = GTK_WIDGET (gtk_builder_get_object (builder, "rectangle-button"));
td.download_button = GTK_WIDGET (gtk_builder_get_object (builder, "download-button"));
td.histogram_button = GTK_TOGGLE_BUTTON (gtk_builder_get_object (builder, "histogram-checkbutton"));
td.log_button = GTK_TOGGLE_BUTTON (gtk_builder_get_object (builder, "logarithm-checkbutton"));
@@ -1175,6 +1232,7 @@ create_main_window (GtkBuilder *builder, const gchar* camera_name)
g_signal_connect (td.event_box, "motion-notify-event", G_CALLBACK (on_motion_notify), &td);
g_signal_connect (td.event_box, "button-press-event", G_CALLBACK (on_button_press), &td);
g_signal_connect (td.event_box, "button-release-event", G_CALLBACK (on_button_release), &td);
+ g_signal_connect (td.event_box, "expose-event", G_CALLBACK (on_expose), &td);
g_signal_connect (td.frame_slider, "value-changed", G_CALLBACK (on_frame_slider_changed), &td);
g_signal_connect (td.start_button, "clicked", G_CALLBACK (on_start_button_clicked), &td);
g_signal_connect (td.stop_button, "clicked", G_CALLBACK (on_stop_button_clicked), &td);
@@ -1183,6 +1241,7 @@ create_main_window (GtkBuilder *builder, const gchar* camera_name)
g_signal_connect (td.zoom_in_button, "clicked", G_CALLBACK (on_zoom_in_button_clicked), &td);
g_signal_connect (td.zoom_out_button, "clicked", G_CALLBACK (on_zoom_out_button_clicked), &td);
g_signal_connect (td.zoom_normal_button, "clicked", G_CALLBACK (on_zoom_normal_button_clicked), &td);
+ g_signal_connect (td.rect_color_button, "clicked", G_CALLBACK (on_rect_color_button_clicked), &td);
g_signal_connect (histogram_view, "changed", G_CALLBACK (on_histogram_changed), &td);
g_signal_connect (window, "destroy", G_CALLBACK (on_destroy), &td);
diff --git a/bin/gui/control.glade b/bin/gui/control.glade
index 95184ed..967fdf0 100644
--- a/bin/gui/control.glade
+++ b/bin/gui/control.glade
@@ -72,10 +72,10 @@
<child>
<object class="GtkButton" id="cancel-button">
<property name="label">gtk-quit</property>
+ <property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
- <property name="use_action_appearance">False</property>
<property name="use_stock">True</property>
<signal name="clicked" handler="gtk_main_quit" swapped="no"/>
</object>
@@ -88,10 +88,10 @@
<child>
<object class="GtkButton" id="proceed-button">
<property name="label">gtk-ok</property>
+ <property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
- <property name="use_action_appearance">False</property>
<property name="use_stock">True</property>
</object>
<packing>
@@ -152,10 +152,10 @@
<child>
<object class="GtkButton" id="download-close-button">
<property name="label">gtk-close</property>
+ <property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
- <property name="use_action_appearance">False</property>
<property name="use_stock">True</property>
</object>
<packing>
@@ -230,17 +230,17 @@
<property name="step_increment">1</property>
<property name="page_increment">10</property>
</object>
- <object class="GtkAdjustment" id="height_adjustment">
- <property name="upper">100</property>
- <property name="step_increment">1</property>
- <property name="page_increment">10</property>
- </object>
<object class="GtkAdjustment" id="max-bin-value-adjustment">
<property name="upper">65535</property>
<property name="value">256</property>
<property name="step_increment">1</property>
<property name="page_increment">10</property>
</object>
+ <object class="GtkAdjustment" id="height_adjustment">
+ <property name="upper">100</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
<object class="GtkAdjustment" id="min-bin-value-adjustment">
<property name="upper">65535</property>
<property name="step_increment">1</property>
@@ -272,9 +272,9 @@
<property name="can_focus">False</property>
<child>
<object class="GtkMenuItem" id="menuitem1">
+ <property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="use_action_appearance">False</property>
<property name="label" translatable="yes">_File</property>
<property name="use_underline">True</property>
<child type="submenu">
@@ -284,9 +284,9 @@
<child>
<object class="GtkImageMenuItem" id="imagemenuitem1">
<property name="label">gtk-new</property>
+ <property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="use_action_appearance">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
</object>
@@ -294,9 +294,9 @@
<child>
<object class="GtkImageMenuItem" id="imagemenuitem2">
<property name="label">gtk-open</property>
+ <property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="use_action_appearance">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
</object>
@@ -304,9 +304,9 @@
<child>
<object class="GtkImageMenuItem" id="save-item">
<property name="label">gtk-save-as</property>
+ <property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="use_action_appearance">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
</object>
@@ -320,9 +320,9 @@
<child>
<object class="GtkImageMenuItem" id="imagemenuitem_quit">
<property name="label">gtk-quit</property>
+ <property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="use_action_appearance">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
<signal name="activate" handler="gtk_main_quit" swapped="no"/>
@@ -334,9 +334,9 @@
</child>
<child>
<object class="GtkMenuItem" id="menuitem4">
+ <property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="use_action_appearance">False</property>
<property name="label" translatable="yes">_Help</property>
<property name="use_underline">True</property>
<child type="submenu">
@@ -346,9 +346,9 @@
<child>
<object class="GtkImageMenuItem" id="imagemenuitem_about">
<property name="label">gtk-about</property>
+ <property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="use_action_appearance">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
</object>
@@ -370,9 +370,9 @@
<property name="can_focus">False</property>
<child>
<object class="GtkToolButton" id="start-button">
+ <property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="use_action_appearance">False</property>
<property name="label" translatable="yes">Run</property>
<property name="use_underline">True</property>
<property name="stock_id">gtk-media-play</property>
@@ -384,9 +384,9 @@
</child>
<child>
<object class="GtkToolButton" id="record-button">
+ <property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="use_action_appearance">False</property>
<property name="label" translatable="yes">Record</property>
<property name="use_underline">True</property>
<property name="stock_id">gtk-media-record</property>
@@ -398,9 +398,9 @@
</child>
<child>
<object class="GtkToolButton" id="stop-button">
+ <property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="use_action_appearance">False</property>
<property name="label" translatable="yes">Stop</property>
<property name="use_underline">True</property>
<property name="stock_id">gtk-media-stop</property>
@@ -412,9 +412,9 @@
</child>
<child>
<object class="GtkToolButton" id="download-button">
+ <property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="use_action_appearance">False</property>
<property name="label" translatable="yes">Download</property>
<property name="use_underline">True</property>
<property name="icon_name">network-receive</property>
@@ -426,9 +426,9 @@
</child>
<child>
<object class="GtkSeparatorToolItem" id="toolbutton1">
+ <property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="use_action_appearance">False</property>
</object>
<packing>
<property name="expand">False</property>
@@ -437,9 +437,9 @@
</child>
<child>
<object class="GtkToolButton" id="zoom-in-button">
+ <property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="use_action_appearance">False</property>
<property name="label" translatable="yes">Zoom in</property>
<property name="use_underline">True</property>
<property name="stock_id">gtk-zoom-in</property>
@@ -451,9 +451,9 @@
</child>
<child>
<object class="GtkToolButton" id="zoom-out-button">
+ <property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="use_action_appearance">False</property>
<property name="label" translatable="yes">Zoom out</property>
<property name="use_underline">True</property>
<property name="stock_id">gtk-zoom-out</property>
@@ -465,9 +465,9 @@
</child>
<child>
<object class="GtkToolButton" id="zoom-normal-button">
+ <property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="use_action_appearance">False</property>
<property name="label" translatable="yes">100 %</property>
<property name="use_underline">True</property>
<property name="stock_id">gtk-zoom-100</property>
@@ -477,6 +477,20 @@
<property name="homogeneous">True</property>
</packing>
</child>
+ <child>
+ <object class="GtkToggleToolButton" id="rectangle-button">
+ <property name="use_action_appearance">False</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">rectangle color</property>
+ <property name="use_underline">True</property>
+ <property name="stock_id">gtk-color-picker</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
</object>
<packing>
<property name="expand">False</property>
@@ -507,9 +521,11 @@
<child>
<object class="GtkEventBox" id="eventbox">
<property name="visible">True</property>
+ <property name="app_paintable">True</property>
<property name="can_focus">False</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_STRUCTURE_MASK</property>
<property name="resize_mode">queue</property>
+ <property name="above_child">True</property>
<child>
<object class="GtkImage" id="image">
<property name="visible">True</property>
@@ -685,10 +701,10 @@
<child>
<object class="GtkCheckButton" id="repeat-checkbutton">
<property name="label" translatable="yes">Repeat</property>
+ <property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
- <property name="use_action_appearance">False</property>
<property name="xalign">0</property>
<property name="draw_indicator">True</property>
</object>
@@ -925,11 +941,11 @@
<child>
<object class="GtkCheckButton" id="histogram-checkbutton">
<property name="label" translatable="yes">Live Update</property>
+ <property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="border_width">6</property>
- <property name="use_action_appearance">False</property>
<property name="xalign">0</property>
<property name="active">True</property>
<property name="draw_indicator">True</property>
@@ -957,6 +973,9 @@
<property name="column_spacing">6</property>
<property name="row_spacing">6</property>
<child>
+ <placeholder/>
+ </child>
+ <child>
<object class="GtkLabel" id="label21">
<property name="visible">True</property>
<property name="can_focus">False</property>
@@ -1088,9 +1107,6 @@
<property name="y_options"></property>
</packing>
</child>
- <child>
- <placeholder/>
- </child>
</object>
<packing>
<property name="expand">True</property>
@@ -1262,11 +1278,11 @@
<child>
<object class="GtkCheckButton" id="logarithm-checkbutton">
<property name="label" translatable="yes">Logarithm</property>
+ <property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="border_width">10</property>
- <property name="use_action_appearance">False</property>
<property name="xalign">0</property>
<property name="draw_indicator">True</property>
</object>