This commit is contained in:
Devon22 2025-12-24 18:03:00 +08:00
parent f7f0436120
commit 1647a0129e
21 changed files with 398 additions and 207 deletions

View file

@ -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
View file

@ -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",

View file

@ -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": {

View file

@ -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));

View file

@ -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;

View file

@ -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));

View file

@ -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'];
}
});
}

View file

@ -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));

View file

@ -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();
});

View file

@ -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) {

View file

@ -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();
});
});
}

View file

@ -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',

View file

@ -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': 'クイックアクセス設定',

View file

@ -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': '빠른 액세스 설정',

View file

@ -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': 'Настройки Быстрого доступа',

View file

@ -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': 'Налаштування швидкого доступу',

View file

@ -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': '快速存取設定',

View file

@ -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': '快速访问设置',

View file

@ -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) {
// 獲取資料夾對象

View file

@ -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; /* 提升最小點擊高度,可視需要調整到 4044px */
padding: 8px 10px; /* ↑ from 4px 6px */
gap: 10px; /* ↑ from 6px */
min-height: 36px; /* 提升最小點擊高度,可視需要調整到 4044px */
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 {

View file

@ -1,3 +1,3 @@
{
"3.0.0": "1.1.0"
"3.0.1": "1.1.0"
}