[Update] Add Font Family.

This commit is contained in:
Sakamoto Shiina
2024-10-02 17:52:19 +09:00
parent 3570fffbf6
commit faa6656e00
7 changed files with 124 additions and 6 deletions

View File

@@ -3,8 +3,6 @@ import inspect
from os import path as os_path, makedirs as os_makedirs from os import path as os_path, makedirs as os_makedirs
from json import load as json_load from json import load as json_load
from json import dump as json_dump from json import dump as json_dump
import tkinter as tk
from tkinter import font
from models.transcription.transcription_utils import device_manager from models.transcription.transcription_utils import device_manager
from models.transcription.transcription_languages import transcription_lang from models.transcription.transcription_languages import transcription_lang
from utils import generatePercentageStringsList, isUniqueStrings from utils import generatePercentageStringsList, isUniqueStrings
@@ -399,12 +397,9 @@ class Config:
@FONT_FAMILY.setter @FONT_FAMILY.setter
def FONT_FAMILY(self, value): def FONT_FAMILY(self, value):
root = tk.Tk() if isinstance(value, str):
root.withdraw()
if value in list(font.families()):
self._FONT_FAMILY = value self._FONT_FAMILY = value
saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value)
root.destroy()
@property @property
@json_serializable('UI_LANGUAGE') @json_serializable('UI_LANGUAGE')

View File

@@ -10,8 +10,44 @@ fn main() {
app.get_window("main").unwrap().open_devtools(); // `main` is the first window from tauri.conf.json without an explicit label app.get_window("main").unwrap().open_devtools(); // `main` is the first window from tauri.conf.json without an explicit label
Ok(()) Ok(())
}) })
.invoke_handler(tauri::generate_handler![get_font_list])
// .invoke_handler(tauri::generate_handler![greet, run_python_script]) // .invoke_handler(tauri::generate_handler![greet, run_python_script])
.run(tauri::generate_context!()) .run(tauri::generate_context!())
.expect("error while running tauri application"); .expect("error while running tauri application");
} }
use std::fs;
use std::env;
#[tauri::command]
fn get_font_list() -> Vec<String> {
// システム全体のフォントディレクトリ
let system_font_dir = "C:\\Windows\\Fonts";
// ユーザーローカルのフォントディレクトリ
let local_font_dir = format!("{}\\Microsoft\\Windows\\Fonts", env::var("LOCALAPPDATA").unwrap());
let mut fonts = Vec::new();
// システムフォントとユーザーフォントのディレクトリをチェック
let font_dirs = vec![system_font_dir, &local_font_dir];
for dir in font_dirs {
if let Ok(entries) = fs::read_dir(dir) {
for entry in entries {
if let Ok(entry) = entry {
let path = entry.path();
if let Some(extension) = path.extension() {
if extension == "ttf" || extension == "otf" {
if let Some(font_name) = path.file_stem() {
fonts.push(font_name.to_string_lossy().to_string());
}
}
}
}
}
}
}
fonts
}

View File

@@ -15,6 +15,7 @@ export const App = () => {
<ConfigPage /> <ConfigPage />
<MainPage /> <MainPage />
<UiSizeController /> <UiSizeController />
<FontFamilyController />
</div> </div>
); );
}; };
@@ -33,6 +34,7 @@ import { useSendMessageButtonType } from "@logics_configs/useSendMessageButtonTy
import { useUiLanguage } from "@logics_configs/useUiLanguage"; import { useUiLanguage } from "@logics_configs/useUiLanguage";
import { useUiScaling } from "@logics_configs/useUiScaling"; import { useUiScaling } from "@logics_configs/useUiScaling";
import { useMessageLogUiScaling } from "@logics_configs/useMessageLogUiScaling"; import { useMessageLogUiScaling } from "@logics_configs/useMessageLogUiScaling";
import { useSelectedFontFamily } from "@logics_configs/useSelectedFontFamily";
import { useIsMainPageCompactMode } from "@logics_main/useIsMainPageCompactMode"; import { useIsMainPageCompactMode } from "@logics_main/useIsMainPageCompactMode";
import { useLanguageSettings } from "@logics_main/useLanguageSettings"; import { useLanguageSettings } from "@logics_main/useLanguageSettings";
@@ -47,6 +49,7 @@ const StartPythonFacadeComponent = () => {
const { asyncStartPython } = useStartPython(); const { asyncStartPython } = useStartPython();
const hasRunRef = useRef(false); const hasRunRef = useRef(false);
const main_page = getCurrent(); const main_page = getCurrent();
const { asyncFetchFonts } = useAsyncFetchFonts();
const { getMicHostList } = useMicHostList(); const { getMicHostList } = useMicHostList();
const { getMicDeviceList } = useMicDeviceList(); const { getMicDeviceList } = useMicDeviceList();
@@ -66,6 +69,7 @@ const StartPythonFacadeComponent = () => {
const { getUiLanguage } = useUiLanguage(); const { getUiLanguage } = useUiLanguage();
const { getUiScaling } = useUiScaling(); const { getUiScaling } = useUiScaling();
const { getMessageLogUiScaling } = useMessageLogUiScaling(); const { getMessageLogUiScaling } = useMessageLogUiScaling();
const { getSelectedFontFamily } = useSelectedFontFamily();
const { const {
getSelectedPresetTabNumber, getSelectedPresetTabNumber,
@@ -89,6 +93,9 @@ const StartPythonFacadeComponent = () => {
getIsMainPageCompactMode(); getIsMainPageCompactMode();
getMessageInputBoxRatio(); getMessageInputBoxRatio();
asyncFetchFonts();
getSelectedFontFamily();
getSoftwareVersion(); getSoftwareVersion();
getSelectedPresetTabNumber(); getSelectedPresetTabNumber();
@@ -191,7 +198,31 @@ const UiSizeController = () => {
useEffect(() => { useEffect(() => {
document.documentElement.style.setProperty("font-size", `${font_size}%`); document.documentElement.style.setProperty("font-size", `${font_size}%`);
document.documentElement.style.setProperty("font-family", `Yu Gothic UI`);
}, [currentUiScaling.data]); }, [currentUiScaling.data]);
return null; return null;
}; };
const FontFamilyController = () => {
const { currentSelectedFontFamily } = useSelectedFontFamily();
useEffect(() => {
document.documentElement.style.setProperty("font-family", `${currentSelectedFontFamily.data}`);
}, [currentSelectedFontFamily.data]);
return null;
};
import { useStore_SelectableFontFamilyList } from "@store";
import { arrayToObject } from "@utils/arrayToObject";
import { invoke } from "@tauri-apps/api/tauri";
const useAsyncFetchFonts = () => {
const { updateSelectableFontFamilyList } = useStore_SelectableFontFamilyList();
const asyncFetchFonts = async () => {
const fonts = await invoke("get_font_list");
updateSelectableFontFamilyList(arrayToObject(fonts));
};
return { asyncFetchFonts };
};

View File

@@ -25,6 +25,7 @@ export const Appearance = () => {
<UiLanguageContainer /> <UiLanguageContainer />
<UiScalingContainer /> <UiScalingContainer />
<MessageLogUiScalingContainer /> <MessageLogUiScalingContainer />
<FontFamilyContainer />
@@ -185,3 +186,27 @@ const MessageLogUiScalingContainer = () => {
/> />
); );
}; };
import { useStore_SelectableFontFamilyList } from "@store";
import { DropdownMenuContainer } from "../components/useSettingBox";
import { useSelectedFontFamily } from "@logics_configs/useSelectedFontFamily";
const FontFamilyContainer = () => {
const { t } = useTranslation();
const { currentSelectedFontFamily, setSelectedFontFamily } = useSelectedFontFamily();
const selectFunction = (selected_data) => {
setSelectedFontFamily(selected_data.selected_id);
};
const { currentSelectableFontFamilyList } = useStore_SelectableFontFamilyList();
return (
<DropdownMenuContainer
dropdown_id="font_family"
label={t("config_page.font_family.label")}
desc={t("config_page.font_family.label")}
selected_id={currentSelectedFontFamily.data}
list={currentSelectableFontFamilyList.data}
selectFunction={selectFunction}
state={currentSelectedFontFamily.state}
/>
);
};

View File

@@ -0,0 +1,24 @@
import { useStore_SelectedFontFamily } from "@store";
import { useStdoutToPython } from "@logics/useStdoutToPython";
export const useSelectedFontFamily = () => {
const { asyncStdoutToPython } = useStdoutToPython();
const { currentSelectedFontFamily, updateSelectedFontFamily, pendingSelectedFontFamily } = useStore_SelectedFontFamily();
const getSelectedFontFamily = () => {
pendingSelectedFontFamily();
asyncStdoutToPython("/get/data/font_family");
};
const setSelectedFontFamily = (selected_font_family) => {
pendingSelectedFontFamily();
asyncStdoutToPython("/set/data/font_family", selected_font_family);
};
return {
currentSelectedFontFamily,
getSelectedFontFamily,
updateSelectedFontFamily,
setSelectedFontFamily,
};
};

View File

@@ -25,6 +25,7 @@ import { useMicThreshold } from "@logics_configs/useMicThreshold";
import { useSpeakerThreshold } from "@logics_configs/useSpeakerThreshold"; import { useSpeakerThreshold } from "@logics_configs/useSpeakerThreshold";
import { useEnableAutoClearMessageBox } from "@logics_configs/useEnableAutoClearMessageBox"; import { useEnableAutoClearMessageBox } from "@logics_configs/useEnableAutoClearMessageBox";
import { useSendMessageButtonType } from "@logics_configs/useSendMessageButtonType"; import { useSendMessageButtonType } from "@logics_configs/useSendMessageButtonType";
import { useSelectedFontFamily } from "@logics_configs/useSelectedFontFamily";
import { useUiLanguage } from "@logics_configs/useUiLanguage"; import { useUiLanguage } from "@logics_configs/useUiLanguage";
import { useUiScaling } from "@logics_configs/useUiScaling"; import { useUiScaling } from "@logics_configs/useUiScaling";
@@ -75,6 +76,7 @@ export const useReceiveRoutes = () => {
} = useVolume(); } = useVolume();
const { updateMessageInputBoxRatio } = useMessageInputBoxRatio(); const { updateMessageInputBoxRatio } = useMessageInputBoxRatio();
const { updateSelectedFontFamily } = useSelectedFontFamily();
const routes = { const routes = {
@@ -208,6 +210,9 @@ export const useReceiveRoutes = () => {
"/get/data/textbox_ui_scaling": updateMessageLogUiScaling, "/get/data/textbox_ui_scaling": updateMessageLogUiScaling,
"/set/data/textbox_ui_scaling": updateMessageLogUiScaling, "/set/data/textbox_ui_scaling": updateMessageLogUiScaling,
"/get/data/font_family": updateSelectedFontFamily,
"/set/data/font_family": updateSelectedFontFamily,
// Others Tab // Others Tab
"/get/data/auto_clear_message_box": updateEnableAutoClearMessageBox, "/get/data/auto_clear_message_box": updateEnableAutoClearMessageBox,
"/set/enable/auto_clear_message_box": updateEnableAutoClearMessageBox, "/set/enable/auto_clear_message_box": updateEnableAutoClearMessageBox,

View File

@@ -172,6 +172,8 @@ export const { atomInstance: Atom_EnableAutomaticSpeakerThreshold, useHook: useS
export const { atomInstance: Atom_UiLanguage, useHook: useStore_UiLanguage } = createAtomWithHook("en", "UiLanguage"); export const { atomInstance: Atom_UiLanguage, useHook: useStore_UiLanguage } = createAtomWithHook("en", "UiLanguage");
export const { atomInstance: Atom_UiScaling, useHook: useStore_UiScaling } = createAtomWithHook(100, "UiScaling"); export const { atomInstance: Atom_UiScaling, useHook: useStore_UiScaling } = createAtomWithHook(100, "UiScaling");
export const { atomInstance: Atom_MessageLogUiScaling, useHook: useStore_MessageLogUiScaling } = createAtomWithHook(100, "MessageLogUiScaling"); export const { atomInstance: Atom_MessageLogUiScaling, useHook: useStore_MessageLogUiScaling } = createAtomWithHook(100, "MessageLogUiScaling");
export const { atomInstance: Atom_SelectedFontFamily, useHook: useStore_SelectedFontFamily } = createAtomWithHook("Yu Gothic UI", "SelectedFontFamily");
export const { atomInstance: Atom_SelectableFontFamilyList, useHook: useStore_SelectableFontFamilyList } = createAtomWithHook({}, "SelectableFontFamilyList");
export const { atomInstance: Atom_IsOpenedWordFilterList, useHook: useStore_IsOpenedWordFilterList } = createAtomWithHook(false, "IsOpenedWordFilterList"); export const { atomInstance: Atom_IsOpenedWordFilterList, useHook: useStore_IsOpenedWordFilterList } = createAtomWithHook(false, "IsOpenedWordFilterList");