first commit
This commit is contained in:
@@ -0,0 +1,103 @@
|
||||
/// أدوات تنسيق الوقت والمسافة والسرعة
|
||||
class Formatters {
|
||||
/// Format seconds to HH:MM:SS or MM:SS
|
||||
static String time(int seconds) {
|
||||
int h = seconds ~/ 3600;
|
||||
int m = (seconds % 3600) ~/ 60;
|
||||
int s = seconds % 60;
|
||||
String pad(int n) => n.toString().padLeft(2, '0');
|
||||
if (h > 0) return '${pad(h)}:${pad(m)}:${pad(s)}';
|
||||
return '${pad(m)}:${pad(s)}';
|
||||
}
|
||||
|
||||
/// Format meters to km or m
|
||||
static String distance(double meters) {
|
||||
if (meters >= 1000) {
|
||||
return '${(meters / 1000).toStringAsFixed(2)} km';
|
||||
}
|
||||
return '${meters.toStringAsFixed(0)} m';
|
||||
}
|
||||
|
||||
/// Format distance short (e.g., "5.2")
|
||||
static String distanceKm(double meters) {
|
||||
return (meters / 1000).toStringAsFixed(2);
|
||||
}
|
||||
|
||||
/// Format speed (m/s) to pace (min/km)
|
||||
static String pace(double mps) {
|
||||
if (mps <= 0) return '--:--';
|
||||
double kmh = mps * 3.6;
|
||||
if (kmh <= 0) return '--:--';
|
||||
double paceMinKm = 60.0 / kmh;
|
||||
int min = paceMinKm.toInt();
|
||||
int sec = ((paceMinKm - min) * 60).toInt();
|
||||
return '${min.toString().padLeft(2, '0')}:${sec.toString().padLeft(2, '0')}';
|
||||
}
|
||||
|
||||
/// Format pace with unit
|
||||
static String paceWithUnit(double mps) {
|
||||
return '${pace(mps)} min/km';
|
||||
}
|
||||
|
||||
/// Format speed m/s to km/h
|
||||
static String speedKmh(double mps) {
|
||||
return '${(mps * 3.6).toStringAsFixed(1)} km/h';
|
||||
}
|
||||
|
||||
/// Format calories
|
||||
static String calories(double cal) {
|
||||
return '${cal.toStringAsFixed(0)} kcal';
|
||||
}
|
||||
|
||||
/// Format elevation
|
||||
static String elevation(double meters) {
|
||||
return '${meters.toStringAsFixed(0)} m';
|
||||
}
|
||||
|
||||
/// Format date
|
||||
static String date(DateTime dt) {
|
||||
final months = [
|
||||
'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
|
||||
'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec',
|
||||
];
|
||||
return '${dt.day} ${months[dt.month - 1]} ${dt.year}';
|
||||
}
|
||||
|
||||
/// Format time of day
|
||||
static String timeOfDay(DateTime dt) {
|
||||
String pad(int n) => n.toString().padLeft(2, '0');
|
||||
return '${pad(dt.hour)}:${pad(dt.minute)}';
|
||||
}
|
||||
|
||||
/// Format date and time
|
||||
static String dateTime(DateTime dt) {
|
||||
return '${date(dt)} ${timeOfDay(dt)}';
|
||||
}
|
||||
|
||||
/// Format duration in human readable form
|
||||
static String durationHuman(int seconds) {
|
||||
if (seconds < 60) return '${seconds}s';
|
||||
if (seconds < 3600) return '${seconds ~/ 60}m ${seconds % 60}s';
|
||||
int h = seconds ~/ 3600;
|
||||
int m = (seconds % 3600) ~/ 60;
|
||||
return '${h}h ${m}m';
|
||||
}
|
||||
|
||||
/// Get workout type display name
|
||||
static String workoutType(String type) {
|
||||
switch (type) {
|
||||
case 'running':
|
||||
return '🏃 Running';
|
||||
case 'walking':
|
||||
return '🚶 Walking';
|
||||
default:
|
||||
return type;
|
||||
}
|
||||
}
|
||||
|
||||
/// Format improvement percentage
|
||||
static String improvement(double percent) {
|
||||
String sign = percent >= 0 ? '+' : '';
|
||||
return '$sign${percent.toStringAsFixed(1)}%';
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user