fix: ok tuşları + buton hover/siyah border + çift tıklama cover
Some checks failed
Build Windows / build-windows (push) Has been cancelled

This commit is contained in:
Alhan
2026-07-22 05:20:07 +03:00
parent 86a63e0bb6
commit 35ac949f4e
6 changed files with 109 additions and 65 deletions

Binary file not shown.

Binary file not shown.

View File

@@ -11,48 +11,50 @@ class AppShortcuts extends StatelessWidget {
@override
Widget build(BuildContext context) {
return CallbackShortcuts(
bindings: {
// Navigate images
const SingleActivator(LogicalKeyboardKey.arrowLeft): () {
ImageManager.instance.previousImage();
},
const SingleActivator(LogicalKeyboardKey.arrowRight): () {
ImageManager.instance.nextImage();
},
// Open file dialog
const SingleActivator(
LogicalKeyboardKey.keyO,
control: true,
): () {
FileHandler.openFileDialog();
},
// Fullscreen toggle
const SingleActivator(LogicalKeyboardKey.f11): () async {
final isFullscreen = await windowManager.isFullScreen();
await windowManager.setFullScreen(!isFullscreen);
},
// Exit fullscreen
const SingleActivator(LogicalKeyboardKey.escape): () async {
final isFullscreen = await windowManager.isFullScreen();
if (isFullscreen) {
await windowManager.setFullScreen(false);
return Focus(
autofocus: true,
onKeyEvent: (node, event) {
if (event is KeyDownEvent) {
switch (event.logicalKey) {
case LogicalKeyboardKey.arrowLeft:
ImageManager.instance.previousImage();
return KeyEventResult.handled;
case LogicalKeyboardKey.arrowRight:
ImageManager.instance.nextImage();
return KeyEventResult.handled;
case LogicalKeyboardKey.escape:
windowManager.isFullScreen().then((isFullscreen) {
if (isFullscreen) windowManager.setFullScreen(false);
});
return KeyEventResult.handled;
}
},
// Quit
const SingleActivator(
LogicalKeyboardKey.keyQ,
control: true,
): () {
windowManager.close();
},
}
return KeyEventResult.ignored;
},
child: Focus(
autofocus: true,
child: CallbackShortcuts(
bindings: {
// Open file dialog
const SingleActivator(
LogicalKeyboardKey.keyO,
control: true,
): () {
FileHandler.openFileDialog();
},
// Fullscreen toggle
const SingleActivator(LogicalKeyboardKey.f11): () async {
final isFullscreen = await windowManager.isFullScreen();
await windowManager.setFullScreen(!isFullscreen);
},
// Quit
const SingleActivator(
LogicalKeyboardKey.keyQ,
control: true,
): () {
windowManager.close();
},
},
child: child,
),
);

View File

@@ -41,22 +41,45 @@ class CustomTitleBar extends StatelessWidget {
}
}
class _BarButton extends StatelessWidget {
class _BarButton extends StatefulWidget {
final IconData icon;
final VoidCallback onTap;
const _BarButton({required this.icon, required this.onTap});
@override
State<_BarButton> createState() => _BarButtonState();
}
class _BarButtonState extends State<_BarButton> {
bool _hovered = false;
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: onTap,
onTap: widget.onTap,
child: MouseRegion(
cursor: SystemMouseCursors.click,
child: SizedBox(
onEnter: (_) => setState(() => _hovered = true),
onExit: (_) => setState(() => _hovered = false),
child: Container(
width: 36,
height: 28,
child: Icon(icon, color: Colors.white54, size: 16),
decoration: BoxDecoration(
border: Border.all(
color: Colors.black54,
width: 1,
),
color: _hovered ? Colors.red.withValues(alpha: 0.7) : Colors.transparent,
borderRadius: const BorderRadius.only(
topRight: Radius.circular(4),
),
),
child: Icon(
widget.icon,
color: Colors.white,
size: 14,
),
),
),
);

View File

@@ -112,28 +112,47 @@ class _ImageCanvasState extends State<ImageCanvas> {
maxScale: 10.0,
panEnabled: true,
scaleEnabled: false,
child: Center(
child: Image.file(
File(widget.filePath),
fit: _isFilled ? BoxFit.cover : BoxFit.contain,
filterQuality: FilterQuality.high,
errorBuilder: (context, error, stackTrace) {
return const Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Icon(Icons.broken_image, size: 48, color: Colors.white38),
SizedBox(height: 8),
Text(
'Resim yüklenemedi',
style: TextStyle(color: Colors.white38),
),
],
child: _isFilled
? SizedBox.expand(
child: Image.file(
File(widget.filePath),
fit: BoxFit.cover,
filterQuality: FilterQuality.high,
errorBuilder: (context, error, stackTrace) {
return const Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Icon(Icons.broken_image, size: 48, color: Colors.white38),
SizedBox(height: 8),
Text('Resim yüklenemedi',
style: TextStyle(color: Colors.white38)),
],
),
);
},
),
);
},
),
),
)
: Center(
child: Image.file(
File(widget.filePath),
fit: BoxFit.contain,
filterQuality: FilterQuality.high,
errorBuilder: (context, error, stackTrace) {
return const Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Icon(Icons.broken_image, size: 48, color: Colors.white38),
SizedBox(height: 8),
Text('Resim yüklenemedi',
style: TextStyle(color: Colors.white38)),
],
),
);
},
),
),
),
),
);

Binary file not shown.