瀏覽代碼

Add support for themes (fixes #1925)

Audrius Butkevicius 9 年之前
父節點
當前提交
cd54186113
共有 100 個文件被更改,包括 77 次插入14 次删除
  1. 2 2
      build.go
  2. 60 11
      cmd/syncthing/gui.go
  3. 0 0
      gui/default/assets/css/overrides.css
  4. 0 0
      gui/default/assets/font/raleway-500.woff
  5. 0 0
      gui/default/assets/font/raleway.css
  6. 0 0
      gui/default/assets/img/favicon.png
  7. 0 0
      gui/default/assets/img/logo-horizontal.svg
  8. 0 0
      gui/default/assets/img/safari-pinned-tab.svg
  9. 0 0
      gui/default/assets/lang/README-FIRST.txt
  10. 0 0
      gui/default/assets/lang/lang-bg.json
  11. 0 0
      gui/default/assets/lang/lang-ca.json
  12. 0 0
      gui/default/assets/lang/[email protected]
  13. 0 0
      gui/default/assets/lang/lang-cs.json
  14. 0 0
      gui/default/assets/lang/lang-da.json
  15. 0 0
      gui/default/assets/lang/lang-de.json
  16. 0 0
      gui/default/assets/lang/lang-el.json
  17. 0 0
      gui/default/assets/lang/lang-en-GB.json
  18. 0 0
      gui/default/assets/lang/lang-en.json
  19. 0 0
      gui/default/assets/lang/lang-es-ES.json
  20. 0 0
      gui/default/assets/lang/lang-es.json
  21. 0 0
      gui/default/assets/lang/lang-fi.json
  22. 0 0
      gui/default/assets/lang/lang-fr-CA.json
  23. 0 0
      gui/default/assets/lang/lang-fr.json
  24. 0 0
      gui/default/assets/lang/lang-fy.json
  25. 0 0
      gui/default/assets/lang/lang-hu.json
  26. 0 0
      gui/default/assets/lang/lang-it.json
  27. 0 0
      gui/default/assets/lang/lang-ja.json
  28. 0 0
      gui/default/assets/lang/lang-ko-KR.json
  29. 0 0
      gui/default/assets/lang/lang-lt.json
  30. 0 0
      gui/default/assets/lang/lang-nb.json
  31. 0 0
      gui/default/assets/lang/lang-nl.json
  32. 0 0
      gui/default/assets/lang/lang-nn.json
  33. 0 0
      gui/default/assets/lang/lang-pl.json
  34. 0 0
      gui/default/assets/lang/lang-pt-BR.json
  35. 0 0
      gui/default/assets/lang/lang-pt-PT.json
  36. 0 0
      gui/default/assets/lang/lang-ro-RO.json
  37. 0 0
      gui/default/assets/lang/lang-ru.json
  38. 0 0
      gui/default/assets/lang/lang-sv.json
  39. 0 0
      gui/default/assets/lang/lang-tr.json
  40. 0 0
      gui/default/assets/lang/lang-uk.json
  41. 0 0
      gui/default/assets/lang/lang-vi.json
  42. 0 0
      gui/default/assets/lang/lang-zh-CN.json
  43. 0 0
      gui/default/assets/lang/lang-zh-TW.json
  44. 0 0
      gui/default/assets/lang/prettyprint.js
  45. 0 0
      gui/default/assets/lang/valid-langs.js
  46. 0 0
      gui/default/index.html
  47. 0 0
      gui/default/modal.html
  48. 0 0
      gui/default/syncthing/app.js
  49. 0 0
      gui/default/syncthing/core/aboutModalDirective.js
  50. 0 0
      gui/default/syncthing/core/aboutModalView.html
  51. 0 0
      gui/default/syncthing/core/alwaysNumberFilter.js
  52. 0 0
      gui/default/syncthing/core/basenameFilter.js
  53. 0 0
      gui/default/syncthing/core/binaryFilter.js
  54. 0 0
      gui/default/syncthing/core/durationFilter.js
  55. 0 0
      gui/default/syncthing/core/eventService.js
  56. 0 0
      gui/default/syncthing/core/httpErrorDialogDirective.js
  57. 0 0
      gui/default/syncthing/core/httpErrorDialogView.html
  58. 0 0
      gui/default/syncthing/core/identiconDirective.js
  59. 0 0
      gui/default/syncthing/core/languageSelectDirective.js
  60. 0 0
      gui/default/syncthing/core/lastErrorComponentFilter.js
  61. 0 0
      gui/default/syncthing/core/localeService.js
  62. 0 0
      gui/default/syncthing/core/majorUpgradeModalDirective.js
  63. 0 0
      gui/default/syncthing/core/majorUpgradeModalView.html
  64. 0 0
      gui/default/syncthing/core/modalDirective.js
  65. 0 0
      gui/default/syncthing/core/module.js
  66. 0 0
      gui/default/syncthing/core/naturalFilter.js
  67. 0 0
      gui/default/syncthing/core/networkErrorDialogDirective.js
  68. 0 0
      gui/default/syncthing/core/networkErrorDialogView.html
  69. 0 0
      gui/default/syncthing/core/popoverDirective.js
  70. 0 0
      gui/default/syncthing/core/restartingDialogDirective.js
  71. 0 0
      gui/default/syncthing/core/restartingDialogView.html
  72. 0 0
      gui/default/syncthing/core/selectOnClickDirective.js
  73. 0 0
      gui/default/syncthing/core/shutdownDialogDirective.js
  74. 0 0
      gui/default/syncthing/core/shutdownDialogView.html
  75. 5 0
      gui/default/syncthing/core/syncthingController.js
  76. 0 0
      gui/default/syncthing/core/uniqueFolderDirective.js
  77. 0 0
      gui/default/syncthing/core/upgradingDialogDirective.js
  78. 0 0
      gui/default/syncthing/core/upgradingDialogView.html
  79. 0 0
      gui/default/syncthing/core/validDeviceidDirective.js
  80. 0 0
      gui/default/syncthing/device/editDeviceModalDirective.js
  81. 0 0
      gui/default/syncthing/device/editDeviceModalView.html
  82. 0 0
      gui/default/syncthing/device/idqrModalDirective.js
  83. 0 0
      gui/default/syncthing/device/idqrModalView.html
  84. 0 0
      gui/default/syncthing/device/module.js
  85. 0 0
      gui/default/syncthing/folder/editFolderModalDirective.js
  86. 0 0
      gui/default/syncthing/folder/editFolderModalView.html
  87. 0 0
      gui/default/syncthing/folder/editIgnoresModalDirective.js
  88. 0 0
      gui/default/syncthing/folder/editIgnoresModalView.html
  89. 0 0
      gui/default/syncthing/folder/module.js
  90. 0 0
      gui/default/syncthing/settings/advancedSettingsModalDirective.js
  91. 0 0
      gui/default/syncthing/settings/advancedSettingsModalView.html
  92. 0 0
      gui/default/syncthing/settings/module.js
  93. 0 0
      gui/default/syncthing/settings/settingsModalDirective.js
  94. 10 1
      gui/default/syncthing/settings/settingsModalView.html
  95. 0 0
      gui/default/syncthing/transfer/failedFilesModalDirective.js
  96. 0 0
      gui/default/syncthing/transfer/failedFilesModalView.html
  97. 0 0
      gui/default/syncthing/transfer/module.js
  98. 0 0
      gui/default/syncthing/transfer/neededFilesModalDirective.js
  99. 0 0
      gui/default/syncthing/transfer/neededFilesModalView.html
  100. 0 0
      gui/default/syncthing/usagereport/module.js

+ 2 - 2
build.go

@@ -410,7 +410,7 @@ func xdr() {
 }
 }
 
 
 func translate() {
 func translate() {
-	os.Chdir("gui/assets/lang")
+	os.Chdir("gui/default/assets/lang")
 	runPipe("lang-en-new.json", "go", "run", "../../../script/translate.go", "lang-en.json", "../../")
 	runPipe("lang-en-new.json", "go", "run", "../../../script/translate.go", "lang-en.json", "../../")
 	os.Remove("lang-en.json")
 	os.Remove("lang-en.json")
 	err := os.Rename("lang-en-new.json", "lang-en.json")
 	err := os.Rename("lang-en-new.json", "lang-en.json")
@@ -421,7 +421,7 @@ func translate() {
 }
 }
 
 
 func transifex() {
 func transifex() {
-	os.Chdir("gui/assets/lang")
+	os.Chdir("gui/default/assets/lang")
 	runPrint("go", "run", "../../../script/transifexdl.go")
 	runPrint("go", "run", "../../../script/transifexdl.go")
 	os.Chdir("../../..")
 	os.Chdir("../../..")
 	assets()
 	assets()

+ 60 - 11
cmd/syncthing/gui.go

@@ -52,6 +52,7 @@ type apiService struct {
 	id              protocol.DeviceID
 	id              protocol.DeviceID
 	cfg             *config.Wrapper
 	cfg             *config.Wrapper
 	assetDir        string
 	assetDir        string
+	themes          []string
 	model           *model.Model
 	model           *model.Model
 	eventSub        *events.BufferedSubscription
 	eventSub        *events.BufferedSubscription
 	discoverer      *discover.CachingMux
 	discoverer      *discover.CachingMux
@@ -79,6 +80,15 @@ func newAPIService(id protocol.DeviceID, cfg *config.Wrapper, assetDir string, m
 		systemLog:       systemLog,
 		systemLog:       systemLog,
 	}
 	}
 
 
+	seen := make(map[string]struct{})
+	for file := range auto.Assets() {
+		theme := strings.Split(file, "/")[0]
+		if _, ok := seen[theme]; !ok {
+			seen[theme] = struct{}{}
+			service.themes = append(service.themes, theme)
+		}
+	}
+
 	var err error
 	var err error
 	service.listener, err = service.getListener(cfg.GUI())
 	service.listener, err = service.getListener(cfg.GUI())
 	return service, err
 	return service, err
@@ -198,10 +208,16 @@ func (s *apiService) Serve() {
 	mux.HandleFunc("/qr/", s.getQR)
 	mux.HandleFunc("/qr/", s.getQR)
 
 
 	// Serve compiled in assets unless an asset directory was set (for development)
 	// Serve compiled in assets unless an asset directory was set (for development)
-	mux.Handle("/", embeddedStatic{
-		assetDir: s.assetDir,
-		assets:   auto.Assets(),
-	})
+	assets := &embeddedStatic{
+		theme:        s.cfg.GUI().Theme,
+		lastModified: time.Now(),
+		mut:          sync.NewRWMutex(),
+		assetDir:     s.assetDir,
+		assets:       auto.Assets(),
+	}
+	mux.Handle("/", assets)
+
+	s.cfg.Subscribe(assets)
 
 
 	guiCfg := s.cfg.GUI()
 	guiCfg := s.cfg.GUI()
 
 
@@ -690,6 +706,7 @@ func (s *apiService) getSystemStatus(w http.ResponseWriter, r *http.Request) {
 	res["pathSeparator"] = string(filepath.Separator)
 	res["pathSeparator"] = string(filepath.Separator)
 	res["uptime"] = int(time.Since(startTime).Seconds())
 	res["uptime"] = int(time.Since(startTime).Seconds())
 	res["startTime"] = startTime
 	res["startTime"] = startTime
+	res["themes"] = s.themes
 
 
 	sendJSON(w, res)
 	sendJSON(w, res)
 }
 }
@@ -1015,8 +1032,11 @@ func (s *apiService) getSystemBrowse(w http.ResponseWriter, r *http.Request) {
 }
 }
 
 
 type embeddedStatic struct {
 type embeddedStatic struct {
-	assetDir string
-	assets   map[string][]byte
+	theme        string
+	lastModified time.Time
+	mut          sync.RWMutex
+	assetDir     string
+	assets       map[string][]byte
 }
 }
 
 
 func (s embeddedStatic) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 func (s embeddedStatic) ServeHTTP(w http.ResponseWriter, r *http.Request) {
@@ -1039,13 +1059,21 @@ func (s embeddedStatic) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 		}
 		}
 	}
 	}
 
 
-	bs, ok := s.assets[file]
+	s.mut.RLock()
+	theme := s.theme
+	modified := s.lastModified
+	s.mut.RUnlock()
+
+	bs, ok := s.assets[theme+"/"+file]
 	if !ok {
 	if !ok {
-		http.NotFound(w, r)
-		return
+		bs, ok = s.assets[config.DefaultTheme+"/"+file]
+		if !ok {
+			http.NotFound(w, r)
+			return
+		}
 	}
 	}
 
 
-	if r.Header.Get("If-Modified-Since") == auto.AssetsBuildDate {
+	if modifiedSince, err := time.Parse(r.Header.Get("If-Modified-Since"), http.TimeFormat); err == nil && modified.Before(modifiedSince) {
 		w.WriteHeader(http.StatusNotModified)
 		w.WriteHeader(http.StatusNotModified)
 		return
 		return
 	}
 	}
@@ -1064,7 +1092,7 @@ func (s embeddedStatic) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 		gr.Close()
 		gr.Close()
 	}
 	}
 	w.Header().Set("Content-Length", fmt.Sprintf("%d", len(bs)))
 	w.Header().Set("Content-Length", fmt.Sprintf("%d", len(bs)))
-	w.Header().Set("Last-Modified", auto.AssetsBuildDate)
+	w.Header().Set("Last-Modified", modified.Format(http.TimeFormat))
 	w.Header().Set("Cache-Control", "public")
 	w.Header().Set("Cache-Control", "public")
 
 
 	w.Write(bs)
 	w.Write(bs)
@@ -1097,6 +1125,27 @@ func (s embeddedStatic) mimeTypeForFile(file string) string {
 	}
 	}
 }
 }
 
 
+// VerifyConfiguration implements the config.Committer interface
+func (s *embeddedStatic) VerifyConfiguration(from, to config.Configuration) error {
+	return nil
+}
+
+// CommitConfiguration implements the config.Committer interface
+func (s *embeddedStatic) CommitConfiguration(from, to config.Configuration) bool {
+	s.mut.Lock()
+	if s.theme != to.GUI.Theme {
+		s.theme = to.GUI.Theme
+		s.lastModified = time.Now()
+	}
+	s.mut.Unlock()
+
+	return true
+}
+
+func (s *embeddedStatic) String() string {
+	return fmt.Sprintf("embeddedStatic@%p", s)
+}
+
 func (s *apiService) toNeedSlice(fs []db.FileInfoTruncated) []jsonDBFileInfo {
 func (s *apiService) toNeedSlice(fs []db.FileInfoTruncated) []jsonDBFileInfo {
 	res := make([]jsonDBFileInfo, len(fs))
 	res := make([]jsonDBFileInfo, len(fs))
 	for i, f := range fs {
 	for i, f := range fs {

+ 0 - 0
gui/assets/css/overrides.css → gui/default/assets/css/overrides.css


+ 0 - 0
gui/assets/font/raleway-500.woff → gui/default/assets/font/raleway-500.woff


+ 0 - 0
gui/assets/font/raleway.css → gui/default/assets/font/raleway.css


+ 0 - 0
gui/assets/img/favicon.png → gui/default/assets/img/favicon.png


+ 0 - 0
gui/assets/img/logo-horizontal.svg → gui/default/assets/img/logo-horizontal.svg


+ 0 - 0
gui/assets/img/safari-pinned-tab.svg → gui/default/assets/img/safari-pinned-tab.svg


+ 0 - 0
gui/assets/lang/README-FIRST.txt → gui/default/assets/lang/README-FIRST.txt


+ 0 - 0
gui/assets/lang/lang-bg.json → gui/default/assets/lang/lang-bg.json


+ 0 - 0
gui/assets/lang/lang-ca.json → gui/default/assets/lang/lang-ca.json


+ 0 - 0
gui/assets/lang/[email protected] → gui/default/assets/lang/[email protected]


+ 0 - 0
gui/assets/lang/lang-cs.json → gui/default/assets/lang/lang-cs.json


+ 0 - 0
gui/assets/lang/lang-da.json → gui/default/assets/lang/lang-da.json


+ 0 - 0
gui/assets/lang/lang-de.json → gui/default/assets/lang/lang-de.json


+ 0 - 0
gui/assets/lang/lang-el.json → gui/default/assets/lang/lang-el.json


+ 0 - 0
gui/assets/lang/lang-en-GB.json → gui/default/assets/lang/lang-en-GB.json


+ 0 - 0
gui/assets/lang/lang-en.json → gui/default/assets/lang/lang-en.json


+ 0 - 0
gui/assets/lang/lang-es-ES.json → gui/default/assets/lang/lang-es-ES.json


+ 0 - 0
gui/assets/lang/lang-es.json → gui/default/assets/lang/lang-es.json


+ 0 - 0
gui/assets/lang/lang-fi.json → gui/default/assets/lang/lang-fi.json


+ 0 - 0
gui/assets/lang/lang-fr-CA.json → gui/default/assets/lang/lang-fr-CA.json


+ 0 - 0
gui/assets/lang/lang-fr.json → gui/default/assets/lang/lang-fr.json


+ 0 - 0
gui/assets/lang/lang-fy.json → gui/default/assets/lang/lang-fy.json


+ 0 - 0
gui/assets/lang/lang-hu.json → gui/default/assets/lang/lang-hu.json


+ 0 - 0
gui/assets/lang/lang-it.json → gui/default/assets/lang/lang-it.json


+ 0 - 0
gui/assets/lang/lang-ja.json → gui/default/assets/lang/lang-ja.json


+ 0 - 0
gui/assets/lang/lang-ko-KR.json → gui/default/assets/lang/lang-ko-KR.json


+ 0 - 0
gui/assets/lang/lang-lt.json → gui/default/assets/lang/lang-lt.json


+ 0 - 0
gui/assets/lang/lang-nb.json → gui/default/assets/lang/lang-nb.json


+ 0 - 0
gui/assets/lang/lang-nl.json → gui/default/assets/lang/lang-nl.json


+ 0 - 0
gui/assets/lang/lang-nn.json → gui/default/assets/lang/lang-nn.json


+ 0 - 0
gui/assets/lang/lang-pl.json → gui/default/assets/lang/lang-pl.json


+ 0 - 0
gui/assets/lang/lang-pt-BR.json → gui/default/assets/lang/lang-pt-BR.json


+ 0 - 0
gui/assets/lang/lang-pt-PT.json → gui/default/assets/lang/lang-pt-PT.json


+ 0 - 0
gui/assets/lang/lang-ro-RO.json → gui/default/assets/lang/lang-ro-RO.json


+ 0 - 0
gui/assets/lang/lang-ru.json → gui/default/assets/lang/lang-ru.json


+ 0 - 0
gui/assets/lang/lang-sv.json → gui/default/assets/lang/lang-sv.json


+ 0 - 0
gui/assets/lang/lang-tr.json → gui/default/assets/lang/lang-tr.json


+ 0 - 0
gui/assets/lang/lang-uk.json → gui/default/assets/lang/lang-uk.json


+ 0 - 0
gui/assets/lang/lang-vi.json → gui/default/assets/lang/lang-vi.json


+ 0 - 0
gui/assets/lang/lang-zh-CN.json → gui/default/assets/lang/lang-zh-CN.json


+ 0 - 0
gui/assets/lang/lang-zh-TW.json → gui/default/assets/lang/lang-zh-TW.json


+ 0 - 0
gui/assets/lang/prettyprint.js → gui/default/assets/lang/prettyprint.js


+ 0 - 0
gui/assets/lang/valid-langs.js → gui/default/assets/lang/valid-langs.js


+ 0 - 0
gui/index.html → gui/default/index.html


+ 0 - 0
gui/modal.html → gui/default/modal.html


+ 0 - 0
gui/syncthing/app.js → gui/default/syncthing/app.js


+ 0 - 0
gui/syncthing/core/aboutModalDirective.js → gui/default/syncthing/core/aboutModalDirective.js


+ 0 - 0
gui/syncthing/core/aboutModalView.html → gui/default/syncthing/core/aboutModalView.html


+ 0 - 0
gui/syncthing/core/alwaysNumberFilter.js → gui/default/syncthing/core/alwaysNumberFilter.js


+ 0 - 0
gui/syncthing/core/basenameFilter.js → gui/default/syncthing/core/basenameFilter.js


+ 0 - 0
gui/syncthing/core/binaryFilter.js → gui/default/syncthing/core/binaryFilter.js


+ 0 - 0
gui/syncthing/core/durationFilter.js → gui/default/syncthing/core/durationFilter.js


+ 0 - 0
gui/syncthing/core/eventService.js → gui/default/syncthing/core/eventService.js


+ 0 - 0
gui/syncthing/core/httpErrorDialogDirective.js → gui/default/syncthing/core/httpErrorDialogDirective.js


+ 0 - 0
gui/syncthing/core/httpErrorDialogView.html → gui/default/syncthing/core/httpErrorDialogView.html


+ 0 - 0
gui/syncthing/core/identiconDirective.js → gui/default/syncthing/core/identiconDirective.js


+ 0 - 0
gui/syncthing/core/languageSelectDirective.js → gui/default/syncthing/core/languageSelectDirective.js


+ 0 - 0
gui/syncthing/core/lastErrorComponentFilter.js → gui/default/syncthing/core/lastErrorComponentFilter.js


+ 0 - 0
gui/syncthing/core/localeService.js → gui/default/syncthing/core/localeService.js


+ 0 - 0
gui/syncthing/core/majorUpgradeModalDirective.js → gui/default/syncthing/core/majorUpgradeModalDirective.js


+ 0 - 0
gui/syncthing/core/majorUpgradeModalView.html → gui/default/syncthing/core/majorUpgradeModalView.html


+ 0 - 0
gui/syncthing/core/modalDirective.js → gui/default/syncthing/core/modalDirective.js


+ 0 - 0
gui/syncthing/core/module.js → gui/default/syncthing/core/module.js


+ 0 - 0
gui/syncthing/core/naturalFilter.js → gui/default/syncthing/core/naturalFilter.js


+ 0 - 0
gui/syncthing/core/networkErrorDialogDirective.js → gui/default/syncthing/core/networkErrorDialogDirective.js


+ 0 - 0
gui/syncthing/core/networkErrorDialogView.html → gui/default/syncthing/core/networkErrorDialogView.html


+ 0 - 0
gui/syncthing/core/popoverDirective.js → gui/default/syncthing/core/popoverDirective.js


+ 0 - 0
gui/syncthing/core/restartingDialogDirective.js → gui/default/syncthing/core/restartingDialogDirective.js


+ 0 - 0
gui/syncthing/core/restartingDialogView.html → gui/default/syncthing/core/restartingDialogView.html


+ 0 - 0
gui/syncthing/core/selectOnClickDirective.js → gui/default/syncthing/core/selectOnClickDirective.js


+ 0 - 0
gui/syncthing/core/shutdownDialogDirective.js → gui/default/syncthing/core/shutdownDialogDirective.js


+ 0 - 0
gui/syncthing/core/shutdownDialogView.html → gui/default/syncthing/core/shutdownDialogView.html


+ 5 - 0
gui/syncthing/core/syncthingController.js → gui/default/syncthing/core/syncthingController.js

@@ -866,6 +866,7 @@ angular.module('syncthing.core')
         $scope.saveSettings = function () {
         $scope.saveSettings = function () {
             // Make sure something changed
             // Make sure something changed
             var changed = !angular.equals($scope.config.options, $scope.tmpOptions) || !angular.equals($scope.config.gui, $scope.tmpGUI);
             var changed = !angular.equals($scope.config.options, $scope.tmpOptions) || !angular.equals($scope.config.gui, $scope.tmpGUI);
+            var themeChanged = $scope.config.gui.theme !== $scope.tmpGUI.theme;
             if (changed) {
             if (changed) {
                 // Check if usage reporting has been enabled or disabled
                 // Check if usage reporting has been enabled or disabled
                 if ($scope.tmpOptions.urEnabled && $scope.tmpOptions.urAccepted <= 0) {
                 if ($scope.tmpOptions.urEnabled && $scope.tmpOptions.urAccepted <= 0) {
@@ -901,6 +902,10 @@ angular.module('syncthing.core')
             }
             }
 
 
             $('#settings').modal("hide");
             $('#settings').modal("hide");
+
+            if (themeChanged) {
+              document.location.reload(true);
+            }
         };
         };
 
 
         $scope.saveAdvanced = function () {
         $scope.saveAdvanced = function () {

+ 0 - 0
gui/syncthing/core/uniqueFolderDirective.js → gui/default/syncthing/core/uniqueFolderDirective.js


+ 0 - 0
gui/syncthing/core/upgradingDialogDirective.js → gui/default/syncthing/core/upgradingDialogDirective.js


+ 0 - 0
gui/syncthing/core/upgradingDialogView.html → gui/default/syncthing/core/upgradingDialogView.html


+ 0 - 0
gui/syncthing/core/validDeviceidDirective.js → gui/default/syncthing/core/validDeviceidDirective.js


+ 0 - 0
gui/syncthing/device/editDeviceModalDirective.js → gui/default/syncthing/device/editDeviceModalDirective.js


+ 0 - 0
gui/syncthing/device/editDeviceModalView.html → gui/default/syncthing/device/editDeviceModalView.html


+ 0 - 0
gui/syncthing/device/idqrModalDirective.js → gui/default/syncthing/device/idqrModalDirective.js


+ 0 - 0
gui/syncthing/device/idqrModalView.html → gui/default/syncthing/device/idqrModalView.html


+ 0 - 0
gui/syncthing/device/module.js → gui/default/syncthing/device/module.js


+ 0 - 0
gui/syncthing/folder/editFolderModalDirective.js → gui/default/syncthing/folder/editFolderModalDirective.js


+ 0 - 0
gui/syncthing/folder/editFolderModalView.html → gui/default/syncthing/folder/editFolderModalView.html


+ 0 - 0
gui/syncthing/folder/editIgnoresModalDirective.js → gui/default/syncthing/folder/editIgnoresModalDirective.js


+ 0 - 0
gui/syncthing/folder/editIgnoresModalView.html → gui/default/syncthing/folder/editIgnoresModalView.html


+ 0 - 0
gui/syncthing/folder/module.js → gui/default/syncthing/folder/module.js


+ 0 - 0
gui/syncthing/settings/advancedSettingsModalDirective.js → gui/default/syncthing/settings/advancedSettingsModalDirective.js


+ 0 - 0
gui/syncthing/settings/advancedSettingsModalView.html → gui/default/syncthing/settings/advancedSettingsModalView.html


+ 0 - 0
gui/syncthing/settings/module.js → gui/default/syncthing/settings/module.js


+ 0 - 0
gui/syncthing/settings/settingsModalDirective.js → gui/default/syncthing/settings/settingsModalDirective.js


+ 10 - 1
gui/syncthing/settings/settingsModalView.html → gui/default/syncthing/settings/settingsModalView.html

@@ -136,8 +136,17 @@
                 <span class="fa fa-repeat"></span>&nbsp;<span translate>Generate</span>
                 <span class="fa fa-repeat"></span>&nbsp;<span translate>Generate</span>
               </button>
               </button>
             </div>
             </div>
-          </div>
 
 
+            <div class="form-group" ng-if="system.themes.length > 1">
+              <label>GUI Theme</label>
+              <select class="form-control" ng-model="tmpGUI.theme" ng->
+                <option ng-repeat="theme in system.themes" value="{{ theme }}">
+                  {{ theme.charAt(0).toUpperCase() + theme.slice(1) }}
+                </option>
+              </select>
+            </div>
+
+          </div>
         </div>
         </div>
       </form>
       </form>
     </div>
     </div>

+ 0 - 0
gui/syncthing/transfer/failedFilesModalDirective.js → gui/default/syncthing/transfer/failedFilesModalDirective.js


+ 0 - 0
gui/syncthing/transfer/failedFilesModalView.html → gui/default/syncthing/transfer/failedFilesModalView.html


+ 0 - 0
gui/syncthing/transfer/module.js → gui/default/syncthing/transfer/module.js


+ 0 - 0
gui/syncthing/transfer/neededFilesModalDirective.js → gui/default/syncthing/transfer/neededFilesModalDirective.js


+ 0 - 0
gui/syncthing/transfer/neededFilesModalView.html → gui/default/syncthing/transfer/neededFilesModalView.html


+ 0 - 0
gui/syncthing/usagereport/module.js → gui/default/syncthing/usagereport/module.js


部分文件因文件數量過多而無法顯示