Fixed run and added experimental program output streaming support (buffer approach doesn't work too well with long and continuous output)
This commit is contained in:
parent
6d14dacaa7
commit
0e8c4e8d9a
1 changed files with 67 additions and 17 deletions
|
@ -65,6 +65,9 @@ class Fl0w:
|
||||||
self.connected = False
|
self.connected = False
|
||||||
self.window = window
|
self.window = window
|
||||||
self.folder = window.folders()[0]
|
self.folder = window.folders()[0]
|
||||||
|
self.selected_wallaby = None
|
||||||
|
self.sock = None
|
||||||
|
self.s_sync = None
|
||||||
|
|
||||||
self.start_menu = Menu()
|
self.start_menu = Menu()
|
||||||
self.start_menu.add(Entry("Connect", "Connect to a fl0w server", action=self.invoke_connect))
|
self.start_menu.add(Entry("Connect", "Connect to a fl0w server", action=self.invoke_connect))
|
||||||
|
@ -117,10 +120,39 @@ class Fl0w:
|
||||||
view.settings().set("gutter", False)
|
view.settings().set("gutter", False)
|
||||||
view.settings().set("line_numbers", False)
|
view.settings().set("line_numbers", False)
|
||||||
view.set_read_only(False)
|
view.set_read_only(False)
|
||||||
view.run_command("append", {"characters": data["returned"] + status})
|
view.run_command("append", {"characters": data["returned"] + status, "scroll_to_end" : True})
|
||||||
view.set_read_only(True)
|
view.set_read_only(True)
|
||||||
handler.window.run_command("show_panel", {"panel": "output.compile_panel"})
|
handler.window.run_command("show_panel", {"panel": "output.compile_panel"})
|
||||||
|
|
||||||
|
class StdStream(Routing.ClientRoute):
|
||||||
|
def __init__(self):
|
||||||
|
self.view = None
|
||||||
|
self.buffer = ""
|
||||||
|
|
||||||
|
def setup_view(self, handler):
|
||||||
|
self.view = handler.window.create_output_panel('std_stream_panel')
|
||||||
|
self.view.settings().set("draw_white_space", "none")
|
||||||
|
self.view.settings().set("draw_indent_guides", False)
|
||||||
|
self.view.settings().set("gutter", False)
|
||||||
|
self.view.settings().set("line_numbers", False)
|
||||||
|
|
||||||
|
def run(self, data, handler):
|
||||||
|
self.setup_view(handler)
|
||||||
|
handler.window.run_command("show_panel", {"panel": "output.std_stream_panel"})
|
||||||
|
if type(data) is str:
|
||||||
|
self.buffer += data
|
||||||
|
self.append_to_view(self.buffer)
|
||||||
|
elif type(data) is dict:
|
||||||
|
if "return_code" in data:
|
||||||
|
self.append_to_view(self.buffer + "\nProgram finished with return code %d" % data["return_code"])
|
||||||
|
self.buffer = ""
|
||||||
|
|
||||||
|
def append_to_view(self, text):
|
||||||
|
self.view.set_read_only(False)
|
||||||
|
self.view.run_command("append", {"characters" : text, "scroll_to_end" : True})
|
||||||
|
self.view.set_read_only(True)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def connect(self, connect_details):
|
def connect(self, connect_details):
|
||||||
connect_details_raw = connect_details
|
connect_details_raw = connect_details
|
||||||
|
@ -135,11 +167,12 @@ class Fl0w:
|
||||||
info = Fl0w.Info()
|
info = Fl0w.Info()
|
||||||
wallaby_control = Fl0w.WallabyControl()
|
wallaby_control = Fl0w.WallabyControl()
|
||||||
get_info = Fl0w.GetInfo()
|
get_info = Fl0w.GetInfo()
|
||||||
|
std_stream = Fl0w.StdStream()
|
||||||
self.s_sync = SyncClient(self.sock, self.folder, "s_sync")
|
self.s_sync = SyncClient(self.sock, self.folder, "s_sync")
|
||||||
compile = Fl0w.Compile()
|
compile = Fl0w.Compile()
|
||||||
_thread.start_new_thread(sock_handler, (self.sock, {"error_report": error_report,
|
_thread.start_new_thread(sock_handler, (self.sock, {"error_report": error_report,
|
||||||
"info" : info, "wallaby_control" : wallaby_control, "get_info" : get_info,
|
"info" : info, "wallaby_control" : wallaby_control, "get_info" : get_info,
|
||||||
"s_sync" : self.s_sync, "compile" : compile}, self))
|
"s_sync" : self.s_sync, "compile" : compile, "std_stream" : std_stream}, self))
|
||||||
self.s_sync.start()
|
self.s_sync.start()
|
||||||
self.connected = True
|
self.connected = True
|
||||||
# Saving last server address
|
# Saving last server address
|
||||||
|
@ -166,13 +199,17 @@ class Fl0w:
|
||||||
self.sock.close()
|
self.sock.close()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def invoke_wallaby_control(self):
|
def invoke_wallaby_control(self):
|
||||||
self.sock.send("list_wallaby_controllers", "wallaby_control")
|
self.sock.send("list_wallaby_controllers", "wallaby_control")
|
||||||
|
|
||||||
|
|
||||||
|
def invoke_run_menu(self):
|
||||||
|
self.sock.send("list_programs", "wallaby_control")
|
||||||
|
|
||||||
|
|
||||||
class WallabyControl(Routing.ClientRoute):
|
class WallabyControl(Routing.ClientRoute):
|
||||||
def run(self, data, handler):
|
def run(self, data, handler):
|
||||||
|
if "wallaby_controllers" in data:
|
||||||
wallaby_menu = Menu()
|
wallaby_menu = Menu()
|
||||||
entry_count = 0
|
entry_count = 0
|
||||||
for wallaby in data["wallaby_controllers"]:
|
for wallaby in data["wallaby_controllers"]:
|
||||||
|
@ -182,15 +219,28 @@ class Fl0w:
|
||||||
wallaby_menu.invoke(handler.window, back=handler.main_menu)
|
wallaby_menu.invoke(handler.window, back=handler.main_menu)
|
||||||
else:
|
else:
|
||||||
sublime.error_message("No Wallaby Controllers connected.")
|
sublime.error_message("No Wallaby Controllers connected.")
|
||||||
|
elif "programs" in data:
|
||||||
|
run_menu = Menu(subtitles=False)
|
||||||
|
entry_count = 0
|
||||||
|
for program in data["programs"]:
|
||||||
|
run_menu.add(Entry(program, action=handler.run_program, kwargs={"program" : program}))
|
||||||
|
entry_count += 1
|
||||||
|
if entry_count != 0:
|
||||||
|
run_menu.invoke(handler.window, back=handler.main_menu)
|
||||||
|
else:
|
||||||
|
sublime.error_message("No programs avaliable.")
|
||||||
|
|
||||||
|
def run_program(self, program):
|
||||||
|
self.sock.send({self.selected_wallaby : {"run" : program}}, "wallaby_control")
|
||||||
|
|
||||||
|
|
||||||
def wallaby_control_submenu(self, wallaby):
|
def wallaby_control_submenu(self, wallaby):
|
||||||
|
self.selected_wallaby = wallaby
|
||||||
menu = Menu(subtitles=False)
|
menu = Menu(subtitles=False)
|
||||||
menu.add(Entry("Run"))
|
|
||||||
|
menu.add(Entry("Run", action=self.invoke_run_menu))
|
||||||
for action in ("Stop", "Restart", "Shutdown", "Reboot", "Disconnect"):
|
for action in ("Stop", "Restart", "Shutdown", "Reboot", "Disconnect"):
|
||||||
menu.add(Entry(action, action=self.sock.send, kwargs={"data" : {wallaby : [action.lower()]}, "route" : "wallaby_control"}))
|
menu.add(Entry(action, action=self.sock.send, kwargs={"data" : {wallaby : [action.lower()]}, "route" : "wallaby_control"}))
|
||||||
|
|
||||||
|
|
||||||
menu.invoke(self.window)
|
menu.invoke(self.window)
|
||||||
|
|
||||||
|
|
||||||
|
@ -204,11 +254,12 @@ class Fl0w:
|
||||||
def set_debug(self, debug):
|
def set_debug(self, debug):
|
||||||
sublime.status_message("fl0w: Debug now '%s'" % debug)
|
sublime.status_message("fl0w: Debug now '%s'" % debug)
|
||||||
self.sock.debug = debug
|
self.sock.debug = debug
|
||||||
|
sublime.load_settings("fl0w.sublime-setting").set("debug", debug)
|
||||||
|
sublime.save_settings("fl0w.sublime-setting")
|
||||||
|
|
||||||
|
|
||||||
class Fl0wCommand(sublime_plugin.WindowCommand):
|
class Fl0wCommand(sublime_plugin.WindowCommand):
|
||||||
def run(self):
|
def run(self):
|
||||||
print(windows)
|
|
||||||
valid_window_setup = True
|
valid_window_setup = True
|
||||||
folder_count = len(self.window.folders())
|
folder_count = len(self.window.folders())
|
||||||
if folder_count > 1:
|
if folder_count > 1:
|
||||||
|
@ -239,7 +290,6 @@ class Fl0wCommand(sublime_plugin.WindowCommand):
|
||||||
else:
|
else:
|
||||||
sublime.error_message("fl0w can't be opened in your current directory (.no-fl0w file exists)")
|
sublime.error_message("fl0w can't be opened in your current directory (.no-fl0w file exists)")
|
||||||
else:
|
else:
|
||||||
print(self.window.fl0w.connected)
|
|
||||||
if not self.window.fl0w.connected:
|
if not self.window.fl0w.connected:
|
||||||
self.window.fl0w.start_menu.invoke(self.window)
|
self.window.fl0w.start_menu.invoke(self.window)
|
||||||
else:
|
else:
|
||||||
|
|
Reference in a new issue