mirror of
https://github.com/hexedtech/codemp-sublime.git
synced 2024-12-04 20:04:52 +01:00
feat(WIP): added quick panel browsing for server and workspace!
This commit is contained in:
parent
c222aec013
commit
93f3e38c75
4 changed files with 313 additions and 11 deletions
|
@ -19,24 +19,38 @@
|
|||
"file": "${packages}/CodempClient/README.md"
|
||||
}
|
||||
},
|
||||
{
|
||||
"caption": "Codemp: Browse Server",
|
||||
"command": "codemp_browse_server",
|
||||
"args": {}
|
||||
},
|
||||
{
|
||||
"caption": "Codemp: Browse Workspace",
|
||||
"command": "codemp_browse_workspace",
|
||||
"args": {
|
||||
|
||||
}
|
||||
},
|
||||
{
|
||||
// # on_window_command, does not trigger when called from the command palette
|
||||
// # See: https://github.com/sublimehq/sublime_text/issues/2234
|
||||
"caption": "Codemp: Connect",
|
||||
"command": "codemp_connect",
|
||||
"args": {
|
||||
"server_host": "http://code.mp:50053",
|
||||
"server_host": "code.mp",
|
||||
"user_name" : "cschen@codemp.dev",
|
||||
"password" : "***REMOVED***"
|
||||
}
|
||||
},
|
||||
{
|
||||
"caption": "Codemp: Disconnect Client",
|
||||
"command": "codemp_disconnect",
|
||||
"arg": {}
|
||||
"args": {}
|
||||
},
|
||||
{
|
||||
"caption": "Codemp: Join Workspace",
|
||||
"command": "codemp_join_workspace",
|
||||
"arg": {
|
||||
"args": {
|
||||
// 'workspace_id': 'asd'
|
||||
// 'buffer_id': 'test'
|
||||
},
|
||||
|
@ -44,14 +58,14 @@
|
|||
{
|
||||
"caption": "Codemp: Leave Workspace",
|
||||
"command": "codemp_leave_workspace",
|
||||
"arg": {
|
||||
"args": {
|
||||
// "id": 'lmaaaao'
|
||||
}
|
||||
},
|
||||
{
|
||||
"caption": "Codemp: Invite To Workspace",
|
||||
"command": "codemp_invite_to_workspace",
|
||||
"arg": {
|
||||
"args": {
|
||||
// "id": 'lmaaaao'
|
||||
// "user": 'lupo'
|
||||
}
|
||||
|
@ -59,21 +73,21 @@
|
|||
{
|
||||
"caption": "Codemp: Create Workspace",
|
||||
"command": "codemp_create_workspace",
|
||||
"arg": {
|
||||
"args": {
|
||||
// "id": 'lmaaaao'
|
||||
}
|
||||
},
|
||||
{
|
||||
"caption": "Codemp: Delete Workspace",
|
||||
"command": "codemp_delete_workspace",
|
||||
"arg": {
|
||||
"args": {
|
||||
// "id": 'lmaaaao'
|
||||
}
|
||||
},
|
||||
{
|
||||
"caption": "Codemp: Join Buffer",
|
||||
"command": "codemp_join_buffer",
|
||||
"arg": {
|
||||
"args": {
|
||||
// 'workspace_id': 'asd'
|
||||
// 'buffer_id': 'test'
|
||||
},
|
||||
|
@ -81,7 +95,7 @@
|
|||
{
|
||||
"caption": "Codemp: Leave Buffer",
|
||||
"command": "codemp_leave_buffer",
|
||||
"arg": {
|
||||
"args": {
|
||||
// 'workspace_id': 'asd'
|
||||
// 'buffer_id': 'test'
|
||||
}
|
||||
|
@ -89,7 +103,7 @@
|
|||
{
|
||||
"caption": "Codemp: Create Buffer",
|
||||
"command": "codemp_create_buffer",
|
||||
"arg": {
|
||||
"args": {
|
||||
// 'workspace_id': 'asd'
|
||||
// 'buffer_id': 'test'
|
||||
}
|
||||
|
@ -97,7 +111,7 @@
|
|||
{
|
||||
"caption": "Codemp: Delete Buffer",
|
||||
"command": "codemp_delete_buffer",
|
||||
"arg": {
|
||||
"args": {
|
||||
// 'workspace_id': 'asd'
|
||||
// 'buffer_id': 'test'
|
||||
}
|
||||
|
|
40
main.py
40
main.py
|
@ -5,10 +5,14 @@ import logging
|
|||
|
||||
import codemp
|
||||
from .plugin.utils import safe_listener_detach
|
||||
from .plugin.utils import safe_listener_attach
|
||||
from .plugin.core.session import session
|
||||
from .plugin.core.workspace import workspaces
|
||||
from .plugin.core.buffers import buffers
|
||||
from .plugin.text_listener import TEXT_LISTENER
|
||||
from .plugin import globals as g
|
||||
|
||||
# We import these just to showcase the commands available.
|
||||
from .plugin.commands.client import CodempConnectCommand
|
||||
from .plugin.commands.client import CodempDisconnectCommand
|
||||
from .plugin.commands.client import CodempCreateWorkspaceCommand
|
||||
|
@ -22,6 +26,10 @@ from .plugin.commands.workspace import CodempDeleteBufferCommand
|
|||
from .plugin.commands.workspace import CodempJoinBufferCommand
|
||||
from .plugin.commands.workspace import CodempLeaveBufferCommand
|
||||
|
||||
from .plugin.quickpanel.qpbrowser import QPServerBrowser
|
||||
from .plugin.quickpanel.qpbrowser import QPWorkspaceBrowser
|
||||
|
||||
|
||||
LOG_LEVEL = logging.DEBUG
|
||||
handler = logging.StreamHandler()
|
||||
handler.setFormatter(
|
||||
|
@ -54,6 +62,38 @@ def kill_all():
|
|||
|
||||
session.stop()
|
||||
|
||||
def objects_from_view(view):
|
||||
assert view.settings().get(g.CODEMP_VIEW_TAG, False)
|
||||
buffid = str(view.settings().get(g.CODEMP_BUFFER_ID))
|
||||
|
||||
try: vbuff = buffers.lookupId(buffid)
|
||||
except KeyError:
|
||||
logger.error("we couldn't find the matching buffer or workspace!")
|
||||
raise ValueError
|
||||
|
||||
vws = buffers.lookupParent(vbuff)
|
||||
win = workspaces.lookupParent(vws)
|
||||
|
||||
return win, vws, vbuff
|
||||
|
||||
class CodempBrowseWorkspaceCommand(sublime_plugin.WindowCommand):
|
||||
def is_enabled(self) -> bool:
|
||||
return session.is_active()
|
||||
|
||||
def run(self, workspace_id):
|
||||
wks = workspaces.lookupId(workspace_id)
|
||||
buffers = wks.handle.fetch_buffers()
|
||||
QPWorkspaceBrowser(self.window, workspace_id, buffers.wait()).run()
|
||||
|
||||
|
||||
class CodempBrowseServerCommand(sublime_plugin.WindowCommand):
|
||||
def is_enabled(self) -> bool:
|
||||
return session.is_active()
|
||||
|
||||
def run(self):
|
||||
wks = session.get_workspaces()
|
||||
QPServerBrowser(self.window, session.host, wks).run()
|
||||
|
||||
|
||||
class CodempReplaceTextCommand(sublime_plugin.TextCommand):
|
||||
def run(self, edit, start, end, content, change_id):
|
||||
|
|
24
plugin/quickpanel/qp_globals.py
Normal file
24
plugin/quickpanel/qp_globals.py
Normal file
|
@ -0,0 +1,24 @@
|
|||
import sublime
|
||||
|
||||
QP_COLOR_NONE = sublime.KIND_ID_AMBIGUOUS
|
||||
QP_COLOR_REDISH = sublime.KIND_ID_COLOR_REDISH
|
||||
QP_COLOR_ORANGISH = sublime.KIND_ID_COLOR_ORANGISH
|
||||
QP_COLOR_YELLOWISH = sublime.KIND_ID_COLOR_YELLOWISH
|
||||
QP_COLOR_GREENISH = sublime.KIND_ID_COLOR_GREENISH
|
||||
QP_COLOR_CYANISH = sublime.KIND_ID_COLOR_CYANISH
|
||||
QP_COLOR_BLUISH = sublime.KIND_ID_COLOR_BLUISH
|
||||
QP_COLOR_PURPLISH = sublime.KIND_ID_COLOR_PURPLISH
|
||||
QP_COLOR_PINKISH = sublime.KIND_ID_COLOR_PINKISH
|
||||
QP_COLOR_DARK = sublime.KIND_ID_COLOR_DARK
|
||||
QP_COLOR_LIGHT = sublime.KIND_ID_COLOR_LIGHT
|
||||
|
||||
QP_YES = "✓"
|
||||
QP_NO = "✗"
|
||||
QP_ADD = "+"
|
||||
QP_FORWARD = "❯"
|
||||
QP_BACK = "❮"
|
||||
QP_DETAILS = "⋯"
|
||||
QP_RENAME = "*"
|
||||
QP_CHMOD = "7"
|
||||
QP_DOWNLOAD = "⏬"
|
||||
QP_EDIT = "a"
|
224
plugin/quickpanel/qpbrowser.py
Normal file
224
plugin/quickpanel/qpbrowser.py
Normal file
|
@ -0,0 +1,224 @@
|
|||
import sublime
|
||||
import logging
|
||||
|
||||
from . import qp_globals as qpg
|
||||
|
||||
from ..core.workspace import workspaces
|
||||
from ..core.buffers import buffers
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
def qpi(text, details="", color=qpg.QP_COLOR_NONE, letter="", name="", hint="", prefix=""):
|
||||
return sublime.QuickPanelItem(text, details, annotation=hint, kind=(color, letter, name))
|
||||
|
||||
def show_qp(window, choices, on_done, placeholder=''):
|
||||
def _():
|
||||
flags = sublime.KEEP_OPEN_ON_FOCUS_LOST
|
||||
window.show_quick_panel(choices, on_done, flags, placeholder=placeholder)
|
||||
sublime.set_timeout(_, 10)
|
||||
|
||||
|
||||
class QPServerBrowser():
|
||||
def __init__(self, window, host, raw_input_items):
|
||||
self.window = window
|
||||
self.host = host
|
||||
self.raw_input_items = raw_input_items
|
||||
|
||||
def make_entry(self, wsid):
|
||||
return qpi(wsid, letter="w", color=qpg.QP_COLOR_BLUISH, hint="Workspace", prefix=" ")
|
||||
|
||||
def qp_placeholder(self):
|
||||
return f"Browsing workspaces on host: {self.host}"
|
||||
|
||||
def run(self):
|
||||
self.current_wid_selection = None
|
||||
self.entries = []
|
||||
for item in self.raw_input_items:
|
||||
self.entries.append(self.make_entry(item))
|
||||
|
||||
self.entries.insert(0, qpi("Server Actions",
|
||||
color=qpg.QP_COLOR_CYANISH,
|
||||
letter=qpg.QP_DETAILS,
|
||||
hint="Submenu",
|
||||
prefix=" • "))
|
||||
|
||||
show_qp(self.window, self.entries, self.server_actions, self.qp_placeholder())
|
||||
|
||||
def server_actions(self, index):
|
||||
if index == -1:
|
||||
return
|
||||
elif index == 0:
|
||||
self.edit_server()
|
||||
return
|
||||
|
||||
wid = self.entries[index].trigger
|
||||
self.current_wid_selection = wid
|
||||
# self.select_workspace()
|
||||
def _():
|
||||
self.window.run_command(
|
||||
"codemp_join_workspace",
|
||||
{
|
||||
"workspace_id": self.current_wid_selection,
|
||||
"sync": True
|
||||
})
|
||||
|
||||
ws = workspaces.lookupId(wid)
|
||||
buffers = ws.handle.fetch_buffers()
|
||||
QPWorkspaceBrowser(self.window, wid, buffers.wait()).run()
|
||||
sublime.set_timeout(_)
|
||||
logger.debug("exiting the server_broswer.")
|
||||
|
||||
def select_workspace(self):
|
||||
assert self.current_wid_selection
|
||||
actions = [
|
||||
qpi("Join", details=self.current_wid_selection, color=qpg.QP_COLOR_BLUISH, letter=qpg.QP_FORWARD),
|
||||
# qpi("Join and open all",
|
||||
# details="opens all buffer in the workspace",
|
||||
# color=qpg.QP_COLOR_PINKISH, letter=qpg.QP_DETAILS),
|
||||
qpi("Back", color=qpg.QP_COLOR_BLUISH, letter=qpg.QP_BACK)
|
||||
]
|
||||
show_qp(self.window, actions, self.select_workspace_actions, self.qp_placeholder())
|
||||
|
||||
def select_workspace_actions(self, index):
|
||||
if index == -1:
|
||||
return
|
||||
elif index == 0:
|
||||
self.window.run_command(
|
||||
"codemp_join_workspace",
|
||||
{"workspace_id": self.current_wid_selection})
|
||||
elif index == 1:
|
||||
self.run()
|
||||
|
||||
|
||||
def edit_server(self):
|
||||
actions = [
|
||||
qpi("Back", color=qpg.QP_COLOR_CYANISH, letter=qpg.QP_BACK),
|
||||
qpi("New Workspace", color=qpg.QP_COLOR_GREENISH, letter=qpg.QP_ADD),
|
||||
qpi("Delete Workspace", color=qpg.QP_COLOR_REDISH, letter=qpg.QP_NO)
|
||||
]
|
||||
show_qp(self.window, actions, self.edit_server_actions, self.qp_placeholder())
|
||||
|
||||
def edit_server_actions(self, index):
|
||||
if index == -1:
|
||||
return
|
||||
|
||||
if index == 0:
|
||||
self.run()
|
||||
|
||||
if index == 1:
|
||||
def create_workspace(name):
|
||||
self.window.run_command(
|
||||
"codemp_create_workspace",
|
||||
{"workspace_id": name})
|
||||
self.window.show_input_panel("New Workspace Name", "", create_workspace, None, self.edit_server)
|
||||
|
||||
if index == 2:
|
||||
def delete_workspace(index):
|
||||
if index == -1 or index == 0:
|
||||
self.edit_server()
|
||||
# we must be careful here. here with index 1 we are selecting the correct
|
||||
# workspace, because the index zero in the entries is the workspace action submenu.
|
||||
# which is occupied by the back action.
|
||||
# if we add extra non workspace entries, then we must shift the index accordingly.
|
||||
# Do this differently?
|
||||
selected = self.entries[index]
|
||||
self.window.run_command(
|
||||
"codemp_delete_workspace",
|
||||
{"workspace_id": selected.trigger})
|
||||
|
||||
|
||||
show_qp(self.window, self.entries, delete_workspace, self.qp_placeholder())
|
||||
|
||||
|
||||
class QPWorkspaceBrowser():
|
||||
def __init__(self, window, workspace_id, raw_input_items):
|
||||
self.window = window
|
||||
self.workspace_id = workspace_id
|
||||
self.raw_input_items = raw_input_items
|
||||
|
||||
def qp_placeholder(self):
|
||||
return f"Browsing buffers in {self.workspace_id}"
|
||||
|
||||
def make_entry(self, item):
|
||||
return qpi(item, letter="b", color=qpg.QP_COLOR_BLUISH, hint="Buffer", prefix=" ")
|
||||
|
||||
def run(self):
|
||||
self.entries = []
|
||||
for buffer in self.raw_input_items:
|
||||
self.entries.append(self.make_entry(buffer))
|
||||
|
||||
self.entries.insert(0, qpi("Workspace Actions",
|
||||
color=qpg.QP_COLOR_CYANISH,
|
||||
letter=qpg.QP_DETAILS,
|
||||
hint="Submenu",
|
||||
prefix=" • "))
|
||||
|
||||
show_qp(self.window, self.entries, self.workspace_actions, self.qp_placeholder())
|
||||
|
||||
def workspace_actions(self, index):
|
||||
if index == -1:
|
||||
return
|
||||
elif index == 0:
|
||||
self.edit_workspace()
|
||||
return
|
||||
|
||||
bid = self.entries[index].trigger
|
||||
|
||||
self.window.run_command(
|
||||
"codemp_join_buffer",
|
||||
{
|
||||
"workspace_id": self.workspace_id,
|
||||
"buffer_id": bid
|
||||
})
|
||||
|
||||
|
||||
def edit_workspace(self):
|
||||
actions = [
|
||||
qpi("Back", color=qpg.QP_COLOR_CYANISH, letter=qpg.QP_BACK),
|
||||
qpi("Leave Workspace", color=qpg.QP_COLOR_ORANGISH, letter=qpg.QP_BACK),
|
||||
qpi("Invite User", color=qpg.QP_COLOR_PINKISH, letter=qpg.QP_FORWARD),
|
||||
qpi("Create Buffer", color=qpg.QP_COLOR_GREENISH, letter=qpg.QP_ADD),
|
||||
qpi("Delete Buffer", color=qpg.QP_COLOR_REDISH, letter=qpg.QP_NO),
|
||||
qpi("Rename Buffer", color=qpg.QP_COLOR_ORANGISH, letter=qpg.QP_RENAME),
|
||||
]
|
||||
show_qp(self.window, actions, self.edit_workspace_actions, self.qp_placeholder())
|
||||
|
||||
def edit_workspace_actions(self, index):
|
||||
if index == -1 or index == 0:
|
||||
self.edit_workspace()
|
||||
elif index == 1:
|
||||
self.window.run_command(
|
||||
"codemp_leave_workspace",
|
||||
{"workspace_id": self.workspace_id})
|
||||
self.window.run_command(
|
||||
"codemp_browse_server", {})
|
||||
elif index == 2:
|
||||
self.window.run_command(
|
||||
"codemp_invite_to_workspace",
|
||||
{"workspace_id": self.workspace_id})
|
||||
elif index == 3:
|
||||
def create_buffer(name):
|
||||
self.window.run_command(
|
||||
"codemp_create_workspace",
|
||||
{
|
||||
"workspace_id": self.workspace_id,
|
||||
"buffer_id": name
|
||||
})
|
||||
self.window.show_input_panel("New Workspace Name", "", create_buffer, None, self.edit_workspace)
|
||||
elif index == 4:
|
||||
def delete_buffer(index):
|
||||
if index == -1 or index == 0:
|
||||
self.edit_workspace()
|
||||
|
||||
# same warning as the server browser. Check your indexed 3 times
|
||||
selected = self.entries[index]
|
||||
self.window.run_command(
|
||||
"codemp_delete_buffer",
|
||||
{
|
||||
"workspace_id": self.workspace_id,
|
||||
"buffer_id": selected.trigger
|
||||
})
|
||||
show_qp(self.window, self.entries, delete_buffer, self.qp_placeholder())
|
||||
elif index == 5:
|
||||
sublime.message_dialog("renaming is not yet implemented.")
|
||||
self.edit_workspace()
|
Loading…
Reference in a new issue