Skip to content

Commit

Permalink
feat: Support GNOME accent colors (#911)
Browse files Browse the repository at this point in the history
* feat: Support GNOME accent colors
Fixes #908
  • Loading branch information
Feichtmeier authored Aug 22, 2024
1 parent b55ccb1 commit 838988d
Show file tree
Hide file tree
Showing 17 changed files with 124 additions and 246 deletions.
1 change: 1 addition & 0 deletions example/lib/pages/theme_page/src/colors/colors_view.dart
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,7 @@ Map<String, (Color, Color?)> _getBaseColors(ThemeData theme) {
return colors;
}

// TODO: update example with new adwaita colors
Map<String, (Color, Color?)> _getYaruPrimaryColors(ThemeData theme) {
return {
'orange': (YaruColors.orange, theme.colorScheme.onPrimary),
Expand Down
33 changes: 33 additions & 0 deletions lib/src/colors.dart
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,9 @@ class YaruColors {
/// Sage
static const Color sage = Color(0xFF657B69);

/// Warty Brown
static const Color brown = Color(0xFFB39169);

/// Prussian Green
static const Color prussianGreen = Color(0xFF308280);

Expand Down Expand Up @@ -148,6 +151,36 @@ class YaruColors {

/// Xubuntu Blue
static const Color xubuntuBlue = Color(0xFF0044AA);

/// Adwaita accents with 24.10+
/// https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/enum.AccentColor.html
/// Adwaita Blue
static const Color adwaitaBlue = Color(0xFF3584e4);

/// Adwaita Teal
static const Color adwaitaTeal = Color(0xFF2190a4);

/// Adwaita Green
static const Color adwaitaGreen = Color(0xFF3a944a);

/// Adwaita Yellow
static const Color adwaitaYellow = Color(0xFFc88800);

/// Adwaita Orange
static const Color adwaitaOrange = Color(0xFFed5b00);

/// Adwaita Red
static const Color adwaitaRed = Color(0xFFe62d42);

/// Adwaita Pink
static const Color adwaitaPink = Color(0xFFd56199);

/// Adwaita Purple
static const Color adwaitaPurple = Color(0xFF9141ac);

/// Adwaita Slate
static const Color adwaitaSlate = Color(0xFF6f8396);
}

/// Set of useful methods when working with [Color]
Expand Down
10 changes: 3 additions & 7 deletions lib/src/settings.dart
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,10 @@ class YaruGtkSettings extends YaruSettings {
super._();

final GtkSettings _settings;

@override
String? getThemeName() {
return _settings.getProperty(kGtkThemeName) as String?;
}
String? getThemeName() => _settings.getProperty(kGtkThemeName) as String?;

@override
Stream<String?> get themeNameChanged {
return _settings.notifyProperty(kGtkThemeName).cast<String?>();
}
Stream<String?> get themeNameChanged =>
_settings.notifyProperty(kGtkThemeName).cast<String?>();
}
56 changes: 40 additions & 16 deletions lib/src/theme_widgets/inherited_theme.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,24 +3,26 @@ import 'dart:async';
import 'package:collection/collection.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:platform/platform.dart';
import 'package:platform_linux/platform.dart';
import 'package:yaru/src/settings.dart';

import '../../theme.dart';

YaruVariant? _detectYaruVariant(Platform platform) {
YaruVariant? _defaultFallBackVariant(Platform platform) {
final desktop = !kIsWeb
? platform.environment['XDG_CURRENT_DESKTOP']?.toUpperCase()
: null;

if (desktop != null) {
if (desktop.contains('BUDGIE')) return YaruVariant.ubuntuBudgieBlue;
if (desktop.contains('CINNAMON')) return YaruVariant.ubuntuCinnamonBrown;
if (desktop.contains('GNOME')) return YaruVariant.orange;
if (desktop.contains('KDE')) return YaruVariant.kubuntuBlue;
if (desktop.contains('LXQT')) return YaruVariant.lubuntuBlue;
if (desktop.contains('MATE')) return YaruVariant.ubuntuMateGreen;
if (desktop.contains('UNITY')) return YaruVariant.ubuntuUnityPurple;
if (desktop.contains('XFCE')) return YaruVariant.xubuntuBlue;
if (platform.isBudgie) return YaruVariant.ubuntuBudgieBlue;
if (platform.isCinnamon) return YaruVariant.ubuntuCinnamonBrown;
if (platform.isGNOME && platform.isUbuntu) return YaruVariant.orange;
if (platform.isGNOME) return YaruVariant.adwaitaBlue;
if (platform.isKDE) return YaruVariant.kubuntuBlue;
if (platform.isLXQt) return YaruVariant.lubuntuBlue;
if (platform.isMATE) return YaruVariant.ubuntuMateGreen;
if (platform.isUnity) return YaruVariant.ubuntuUnityPurple;
if (platform.isXfce) return YaruVariant.xubuntuBlue;
}
return null;
}
Expand Down Expand Up @@ -171,23 +173,45 @@ class _YaruThemeState extends State<YaruTheme> {
!widget._platform.environment.containsKey('FLUTTER_TEST');
}

final _darkSuffix = '-dark';
final _yaruPrefix = 'Yaru-';
// "Yaru-prussiangreen-dark" => YaruAccent.prussianGreen
YaruVariant? resolveVariant(String? name) {
if (name?.endsWith('-dark') == true) {
if (name?.endsWith(_darkSuffix) == true) {
name = name!.substring(0, name.length - 5);
}
if (name?.startsWith('Yaru-') == true) {
name = name!.substring(5);
if (name?.startsWith(_yaruPrefix) == true) {
name = name!.substring(_yaruPrefix.length);
}

if (name == 'Yaru') {
return YaruVariant.orange;
}
for (final value in YaruVariant.values) {
if (value.name.toLowerCase() == name?.toLowerCase()) {
return value;
if (value.name.replaceAll('adwaita', '').toLowerCase() ==
name?.toLowerCase()) {
return _mapGnomeColor(value);
}
}
return _detectYaruVariant(widget._platform);
return _defaultFallBackVariant(widget._platform);
}

YaruVariant _mapGnomeColor(YaruVariant variant) {
if (widget._platform.isGNOME && widget._platform.isUbuntu) {
return variant;
}
return switch (variant) {
YaruVariant.blue => YaruVariant.adwaitaBlue,
YaruVariant.red => YaruVariant.adwaitaRed,
YaruVariant.orange => YaruVariant.adwaitaOrange,
YaruVariant.purple => YaruVariant.adwaitaPurple,
YaruVariant.magenta => YaruVariant.adwaitaPink,
YaruVariant.prussianGreen ||
YaruVariant.ubuntuMateGreen ||
YaruVariant.adwaitaSlate =>
YaruVariant.adwaitaGreen,
_ => variant
};
}

void updateVariant([String? value]) {
Expand Down
11 changes: 0 additions & 11 deletions lib/src/themes/kubuntu.dart

This file was deleted.

11 changes: 0 additions & 11 deletions lib/src/themes/lubuntu.dart

This file was deleted.

11 changes: 0 additions & 11 deletions lib/src/themes/ubuntu_budgie.dart

This file was deleted.

11 changes: 0 additions & 11 deletions lib/src/themes/ubuntu_butterfly.dart

This file was deleted.

11 changes: 0 additions & 11 deletions lib/src/themes/ubuntu_cinnamon.dart

This file was deleted.

11 changes: 0 additions & 11 deletions lib/src/themes/ubuntu_mate.dart

This file was deleted.

11 changes: 0 additions & 11 deletions lib/src/themes/ubuntu_studio.dart

This file was deleted.

11 changes: 0 additions & 11 deletions lib/src/themes/ubuntu_unity.dart

This file was deleted.

90 changes: 46 additions & 44 deletions lib/src/themes/variant.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import 'package:flutter/material.dart';
import 'package:yaru/src/themes/ubuntu_butterfly.dart';

import '../../theme.dart';

/// Describes a Yaru variant and its primary color.
Expand All @@ -14,6 +14,16 @@ enum YaruVariant {
purple(YaruColors.purple),
magenta(YaruColors.magenta),
red(YaruColors.red),
brown(YaruColors.brown),
adwaitaBlue(YaruColors.adwaitaBlue),
adwaitaTeal(YaruColors.adwaitaTeal),
adwaitaGreen(YaruColors.adwaitaGreen),
adwaitaYellow(YaruColors.adwaitaYellow),
adwaitaOrange(YaruColors.adwaitaOrange),
adwaitaRed(YaruColors.adwaitaRed),
adwaitaPink(YaruColors.adwaitaPink),
adwaitaPurple(YaruColors.adwaitaPurple),
adwaitaSlate(YaruColors.adwaitaSlate),

/// Kubuntu
kubuntuBlue(YaruColors.kubuntuBlue),
Expand Down Expand Up @@ -65,49 +75,41 @@ enum YaruVariant {
purple,
magenta,
red,
brown,
adwaitaBlue,
adwaitaTeal,
adwaitaGreen,
adwaitaYellow,
adwaitaOrange,
adwaitaRed,
adwaitaPink,
adwaitaPurple,
adwaitaSlate,
];
}

final _yaruLightThemes = <YaruVariant, ThemeData>{
YaruVariant.orange: yaruLight,
YaruVariant.bark: yaruBarkLight,
YaruVariant.sage: yaruSageLight,
YaruVariant.olive: yaruOliveLight,
YaruVariant.viridian: yaruViridianLight,
YaruVariant.prussianGreen: yaruPrussianGreenLight,
YaruVariant.blue: yaruBlueLight,
YaruVariant.purple: yaruPurpleLight,
YaruVariant.magenta: yaruMagentaLight,
YaruVariant.red: yaruRedLight,
YaruVariant.kubuntuBlue: yaruKubuntuLight,
YaruVariant.lubuntuBlue: yaruLubuntuLight,
YaruVariant.ubuntuBudgieBlue: yaruUbuntuBudgieLight,
YaruVariant.ubuntuButterflyPink: yaruUbuntuButterflyLight,
YaruVariant.ubuntuCinnamonBrown: yaruUbuntuCinnamonLight,
YaruVariant.ubuntuMateGreen: yaruUbuntuMateLight,
YaruVariant.ubuntuStudioBlue: yaruUbuntuStudioLight,
YaruVariant.ubuntuUnityPurple: yaruUbuntuUnityLight,
YaruVariant.xubuntuBlue: yaruXubuntuLight,
};

final _yaruDarkThemes = <YaruVariant, ThemeData>{
YaruVariant.orange: yaruDark,
YaruVariant.bark: yaruBarkDark,
YaruVariant.sage: yaruSageDark,
YaruVariant.olive: yaruOliveDark,
YaruVariant.viridian: yaruViridianDark,
YaruVariant.prussianGreen: yaruPrussianGreenDark,
YaruVariant.blue: yaruBlueDark,
YaruVariant.purple: yaruPurpleDark,
YaruVariant.magenta: yaruMagentaDark,
YaruVariant.red: yaruRedDark,
YaruVariant.kubuntuBlue: yaruKubuntuDark,
YaruVariant.lubuntuBlue: yaruLubuntuDark,
YaruVariant.ubuntuBudgieBlue: yaruUbuntuBudgieDark,
YaruVariant.ubuntuButterflyPink: yaruUbuntuButterflyDark,
YaruVariant.ubuntuCinnamonBrown: yaruUbuntuCinnamonDark,
YaruVariant.ubuntuMateGreen: yaruUbuntuMateDark,
YaruVariant.ubuntuStudioBlue: yaruUbuntuStudioDark,
YaruVariant.ubuntuUnityPurple: yaruUbuntuUnityDark,
YaruVariant.xubuntuBlue: yaruXubuntuDark,
};
final _yaruLightThemes = Map<YaruVariant, ThemeData>.fromEntries(
YaruVariant.values.map(
(e) => MapEntry<YaruVariant, ThemeData>(
e,
e == YaruVariant.orange
? yaruLight
: createYaruLightTheme(
primaryColor: e.color,
),
),
),
);

final _yaruDarkThemes = Map<YaruVariant, ThemeData>.fromEntries(
YaruVariant.values.map(
(e) => MapEntry<YaruVariant, ThemeData>(
e,
e == YaruVariant.orange
? yaruDark
: createYaruDarkTheme(
primaryColor: e.color,
),
),
),
);
11 changes: 0 additions & 11 deletions lib/src/themes/xubuntu.dart

This file was deleted.

Loading

0 comments on commit 838988d

Please sign in to comment.