Some minor fixes for the native client
This commit is contained in:
parent
4dc176cc1f
commit
5b83bd9b51
8 changed files with 36 additions and 32 deletions
|
@ -660,6 +660,8 @@ export class ConnectionHandler {
|
||||||
this.startConnection(server_address.host + ":" + server_address.port, profile, false, Object.assign(this.reconnect_properties(profile), {auto_reconnect_attempt: true}));
|
this.startConnection(server_address.host + ":" + server_address.port, profile, false, Object.assign(this.reconnect_properties(profile), {auto_reconnect_attempt: true}));
|
||||||
}, 5000);
|
}, 5000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.serverConnection.updateConnectionState(ConnectionState.UNCONNECTED); /* Fix for the native client... */
|
||||||
}
|
}
|
||||||
|
|
||||||
cancel_reconnect(log_event: boolean) {
|
cancel_reconnect(log_event: boolean) {
|
||||||
|
|
|
@ -536,7 +536,7 @@ export class ChannelEntry extends ChannelTreeEntry<ChannelEvents> {
|
||||||
invalidPermission: !channelCreate,
|
invalidPermission: !channelCreate,
|
||||||
callback: () => this.channelTree.spawnCreateChannel()
|
callback: () => this.channelTree.spawnCreateChannel()
|
||||||
},
|
},
|
||||||
contextmenu.Entry.CLOSE(() => trigger_close ? on_close() : {})
|
contextmenu.Entry.CLOSE(() => trigger_close && on_close ? on_close() : {})
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -244,9 +244,9 @@ export class ChannelEntryView extends TreeEntry<ChannelEntryViewProperties, {}>
|
||||||
const collapsed_indicator = this.props.channel.child_channel_head || this.props.channel.clients(false).length > 0;
|
const collapsed_indicator = this.props.channel.child_channel_head || this.props.channel.clients(false).length > 0;
|
||||||
return <div className={this.classList(viewStyle.treeEntry, channelStyle.channelEntry, this.props.channel.isSelected() && viewStyle.selected)}
|
return <div className={this.classList(viewStyle.treeEntry, channelStyle.channelEntry, this.props.channel.isSelected() && viewStyle.selected)}
|
||||||
style={{ paddingLeft: this.props.depth * 16 + 2, top: this.props.offset }}
|
style={{ paddingLeft: this.props.depth * 16 + 2, top: this.props.offset }}
|
||||||
onMouseUp={e => this.onMouseUp(e as any)}
|
onMouseUp={e => this.onMouseUp(e)}
|
||||||
onDoubleClick={() => this.onDoubleClick()}
|
onDoubleClick={() => this.onDoubleClick()}
|
||||||
onContextMenu={e => this.onContextMenu(e as any)}
|
onContextMenu={e => this.onContextMenu(e)}
|
||||||
>
|
>
|
||||||
<UnreadMarker entry={this.props.channel} />
|
<UnreadMarker entry={this.props.channel} />
|
||||||
{collapsed_indicator && <ChannelCollapsedIndicator key={"collapsed-indicator"} onToggle={() => this.onCollapsedToggle()} collapsed={this.props.channel.collapsed} />}
|
{collapsed_indicator && <ChannelCollapsedIndicator key={"collapsed-indicator"} onToggle={() => this.onCollapsedToggle()} collapsed={this.props.channel.collapsed} />}
|
||||||
|
@ -260,7 +260,7 @@ export class ChannelEntryView extends TreeEntry<ChannelEntryViewProperties, {}>
|
||||||
this.props.channel.collapsed = !this.props.channel.collapsed;
|
this.props.channel.collapsed = !this.props.channel.collapsed;
|
||||||
}
|
}
|
||||||
|
|
||||||
private onMouseUp(event: MouseEvent) {
|
private onMouseUp(event: React.MouseEvent) {
|
||||||
if(event.button !== 0) return; /* only left mouse clicks */
|
if(event.button !== 0) return; /* only left mouse clicks */
|
||||||
|
|
||||||
const channel = this.props.channel;
|
const channel = this.props.channel;
|
||||||
|
@ -279,7 +279,7 @@ export class ChannelEntryView extends TreeEntry<ChannelEntryViewProperties, {}>
|
||||||
channel.joinChannel();
|
channel.joinChannel();
|
||||||
}
|
}
|
||||||
|
|
||||||
private onContextMenu(event: MouseEvent) {
|
private onContextMenu(event: React.MouseEvent) {
|
||||||
if(settings.static(Settings.KEY_DISABLE_CONTEXT_MENU))
|
if(settings.static(Settings.KEY_DISABLE_CONTEXT_MENU))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
|
@ -322,7 +322,7 @@ class ClientNameEdit extends ReactComponentBase<ClientNameEditProps, {}> {
|
||||||
ref={this.ref_div}
|
ref={this.ref_div}
|
||||||
dangerouslySetInnerHTML={{__html: DOMPurify.sanitize(this.props.initialName)}}
|
dangerouslySetInnerHTML={{__html: DOMPurify.sanitize(this.props.initialName)}}
|
||||||
onBlur={e => this.onBlur()}
|
onBlur={e => this.onBlur()}
|
||||||
onKeyPress={e => this.onKeyPress(e as any)}
|
onKeyPress={e => this.onKeyPress(e)}
|
||||||
/>
|
/>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -330,7 +330,7 @@ class ClientNameEdit extends ReactComponentBase<ClientNameEditProps, {}> {
|
||||||
this.props.editFinished(this.ref_div.current.textContent);
|
this.props.editFinished(this.ref_div.current.textContent);
|
||||||
}
|
}
|
||||||
|
|
||||||
private onKeyPress(event: KeyboardEvent) {
|
private onKeyPress(event: React.KeyboardEvent) {
|
||||||
if(event.key === "Enter") {
|
if(event.key === "Enter") {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
this.onBlur();
|
this.onBlur();
|
||||||
|
@ -364,8 +364,8 @@ export class ClientEntry extends TreeEntry<ClientEntryProperties, ClientEntrySta
|
||||||
<div className={this.classList(clientStyle.clientEntry, viewStyle.treeEntry, this.props.client.isSelected() && viewStyle.selected)}
|
<div className={this.classList(clientStyle.clientEntry, viewStyle.treeEntry, this.props.client.isSelected() && viewStyle.selected)}
|
||||||
style={{ paddingLeft: (this.props.depth * 16 + 2) + "px", top: this.props.offset }}
|
style={{ paddingLeft: (this.props.depth * 16 + 2) + "px", top: this.props.offset }}
|
||||||
onDoubleClick={() => this.onDoubleClick()}
|
onDoubleClick={() => this.onDoubleClick()}
|
||||||
onMouseUp={e => this.onMouseUp(e as any)}
|
onMouseUp={e => this.onMouseUp(e)}
|
||||||
onContextMenu={e => this.onContextMenu(e as any)}
|
onContextMenu={e => this.onContextMenu(e)}
|
||||||
>
|
>
|
||||||
<UnreadMarker entry={this.props.client} />
|
<UnreadMarker entry={this.props.client} />
|
||||||
<ClientSpeakIcon client={this.props.client} />
|
<ClientSpeakIcon client={this.props.client} />
|
||||||
|
@ -403,7 +403,7 @@ export class ClientEntry extends TreeEntry<ClientEntryProperties, ClientEntrySta
|
||||||
this.setState({ rename: false });
|
this.setState({ rename: false });
|
||||||
}
|
}
|
||||||
|
|
||||||
private onMouseUp(event: MouseEvent) {
|
private onMouseUp(event: React.MouseEvent) {
|
||||||
if(event.button !== 0) return; /* only left mouse clicks */
|
if(event.button !== 0) return; /* only left mouse clicks */
|
||||||
const tree = this.props.client.channelTree;
|
const tree = this.props.client.channelTree;
|
||||||
if(tree.isClientMoveActive()) return;
|
if(tree.isClientMoveActive()) return;
|
||||||
|
@ -411,7 +411,7 @@ export class ClientEntry extends TreeEntry<ClientEntryProperties, ClientEntrySta
|
||||||
tree.events.fire("action_select_entries", { entries: [this.props.client], mode: "auto" });
|
tree.events.fire("action_select_entries", { entries: [this.props.client], mode: "auto" });
|
||||||
}
|
}
|
||||||
|
|
||||||
private onContextMenu(event: MouseEvent) {
|
private onContextMenu(event: React.MouseEvent) {
|
||||||
if(settings.static(Settings.KEY_DISABLE_CONTEXT_MENU))
|
if(settings.static(Settings.KEY_DISABLE_CONTEXT_MENU))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
|
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
padding-left: 2px;
|
padding-left: 2px;
|
||||||
margin-right: 5px;
|
padding-right: 5px;
|
||||||
|
|
||||||
.server_type {
|
.server_type {
|
||||||
flex-grow: 0;
|
flex-grow: 0;
|
||||||
|
|
|
@ -77,8 +77,8 @@ export class ServerEntry extends TreeEntry<ServerEntryProperties, ServerEntrySta
|
||||||
|
|
||||||
return <div className={this.classList(serverStyle.serverEntry, viewStyle.treeEntry, this.props.server.isSelected() && viewStyle.selected )}
|
return <div className={this.classList(serverStyle.serverEntry, viewStyle.treeEntry, this.props.server.isSelected() && viewStyle.selected )}
|
||||||
style={{ top: this.props.offset }}
|
style={{ top: this.props.offset }}
|
||||||
onMouseUp={e => this.onMouseUp(e as any)}
|
onMouseUp={e => this.onMouseUp(e)}
|
||||||
onContextMenu={e => this.onContextMenu(e as any)}
|
onContextMenu={e => this.onContextMenu(e)}
|
||||||
>
|
>
|
||||||
<UnreadMarker entry={this.props.server} />
|
<UnreadMarker entry={this.props.server} />
|
||||||
<div className={"icon client-server_green " + serverStyle.server_type} />
|
<div className={"icon client-server_green " + serverStyle.server_type} />
|
||||||
|
@ -87,7 +87,7 @@ export class ServerEntry extends TreeEntry<ServerEntryProperties, ServerEntrySta
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
|
||||||
private onMouseUp(event: MouseEvent) {
|
private onMouseUp(event: React.MouseEvent) {
|
||||||
if(event.button !== 0) return; /* only left mouse clicks */
|
if(event.button !== 0) return; /* only left mouse clicks */
|
||||||
if(this.props.server.channelTree.isClientMoveActive()) return;
|
if(this.props.server.channelTree.isClientMoveActive()) return;
|
||||||
|
|
||||||
|
@ -97,7 +97,7 @@ export class ServerEntry extends TreeEntry<ServerEntryProperties, ServerEntrySta
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private onContextMenu(event: MouseEvent) {
|
private onContextMenu(event: React.MouseEvent) {
|
||||||
if(settings.static(Settings.KEY_DISABLE_CONTEXT_MENU))
|
if(settings.static(Settings.KEY_DISABLE_CONTEXT_MENU))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
|
@ -165,7 +165,12 @@ export class ChannelTreeView extends ReactComponentBase<ChannelTreeViewPropertie
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={viewStyle.channelTreeContainer} onScroll={() => this.onScroll()} ref={this.ref_container} onMouseDown={e => this.onMouseDown(e as any)} onMouseMove={e => this.onMouseMove(e as any)} >
|
<div
|
||||||
|
className={viewStyle.channelTreeContainer}
|
||||||
|
onScroll={() => this.onScroll()}
|
||||||
|
ref={this.ref_container}
|
||||||
|
onMouseDown={e => this.onMouseDown(e)}
|
||||||
|
onMouseMove={e => this.onMouseMove(e)} >
|
||||||
<div className={this.classList(viewStyle.channelTree, this.props.tree.isClientMoveActive() && viewStyle.move)} style={{height: (this.flat_tree.length * ChannelTreeView.EntryHeight) + "px"}}>
|
<div className={this.classList(viewStyle.channelTree, this.props.tree.isClientMoveActive() && viewStyle.move)} style={{height: (this.flat_tree.length * ChannelTreeView.EntryHeight) + "px"}}>
|
||||||
{elements}
|
{elements}
|
||||||
</div>
|
</div>
|
||||||
|
@ -181,7 +186,7 @@ export class ChannelTreeView extends ReactComponentBase<ChannelTreeViewPropertie
|
||||||
|
|
||||||
this.flat_tree.push({
|
this.flat_tree.push({
|
||||||
entry: entry,
|
entry: entry,
|
||||||
rendered: <ChannelEntryView key={"channel-" + entry.channelId} channel={entry} offset={this.build_top_offset += ChannelTreeView.EntryHeight} depth={depth} ref={entry.view} />
|
rendered: <ChannelEntryView key={this.state.tree_version + "-channel-" + entry.channelId} channel={entry} offset={this.build_top_offset += ChannelTreeView.EntryHeight} depth={depth} ref={entry.view} />
|
||||||
});
|
});
|
||||||
|
|
||||||
if(entry.collapsed) return;
|
if(entry.collapsed) return;
|
||||||
|
@ -191,7 +196,7 @@ export class ChannelTreeView extends ReactComponentBase<ChannelTreeViewPropertie
|
||||||
this.flat_tree.push(...clients.map(e => {
|
this.flat_tree.push(...clients.map(e => {
|
||||||
return {
|
return {
|
||||||
entry: e,
|
entry: e,
|
||||||
rendered: <ClientEntryView key={"client-" + e.clientId()} client={e} offset={this.build_top_offset += ChannelTreeView.EntryHeight} depth={depth + 1} ref={e.view} />
|
rendered: <ClientEntryView key={this.state.tree_version + "-client-" + e.clientId()} client={e} offset={this.build_top_offset += ChannelTreeView.EntryHeight} depth={depth + 1} ref={e.view} />
|
||||||
};
|
};
|
||||||
}));
|
}));
|
||||||
for (const channel of entry.children(false))
|
for (const channel of entry.children(false))
|
||||||
|
@ -214,7 +219,7 @@ export class ChannelTreeView extends ReactComponentBase<ChannelTreeViewPropertie
|
||||||
this.build_top_offset = -ChannelTreeView.EntryHeight; /* because of the += */
|
this.build_top_offset = -ChannelTreeView.EntryHeight; /* because of the += */
|
||||||
this.flat_tree = [{
|
this.flat_tree = [{
|
||||||
entry: tree.server,
|
entry: tree.server,
|
||||||
rendered: <ServerEntryView key={"server"} server={tree.server} offset={this.build_top_offset += ChannelTreeView.EntryHeight} ref={tree.server.view} />
|
rendered: <ServerEntryView key={this.state.tree_version + "-server"} server={tree.server} offset={this.build_top_offset += ChannelTreeView.EntryHeight} ref={tree.server.view} />
|
||||||
}];
|
}];
|
||||||
|
|
||||||
for (const channel of tree.rootChannel())
|
for (const channel of tree.rootChannel())
|
||||||
|
@ -255,7 +260,7 @@ export class ChannelTreeView extends ReactComponentBase<ChannelTreeViewPropertie
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private onMouseDown(e: MouseEvent) {
|
private onMouseDown(e: React.MouseEvent) {
|
||||||
if(e.button !== 0) return; /* left button only */
|
if(e.button !== 0) return; /* left button only */
|
||||||
|
|
||||||
this.mouse_move.down = true;
|
this.mouse_move.down = true;
|
||||||
|
@ -264,7 +269,7 @@ export class ChannelTreeView extends ReactComponentBase<ChannelTreeViewPropertie
|
||||||
this.registerDocumentMouseListener();
|
this.registerDocumentMouseListener();
|
||||||
}
|
}
|
||||||
|
|
||||||
private onMouseMove(e: MouseEvent) {
|
private onMouseMove(e: React.MouseEvent) {
|
||||||
if(!this.mouse_move.down || this.mouse_move.fired) return;
|
if(!this.mouse_move.down || this.mouse_move.fired) return;
|
||||||
if(Math.abs((this.mouse_move.x - e.pageX) * (this.mouse_move.y - e.pageY)) > (this.props.moveThreshold || 9)) {
|
if(Math.abs((this.mouse_move.x - e.pageX) * (this.mouse_move.y - e.pageY)) > (this.props.moveThreshold || 9)) {
|
||||||
this.mouse_move.fired = true;
|
this.mouse_move.fired = true;
|
||||||
|
@ -321,6 +326,6 @@ export class ChannelTreeView extends ReactComponentBase<ChannelTreeViewPropertie
|
||||||
return undefined;
|
return undefined;
|
||||||
|
|
||||||
const total_offset = container.scrollTop + pageY;
|
const total_offset = container.scrollTop + pageY;
|
||||||
return this.flat_tree[Math.floor(total_offset / ChannelTreeView.EntryHeight)].entry;
|
return this.flat_tree[Math.floor(total_offset / ChannelTreeView.EntryHeight)]?.entry;
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -225,16 +225,13 @@ export class ChannelTree {
|
||||||
|
|
||||||
if(!settings.static(Settings.KEY_DISABLE_CONTEXT_MENU, false)) {
|
if(!settings.static(Settings.KEY_DISABLE_CONTEXT_MENU, false)) {
|
||||||
this._tag_container.on("contextmenu", (event) => {
|
this._tag_container.on("contextmenu", (event) => {
|
||||||
if(event.isDefaultPrevented()) return;
|
|
||||||
|
|
||||||
for(const element of document.elementsFromPoint(event.pageX, event.pageY))
|
|
||||||
if(element.classList.contains("channelLine") || element.classList.contains("client"))
|
|
||||||
return;
|
|
||||||
|
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
if(this.selection.is_multi_select())
|
|
||||||
this.open_multiselect_context_menu(this.selection.selected_entries, event.pageX, event.pageY);
|
const entry = this.view.current?.getEntryFromPoint(event.pageX, event.pageY);
|
||||||
else {
|
if(entry) {
|
||||||
|
if(this.selection.is_multi_select())
|
||||||
|
this.open_multiselect_context_menu(this.selection.selected_entries, event.pageX, event.pageY);
|
||||||
|
} else {
|
||||||
this.selection.clear_selection();
|
this.selection.clear_selection();
|
||||||
this.showContextMenu(event.pageX, event.pageY);
|
this.showContextMenu(event.pageX, event.pageY);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue