Skip to content

Commit

Permalink
AppBar.system_overlay_style prop (#2615)
Browse files Browse the repository at this point in the history
* SystemOverlayStyle dataclass

* parseSystemOverlayStyle

* export PlaylistMode
  • Loading branch information
ndonkoHenri committed Feb 14, 2024
1 parent 24b8004 commit e175224
Show file tree
Hide file tree
Showing 4 changed files with 76 additions and 2 deletions.
4 changes: 4 additions & 0 deletions packages/flet/lib/src/controls/app_bar.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import 'package:flutter/material.dart';

import '../models/control.dart';
import '../utils/colors.dart';
import '../utils/overlay_style.dart';
import 'create_control.dart';
import 'cupertino_app_bar.dart';
import 'flet_store_mixin.dart';
Expand Down Expand Up @@ -56,6 +57,8 @@ class AppBarControl extends StatelessWidget
Theme.of(context), control.attrString("color", "")!);
var bgcolor = HexColor.fromString(
Theme.of(context), control.attrString("bgcolor", "")!);
var systemOverlayStyle = parseSystemOverlayStyle(
Theme.of(context), control, "systemOverlayStyle");

return AppBar(
leading: leadingCtrls.isNotEmpty
Expand All @@ -77,6 +80,7 @@ class AppBarControl extends StatelessWidget
.map((c) => createControl(control, c.id, control.isDisabled,
parentAdaptive: adaptive))
.toList(),
systemOverlayStyle: systemOverlayStyle,
);
});
}
Expand Down
43 changes: 43 additions & 0 deletions packages/flet/lib/src/utils/overlay_style.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

import '../models/control.dart';
import '../utils/numbers.dart';
import 'colors.dart';

SystemUiOverlayStyle? parseSystemOverlayStyle(
ThemeData theme, Control control, String propName) {
dynamic j;
var v = control.attrString(propName, null);
if (v == null) {
return null;
}
j = json.decode(v);
return overlayStyleFromJson(theme, j);
}

SystemUiOverlayStyle overlayStyleFromJson(
ThemeData theme, Map<String, dynamic> json) {
return SystemUiOverlayStyle(
statusBarColor: json["status_bar_color"] != null
? HexColor.fromString(theme, json["status_bar_color"] ?? "")
: null,
systemNavigationBarColor: json["system_navigation_bar_color"] != null
? HexColor.fromString(theme, json["system_navigation_bar_color"] ?? "")
: null,
systemNavigationBarDividerColor:
json["system_navigation_bar_divider_color"] != null
? HexColor.fromString(theme, json["system_navigation_bar_divider_color"] ?? "")
: null,
systemStatusBarContrastEnforced:
json["enforce_system_status_bar_contrast"] != null
? parseBool(json["enforce_system_status_bar_contrast"])
: null,
systemNavigationBarContrastEnforced:
json["enforce_system_navigation_bar_contrast"] != null
? parseBool(json["enforce_system_navigation_bar_contrast"])
: null,
);
}
4 changes: 2 additions & 2 deletions sdk/python/packages/flet-core/src/flet_core/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
from flet_core.alignment import Alignment
from flet_core.animated_switcher import AnimatedSwitcher, AnimatedSwitcherTransition
from flet_core.animation import Animation, AnimationCurve
from flet_core.app_bar import AppBar
from flet_core.app_bar import AppBar, SystemOverlayStyle
from flet_core.audio import Audio
from flet_core.audio_recorder import AudioEncoder, AudioRecorder
from flet_core.badge import Badge
Expand Down Expand Up @@ -249,7 +249,7 @@
)
from flet_core.user_control import UserControl
from flet_core.vertical_divider import VerticalDivider
from flet_core.video import FilterQuality, Video, VideoMedia
from flet_core.video import FilterQuality, PlaylistMode, Video, VideoMedia
from flet_core.view import View
from flet_core.webview import WebView
from flet_core.window_drag_area import WindowDragArea
27 changes: 27 additions & 0 deletions sdk/python/packages/flet-core/src/flet_core/app_bar.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,21 @@
import dataclasses
from dataclasses import field
from typing import List, Optional

from flet_core.adaptive_control import AdaptiveControl
from flet_core.control import Control, OptionalNumber
from flet_core.ref import Ref


@dataclasses.dataclass
class SystemOverlayStyle:
status_bar_color: Optional[str] = field(default=None)
system_navigation_bar_color: Optional[str] = field(default=None)
system_navigation_bar_divider_color: Optional[str] = field(default=None)
enforce_system_navigation_bar_contrast: Optional[bool] = field(default=None)
enforce_system_status_bar_contrast: Optional[bool] = field(default=None)


class AppBar(AdaptiveControl):
"""
A material design app bar.
Expand Down Expand Up @@ -60,6 +71,7 @@ def __init__(
toolbar_height: OptionalNumber = None,
color: Optional[str] = None,
bgcolor: Optional[str] = None,
system_overlay_style: Optional[SystemOverlayStyle] = None,
elevation: OptionalNumber = None,
actions: Optional[List[Control]] = None,
adaptive: Optional[bool] = None,
Expand All @@ -82,10 +94,16 @@ def __init__(
self.bgcolor = bgcolor
self.elevation = elevation
self.actions = actions
self.system_overlay_style = system_overlay_style

def _get_control_name(self):
return "appbar"

def _before_build_command(self):
super()._before_build_command()
if dataclasses.is_dataclass(self.__system_overlay_style):
self._set_attr_json("systemOverlayStyle", self.__system_overlay_style)

def _get_children(self):
children = []
if self.__leading:
Expand Down Expand Up @@ -142,6 +160,15 @@ def title(self) -> Optional[Control]:
def title(self, value: Optional[Control]):
self.__title = value

# system_overlay_style
@property
def system_overlay_style(self) -> Optional[SystemOverlayStyle]:
return self.__system_overlay_style

@system_overlay_style.setter
def system_overlay_style(self, value: Optional[SystemOverlayStyle]):
self.__system_overlay_style = value

# center_title
@property
def center_title(self) -> Optional[bool]:
Expand Down

0 comments on commit e175224

Please sign in to comment.