mirror of
https://github.com/devon22/obsidian-gridexplorer.git
synced 2026-07-22 05:38:16 +00:00
3.0.1
This commit is contained in:
parent
f7f0436120
commit
1647a0129e
21 changed files with 398 additions and 207 deletions
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"id": "gridexplorer",
|
||||
"name": "GridExplorer",
|
||||
"version": "3.0.0",
|
||||
"version": "3.0.1",
|
||||
"minAppVersion": "1.1.0",
|
||||
"description": "Browse note files in a grid view.",
|
||||
"author": "Devon22",
|
||||
|
|
|
|||
4
package-lock.json
generated
4
package-lock.json
generated
|
|
@ -1,12 +1,12 @@
|
|||
{
|
||||
"name": "gridexplorer",
|
||||
"version": "3.0.0",
|
||||
"version": "3.0.1",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "gridexplorer",
|
||||
"version": "3.0.0",
|
||||
"version": "3.0.1",
|
||||
"license": "MIT",
|
||||
"devDependencies": {
|
||||
"@types/node": "^16.11.6",
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "gridexplorer",
|
||||
"version": "3.0.0",
|
||||
"version": "3.0.1",
|
||||
"description": "Browse note files in a grid view.",
|
||||
"main": "main.js",
|
||||
"scripts": {
|
||||
|
|
|
|||
|
|
@ -354,12 +354,12 @@ export class ExplorerView extends ItemView {
|
|||
this.ensureSearchContainer(contentEl);
|
||||
this.clearContentExceptSearch(contentEl);
|
||||
|
||||
const { currentMode, currentPath, showIgnoredFolders } = this.getCurrentGridState();
|
||||
const { currentMode, currentPath, showIgnoredItems } = this.getCurrentGridState();
|
||||
|
||||
this.renderSearchOption(contentEl);
|
||||
this.renderStashGroup(contentEl);
|
||||
this.renderModeGroups(contentEl, currentMode);
|
||||
this.renderFoldersGroup(contentEl, currentMode, currentPath, showIgnoredFolders);
|
||||
this.renderFoldersGroup(contentEl, currentMode, currentPath, showIgnoredItems);
|
||||
|
||||
this.handleSearchFocus();
|
||||
this.restoreScrollPosition(contentEl, prevScrollTop);
|
||||
|
|
@ -545,7 +545,7 @@ export class ExplorerView extends ItemView {
|
|||
return {
|
||||
currentMode: (activeGrid?.sourceMode ?? this.lastMode) ?? '',
|
||||
currentPath: (activeGrid?.sourcePath ?? this.lastPath) ?? '',
|
||||
showIgnoredFolders: activeGrid?.showIgnoredFolders ?? false
|
||||
showIgnoredItems: activeGrid?.showIgnoredItems ?? false
|
||||
};
|
||||
}
|
||||
|
||||
|
|
@ -568,23 +568,23 @@ export class ExplorerView extends ItemView {
|
|||
|
||||
const settings = this.plugin.settings;
|
||||
const activeGrid = this.app.workspace.getActiveViewOfType(GridView);
|
||||
const showIgnoredFolders = activeGrid?.showIgnoredFolders ?? false;
|
||||
const showIgnoredItems = activeGrid?.showIgnoredItems ?? false;
|
||||
|
||||
const childFolders = folder.children
|
||||
.filter((f): f is TFolder => f instanceof TFolder)
|
||||
.filter((f) => !isFolderIgnored(f, settings.ignoredFolders, settings.ignoredFolderPatterns, showIgnoredFolders));
|
||||
.filter((f) => !isFolderIgnored(f, settings.ignoredFolders, settings.ignoredFolderPatterns, showIgnoredItems));
|
||||
|
||||
return childFolders.some((child) => this.shouldShowFolder(child));
|
||||
}
|
||||
|
||||
// 檢查是否有可見的頂層資料夾
|
||||
private hasVisibleTopLevelFolders(showIgnoredFolders: boolean): boolean {
|
||||
private hasVisibleTopLevelFolders(showIgnoredItems: boolean): boolean {
|
||||
const root = this.app.vault.getRoot();
|
||||
const settings = this.plugin.settings;
|
||||
|
||||
const topLevelFolders = root.children
|
||||
.filter((f): f is TFolder => f instanceof TFolder)
|
||||
.filter(f => !isFolderIgnored(f, settings.ignoredFolders, settings.ignoredFolderPatterns, showIgnoredFolders));
|
||||
.filter(f => !isFolderIgnored(f, settings.ignoredFolders, settings.ignoredFolderPatterns, showIgnoredItems));
|
||||
|
||||
return topLevelFolders.some((f) => this.shouldShowFolder(f));
|
||||
}
|
||||
|
|
@ -599,11 +599,11 @@ export class ExplorerView extends ItemView {
|
|||
// 檢查子資料夾是否有符合條件的
|
||||
const settings = this.plugin.settings;
|
||||
const activeGrid = this.app.workspace.getActiveViewOfType(GridView);
|
||||
const showIgnoredFolders = activeGrid?.showIgnoredFolders ?? false;
|
||||
const showIgnoredItems = activeGrid?.showIgnoredItems ?? false;
|
||||
|
||||
const childFolders = folder.children
|
||||
.filter((f): f is TFolder => f instanceof TFolder)
|
||||
.filter((f) => !isFolderIgnored(f, settings.ignoredFolders, settings.ignoredFolderPatterns, showIgnoredFolders));
|
||||
.filter((f) => !isFolderIgnored(f, settings.ignoredFolders, settings.ignoredFolderPatterns, showIgnoredItems));
|
||||
|
||||
return childFolders.some((child) => this.hasMatchingChildren(child));
|
||||
}
|
||||
|
|
@ -799,10 +799,10 @@ export class ExplorerView extends ItemView {
|
|||
}
|
||||
|
||||
// 渲染資料夾群組
|
||||
private renderFoldersGroup(contentEl: HTMLElement, currentMode: string, currentPath: string, showIgnoredFolders: boolean) {
|
||||
private renderFoldersGroup(contentEl: HTMLElement, currentMode: string, currentPath: string, showIgnoredItems: boolean) {
|
||||
// 如果正在搜尋,檢查是否有符合的資料夾
|
||||
if (this.isFiltering()) {
|
||||
const hasVisibleFolders = this.hasVisibleTopLevelFolders(showIgnoredFolders);
|
||||
const hasVisibleFolders = this.hasVisibleTopLevelFolders(showIgnoredItems);
|
||||
if (!hasVisibleFolders) {
|
||||
return;
|
||||
}
|
||||
|
|
@ -811,13 +811,13 @@ export class ExplorerView extends ItemView {
|
|||
const foldersGroupKey = '__folders__root';
|
||||
const foldersNode = contentEl.createDiv({ cls: 'ge-explorer-folder-node' });
|
||||
|
||||
const { foldersChildren } = this.createFoldersGroupHeader(foldersNode, foldersGroupKey, currentMode, currentPath, showIgnoredFolders);
|
||||
const { foldersChildren } = this.createFoldersGroupHeader(foldersNode, foldersGroupKey, currentMode, currentPath, showIgnoredItems);
|
||||
|
||||
// 若目前在資料夾模式,預先展開對應的父路徑,確保可見
|
||||
this.expandCurrentFolderPath(currentMode, currentPath);
|
||||
|
||||
// 列出頂層資料夾
|
||||
this.renderTopLevelFolders(foldersChildren, showIgnoredFolders);
|
||||
this.renderTopLevelFolders(foldersChildren, showIgnoredItems);
|
||||
}
|
||||
|
||||
// 開啟資料夾搜尋
|
||||
|
|
@ -836,7 +836,7 @@ export class ExplorerView extends ItemView {
|
|||
}
|
||||
|
||||
// 創建資料夾群組標頭
|
||||
private createFoldersGroupHeader(foldersNode: HTMLElement, foldersGroupKey: string, currentMode: string, currentPath: string, showIgnoredFolders: boolean) {
|
||||
private createFoldersGroupHeader(foldersNode: HTMLElement, foldersGroupKey: string, currentMode: string, currentPath: string, showIgnoredItems: boolean) {
|
||||
const foldersHeader = foldersNode.createDiv({ cls: 'ge-explorer-folder-header' });
|
||||
const foldersToggle = foldersHeader.createSpan({ cls: 'ge-explorer-folder-toggle' });
|
||||
|
||||
|
|
@ -844,7 +844,7 @@ export class ExplorerView extends ItemView {
|
|||
let foldersExpanded = this.isExpanded(foldersGroupKey);
|
||||
if (!this.expandedPaths.has(foldersGroupKey)) {
|
||||
// 如果正在搜尋且有符合的資料夾,自動展開根選項
|
||||
if (this.isFiltering() && this.hasVisibleTopLevelFolders(showIgnoredFolders)) {
|
||||
if (this.isFiltering() && this.hasVisibleTopLevelFolders(showIgnoredItems)) {
|
||||
foldersExpanded = true;
|
||||
} else {
|
||||
// 只有在第一次載入且沒有其他展開記錄時才預設展開
|
||||
|
|
@ -853,7 +853,7 @@ export class ExplorerView extends ItemView {
|
|||
foldersExpanded = !hasAnyExpandedPaths; // 如果有其他展開路徑,預設收合;否則預設展開
|
||||
}
|
||||
this.setExpanded(foldersGroupKey, foldersExpanded);
|
||||
} else if (this.isFiltering() && this.hasVisibleTopLevelFolders(showIgnoredFolders)) {
|
||||
} else if (this.isFiltering() && this.hasVisibleTopLevelFolders(showIgnoredItems)) {
|
||||
// 如果正在搜尋且有符合的資料夾,即使之前是收合狀態也要展開
|
||||
foldersExpanded = true;
|
||||
this.setExpanded(foldersGroupKey, foldersExpanded);
|
||||
|
|
@ -938,12 +938,12 @@ export class ExplorerView extends ItemView {
|
|||
}
|
||||
|
||||
// 渲染頂層資料夾
|
||||
private renderTopLevelFolders(foldersChildren: HTMLElement, showIgnoredFolders: boolean) {
|
||||
private renderTopLevelFolders(foldersChildren: HTMLElement, showIgnoredItems: boolean) {
|
||||
const root = this.app.vault.getRoot();
|
||||
const settings = this.plugin.settings;
|
||||
let topLevelFolders = root.children
|
||||
.filter((f): f is TFolder => f instanceof TFolder)
|
||||
.filter(f => !isFolderIgnored(f, settings.ignoredFolders, settings.ignoredFolderPatterns, showIgnoredFolders));
|
||||
.filter(f => !isFolderIgnored(f, settings.ignoredFolders, settings.ignoredFolderPatterns, showIgnoredItems));
|
||||
|
||||
// 依搜尋字串篩選(顯示符合的節點與其祖先)
|
||||
if (this.isFiltering()) {
|
||||
|
|
@ -1057,11 +1057,11 @@ export class ExplorerView extends ItemView {
|
|||
private setupToggleIcon(folder: TFolder, toggle: HTMLElement, expanded: boolean) {
|
||||
const settings = this.plugin.settings;
|
||||
const activeGrid = this.app.workspace.getActiveViewOfType(GridView);
|
||||
const showIgnoredFolders = activeGrid?.showIgnoredFolders ?? false;
|
||||
const showIgnoredItems = activeGrid?.showIgnoredItems ?? false;
|
||||
|
||||
const hasVisibleChildren = folder.children
|
||||
.filter((f): f is TFolder => f instanceof TFolder)
|
||||
.some((f) => !isFolderIgnored(f, settings.ignoredFolders, settings.ignoredFolderPatterns, showIgnoredFolders));
|
||||
.some((f) => !isFolderIgnored(f, settings.ignoredFolders, settings.ignoredFolderPatterns, showIgnoredItems));
|
||||
|
||||
if (!hasVisibleChildren) {
|
||||
toggle.innerHTML = '';
|
||||
|
|
@ -1808,11 +1808,11 @@ export class ExplorerView extends ItemView {
|
|||
private hasVisibleChildren(folder: TFolder): boolean {
|
||||
const settings = this.plugin.settings;
|
||||
const activeGrid = this.app.workspace.getActiveViewOfType(GridView);
|
||||
const showIgnoredFolders = activeGrid?.showIgnoredFolders ?? false;
|
||||
const showIgnoredItems = activeGrid?.showIgnoredItems ?? false;
|
||||
|
||||
return folder.children
|
||||
.filter((f): f is TFolder => f instanceof TFolder)
|
||||
.some((f) => !isFolderIgnored(f, settings.ignoredFolders, settings.ignoredFolderPatterns, showIgnoredFolders));
|
||||
.some((f) => !isFolderIgnored(f, settings.ignoredFolders, settings.ignoredFolderPatterns, showIgnoredItems));
|
||||
}
|
||||
|
||||
// 在網格視圖中開啟資料夾
|
||||
|
|
@ -2067,11 +2067,11 @@ export class ExplorerView extends ItemView {
|
|||
private renderChildFolders(folder: TFolder, childrenContainer: HTMLElement, depth: number) {
|
||||
const settings = this.plugin.settings;
|
||||
const activeGrid = this.app.workspace.getActiveViewOfType(GridView);
|
||||
const showIgnoredFolders = activeGrid?.showIgnoredFolders ?? false;
|
||||
const showIgnoredItems = activeGrid?.showIgnoredItems ?? false;
|
||||
|
||||
let childFolders = folder.children
|
||||
.filter((f): f is TFolder => f instanceof TFolder)
|
||||
.filter((f) => !isFolderIgnored(f, settings.ignoredFolders, settings.ignoredFolderPatterns, showIgnoredFolders));
|
||||
.filter((f) => !isFolderIgnored(f, settings.ignoredFolders, settings.ignoredFolderPatterns, showIgnoredItems));
|
||||
|
||||
if (this.isFiltering()) {
|
||||
childFolders = childFolders.filter((f) => this.shouldShowFolder(f));
|
||||
|
|
|
|||
|
|
@ -53,7 +53,7 @@ export class GridView extends ItemView {
|
|||
recentSources: string[] = []; // 歷史記錄
|
||||
futureSources: string[] = []; // 未來紀錄(前進堆疊)
|
||||
minMode: boolean = false; // 最小模式
|
||||
showIgnoredFolders: boolean = false; // 顯示忽略資料夾
|
||||
showIgnoredItems: boolean = false; // 顯示忽略的資料夾及檔案
|
||||
showDateDividers: boolean = false; // 顯示日期分隔器
|
||||
showNoteTags: boolean = false; // 顯示筆記標籤
|
||||
pinnedList: string[] = []; // 置頂清單
|
||||
|
|
@ -850,6 +850,9 @@ export class GridView extends ItemView {
|
|||
imageAreaEl.remove();
|
||||
}
|
||||
fileEl.style.height = '100%';
|
||||
} else if (displayValue === 'hidden') {
|
||||
// 為隱藏的筆記添加特殊樣式類別
|
||||
fileEl.addClass('ge-note-hidden');
|
||||
}
|
||||
|
||||
// 如果 frontmatter 同時存在 type 與非空的 redirect(視為捷徑檔),將圖示設為 shuffle
|
||||
|
|
@ -2139,7 +2142,7 @@ export class GridView extends ItemView {
|
|||
searchMediaFiles: this.searchMediaFiles,
|
||||
includeMedia: this.includeMedia,
|
||||
minMode: this.minMode,
|
||||
showIgnoredFolders: this.showIgnoredFolders,
|
||||
showIgnoredItems: this.showIgnoredItems,
|
||||
baseCardLayout: this.baseCardLayout,
|
||||
cardLayout: this.cardLayout,
|
||||
hideHeaderElements: this.hideHeaderElements,
|
||||
|
|
@ -2164,7 +2167,7 @@ export class GridView extends ItemView {
|
|||
this.searchMediaFiles = state.state.searchMediaFiles ?? false;
|
||||
this.includeMedia = state.state.includeMedia ?? false;
|
||||
this.minMode = state.state.minMode ?? false;
|
||||
this.showIgnoredFolders = state.state.showIgnoredFolders ?? false;
|
||||
this.showIgnoredItems = state.state.showIgnoredItems ?? false;
|
||||
this.baseCardLayout = state.state.baseCardLayout ?? 'horizontal';
|
||||
this.cardLayout = state.state.cardLayout ?? this.baseCardLayout;
|
||||
this.hideHeaderElements = state.state.hideHeaderElements ?? false;
|
||||
|
|
|
|||
|
|
@ -305,7 +305,7 @@ export class FolderSelectionModal extends Modal {
|
|||
folder,
|
||||
this.plugin.settings.ignoredFolders,
|
||||
this.plugin.settings.ignoredFolderPatterns,
|
||||
false // 在選擇資料夾時不考慮 showIgnoredFolders 設置
|
||||
false // 在選擇資料夾時不考慮 showIgnoredItems 設置
|
||||
);
|
||||
})
|
||||
.sort((a, b) => a.path.localeCompare(b.path));
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ export interface NoteSettings {
|
|||
color: string;
|
||||
isPinned: boolean;
|
||||
isMinimized: boolean;
|
||||
isHidden: boolean;
|
||||
}
|
||||
|
||||
export function showNoteSettingsModal(app: App, plugin: GridExplorerPlugin, file: TFile | TFile[]) {
|
||||
|
|
@ -24,6 +25,7 @@ export class NoteSettingsModal extends Modal {
|
|||
color: '',
|
||||
isPinned: false,
|
||||
isMinimized: false,
|
||||
isHidden: false,
|
||||
};
|
||||
private initialIsPinned: boolean = false; // 記錄初始的 isPinned 狀態
|
||||
|
||||
|
|
@ -146,15 +148,42 @@ export class NoteSettingsModal extends Modal {
|
|||
}
|
||||
|
||||
// 最小化顯示切換
|
||||
let minimizedToggle: any;
|
||||
let hiddenToggle: any;
|
||||
|
||||
if (this.files[0].extension === "md") {
|
||||
new Setting(contentEl)
|
||||
.setName(t('display_minimized'))
|
||||
.setDesc(t('display_minimized_desc'))
|
||||
.addToggle(toggle => {
|
||||
minimizedToggle = toggle;
|
||||
toggle
|
||||
.setValue(this.settings.isMinimized)
|
||||
.onChange(value => {
|
||||
this.settings.isMinimized = value;
|
||||
if (value && this.settings.isHidden) {
|
||||
this.settings.isHidden = false;
|
||||
if (hiddenToggle) hiddenToggle.setValue(false);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// 隱藏檔案切換
|
||||
if (this.files[0].extension === "md") {
|
||||
new Setting(contentEl)
|
||||
.setName(t('display_hidden'))
|
||||
.setDesc(t('display_hidden_desc'))
|
||||
.addToggle(toggle => {
|
||||
hiddenToggle = toggle;
|
||||
toggle
|
||||
.setValue(this.settings.isHidden)
|
||||
.onChange(value => {
|
||||
this.settings.isHidden = value;
|
||||
if (value && this.settings.isMinimized) {
|
||||
this.settings.isMinimized = false;
|
||||
if (minimizedToggle) minimizedToggle.setValue(false);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
|
@ -253,6 +282,10 @@ export class NoteSettingsModal extends Modal {
|
|||
if (fileCache.frontmatter.display === 'minimized') {
|
||||
this.settings.isMinimized = true;
|
||||
}
|
||||
// 讀取隱藏設定
|
||||
if (fileCache.frontmatter.display === 'hidden') {
|
||||
this.settings.isHidden = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -298,10 +331,12 @@ export class NoteSettingsModal extends Modal {
|
|||
} else {
|
||||
delete frontmatter['color'];
|
||||
}
|
||||
if (this.settings.isMinimized) {
|
||||
if (this.settings.isHidden) {
|
||||
frontmatter['display'] = 'hidden';
|
||||
} else if (this.settings.isMinimized) {
|
||||
frontmatter['display'] = 'minimized';
|
||||
} else {
|
||||
if (frontmatter['display'] === 'minimized') delete frontmatter['display'];
|
||||
if (frontmatter['display'] === 'minimized' || frontmatter['display'] === 'hidden') delete frontmatter['display'];
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
@ -317,10 +352,12 @@ export class NoteSettingsModal extends Modal {
|
|||
} else {
|
||||
delete frontmatter['color'];
|
||||
}
|
||||
if (this.settings.isMinimized) {
|
||||
if (this.settings.isHidden) {
|
||||
frontmatter['display'] = 'hidden';
|
||||
} else if (this.settings.isMinimized) {
|
||||
frontmatter['display'] = 'minimized';
|
||||
} else {
|
||||
if (frontmatter['display'] === 'minimized') delete frontmatter['display'];
|
||||
if (frontmatter['display'] === 'minimized' || frontmatter['display'] === 'hidden') delete frontmatter['display'];
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -164,7 +164,7 @@ export async function renderFolder(gridView: GridView, container: HTMLElement) {
|
|||
child,
|
||||
gridView.plugin.settings.ignoredFolders,
|
||||
gridView.plugin.settings.ignoredFolderPatterns,
|
||||
gridView.showIgnoredFolders
|
||||
gridView.showIgnoredItems
|
||||
);
|
||||
})
|
||||
.sort((a, b) => a.name.localeCompare(b.name));
|
||||
|
|
|
|||
|
|
@ -591,14 +591,14 @@ export function renderHeaderButton(gridView: GridView) {
|
|||
gridView.render();
|
||||
});
|
||||
});
|
||||
// 顯示忽略資料夾選項
|
||||
// 顯示忽略的資料夾及檔案選項
|
||||
menu.addItem((item) => {
|
||||
item
|
||||
.setTitle(t('show_ignored_folders'))
|
||||
.setTitle(t('show_ignored_items'))
|
||||
.setIcon('folder-open-dot')
|
||||
.setChecked(gridView.showIgnoredFolders)
|
||||
.setChecked(gridView.showIgnoredItems)
|
||||
.onClick(() => {
|
||||
gridView.showIgnoredFolders = !gridView.showIgnoredFolders;
|
||||
gridView.showIgnoredItems = !gridView.showIgnoredItems;
|
||||
gridView.app.workspace.requestSaveLayout();
|
||||
gridView.render();
|
||||
});
|
||||
|
|
|
|||
|
|
@ -195,7 +195,7 @@ export function renderModePath(gridView: GridView) {
|
|||
child as TFolder,
|
||||
gridView.plugin.settings.ignoredFolders,
|
||||
gridView.plugin.settings.ignoredFolderPatterns,
|
||||
gridView.showIgnoredFolders
|
||||
gridView.showIgnoredItems
|
||||
))
|
||||
.sort((a: any, b: any) => a.name.localeCompare(b.name));
|
||||
|
||||
|
|
@ -374,7 +374,7 @@ export function renderModePath(gridView: GridView) {
|
|||
child as TFolder,
|
||||
gridView.plugin.settings.ignoredFolders,
|
||||
gridView.plugin.settings.ignoredFolderPatterns,
|
||||
gridView.showIgnoredFolders
|
||||
gridView.showIgnoredItems
|
||||
)) as TFolder[];
|
||||
|
||||
if (subFolders.length > 0) {
|
||||
|
|
|
|||
171
src/settings.ts
171
src/settings.ts
|
|
@ -230,21 +230,32 @@ class IgnoredFolderSuggest extends AbstractInputSuggest<string> {
|
|||
export class GridExplorerSettingTab extends PluginSettingTab {
|
||||
plugin: GridExplorerPlugin;
|
||||
|
||||
constructor(app: App, plugin: GridExplorerPlugin) {
|
||||
super(app, plugin);
|
||||
this.plugin = plugin;
|
||||
private sectionStates: Map<string, boolean> = new Map();
|
||||
|
||||
private createSection(title: string, defaultExpanded = false): HTMLElement {
|
||||
const isExpanded = this.sectionStates.has(title) ? this.sectionStates.get(title) : defaultExpanded;
|
||||
const details = this.containerEl.createEl('details', { cls: 'ge-settings-section' });
|
||||
if (isExpanded) details.setAttr('open', 'true');
|
||||
|
||||
details.addEventListener('toggle', () => {
|
||||
this.sectionStates.set(title, details.open);
|
||||
});
|
||||
|
||||
const summary = details.createEl('summary', { cls: 'ge-settings-section-summary' });
|
||||
summary.createEl('h3', { text: title });
|
||||
return details.createDiv({ cls: 'ge-settings-section-content' });
|
||||
}
|
||||
|
||||
display() {
|
||||
const { containerEl } = this;
|
||||
containerEl.empty();
|
||||
|
||||
// 顯示模式設定區域
|
||||
// 自訂模式設定
|
||||
containerEl.createEl('h3', { text: t('custom_mode_settings') });
|
||||
let sectionEl: HTMLElement;
|
||||
|
||||
// 建立自訂模式的容器,以便實現拖曳排序
|
||||
const customModesContainer = containerEl.createDiv();
|
||||
// 自訂模式設定
|
||||
sectionEl = this.createSection(t('custom_mode_settings'));
|
||||
|
||||
const customModesContainer = sectionEl.createDiv();
|
||||
this.plugin.settings.customModes.forEach((mode, index) => {
|
||||
const setting = new Setting(customModesContainer)
|
||||
.setName(`${mode.icon} ${mode.displayName}`)
|
||||
|
|
@ -301,7 +312,9 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
|
||||
// 編輯按鈕
|
||||
setting.addButton((button: ButtonComponent) => {
|
||||
button.setButtonText(t('edit'))
|
||||
button.setIcon('pencil')
|
||||
.setClass('ge-edit-button')
|
||||
.setTooltip(t('edit'))
|
||||
.onClick(() => {
|
||||
// 找到正確的索引,以防萬一順序已變
|
||||
const modeIndex = this.plugin.settings.customModes.findIndex(m => m.internalName === mode.internalName);
|
||||
|
|
@ -316,7 +329,9 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
|
||||
// 移除按鈕
|
||||
setting.addButton((button: ButtonComponent) => {
|
||||
button.setButtonText(t('remove'))
|
||||
button.setIcon('trash-2')
|
||||
.setClass('ge-remove-button')
|
||||
.setTooltip(t('remove'))
|
||||
.setWarning()
|
||||
.onClick(() => {
|
||||
// 找到正確的索引,以防萬一順序已變
|
||||
|
|
@ -329,7 +344,7 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
});
|
||||
});
|
||||
|
||||
new Setting(containerEl)
|
||||
new Setting(sectionEl)
|
||||
.addButton(button => {
|
||||
button.setButtonText(t('add_custom_mode'))
|
||||
.setCta()
|
||||
|
|
@ -352,20 +367,20 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
}
|
||||
|
||||
const data = JSON.stringify(this.plugin.settings.customModes, null, 2);
|
||||
|
||||
|
||||
if (!Platform.isDesktop) {
|
||||
// 行動裝置:使用 Obsidian 的檔案 API
|
||||
try {
|
||||
const fileName = 'gridexplorer-custom-modes.json';
|
||||
let filePath = fileName;
|
||||
let counter = 1;
|
||||
|
||||
|
||||
// 檢查檔案是否已存在,如果存在則添加數字後綴
|
||||
while (this.app.vault.getAbstractFileByPath(filePath)) {
|
||||
filePath = `gridexplorer-custom-modes-${counter}.json`;
|
||||
counter++;
|
||||
}
|
||||
|
||||
|
||||
await this.app.vault.create(filePath, data);
|
||||
new Notice(t('export_success_vault').replace('{filename}', filePath));
|
||||
} catch (error) {
|
||||
|
|
@ -446,10 +461,10 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
});
|
||||
|
||||
// 顯示模式設定區域
|
||||
containerEl.createEl('h3', { text: t('display_mode_settings'), attr: { style: 'margin-top: 40px;' } });
|
||||
sectionEl = this.createSection(t('display_mode_settings'));
|
||||
|
||||
// 設定是否顯示書籤模式
|
||||
new Setting(containerEl)
|
||||
new Setting(sectionEl)
|
||||
.setName(`📑 ${t('show_bookmarks_mode')}`)
|
||||
.addToggle(toggle => {
|
||||
toggle
|
||||
|
|
@ -461,7 +476,7 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
});
|
||||
|
||||
// 設定是否顯示搜尋結果模式
|
||||
new Setting(containerEl)
|
||||
new Setting(sectionEl)
|
||||
.setName(`🔍 ${t('show_search_mode')}`)
|
||||
.addToggle(toggle => {
|
||||
toggle
|
||||
|
|
@ -473,7 +488,7 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
});
|
||||
|
||||
// 設定是否顯示反向連結模式
|
||||
new Setting(containerEl)
|
||||
new Setting(sectionEl)
|
||||
.setName(`🔗 ${t('show_backlinks_mode')}`)
|
||||
.addToggle(toggle => {
|
||||
toggle
|
||||
|
|
@ -485,7 +500,7 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
});
|
||||
|
||||
// 設定是否顯示外部連結模式
|
||||
new Setting(containerEl)
|
||||
new Setting(sectionEl)
|
||||
.setName(`🔗 ${t('show_outgoinglinks_mode')}`)
|
||||
.addToggle(toggle => {
|
||||
toggle
|
||||
|
|
@ -497,7 +512,7 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
});
|
||||
|
||||
// 設定是否顯示所有檔案模式
|
||||
new Setting(containerEl)
|
||||
new Setting(sectionEl)
|
||||
.setName(`📔 ${t('show_all_files_mode')}`)
|
||||
.addToggle(toggle => {
|
||||
toggle
|
||||
|
|
@ -509,7 +524,7 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
});
|
||||
|
||||
// 最近檔案模式設定
|
||||
const recentFilesSetting = new Setting(containerEl)
|
||||
const recentFilesSetting = new Setting(sectionEl)
|
||||
.setName(`📅 ${t('show_recent_files_mode')}`);
|
||||
|
||||
// 添加切換按鈕
|
||||
|
|
@ -545,7 +560,7 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
});
|
||||
|
||||
// 隨機筆記模式設定
|
||||
const randomNoteSetting = new Setting(containerEl)
|
||||
const randomNoteSetting = new Setting(sectionEl)
|
||||
.setName(`🎲 ${t('show_random_note_mode')}`);
|
||||
|
||||
// 添加切換按鈕
|
||||
|
|
@ -581,7 +596,7 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
});
|
||||
|
||||
// 顯示任務模式
|
||||
new Setting(containerEl)
|
||||
new Setting(sectionEl)
|
||||
.setName(`☑️ ${t('show_tasks_mode')}`)
|
||||
.addToggle(toggle => {
|
||||
toggle
|
||||
|
|
@ -592,10 +607,10 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
});
|
||||
});
|
||||
|
||||
containerEl.createEl('h3', { text: t('grid_view_settings'), attr: { style: 'margin-top: 40px;' } });
|
||||
sectionEl = this.createSection(t('grid_view_settings'), true);
|
||||
|
||||
// 重用現有的網格視圖
|
||||
new Setting(containerEl)
|
||||
new Setting(sectionEl)
|
||||
.setName(t('reuse_existing_leaf'))
|
||||
.setDesc(t('reuse_existing_leaf_desc'))
|
||||
.addToggle(toggle => {
|
||||
|
|
@ -608,7 +623,7 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
});
|
||||
|
||||
// 預設開啟位置設定
|
||||
new Setting(containerEl)
|
||||
new Setting(sectionEl)
|
||||
.setName(t('default_open_location'))
|
||||
.setDesc(t('default_open_location_desc'))
|
||||
.addDropdown(dropdown => {
|
||||
|
|
@ -624,7 +639,7 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
});
|
||||
|
||||
// 預設排序模式設定
|
||||
new Setting(containerEl)
|
||||
new Setting(sectionEl)
|
||||
.setName(t('default_sort_type'))
|
||||
.setDesc(t('default_sort_type_desc'))
|
||||
.addDropdown(dropdown => {
|
||||
|
|
@ -644,7 +659,7 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
});
|
||||
|
||||
// 日期分隔器模式設定
|
||||
new Setting(containerEl)
|
||||
new Setting(sectionEl)
|
||||
.setName(t('date_divider_mode'))
|
||||
.setDesc(t('date_divider_mode_desc'))
|
||||
.addDropdown(dropdown => {
|
||||
|
|
@ -661,7 +676,7 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
});
|
||||
|
||||
// 資料夾顯示樣式
|
||||
new Setting(containerEl)
|
||||
new Setting(sectionEl)
|
||||
.setName(t('folder_display_style'))
|
||||
.setDesc(t('folder_display_style_desc'))
|
||||
.addDropdown(dropdown => {
|
||||
|
|
@ -677,7 +692,7 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
});
|
||||
|
||||
// 顯示圖片和影片設定
|
||||
new Setting(containerEl)
|
||||
new Setting(sectionEl)
|
||||
.setName(t('show_media_files'))
|
||||
.setDesc(t('show_media_files_desc'))
|
||||
.addToggle(toggle => {
|
||||
|
|
@ -690,7 +705,7 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
});
|
||||
|
||||
// 顯示影片縮圖設定
|
||||
new Setting(containerEl)
|
||||
new Setting(sectionEl)
|
||||
.setName(t('show_video_thumbnails'))
|
||||
.setDesc(t('show_video_thumbnails_desc'))
|
||||
.addToggle(toggle => {
|
||||
|
|
@ -703,7 +718,7 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
});
|
||||
|
||||
// 是否預設顯示筆記
|
||||
new Setting(containerEl)
|
||||
new Setting(sectionEl)
|
||||
.setName(t('show_note_in_grid'))
|
||||
.setDesc(t('show_note_in_grid_desc'))
|
||||
.addToggle(toggle => {
|
||||
|
|
@ -716,7 +731,7 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
});
|
||||
|
||||
// 設定開啟筆記的方式
|
||||
new Setting(containerEl)
|
||||
new Setting(sectionEl)
|
||||
.setName(t('open_note_layout'))
|
||||
.setDesc(t('open_note_layout_desc'))
|
||||
.addDropdown(dropdown => {
|
||||
|
|
@ -733,7 +748,7 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
});
|
||||
|
||||
// 筆記標題欄位名稱設定
|
||||
new Setting(containerEl)
|
||||
new Setting(sectionEl)
|
||||
.setName(t('note_title_field'))
|
||||
.setDesc(t('note_title_field_desc'))
|
||||
.addText(text => text
|
||||
|
|
@ -745,7 +760,7 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
}));
|
||||
|
||||
// 筆記摘要欄位名稱設定
|
||||
new Setting(containerEl)
|
||||
new Setting(sectionEl)
|
||||
.setName(t('note_summary_field'))
|
||||
.setDesc(t('note_summary_field_desc'))
|
||||
.addText(text => text
|
||||
|
|
@ -757,7 +772,7 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
}));
|
||||
|
||||
// 修改時間欄位名稱設定
|
||||
new Setting(containerEl)
|
||||
new Setting(sectionEl)
|
||||
.setName(t('modified_date_field'))
|
||||
.setDesc(t('modified_date_field_desc'))
|
||||
.addText(text => text
|
||||
|
|
@ -769,7 +784,7 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
}));
|
||||
|
||||
// 建立時間欄位名稱設定
|
||||
new Setting(containerEl)
|
||||
new Setting(sectionEl)
|
||||
.setName(t('created_date_field'))
|
||||
.setDesc(t('created_date_field_desc'))
|
||||
.addText(text => text
|
||||
|
|
@ -781,7 +796,7 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
}));
|
||||
|
||||
// 自訂文件副檔名設定
|
||||
new Setting(containerEl)
|
||||
new Setting(sectionEl)
|
||||
.setName(t('custom_document_extensions'))
|
||||
.setDesc(t('custom_document_extensions_desc'))
|
||||
.addText(text => {
|
||||
|
|
@ -795,7 +810,7 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
});
|
||||
|
||||
// 自訂資料夾圖示
|
||||
new Setting(containerEl)
|
||||
new Setting(sectionEl)
|
||||
.setName(t('custom_folder_icon'))
|
||||
.setDesc(t('custom_folder_icon_desc'))
|
||||
.addText(text => {
|
||||
|
|
@ -808,7 +823,7 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
});
|
||||
|
||||
// 檔案監控功能設定
|
||||
new Setting(containerEl)
|
||||
new Setting(sectionEl)
|
||||
.setName(t('enable_file_watcher'))
|
||||
.setDesc(t('enable_file_watcher_desc'))
|
||||
.addToggle(toggle => {
|
||||
|
|
@ -821,7 +836,7 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
});
|
||||
|
||||
// 攔截所有tag點擊事件
|
||||
new Setting(containerEl)
|
||||
new Setting(sectionEl)
|
||||
.setName(t('intercept_all_tag_clicks'))
|
||||
.setDesc(t('intercept_all_tag_clicks_desc'))
|
||||
.addToggle(toggle => {
|
||||
|
|
@ -834,7 +849,7 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
});
|
||||
|
||||
// 攔截Breadcrumb點擊事件
|
||||
new Setting(containerEl)
|
||||
new Setting(sectionEl)
|
||||
.setName(t('intercept_breadcrumb_clicks'))
|
||||
.setDesc(t('intercept_breadcrumb_clicks_desc'))
|
||||
.addToggle(toggle => {
|
||||
|
|
@ -847,11 +862,11 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
});
|
||||
|
||||
|
||||
// 網格項目樣式設定標題
|
||||
containerEl.createEl('h3', { text: t('grid_item_style_settings'), attr: { style: 'margin-top: 40px;' } });
|
||||
// 網格項目樣式設定
|
||||
sectionEl = this.createSection(t('grid_item_style_settings'));
|
||||
|
||||
// 卡片版面設定
|
||||
new Setting(containerEl)
|
||||
new Setting(sectionEl)
|
||||
.setName(t('card_layout'))
|
||||
.setDesc(t('card_layout_desc'))
|
||||
.addDropdown(drop => {
|
||||
|
|
@ -865,7 +880,7 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
});
|
||||
|
||||
// 顯示筆記標籤設定
|
||||
new Setting(containerEl)
|
||||
new Setting(sectionEl)
|
||||
.setName(t('show_note_tags'))
|
||||
.setDesc(t('show_note_tags_desc'))
|
||||
.addToggle(toggle => {
|
||||
|
|
@ -878,7 +893,7 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
});
|
||||
|
||||
// 網格項目寬度設定
|
||||
const gridItemWidthSetting = new Setting(containerEl)
|
||||
const gridItemWidthSetting = new Setting(sectionEl)
|
||||
.setName(`${t('horizontal_card')} ${t('grid_item_width')}`)
|
||||
.setDesc(`${t('grid_item_width_desc')} (now: ${this.plugin.settings.gridItemWidth}px)`)
|
||||
.addSlider(slider => {
|
||||
|
|
@ -894,7 +909,7 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
});
|
||||
|
||||
// 網格項目高度設定
|
||||
const gridItemHeightSetting = new Setting(containerEl)
|
||||
const gridItemHeightSetting = new Setting(sectionEl)
|
||||
.setName(`${t('horizontal_card')} ${t('grid_item_height')}`)
|
||||
.setDesc(`${t('grid_item_height_desc')} (now: ${this.plugin.settings.gridItemHeight === 0 ? 'auto' : this.plugin.settings.gridItemHeight})`)
|
||||
.addSlider(slider => {
|
||||
|
|
@ -910,7 +925,7 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
});
|
||||
|
||||
// 圖片區域寬度設定
|
||||
const imageAreaWidthSetting = new Setting(containerEl)
|
||||
const imageAreaWidthSetting = new Setting(sectionEl)
|
||||
.setName(`${t('horizontal_card')} ${t('image_area_width')}`)
|
||||
.setDesc(`${t('image_area_width_desc')} (now: ${this.plugin.settings.imageAreaWidth}px)`)
|
||||
.addSlider(slider => {
|
||||
|
|
@ -926,7 +941,7 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
});
|
||||
|
||||
// 圖片區域高度設定
|
||||
const imageAreaHeightSetting = new Setting(containerEl)
|
||||
const imageAreaHeightSetting = new Setting(sectionEl)
|
||||
.setName(`${t('horizontal_card')} ${t('image_area_height')}`)
|
||||
.setDesc(`${t('image_area_height_desc')} (now: ${this.plugin.settings.imageAreaHeight}px)`)
|
||||
.addSlider(slider => {
|
||||
|
|
@ -942,7 +957,7 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
});
|
||||
|
||||
// 直向卡片 - 網格項目寬度
|
||||
const vGridItemWidthSetting = new Setting(containerEl)
|
||||
const vGridItemWidthSetting = new Setting(sectionEl)
|
||||
.setName(`${t('vertical_card')} ${t('grid_item_width')}`)
|
||||
.setDesc(`${t('grid_item_width_desc')} (now: ${this.plugin.settings.verticalGridItemWidth}px)`)
|
||||
.addSlider(slider => {
|
||||
|
|
@ -957,7 +972,7 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
});
|
||||
|
||||
// 直向卡片 - 網格項目高度
|
||||
const vGridItemHeightSetting = new Setting(containerEl)
|
||||
const vGridItemHeightSetting = new Setting(sectionEl)
|
||||
.setName(`${t('vertical_card')} ${t('grid_item_height')}`)
|
||||
.setDesc(`${t('grid_item_height_desc')} (now: ${this.plugin.settings.verticalGridItemHeight}px)`)
|
||||
.addSlider(slider => {
|
||||
|
|
@ -972,7 +987,7 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
});
|
||||
|
||||
// 直向卡片 - 圖片區域高度
|
||||
const vImageAreaHeightSetting = new Setting(containerEl)
|
||||
const vImageAreaHeightSetting = new Setting(sectionEl)
|
||||
.setName(`${t('vertical_card')} ${t('image_area_height')}`)
|
||||
.setDesc(`${t('image_area_height_desc')} (now: ${this.plugin.settings.verticalImageAreaHeight}px)`)
|
||||
.addSlider(slider => {
|
||||
|
|
@ -987,7 +1002,7 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
});
|
||||
|
||||
// 直向卡片圖片位置
|
||||
new Setting(containerEl)
|
||||
new Setting(sectionEl)
|
||||
.setName(`${t('vertical_card')} ${t('image_position')}`)
|
||||
.setDesc(t('image_position_desc'))
|
||||
.addDropdown(dropdown => {
|
||||
|
|
@ -1001,7 +1016,7 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
});
|
||||
|
||||
//筆記標題的字型大小
|
||||
const titleFontSizeSetting = new Setting(containerEl)
|
||||
const titleFontSizeSetting = new Setting(sectionEl)
|
||||
.setName(t('title_font_size'))
|
||||
.setDesc(`${t('title_font_size_desc')} (now: ${this.plugin.settings.titleFontSize.toFixed(2)})`)
|
||||
.addSlider(slider => {
|
||||
|
|
@ -1017,7 +1032,7 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
});
|
||||
|
||||
// 標題支援多行顯示
|
||||
new Setting(containerEl)
|
||||
new Setting(sectionEl)
|
||||
.setName(t('multi_line_title'))
|
||||
.setDesc(t('multi_line_title_desc'))
|
||||
.addToggle(toggle => {
|
||||
|
|
@ -1030,7 +1045,7 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
});
|
||||
|
||||
// 筆記摘要的字數設定
|
||||
const summaryLengthSetting = new Setting(containerEl)
|
||||
const summaryLengthSetting = new Setting(sectionEl)
|
||||
.setName(t('summary_length'))
|
||||
.setDesc(`${t('summary_length_desc')} (now: ${this.plugin.settings.summaryLength})`)
|
||||
.addSlider(slider => {
|
||||
|
|
@ -1046,7 +1061,7 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
});
|
||||
|
||||
// 是否在摘要中顯示程式碼區塊
|
||||
new Setting(containerEl)
|
||||
new Setting(sectionEl)
|
||||
.setName(t('show_code_block_in_summary'))
|
||||
.setDesc(t('show_code_block_in_summary_desc'))
|
||||
.addToggle(toggle => toggle
|
||||
|
|
@ -1058,10 +1073,10 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
|
||||
|
||||
// 搜尋設定區域
|
||||
containerEl.createEl('h3', { text: t('default_search_option'), attr: { style: 'margin-top: 40px;' } });
|
||||
sectionEl = this.createSection(t('default_search_option'));
|
||||
|
||||
// 是否只搜尋當前位置
|
||||
new Setting(containerEl)
|
||||
new Setting(sectionEl)
|
||||
.setName(t('search_current_location_only'))
|
||||
.addToggle(toggle => {
|
||||
toggle
|
||||
|
|
@ -1073,7 +1088,7 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
});
|
||||
|
||||
// 是否只搜尋筆記名稱
|
||||
new Setting(containerEl)
|
||||
new Setting(sectionEl)
|
||||
.setName(t('search_files_name_only'))
|
||||
.addToggle(toggle => {
|
||||
toggle
|
||||
|
|
@ -1085,7 +1100,7 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
});
|
||||
|
||||
// 是否搜尋媒體檔案
|
||||
new Setting(containerEl)
|
||||
new Setting(sectionEl)
|
||||
.setName(t('search_media_files'))
|
||||
.addToggle(toggle => {
|
||||
toggle
|
||||
|
|
@ -1098,10 +1113,10 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
|
||||
|
||||
// 資料夾筆記設定區域
|
||||
containerEl.createEl('h3', { text: t('folder_note_settings'), attr: { style: 'margin-top: 40px;' } });
|
||||
sectionEl = this.createSection(t('folder_note_settings'));
|
||||
|
||||
// 資料夾筆記設定 (預設、置頂、隱藏)
|
||||
new Setting(containerEl)
|
||||
new Setting(sectionEl)
|
||||
.setName(t('foldernote_display_settings'))
|
||||
.setDesc(t('foldernote_display_settings_desc'))
|
||||
.addDropdown(dropdown => {
|
||||
|
|
@ -1117,10 +1132,10 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
});
|
||||
|
||||
// Quick Access Settings
|
||||
containerEl.createEl('h3', { text: t('quick_access_settings_title'), attr: { style: 'margin-top: 40px;' } });
|
||||
sectionEl = this.createSection(t('quick_access_settings_title'));
|
||||
|
||||
// Quick Access Folder Setting
|
||||
new Setting(containerEl)
|
||||
new Setting(sectionEl)
|
||||
.setName(t('quick_access_folder_name'))
|
||||
.setDesc(t('quick_access_folder_desc'))
|
||||
.addText(text => {
|
||||
|
|
@ -1135,7 +1150,7 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
|
||||
|
||||
// Quick Access View Setting
|
||||
new Setting(containerEl)
|
||||
new Setting(sectionEl)
|
||||
.setName(t('quick_access_mode_name'))
|
||||
.setDesc(t('quick_access_mode_desc'))
|
||||
.addDropdown(dropdown => {
|
||||
|
|
@ -1159,7 +1174,7 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
});
|
||||
|
||||
// Use Quick Access as a new tab view
|
||||
new Setting(containerEl)
|
||||
new Setting(sectionEl)
|
||||
.setName(t('use_quick_access_as_new_tab_view'))
|
||||
.setDesc(t('use_quick_access_as_new_tab_view_desc'))
|
||||
.addDropdown(dropdown => {
|
||||
|
|
@ -1175,12 +1190,12 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
});
|
||||
|
||||
// 忽略資料夾設定區域
|
||||
containerEl.createEl('h3', { text: t('ignored_folders_settings'), attr: { style: 'margin-top: 40px;' } });
|
||||
sectionEl = this.createSection(t('ignored_folders_settings'));
|
||||
|
||||
// 忽略的資料夾設定
|
||||
const ignoredFoldersContainer = containerEl.createDiv('ignored-folders-container');
|
||||
const ignoredFoldersContainer = sectionEl.createDiv('ignored-folders-container');
|
||||
|
||||
new Setting(containerEl)
|
||||
new Setting(sectionEl)
|
||||
.setName(t('ignored_folders'))
|
||||
.setDesc(t('ignored_folders_desc'))
|
||||
.setHeading();
|
||||
|
|
@ -1197,12 +1212,12 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
const ignoredFoldersList = ignoredFoldersContainer.createDiv('ge-ignored-folders-list');
|
||||
this.renderIgnoredFoldersList(ignoredFoldersList);
|
||||
|
||||
containerEl.appendChild(ignoredFoldersContainer);
|
||||
sectionEl.appendChild(ignoredFoldersContainer);
|
||||
|
||||
// 以字串忽略資料夾(可用正則表達式)設定
|
||||
const ignoredFolderPatternsContainer = containerEl.createDiv('ignored-folder-patterns-container');
|
||||
const ignoredFolderPatternsContainer = sectionEl.createDiv('ignored-folder-patterns-container');
|
||||
|
||||
new Setting(containerEl)
|
||||
new Setting(sectionEl)
|
||||
.setName(t('ignored_folder_patterns'))
|
||||
.setDesc(t('ignored_folder_patterns_desc'))
|
||||
.setHeading();
|
||||
|
|
@ -1248,12 +1263,12 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
const ignoredFolderPatternsList = ignoredFolderPatternsContainer.createDiv('ge-ignored-folder-patterns-list');
|
||||
this.renderIgnoredFolderPatternsList(ignoredFolderPatternsList);
|
||||
|
||||
containerEl.appendChild(ignoredFolderPatternsContainer);
|
||||
sectionEl.appendChild(ignoredFolderPatternsContainer);
|
||||
|
||||
// 設定檔管理 (Reset / Export / Import)
|
||||
containerEl.createEl('h3', { text: t('config_management'), attr: { style: 'margin-top: 40px;' } });
|
||||
sectionEl = this.createSection(t('config_management'));
|
||||
|
||||
new Setting(containerEl)
|
||||
new Setting(sectionEl)
|
||||
.setName(t('config_management'))
|
||||
.setDesc(t('config_management_desc'))
|
||||
// Reset to default
|
||||
|
|
@ -1375,7 +1390,7 @@ export class GridExplorerSettingTab extends PluginSettingTab {
|
|||
|
||||
// 重新渲染列表
|
||||
this.renderIgnoredFoldersList(containerEl);
|
||||
this.display();
|
||||
// this.display();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -88,8 +88,8 @@ export default {
|
|||
'ignored_folders_desc': 'Set folders to ignore here',
|
||||
'add_ignored_folder': 'Add ignored folder',
|
||||
'no_ignored_folders': 'No ignored folders.',
|
||||
'ignored_folder_patterns': 'Ignore folders and files by pattern',
|
||||
'ignored_folder_patterns_desc': 'Use string patterns to ignore folders and files (supports regular expressions)',
|
||||
'ignored_folder_patterns': 'Ignore folders by pattern',
|
||||
'ignored_folder_patterns_desc': 'Use string patterns to ignore folders (supports regular expressions)',
|
||||
'add_ignored_folder_pattern': 'Add folder pattern',
|
||||
'ignored_folder_pattern_placeholder': 'Enter folder name or regex pattern',
|
||||
'no_ignored_folder_patterns': 'No ignored folder patterns.',
|
||||
|
|
@ -214,7 +214,7 @@ export default {
|
|||
'open_new_grid_view': 'Open new grid view',
|
||||
'open_in_new_grid_view': 'Open in new grid view',
|
||||
'min_mode': 'Minimize mode',
|
||||
'show_ignored_folders': 'Show ignored folders',
|
||||
'show_ignored_items': 'Show ignored folders and files',
|
||||
'delete_note': 'Delete file',
|
||||
'open_folder_note': 'Open folder note',
|
||||
'create_folder_note': 'Create folder note',
|
||||
|
|
@ -285,7 +285,9 @@ export default {
|
|||
'foldernote_pinned': 'Folder note pinned',
|
||||
'foldernote_pinned_desc': 'Pin this folder note at the top',
|
||||
'display_minimized': 'Display minimized',
|
||||
'display_minimized_desc': 'Show this note in minimized mode',
|
||||
'display_minimized_desc': 'Display this note in minimized mode',
|
||||
'display_hidden': 'Hide file',
|
||||
'display_hidden_desc': 'Hide this file in grid view',
|
||||
|
||||
// Quick Access Settings and Commands
|
||||
'quick_access_settings_title': 'Quick Access Settings',
|
||||
|
|
|
|||
|
|
@ -213,7 +213,7 @@ export default {
|
|||
'open_new_grid_view': '新しいグリッドビューを開く',
|
||||
'open_in_new_grid_view': '新しいグリッドビューで開く',
|
||||
'min_mode': '最小化モード',
|
||||
'show_ignored_folders': '無視するフォルダーを表示',
|
||||
'show_ignored_items': '無視するフォルダーとファイルを表示',
|
||||
'delete_note': 'ファイルを削除',
|
||||
'open_folder_note': 'フォルダーノートを開く',
|
||||
'create_folder_note': 'フォルダーノートを作成',
|
||||
|
|
@ -285,6 +285,8 @@ export default {
|
|||
'foldernote_pinned_desc': 'フォルダーノートを最上部に固定',
|
||||
'display_minimized': '最小化表示',
|
||||
'display_minimized_desc': 'このノートを最小化モードで表示',
|
||||
'display_hidden': 'ファイルを非表示',
|
||||
'display_hidden_desc': 'グリッドビューでこのファイルを非表示',
|
||||
|
||||
// Quick Access Settings and Commands
|
||||
'quick_access_settings_title': 'クイックアクセス設定',
|
||||
|
|
|
|||
|
|
@ -88,8 +88,8 @@ export default {
|
|||
'ignored_folders_desc': '여기에서 무시할 폴더 설정',
|
||||
'add_ignored_folder': '무시된 폴더 추가',
|
||||
'no_ignored_folders': '무시된 폴더가 없습니다.',
|
||||
'ignored_folder_patterns': '패턴으로 폴더 및 파일 무시',
|
||||
'ignored_folder_patterns_desc': '문자열 패턴을 사용하여 폴더 및 파일 무시 (정규식 지원)',
|
||||
'ignored_folder_patterns': '패턴으로 폴더 무시',
|
||||
'ignored_folder_patterns_desc': '문자열 패턴을 사용하여 폴더 무시 (정규 표현식 지원)',
|
||||
'add_ignored_folder_pattern': '폴더 패턴 추가',
|
||||
'ignored_folder_pattern_placeholder': '폴더 이름 또는 정규식 패턴 입력',
|
||||
'no_ignored_folder_patterns': '무시된 폴더 패턴이 없습니다.',
|
||||
|
|
@ -214,7 +214,7 @@ export default {
|
|||
'open_new_grid_view': '새 그리드 뷰 열기',
|
||||
'open_in_new_grid_view': '새 그리드 뷰에서 열기',
|
||||
'min_mode': '최소화 모드',
|
||||
'show_ignored_folders': '무시된 폴더 표시',
|
||||
'show_ignored_items': '무시된 폴더 및 파일 표시',
|
||||
'delete_note': '파일 삭제',
|
||||
'open_folder_note': '폴더 노트 열기',
|
||||
'create_folder_note': '폴더 노트 만들기',
|
||||
|
|
@ -286,6 +286,8 @@ export default {
|
|||
'foldernote_pinned_desc': '이 폴더 노트를 맨 위에 고정',
|
||||
'display_minimized': '최소화 표시',
|
||||
'display_minimized_desc': '이 노트를 최소화 모드로 표시',
|
||||
'display_hidden': '파일 숨기기',
|
||||
'display_hidden_desc': '그리드 뷰에서 이 파일을 숨깁니다',
|
||||
|
||||
// Quick Access Settings and Commands
|
||||
'quick_access_settings_title': '빠른 액세스 설정',
|
||||
|
|
|
|||
|
|
@ -87,8 +87,8 @@ export default {
|
|||
'ignored_folders_desc': 'Укажите папки для игнорирования здесь',
|
||||
'add_ignored_folder': 'Добавить игнорируемую папку',
|
||||
'no_ignored_folders': 'Нет игнорируемых папок.',
|
||||
'ignored_folder_patterns': 'Игнорировать папки и файлы по шаблону',
|
||||
'ignored_folder_patterns_desc': 'Используйте строковые шаблоны для игнорирования папок и файлов (поддерживает регулярные выражения)',
|
||||
'ignored_folder_patterns': 'Игнорировать папки по шаблону',
|
||||
'ignored_folder_patterns_desc': 'Используйте строковые шаблоны для игнорирования папок (поддерживает регулярные выражения)',
|
||||
'add_ignored_folder_pattern': 'Добавить шаблон папки',
|
||||
'ignored_folder_pattern_placeholder': 'Введите имя папки или шаблон регулярного выражения',
|
||||
'no_ignored_folder_patterns': 'Нет шаблонов игнорируемых папок.',
|
||||
|
|
@ -213,7 +213,7 @@ export default {
|
|||
'open_new_grid_view': 'Открыть новый сеточный вид',
|
||||
'open_in_new_grid_view': 'Открыть в новом сеточном виде',
|
||||
'min_mode': 'Минимизировать вид',
|
||||
'show_ignored_folders': 'Показать игнорируемые папки',
|
||||
'show_ignored_items': 'Показать игнорируемые папки и файлы',
|
||||
'delete_note': 'Удалить файл',
|
||||
'open_folder_note': 'Открыть заметку папки',
|
||||
'create_folder_note': 'Создать заметку папки',
|
||||
|
|
@ -284,7 +284,9 @@ export default {
|
|||
'foldernote_pinned': 'Закрепить заметки папки',
|
||||
'foldernote_pinned_desc': 'Закрепить заметки папки вверху',
|
||||
'display_minimized': 'Минимальный вид',
|
||||
'display_minimized_desc': 'Показывать эту заметку в минимальном режиме',
|
||||
'display_minimized_desc': 'Показывать эту заметку в минимизированном режиме',
|
||||
'display_hidden': 'Скрыть файл',
|
||||
'display_hidden_desc': 'Скрыть этот файл в сеточном виде',
|
||||
|
||||
// Quick Access Settings and Commands
|
||||
'quick_access_settings_title': 'Настройки Быстрого доступа',
|
||||
|
|
|
|||
|
|
@ -87,8 +87,8 @@ export default {
|
|||
'ignored_folders_desc': 'Вкажіть папки для ігнорування тут',
|
||||
'add_ignored_folder': 'Додати ігноровану папку',
|
||||
'no_ignored_folders': 'Немає ігнорованих папок.',
|
||||
'ignored_folder_patterns': 'Ігнорувати папки та файли за шаблоном',
|
||||
'ignored_folder_patterns_desc': 'Використовуйте рядкові шаблони для ігнорування папок та файлів (підтримує регулярні вирази)',
|
||||
'ignored_folder_patterns': 'Ігнорувати папки за шаблоном',
|
||||
'ignored_folder_patterns_desc': 'Використовуйте рядкові шаблони для ігнорування папок (підтримує регулярні вирази)',
|
||||
'add_ignored_folder_pattern': 'Додати шаблон папки',
|
||||
'ignored_folder_pattern_placeholder': 'Введіть назву папки або регулярний вираз',
|
||||
'no_ignored_folder_patterns': 'Немає шаблонів ігнорованих папок.',
|
||||
|
|
@ -213,7 +213,7 @@ export default {
|
|||
'open_new_grid_view': 'Відкрити новий сітковий вигляд',
|
||||
'open_in_new_grid_view': 'Відкрити в новому сітковому вигляді',
|
||||
'min_mode': 'Мінімізувати режим',
|
||||
'show_ignored_folders': 'Показати ігноровані папки',
|
||||
'show_ignored_items': 'Показати ігноровані папки та файли',
|
||||
'delete_note': 'Видалити файл',
|
||||
'open_folder_note': 'Відкрити нотатку папки',
|
||||
'create_folder_note': 'Створити нотатку папки',
|
||||
|
|
@ -283,8 +283,10 @@ export default {
|
|||
'pinned_desc': 'Закріпити цей файл нагорі',
|
||||
'foldernote_pinned': 'Нотатку папки закріплено',
|
||||
'foldernote_pinned_desc': 'Закріпити нотатку папки нагорі',
|
||||
'display_minimized': 'Мінімізований вигляд',
|
||||
'display_minimized_desc': 'Показати цю нотатку в мінімізованому режимі',
|
||||
'display_minimized': 'Мінімізувати відображення',
|
||||
'display_minimized_desc': 'Відобразити цю нотатку в мінімізованому режимі',
|
||||
'display_hidden': 'Приховати файл',
|
||||
'display_hidden_desc': 'Приховати цей файл у сітковому вигляді',
|
||||
|
||||
// Quick Access Settings and Commands
|
||||
'quick_access_settings_title': 'Налаштування швидкого доступу',
|
||||
|
|
|
|||
|
|
@ -88,8 +88,8 @@ export default {
|
|||
'ignored_folders_desc': '在這裡設定要忽略的資料夾',
|
||||
'add_ignored_folder': '新增忽略資料夾',
|
||||
'no_ignored_folders': '沒有忽略的資料夾。',
|
||||
'ignored_folder_patterns': '以字串忽略資料夾和檔案',
|
||||
'ignored_folder_patterns_desc': '使用字串模式忽略資料夾和檔案(支援正則表達式)',
|
||||
'ignored_folder_patterns': '以字串忽略資料夾',
|
||||
'ignored_folder_patterns_desc': '使用字串模式忽略資料夾(支援正則表達式)',
|
||||
'add_ignored_folder_pattern': '新增忽略資料夾模式',
|
||||
'ignored_folder_pattern_placeholder': '輸入資料夾名稱或正則表達式',
|
||||
'no_ignored_folder_patterns': '沒有忽略的資料夾模式。',
|
||||
|
|
@ -214,7 +214,7 @@ export default {
|
|||
'open_new_grid_view': '開啟新網格視圖',
|
||||
'open_in_new_grid_view': '在新網格視圖中開啟',
|
||||
'min_mode': '最小化模式',
|
||||
'show_ignored_folders': '顯示忽略的資料夾',
|
||||
'show_ignored_items': '顯示忽略的資料夾及檔案',
|
||||
'delete_note': '刪除檔案',
|
||||
'open_folder_note': '開啟資料夾筆記',
|
||||
'create_folder_note': '建立資料夾筆記',
|
||||
|
|
@ -286,6 +286,8 @@ export default {
|
|||
'foldernote_pinned_desc': '將資料夾筆記固定在最上方',
|
||||
'display_minimized': '最小化顯示',
|
||||
'display_minimized_desc': '將此筆記以最小化方式顯示',
|
||||
'display_hidden': '隱藏檔案',
|
||||
'display_hidden_desc': '在網格視圖中隱藏此檔案',
|
||||
|
||||
// Quick Access Settings and Commands
|
||||
'quick_access_settings_title': '快速存取設定',
|
||||
|
|
|
|||
|
|
@ -87,8 +87,8 @@ export default {
|
|||
'ignored_folders_desc': '在这里设置要忽略的文件夹',
|
||||
'add_ignored_folder': '添加忽略文件夹',
|
||||
'no_ignored_folders': '没有忽略的文件夹。',
|
||||
'ignored_folder_patterns': '以字符串忽略文件夹和文件',
|
||||
'ignored_folder_patterns_desc': '使用字符串模式忽略文件夹和文件(支持正则表达式)',
|
||||
'ignored_folder_patterns': '以字符串忽略文件夹',
|
||||
'ignored_folder_patterns_desc': '使用字符串模式忽略文件夹(支持正则表达式)',
|
||||
'add_ignored_folder_pattern': '添加忽略文件夹模式',
|
||||
'ignored_folder_pattern_placeholder': '输入文件夹名称或正则表达式',
|
||||
'no_ignored_folder_patterns': '没有忽略的文件夹模式。',
|
||||
|
|
@ -213,7 +213,7 @@ export default {
|
|||
'open_new_grid_view': '打开新网格视图',
|
||||
'open_in_new_grid_view': '在新网格视图中打开',
|
||||
'min_mode': '最小化模式',
|
||||
'show_ignored_folders': '显示忽略的文件夹',
|
||||
'show_ignored_items': '显示忽略的文件夹及文件',
|
||||
'delete_note': '删除文件',
|
||||
'open_folder_note': '打开文件夹笔记',
|
||||
'create_folder_note': '创建文件夹笔记',
|
||||
|
|
@ -285,6 +285,8 @@ export default {
|
|||
'foldernote_pinned_desc': '将文件夹笔记固定在顶部',
|
||||
'display_minimized': '最小化显示',
|
||||
'display_minimized_desc': '将此笔记以最小化方式显示',
|
||||
'display_hidden': '隐藏文件',
|
||||
'display_hidden_desc': '在网格视图中隐藏此文件',
|
||||
|
||||
// Quick Access Settings and Commands
|
||||
'quick_access_settings_title': '快速访问设置',
|
||||
|
|
|
|||
|
|
@ -202,8 +202,8 @@ export function isFolderIgnored(folder: TFolder, ignoredFolders: string[], ignor
|
|||
export function ignoredFiles(files: TFile[], gridView: GridView): TFile[] {
|
||||
const settings = gridView.plugin.settings;
|
||||
|
||||
// 如果開啟顯示忽略資料夾模式,則顯示所有檔案
|
||||
if (gridView.showIgnoredFolders) {
|
||||
// 如果開啟顯示忽略項目模式,則顯示所有檔案
|
||||
if (gridView.showIgnoredItems) {
|
||||
return files;
|
||||
}
|
||||
|
||||
|
|
@ -211,9 +211,19 @@ export function ignoredFiles(files: TFile[], gridView: GridView): TFile[] {
|
|||
const folderCache: {[path: string]: boolean} = {};
|
||||
|
||||
return files.filter(file => {
|
||||
// 檢查檔案的 metadata 是否有 hidden: true
|
||||
if (file.extension === 'md') {
|
||||
const metadata = gridView.app.metadataCache.getFileCache(file)?.frontmatter;
|
||||
const displayValue = metadata?.display;
|
||||
if (displayValue === 'hidden') {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// 獲取檔案所在的資料夾路徑
|
||||
const folderPath = file.parent?.path || '/';
|
||||
|
||||
|
||||
// 如果快取中沒有這個資料夾的檢查結果,則進行檢查
|
||||
if (folderCache[folderPath] === undefined) {
|
||||
// 獲取資料夾對象
|
||||
|
|
|
|||
232
styles.css
232
styles.css
|
|
@ -416,69 +416,83 @@
|
|||
|
||||
/* 資料夾和筆記顏色 Folder & Note Colors */
|
||||
.ge-grid-item.ge-folder-item.ge-folder-color-red,
|
||||
.ge-grid-item.ge-note-color-red {
|
||||
background-color: rgba(var(--color-red-rgb), 0.2);
|
||||
.ge-grid-item.ge-note-color-red {
|
||||
background-color: rgba(var(--color-red-rgb), 0.2);
|
||||
border-color: rgba(var(--color-red-rgb), 0.5);
|
||||
}
|
||||
|
||||
.ge-grid-item.ge-folder-item.ge-folder-color-orange,
|
||||
.ge-grid-item.ge-note-color-orange {
|
||||
background-color: rgba(var(--color-orange-rgb), 0.2);
|
||||
border-color: rgba(var(--color-orange-rgb), 0.5);
|
||||
.ge-grid-item.ge-note-color-orange {
|
||||
background-color: rgba(var(--color-orange-rgb), 0.2);
|
||||
border-color: rgba(var(--color-orange-rgb), 0.5);
|
||||
}
|
||||
|
||||
.ge-grid-item.ge-folder-item.ge-folder-color-yellow,
|
||||
.ge-grid-item.ge-note-color-yellow {
|
||||
background-color: rgba(var(--color-yellow-rgb), 0.2);
|
||||
border-color: rgba(var(--color-yellow-rgb), 0.5);
|
||||
.ge-grid-item.ge-note-color-yellow {
|
||||
background-color: rgba(var(--color-yellow-rgb), 0.2);
|
||||
border-color: rgba(var(--color-yellow-rgb), 0.5);
|
||||
}
|
||||
|
||||
.ge-grid-item.ge-folder-item.ge-folder-color-green,
|
||||
.ge-grid-item.ge-note-color-green {
|
||||
background-color: rgba(var(--color-green-rgb), 0.2);
|
||||
border-color: rgba(var(--color-green-rgb), 0.5);
|
||||
.ge-grid-item.ge-note-color-green {
|
||||
background-color: rgba(var(--color-green-rgb), 0.2);
|
||||
border-color: rgba(var(--color-green-rgb), 0.5);
|
||||
}
|
||||
|
||||
.ge-grid-item.ge-folder-item.ge-folder-color-cyan,
|
||||
.ge-grid-item.ge-note-color-cyan {
|
||||
background-color: rgba(var(--color-cyan-rgb), 0.2);
|
||||
border-color: rgba(var(--color-cyan-rgb), 0.5);
|
||||
.ge-grid-item.ge-note-color-cyan {
|
||||
background-color: rgba(var(--color-cyan-rgb), 0.2);
|
||||
border-color: rgba(var(--color-cyan-rgb), 0.5);
|
||||
}
|
||||
|
||||
.ge-grid-item.ge-folder-item.ge-folder-color-blue,
|
||||
.ge-grid-item.ge-note-color-blue {
|
||||
background-color: rgba(var(--color-blue-rgb), 0.2);
|
||||
border-color: rgba(var(--color-blue-rgb), 0.5);
|
||||
.ge-grid-item.ge-note-color-blue {
|
||||
background-color: rgba(var(--color-blue-rgb), 0.2);
|
||||
border-color: rgba(var(--color-blue-rgb), 0.5);
|
||||
}
|
||||
|
||||
.ge-grid-item.ge-folder-item.ge-folder-color-purple,
|
||||
.ge-grid-item.ge-note-color-purple {
|
||||
background-color: rgba(var(--color-purple-rgb), 0.2);
|
||||
border-color: rgba(var(--color-purple-rgb), 0.5);
|
||||
.ge-grid-item.ge-note-color-purple {
|
||||
background-color: rgba(var(--color-purple-rgb), 0.2);
|
||||
border-color: rgba(var(--color-purple-rgb), 0.5);
|
||||
}
|
||||
|
||||
.ge-grid-item.ge-folder-item.ge-folder-color-pink,
|
||||
.ge-grid-item.ge-note-color-pink {
|
||||
background-color: rgba(var(--color-pink-rgb), 0.2);
|
||||
border-color: rgba(var(--color-pink-rgb), 0.5);
|
||||
.ge-grid-item.ge-note-color-pink {
|
||||
background-color: rgba(var(--color-pink-rgb), 0.2);
|
||||
border-color: rgba(var(--color-pink-rgb), 0.5);
|
||||
}
|
||||
|
||||
/* 筆記文字顏色 Note Text Color */
|
||||
.ge-note-color-red-text {
|
||||
.ge-note-color-red-text {
|
||||
color: rgba(var(--color-red-rgb), 0.7) !important;
|
||||
}
|
||||
.ge-note-color-orange-text {
|
||||
|
||||
.ge-note-color-orange-text {
|
||||
color: rgba(var(--color-orange-rgb), 0.7) !important;
|
||||
}
|
||||
.ge-note-color-yellow-text {
|
||||
|
||||
.ge-note-color-yellow-text {
|
||||
color: rgba(var(--color-yellow-rgb), 0.7) !important;
|
||||
}
|
||||
.ge-note-color-green-text {
|
||||
|
||||
.ge-note-color-green-text {
|
||||
color: rgba(var(--color-green-rgb), 0.7) !important;
|
||||
}
|
||||
.ge-note-color-cyan-text {
|
||||
|
||||
.ge-note-color-cyan-text {
|
||||
color: rgba(var(--color-cyan-rgb), 0.7) !important;
|
||||
}
|
||||
.ge-note-color-blue-text {
|
||||
|
||||
.ge-note-color-blue-text {
|
||||
color: rgba(var(--color-blue-rgb), 0.7) !important;
|
||||
}
|
||||
.ge-note-color-purple-text {
|
||||
|
||||
.ge-note-color-purple-text {
|
||||
color: rgba(var(--color-purple-rgb), 0.7) !important;
|
||||
}
|
||||
.ge-note-color-pink-text {
|
||||
|
||||
.ge-note-color-pink-text {
|
||||
color: rgba(var(--color-pink-rgb), 0.7) !important;
|
||||
}
|
||||
|
||||
|
|
@ -497,6 +511,27 @@
|
|||
border-color: var(--ge-folder-color-border);
|
||||
}
|
||||
|
||||
/* 隱藏的筆記樣式 Hidden Note Style */
|
||||
.ge-grid-item.ge-note-hidden {
|
||||
opacity: 0.5;
|
||||
border-style: dashed;
|
||||
border-width: 2px;
|
||||
background-color: var(--background-modifier-border);
|
||||
}
|
||||
|
||||
.ge-grid-item.ge-note-hidden:hover {
|
||||
opacity: 0.7;
|
||||
}
|
||||
|
||||
.ge-grid-item.ge-note-hidden .ge-title {
|
||||
color: var(--text-muted);
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.ge-grid-item.ge-note-hidden .ge-content-area p {
|
||||
color: var(--text-faint);
|
||||
}
|
||||
|
||||
/* 資料夾上的資料夾筆記按鈕 Folder Note Button */
|
||||
.ge-foldernote-button {
|
||||
color: var(--text-muted);
|
||||
|
|
@ -653,7 +688,7 @@
|
|||
gap: 7px;
|
||||
padding: 9px 7px; /* 保持上下 padding 9px,減少左右 padding 到 6px */
|
||||
}
|
||||
|
||||
|
||||
.ge-header-buttons button {
|
||||
padding: 6px 9px; /* 保持上下 padding 6px,減少左右 padding 到 8px */
|
||||
gap: 3px;
|
||||
|
|
@ -706,7 +741,7 @@
|
|||
.ge-sort-button:hover {
|
||||
opacity: 1;
|
||||
background-color: var(--background-modifier-hover);
|
||||
box-shadow: 0 1px 0 rgba(0,0,0,0.05) inset;
|
||||
box-shadow: 0 1px 0 rgba(0, 0, 0, 0.05) inset;
|
||||
}
|
||||
|
||||
.ge-sort-button svg {
|
||||
|
|
@ -734,7 +769,7 @@ a.ge-mode-title {
|
|||
border: 1px solid var(--background-modifier-border) !important;
|
||||
border-radius: 6px;
|
||||
cursor: pointer;
|
||||
box-shadow: 0 1px 1px rgba(0,0,0,0.04);
|
||||
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
|
||||
background: var(--background-primary);
|
||||
}
|
||||
|
||||
|
|
@ -795,6 +830,52 @@ span.ge-mode-title {
|
|||
opacity: 1;
|
||||
}
|
||||
|
||||
/* 設定分區樣式 Settings Sections */
|
||||
.ge-settings-section {
|
||||
border: 1px solid var(--background-modifier-border);
|
||||
border-radius: 8px;
|
||||
margin-bottom: 12px;
|
||||
background-color: var(--background-primary-alt);
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.ge-settings-section-summary {
|
||||
padding: 10px 15px;
|
||||
cursor: pointer;
|
||||
background-color: var(--background-secondary);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
.ge-settings-section-summary h3 {
|
||||
margin: 0 !important;
|
||||
font-size: 1.1em;
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
.ge-settings-section-summary::before {
|
||||
content: "▶";
|
||||
font-size: 0.8em;
|
||||
margin-right: 10px;
|
||||
transition: transform 0.2s ease;
|
||||
color: var(--text-muted);
|
||||
}
|
||||
|
||||
.ge-settings-section[open] .ge-settings-section-summary::before {
|
||||
transform: rotate(90deg);
|
||||
}
|
||||
|
||||
.ge-settings-section-content {
|
||||
padding: 10px 20px 20px 20px;
|
||||
border-top: 1px solid var(--background-modifier-border);
|
||||
}
|
||||
|
||||
/* 行動版調整 Mobile adjustments */
|
||||
.is-mobile .ge-settings-section-content {
|
||||
padding: 10px 10px 15px 10px;
|
||||
}
|
||||
|
||||
/* 路徑容器樣式 */
|
||||
.ge-path-container {
|
||||
display: flex;
|
||||
|
|
@ -1198,7 +1279,7 @@ a.ge-current-folder:hover {
|
|||
cursor: pointer;
|
||||
color: var(--text-muted);
|
||||
font-size: 14px;
|
||||
margin-right:4px;
|
||||
margin-right: 4px;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
|
|
@ -1427,7 +1508,7 @@ a.ge-current-folder:hover {
|
|||
text-overflow: ellipsis;
|
||||
padding-right: 24px;
|
||||
cursor: default;
|
||||
margin: 2px;
|
||||
margin: 2px;
|
||||
}
|
||||
|
||||
.ge-floating-audio-player audio {
|
||||
|
|
@ -1448,7 +1529,7 @@ a.ge-current-folder:hover {
|
|||
cursor: pointer;
|
||||
border-radius: 50%;
|
||||
transition: background-color 0.2s ease, color 0.2s ease;
|
||||
z-index: 1102;
|
||||
z-index: 1102;
|
||||
}
|
||||
|
||||
.ge-audio-close-button:hover {
|
||||
|
|
@ -1464,7 +1545,7 @@ a.ge-current-folder:hover {
|
|||
height: 30px;
|
||||
cursor: move;
|
||||
border-radius: 8px 8px 0 0;
|
||||
z-index: 1101;
|
||||
z-index: 1101;
|
||||
}
|
||||
|
||||
.ge-audio-dragging {
|
||||
|
|
@ -1637,10 +1718,10 @@ a.ge-current-folder:hover {
|
|||
.ge-custommode-option-drag-handle,
|
||||
.ge-custommode-option-toggle,
|
||||
.ge-custommode-option-delete {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
/* 如果需要撐滿標題列高度,可加上 */
|
||||
/* height: 100%; */
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
/* 如果需要撐滿標題列高度,可加上 */
|
||||
/* height: 100%; */
|
||||
}
|
||||
|
||||
/* 展開狀態的內容區域 */
|
||||
|
|
@ -2000,7 +2081,7 @@ a.ge-current-folder:hover {
|
|||
|
||||
/* --------------------------------------------------------------------------- */
|
||||
|
||||
.ge-note-content > p:nth-child(2) {
|
||||
.ge-note-content>p:nth-child(2) {
|
||||
margin-block-start: 0;
|
||||
}
|
||||
|
||||
|
|
@ -2022,7 +2103,7 @@ a.ge-current-folder:hover {
|
|||
font-size: 90%;
|
||||
color: var(--text-code);
|
||||
}
|
||||
|
||||
|
||||
.ge-note-content a {
|
||||
color: var(--text-accent);
|
||||
text-decoration: none;
|
||||
|
|
@ -2212,8 +2293,8 @@ a.ge-current-folder:hover {
|
|||
background-color: var(--background-modifier-hover);
|
||||
}
|
||||
|
||||
.ge-explorer-folder-header.ge-dragover {
|
||||
background-color: var(--background-modifier-hover);
|
||||
.ge-explorer-folder-header.ge-dragover {
|
||||
background-color: var(--background-modifier-hover);
|
||||
}
|
||||
|
||||
.ge-explorer-folder-header.is-active,
|
||||
|
|
@ -2312,32 +2393,32 @@ a.ge-current-folder:hover {
|
|||
/* ExplorerView - Mobile spacing & touch targets */
|
||||
.is-mobile .ge-explorer-folder-header,
|
||||
.is-mobile .ge-explorer-mode-item {
|
||||
padding: 8px 10px; /* ↑ from 4px 6px */
|
||||
gap: 10px; /* ↑ from 6px */
|
||||
min-height: 36px; /* 提升最小點擊高度,可視需要調整到 40–44px */
|
||||
padding: 8px 10px; /* ↑ from 4px 6px */
|
||||
gap: 10px; /* ↑ from 6px */
|
||||
min-height: 36px; /* 提升最小點擊高度,可視需要調整到 40–44px */
|
||||
border-radius: var(--radius-s);
|
||||
}
|
||||
|
||||
/* 頂層根節點 header 的外距在手機放大一點,避免項目太擠 */
|
||||
.is-mobile .ge-explorer-view-container > .ge-explorer-folder-node > .ge-explorer-folder-header {
|
||||
margin: 8px 10px; /* ↑ from 6px 8px */
|
||||
margin: 8px 10px; /* ↑ from 6px 8px */
|
||||
}
|
||||
|
||||
/* 讓切換箭頭與圖示在手機更好點 */
|
||||
.is-mobile .ge-explorer-folder-toggle,
|
||||
.is-mobile .ge-explorer-folder-icon {
|
||||
width: 20px; /* ↑ from 16px */
|
||||
height: 20px; /* ↑ from 16px */
|
||||
width: 20px; /* ↑ from 16px */
|
||||
height: 20px; /* ↑ from 16px */
|
||||
}
|
||||
|
||||
/* 模式子項的縮排在手機視覺可略加(可選) */
|
||||
.is-mobile .ge-explorer-mode-item {
|
||||
padding-left: 32px; /* ↑ from 28px */
|
||||
padding-left: 32px; /* ↑ from 28px */
|
||||
}
|
||||
|
||||
/* 列與列之間多一點空隙(可選,避免過度擁擠) */
|
||||
.is-mobile .ge-explorer-folder-header {
|
||||
margin-bottom: 5px; /* ↑ from 3px */
|
||||
margin-bottom: 5px; /* ↑ from 3px */
|
||||
}
|
||||
|
||||
/* 降低手機點擊的藍色高亮痕跡(可選) */
|
||||
|
|
@ -2358,24 +2439,31 @@ a.ge-current-folder:hover {
|
|||
.ge-explorer-folder-header.ge-folder-color-red {
|
||||
background-color: rgba(var(--color-red-rgb), 0.2);
|
||||
}
|
||||
|
||||
.ge-explorer-folder-header.ge-folder-color-orange {
|
||||
background-color: rgba(var(--color-orange-rgb), 0.2);
|
||||
}
|
||||
|
||||
.ge-explorer-folder-header.ge-folder-color-yellow {
|
||||
background-color: rgba(var(--color-yellow-rgb), 0.2);
|
||||
}
|
||||
|
||||
.ge-explorer-folder-header.ge-folder-color-green {
|
||||
background-color: rgba(var(--color-green-rgb), 0.2);
|
||||
}
|
||||
|
||||
.ge-explorer-folder-header.ge-folder-color-cyan {
|
||||
background-color: rgba(var(--color-cyan-rgb), 0.2);
|
||||
}
|
||||
|
||||
.ge-explorer-folder-header.ge-folder-color-blue {
|
||||
background-color: rgba(var(--color-blue-rgb), 0.2);
|
||||
}
|
||||
|
||||
.ge-explorer-folder-header.ge-folder-color-purple {
|
||||
background-color: rgba(var(--color-purple-rgb), 0.2);
|
||||
}
|
||||
|
||||
.ge-explorer-folder-header.ge-folder-color-pink {
|
||||
background-color: rgba(var(--color-pink-rgb), 0.2);
|
||||
}
|
||||
|
|
@ -2384,24 +2472,31 @@ a.ge-current-folder:hover {
|
|||
.ge-explorer-folder-header.ge-folder-color-red:hover {
|
||||
background-color: rgba(var(--color-red-rgb), 0.3);
|
||||
}
|
||||
|
||||
.ge-explorer-folder-header.ge-folder-color-orange:hover {
|
||||
background-color: rgba(var(--color-orange-rgb), 0.3);
|
||||
}
|
||||
|
||||
.ge-explorer-folder-header.ge-folder-color-yellow:hover {
|
||||
background-color: rgba(var(--color-yellow-rgb), 0.3);
|
||||
}
|
||||
|
||||
.ge-explorer-folder-header.ge-folder-color-green:hover {
|
||||
background-color: rgba(var(--color-green-rgb), 0.3);
|
||||
}
|
||||
|
||||
.ge-explorer-folder-header.ge-folder-color-cyan:hover {
|
||||
background-color: rgba(var(--color-cyan-rgb), 0.3);
|
||||
}
|
||||
|
||||
.ge-explorer-folder-header.ge-folder-color-blue:hover {
|
||||
background-color: rgba(var(--color-blue-rgb), 0.3);
|
||||
}
|
||||
|
||||
.ge-explorer-folder-header.ge-folder-color-purple:hover {
|
||||
background-color: rgba(var(--color-purple-rgb), 0.3);
|
||||
}
|
||||
|
||||
.ge-explorer-folder-header.ge-folder-color-pink:hover {
|
||||
background-color: rgba(var(--color-pink-rgb), 0.3);
|
||||
}
|
||||
|
|
@ -2530,12 +2625,29 @@ a.ge-current-folder:hover {
|
|||
}
|
||||
|
||||
/* 讓 stash item 的圖示可沿用 grid 的色票類別 */
|
||||
.ge-explorer-stash-item .ge-explorer-folder-icon.ge-img { color: var(--color-blue); }
|
||||
.ge-explorer-stash-item .ge-explorer-folder-icon.ge-video { color: var(--color-red); }
|
||||
.ge-explorer-stash-item .ge-explorer-folder-icon.ge-audio { color: var(--color-purple); }
|
||||
.ge-explorer-stash-item .ge-explorer-folder-icon.ge-pdf { color: var(--color-orange); }
|
||||
.ge-explorer-stash-item .ge-explorer-folder-icon.ge-canvas { color: var(--color-green); }
|
||||
.ge-explorer-stash-item .ge-explorer-folder-icon.ge-base { color: var(--color-cyan); }
|
||||
.ge-explorer-stash-item .ge-explorer-folder-icon.ge-img {
|
||||
color: var(--color-blue);
|
||||
}
|
||||
|
||||
.ge-explorer-stash-item .ge-explorer-folder-icon.ge-video {
|
||||
color: var(--color-red);
|
||||
}
|
||||
|
||||
.ge-explorer-stash-item .ge-explorer-folder-icon.ge-audio {
|
||||
color: var(--color-purple);
|
||||
}
|
||||
|
||||
.ge-explorer-stash-item .ge-explorer-folder-icon.ge-pdf {
|
||||
color: var(--color-orange);
|
||||
}
|
||||
|
||||
.ge-explorer-stash-item .ge-explorer-folder-icon.ge-canvas {
|
||||
color: var(--color-green);
|
||||
}
|
||||
|
||||
.ge-explorer-stash-item .ge-explorer-folder-icon.ge-base {
|
||||
color: var(--color-cyan);
|
||||
}
|
||||
|
||||
/* 輸入錯誤樣式 Input Error Style */
|
||||
.ge-input-error {
|
||||
|
|
|
|||
|
|
@ -1,3 +1,3 @@
|
|||
{
|
||||
"3.0.0": "1.1.0"
|
||||
"3.0.1": "1.1.0"
|
||||
}
|
||||
Loading…
Reference in a new issue