From 1647a0129eca36c757cad03a469e2ca9372a4a7c Mon Sep 17 00:00:00 2001 From: Devon22 Date: Wed, 24 Dec 2025 18:03:00 +0800 Subject: [PATCH] 3.0.1 --- manifest.json | 2 +- package-lock.json | 4 +- package.json | 2 +- src/ExplorerView.ts | 48 +++---- src/GridView.ts | 9 +- src/modal/folderSelectionModal.ts | 2 +- src/modal/noteSettingsModal.ts | 45 +++++- src/renderFolder.ts | 2 +- src/renderHeaderButton.ts | 8 +- src/renderModePath.ts | 4 +- src/settings.ts | 171 ++++++++++++---------- src/translations/en.ts | 10 +- src/translations/ja.ts | 4 +- src/translations/ko.ts | 8 +- src/translations/ru.ts | 10 +- src/translations/uk.ts | 12 +- src/translations/zh-TW.ts | 8 +- src/translations/zh.ts | 8 +- src/utils/fileUtils.ts | 14 +- styles.css | 232 ++++++++++++++++++++++-------- versions.json | 2 +- 21 files changed, 398 insertions(+), 207 deletions(-) diff --git a/manifest.json b/manifest.json index bf344c2..e987b1d 100644 --- a/manifest.json +++ b/manifest.json @@ -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", diff --git a/package-lock.json b/package-lock.json index 9638d96..bc8cb75 100644 --- a/package-lock.json +++ b/package-lock.json @@ -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", diff --git a/package.json b/package.json index 75451d3..529038d 100644 --- a/package.json +++ b/package.json @@ -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": { diff --git a/src/ExplorerView.ts b/src/ExplorerView.ts index 107fd6e..a335912 100644 --- a/src/ExplorerView.ts +++ b/src/ExplorerView.ts @@ -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)); diff --git a/src/GridView.ts b/src/GridView.ts index 087c957..b5bc63d 100644 --- a/src/GridView.ts +++ b/src/GridView.ts @@ -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; diff --git a/src/modal/folderSelectionModal.ts b/src/modal/folderSelectionModal.ts index 25fde29..443793b 100644 --- a/src/modal/folderSelectionModal.ts +++ b/src/modal/folderSelectionModal.ts @@ -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)); diff --git a/src/modal/noteSettingsModal.ts b/src/modal/noteSettingsModal.ts index 37b859d..b506f74 100644 --- a/src/modal/noteSettingsModal.ts +++ b/src/modal/noteSettingsModal.ts @@ -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']; } }); } diff --git a/src/renderFolder.ts b/src/renderFolder.ts index 3f435ce..c76c3f6 100644 --- a/src/renderFolder.ts +++ b/src/renderFolder.ts @@ -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)); diff --git a/src/renderHeaderButton.ts b/src/renderHeaderButton.ts index 5314bcd..7c810a2 100644 --- a/src/renderHeaderButton.ts +++ b/src/renderHeaderButton.ts @@ -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(); }); diff --git a/src/renderModePath.ts b/src/renderModePath.ts index 7b59dc5..50ffeac 100644 --- a/src/renderModePath.ts +++ b/src/renderModePath.ts @@ -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) { diff --git a/src/settings.ts b/src/settings.ts index 062f031..25a17f2 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -230,21 +230,32 @@ class IgnoredFolderSuggest extends AbstractInputSuggest { export class GridExplorerSettingTab extends PluginSettingTab { plugin: GridExplorerPlugin; - constructor(app: App, plugin: GridExplorerPlugin) { - super(app, plugin); - this.plugin = plugin; + private sectionStates: Map = 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(); }); }); } diff --git a/src/translations/en.ts b/src/translations/en.ts index a23c633..a622ccd 100644 --- a/src/translations/en.ts +++ b/src/translations/en.ts @@ -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', diff --git a/src/translations/ja.ts b/src/translations/ja.ts index d25bd59..4263c63 100644 --- a/src/translations/ja.ts +++ b/src/translations/ja.ts @@ -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': 'クイックアクセス設定', diff --git a/src/translations/ko.ts b/src/translations/ko.ts index 5c68715..427ae42 100644 --- a/src/translations/ko.ts +++ b/src/translations/ko.ts @@ -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': '빠른 액세스 설정', diff --git a/src/translations/ru.ts b/src/translations/ru.ts index 9fb2567..5884382 100644 --- a/src/translations/ru.ts +++ b/src/translations/ru.ts @@ -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': 'Настройки Быстрого доступа', diff --git a/src/translations/uk.ts b/src/translations/uk.ts index e988838..55bbff3 100644 --- a/src/translations/uk.ts +++ b/src/translations/uk.ts @@ -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': 'Налаштування швидкого доступу', diff --git a/src/translations/zh-TW.ts b/src/translations/zh-TW.ts index 6d876bf..49b53e3 100644 --- a/src/translations/zh-TW.ts +++ b/src/translations/zh-TW.ts @@ -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': '快速存取設定', diff --git a/src/translations/zh.ts b/src/translations/zh.ts index 255c8c4..b42284f 100644 --- a/src/translations/zh.ts +++ b/src/translations/zh.ts @@ -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': '快速访问设置', diff --git a/src/utils/fileUtils.ts b/src/utils/fileUtils.ts index 2c45973..4795a4c 100644 --- a/src/utils/fileUtils.ts +++ b/src/utils/fileUtils.ts @@ -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) { // 獲取資料夾對象 diff --git a/styles.css b/styles.css index fdcb18e..e5967b1 100644 --- a/styles.css +++ b/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 { diff --git a/versions.json b/versions.json index 3bc937d..22438f8 100644 --- a/versions.json +++ b/versions.json @@ -1,3 +1,3 @@ { - "3.0.0": "1.1.0" + "3.0.1": "1.1.0" } \ No newline at end of file