mirror of
https://github.com/KRTirtho/spotube.git
synced 2025-09-13 07:55:18 +00:00
chore: titlebar buttons not working
This commit is contained in:
parent
2daea2b3ef
commit
5a14f587a0
@ -7,6 +7,8 @@ import 'package:spotube/provider/user_preferences/user_preferences_provider.dart
|
|||||||
import 'package:spotube/utils/platform.dart';
|
import 'package:spotube/utils/platform.dart';
|
||||||
import 'package:window_manager/window_manager.dart';
|
import 'package:window_manager/window_manager.dart';
|
||||||
|
|
||||||
|
final kTitlebarVisible = kIsWindows || kIsLinux;
|
||||||
|
|
||||||
class TitleBar extends HookConsumerWidget implements PreferredSizeWidget {
|
class TitleBar extends HookConsumerWidget implements PreferredSizeWidget {
|
||||||
final bool automaticallyImplyLeading;
|
final bool automaticallyImplyLeading;
|
||||||
final List<Widget> trailing;
|
final List<Widget> trailing;
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_hooks/flutter_hooks.dart';
|
import 'package:flutter_hooks/flutter_hooks.dart';
|
||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
|
import 'package:shadcn_flutter/shadcn_flutter_extension.dart';
|
||||||
|
import 'package:spotube/components/titlebar/titlebar.dart';
|
||||||
import 'package:spotube/components/titlebar/titlebar_icon_buttons.dart';
|
import 'package:spotube/components/titlebar/titlebar_icon_buttons.dart';
|
||||||
import 'package:spotube/components/titlebar/window_button.dart';
|
import 'package:spotube/components/titlebar/window_button.dart';
|
||||||
import 'package:spotube/provider/user_preferences/user_preferences_provider.dart';
|
import 'package:spotube/provider/user_preferences/user_preferences_provider.dart';
|
||||||
@ -20,6 +22,7 @@ class WindowTitleBarButtons extends HookConsumerWidget {
|
|||||||
final preferences = ref.watch(userPreferencesProvider);
|
final preferences = ref.watch(userPreferencesProvider);
|
||||||
final isMaximized = useState<bool?>(null);
|
final isMaximized = useState<bool?>(null);
|
||||||
const type = ThemeType.auto;
|
const type = ThemeType.auto;
|
||||||
|
final scale = context.theme.scaling;
|
||||||
|
|
||||||
Future<void> onClose() async {
|
Future<void> onClose() async {
|
||||||
await windowManager.close();
|
await windowManager.close();
|
||||||
@ -34,7 +37,7 @@ class WindowTitleBarButtons extends HookConsumerWidget {
|
|||||||
return null;
|
return null;
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
if (!kIsDesktop || kIsMacOS || preferences.systemTitleBar) {
|
if (!kTitlebarVisible || preferences.systemTitleBar) {
|
||||||
return const SizedBox.shrink();
|
return const SizedBox.shrink();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -43,8 +46,8 @@ class WindowTitleBarButtons extends HookConsumerWidget {
|
|||||||
final colors = WindowButtonColors(
|
final colors = WindowButtonColors(
|
||||||
normal: Colors.transparent,
|
normal: Colors.transparent,
|
||||||
iconNormal: foregroundColor ?? theme.colorScheme.onSurface,
|
iconNormal: foregroundColor ?? theme.colorScheme.onSurface,
|
||||||
mouseOver: theme.colorScheme.onSurface.withOpacity(0.1),
|
mouseOver: theme.colorScheme.onSurface.withAlpha(25),
|
||||||
mouseDown: theme.colorScheme.onSurface.withOpacity(0.2),
|
mouseDown: theme.colorScheme.onSurface.withAlpha(51),
|
||||||
iconMouseOver: theme.colorScheme.onSurface,
|
iconMouseOver: theme.colorScheme.onSurface,
|
||||||
iconMouseDown: theme.colorScheme.onSurface,
|
iconMouseDown: theme.colorScheme.onSurface,
|
||||||
);
|
);
|
||||||
@ -58,8 +61,8 @@ class WindowTitleBarButtons extends HookConsumerWidget {
|
|||||||
iconMouseDown: Colors.black,
|
iconMouseDown: Colors.black,
|
||||||
);
|
);
|
||||||
|
|
||||||
return Padding(
|
return Transform(
|
||||||
padding: const EdgeInsets.only(bottom: 25),
|
transform: Matrix4.translationValues(18, -12, 0) * scale,
|
||||||
child: Row(
|
child: Row(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
@ -92,8 +95,8 @@ class WindowTitleBarButtons extends HookConsumerWidget {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Padding(
|
return Transform(
|
||||||
padding: const EdgeInsets.only(bottom: 20, left: 10),
|
transform: Matrix4.translationValues(18, -12, 0) * scale,
|
||||||
child: Row(
|
child: Row(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
|
@ -1,8 +1,6 @@
|
|||||||
import 'dart:io';
|
import 'package:shadcn_flutter/shadcn_flutter.dart';
|
||||||
|
|
||||||
import 'package:flutter/foundation.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:spotube/components/titlebar/mouse_state.dart';
|
import 'package:spotube/components/titlebar/mouse_state.dart';
|
||||||
|
import 'package:spotube/components/titlebar/titlebar.dart';
|
||||||
|
|
||||||
typedef WindowButtonIconBuilder = Widget Function(
|
typedef WindowButtonIconBuilder = Widget Function(
|
||||||
WindowButtonContext buttonContext);
|
WindowButtonContext buttonContext);
|
||||||
@ -86,14 +84,7 @@ class WindowButton extends StatelessWidget {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
if (kIsWeb) {
|
if (!kTitlebarVisible) return const SizedBox.shrink();
|
||||||
return Container();
|
|
||||||
} else {
|
|
||||||
// Don't show button on macOS
|
|
||||||
if (Platform.isMacOS) {
|
|
||||||
return Container();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return MouseStateBuilder(
|
return MouseStateBuilder(
|
||||||
builder: (context, mouseState) {
|
builder: (context, mouseState) {
|
||||||
@ -103,11 +94,12 @@ class WindowButton extends StatelessWidget {
|
|||||||
backgroundColor: getBackgroundColor(mouseState),
|
backgroundColor: getBackgroundColor(mouseState),
|
||||||
iconColor: getIconColor(mouseState));
|
iconColor: getIconColor(mouseState));
|
||||||
|
|
||||||
var icon =
|
var icon = (iconBuilder != null)
|
||||||
(iconBuilder != null) ? iconBuilder!(buttonContext) : Container();
|
? iconBuilder!(buttonContext)
|
||||||
|
: const SizedBox();
|
||||||
|
|
||||||
var fadeOutColor =
|
var fadeOutColor =
|
||||||
getBackgroundColor(MouseState()..isMouseOver = true).withOpacity(0);
|
getBackgroundColor(MouseState()..isMouseOver = true).withAlpha(0);
|
||||||
var padding = this.padding ?? const EdgeInsets.all(10);
|
var padding = this.padding ?? const EdgeInsets.all(10);
|
||||||
var animationMs =
|
var animationMs =
|
||||||
mouseState.isMouseOver ? (animate ? 100 : 0) : (animate ? 200 : 0);
|
mouseState.isMouseOver ? (animate ? 100 : 0) : (animate ? 200 : 0);
|
||||||
|
@ -36,7 +36,7 @@ class HomePage extends HookConsumerWidget {
|
|||||||
bottom: false,
|
bottom: false,
|
||||||
child: Scaffold(
|
child: Scaffold(
|
||||||
headers: [
|
headers: [
|
||||||
if (kIsWindows || kIsLinux) const TitleBar(),
|
if (kTitlebarVisible) const TitleBar(),
|
||||||
],
|
],
|
||||||
child: CustomScrollView(
|
child: CustomScrollView(
|
||||||
controller: controller,
|
controller: controller,
|
||||||
|
@ -2,6 +2,7 @@ import 'package:flutter/material.dart' show Badge;
|
|||||||
import 'package:flutter_hooks/flutter_hooks.dart';
|
import 'package:flutter_hooks/flutter_hooks.dart';
|
||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
import 'package:shadcn_flutter/shadcn_flutter.dart';
|
import 'package:shadcn_flutter/shadcn_flutter.dart';
|
||||||
|
import 'package:shadcn_flutter/shadcn_flutter_extension.dart';
|
||||||
|
|
||||||
import 'package:spotube/modules/library/user_local_tracks.dart';
|
import 'package:spotube/modules/library/user_local_tracks.dart';
|
||||||
import 'package:spotube/components/titlebar/titlebar.dart';
|
import 'package:spotube/components/titlebar/titlebar.dart';
|
||||||
@ -11,7 +12,6 @@ import 'package:spotube/modules/library/user_downloads.dart';
|
|||||||
import 'package:spotube/modules/library/user_playlists.dart';
|
import 'package:spotube/modules/library/user_playlists.dart';
|
||||||
import 'package:spotube/extensions/context.dart';
|
import 'package:spotube/extensions/context.dart';
|
||||||
import 'package:spotube/provider/download_manager_provider.dart';
|
import 'package:spotube/provider/download_manager_provider.dart';
|
||||||
import 'package:spotube/utils/platform.dart';
|
|
||||||
|
|
||||||
class LibraryPage extends HookConsumerWidget {
|
class LibraryPage extends HookConsumerWidget {
|
||||||
static const name = "library";
|
static const name = "library";
|
||||||
@ -19,6 +19,7 @@ class LibraryPage extends HookConsumerWidget {
|
|||||||
const LibraryPage({super.key});
|
const LibraryPage({super.key});
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context, ref) {
|
Widget build(BuildContext context, ref) {
|
||||||
|
final scale = context.theme.scaling;
|
||||||
final downloadingCount = ref.watch(downloadManagerProvider).$downloadCount;
|
final downloadingCount = ref.watch(downloadManagerProvider).$downloadCount;
|
||||||
final index = useState(0);
|
final index = useState(0);
|
||||||
|
|
||||||
@ -38,8 +39,13 @@ class LibraryPage extends HookConsumerWidget {
|
|||||||
bottom: false,
|
bottom: false,
|
||||||
child: Scaffold(
|
child: Scaffold(
|
||||||
headers: [
|
headers: [
|
||||||
if (kIsWindows || kIsLinux) const TitleBar(),
|
TitleBar(
|
||||||
SingleChildScrollView(
|
padding: const EdgeInsets.symmetric(
|
||||||
|
horizontal: 18,
|
||||||
|
vertical: 12,
|
||||||
|
).copyWith(left: 0) *
|
||||||
|
scale,
|
||||||
|
child: SingleChildScrollView(
|
||||||
scrollDirection: Axis.horizontal,
|
scrollDirection: Axis.horizontal,
|
||||||
child: TabList(
|
child: TabList(
|
||||||
index: index.value,
|
index: index.value,
|
||||||
@ -54,6 +60,7 @@ class LibraryPage extends HookConsumerWidget {
|
|||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
),
|
||||||
const Gap(10),
|
const Gap(10),
|
||||||
],
|
],
|
||||||
child: IndexedStack(
|
child: IndexedStack(
|
||||||
|
@ -19,7 +19,6 @@ import 'package:spotube/pages/search/sections/tracks.dart';
|
|||||||
import 'package:spotube/provider/authentication/authentication.dart';
|
import 'package:spotube/provider/authentication/authentication.dart';
|
||||||
import 'package:spotube/provider/spotify/spotify.dart';
|
import 'package:spotube/provider/spotify/spotify.dart';
|
||||||
import 'package:spotube/services/kv_store/kv_store.dart';
|
import 'package:spotube/services/kv_store/kv_store.dart';
|
||||||
import 'package:spotube/utils/platform.dart';
|
|
||||||
|
|
||||||
class SearchPage extends HookConsumerWidget {
|
class SearchPage extends HookConsumerWidget {
|
||||||
static const name = "search";
|
static const name = "search";
|
||||||
@ -70,8 +69,7 @@ class SearchPage extends HookConsumerWidget {
|
|||||||
bottom: false,
|
bottom: false,
|
||||||
child: Scaffold(
|
child: Scaffold(
|
||||||
headers: [
|
headers: [
|
||||||
if (kIsWindows || kIsLinux)
|
if (kTitlebarVisible) const TitleBar(automaticallyImplyLeading: true)
|
||||||
const TitleBar(automaticallyImplyLeading: true)
|
|
||||||
],
|
],
|
||||||
child: auth.asData?.value == null
|
child: auth.asData?.value == null
|
||||||
? const AnonymousFallback()
|
? const AnonymousFallback()
|
||||||
|
@ -16,7 +16,7 @@ class StatsPage extends HookConsumerWidget {
|
|||||||
bottom: false,
|
bottom: false,
|
||||||
child: Scaffold(
|
child: Scaffold(
|
||||||
headers: [
|
headers: [
|
||||||
if (kIsWindows || kIsLinux) const TitleBar(),
|
if (kTitlebarVisible) const TitleBar(),
|
||||||
],
|
],
|
||||||
child: CustomScrollView(
|
child: CustomScrollView(
|
||||||
slivers: [
|
slivers: [
|
||||||
|
Loading…
Reference in New Issue
Block a user