From 683b0701b584d417c0e783c7b69149584bbab4c5 Mon Sep 17 00:00:00 2001 From: Greyhoof <132987288+greyhoof@users.noreply.github.com> Date: Tue, 5 Sep 2023 12:39:59 +0200 Subject: [PATCH] + Added new, empty dialog where the browser option is going to go + Added menu item to open browser option dialog --- electron/BrowserOption.vue | 114 +++++++++++++++++++++++++++++++++++ electron/browser_option.html | 14 +++++ electron/browser_option.ts | 26 ++++++++ electron/common.ts | 1 + electron/main.ts | 25 ++++++++ electron/webpack.config.js | 3 +- 6 files changed, 182 insertions(+), 1 deletion(-) create mode 100644 electron/BrowserOption.vue create mode 100644 electron/browser_option.html create mode 100644 electron/browser_option.ts diff --git a/electron/BrowserOption.vue b/electron/BrowserOption.vue new file mode 100644 index 0000000..5ff127a --- /dev/null +++ b/electron/BrowserOption.vue @@ -0,0 +1,114 @@ +<template> + <div style="display: flex;flex-direction:column;height:100%" :class="getThemeClass()" @auxclick.prevent> + <div v-html="styling"></div> + <div style="display:flex;align-items:stretch;border-bottom-width:1px" class="border-bottom" id="window-tabs"> + <h4 style="padding:2px 0">F-Chat</h4> + <div style="flex:1;display:flex;justify-content:flex-end;-webkit-app-region:drag" class="btn-group" + id="windowButtons"> + <i class="far fa-window-minimize btn btn-light" @click.stop="minimize()"></i> + <i class="far btn btn-light" :class="'fa-window-' + (isMaximized ? 'restore' : 'maximize')" @click="maximize()"></i> + <span class="btn btn-light" @click.stop="close()"> + <i class="fa fa-times fa-lg"></i> + </span> + </div> + </div> + </div> +</template> + +<script lang="ts"> +import {Component} from '@f-list/vue-ts'; +import * as remote from '@electron/remote'; +import Vue from 'vue'; +import l from '../chat/localize'; +import {GeneralSettings} from './common'; +import fs from "fs"; +import path from "path"; + +const browserWindow = remote.getCurrentWindow(); + @Component + export default class BrowserOption extends Vue { + settings!: GeneralSettings; + isMaximized = false; + l = l; + platform = process.platform; + hasCompletedUpgrades = false; + + get styling(): string { + try { + return `<style>${fs.readFileSync(path.join(__dirname, `themes/${this.settings.theme}.css`), 'utf8').toString()}</style>`; + } catch(e) { + if((<Error & {code: string}>e).code === 'ENOENT' && this.settings.theme !== 'default') { + this.settings.theme = 'default'; + return this.styling; + } + throw e; + } + } + + minimize(): void { + browserWindow.minimize(); + } + + maximize(): void { + if(browserWindow.isMaximized()) browserWindow.unmaximize(); + else browserWindow.maximize(); + } + + close(): void { + browserWindow.close(); + } + + getThemeClass() { + // console.log('getThemeClassWindow', this.settings?.risingDisableWindowsHighContrast); + + try { + // Hack! + if (process.platform === 'win32') { + if (this.settings?.risingDisableWindowsHighContrast) { + document.querySelector('html')?.classList.add('disableWindowsHighContrast'); + } else { + document.querySelector('html')?.classList.remove('disableWindowsHighContrast'); + } + } + + return { + ['platform-' + this.platform]: true, + disableWindowsHighContrast: this.settings?.risingDisableWindowsHighContrast || false + }; + } catch (err) { + return { + ['platform-' + this.platform]: true + }; + } + } + + } +</script> + +<style lang="scss"> + #windowButtons .btn { + border-top: 0; + font-size: 14px; + } + + .platform-darwin { + #windowButtons .btn, #settings { + display: none; + } + + #window-tabs { + h4 { + margin: 0 15px 0 77px; + } + + .btn, li a { + padding-top: 6px; + padding-bottom: 6px; + } + } + } + + .disableWindowsHighContrast, .disableWindowsHighContrast * { + forced-color-adjust: none; + } +</style> diff --git a/electron/browser_option.html b/electron/browser_option.html new file mode 100644 index 0000000..a34ba1c --- /dev/null +++ b/electron/browser_option.html @@ -0,0 +1,14 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <meta http-equiv="Content-Security-Policy" content="default-src 'self' 'unsafe-inline'; img-src https://static.f-list.net"> + <title>F-Chat</title> + <link href="fa.css" rel="stylesheet"> +</head> +<body> +<div id="browser-option"></div> +<script type="text/javascript" src="common.js"></script> +<script type="text/javascript" src="browser_option.js"></script> +</body> +</html> diff --git a/electron/browser_option.ts b/electron/browser_option.ts new file mode 100644 index 0000000..451e173 --- /dev/null +++ b/electron/browser_option.ts @@ -0,0 +1,26 @@ +import * as qs from 'querystring'; +import log from 'electron-log'; //tslint:disable-line:match-default-export-name + +import {GeneralSettings} from './common'; +import BrowserOption from './BrowserOption.vue'; + +log.info('init.browser_option'); + +const params = <{[key: string]: string | undefined}>qs.parse(window.location.search.substr(1)); +const settings = <GeneralSettings>JSON.parse(params['settings']!); + +const logLevel = (process.env.NODE_ENV === 'production') ? 'info' : 'silly'; + +log.transports.file.level = settings.risingSystemLogLevel || logLevel; +log.transports.console.level = settings.risingSystemLogLevel || logLevel; +log.transports.file.maxSize = 5 * 1024 * 1024; + +log.info('init.browser_option.vue'); + +//tslint:disable-next-line:no-unused-expression +export default new BrowserOption({ + el: '#browser-option', + data: {settings} +}); + +log.debug('init.browser_option.vue.done'); diff --git a/electron/common.ts b/electron/common.ts index 0425a81..198fd03 100644 --- a/electron/common.ts +++ b/electron/common.ts @@ -31,6 +31,7 @@ export class GeneralSettings { risingCacheExpiryDays = 30; risingSystemLogLevel: log.LevelOption = 'info'; risingDisableWindowsHighContrast = false; + browserCommand = ''; } // //tslint:disable diff --git a/electron/main.ts b/electron/main.ts index ee53899..bade67d 100644 --- a/electron/main.ts +++ b/electron/main.ts @@ -284,6 +284,25 @@ function showPatchNotes(): void { electron.shell.openExternal('https://github.com/hearmeneigh/fchat-rising/blob/master/CHANGELOG.md'); } +function openBrowserSettings(): void { + const windowProperties: electron.BrowserWindowConstructorOptions = { + center: true, + show: false, + icon: process.platform === 'win32' ? winIcon : pngIcon, + webPreferences: { + webviewTag: true, nodeIntegration: true, nodeIntegrationInWorker: true, spellcheck: true, + enableRemoteModule: true, contextIsolation: false, partition: 'persist:fchat' + } as any + }; + + const browserWindow = new electron.BrowserWindow(windowProperties); + browserWindow.removeMenu(); + browserWindow.loadFile(path.join(__dirname, 'browser_option.html')).then(r => { + console.log(r); + browserWindow.show(); + }); +} + let zoomLevel = 0; @@ -529,6 +548,12 @@ function onReady(): void { settings.risingDisableWindowsHighContrast = item.checked; setGeneralSettings(settings); } + }, + { + label: 'Set command for opening clicked links', + click: () => { + openBrowserSettings(); + } } ] }, diff --git a/electron/webpack.config.js b/electron/webpack.config.js index f7893e5..924c549 100644 --- a/electron/webpack.config.js +++ b/electron/webpack.config.js @@ -47,7 +47,8 @@ const mainConfig = { }, rendererConfig = { entry: { chat: [path.join(__dirname, 'chat.ts'), path.join(__dirname, 'index.html')], - window: [path.join(__dirname, 'window.ts'), path.join(__dirname, 'window.html'), path.join(__dirname, 'build', 'tray@2x.png')] + window: [path.join(__dirname, 'window.ts'), path.join(__dirname, 'window.html'), path.join(__dirname, 'build', 'tray@2x.png')], + browser_option: [path.join(__dirname, 'browser_option.ts'), path.join(__dirname, 'browser_option.html'), path.join(__dirname, 'build', 'tray@2x.png')] }, output: { path: __dirname + '/app',