📄 gseisviewtoolhlight.c
字号:
/* * GTKSEISVIEWGL - Library for rendering of 2D seismic data * * Copyright (C) 2006 Vladimir Bashkardin * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more av. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: Vladimir Bashkardin <vovizmus@users.sourceforge.net> */#include <GL/gl.h>#include <gtk/gtkgl.h>#include "gtkseisviewgl_marshal.h"#include "gtkseisviewgl.h"#include "gseisviewtoolhlight.h"G_DEFINE_TYPE (GSeisViewToolHighlight, g_seis_view_tool_highlight, G_SEIS_TYPE_VIEW_TOOL)#define G_SEIS_VIEW_TOOL_HIGHLIGHT_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), G_SEIS_TYPE_VIEW_TOOL_HIGHLIGHT, GSeisViewToolHighlightPrivate))typedef struct _GSeisViewToolHighlightPrivate GSeisViewToolHighlightPrivate;struct _GSeisViewToolHighlightPrivate { GdkCursor *hand1_cursor; GdkCursor *hand2_cursor; GdkWindow *cursor_window; gboolean drawing_rubberband; gboolean rubberband_is_drawn; gdouble hlight_area_start; gdouble hlight_area_end; gdouble rubberband_slow_start_object; gdouble rubberband_slow_end_object; gdouble rubberband_fast_start_object; gdouble rubberband_fast_end_object; gboolean is_threaded; gboolean rubberband_selection; GMutex *data_mutex;};static gboolean g_seis_view_tool_cursor_hand1_idle (GSeisViewTool *tool) { GSeisViewToolHighlightPrivate *private = G_SEIS_VIEW_TOOL_HIGHLIGHT_GET_PRIVATE (G_SEIS_VIEW_TOOL (tool)); if (private->is_threaded) gdk_threads_enter (); gdk_window_set_cursor (private->cursor_window, private->hand1_cursor); gdk_flush (); if (private->is_threaded) gdk_threads_leave (); return FALSE;}static gboolean g_seis_view_tool_cursor_hand2_idle (GSeisViewTool *tool) { GSeisViewToolHighlightPrivate *private = G_SEIS_VIEW_TOOL_HIGHLIGHT_GET_PRIVATE (G_SEIS_VIEW_TOOL (tool)); if (private->is_threaded) gdk_threads_enter (); gdk_window_set_cursor (private->cursor_window, private->hand2_cursor); gdk_flush (); if (private->is_threaded) gdk_threads_leave (); return FALSE;}static gboolean g_seis_view_tool_cursor_default_idle (GSeisViewTool *tool) { GSeisViewToolHighlightPrivate *private = G_SEIS_VIEW_TOOL_HIGHLIGHT_GET_PRIVATE (G_SEIS_VIEW_TOOL (tool)); if (private->is_threaded) gdk_threads_enter (); gdk_window_set_cursor (private->cursor_window, NULL); gdk_flush (); if (private->is_threaded) gdk_threads_leave (); return FALSE;}static gboolean g_seis_view_tool_highlight_scroll_up_signal (GSeisViewToolHighlight *self) { g_signal_emit (self, G_SEIS_VIEW_TOOL_HIGHLIGHT_GET_CLASS (self)->highlight_scroll_up_id, 0); return FALSE;}static gboolean g_seis_view_tool_highlight_scroll_down_signal (GSeisViewToolHighlight *self) { g_signal_emit (self, G_SEIS_VIEW_TOOL_HIGHLIGHT_GET_CLASS (self)->highlight_scroll_down_id, 0); return FALSE;}static gboolean g_seis_view_tool_highlight_rb_selection_notify_signal (GSeisViewToolHighlight *self) { g_object_notify (G_OBJECT (self), "rubberband_selection"); return FALSE;}static void g_seis_view_tool_attach_notify_int (GSeisViewTool *tool, GtkWidget *seis_view_gl) { GSeisViewToolHighlightPrivate *private = G_SEIS_VIEW_TOOL_HIGHLIGHT_GET_PRIVATE (G_SEIS_VIEW_TOOL (tool)); private->is_threaded = gtk_seis_view_gl_is_threaded (GTK_SEIS_VIEW_GL (seis_view_gl)); if (private->is_threaded && NULL == private->data_mutex) private->data_mutex = g_mutex_new (); private->cursor_window = seis_view_gl->window; if (private->is_threaded) { g_idle_add ((GSourceFunc)g_seis_view_tool_cursor_hand2_idle, (gpointer)tool); } else { gdk_window_set_cursor (seis_view_gl->window, private->hand2_cursor); gdk_flush (); } tool->show_cross = TRUE; private->drawing_rubberband = FALSE; private->rubberband_is_drawn = FALSE;}static void g_seis_view_tool_detach_notify_int (GSeisViewTool *tool, GtkWidget *seis_view_gl) { GSeisViewToolHighlightPrivate *private = G_SEIS_VIEW_TOOL_HIGHLIGHT_GET_PRIVATE (G_SEIS_VIEW_TOOL (tool)); private->is_threaded = gtk_seis_view_gl_is_threaded (GTK_SEIS_VIEW_GL (seis_view_gl)); if (private->is_threaded) { g_idle_add ((GSourceFunc)g_seis_view_tool_cursor_default_idle, (gpointer)tool); } else { gdk_window_set_cursor (seis_view_gl->window, NULL); gdk_flush (); } if (FALSE == tool->show_cross && GTK_WIDGET_REALIZED (seis_view_gl)) gtk_seis_view_gl_redraw (GTK_SEIS_VIEW_GL (seis_view_gl)); tool->show_cross = TRUE; private->drawing_rubberband = FALSE; private->rubberband_is_drawn = FALSE;}static void g_seis_view_tool_button_event_int (GSeisViewTool *tool, GtkWidget *seis_view_gl, GdkEventButton *event, GSeisViewDataVisibility *data_visibility) { GtkSeisViewGl *seis_view = GTK_SEIS_VIEW_GL (seis_view_gl); GSeisViewToolHighlightPrivate *private = G_SEIS_VIEW_TOOL_HIGHLIGHT_GET_PRIVATE (G_SEIS_VIEW_TOOL (tool)); if (private->data_mutex) g_mutex_lock (private->data_mutex); if (3 == event->button) { if (GDK_BUTTON_RELEASE == event->type) { if (private->drawing_rubberband) { gdouble hlight_area_start; gdouble hlight_area_size; private->drawing_rubberband = FALSE; private->rubberband_is_drawn = FALSE; tool->show_cross = TRUE; if (private->is_threaded) { g_idle_add ((GSourceFunc)g_seis_view_tool_cursor_hand2_idle, (gpointer)tool); } else { gdk_window_set_cursor (seis_view_gl->window, private->hand2_cursor); gdk_flush (); } if (private->hlight_area_start < private->hlight_area_end) { hlight_area_start = private->hlight_area_start; hlight_area_size = private->hlight_area_end - private->hlight_area_start; } else { hlight_area_start = private->hlight_area_end; hlight_area_size = private->hlight_area_start - private->hlight_area_end; } gtk_seis_view_gl_set_highlight_area (GTK_SEIS_VIEW_GL (seis_view_gl), hlight_area_start, hlight_area_size); gtk_seis_view_gl_redraw (seis_view); } } else if (GDK_BUTTON_PRESS == event->type && private->rubberband_selection) { private->hlight_area_start = data_visibility->slow_pointer_pos_data; private->hlight_area_end = data_visibility->slow_pointer_pos_data; private->rubberband_slow_start_object = data_visibility->slow_pointer_pos_object; private->rubberband_fast_start_object = data_visibility->fast_pointer_pos_object; private->rubberband_slow_end_object = data_visibility->slow_pointer_pos_object; private->rubberband_fast_end_object = data_visibility->fast_pointer_pos_object; private->drawing_rubberband = TRUE; tool->show_cross = FALSE; if (private->is_threaded) { g_idle_add ((GSourceFunc)g_seis_view_tool_cursor_hand1_idle, (gpointer)tool); } else { gdk_window_set_cursor (seis_view_gl->window, private->hand1_cursor); gdk_flush (); } } } if (private->data_mutex) g_mutex_unlock (private->data_mutex); if (2 == event->button && GDK_BUTTON_RELEASE == event->type && FALSE == private->drawing_rubberband) { gtk_seis_view_gl_set_highlight_area (GTK_SEIS_VIEW_GL (seis_view_gl), -1.0, -1.0); gtk_seis_view_gl_redraw (seis_view);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -