diff --git a/src/client/components/tab.vue b/src/client/components/tab.vue index 84b520966b..7278c74d9a 100644 --- a/src/client/components/tab.vue +++ b/src/client/components/tab.vue @@ -1,6 +1,6 @@ <template> <div class="pxhvhrfw" v-size="{ max: [500] }"> - <button v-for="item in items" class="_button" @click="$emit('update:value', item.value)" :class="{ active: value === item.value }" :key="item.value"><Fa v-if="item.icon" :icon="item.icon" class="icon"/>{{ item.label }}</button> + <button v-for="item in items" class="_button" @click="$emit('update:value', item.value)" :class="{ active: value === item.value }" :disabled="value === item.value" :key="item.value"><Fa v-if="item.icon" :icon="item.icon" class="icon"/>{{ item.label }}</button> </div> </template> @@ -29,11 +29,20 @@ export default defineComponent({ padding: 15px 12px 12px 12px; border-bottom: solid 3px transparent; + &:disabled { + opacity: 1 !important; + cursor: default; + } + &.active { color: var(--accent); border-bottom-color: var(--accent); } + &:not(.active):hover { + color: var(--fgHighlighted); + } + > .icon { margin-right: 6px; } diff --git a/src/client/components/taskmanager.vue b/src/client/components/taskmanager.vue index c7f91d082c..29b054d0fa 100644 --- a/src/client/components/taskmanager.vue +++ b/src/client/components/taskmanager.vue @@ -6,47 +6,55 @@ <div class="qljqmnzj"> <MkTab v-model:value="tab" :items="[{ label: 'Windows', value: 'windows', }, { label: 'Stream', value: 'stream', }, { label: 'Stream (Pool)', value: 'streamPool', }, { label: 'API', value: 'api', }]" style="border-bottom: solid 1px var(--divider);"/> - <div v-if="tab === 'windows'" class="windows"> - <div class="header"> - <div>#ID</div> - <div>Component</div> - <div>Action</div> + <div class="content"> + <div v-if="tab === 'windows'" class="windows"> + <div class="header"> + <div>#ID</div> + <div>Component</div> + <div>Action</div> + </div> + <div v-for="p in popups"> + <div>#{{ p.id }}</div> + <div>{{ p.component.name ? p.component.name : '<anonymous>' }}</div> + <div><button class="_textButton" @click="killPopup(p)">Kill</button></div> + </div> </div> - <div v-for="p in popups"> - <div>#{{ p.id }}</div> - <div>{{ p.component.name ? p.component.name : '<anonymous>' }}</div> - <div><button class="_textButton" @click="killPopup(p)">Kill</button></div> - </div> - </div> - <div v-if="tab === 'stream'" class="stream"> - <div class="header"> - <div>#ID</div> - <div>Ch</div> - <div>Handle</div> - <div>In</div> - <div>Out</div> - </div> - <div v-for="c in connections"> - <div>#{{ c.id }}</div> - <div>{{ c.channel }}</div> - <div v-if="c.users !== null">(shared)<span v-if="c.name">{{ ' ' + c.name }}</span></div> - <div v-else>{{ c.name ? c.name : '<anonymous>' }}</div> - <div>{{ c.in }}</div> - <div>{{ c.out }}</div> - </div> - </div> - <div v-if="tab === 'streamPool'" class="streamPool"> - <div class="header"> - <div>#ID</div> - <div>Ch</div> - <div>Users</div> - </div> - <div v-for="p in pools"> - <div>#{{ p.id }}</div> - <div>{{ p.channel }}</div> - <div>{{ p.users }}</div> + <div v-if="tab === 'stream'" class="stream"> + <div class="header"> + <div>#ID</div> + <div>Ch</div> + <div>Handle</div> + <div>In</div> + <div>Out</div> + </div> + <div v-for="c in connections"> + <div>#{{ c.id }}</div> + <div>{{ c.channel }}</div> + <div v-if="c.users !== null">(shared)<span v-if="c.name">{{ ' ' + c.name }}</span></div> + <div v-else>{{ c.name ? c.name : '<anonymous>' }}</div> + <div>{{ c.in }}</div> + <div>{{ c.out }}</div> + </div> + </div> + <div v-if="tab === 'streamPool'" class="streamPool"> + <div class="header"> + <div>#ID</div> + <div>Ch</div> + <div>Users</div> + </div> + <div v-for="p in pools"> + <div>#{{ p.id }}</div> + <div>{{ p.channel }}</div> + <div>{{ p.users }}</div> + </div> </div> </div> + + <footer> + <div><span class="label">Windows</span>{{ popups.length }}</div> + <div><span class="label">Stream</span>{{ connections.length }}</div> + <div><span class="label">Stream (Pool)</span>{{ pools.length }}</div> + </footer> </div> </XWindow> </template> @@ -108,24 +116,55 @@ export default defineComponent({ <style lang="scss" scoped> .qljqmnzj { - > .windows, - > .stream, - > .streamPool { - display: table; + display: flex; + flex-direction: column; + height: 100%; + font-family: Fira code, Fira Mono, Consolas, Menlo, Courier, monospace; + + > .content { + flex: 1; + overflow: auto; + + > .windows, + > .stream, + > .streamPool { + display: table; + width: 100%; + padding: 16px; + box-sizing: border-box; + + > div { + display: table-row; + + &.header { + opacity: 0.7; + } + + > * { + display: table-cell; + } + } + } + } + + > footer { + display: flex; width: 100%; - padding: 16px; + padding: 8px 16px; box-sizing: border-box; + border-top: solid 1px var(--divider); + font-size: 0.9em; > div { - display: table-row; - font-family: Fira code, Fira Mono, Consolas, Menlo, Courier, monospace; + flex: 1; - &.header { + > .label { opacity: 0.7; - } + margin-right: 0.5em; - > * { - display: table-cell; + &:after { + content: ":"; + } } } }