codemp-sublime/plugin/quickpanel/qpbrowser.py

229 lines
8.3 KiB
Python
Raw Normal View History

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='', keepopen=True):
def _():
flags = sublime.KEEP_OPEN_ON_FOCUS_LOST if keepopen else 0
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 _():
2025-01-18 20:13:49 +01:00
if not wid in workspaces:
try: self.window.run_command(
"codemp_join_workspace", {"workspace_id": wid})
except Exception as e:
return
ws = workspaces.lookupId(wid)
buffers = ws.handle.fetch_buffers()
2025-01-18 20:13:49 +01:00
QPWorkspaceBrowser(self.window, wid, buffers.wait()).run()
sublime.set_timeout(_)
logger.debug("exiting the server_broswer.")
def edit_server(self):
actions = [
qpi("Back", color=qpg.QP_COLOR_CYANISH, letter=qpg.QP_BACK),
qpi("Disconnect", color=qpg.QP_COLOR_REDISH, 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:
self.window.run_command("codemp_disconnect", {})
if index == 2:
def create_workspace(name):
self.window.run_command(
"codemp_create_workspace", {"workspace_id": name})
self.window.run_command(
"codemp_browse_server", {})
self.window.show_input_panel("New Workspace Name", "", create_workspace, None, self.edit_server)
if index == 3:
def delete_workspace(index):
if index == -1 or index == 0:
self.edit_server()
return
selected = self.entries[index]
self.window.run_command(
"codemp_delete_workspace",
{"workspace_id": selected.trigger})
self.window.run_command(
"codemp_browse_server", {})
if len(self.entries) < 2:
sublime.message_dialog("You don't have workspaces to delete!")
sublime.set_timeout(self.run, 10)
else:
selentries = self.entries
selentries[0] = qpi("Back", color=qpg.QP_COLOR_CYANISH, letter=qpg.QP_BACK)
show_qp(self.window, selentries, delete_workspace, self.qp_placeholder(), keepopen=False)
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.run()
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_buffer",
{
"workspace_id": self.workspace_id,
"buffer_id": name
})
self.window.run_command(
"codemp_browse_workspace", {"workspace_id": self.workspace_id})
panel = self.window.show_input_panel("New Buffer Name", "", create_buffer, None, self.edit_workspace)
panel.settings().set("password", False)
elif index == 4:
def delete_buffer(index):
if index == -1 or index == 0:
self.edit_workspace()
return
# 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
})
self.window.run_command(
"codemp_browse_workspace", {"workspace_id": self.workspace_id})
if len(self.entries) < 2:
sublime.message_dialog("The workspace is empty!")
sublime.set_timeout(self.run, 10)
else:
selentries = self.entries
selentries[0] = qpi("Back", color=qpg.QP_COLOR_CYANISH, letter=qpg.QP_BACK)
show_qp(self.window, selentries, delete_buffer, self.qp_placeholder(), keepopen=False)
elif index == 5:
sublime.message_dialog("renaming is not yet implemented.")
self.edit_workspace()
logger.debug("Exiting the workspace browser")