[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [27159] trunk/blender/source/blender: bugfix [#20694] Copy Paste to buffer missing in Console editor

Campbell Barton ideasman42 at gmail.com
Sat Feb 27 00:56:16 CET 2010


Revision: 27159
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=27159
Author:   campbellbarton
Date:     2010-02-27 00:56:16 +0100 (Sat, 27 Feb 2010)

Log Message:
-----------
bugfix [#20694] Copy Paste to buffer missing in Console editor
- console selection working
- copy selection to clipboard
- paste selection from clipboard works with multiline paste

word-wrap is still not working with selection drawing.

Modified Paths:
--------------
    trunk/blender/source/blender/blenlib/BLI_dynstr.h
    trunk/blender/source/blender/blenlib/intern/BLI_dynstr.c
    trunk/blender/source/blender/editors/space_console/console_draw.c
    trunk/blender/source/blender/editors/space_console/console_ops.c

Modified: trunk/blender/source/blender/blenlib/BLI_dynstr.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_dynstr.h	2010-02-26 22:14:31 UTC (rev 27158)
+++ trunk/blender/source/blender/blenlib/BLI_dynstr.h	2010-02-26 23:56:16 UTC (rev 27159)
@@ -60,6 +60,15 @@
 	 */
 void	BLI_dynstr_append				(DynStr *ds, const char *cstr);
 
+/**
+ * Append a length clamped c-string to a DynStr.
+ *
+ * @param ds The DynStr to append to.
+ * @param cstr The c-string to append.
+ * @param len The maximum length of the c-string to copy.
+ */
+void	BLI_dynstr_nappend				(DynStr *ds, const char *cstr, int len);
+
 	/**
 	 * Append a c-string to a DynStr, but with formatting like printf.
 	 * 

Modified: trunk/blender/source/blender/blenlib/intern/BLI_dynstr.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/BLI_dynstr.c	2010-02-26 22:14:31 UTC (rev 27158)
+++ trunk/blender/source/blender/blenlib/intern/BLI_dynstr.c	2010-02-26 23:56:16 UTC (rev 27159)
@@ -83,6 +83,23 @@
 	ds->curlen+= cstrlen;
 }
 
+void BLI_dynstr_nappend(DynStr *ds, const char *cstr, int len) {
+	DynStrElem *dse= malloc(sizeof(*dse));
+	int cstrlen= strnlen(cstr, len);
+
+	dse->str= malloc(cstrlen+1);
+	memcpy(dse->str, cstr, cstrlen);
+	dse->str[cstrlen] = '\0';
+	dse->next= NULL;
+
+	if (!ds->last)
+		ds->last= ds->elems= dse;
+	else
+		ds->last= ds->last->next= dse;
+
+	ds->curlen+= cstrlen;
+}
+
 void BLI_dynstr_vappendf(DynStr *ds, const char *format, va_list args)
 {
 	char *message, fixedmessage[256];

Modified: trunk/blender/source/blender/editors/space_console/console_draw.c
===================================================================
--- trunk/blender/source/blender/editors/space_console/console_draw.c	2010-02-26 22:14:31 UTC (rev 27158)
+++ trunk/blender/source/blender/editors/space_console/console_draw.c	2010-02-26 23:56:16 UTC (rev 27159)
@@ -140,9 +140,23 @@
 
 static void console_draw_sel(int sel[2], int xy[2], int str_len, int cwidth, int console_width, int lheight)
 {
-	if(sel[0] < str_len && sel[1] > 0) {
+	if(sel[0] <= str_len && sel[1] >= 0) {
 		int sta = MAX2(sel[0], 0);
 		int end = MIN2(sel[1], str_len);
+
+		/* highly confusing but draws correctly */
+		if(sel[0] < 0 || sel[1] > str_len) {
+			if(sel[0] > 0) {
+				end= sta;
+				sta= 0;
+			}
+			if (sel[1] <= str_len) {
+				sta= end;
+				end= str_len;
+			}
+		}
+		/* end confusement */
+
 		{
 			glEnable(GL_POLYGON_STIPPLE);
 			glPolygonStipple(stipple_halftone);
@@ -157,8 +171,8 @@
 		}
 	}
 
-	sel[0] -= str_len;
-	sel[1] -= str_len;
+	sel[0] -= str_len + 1;
+	sel[1] -= str_len + 1;
 }
 
 
@@ -179,7 +193,7 @@
 					int ofs = (int)floor(((float)cdc->mval[0] / (float)cdc->cwidth));
 					*cdc->pos_pick += MIN2(ofs, str_len);
 				} else
-					*cdc->pos_pick += str_len;
+					*cdc->pos_pick += str_len + 1;
 			}
 
 		}
@@ -190,6 +204,13 @@
 	else if (y_next-cdc->lheight < cdc->ymin) {
 		/* have not reached the drawable area so don't break */
 		cdc->xy[1]= y_next;
+
+		/* adjust selection even if not drawing */
+		if(cdc->sel[0] != cdc->sel[1]) {
+			cdc->sel[0] -= str_len + 1;
+			cdc->sel[1] -= str_len + 1;
+		}
+
 		return 1;
 	}
 
@@ -314,6 +335,7 @@
 		if(sc->sel_start != sc->sel_end) {
 			sel[0]= sc->sel_start;
 			sel[1]= sc->sel_end;
+			// printf("%d %d\n", sel[0], sel[1]);
 		}
 		
 		/* text */

Modified: trunk/blender/source/blender/editors/space_console/console_ops.c
===================================================================
--- trunk/blender/source/blender/editors/space_console/console_ops.c	2010-02-26 22:14:31 UTC (rev 27158)
+++ trunk/blender/source/blender/editors/space_console/console_ops.c	2010-02-26 23:56:16 UTC (rev 27159)
@@ -681,23 +681,71 @@
 	char *buf_str;
 	
 	ConsoleLine *cl;
-	
+	int sel[2];
+	int offset= 0;
+
+#if 0
+	/* copy whole file */
 	for(cl= sc->scrollback.first; cl; cl= cl->next) {
 		BLI_dynstr_append(buf_dyn, cl->line);
 		BLI_dynstr_append(buf_dyn, "\n");
 	}
+#endif
 
+	if(sc->sel_start == sc->sel_end)
+		return OPERATOR_CANCELLED;
+
+
+	for(cl= sc->scrollback.first; cl; cl= cl->next) {
+		offset += cl->len + 1;
+	}
+
+	if(offset==0)
+		return OPERATOR_CANCELLED;
+
+
+	offset -= 1;
+	sel[0]= offset - sc->sel_end;
+	sel[1]= offset - sc->sel_start;
+
+	for(cl= sc->scrollback.first; cl; cl= cl->next) {
+
+		int sta= MAX2(0, sel[0]);
+		int end= MIN2(cl->len, sel[1]);
+
+		if(sel[0] <= cl->len && sel[1] >= 0) {
+			int str_len= cl->len;
+
+			/* highly confusing but draws correctly */
+			if(sel[0] < 0 || sel[1] > str_len) {
+				if(sel[0] > 0) {
+					end= sta;
+					sta= 0;
+				}
+				if (sel[1] <= str_len) {
+					sta= end;
+					end= str_len;
+				}
+			}
+			/* end confusement */
+
+			SWAP(int, sta, end);
+			end= cl->len - end;
+			sta= cl->len - sta;
+
+			if(BLI_dynstr_get_len(buf_dyn))
+				BLI_dynstr_append(buf_dyn, "\n");
+
+			BLI_dynstr_nappend(buf_dyn, cl->line + sta, end - sta);
+		}
+
+		sel[0] -= cl->len + 1;
+		sel[1] -= cl->len + 1;
+	}
+
 	buf_str= BLI_dynstr_get_cstring(buf_dyn);
 	buf_len= BLI_dynstr_get_len(buf_dyn);
 	BLI_dynstr_free(buf_dyn);
-
-	/* hack for selection */
-#if 0
-	if(sc->sel_start != sc->sel_end) {
-		buf_str[buf_len - sc->sel_start]= '\0';
-		WM_clipboard_text_set(buf_str+(buf_len - sc->sel_end), 0);
-	}
-#endif
 	WM_clipboard_text_set(buf_str, 0);
 
 	MEM_freeN(buf_str);
@@ -723,12 +771,29 @@
 	ConsoleLine *ci= console_history_verify(C);
 
 	char *buf_str= WM_clipboard_text_get(0);
+	char *buf_step, *buf_next;
 
 	if(buf_str==NULL)
 		return OPERATOR_CANCELLED;
 
-	console_line_insert(ci, buf_str); /* TODO - Multiline copy?? */
+	buf_next= buf_str;
+	buf_step= buf_str;
 
+	while((buf_next=buf_step) && buf_next[0] != '\0') {
+		buf_step= strchr(buf_next, '\n');
+		if(buf_step) {
+			*buf_step= '\0';
+			buf_step++;
+		}
+
+		if(buf_next != buf_str) {
+			WM_operator_name_call(C, "CONSOLE_OT_execute", WM_OP_EXEC_DEFAULT, NULL);
+			ci= console_history_verify(C);
+		}
+
+		console_line_insert(ci, buf_next);
+	}
+
 	MEM_freeN(buf_str);
 
 	ED_area_tag_redraw(CTX_wm_area(C));





More information about the Bf-blender-cvs mailing list