parent
c79b0a91b7
commit
11d5983028
18 changed files with 255 additions and 39 deletions
@ -0,0 +1,13 @@ |
||||
"use strict"; |
||||
|
||||
const {ipcMain} = require("electron"); |
||||
const FontList = require("font-list"); |
||||
|
||||
class FontManager { |
||||
|
||||
constructor() { |
||||
ipcMain.handle("FontManager::fonts", async () => await FontList.getFonts().catch(error => console.log(error))); |
||||
} |
||||
} |
||||
|
||||
module.exports = FontManager; |
@ -0,0 +1,51 @@ |
||||
"use strict"; |
||||
|
||||
const {ipcMain, app} = require("electron"); |
||||
const fsn = require("fs"); |
||||
const fs = require("fs/promises") |
||||
const path = require("path"); |
||||
|
||||
class SettingsManager { |
||||
app; |
||||
data; |
||||
|
||||
constructor(app) { |
||||
this.app = app; |
||||
this.data = null; |
||||
|
||||
if (!SettingsManager.CheckFileSystem()) { |
||||
if (!fsn.existsSync(SettingsManager.Folder)) |
||||
fsn.mkdirSync(SettingsManager.Folder); |
||||
fsn.writeFileSync(SettingsManager.File, "{}"); |
||||
} |
||||
this.data = JSON.parse(fsn.readFileSync(SettingsManager.File, {encoding : "utf-8"})); |
||||
|
||||
ipcMain.handle("SettingsManager::resize", (_, height) => app.windowManager.windows.settings.setSize(800, height, true)); |
||||
ipcMain.handle("SettingsManager::get", (_, key, defaultValue = null) => this.get(key, defaultValue)); |
||||
ipcMain.handle("SettingsManager::set", (_, key, value) => this.set(key, value)); |
||||
} |
||||
|
||||
get(key, defaultValue = null) { |
||||
if (Object.keys(this.data).includes(key)) |
||||
return this.data[key]; |
||||
return defaultValue; |
||||
} |
||||
|
||||
set(key, value) { |
||||
this.data[key] = value; |
||||
this.save(); |
||||
} |
||||
|
||||
save() { |
||||
fs.writeFile(SettingsManager.File, JSON.stringify(this.data, null, 4)); |
||||
} |
||||
|
||||
static CheckFileSystem() { |
||||
|
||||
return fsn.existsSync(SettingsManager.Folder) && fsn.existsSync(SettingsManager.File); |
||||
} |
||||
} |
||||
SettingsManager.Folder = app.getPath("userData"); |
||||
SettingsManager.File = path.join(SettingsManager.Folder, "config.json"); |
||||
|
||||
module.exports = SettingsManager; |
@ -1,22 +1,77 @@ |
||||
.settings { |
||||
font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; |
||||
overflow: hidden; |
||||
font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif; |
||||
|
||||
&, * { |
||||
user-select: none; |
||||
-webkit-user-drag: none; |
||||
} |
||||
|
||||
.navbar { |
||||
padding: 1.5rem 0.5rem 0 0.5rem; |
||||
background: color(sidebarBackground); |
||||
app-region: drag; |
||||
|
||||
button { |
||||
a { |
||||
text-decoration: none; |
||||
padding: 0.3rem 0.5rem; |
||||
display: inline-block; |
||||
text-align: center; |
||||
border: none; |
||||
outline: 0 !important; |
||||
color: color(fadedForeground); |
||||
margin: 0.5rem 0.1rem; |
||||
transition: all 0.2s ease-in-out; |
||||
border-radius: 5px; |
||||
cursor: pointer; |
||||
|
||||
&:first-child { |
||||
margin-left: 0; |
||||
} |
||||
|
||||
&.active { |
||||
color: color(hightlight); |
||||
} |
||||
&.active, &:hover { |
||||
background: color(active); |
||||
} |
||||
|
||||
svg { |
||||
font-size: 1.3rem; |
||||
vertical-align: middle; |
||||
} |
||||
|
||||
label { |
||||
margin-top: 0.2rem; |
||||
display: block; |
||||
font-size: 0.8rem; |
||||
font-size: 0.7rem; |
||||
} |
||||
} |
||||
} |
||||
|
||||
main { |
||||
padding: 1rem 2rem; |
||||
font-size: 0.8rem; |
||||
|
||||
.grid { |
||||
display: grid; |
||||
grid-template-columns: 1fr 2fr; |
||||
gap: 0.8rem; |
||||
row-gap: 0.5rem; |
||||
align-items: center; |
||||
|
||||
input, select { |
||||
max-width: 50%; |
||||
outline: 0 !important; |
||||
} |
||||
|
||||
> * { |
||||
&:nth-child(odd) { |
||||
justify-self: flex-end; |
||||
} |
||||
|
||||
&:nth-child(even) { |
||||
align-self: flex-start; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
@ -0,0 +1,28 @@ |
||||
import React, {useState, useEffect} from "react"; |
||||
|
||||
const General = ({fonts}) => { |
||||
const [font, setFont] = useState(""); |
||||
|
||||
const changeFont = event => { |
||||
const value = event.target.value; |
||||
setFont(value); |
||||
window.appSettings.set("font", value); |
||||
}; |
||||
|
||||
useEffect(() => { |
||||
(async setFont => setFont(await window.appSettings.get("font", "Iosevka")))(setFont); |
||||
}, []); |
||||
|
||||
return ( |
||||
<section className="grid"> |
||||
<label>Font in slides:</label> |
||||
<select value={font} onChange={changeFont}> |
||||
{fonts.map(font => font.trim().replace(/(^"|"$)/g, "")).map(font => <option key={font} value={font}>{font}</option>)} |
||||
</select> |
||||
<label>Global highlight color:</label> |
||||
<input type="color" /> |
||||
</section> |
||||
); |
||||
}; |
||||
|
||||
export default General; |
@ -1,16 +1,21 @@ |
||||
import React from "react"; |
||||
import React, {forwardRef} from "react"; |
||||
|
||||
import {Gear} from "react-bootstrap-icons"; |
||||
import {NavLink} from "react-router-dom"; |
||||
import {Gear} from "react-bootstrap-icons"; |
||||
|
||||
const Navbar = () => { |
||||
const Navbar = forwardRef((props, ref) => { |
||||
return ( |
||||
<nav className="navbar"> |
||||
<button> |
||||
<nav className="navbar" ref={ref}> |
||||
<NavLink to="/settings" end> |
||||
<Gear /> |
||||
<label>General</label> |
||||
</button> |
||||
</NavLink> |
||||
<NavLink to="/settings/style" end> |
||||
<Gear /> |
||||
<label>General</label> |
||||
</NavLink> |
||||
</nav> |
||||
); |
||||
}; |
||||
}); |
||||
|
||||
export default Navbar; |
Loading…
Reference in new issue