init
This commit is contained in:
commit
bcdd786134
|
@ -0,0 +1 @@
|
||||||
|
/node_modules/*
|
|
@ -0,0 +1,21 @@
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2024 iceyrazor
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
|
@ -0,0 +1,11 @@
|
||||||
|
{
|
||||||
|
"default_folders": [
|
||||||
|
"%Downloads%",
|
||||||
|
"%Pictures%",
|
||||||
|
"%Videos%",
|
||||||
|
"%Documents%",
|
||||||
|
"%Desktop%",
|
||||||
|
"C:\\Users\\ricke\\Desktop\\projects\\better file browser",
|
||||||
|
"C:\\Users\\ricke\\Desktop\\projects\\mic"
|
||||||
|
]
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,15 @@
|
||||||
|
{
|
||||||
|
"name": "iceys-file-browser",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "file browser window... thing. idfk. cope",
|
||||||
|
"main": "src/main.js",
|
||||||
|
"scripts": {
|
||||||
|
"start":"electron .",
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"author": "iceyrazor",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"electron": "^15.3.0"
|
||||||
|
}
|
||||||
|
}
|
Binary file not shown.
After Width: | Height: | Size: 66 KiB |
Binary file not shown.
After Width: | Height: | Size: 75 KiB |
Binary file not shown.
|
@ -0,0 +1,347 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<title></title>
|
||||||
|
<style>
|
||||||
|
::-webkit-scrollbar {
|
||||||
|
width: 0px; /* Remove scrollbar space */
|
||||||
|
background: transparent; /* Optional: just make scrollbar invisible */
|
||||||
|
}
|
||||||
|
html{
|
||||||
|
background-color: rgba(30,30,30,0.3);
|
||||||
|
color: white;
|
||||||
|
height: 100vh;
|
||||||
|
width: 100vw;
|
||||||
|
}
|
||||||
|
.main-wrap{
|
||||||
|
user-select: none;
|
||||||
|
position: absolute;
|
||||||
|
top: 5%;
|
||||||
|
right: 10px;
|
||||||
|
width: 90%;
|
||||||
|
min-height: 20px;
|
||||||
|
max-height: 70%;
|
||||||
|
overflow-y: scroll;
|
||||||
|
}
|
||||||
|
|
||||||
|
#folder_box{
|
||||||
|
position: relative;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
#folder_box > div{
|
||||||
|
padding: 2px;
|
||||||
|
}
|
||||||
|
#folder_box > div:first-child{
|
||||||
|
height: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sub-folder{
|
||||||
|
padding-left: 20px;
|
||||||
|
}
|
||||||
|
.center_text{
|
||||||
|
display: flex;
|
||||||
|
grid-template-columns: 1fr 1fr;
|
||||||
|
justify-content: left;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
.center_text > img{
|
||||||
|
padding-right: 5px;
|
||||||
|
width: 30px;
|
||||||
|
height: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.folder-item{
|
||||||
|
padding-top: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#context_menu{
|
||||||
|
display: none;
|
||||||
|
user-select: none;
|
||||||
|
position: absolute;
|
||||||
|
background-color: rgba(40,40,40,1);
|
||||||
|
padding: 4px;
|
||||||
|
left: 0px;
|
||||||
|
top: 0px;
|
||||||
|
}
|
||||||
|
#context_menu > div:hover{
|
||||||
|
background-color: rgba(80,80,80);
|
||||||
|
}
|
||||||
|
|
||||||
|
#nav_bar{
|
||||||
|
user-select: none;
|
||||||
|
position: absolute;
|
||||||
|
top: 3%;
|
||||||
|
left: 5%;
|
||||||
|
width: 91%;
|
||||||
|
display: flex;
|
||||||
|
direction: rtl;
|
||||||
|
grid-template-columns: 1fr 1fr;
|
||||||
|
background-color: rgba(30,30,30,1);
|
||||||
|
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
#nav_bar > div{
|
||||||
|
padding: 4px;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
#nav_bar > div:hover{
|
||||||
|
background-color: rgba(80,80,80,1);
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<div class="main-wrap"><div id="folder_box"></div></div>
|
||||||
|
|
||||||
|
<div id="context_menu">
|
||||||
|
<div onClick="reload()">reload everything</div>
|
||||||
|
<div onClick="add_to_list()">add folder to list</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="nav_bar">
|
||||||
|
<div onclick="settings()">settings</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
//lerd teh loobrewies
|
||||||
|
const fs=require('fs'),
|
||||||
|
os=require('os'),
|
||||||
|
path=require('path'),
|
||||||
|
electron=require('electron'),
|
||||||
|
{shell,ipcRenderer}=require('electron');
|
||||||
|
|
||||||
|
//create config if not exist
|
||||||
|
if(fs.existsSync(path.resolve(__dirname,"../config.json"))!=true){
|
||||||
|
let obj={
|
||||||
|
default_folders:[
|
||||||
|
"%Downloads%",
|
||||||
|
"%Pictures%",
|
||||||
|
"%Videos%",
|
||||||
|
"%Documents%",
|
||||||
|
"%Desktop%"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
fs.writeFile(
|
||||||
|
path.resolve(__dirname,"../config.json"),
|
||||||
|
JSON.stringify(obj,null,4),
|
||||||
|
()=>{
|
||||||
|
let obj=null
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//_*folder function related*_
|
||||||
|
//load folder config
|
||||||
|
|
||||||
|
function load_default_folders(){
|
||||||
|
|
||||||
|
fs.readFile(path.resolve(__dirname + '/../config.json'), function (err, data) {
|
||||||
|
data=JSON.parse(data)["default_folders"];
|
||||||
|
|
||||||
|
let text="<div></div>"
|
||||||
|
|
||||||
|
data.forEach((folder,i)=>{
|
||||||
|
name=folder.replace(/%/g,"");
|
||||||
|
|
||||||
|
folder=folder.replace(
|
||||||
|
/%Desktop%/g,path.resolve(os.userInfo().homedir,"Desktop")
|
||||||
|
).replace(
|
||||||
|
/%Pictures%/g,path.resolve(os.userInfo().homedir,"Pictures")
|
||||||
|
).replace(
|
||||||
|
/%Documents%/g,path.resolve(os.userInfo().homedir,"Documents")
|
||||||
|
).replace(
|
||||||
|
/%Videos%/g,path.resolve(os.userInfo().homedir,"Videos")
|
||||||
|
).replace(
|
||||||
|
/%Downloads%/g,path.resolve(os.userInfo().homedir,"Downloads")
|
||||||
|
);
|
||||||
|
|
||||||
|
name=folder.replace(
|
||||||
|
path.resolve(os.userInfo().homedir,"Desktop"),'Desktop'
|
||||||
|
).replace(
|
||||||
|
path.resolve(os.userInfo().homedir,"Pictures"),'Pictures'
|
||||||
|
).replace(
|
||||||
|
path.resolve(os.userInfo().homedir,"Documents"),'Documents'
|
||||||
|
).replace(
|
||||||
|
path.resolve(os.userInfo().homedir,"Videos"),'Videos'
|
||||||
|
).replace(
|
||||||
|
path.resolve(os.userInfo().homedir,"Downloads"),'Downloads'
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
let file_parsed=folder.replace(/\\/g,"\\\\");
|
||||||
|
|
||||||
|
if (fs.existsSync(folder)) {
|
||||||
|
text+=
|
||||||
|
'<div class="folder">'+
|
||||||
|
'<div class="center_text" onclick="open_folder(\''+file_parsed+'\')">'+
|
||||||
|
'<img src="imgassets/foldericon.ico" />'+name+
|
||||||
|
'</div>'+
|
||||||
|
'<div class="sub-folder" id="'+(folder)+'"></div></div>'
|
||||||
|
} else {
|
||||||
|
text+='<div style="background-color: rgb(180,0,0);" class="not-exist" id="'+folder
|
||||||
|
+'">'+folder+' does not exist</div>'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
document.getElementById('folder_box').innerHTML=text
|
||||||
|
});
|
||||||
|
}
|
||||||
|
load_default_folders();
|
||||||
|
|
||||||
|
|
||||||
|
let folder_box=document.getElementById('folder_box')
|
||||||
|
|
||||||
|
function open_folder(id){
|
||||||
|
let div=document.getElementById(id)
|
||||||
|
if(div.innerHTML==""){
|
||||||
|
fs.readdir(id,(err, files) => {
|
||||||
|
files.sort((a,b)=>{
|
||||||
|
if(a.includes(".")){
|
||||||
|
return 0
|
||||||
|
} else {
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
})
|
||||||
|
for(file in files){
|
||||||
|
let file_parsed=(id+"\\"+files[file]).replace(/\\/g,"\\\\");
|
||||||
|
|
||||||
|
if(files[file].includes('.')){
|
||||||
|
div.innerHTML+=
|
||||||
|
'<div class="folder-item" onclick="shell.openPath(\''+(file_parsed)
|
||||||
|
+'\')">'+
|
||||||
|
files[file]+'</div>'
|
||||||
|
} else {
|
||||||
|
div.innerHTML+=
|
||||||
|
'<div class="folder">'+
|
||||||
|
'<div class="center_text" onclick="open_folder(\''+file_parsed+'\')">'+
|
||||||
|
'<img src="imgassets/foldericon.ico" />'+files[file]+
|
||||||
|
'</div>'+
|
||||||
|
'<div class="sub-folder" id="'+(id+"\\"+files[file])+'"></div></div>'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
div.innerHTML=""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//_*context menu stuffs*_
|
||||||
|
let context_data=""
|
||||||
|
context_menu=document.getElementById('context_menu')
|
||||||
|
context_menu_default=context_menu.innerHTML
|
||||||
|
|
||||||
|
window.addEventListener("contextmenu", e=>{
|
||||||
|
if(e.target.onclick){
|
||||||
|
let str=e.target.onclick.toString().match(/\'.*\'/g)[0].replace(/\'/g,"")
|
||||||
|
if(str.includes(".")){
|
||||||
|
|
||||||
|
}
|
||||||
|
else if(str){
|
||||||
|
e.preventDefault();
|
||||||
|
context_menu.innerHTML=context_menu_default
|
||||||
|
context_data=str.replace(/\\\\/g,"\\")
|
||||||
|
if(e.srcElement.parentNode.parentNode.id=="folder_box"){
|
||||||
|
context_menu.innerHTML+='<div onclick="remove_from_list()">remove from list</div>'
|
||||||
|
}
|
||||||
|
context_menu.style.display="block";
|
||||||
|
context_menu.style.left=e.pageX+'px';
|
||||||
|
context_menu.style.top=e.pageY+'px';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(e.target.class="not-exist"){
|
||||||
|
console.log(e.target.id.toString());
|
||||||
|
str=e.target.id.toString()
|
||||||
|
e.preventDefault();
|
||||||
|
context_menu.innerHTML='<div onclick="remove_from_list()">remove from list</div>'
|
||||||
|
context_data=str.replace(/\\\\/g,"\\")
|
||||||
|
|
||||||
|
context_menu.style.display="block";
|
||||||
|
context_menu.style.left=e.pageX+'px';
|
||||||
|
context_menu.style.top=e.pageY+'px';
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
window.addEventListener('mousedown',e=>{
|
||||||
|
if(context_menu.style.display!="none"){
|
||||||
|
setTimeout(()=>{
|
||||||
|
|
||||||
|
context_menu.style.display="none"
|
||||||
|
|
||||||
|
},200)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
function add_to_list(id){
|
||||||
|
if(id==null){
|
||||||
|
id=context_data
|
||||||
|
}
|
||||||
|
|
||||||
|
fs.readFile(path.resolve(__dirname + '/../config.json'), function (err, data) {
|
||||||
|
data=JSON.parse(data)
|
||||||
|
data["default_folders"].push(id)
|
||||||
|
fs.writeFile(
|
||||||
|
path.resolve(__dirname,"../config.json"),
|
||||||
|
JSON.stringify(data,null,4),
|
||||||
|
()=>{
|
||||||
|
load_default_folders();
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
function remove_from_list(){
|
||||||
|
fs.readFile(path.resolve(__dirname + '/../config.json'), function (err, data) {
|
||||||
|
data=JSON.parse(data)
|
||||||
|
data["default_folders"].forEach((folder,i)=>{
|
||||||
|
folder=folder.replace(
|
||||||
|
/%Desktop%/g,path.resolve(os.userInfo().homedir,"Desktop")
|
||||||
|
).replace(
|
||||||
|
/%Pictures%/g,path.resolve(os.userInfo().homedir,"Pictures")
|
||||||
|
).replace(
|
||||||
|
/%Documents%/g,path.resolve(os.userInfo().homedir,"Documents")
|
||||||
|
).replace(
|
||||||
|
/%Videos%/g,path.resolve(os.userInfo().homedir,"Videos")
|
||||||
|
).replace(
|
||||||
|
/%Downloads%/g,path.resolve(os.userInfo().homedir,"Downloads")
|
||||||
|
);
|
||||||
|
if(folder==context_data){
|
||||||
|
console.log("L + RATIO + REMOVED YOUR FILE "+context_data+" + COPE");
|
||||||
|
data["default_folders"].splice(i,1)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
fs.writeFile(
|
||||||
|
path.resolve(__dirname,"../config.json"),
|
||||||
|
JSON.stringify(data,null,4),
|
||||||
|
()=>{
|
||||||
|
load_default_folders();
|
||||||
|
}
|
||||||
|
)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function reload(){
|
||||||
|
location.reload();
|
||||||
|
}
|
||||||
|
|
||||||
|
//_*allow click behind*_
|
||||||
|
folder_box.addEventListener('mouseenter',()=>{
|
||||||
|
ipcRenderer.send('set-click','false')
|
||||||
|
})
|
||||||
|
folder_box.addEventListener('mouseleave',()=>{
|
||||||
|
ipcRenderer.send('set-click','true')
|
||||||
|
});
|
||||||
|
context_menu.addEventListener('mouseenter',()=>{
|
||||||
|
ipcRenderer.send('set-click','false')
|
||||||
|
})
|
||||||
|
context_menu.addEventListener('mouseleave',()=>{
|
||||||
|
ipcRenderer.send('set-click','true')
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,61 @@
|
||||||
|
const electron = require('electron'),
|
||||||
|
{app,BrowserWindow,Menu,Tray,ipcMain} = require('electron'),
|
||||||
|
path = require('path');
|
||||||
|
|
||||||
|
myWindow=null;
|
||||||
|
global.tray=null;
|
||||||
|
app.whenReady().then(()=>{
|
||||||
|
//set tray icon
|
||||||
|
tray = new Tray(path.join(__dirname+'/imgassets/icon.ico'))
|
||||||
|
const contextMenu = Menu.buildFromTemplate([
|
||||||
|
{label:"on top",click(){
|
||||||
|
switch(myWindow.isAlwaysOnTop()){
|
||||||
|
case true:
|
||||||
|
myWindow.setAlwaysOnTop(false);
|
||||||
|
break;
|
||||||
|
case false:
|
||||||
|
myWindow.setAlwaysOnTop(true)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}},
|
||||||
|
{label:"exit",click(){ app.quit(); }},
|
||||||
|
])
|
||||||
|
tray.setToolTip('better file browser')
|
||||||
|
tray.setContextMenu(contextMenu)
|
||||||
|
|
||||||
|
//figure out screens
|
||||||
|
primaryscreen=electron.screen.getPrimaryDisplay()
|
||||||
|
|
||||||
|
//create window
|
||||||
|
myWindow=new BrowserWindow({
|
||||||
|
width: Math.floor(primaryscreen.bounds.width/5),
|
||||||
|
//width: 800,
|
||||||
|
height: primaryscreen.bounds.height,
|
||||||
|
frame: false,
|
||||||
|
transparent:true,
|
||||||
|
webPreferences:{
|
||||||
|
nodeIntegration: true,
|
||||||
|
contextIsolation: false,
|
||||||
|
enableRemoteModule: false,
|
||||||
|
}
|
||||||
|
});
|
||||||
|
//set intial position
|
||||||
|
myWindow.setPosition(primaryscreen.bounds.width-myWindow.getBounds().width,0)
|
||||||
|
|
||||||
|
myWindow.setAlwaysOnTop(true);
|
||||||
|
|
||||||
|
myWindow.loadFile('src/index.html');
|
||||||
|
myWindow.once('ready-to-show', () => {
|
||||||
|
//myWindow.webContents.openDevTools()
|
||||||
|
myWindow.setIgnoreMouseEvents(true, { forward: true });
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
ipcMain.on('set-click',(event,arg)=>{
|
||||||
|
if(arg=='false'){
|
||||||
|
myWindow.setIgnoreMouseEvents(false)
|
||||||
|
} else {
|
||||||
|
myWindow.setIgnoreMouseEvents(true, { forward: true });
|
||||||
|
}
|
||||||
|
})
|
Reference in New Issue