diff --git a/modules/fileicon/basic.go b/modules/fileicon/basic.go
index e19826d66b..cdf5763310 100644
--- a/modules/fileicon/basic.go
+++ b/modules/fileicon/basic.go
@@ -17,6 +17,10 @@ func BasicThemeFolderIconName(isOpen bool) string {
return "octicon-file-directory-fill"
}
+func BasicThemeFolderIconWithOpenStatus(isOpen bool) template.HTML {
+ return svg.RenderHTML(BasicThemeFolderIconName(isOpen))
+}
+
func BasicThemeIconWithOpenStatus(entry *git.TreeEntry, isOpen bool) template.HTML {
// TODO: add "open icon" support
svgName := "octicon-file"
diff --git a/modules/fileicon/material.go b/modules/fileicon/material.go
index b712a9b09c..70e440245f 100644
--- a/modules/fileicon/material.go
+++ b/modules/fileicon/material.go
@@ -69,12 +69,17 @@ func (m *MaterialIconProvider) renderFileIconSVG(p *RenderedIconPool, name, svg,
}
svgID := "svg-mfi-" + name
svgCommonAttrs := `class="svg git-entry-icon ` + extraClass + `" width="16" height="16" aria-hidden="true"`
- if p.IconSVGs[svgID] == "" {
+ if p != nil && p.IconSVGs[svgID] == "" {
p.IconSVGs[svgID] = template.HTML(``)
}
+func (m *MaterialIconProvider) FolderIconWithOpenStatus(p *RenderedIconPool, isOpen bool) template.HTML {
+ name := m.FindIconName("folder", true, isOpen)
+ return m.renderFileIconSVG(p, name, m.svgs[name], BasicThemeFolderIconName(isOpen))
+}
+
func (m *MaterialIconProvider) FileIconWithOpenStatus(p *RenderedIconPool, entry *git.TreeEntry, isOpen bool) template.HTML {
if m.rules == nil {
return BasicThemeIconWithOpenStatus(entry, isOpen)
@@ -89,10 +94,10 @@ func (m *MaterialIconProvider) FileIconWithOpenStatus(p *RenderedIconPool, entry
}
// TODO: add "open icon" support
- name := m.findIconNameByGit(entry)
+ name := m.findIconNameByGit(entry, isOpen)
// the material icon pack's "folder" icon doesn't look good, so use our built-in one
// keep the old "octicon-xxx" class name to make some "theme plugin selector" could still work
- if iconSVG, ok := m.svgs[name]; ok && name != "folder" && iconSVG != "" {
+ if iconSVG, ok := m.svgs[name]; ok && iconSVG != "" {
// keep the old "octicon-xxx" class name to make some "theme plugin selector" could still work
extraClass := "octicon-file"
switch {
@@ -119,12 +124,15 @@ func (m *MaterialIconProvider) findIconNameWithLangID(s string) string {
return ""
}
-func (m *MaterialIconProvider) FindIconName(name string, isDir bool) string {
+func (m *MaterialIconProvider) FindIconName(name string, isDir, isOpen bool) string {
fileNameLower := strings.ToLower(path.Base(name))
if isDir {
if s, ok := m.rules.FolderNames[fileNameLower]; ok {
return s
}
+ if isOpen {
+ return "folder-open"
+ }
return "folder"
}
@@ -148,9 +156,9 @@ func (m *MaterialIconProvider) FindIconName(name string, isDir bool) string {
return "file"
}
-func (m *MaterialIconProvider) findIconNameByGit(entry *git.TreeEntry) string {
+func (m *MaterialIconProvider) findIconNameByGit(entry *git.TreeEntry, isOpen bool) string {
if entry.IsSubModule() {
return "folder-git"
}
- return m.FindIconName(entry.Name(), entry.IsDir())
+ return m.FindIconName(entry.Name(), entry.IsDir(), isOpen)
}
diff --git a/modules/fileicon/material_test.go b/modules/fileicon/material_test.go
index f36385aaf3..b2ac187576 100644
--- a/modules/fileicon/material_test.go
+++ b/modules/fileicon/material_test.go
@@ -19,8 +19,8 @@ func TestMain(m *testing.M) {
func TestFindIconName(t *testing.T) {
unittest.PrepareTestEnv(t)
p := fileicon.DefaultMaterialIconProvider()
- assert.Equal(t, "php", p.FindIconName("foo.php", false))
- assert.Equal(t, "php", p.FindIconName("foo.PHP", false))
- assert.Equal(t, "javascript", p.FindIconName("foo.js", false))
- assert.Equal(t, "visualstudio", p.FindIconName("foo.vba", false))
+ assert.Equal(t, "php", p.FindIconName("foo.php", false, false))
+ assert.Equal(t, "php", p.FindIconName("foo.PHP", false, false))
+ assert.Equal(t, "javascript", p.FindIconName("foo.js", false, false))
+ assert.Equal(t, "visualstudio", p.FindIconName("foo.vba", false, false))
}
diff --git a/modules/templates/helper.go b/modules/templates/helper.go
index c9d93e089c..4a780f04dc 100644
--- a/modules/templates/helper.go
+++ b/modules/templates/helper.go
@@ -59,11 +59,12 @@ func NewFuncMap() template.FuncMap {
// -----------------------------------------------------------------
// svg / avatar / icon / color
- "svg": svg.RenderHTML,
- "MigrationIcon": migrationIcon,
- "ActionIcon": actionIcon,
- "SortArrow": sortArrow,
- "ContrastColor": util.ContrastColor,
+ "svg": svg.RenderHTML,
+ "folderIconHTMLByOpenStatus": folderIconHTMLByOpenStatus,
+ "MigrationIcon": migrationIcon,
+ "ActionIcon": actionIcon,
+ "SortArrow": sortArrow,
+ "ContrastColor": util.ContrastColor,
// -----------------------------------------------------------------
// time / number / format
diff --git a/modules/templates/util_misc.go b/modules/templates/util_misc.go
index cc5bf67b42..000ae10b31 100644
--- a/modules/templates/util_misc.go
+++ b/modules/templates/util_misc.go
@@ -14,11 +14,13 @@ import (
activities_model "code.gitea.io/gitea/models/activities"
repo_model "code.gitea.io/gitea/models/repo"
+ "code.gitea.io/gitea/modules/fileicon"
"code.gitea.io/gitea/modules/git"
giturl "code.gitea.io/gitea/modules/git/url"
"code.gitea.io/gitea/modules/json"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/repository"
+ "code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/svg"
"github.com/editorconfig/editorconfig-core-go/v2"
@@ -192,3 +194,10 @@ func tabSizeClass(ec *editorconfig.Editorconfig, filename string) string {
}
return "tab-size-4"
}
+
+func folderIconHTMLByOpenStatus(isOpen bool) template.HTML {
+ if setting.UI.FileIconTheme == "material" {
+ return fileicon.DefaultMaterialIconProvider().FolderIconWithOpenStatus(nil, isOpen)
+ }
+ return fileicon.BasicThemeFolderIconWithOpenStatus(isOpen)
+}
diff --git a/templates/repo/view_list.tmpl b/templates/repo/view_list.tmpl
index 572987a986..aa1f896144 100644
--- a/templates/repo/view_list.tmpl
+++ b/templates/repo/view_list.tmpl
@@ -6,7 +6,7 @@
{{if .HasParentPath}}
- {{svg "octicon-file-directory-fill"}} ..
+ {{folderIconHTMLByOpenStatus false}} ..
{{end}}
{{$.FileIconPoolHTML}}