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 { |
.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 { |
.navbar { |
||||||
padding: 1.5rem 0.5rem 0 0.5rem; |
padding: 1.5rem 0.5rem 0 0.5rem; |
||||||
background: color(sidebarBackground); |
background: color(sidebarBackground); |
||||||
app-region: drag; |
|
||||||
|
|
||||||
button { |
a { |
||||||
|
text-decoration: none; |
||||||
padding: 0.3rem 0.5rem; |
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 { |
svg { |
||||||
font-size: 1.3rem; |
font-size: 1.3rem; |
||||||
|
vertical-align: middle; |
||||||
} |
} |
||||||
|
|
||||||
label { |
label { |
||||||
margin-top: 0.2rem; |
margin-top: 0.2rem; |
||||||
display: block; |
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 ( |
return ( |
||||||
<nav className="navbar"> |
<nav className="navbar" ref={ref}> |
||||||
<button> |
<NavLink to="/settings" end> |
||||||
<Gear /> |
<Gear /> |
||||||
<label>General</label> |
<label>General</label> |
||||||
</button> |
</NavLink> |
||||||
|
<NavLink to="/settings/style" end> |
||||||
|
<Gear /> |
||||||
|
<label>General</label> |
||||||
|
</NavLink> |
||||||
</nav> |
</nav> |
||||||
); |
); |
||||||
}; |
}); |
||||||
|
|
||||||
export default Navbar; |
export default Navbar; |
Loading…
Reference in new issue