[Bf-extensions-cvs] SVN commit: /data/svn/bf-extensions [3128] contrib/py/scripts/addons/ text_intellisense.py: Added Text Intellisense script.

Alfonso de Leon Serra mackraken2023 at hotmail.com
Sun Mar 18 06:55:54 CET 2012


Revision: 3128
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-extensions&revision=3128
Author:   mackraken
Date:     2012-03-18 05:55:47 +0000 (Sun, 18 Mar 2012)
Log Message:
-----------
Added Text Intellisense script.
Early stage tested on 2.60

Added Paths:
-----------
    contrib/py/scripts/addons/text_intellisense.py

Added: contrib/py/scripts/addons/text_intellisense.py
===================================================================
--- contrib/py/scripts/addons/text_intellisense.py	                        (rev 0)
+++ contrib/py/scripts/addons/text_intellisense.py	2012-03-18 05:55:47 UTC (rev 3128)
@@ -0,0 +1,436 @@
+# ***** BEGIN GPL LICENSE BLOCK *****
+#
+#
+# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ***** END GPL LICENCE BLOCK *****
+
+bl_info = {
+	"name": "Intellisense for Text Editor",
+	"author": "Mackraken",
+	"version": (0, 2),
+	"blender": (2, 6, 0),
+	"api": 41851,
+	"location": "Ctrl + Space at Text Editor",
+	"description": "Adds intellense to the Text Editor",
+	"warning": "Only works with 2.57 intellisense",
+	"wiki_url": "",
+	"tracker_url": "",
+	"category": "Development"}
+
+import bpy
+
+def complete(context):
+	from console import intellisense
+	from console_python import get_console
+	
+	sc = context.space_data
+	text = sc.text
+	
+	region = context.region
+	for area in context.screen.areas:
+		if area.type=="CONSOLE":
+			region = area.regions[1]
+			break
+	
+	console = get_console(hash(region))[0]
+
+	line = text.current_line.body
+	cursor = text.current_character
+	
+	result  = intellisense.expand(line, cursor, console.locals, bpy.app.debug)
+	
+	return result
+
+	
+class Intellimenu(bpy.types.Menu):
+	bl_label = ""
+	bl_idname = "IntelliMenu"
+	
+	text = ""
+	
+	def draw(self, context):
+		layout = self.layout
+		#Very ugly see how can i fix this
+		options = complete(context)
+		
+		options = options[2].split("  ")
+		for op in options:
+			layout.operator("text.intellioptions", text=op).text=op
+		
+#This operator executes when hits Ctrl+Space at the text editor
+
+class Intellisense(bpy.types.Operator):
+	#'''Tooltip'''
+	bl_idname = "text.intellisense"
+	bl_label = "Text Editor Intellisense"
+	
+	text = ""
+	
+#	@classmethod
+#	def poll(cls, context):
+#		return context.active_object is not None
+
+	def execute(self, context):
+		sc = context.space_data
+		text = sc.text
+		
+		if text.current_character>0:
+			result = complete(context)
+	
+			#print(result)
+			
+			if result[2]=="":
+				text.current_line.body = result[0]
+				bpy.ops.text.move(type='LINE_END')
+			else:
+				bpy.ops.wm.call_menu(name=Intellimenu.bl_idname)
+
+		return {'FINISHED'}
+	
+#this operator completes the line with the options you choose from the menu
+class Intellioptions(bpy.types.Operator):
+	#'''Tooltip'''
+	bl_idname = "text.intellioptions"
+	bl_label = "Intellisense options"
+
+	text = bpy.props.StringProperty()
+	
+	@classmethod
+	def poll(cls, context):
+		return context.active_object is not None
+
+	def execute(self, context):
+		sc = context.space_data
+		text = sc.text
+		
+		comp = self.text
+		line = text.current_line.body
+		
+		lline = len(line)
+		lcomp = len(comp)
+		
+		#intersect text 
+		intersect = [-1,-1]
+		
+		for i in range(lcomp):
+			val1 = comp[0:i+1]
+			
+			for j in range(lline):
+				val2 = line[lline-j-1::]
+				#print("	",j, val2)
+			
+				if val1==val2:
+					intersect = [i, j]
+					break
+				
+		if intersect[0]>-1:
+			newline = line[0:lline-intersect[1]-1]+comp
+		else:
+			newline = line + comp
+			
+		#print(newline)		
+		text.current_line.body = newline
+			
+		bpy.ops.text.move(type='LINE_END')
+		   
+
+		return {'FINISHED'}
+
+def send_console(context, all=0):
+	
+	sc = context.space_data
+	text = sc.text
+	
+	console = None
+	
+	for area in bpy.context.screen.areas:
+		if area.type=="CONSOLE":
+			from console_python import get_console
+				
+			console = get_console(hash(area.regions[1]))[0]
+
+	if console==None:
+		return {'FINISHED'}
+	
+	if all:
+		
+		for l in text.lines:
+			console.push(l.body)
+			
+	else:
+		#print(console.prompt)
+		console.push(text.current_line.body)
+	
+	
+	
+	
+class TestLine(bpy.types.Operator):
+	#'''Tooltip'''
+	bl_idname = "text.test_line"
+	bl_label = "Test line"
+
+	all = bpy.props.BoolProperty(default=False)
+	
+	
+#   @classmethod
+#   def poll(cls, context):
+#	   return context.active_object is not None
+
+	def execute(self, context):
+		#print("test line")
+		
+		#send_console(context, self.all)
+		sc = context.space_data
+		text = sc.text
+		
+		line = text.current_line.body
+		console = None
+		
+		for area in bpy.context.screen.areas:
+			if area.type=="CONSOLE":
+				from console_python import get_console
+					
+				console = get_console(hash(area.regions[1]))[0]
+		
+		if console==None:
+			return {'FINISHED'}
+				
+		command = ""
+			
+		forindex = line.find("for ")
+		if forindex >-1:
+			
+			var = line[forindex+4:-1]
+			var = var[0:var.find(" ")]
+			state = line[line.rindex(" ")+1:-1]
+			 
+			command = var + " = " +state+"[0]"
+			
+				
+		else:
+			command = line
+			
+		#print(command)
+		try:
+			console.push(command)
+		except:
+			pass
+		
+		bpy.ops.text.line_break()
+		
+
+		return {'FINISHED'}
+class SetBreakPoint(bpy.types.Operator):
+	bl_idname = "text.set_breakpoint"
+	bl_label = "Set Breakpoint"
+	
+	def execute(self, context):
+		
+		sc = bpy.context.space_data
+		text = sc.text
+		
+		line = text.current_line
+		br = " #breakpoint"
+		#print(line.body.find(br))
+		if line.body.find(br)>-1:
+			
+			line.body = line.body.replace(br, "")
+		else:
+			
+			line.body += br
+		
+		return {'FINISHED'}
+
+class Debug(bpy.types.Operator):
+	bl_idname = "text.debug"
+	bl_label = "Debug"
+	
+	def execute(self, context):
+		
+		binpath = bpy.app.binary_path
+			
+		addonspath = binpath[0:binpath.rindex("\\")+1]+str(bpy.app.version[0])+"."+str(bpy.app.version[1])+"\\scripts\\addons\\"
+		
+		print(addonspath)
+			
+		sc = context.space_data
+		text = sc.text
+		
+		br = " #breakpoint"
+	
+		filepath = addonspath+"debug.py"
+		file = open(filepath, "w")
+		file.write("import pdb\n")
+		
+		for line in text.lines:
+			l = line.body
+			
+			if line.body.find(br)>-1:
+				indent = ""
+				for letter in line.body:
+					
+					if not letter.isalpha():
+						indent+=letter
+					else:
+						break
+				file.write(l[0:-len(br)]+"\n")
+				
+				file.write(indent+"pdb.set_trace()\n")
+				
+			else:
+				file.write(line.body+"\n")
+						
+				
+		
+		file.close()
+		
+		import pdb
+		import debug
+		
+		pdb.runcall("debug")	
+		
+		
+		return {'FINISHED'}
+
+
+class DebugPanel(bpy.types.Panel):
+	bl_label = "Debug"
+	bl_idname = "text.test_line"
+	bl_space_type = "TEXT_EDITOR"
+	bl_region_type = "UI"
+	#bl_context = "object"
+
+	text = bpy.props.StringProperty()
+	
+	def draw(self, context):
+		layout = self.layout
+		row = layout.row()
+		
+		text = self.text
+		row = layout.row()
+		row.operator("text.debug", text ="Debug")
+		row = layout.row()
+		row.operator("text.set_breakpoint")
+		row = layout.row()
+		row.operator("text.test_line").all=False
+		row = layout.row()
+		row.operator("text.test_line", text ="Test All").all=True
+		
+		row = layout.row()
+		row.label(text="Coming Soon ...")
+
+
+### ASSIGN A KEY
+ 
+#section = Input section. "Window, Text, ..."
+#name = operator name or wm.call_menu 
+#type = key 
+#event = keyboard event (Press, release, ...)
+#mods = array containing key modifiers (["ctrl", "alt", "shift"]
+#propvalue = menu name, if name is set to "wm.call_menu"
+#overwrite doesnt work at the moment
+
+def assignKey(section, name, type, event, mods=[],propvalue = "",  overwrite=0):
+	
+	kconf = bpy.context.window_manager.keyconfigs.active
+	
+	
+	#check section
+	validsections = [item.name for item in kconf.keymaps]
+	if not section in validsections:
+		print(section  + " is not a valid section.")
+		#print(validsections)	
+		return False
+	
+	#check type
+	type = type.upper()
+	validkeys = [item.identifier for item in bpy.types.KeyMapItem.bl_rna.properties['type'].enum_items]
+	if not type in validkeys:
+		print(type + " is not a valid key.")
+		#print(validkeys)
+		return False
+
+
+	#check event
+	event = event.upper()   
+	validevents = [item.identifier for item in bpy.types.KeyMapItem.bl_rna.properties['value'].enum_items]
+	if not event in validevents:
+		print(event + " is not a valid event.")
+		#print(validevents)
+		
+	kmap = kconf.keymaps[section] 
+
+	
+#   get mods
+	for i, mod in enumerate(mods):
+		mods[i]= mod.lower()
+		
+	#any, shift, ctrl, alt, oskey
+	kmod = [False, False, False, False, False]
+	
+	if "any" in mods: kmod[0] = True
+	if "shift" in mods: kmod[1] = True
+	if "ctrl" in mods: kmod[2] = True
+	if "alt" in mods: kmod[3] = True
+	if "oskey" in mods: kmod[4] = True
+	
+#   #check if key exist
+	kexists = False
+  
+	for key in kmap.keymap_items:
+		keymods = [key.any, key.shift, key.ctrl, key.alt, key.oskey]
+		if key.type == type and keymods == kmod:
+			kexists = True
+			print(key,"key exists")
+			break
+			
+	if kexists:
+		#overwrite?
+		if overwrite:
+			key.idname=name
+			
+			#key.type = type
+		
+	else:
+		#create key
+		key = kmap.keymap_items.new(name, type, event, False)
+		key.any = kmod[0]
+		key.shift = kmod[1]
+		key.ctrl = kmod[2]
+		key.alt = kmod[3]
+		key.oskey = kmod[4]
+				
+		if propvalue!="": key.properties.name = propvalue
+
+
+
+
+classes = [Intellisense, Intellioptions, Intellimenu, DebugPanel, TestLine, SetBreakPoint, Debug]
+
+def register():
+	
+	for c in classes:
+		bpy.utils.register_class(c)
+
+	assignKey("Text", "text.intellisense", "SPACE", "Press",  ["ctrl"])
+	assignKey("Text", "text.test_line", "RET", "Press", [],"",1)
+
+def unregister():
+	for c in classes:
+		bpy.utils.unregister_class(c)
+
+if __name__ == "__main__":
+	register()



More information about the Bf-extensions-cvs mailing list