feat(WIP): added quick panel browsing for server and workspace!

This commit is contained in:
cschen 2024-11-03 17:57:31 +01:00
parent c222aec013
commit 93f3e38c75
4 changed files with 313 additions and 11 deletions

View file

@ -19,24 +19,38 @@
"file": "${packages}/CodempClient/README.md" "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 // # on_window_command, does not trigger when called from the command palette
// # See: https://github.com/sublimehq/sublime_text/issues/2234 // # See: https://github.com/sublimehq/sublime_text/issues/2234
"caption": "Codemp: Connect", "caption": "Codemp: Connect",
"command": "codemp_connect", "command": "codemp_connect",
"args": { "args": {
"server_host": "http://code.mp:50053", "server_host": "code.mp",
"user_name" : "cschen@codemp.dev",
"password" : "***REMOVED***"
} }
}, },
{ {
"caption": "Codemp: Disconnect Client", "caption": "Codemp: Disconnect Client",
"command": "codemp_disconnect", "command": "codemp_disconnect",
"arg": {} "args": {}
}, },
{ {
"caption": "Codemp: Join Workspace", "caption": "Codemp: Join Workspace",
"command": "codemp_join_workspace", "command": "codemp_join_workspace",
"arg": { "args": {
// 'workspace_id': 'asd' // 'workspace_id': 'asd'
// 'buffer_id': 'test' // 'buffer_id': 'test'
}, },
@ -44,14 +58,14 @@
{ {
"caption": "Codemp: Leave Workspace", "caption": "Codemp: Leave Workspace",
"command": "codemp_leave_workspace", "command": "codemp_leave_workspace",
"arg": { "args": {
// "id": 'lmaaaao' // "id": 'lmaaaao'
} }
}, },
{ {
"caption": "Codemp: Invite To Workspace", "caption": "Codemp: Invite To Workspace",
"command": "codemp_invite_to_workspace", "command": "codemp_invite_to_workspace",
"arg": { "args": {
// "id": 'lmaaaao' // "id": 'lmaaaao'
// "user": 'lupo' // "user": 'lupo'
} }
@ -59,21 +73,21 @@
{ {
"caption": "Codemp: Create Workspace", "caption": "Codemp: Create Workspace",
"command": "codemp_create_workspace", "command": "codemp_create_workspace",
"arg": { "args": {
// "id": 'lmaaaao' // "id": 'lmaaaao'
} }
}, },
{ {
"caption": "Codemp: Delete Workspace", "caption": "Codemp: Delete Workspace",
"command": "codemp_delete_workspace", "command": "codemp_delete_workspace",
"arg": { "args": {
// "id": 'lmaaaao' // "id": 'lmaaaao'
} }
}, },
{ {
"caption": "Codemp: Join Buffer", "caption": "Codemp: Join Buffer",
"command": "codemp_join_buffer", "command": "codemp_join_buffer",
"arg": { "args": {
// 'workspace_id': 'asd' // 'workspace_id': 'asd'
// 'buffer_id': 'test' // 'buffer_id': 'test'
}, },
@ -81,7 +95,7 @@
{ {
"caption": "Codemp: Leave Buffer", "caption": "Codemp: Leave Buffer",
"command": "codemp_leave_buffer", "command": "codemp_leave_buffer",
"arg": { "args": {
// 'workspace_id': 'asd' // 'workspace_id': 'asd'
// 'buffer_id': 'test' // 'buffer_id': 'test'
} }
@ -89,7 +103,7 @@
{ {
"caption": "Codemp: Create Buffer", "caption": "Codemp: Create Buffer",
"command": "codemp_create_buffer", "command": "codemp_create_buffer",
"arg": { "args": {
// 'workspace_id': 'asd' // 'workspace_id': 'asd'
// 'buffer_id': 'test' // 'buffer_id': 'test'
} }
@ -97,7 +111,7 @@
{ {
"caption": "Codemp: Delete Buffer", "caption": "Codemp: Delete Buffer",
"command": "codemp_delete_buffer", "command": "codemp_delete_buffer",
"arg": { "args": {
// 'workspace_id': 'asd' // 'workspace_id': 'asd'
// 'buffer_id': 'test' // 'buffer_id': 'test'
} }

40
main.py
View file

@ -5,10 +5,14 @@ import logging
import codemp import codemp
from .plugin.utils import safe_listener_detach from .plugin.utils import safe_listener_detach
from .plugin.utils import safe_listener_attach
from .plugin.core.session import session from .plugin.core.session import session
from .plugin.core.workspace import workspaces from .plugin.core.workspace import workspaces
from .plugin.core.buffers import buffers 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 CodempConnectCommand
from .plugin.commands.client import CodempDisconnectCommand from .plugin.commands.client import CodempDisconnectCommand
from .plugin.commands.client import CodempCreateWorkspaceCommand 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 CodempJoinBufferCommand
from .plugin.commands.workspace import CodempLeaveBufferCommand from .plugin.commands.workspace import CodempLeaveBufferCommand
from .plugin.quickpanel.qpbrowser import QPServerBrowser
from .plugin.quickpanel.qpbrowser import QPWorkspaceBrowser
LOG_LEVEL = logging.DEBUG LOG_LEVEL = logging.DEBUG
handler = logging.StreamHandler() handler = logging.StreamHandler()
handler.setFormatter( handler.setFormatter(
@ -54,6 +62,38 @@ def kill_all():
session.stop() 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): class CodempReplaceTextCommand(sublime_plugin.TextCommand):
def run(self, edit, start, end, content, change_id): def run(self, edit, start, end, content, change_id):

View 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"

View 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()