readd: home drawer

Fixes #900
This commit is contained in:
lollipopkit🏳️‍⚧️
2025-09-05 00:12:41 +08:00
parent 1bac986fe0
commit eadd343205
27 changed files with 88 additions and 26 deletions

View File

@@ -1729,6 +1729,12 @@ abstract class AppLocalizations {
/// In en, this message translates to: /// In en, this message translates to:
/// **'At least one tab must be selected'** /// **'At least one tab must be selected'**
String get atLeastOneTab; String get atLeastOneTab;
/// No description provided for @serverTabRequired.
///
/// In en, this message translates to:
/// **'Server tab cannot be removed'**
String get serverTabRequired;
} }
class _AppLocalizationsDelegate class _AppLocalizationsDelegate

View File

@@ -911,4 +911,7 @@ class AppLocalizationsDe extends AppLocalizations {
@override @override
String get atLeastOneTab => 'Mindestens ein Tab muss ausgewählt sein'; String get atLeastOneTab => 'Mindestens ein Tab muss ausgewählt sein';
@override
String get serverTabRequired => 'Server-Tab kann nicht entfernt werden';
} }

View File

@@ -903,4 +903,7 @@ class AppLocalizationsEn extends AppLocalizations {
@override @override
String get atLeastOneTab => 'At least one tab must be selected'; String get atLeastOneTab => 'At least one tab must be selected';
@override
String get serverTabRequired => 'Server tab cannot be removed';
} }

View File

@@ -913,4 +913,7 @@ class AppLocalizationsEs extends AppLocalizations {
@override @override
String get atLeastOneTab => 'Al menos una pestaña debe estar seleccionada'; String get atLeastOneTab => 'Al menos una pestaña debe estar seleccionada';
@override
String get serverTabRequired => 'Server tab cannot be removed';
} }

View File

@@ -916,4 +916,7 @@ class AppLocalizationsFr extends AppLocalizations {
@override @override
String get atLeastOneTab => 'Au moins un onglet doit être sélectionné'; String get atLeastOneTab => 'Au moins un onglet doit être sélectionné';
@override
String get serverTabRequired => 'Server tab cannot be removed';
} }

View File

@@ -903,4 +903,7 @@ class AppLocalizationsId extends AppLocalizations {
@override @override
String get atLeastOneTab => 'Setidaknya satu tab harus dipilih'; String get atLeastOneTab => 'Setidaknya satu tab harus dipilih';
@override
String get serverTabRequired => 'Server tab cannot be removed';
} }

View File

@@ -876,4 +876,7 @@ class AppLocalizationsJa extends AppLocalizations {
@override @override
String get atLeastOneTab => '少なくとも1つのタブを選択する必要があります'; String get atLeastOneTab => '少なくとも1つのタブを選択する必要があります';
@override
String get serverTabRequired => 'サーバータブは削除できません';
} }

View File

@@ -910,4 +910,7 @@ class AppLocalizationsNl extends AppLocalizations {
@override @override
String get atLeastOneTab => String get atLeastOneTab =>
'Er moet minimaal één tabblad worden geselecteerd'; 'Er moet minimaal één tabblad worden geselecteerd';
@override
String get serverTabRequired => 'Server tab cannot be removed';
} }

View File

@@ -906,4 +906,7 @@ class AppLocalizationsPt extends AppLocalizations {
@override @override
String get atLeastOneTab => 'Pelo menos uma aba deve ser selecionada'; String get atLeastOneTab => 'Pelo menos uma aba deve ser selecionada';
@override
String get serverTabRequired => 'Server tab cannot be removed';
} }

View File

@@ -908,4 +908,7 @@ class AppLocalizationsRu extends AppLocalizations {
@override @override
String get atLeastOneTab => 'Должна быть выбрана хотя бы одна вкладка'; String get atLeastOneTab => 'Должна быть выбрана хотя бы одна вкладка';
@override
String get serverTabRequired => 'Server tab cannot be removed';
} }

View File

@@ -903,4 +903,7 @@ class AppLocalizationsTr extends AppLocalizations {
@override @override
String get atLeastOneTab => 'En az bir sekme seçilmelidir'; String get atLeastOneTab => 'En az bir sekme seçilmelidir';
@override
String get serverTabRequired => 'Server tab cannot be removed';
} }

View File

@@ -909,4 +909,7 @@ class AppLocalizationsUk extends AppLocalizations {
@override @override
String get atLeastOneTab => 'Потрібно вибрати принаймні одну вкладку'; String get atLeastOneTab => 'Потрібно вибрати принаймні одну вкладку';
@override
String get serverTabRequired => 'Server tab cannot be removed';
} }

View File

@@ -861,6 +861,9 @@ class AppLocalizationsZh extends AppLocalizations {
@override @override
String get atLeastOneTab => '至少需要选择一个标签'; String get atLeastOneTab => '至少需要选择一个标签';
@override
String get serverTabRequired => '服务器标签不能被移除';
} }
/// The translations for Chinese, as used in Taiwan (`zh_TW`). /// The translations for Chinese, as used in Taiwan (`zh_TW`).
@@ -1720,4 +1723,7 @@ class AppLocalizationsZhTw extends AppLocalizationsZh {
@override @override
String get atLeastOneTab => '至少需要選擇一個標籤'; String get atLeastOneTab => '至少需要選擇一個標籤';
@override
String get serverTabRequired => '服務器標籤不能被移除';
} }

View File

@@ -281,5 +281,6 @@
"homeTabsCustomizeDesc": "Passen Sie an, welche Tabs auf der Startseite angezeigt werden und ihre Reihenfolge", "homeTabsCustomizeDesc": "Passen Sie an, welche Tabs auf der Startseite angezeigt werden und ihre Reihenfolge",
"reset": "Zurücksetzen", "reset": "Zurücksetzen",
"availableTabs": "Verfügbare Tabs", "availableTabs": "Verfügbare Tabs",
"atLeastOneTab": "Mindestens ein Tab muss ausgewählt sein" "atLeastOneTab": "Mindestens ein Tab muss ausgewählt sein",
} "serverTabRequired": "Server-Tab kann nicht entfernt werden"
}

View File

@@ -281,5 +281,6 @@
"homeTabsCustomizeDesc": "Customize which tabs appear on the home page and their order", "homeTabsCustomizeDesc": "Customize which tabs appear on the home page and their order",
"reset": "Reset", "reset": "Reset",
"availableTabs": "Available Tabs", "availableTabs": "Available Tabs",
"atLeastOneTab": "At least one tab must be selected" "atLeastOneTab": "At least one tab must be selected",
"serverTabRequired": "Server tab cannot be removed"
} }

View File

@@ -281,5 +281,6 @@
"homeTabsCustomizeDesc": "Personaliza qué pestañas aparecen en la página de inicio y su orden", "homeTabsCustomizeDesc": "Personaliza qué pestañas aparecen en la página de inicio y su orden",
"reset": "Restablecer", "reset": "Restablecer",
"availableTabs": "Pestañas disponibles", "availableTabs": "Pestañas disponibles",
"atLeastOneTab": "Al menos una pestaña debe estar seleccionada" "atLeastOneTab": "Al menos una pestaña debe estar seleccionada",
} "serverTabRequired": "Server tab cannot be removed"
}

View File

@@ -281,5 +281,6 @@
"homeTabsCustomizeDesc": "Personnalisez les onglets qui apparaissent sur la page d'accueil et leur ordre", "homeTabsCustomizeDesc": "Personnalisez les onglets qui apparaissent sur la page d'accueil et leur ordre",
"reset": "Réinitialiser", "reset": "Réinitialiser",
"availableTabs": "Onglets disponibles", "availableTabs": "Onglets disponibles",
"atLeastOneTab": "Au moins un onglet doit être sélectionné" "atLeastOneTab": "Au moins un onglet doit être sélectionné",
} "serverTabRequired": "Server tab cannot be removed"
}

View File

@@ -281,5 +281,6 @@
"homeTabsCustomizeDesc": "Sesuaikan tab mana yang muncul di halaman beranda dan urutannya", "homeTabsCustomizeDesc": "Sesuaikan tab mana yang muncul di halaman beranda dan urutannya",
"reset": "Reset", "reset": "Reset",
"availableTabs": "Tab Tersedia", "availableTabs": "Tab Tersedia",
"atLeastOneTab": "Setidaknya satu tab harus dipilih" "atLeastOneTab": "Setidaknya satu tab harus dipilih",
} "serverTabRequired": "Server tab cannot be removed"
}

View File

@@ -281,5 +281,6 @@
"homeTabsCustomizeDesc": "ホームページに表示するタブとその順序をカスタマイズします", "homeTabsCustomizeDesc": "ホームページに表示するタブとその順序をカスタマイズします",
"reset": "リセット", "reset": "リセット",
"availableTabs": "利用可能なタブ", "availableTabs": "利用可能なタブ",
"atLeastOneTab": "少なくとも1つのタブを選択する必要があります" "atLeastOneTab": "少なくとも1つのタブを選択する必要があります",
} "serverTabRequired": "サーバータブは削除できません"
}

View File

@@ -281,5 +281,6 @@
"homeTabsCustomizeDesc": "Pas aan welke tabbladen op de startpagina worden weergegeven en hun volgorde", "homeTabsCustomizeDesc": "Pas aan welke tabbladen op de startpagina worden weergegeven en hun volgorde",
"reset": "Resetten", "reset": "Resetten",
"availableTabs": "Beschikbare tabbladen", "availableTabs": "Beschikbare tabbladen",
"atLeastOneTab": "Er moet minimaal één tabblad worden geselecteerd" "atLeastOneTab": "Er moet minimaal één tabblad worden geselecteerd",
} "serverTabRequired": "Server tab cannot be removed"
}

View File

@@ -281,5 +281,6 @@
"homeTabsCustomizeDesc": "Personalize quais abas aparecem na página inicial e sua ordem", "homeTabsCustomizeDesc": "Personalize quais abas aparecem na página inicial e sua ordem",
"reset": "Redefinir", "reset": "Redefinir",
"availableTabs": "Abas disponíveis", "availableTabs": "Abas disponíveis",
"atLeastOneTab": "Pelo menos uma aba deve ser selecionada" "atLeastOneTab": "Pelo menos uma aba deve ser selecionada",
} "serverTabRequired": "Server tab cannot be removed"
}

View File

@@ -281,5 +281,6 @@
"homeTabsCustomizeDesc": "Настройте, какие вкладки появляются на главной странице и их порядок", "homeTabsCustomizeDesc": "Настройте, какие вкладки появляются на главной странице и их порядок",
"reset": "Сброс", "reset": "Сброс",
"availableTabs": "Доступные вкладки", "availableTabs": "Доступные вкладки",
"atLeastOneTab": "Должна быть выбрана хотя бы одна вкладка" "atLeastOneTab": "Должна быть выбрана хотя бы одна вкладка",
} "serverTabRequired": "Server tab cannot be removed"
}

View File

@@ -281,5 +281,6 @@
"homeTabsCustomizeDesc": "Ana sayfada görünecek sekmeleri ve sıralarını özelleştirin", "homeTabsCustomizeDesc": "Ana sayfada görünecek sekmeleri ve sıralarını özelleştirin",
"reset": "Sıfırla", "reset": "Sıfırla",
"availableTabs": "Mevcut Sekmeler", "availableTabs": "Mevcut Sekmeler",
"atLeastOneTab": "En az bir sekme seçilmelidir" "atLeastOneTab": "En az bir sekme seçilmelidir",
} "serverTabRequired": "Server tab cannot be removed"
}

View File

@@ -281,5 +281,6 @@
"homeTabsCustomizeDesc": "Налаштуйте, які вкладки відображаються на головній сторінці та їх порядок", "homeTabsCustomizeDesc": "Налаштуйте, які вкладки відображаються на головній сторінці та їх порядок",
"reset": "Скинути", "reset": "Скинути",
"availableTabs": "Доступні вкладки", "availableTabs": "Доступні вкладки",
"atLeastOneTab": "Потрібно вибрати принаймні одну вкладку" "atLeastOneTab": "Потрібно вибрати принаймні одну вкладку",
} "serverTabRequired": "Server tab cannot be removed"
}

View File

@@ -281,5 +281,6 @@
"homeTabsCustomizeDesc": "自定义主页上显示的标签及其顺序", "homeTabsCustomizeDesc": "自定义主页上显示的标签及其顺序",
"reset": "重置", "reset": "重置",
"availableTabs": "可用标签", "availableTabs": "可用标签",
"atLeastOneTab": "至少需要选择一个标签" "atLeastOneTab": "至少需要选择一个标签",
"serverTabRequired": "服务器标签不能被移除"
} }

View File

@@ -281,5 +281,6 @@
"homeTabsCustomizeDesc": "自訂主頁上顯示的標籤及其順序", "homeTabsCustomizeDesc": "自訂主頁上顯示的標籤及其順序",
"reset": "重置", "reset": "重置",
"availableTabs": "可用標籤", "availableTabs": "可用標籤",
"atLeastOneTab": "至少需要選擇一個標籤" "atLeastOneTab": "至少需要選擇一個標籤",
} "serverTabRequired": "服務器標籤不能被移除"
}

View File

@@ -68,7 +68,7 @@ class _HomeTabsConfigPageState extends ConsumerState<HomeTabsConfigPage> {
} }
Widget _buildTabItem(AppTab tab, int index, bool isSelected) { Widget _buildTabItem(AppTab tab, int index, bool isSelected) {
final canRemove = _selectedTabs.length > 1; final canRemove = _selectedTabs.length > 1 && tab != AppTab.server;
final child = ListTile( final child = ListTile(
leading: tab.navDestination.icon, leading: tab.navDestination.icon,
title: Text(tab.navDestination.label), title: Text(tab.navDestination.label),
@@ -77,7 +77,7 @@ class _HomeTabsConfigPageState extends ConsumerState<HomeTabsConfigPage> {
icon: const Icon(Icons.delete), icon: const Icon(Icons.delete),
onPressed: canRemove ? () => _removeTab(tab) : null, onPressed: canRemove ? () => _removeTab(tab) : null,
color: canRemove ? null : Theme.of(context).disabledColor, color: canRemove ? null : Theme.of(context).disabledColor,
tooltip: canRemove ? libL10n.delete : l10n.atLeastOneTab, tooltip: canRemove ? libL10n.delete : (tab == AppTab.server ? l10n.serverTabRequired : l10n.atLeastOneTab),
) )
: IconButton(icon: const Icon(Icons.add), onPressed: () => _addTab(tab)), : IconButton(icon: const Icon(Icons.add), onPressed: () => _addTab(tab)),
onTap: isSelected && canRemove ? () => _removeTab(tab) : null, onTap: isSelected && canRemove ? () => _removeTab(tab) : null,
@@ -111,6 +111,10 @@ class _HomeTabsConfigPageState extends ConsumerState<HomeTabsConfigPage> {
context.showSnackBar(l10n.atLeastOneTab); context.showSnackBar(l10n.atLeastOneTab);
return; return;
} }
if (tab == AppTab.server) {
context.showSnackBar(l10n.serverTabRequired);
return;
}
setState(() { setState(() {
_selectedTabs.remove(tab); _selectedTabs.remove(tab);
}); });