SF.net SVN: geany: [448] trunk

ntrel at users.sourceforge.net ntrel at xxxxx
Fri Jun 16 11:18:05 UTC 2006


Revision: 448
Author:   ntrel
Date:     2006-06-16 04:17:52 -0700 (Fri, 16 Jun 2006)
ViewCVS:  http://svn.sourceforge.net/geany/?rev=448&view=rev

Log Message:
-----------
Added currently disabled drag reordering of notebook tabs

Modified Paths:
--------------
    trunk/ChangeLog
    trunk/src/Makefile.am
    trunk/src/main.c

Added Paths:
-----------
    trunk/src/notebook.c
    trunk/src/notebook.h
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2006-06-15 17:31:54 UTC (rev 447)
+++ trunk/ChangeLog	2006-06-16 11:17:52 UTC (rev 448)
@@ -1,3 +1,9 @@
+2006-06-16  Nick Treleaven  <nick.treleaven at btinternet.com>
+
+ * src/notebook.c, src/notebook.h, src/main.c, src/Makefile.am:
+   Added currently disabled drag reordering of notebook tabs.
+
+
 2006-06-15  Enrico Troeger  <enrico.troeger at uvena.de>
 
  * src/utils.c: Fixed a bug at opening files when clicking on compiler

Modified: trunk/src/Makefile.am
===================================================================
--- trunk/src/Makefile.am	2006-06-15 17:31:54 UTC (rev 447)
+++ trunk/src/Makefile.am	2006-06-16 11:17:52 UTC (rev 448)
@@ -14,6 +14,7 @@
 
 geany_SOURCES = \
 	main.c geany.h \
+	notebook.c notebook.h \
 	keybindings.c keybindings.h \
 	templates.c templates.h \
 	treeviews.c treeviews.h \

Modified: trunk/src/main.c
===================================================================
--- trunk/src/main.c	2006-06-15 17:31:54 UTC (rev 447)
+++ trunk/src/main.c	2006-06-16 11:17:52 UTC (rev 448)
@@ -46,6 +46,7 @@
 #include "templates.h"
 #include "encodings.h"
 #include "treeviews.h"
+#include "notebook.h"
 #ifdef HAVE_VTE
 # include "vte.h"
 #endif
@@ -478,6 +479,7 @@
 	gtk_window_set_default_size(GTK_WINDOW(app->window), GEANY_WINDOW_DEFAULT_WIDTH, GEANY_WINDOW_DEFAULT_HEIGHT);
 	configuration_load();
 	keybindings_init();
+	notebook_init();
 	templates_init();
 	encodings_init();
 	document_init_doclist();

Added: trunk/src/notebook.c
===================================================================
--- trunk/src/notebook.c	                        (rev 0)
+++ trunk/src/notebook.c	2006-06-16 11:17:52 UTC (rev 448)
@@ -0,0 +1,148 @@
+/*
+ *      notebook.c - this file is part of Geany, a fast and lightweight IDE
+ *
+ *      Copyright 2006 Nick Treleaven <nick.treleaven at btinternet.com>
+ *
+ *      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 details.
+ *
+ *      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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * $Id$
+ */
+
+#include "geany.h"
+#include "notebook.h"
+
+#define GEANY_DND_NOTEBOOK_TAB_TYPE	"geany_dnd_notebook_tab"
+
+static const GtkTargetEntry drag_targets[] = 
+{
+	{GEANY_DND_NOTEBOOK_TAB_TYPE, GTK_TARGET_SAME_APP | GTK_TARGET_SAME_WIDGET, 0}
+};
+
+
+gboolean
+notebook_drag_motion_cb(GtkWidget *notebook, GdkDragContext *dc,
+	gint x, gint y, guint time, gpointer user_data);
+
+
+void notebook_init()
+{
+	GtkWidget *notebook = app->notebook;
+
+	g_object_set(G_OBJECT(notebook), "can-focus", FALSE, NULL);
+
+	/* There is a bug with drag reordering notebook tabs.
+	 * Clicking on a notebook tab, then making a selection in the
+	 * Scintilla widget will cause a strange selection bug.
+	 * It seems there is a conflict; the drag cursor is shown,
+	 * and the selection is blocked; however, when releasing the
+	 * mouse button, the selection continues.
+	 * Maybe a bug in Scintilla 1.68? - ntrel */
+#ifndef TEST_TAB_DND
+	return;
+#endif
+
+	// Set up drag movement callback
+	g_signal_connect(G_OBJECT(notebook), "drag-motion",
+		G_CALLBACK(notebook_drag_motion_cb), NULL);
+
+	// set up drag motion for moving notebook pages
+	gtk_drag_source_set(notebook, GDK_BUTTON1_MASK,
+		drag_targets, G_N_ELEMENTS(drag_targets), GDK_ACTION_MOVE);
+	gtk_drag_dest_set(notebook, GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_DROP,
+		drag_targets, G_N_ELEMENTS(drag_targets), GDK_ACTION_MOVE);
+}
+
+
+gboolean
+notebook_drag_motion_cb(GtkWidget *widget, GdkDragContext *dc,
+	gint x, gint y, guint time, gpointer user_data)
+{
+	GtkNotebook *notebook = GTK_NOTEBOOK(widget);
+	static gint oldx, oldy; // for determining direction of mouse drag
+	gint ndest = notebook_find_tab_num_at_pos(notebook, x, y);
+	gint ncurr = gtk_notebook_get_current_page(notebook);
+
+	if (ndest >= 0)
+	if (ndest != ncurr)
+	{
+		gboolean ok = FALSE;
+		// prevent oscillation between non-homogeneous sized tabs
+		switch(gtk_notebook_get_tab_pos(notebook))
+		{
+		case GTK_POS_LEFT:
+		case GTK_POS_RIGHT:
+		ok = ((ndest > ncurr) && (y > oldy)) || ((ndest < ncurr) && (y < oldy));
+		break;
+
+		case GTK_POS_TOP:
+		case GTK_POS_BOTTOM:
+		ok = ((ndest > ncurr) && (x > oldx)) || ((ndest < ncurr) && (x < oldx));
+		break;
+		}
+
+		if (ok) gtk_notebook_reorder_child(notebook,
+			gtk_notebook_get_nth_page(notebook, ncurr), ndest);
+	}
+
+	oldx = x; oldy = y;
+	return FALSE;
+}
+
+
+/* x,y are co-ordinates local to the notebook, not including border padding
+ * adapted from Epiphany absolute version in ephy-notebook.c, thanks
+ * notebook tab label widgets must not be NULL */
+gint notebook_find_tab_num_at_pos(GtkNotebook *notebook, gint x, gint y)
+{
+	GtkPositionType tab_pos;
+	int page_num = 0;
+	GtkWidget *page;
+
+	// deal with less than 2 pages
+	switch(gtk_notebook_get_n_pages(notebook))
+	{case 0: return -1; case 1: return 0;}
+
+	tab_pos = gtk_notebook_get_tab_pos(notebook); //which edge
+
+	while ((page = gtk_notebook_get_nth_page(notebook, page_num)))
+	{
+		gint max_x, max_y;
+		GtkWidget *tab = gtk_notebook_get_tab_label(notebook, page);
+
+		g_return_val_if_fail(tab != NULL, -1);
+
+		if (!GTK_WIDGET_MAPPED(GTK_WIDGET(tab)))
+		{ // skip hidden tabs, e.g. tabs scrolled out of view
+			page_num++;
+			continue;
+		}
+
+		// subtract notebook pos to remove possible border padding
+		max_x = tab->allocation.x + tab->allocation.width -
+			GTK_WIDGET(notebook)->allocation.x;
+		max_y = tab->allocation.y + tab->allocation.height -
+			GTK_WIDGET(notebook)->allocation.y;
+
+		if (((tab_pos == GTK_POS_TOP)
+			|| (tab_pos == GTK_POS_BOTTOM))
+			&&(x<=max_x)) return page_num;
+		else if (((tab_pos == GTK_POS_LEFT)
+			|| (tab_pos == GTK_POS_RIGHT))
+			&& (y<=max_y)) return page_num;
+
+		page_num++;
+	}
+	return -1;
+}


Property changes on: trunk/src/notebook.c
___________________________________________________________________
Name: svn:keywords
   + Author Date Id Revision
Name: svn:eol-style
   + native

Added: trunk/src/notebook.h
===================================================================
--- trunk/src/notebook.h	                        (rev 0)
+++ trunk/src/notebook.h	2006-06-16 11:17:52 UTC (rev 448)
@@ -0,0 +1,30 @@
+/*
+ *      notebook.h - this file is part of Geany, a fast and lightweight IDE
+ *
+ *      Copyright 2006 Nick Treleaven <nick.treleaven at btinternet.com>
+ *
+ *      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 details.
+ *
+ *      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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * $Id$
+ */
+
+#ifndef GEANY_NOTEBOOK_H
+#define GEANY_NOTEBOOK_H 1
+
+void notebook_init();
+
+gint notebook_find_tab_num_at_pos(GtkNotebook *notebook, gint x, gint y);
+
+#endif


Property changes on: trunk/src/notebook.h
___________________________________________________________________
Name: svn:keywords
   + Author Date Id Revision
Name: svn:eol-style
   + native


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Commits mailing list