summary refs log tree commit diff stats
path: root/ranger/gui/wconsole.py
diff options
context:
space:
mode:
Diffstat (limited to 'ranger/gui/wconsole.py')
-rw-r--r--ranger/gui/wconsole.py134
1 files changed, 127 insertions, 7 deletions
diff --git a/ranger/gui/wconsole.py b/ranger/gui/wconsole.py
index 4411e83b..fdaa7716 100644
--- a/ranger/gui/wconsole.py
+++ b/ranger/gui/wconsole.py
@@ -1,7 +1,8 @@
 from ranger.gui.widget import Widget as SuperClass
 import curses
 
-CONSOLE_MODES = tuple(':/?>!')
+CONSOLE_MODES = tuple(':@/?>!')
+CONSOLE_MODES_DICTIONARY = { '@': 'open with: ' }
 
 class WConsole(SuperClass):
 	def __init__(self, win, colorscheme):
@@ -14,16 +15,26 @@ class WConsole(SuperClass):
 		initialize_console_commands(self.commandlist)
 		self.last_cursor_mode = 1
 		self.clear()
+		self.prompt = None
+		self.execute_funcs = {
+				':': WConsole.execute_command,
+				'@': WConsole.execute_openwith_quick,
+				'/': WConsole.execute_search,
+				'?': WConsole.execute_search,
+				'>': WConsole.execute_noreturn,
+				'!': WConsole.execute_openwith }
+	
+	def feed_env(self, env):
+		self.cf = env.cf
 
 	def draw(self):
 		if self.mode is None:
 			return
-
-		self.win.addstr(self.y, self.x, ":" + self.line)
+		self.win.addstr(self.y, self.x, self.prompt + self.line)
 
 	def finalize(self):
 		try:
-			self.win.move(self.y, self.x + self.pos + 1)
+			self.win.move(self.y, self.x + self.pos + len(self.prompt))
 		except:
 			pass
 
@@ -33,6 +44,10 @@ class WConsole(SuperClass):
 
 		self.last_cursor_mode = curses.curs_set(1)
 		self.mode = mode
+		try:
+			self.prompt = CONSOLE_MODES_DICTIONARY[self.mode]
+		except KeyError:
+			self.prompt = self.mode
 		self.focused = True
 		self.visible = True
 		return True
@@ -50,8 +65,8 @@ class WConsole(SuperClass):
 	
 	def press(self, key, fm, env):
 		from curses.ascii import ctrl, ESC
-		from ranger.helper import log
-		log(key)
+#		from ranger.helper import log
+#		log(key)
 
 		try:
 			cmd = self.commandlist.paths[env.keybuffer]
@@ -93,13 +108,118 @@ class WConsole(SuperClass):
 			self.pos = 0
 	
 	def delete(self, mod):
+		if mod == -1 and len(self.line) == 0:
+			self.close()
 		pos = self.pos + mod
 
 		self.line = self.line[0:pos] + self.line[pos+1:]
 		self.move(relative = mod)
 
-	def execute(self):
+	def execute(self, fm):
+		try:
+			self.execute_funcs[self.mode] (self, fm)
+		except KeyError:
+			pass
 		self.line = ''
 		self.pos = 0
 		self.close()
 
+	def execute_search(self, fm):
+		pass
+
+	def execute_openwith(self, fm):
+		line = self.line
+		if line[0] == '!':
+			fm.execute_file(tuple(line[1:].split()) + (fm.env.cf.path, ))
+		else:
+			fm.execute_file(tuple(line.split()) + (fm.env.cf.path, ), background = True)
+
+	def execute_openwith_quick(self, fm):
+		split = self.line.split()
+		app, flags, mode = get_app_flags_mode(self.line, fm)
+		fm.execute_file(
+				files = [self.cf],
+				app = app,
+				flags = flags,
+				mode = mode )
+
+	def execute_noreturn(self, fm):
+		pass
+
+	def execute_command(self, fm):
+		pass
+
+def get_app_flags_mode(line, fm):
+	app = ''
+	flags = ''
+	mode = 0
+	split = line.split()
+
+	if len(split) == 0:
+		pass
+
+	elif len(split) == 1:
+		part = split[0]
+		if is_app(part, fm):
+			app = part
+		elif is_flags(part):
+			flags = part
+		elif is_mode(part):
+			mode = part
+
+	elif len(split) == 2:
+		part0 = split[0]
+		part1 = split[1]
+
+		if is_app(part0, fm):
+			app = part0
+			if is_flags(part1):
+				flags = part1
+			elif is_mode(part1):
+				mode = part1
+		elif is_flags(part0):
+			flags = part0
+			if is_mode(part1):
+				mode = part1
+		elif is_mode(part0):
+			mode = part0
+			if is_flags(part1):
+				flags = part1
+
+	elif len(split) >= 3:
+		part0 = split[0]
+		part1 = split[1]
+		part2 = split[2]
+
+		if is_app(part0, fm):
+			app = part0
+			if is_flags(part1):
+				flags = part1
+				if is_mode(part2):
+					mode = part2
+			elif is_mode(part1):
+				mode = part1
+				if is_flags(part2):
+					flags = part2
+		elif is_flags(part0):
+			flags = part0
+			if is_mode(part1):
+				mode = part1
+		elif is_mode(part0):
+			mode = part0
+			if is_flags(part1):
+				flags = part1
+
+	return app, flags, int(mode)
+
+def is_app(arg, fm):
+	return fm.apps.has(arg)
+
+def is_flags(arg):
+	from ranger.applications import ALLOWED_FLAGS
+	return all(x in ALLOWED_FLAGS for x in arg)
+
+def is_mode(arg):
+	return all(x in '0123456789' for x in arg)
+
+