📄 gseisviewtoolmotion.c
字号:
if (NULL == private->cursor_window) private->cursor_window = seis_view_gl->window; if (private->is_threaded) { g_idle_add ((GSourceFunc)g_seis_view_tool_cursor_view_drag_idle, (gpointer)tool); } else { gdk_window_set_cursor (seis_view_gl->window, private->view_drag_cursor); gdk_flush (); } } else if (GDK_BUTTON_RELEASE == event->type) { tool->show_cross = TRUE; 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 (); } private->zoom_rect_is_drawn = FALSE; } }}static void g_seis_view_tool_scroll_event_int (GSeisViewTool *tool, GtkWidget *seis_view_gl, GdkEventScroll *event, GSeisViewDataVisibility *data_visibility) { GtkSeisViewGl *seis_view = GTK_SEIS_VIEW_GL (seis_view_gl); GSeisViewToolMotionPrivate *private = G_SEIS_VIEW_TOOL_MOTION_GET_PRIVATE (G_SEIS_VIEW_TOOL (tool)); gdouble slow_start_data, slow_size_data; gdouble fast_start_data, fast_size_data; gdouble zoom_rate = 0.9; guint slow_num, fast_num; if (FALSE == private->drawing_zoom_rect) { g_object_get (G_OBJECT (seis_view_gl), "slow_num", &slow_num, "fast_num", &fast_num, NULL); if (GDK_SCROLL_UP == event->direction) { slow_size_data = data_visibility->slow_size_data / zoom_rate; fast_size_data = data_visibility->fast_size_data / zoom_rate; if (slow_size_data < (1.0 / (gdouble)slow_num)) { slow_start_data = data_visibility->slow_start_data; slow_size_data = 1.0 / (gdouble)slow_num; } else slow_start_data = data_visibility->slow_start_data - (slow_size_data - data_visibility->slow_size_data) / 2.0; if (fast_size_data < (1.0 / (gdouble)fast_num)) { fast_start_data = data_visibility->fast_start_data; fast_size_data = 1.0 / (gdouble)fast_num; } else fast_start_data = data_visibility->fast_start_data - (fast_size_data - data_visibility->fast_size_data) / 2.0; } else if (GDK_SCROLL_DOWN == event->direction) { slow_size_data = data_visibility->slow_size_data * zoom_rate; fast_size_data = data_visibility->fast_size_data * zoom_rate; if (slow_size_data < (1.0 / (gdouble)slow_num)) { slow_start_data = data_visibility->slow_start_data; slow_size_data = 1.0 / (gdouble)slow_num; } else slow_start_data = data_visibility->slow_start_data + (data_visibility->slow_size_data - slow_size_data) / 2.0; if (fast_size_data < (1.0 / (gdouble)fast_num)) { fast_start_data = data_visibility->fast_start_data; fast_size_data = 1.0 / (gdouble)fast_num; } else fast_start_data = data_visibility->fast_start_data + (data_visibility->fast_size_data - fast_size_data) / 2.0; } gtk_seis_view_gl_set_data_viewport (seis_view, slow_start_data, slow_size_data, fast_start_data, fast_size_data); gtk_seis_view_gl_redraw (seis_view); }}static void g_seis_view_tool_motion_event_int (GSeisViewTool *tool, GtkWidget *seis_view_gl, GdkEventMotion *event, GSeisViewDataVisibility *data_visibility) { GSeisViewToolMotionPrivate *private = G_SEIS_VIEW_TOOL_MOTION_GET_PRIVATE (G_SEIS_VIEW_TOOL (tool)); GdkGLContext *gl_context = gtk_widget_get_gl_context (seis_view_gl); GdkGLDrawable *gl_drawable = gtk_widget_get_gl_drawable (seis_view_gl); GtkSeisViewGl *seis_view = GTK_SEIS_VIEW_GL (seis_view_gl); gdouble slow_start_data, fast_start_data; if (private->drawing_zoom_rect) { if (private->is_threaded) gdk_threads_enter (); if (gdk_gl_drawable_gl_begin (gl_drawable, gl_context)) { glDrawBuffer (GL_FRONT); glEnable (GL_COLOR_LOGIC_OP); glLogicOp (GL_XOR); glColor3f (1, 1, 1); if (private->zoom_rect_is_drawn) { glBegin (GL_LINE_LOOP); glVertex2f (private->slow_start_object, private->fast_start_object); glVertex2f (private->slow_end_object, private->fast_start_object); glVertex2f (private->slow_end_object, private->fast_end_object); glVertex2f (private->slow_start_object, private->fast_end_object); glEnd (); } private->slow_end_object = data_visibility->slow_pointer_pos_object; private->fast_end_object = data_visibility->fast_pointer_pos_object; private->slow_end_data = data_visibility->slow_pointer_pos_data; private->fast_end_data = data_visibility->fast_pointer_pos_data; glBegin (GL_LINE_LOOP); glVertex2f (private->slow_start_object, private->fast_start_object); glVertex2f (private->slow_end_object, private->fast_start_object); glVertex2f (private->slow_end_object, private->fast_end_object); glVertex2f (private->slow_start_object, private->fast_end_object); glEnd (); glLogicOp (GL_SET); glDisable (GL_COLOR_LOGIC_OP); glDrawBuffer (GL_BACK); glFlush (); gdk_gl_drawable_gl_end (gl_drawable); private->zoom_rect_is_drawn = TRUE; } if (private->is_threaded) gdk_threads_leave (); } else if (event->state & GDK_BUTTON1_MASK) { private->slow_end_data = data_visibility->slow_pointer_pos_data; private->fast_end_data = data_visibility->fast_pointer_pos_data; slow_start_data = data_visibility->slow_start_data + private->slow_start_data - private->slow_end_data; fast_start_data = data_visibility->fast_start_data + private->fast_start_data - private->fast_end_data; if (slow_start_data < 0) private->slow_start_data -= slow_start_data; if ((slow_start_data + data_visibility->slow_size_data) > 1.0) private->slow_start_data += (1.0 - slow_start_data - data_visibility->slow_size_data); if (fast_start_data < 0) private->fast_start_data -= fast_start_data; if ((fast_start_data + data_visibility->fast_size_data) > 1.0) private->fast_start_data += (1.0 - fast_start_data - data_visibility->fast_size_data); gtk_seis_view_gl_set_data_viewport (seis_view, slow_start_data, data_visibility->slow_size_data, fast_start_data, data_visibility->fast_size_data); gtk_seis_view_gl_redraw (seis_view); }}static void g_seis_view_tool_motion_init (GSeisViewToolMotion *self) { GSeisViewToolMotionPrivate *private = G_SEIS_VIEW_TOOL_MOTION_GET_PRIVATE (self); (G_SEIS_VIEW_TOOL (self))->event_mask |= G_SEIS_VIEW_TOOL_MOTION_EVENT | G_SEIS_VIEW_TOOL_BUTTON_EVENT | G_SEIS_VIEW_TOOL_SCROLL_EVENT; (G_SEIS_VIEW_TOOL (self))->show_cross = TRUE; private->drawing_zoom_rect = FALSE; private->zoom_rect_is_drawn = FALSE; private->cursor_window = NULL; private->zoom_rect_cursor = gdk_cursor_new (GDK_LR_ANGLE); private->view_drag_cursor = gdk_cursor_new (GDK_FLEUR); private->is_threaded = FALSE;#ifdef DEBUG g_print ("<GSeisViewToolMotion is inited>\n");#endif}static void g_seis_view_tool_motion_finalize (GObject *object) { GSeisViewToolMotionPrivate *private = G_SEIS_VIEW_TOOL_MOTION_GET_PRIVATE (G_SEIS_VIEW_TOOL_MOTION (object)); if (private->zoom_rect_cursor) gdk_cursor_unref (private->zoom_rect_cursor); if (private->view_drag_cursor) gdk_cursor_unref (private->view_drag_cursor);#ifdef DEBUG g_print ("<GSeisViewToolMotion is finalized>\n");#endif if (G_OBJECT_CLASS (g_seis_view_tool_motion_parent_class)->finalize) G_OBJECT_CLASS (g_seis_view_tool_motion_parent_class)->finalize (object);}static void g_seis_view_tool_motion_class_init (GSeisViewToolMotionClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GSeisViewToolClass *tool_class = G_SEIS_VIEW_TOOL_CLASS (klass); gobject_class->finalize = g_seis_view_tool_motion_finalize; g_type_class_add_private (klass, sizeof (GSeisViewToolMotionPrivate)); tool_class->view_attach_notify = g_seis_view_tool_attach_notify_int; tool_class->view_detach_notify = g_seis_view_tool_detach_notify_int; tool_class->view_button_event = g_seis_view_tool_button_event_int; tool_class->view_scroll_event = g_seis_view_tool_scroll_event_int; tool_class->view_motion_event = g_seis_view_tool_motion_event_int;#ifdef DEBUG g_print ("<GSeisViewToolMotion class is inited>\n");#endif}GSeisViewToolMotion* g_seis_view_tool_motion_new () { return g_object_new (G_SEIS_TYPE_VIEW_TOOL_MOTION, NULL);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -