diff --git a/lib/Controller/CssController.php b/lib/Controller/CssController.php index cdbf11a..b48c35c 100644 --- a/lib/Controller/CssController.php +++ b/lib/Controller/CssController.php @@ -27,6 +27,8 @@ use OCP\AppFramework\Http\Response; use OCP\AppFramework\Http\TemplateResponse; use OCP\IRequest; use OCP\IUserSession; +use OCA\Theming\ThemingDefaults; +use OCA\SideMenu\Service\Color; class CssController extends Controller { @@ -40,12 +42,30 @@ class CssController extends Controller */ protected $user; - public function __construct(string $appName, IRequest $request, ConfigProxy $config) + /** + * @var ThemingDefaults + */ + protected $theming; + + /** + * @var Color + */ + protected $color; + + public function __construct( + string $appName, + IRequest $request, + ConfigProxy $config, + ThemingDefaults $theming, + Color $color + ) { parent::__construct($appName, $request); $this->user = OC::$server[IUserSession::class]->getUser(); $this->config = $config; + $this->theming = $theming; + $this->color = $color; } /** @@ -90,23 +110,29 @@ class CssController extends Controller $isDarkMode = ($isAccessibilityAppEnabled && $isDarkThemeUserEnabled) || ($isBreezeDarkAppEnabled && $isBreezeDarkUserEnabled); + $primaryColor = $this->theming->getColorPrimary(); + $lightenPrimaryColor = $this->color->adjustBrightness($primaryColor, 0.2); + $darkenPrimaryColor = $this->color->adjustBrightness($primaryColor, -0.2); + $darkenPrimaryColor2 = $this->color->adjustBrightness($primaryColor, -0.3); + $textColor = $this->theming->getTextColorPrimary(); + if ($isDarkMode) { - $backgroundColor = $this->config->getAppValue('dark-mode-background-color', '#333333'); - $backgroundColorTo = $this->config->getAppValue('dark-mode-background-color-to', $backgroundColor); - $currentAppBackgroundColor = $this->config->getAppValue('dark-mode-current-app-background-color', '#444444'); - $loaderColor = $this->config->getAppValue('dark-mode-loader-color', '#cccccc'); - $textColor = $this->config->getAppValue('dark-mode-text-color', '#FFFFFF'); + $backgroundColor = $this->config->getAppValue('dark-mode-background-color', $darkenPrimaryColor); + $backgroundColorTo = $this->config->getAppValue('dark-mode-background-color-to', $darkenPrimaryColor); + $currentAppBackgroundColor = $this->config->getAppValue('dark-mode-current-app-background-color', $darkenPrimaryColor2); + $loaderColor = $this->config->getAppValue('dark-mode-loader-color', $lightenPrimaryColor); + $textColor = $this->config->getAppValue('dark-mode-text-color', $textColor); $iconInvertFilter = abs($this->config->getAppValueInt('dark-mode-icon-invert-filter', '0')).'%'; $iconOpacity = abs($this->config->getAppValueInt('dark-mode-icon-opacity', '100') / 100); $opener = $this->config->getAppValue('dark-mode-opener', 'side-menu-opener'); $backgroundOpacity = dechex($this->config->getAppValueInt('dark-mode-background-color-opacity', '100') * 255 / 100); } else { - $backgroundColor = $this->config->getAppValue('background-color', '#333333'); - $backgroundColorTo = $this->config->getAppValue('background-color-to', $backgroundColor); - $currentAppBackgroundColor = $this->config->getAppValue('current-app-background-color', '#444444'); - $loaderColor = $this->config->getAppValue('loader-color', '#0e75ac'); - $textColor = $this->config->getAppValue('text-color', '#FFFFFF'); + $backgroundColor = $this->config->getAppValue('background-color', $darkenPrimaryColor); + $backgroundColorTo = $this->config->getAppValue('background-color-to', $darkenPrimaryColor); + $currentAppBackgroundColor = $this->config->getAppValue('current-app-background-color', $darkenPrimaryColor2); + $loaderColor = $this->config->getAppValue('loader-color', $lightenPrimaryColor); + $textColor = $this->config->getAppValue('text-color', $textColor); $iconInvertFilter = abs($this->config->getAppValueInt('icon-invert-filter', '0')).'%'; $iconOpacity = abs($this->config->getAppValueInt('icon-opacity', '100') / 100); $opener = $this->config->getAppValue('opener', 'side-menu-opener'); diff --git a/lib/Service/Color.php b/lib/Service/Color.php new file mode 100644 index 0000000..cf90dd6 --- /dev/null +++ b/lib/Service/Color.php @@ -0,0 +1,34 @@ + + */ +class Color +{ + /** + * @thanks https://stackoverflow.com/posts/54393956/revision + */ + public function adjustBrightness(string $hexCode, float $adjustPercent): string + { + $hexCode = ltrim($hexCode, '#'); + + if (3 == strlen($hexCode)) { + $hexCode = $hexCode[0].$hexCode[0].$hexCode[1].$hexCode[1].$hexCode[2].$hexCode[2]; + } + + $hexCode = array_map('hexdec', str_split($hexCode, 2)); + + foreach ($hexCode as &$color) { + $adjustableLimit = $adjustPercent < 0 ? $color : 255 - $color; + $adjustAmount = ceil($adjustableLimit * $adjustPercent); + + $color = str_pad(dechex($color + $adjustAmount), 2, '0', STR_PAD_LEFT); + } + + return '#'.implode($hexCode); + } +} diff --git a/lib/Settings/Admin.php b/lib/Settings/Admin.php index 8885c13..e7a2bab 100644 --- a/lib/Settings/Admin.php +++ b/lib/Settings/Admin.php @@ -26,6 +26,8 @@ use OCP\AppFramework\Http\TemplateResponse; use OCP\IL10N; use OCP\ILogger; use OCP\Settings\ISettings; +use OCA\Theming\ThemingDefaults; +use OCA\SideMenu\Service\Color; class Admin implements ISettings { @@ -54,18 +56,32 @@ class Admin implements ISettings */ private $categoryRepository; + /** + * @var ThemingDefaults + */ + protected $theming; + + /** + * @var Color + */ + protected $color; + public function __construct( IL10N $l, ILogger $logger, ConfigProxy $config, AppRepository $appRepository, - CategoryRepository $categoryRepository + CategoryRepository $categoryRepository, + ThemingDefaults $theming, + Color $color ) { $this->l = $l; $this->logger = $logger; $this->config = $config; $this->appRepository = $appRepository; $this->categoryRepository = $categoryRepository; + $this->theming = $theming; + $this->color = $color; } /** @@ -73,29 +89,35 @@ class Admin implements ISettings */ public function getForm() { - $backgroundColor = $this->config->getAppValue('background-color', '#333333'); - $backgroundColorTo = $this->config->getAppValue('background-color-to', $backgroundColor); + $primaryColor = $this->theming->getColorPrimary(); + $lightenPrimaryColor = $this->color->adjustBrightness($primaryColor, 0.2); + $darkenPrimaryColor = $this->color->adjustBrightness($primaryColor, -0.2); + $darkenPrimaryColor2 = $this->color->adjustBrightness($primaryColor, -0.3); + $textColor = $this->theming->getTextColorPrimary(); - $darkModeBackgroundColor = $this->config->getAppValue('dark-mode-background-color', '#333333'); - $darkModeBackgroundColorTo = $this->config->getAppValue('dark-mode-background-color-to', $darkModeBackgroundColor); + $backgroundColor = $this->config->getAppValue('background-color', $darkenPrimaryColor); + $backgroundColorTo = $this->config->getAppValue('background-color-to', $darkenPrimaryColor); + + $darkModeBackgroundColor = $this->config->getAppValue('dark-mode-background-color', $darkenPrimaryColor); + $darkModeBackgroundColorTo = $this->config->getAppValue('dark-mode-background-color-to', $darkenPrimaryColor); $parameters = [ 'background-color' => $backgroundColor, 'background-color-to' => $backgroundColorTo, 'background-color-opacity' => $this->config->getAppValueInt('background-color-opacity', '100'), - 'current-app-background-color' => $this->config->getAppValue('current-app-background-color', '#444444'), - 'loader-color' => $this->config->getAppValue('loader-color', '#0e75ac'), + 'current-app-background-color' => $this->config->getAppValue('current-app-background-color', $darkenPrimaryColor2), + 'loader-color' => $this->config->getAppValue('loader-color', $lightenPrimaryColor), 'icon-invert-filter' => $this->config->getAppValueInt('icon-invert-filter', '0'), 'icon-opacity' => $this->config->getAppValueInt('icon-opacity', '100'), - 'text-color' => $this->config->getAppValue('text-color', '#FFFFFF'), + 'text-color' => $this->config->getAppValue('text-color', $textColor), 'dark-mode-background-color' => $darkModeBackgroundColor, 'dark-mode-background-color-to' => $darkModeBackgroundColorTo, 'dark-mode-background-color-opacity' => $this->config->getAppValueInt('dark-mode-background-color-opacity', '100'), - 'dark-mode-current-app-background-color' => $this->config->getAppValue('dark-mode-current-app-background-color', '#444444'), - 'dark-mode-loader-color' => $this->config->getAppValue('dark-mode-loader-color', '#cccccc'), + 'dark-mode-current-app-background-color' => $this->config->getAppValue('dark-mode-current-app-background-color', $darkenPrimaryColor2), + 'dark-mode-loader-color' => $this->config->getAppValue('dark-mode-loader-color', $textColor), 'dark-mode-icon-invert-filter' => $this->config->getAppValueInt('dark-mode-icon-invert-filter', '0'), 'dark-mode-icon-opacity' => $this->config->getAppValueInt('dark-mode-icon-opacity', '100'), - 'dark-mode-text-color' => $this->config->getAppValue('dark-mode-text-color', '#FFFFFF'), + 'dark-mode-text-color' => $this->config->getAppValue('dark-mode-text-color', $textColor), 'dark-mode-opener' => $this->config->getAppValue('dark-mode-opener', 'side-menu-opener'), 'opener' => $this->config->getAppValue('opener', 'side-menu-opener'), 'loader-enabled' => $this->config->getAppValue('loader-enabled', '1'),