5 changed files with 337 additions and 1 deletions
@ -0,0 +1,146 @@ |
|||||||
|
html, body { |
||||||
|
width: 100%; |
||||||
|
height: 100%; |
||||||
|
margin: 0; |
||||||
|
overflow: hidden; |
||||||
|
} |
||||||
|
|
||||||
|
.screen-selector { |
||||||
|
background-color: #fff; |
||||||
|
width: 100%; |
||||||
|
height: 100%; |
||||||
|
border-radius: 5px; |
||||||
|
border: solid 1px #cdcdcd; |
||||||
|
box-sizing: border-box; |
||||||
|
} |
||||||
|
|
||||||
|
.screen-selector ul.type { |
||||||
|
display: inline-block; |
||||||
|
padding: 0; |
||||||
|
margin: 0; |
||||||
|
border-bottom: solid 1px #cdcdcd; |
||||||
|
width: 100%; |
||||||
|
-webkit-app-region: drag; |
||||||
|
} |
||||||
|
|
||||||
|
.screen-selector ul.type li { |
||||||
|
display: inline-block; |
||||||
|
height: 40px; |
||||||
|
line-height: 40px; |
||||||
|
color: #65696c; |
||||||
|
border-bottom: 2px solid transparent; |
||||||
|
font-family: sans-serif; |
||||||
|
font-weight: bold; |
||||||
|
padding: 0 15px; |
||||||
|
cursor: pointer; |
||||||
|
-webkit-app-region: no-drag; |
||||||
|
} |
||||||
|
|
||||||
|
.screen-selector ul.type li.active, .screen-selector ul.type li:hover { |
||||||
|
color: #426ba3; |
||||||
|
border-color: #426ba3; |
||||||
|
} |
||||||
|
|
||||||
|
.screen-selector > .content { |
||||||
|
height: calc(100% - 92px); |
||||||
|
} |
||||||
|
|
||||||
|
.screen-selector ul.preview { |
||||||
|
display: flex; |
||||||
|
margin: 0; |
||||||
|
padding: 0; |
||||||
|
width: 100%; |
||||||
|
max-height: calc(100% - 45px); |
||||||
|
box-sizing: border-box; |
||||||
|
padding: 10px; |
||||||
|
overflow-y: auto; |
||||||
|
flex-wrap: wrap; |
||||||
|
list-style-type: none; |
||||||
|
} |
||||||
|
|
||||||
|
.screen-selector ul.preview li { |
||||||
|
display: inline-block; |
||||||
|
box-sizing: border-box; |
||||||
|
width: calc(33% - 1px); |
||||||
|
cursor: pointer; |
||||||
|
padding: 5px; |
||||||
|
} |
||||||
|
|
||||||
|
.screen-selector ul.preview li .content { |
||||||
|
display: flex; |
||||||
|
box-sizing: border-box; |
||||||
|
padding: 10px; |
||||||
|
border: solid 2px transparent; |
||||||
|
border-radius: 5px; |
||||||
|
height: 100%; |
||||||
|
flex-direction: column; |
||||||
|
} |
||||||
|
|
||||||
|
.screen-selector ul.preview li.active .content, |
||||||
|
.screen-selector ul.preview li:hover .content { |
||||||
|
border-color: #88abdb; |
||||||
|
} |
||||||
|
|
||||||
|
.screen-selector ul.preview li.active .content { |
||||||
|
color: #000; |
||||||
|
height: 100%; |
||||||
|
} |
||||||
|
|
||||||
|
.screen-selector ul.preview li .content .img-wrapper { |
||||||
|
display: flex; |
||||||
|
height: 100%; |
||||||
|
align-items: center; |
||||||
|
background: #f0f0f0; |
||||||
|
} |
||||||
|
|
||||||
|
.screen-selector ul.preview li .content img { |
||||||
|
display: inline-block; |
||||||
|
width: 100%; |
||||||
|
} |
||||||
|
|
||||||
|
.screen-selector ul.preview li .content span { |
||||||
|
display: inline-block; |
||||||
|
width: 100%; |
||||||
|
font-family: sans-serif; |
||||||
|
text-align: center; |
||||||
|
font-size: 14px; |
||||||
|
margin-top: 10px; |
||||||
|
color: #333; |
||||||
|
box-sizing: border-box; |
||||||
|
} |
||||||
|
|
||||||
|
.screen-selector .footer { |
||||||
|
display: inline-block; |
||||||
|
width: 100%; |
||||||
|
border-top: solid 1px #cdcdcd; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
.screen-selector .footer button { |
||||||
|
float: right; |
||||||
|
margin-top: 10px; |
||||||
|
margin-right: 10px; |
||||||
|
border: none; |
||||||
|
border-radius: 5px; |
||||||
|
padding: 5px 10px; |
||||||
|
font-size: 14px; |
||||||
|
cursor: pointer; |
||||||
|
font-weight: bold; |
||||||
|
} |
||||||
|
|
||||||
|
.screen-selector .footer button#cancel { |
||||||
|
border: solid 1px #cdcdcd; |
||||||
|
background: #fff; |
||||||
|
color: #1c73e4; |
||||||
|
} |
||||||
|
|
||||||
|
.screen-selector .footer button#share { |
||||||
|
border: solid 1px #186ddd; |
||||||
|
background: #1c73e4; |
||||||
|
color: #fff; |
||||||
|
} |
||||||
|
|
||||||
|
.screen-selector .footer button#share[disabled] { |
||||||
|
background: #666; |
||||||
|
cursor: default; |
||||||
|
} |
@ -0,0 +1,77 @@ |
|||||||
|
const { ipcRenderer } = require('electron'); |
||||||
|
|
||||||
|
let sourceList, contentList, typeButtons, shareButton, cancelButton, activeItem, activeTab = 'screen'; |
||||||
|
|
||||||
|
const getItemDOM = item => { |
||||||
|
const li = document.createElement('li'); |
||||||
|
li.setAttribute('data-id', item.id); |
||||||
|
li.innerHTML = `<div class="content"><div class="img-wrapper"><img src="${item.thumbnail}" /></div><span>${item.name}</span></div>`; |
||||||
|
li.addEventListener('click', onItemClick, false); |
||||||
|
return li; |
||||||
|
}; |
||||||
|
|
||||||
|
const updateTab = () => { |
||||||
|
const sources = sourceList.filter(it => it.id.indexOf(activeTab) === 0); |
||||||
|
contentList.innerHTML = ''; |
||||||
|
sources.forEach(source => contentList.appendChild(getItemDOM(source))); |
||||||
|
}; |
||||||
|
|
||||||
|
const bindTypeClick = () => { |
||||||
|
typeButtons.forEach(it => it.addEventListener('click', onChangeType, false)); |
||||||
|
}; |
||||||
|
|
||||||
|
const bindActionsClick = () => { |
||||||
|
shareButton.addEventListener('click', onShareClick, false); |
||||||
|
cancelButton.addEventListener('click', onCancelClick, false); |
||||||
|
}; |
||||||
|
|
||||||
|
const onChangeType = event => { |
||||||
|
event.preventDefault(); |
||||||
|
if (!event.target.classList.contains('active')) { |
||||||
|
activeTab = event.target.dataset.type; |
||||||
|
typeButtons.forEach(it => it.classList.remove('active')); |
||||||
|
event.target.classList.add('active'); |
||||||
|
updateTab(); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
const onItemClick = event => { |
||||||
|
event.preventDefault(); |
||||||
|
if (!event.currentTarget.classList.contains('active')) { |
||||||
|
activeItem = event.currentTarget.dataset.id; |
||||||
|
document.querySelectorAll('.preview li').forEach(it => it.classList.remove('active')); |
||||||
|
event.currentTarget.classList.add('active'); |
||||||
|
changeShareState(); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
const onCancelClick = event => { |
||||||
|
event.preventDefault(); |
||||||
|
ipcRenderer.send('screenShare:cancelSelection'); |
||||||
|
}; |
||||||
|
|
||||||
|
const onShareClick = event => { |
||||||
|
event.preventDefault(); |
||||||
|
if (activeItem) { |
||||||
|
ipcRenderer.send('screenShare:selectScreen', activeItem); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
const changeShareState = () => { |
||||||
|
if (shareButton.getAttribute('disabled') !== null) { |
||||||
|
shareButton.removeAttribute('disabled'); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
window.addEventListener('load', async () => { |
||||||
|
sourceList = await ipcRenderer.invoke('screenShare:getSources'); |
||||||
|
|
||||||
|
contentList = document.querySelector('.preview'); |
||||||
|
typeButtons = document.querySelectorAll('.type li'); |
||||||
|
shareButton = document.querySelector('#share'); |
||||||
|
cancelButton = document.querySelector('#cancel'); |
||||||
|
|
||||||
|
bindTypeClick(); |
||||||
|
bindActionsClick(); |
||||||
|
updateTab(); |
||||||
|
}, false); |
@ -0,0 +1,22 @@ |
|||||||
|
<!DOCTYPE html> |
||||||
|
<html lang="en"> |
||||||
|
<head> |
||||||
|
<link rel="stylesheet" href="resources/css/screenselector.css" /> |
||||||
|
</head> |
||||||
|
<body> |
||||||
|
<div class="screen-selector"> |
||||||
|
<ul class="type"> |
||||||
|
<li class="active" data-type="screen">Entire Screen</li> |
||||||
|
<li data-type="window">Window</li> |
||||||
|
</ul> |
||||||
|
<div class="content"> |
||||||
|
<ul class="preview"></ul> |
||||||
|
</div> |
||||||
|
<div class="footer"> |
||||||
|
<button id="share" disabled>Share</button> |
||||||
|
<button id="cancel">Cancel</button> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<script src="resources/js/screenselector.js"></script> |
||||||
|
</body> |
||||||
|
</html> |
Loading…
Reference in new issue