Add Set Server/Channel Group context menus and dialog
Lets moderators assign or revoke server and channel groups for a client directly from its context menu, with per-group checkboxes gated by the client's actual TS3 permissions (i_group_needed_member_ add/remove_power vs. each group's n_member_addp/removep, including TS3's -1 "unlimited" sentinel). A "Server Groups Dialog..." entry shows every server group, graying out ones the client can't touch. Group membership changes now update ClientEntry locally instead of only logging them, so the checkboxes and dialog reflect a change immediately instead of needing a reconnect. The server's default channel group (e.g. "Guest") is hidden from the channel-group menu since it's not something you assign directly.
This commit is contained in:
@@ -2,6 +2,7 @@ package com.ts3client.ui;
|
||||
|
||||
import com.ts3client.net.ChannelNode;
|
||||
import com.ts3client.net.ClientEntry;
|
||||
import com.ts3client.net.Group;
|
||||
import com.ts3client.net.TeamspeakConnection;
|
||||
import com.ts3client.text.TsLink;
|
||||
|
||||
@@ -24,23 +25,32 @@ final class ServerTabTreeActions implements ServerTreePanel.Actions {
|
||||
private final TeamspeakConnection conn;
|
||||
private final ChatPanel chatPanel;
|
||||
private final InfoPanel infoPanel;
|
||||
private final GroupIcons groupIcons;
|
||||
private ServerTreePanel treePanel;
|
||||
|
||||
private Object currentSelection;
|
||||
/** The one open {@link ServerGroupsDialog}, if any, refreshed whenever the model changes. */
|
||||
private ServerGroupsDialog groupsDialog;
|
||||
|
||||
ServerTabTreeActions(MainFrame host, ServerTab tab, TeamspeakConnection conn,
|
||||
ChatPanel chatPanel, InfoPanel infoPanel) {
|
||||
ChatPanel chatPanel, InfoPanel infoPanel, GroupIcons groupIcons) {
|
||||
this.host = host;
|
||||
this.tab = tab;
|
||||
this.conn = conn;
|
||||
this.chatPanel = chatPanel;
|
||||
this.infoPanel = infoPanel;
|
||||
this.groupIcons = groupIcons;
|
||||
}
|
||||
|
||||
void attach(ServerTreePanel treePanel) {
|
||||
this.treePanel = treePanel;
|
||||
}
|
||||
|
||||
/** Called by {@link ServerTabConnectionEvents} whenever the model changes, to live-refresh an open dialog. */
|
||||
void refreshGroupsDialog() {
|
||||
if (groupsDialog != null) groupsDialog.refresh();
|
||||
}
|
||||
|
||||
/** Refreshes the info panel for whatever is currently selected (or clears it). */
|
||||
void renderInfo() {
|
||||
Object sel = currentSelection;
|
||||
@@ -74,7 +84,8 @@ final class ServerTabTreeActions implements ServerTreePanel.Actions {
|
||||
chatPanel.appendSystem("That client is no longer on the server.");
|
||||
return;
|
||||
}
|
||||
ClientMenu.build(client, client.id == conn.getSelfClientId(), this).show(source, x, y);
|
||||
ClientMenu.build(client, client.id == conn.getSelfClientId(), conn.getModel(), groupIcons, this)
|
||||
.show(source, x, y);
|
||||
}
|
||||
|
||||
void handleChannelLink(TsLink.Ref ref, Component source, int x, int y) {
|
||||
@@ -171,6 +182,24 @@ final class ServerTabTreeActions implements ServerTreePanel.Actions {
|
||||
if (self != null) conn.moveClient(client.id, self.channelId, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setClientServerGroup(ClientEntry client, Group group, boolean assign) {
|
||||
if (conn.isConnected()) conn.setClientServerGroup(client.databaseId, group.id, assign);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setClientChannelGroup(ClientEntry client, Group group) {
|
||||
if (conn.isConnected()) conn.setClientChannelGroup(client.databaseId, client.channelId, group.id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void showServerGroupsDialog(ClientEntry client) {
|
||||
if (!conn.isConnected()) return;
|
||||
groupsDialog = new ServerGroupsDialog(host, conn, groupIcons, client, this);
|
||||
groupsDialog.setVisible(true);
|
||||
groupsDialog = null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setChannelSubscribed(ChannelNode channel, boolean family, boolean subscribed) {
|
||||
if (conn.isConnected()) conn.setChannelsSubscribed(channel.familyIds(family), subscribed);
|
||||
|
||||
Reference in New Issue
Block a user