fix colors; add case sensitive and regex checkboxes
This commit is contained in:
parent
ceefe500e9
commit
bfd0baf771
|
|
@ -111,6 +111,22 @@ class LogViewerScreenState extends State<LogViewerScreen> {
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
Checkbox(
|
||||||
|
value: settingsController.useRegex,
|
||||||
|
onChanged: (value) {
|
||||||
|
settingsController.updateUseRegex(value ?? false);
|
||||||
|
_filterLogs();
|
||||||
|
},
|
||||||
|
),
|
||||||
|
const Text('Use Regex'),
|
||||||
|
Checkbox(
|
||||||
|
value: settingsController.caseSensitive,
|
||||||
|
onChanged: (value) {
|
||||||
|
settingsController.updateCaseSensitive(value ?? false);
|
||||||
|
_filterLogs();
|
||||||
|
},
|
||||||
|
),
|
||||||
|
const Text('Case Sensitive'),
|
||||||
DropdownButton<LogLevel>(
|
DropdownButton<LogLevel>(
|
||||||
underline: Container(height: 0),
|
underline: Container(height: 0),
|
||||||
alignment: Alignment.center,
|
alignment: Alignment.center,
|
||||||
|
|
@ -235,7 +251,8 @@ class LogViewerScreenState extends State<LogViewerScreen> {
|
||||||
visibleLogs = logs
|
visibleLogs = logs
|
||||||
.where((log) =>
|
.where((log) =>
|
||||||
log.level.index >= selectedLogLevel.index &&
|
log.level.index >= selectedLogLevel.index &&
|
||||||
log.contains(controller.text))
|
log.contains(controller.text, settingsController.useRegex,
|
||||||
|
caseSensitive: settingsController.caseSensitive))
|
||||||
.toList();
|
.toList();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
@ -247,14 +264,12 @@ class LogViewerScreenState extends State<LogViewerScreen> {
|
||||||
if (line.isNotEmpty) {
|
if (line.isNotEmpty) {
|
||||||
List<String> parts = line.split('\t');
|
List<String> parts = line.split('\t');
|
||||||
if (parts.length >= 5) {
|
if (parts.length >= 5) {
|
||||||
var component = parts[4];
|
|
||||||
int i = component.lastIndexOf('@');
|
|
||||||
parsedLogs.add(LogEntry(
|
parsedLogs.add(LogEntry(
|
||||||
parts[0],
|
parts[0],
|
||||||
fromString(parts[1]),
|
fromString(parts[1]),
|
||||||
parts[2],
|
parts[2],
|
||||||
parts[3],
|
parts[3],
|
||||||
Component(component.substring(0, i), component.substring(i + 1)),
|
parts[4],
|
||||||
parts.sublist(5),
|
parts.sublist(5),
|
||||||
));
|
));
|
||||||
} else if (!line.contains('*** NEW LOG FILE ***')) {
|
} else if (!line.contains('*** NEW LOG FILE ***')) {
|
||||||
|
|
@ -327,22 +342,45 @@ class LogEntry {
|
||||||
final LogLevel level;
|
final LogLevel level;
|
||||||
final String category;
|
final String category;
|
||||||
final String threadId;
|
final String threadId;
|
||||||
final Component component;
|
final String component;
|
||||||
final List<String> message;
|
final List<String> message;
|
||||||
|
|
||||||
LogEntry(this.timestamp, this.level, this.category, this.threadId,
|
LogEntry(this.timestamp, this.level, this.category, this.threadId,
|
||||||
this.component, this.message);
|
this.component, this.message);
|
||||||
|
|
||||||
bool contains(String value) {
|
bool contains(String value, bool useRegex, {bool caseSensitive = false}) {
|
||||||
|
if (useRegex) {
|
||||||
|
try {
|
||||||
|
var regex =
|
||||||
|
RegExp(value, caseSensitive: caseSensitive, multiLine: true);
|
||||||
|
|
||||||
|
return regex.hasMatch(timestamp) ||
|
||||||
|
regex.hasMatch(level.lowerCaseName) ||
|
||||||
|
regex.hasMatch(category) ||
|
||||||
|
regex.hasMatch(threadId) ||
|
||||||
|
regex.hasMatch(component) ||
|
||||||
|
regex.hasMatch(message.join('\n'));
|
||||||
|
} catch (e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else if (caseSensitive) {
|
||||||
|
var v = value;
|
||||||
|
return timestamp.contains(v) ||
|
||||||
|
level.name.contains(v) ||
|
||||||
|
category.contains(v) ||
|
||||||
|
threadId.contains(v) ||
|
||||||
|
component.contains(v) ||
|
||||||
|
message.where((value) => value.contains(v)).isNotEmpty;
|
||||||
|
} else {
|
||||||
var v = value.toLowerCase();
|
var v = value.toLowerCase();
|
||||||
return timestamp.toLowerCase().contains(v) ||
|
return timestamp.toLowerCase().contains(v) ||
|
||||||
level.lowerCaseName.contains(v) ||
|
level.lowerCaseName.contains(v) ||
|
||||||
category.toLowerCase().contains(v) ||
|
category.toLowerCase().contains(v) ||
|
||||||
threadId.toLowerCase().contains(v) ||
|
threadId.toLowerCase().contains(v) ||
|
||||||
component.name.toLowerCase().contains(v) ||
|
component.toLowerCase().contains(v) ||
|
||||||
component.address.toLowerCase().contains(v) ||
|
|
||||||
message.where((value) => value.toLowerCase().contains(v)).isNotEmpty;
|
message.where((value) => value.toLowerCase().contains(v)).isNotEmpty;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class LogEntryWidget extends StatelessWidget {
|
class LogEntryWidget extends StatelessWidget {
|
||||||
|
|
@ -367,7 +405,7 @@ class LogEntryWidget extends StatelessWidget {
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Text(
|
Text(
|
||||||
'Component: ${log.component.name}@${log.component.address}',
|
'Component: ${log.component}',
|
||||||
style: const TextStyle(
|
style: const TextStyle(
|
||||||
fontStyle: FontStyle.italic,
|
fontStyle: FontStyle.italic,
|
||||||
),
|
),
|
||||||
|
|
@ -390,7 +428,7 @@ class LogEntryWidget extends StatelessWidget {
|
||||||
case LogLevel.debug:
|
case LogLevel.debug:
|
||||||
return Colors.green;
|
return Colors.green;
|
||||||
default:
|
default:
|
||||||
return Colors.black;
|
return Colors.blueGrey;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,24 +16,63 @@ class SettingsController with ChangeNotifier {
|
||||||
// Make ThemeMode a private variable so it is not updated directly without
|
// Make ThemeMode a private variable so it is not updated directly without
|
||||||
// also persisting the changes with the SettingsService.
|
// also persisting the changes with the SettingsService.
|
||||||
late ThemeMode _themeMode;
|
late ThemeMode _themeMode;
|
||||||
|
late bool _useRegex;
|
||||||
|
late bool _caseSensitive;
|
||||||
|
|
||||||
// Allow Widgets to read the user's preferred ThemeMode.
|
|
||||||
ThemeMode get themeMode => _themeMode;
|
ThemeMode get themeMode => _themeMode;
|
||||||
|
bool get useRegex => _useRegex;
|
||||||
|
bool get caseSensitive => _caseSensitive;
|
||||||
|
|
||||||
/// Load the user's settings from the SettingsService. It may load from a
|
/// Load the user's settings from the SettingsService. It may load from a
|
||||||
/// local database or the internet. The controller only knows it can load the
|
/// local database or the internet. The controller only knows it can load the
|
||||||
/// settings from the service.
|
/// settings from the service.
|
||||||
Future<void> loadSettings() async {
|
Future<void> loadSettings() async {
|
||||||
_themeMode = await _settingsService.themeMode();
|
_themeMode = await _settingsService.themeMode();
|
||||||
|
_useRegex = await _settingsService.useRegex();
|
||||||
|
_caseSensitive = await _settingsService.caseSensitive();
|
||||||
|
|
||||||
// Important! Inform listeners a change has occurred.
|
// Important! Inform listeners a change has occurred.
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<void> updateCaseSensitive(bool? caseSensitive) async {
|
||||||
|
if (caseSensitive == null) return; // Do nothing if null is passed in.
|
||||||
|
|
||||||
|
// Do not perform any work if new and old ThemeMode are identical
|
||||||
|
if (caseSensitive == _caseSensitive) return;
|
||||||
|
|
||||||
|
// Otherwise, store the new ThemeMode in memory
|
||||||
|
_caseSensitive = caseSensitive;
|
||||||
|
|
||||||
|
// Important! Inform listeners a change has occurred.
|
||||||
|
notifyListeners();
|
||||||
|
|
||||||
|
// Persist the changes to a local database or the internet using the
|
||||||
|
// SettingService.
|
||||||
|
await _settingsService.updateCaseSensitive(caseSensitive);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Update and persist the ThemeMode based on the user's selection.
|
||||||
|
Future<void> updateUseRegex(bool? regex) async {
|
||||||
|
if (regex == null) return; // Do nothing if null is passed in.
|
||||||
|
|
||||||
|
// Do not perform any work if new and old ThemeMode are identical
|
||||||
|
if (regex == _useRegex) return;
|
||||||
|
|
||||||
|
// Otherwise, store the new ThemeMode in memory
|
||||||
|
_useRegex = regex;
|
||||||
|
|
||||||
|
// Important! Inform listeners a change has occurred.
|
||||||
|
notifyListeners();
|
||||||
|
|
||||||
|
// Persist the changes to a local database or the internet using the
|
||||||
|
// SettingService.
|
||||||
|
await _settingsService.updateUseRegex(regex);
|
||||||
|
}
|
||||||
|
|
||||||
/// Update and persist the ThemeMode based on the user's selection.
|
/// Update and persist the ThemeMode based on the user's selection.
|
||||||
Future<void> updateThemeMode(ThemeMode? newThemeMode) async {
|
Future<void> updateThemeMode(ThemeMode? newThemeMode) async {
|
||||||
if (newThemeMode == null) return;
|
if (newThemeMode == null) return; // Do nothing if null is passed in.
|
||||||
|
|
||||||
// Do not perform any work if new and old ThemeMode are identical
|
// Do not perform any work if new and old ThemeMode are identical
|
||||||
if (newThemeMode == _themeMode) return;
|
if (newThemeMode == _themeMode) return;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -17,9 +17,30 @@ class SettingsService {
|
||||||
return ThemeMode.system;
|
return ThemeMode.system;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<bool> useRegex() async {
|
||||||
|
var prefs = await SharedPreferences.getInstance();
|
||||||
|
return prefs.getBool("useRegex") ?? false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<bool> caseSensitive() async {
|
||||||
|
var prefs = await SharedPreferences.getInstance();
|
||||||
|
return prefs.getBool("caseSensitive") ?? false;
|
||||||
|
}
|
||||||
|
|
||||||
/// Persists the user's preferred ThemeMode to local or remote storage.
|
/// Persists the user's preferred ThemeMode to local or remote storage.
|
||||||
Future<void> updateThemeMode(ThemeMode theme) async {
|
Future<void> updateThemeMode(ThemeMode theme) async {
|
||||||
var prefs = await SharedPreferences.getInstance();
|
var prefs = await SharedPreferences.getInstance();
|
||||||
prefs.setInt("theme", theme.index);
|
prefs.setInt("theme", theme.index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Persists the user's preferred ThemeMode to local or remote storage.
|
||||||
|
Future<void> updateUseRegex(bool useRegex) async {
|
||||||
|
var prefs = await SharedPreferences.getInstance();
|
||||||
|
prefs.setBool("useRegex", useRegex);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> updateCaseSensitive(bool caseSensitive) async {
|
||||||
|
var prefs = await SharedPreferences.getInstance();
|
||||||
|
prefs.setBool("caseSensitive", caseSensitive);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue