diff --git a/.github/workflows/flutter.yml b/.github/workflows/flutter.yml new file mode 100644 index 0000000..50bb90a --- /dev/null +++ b/.github/workflows/flutter.yml @@ -0,0 +1,32 @@ +name: CI + +on: + push: + branches: [ master ] + pull_request: + branches: + - master + - feature/* + - bugfix/* + - hotfix/* + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/cache@v3 + with: + path: | + ~/.gradle/wrapper + /opt/hostedtoolcache/flutter + key: ${{ runner.OS }}-flutter-install-cache + - uses: subosito/flutter-action@v2 + with: + channel: 'stable' + - name: Flutter pub get + run: flutter pub get + - name: Flutter format + run: flutter format -o none --set-exit-if-changed . + - name: Flutter analyze + run: flutter analyze diff --git a/README.md b/README.md index 582f805..4cb058d 100644 --- a/README.md +++ b/README.md @@ -1,24 +1,27 @@ - -# timetable -A Flutter package for creating a timetable widget in which to display blocks of time with optional widgets in them. +[![pub package](https://img.shields.io/pub/v/flutter_timetable.svg)](https://github.com/Iconica-Development) [![Build status](https://img.shields.io/github/workflow/status/Iconica-Development/flutter_timetable/CI)](https://github.com/Iconica-Development/flutter_timetable/actions/new) [![style: effective dart](https://img.shields.io/badge/style-effective_dart-40c4ff.svg)](https://github.com/tenhobi/effective_dart) +# Flutter Timetable +A Flutter package for creating a Timetable widget in which to display blocks of time with optional widgets in them. The vertical time range is configurable and the widget is horizontally scrollable. The timetable has options to merge blocks below eachother when they are not overlapping or collapse items that are at the same time and have the same identifier. -Supports all Flutter platforms. +![Timetable GIF](flutter_timetable.gif) -## Usage +## Features +## Setup -To use this package, add `timetable` as a [dependency in your pubspec.yaml file](https://flutter.dev/docs/development/platform-integration/platform-channels). +To use this package, add `timetable` as a dependency in your pubspec.yaml file. ### Example See [Example Code](example/lib/main.dart) for more info. -### Issues & Feedback +## Issues -Please file an [issue](https://github.com/Iconica-Development/timetable/issues) to send feedback or report a bug, -If you want to ask a question or suggest an idea then you can [open an discussion](https://github.com/Iconica-Development/timetable/discussions). -Thank you! +Please file any issues, bugs or feature request as an issue on our [GitHub](https://github.com/Iconica-Development/flutter_date_time_picker/pulls) page. Commercial support is available if you need help with integration with your app or services. You can contact us at [support@iconica.nl](mailto:support@iconica.nl). -### Contributing +## Want to contribute -Every pull request is welcome. \ No newline at end of file +If you would like to contribute to the plugin (e.g. by improving the documentation, solving a bug or adding a cool new feature), please carefully review our [contribution guide](../CONTRIBUTING.md) and send us your [pull request](https://github.com/Iconica-Development/flutter_date_time_picker/pulls). + +## Author + +This `timetable` for Flutter is developed by [Iconica](https://iconica.nl). You can contact us at \ No newline at end of file diff --git a/analysis_options.yaml b/analysis_options.yaml index 0530d9c..872a1eb 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -1,214 +1,4 @@ include: package:flutter_lints/flutter.yaml -analyzer: - errors: - todo: ignore - exclude: [lib/generated_plugin_registrant.dart] -linter: - # https://dart.dev/tools/linter-rules#lints - rules: - # error rules - always_use_package_imports: false - avoid_dynamic_calls: true - avoid_empty_else: true - avoid_print: true - avoid_relative_lib_imports: true - avoid_returning_null_for_future: true - avoid_slow_async_io: true - avoid_type_to_string: true - avoid_types_as_parameter_names: true - avoid_web_libraries_in_flutter: true - cancel_subscriptions: true - close_sinks: true - comment_references: false - control_flow_in_finally: true - diagnostic_describe_all_properties: false - empty_statements: true - hash_and_equals: true - invariant_booleans: true - iterable_contains_unrelated_type: true - list_remove_unrelated_type: true - literal_only_boolean_expressions: true - no_adjacent_strings_in_list: true - no_duplicate_case_values: true - no_logic_in_create_state: true - prefer_relative_imports: false - prefer_void_to_null: true - test_types_in_equals: true - throw_in_finally: true - unnecessary_statements: true - unrelated_type_equality_checks: true - unsafe_html: true - use_build_context_synchronously: true - use_key_in_widget_constructors: true - valid_regexps: true - # style rules - always_declare_return_types: true - always_put_control_body_on_new_line: true - always_put_required_named_parameters_first: true - always_require_non_null_named_parameters: true - always_specify_types: false - annotate_overrides: true - avoid_annotating_with_dynamic: false - avoid_bool_literals_in_conditional_expressions: true - avoid_catches_without_on_clauses: false - avoid_catching_errors: false - avoid_classes_with_only_static_members: true - avoid_double_and_int_checks: true - avoid_equals_and_hash_code_on_mutable_classes: false - avoid_escaping_inner_quotes: false - avoid_field_initializers_in_const_classes: true - avoid_final_parameters: true - avoid_function_literals_in_foreach_calls: true - avoid_implementing_value_types: true - avoid_init_to_null: true - avoid_js_rounded_ints: true - avoid_multiple_declarations_per_line: true - avoid_null_checks_in_equality_operators: true - avoid_positional_boolean_parameters: true - avoid_private_typedef_functions: true - avoid_redundant_argument_values: false - avoid_renaming_method_parameters: true - avoid_return_types_on_setters: true - avoid_returning_null: true - avoid_returning_null_for_void: true - avoid_returning_this: true - avoid_setters_without_getters: true - avoid_shadowing_type_parameters: true - avoid_single_cascade_in_expression_statements: true - avoid_types_on_closure_parameters: false - avoid_unnecessary_containers: false - avoid_unused_constructor_parameters: true - avoid_void_async: true - await_only_futures: true - camel_case_extensions: true - camel_case_types: true - cascade_invocations: true - cast_nullable_to_non_nullable: true - conditional_uri_does_not_exist: true - constant_identifier_names: true - curly_braces_in_flow_control_structures: true - deprecated_consistency: true - directives_ordering: true - do_not_use_environment: true - empty_catches: true - empty_constructor_bodies: true - eol_at_end_of_file: true - exhaustive_cases: true - file_names: true - flutter_style_todos: true - implementation_imports: true - join_return_with_assignment: true - leading_newlines_in_multiline_strings: true - library_names: true - library_prefixes: true - library_private_types_in_public_api: true - lines_longer_than_80_chars: true - missing_whitespace_between_adjacent_strings: true - no_default_cases: true - no_leading_underscores_for_library_prefixes: true - no_leading_underscores_for_local_identifiers: true - no_runtimeType_toString: true - non_constant_identifier_names: true - noop_primitive_operations: true - null_check_on_nullable_type_parameter: true - null_closures: true - omit_local_variable_types: true - one_member_abstracts: true - only_throw_errors: true - overridden_fields: true - package_api_docs: true - package_prefixed_library_names: true - parameter_assignments: true - prefer_adjacent_string_concatenation: true - prefer_asserts_in_initializer_lists: true - prefer_asserts_with_message: true - prefer_collection_literals: true - prefer_conditional_assignment: true - prefer_const_constructors: true - prefer_const_constructors_in_immutables: true - prefer_const_declarations: false - prefer_const_literals_to_create_immutables: false - prefer_constructors_over_static_methods: true - prefer_contains: true - prefer_double_quotes: false - prefer_equal_for_default_values: true - prefer_expression_function_bodies: false - prefer_final_fields: true - prefer_final_in_for_each: false - prefer_final_locals: false - prefer_final_parameters: false - prefer_for_elements_to_map_fromIterable: true - prefer_foreach: true - prefer_function_declarations_over_variables: true - prefer_generic_function_type_aliases: true - prefer_if_elements_to_conditional_expressions: true - prefer_if_null_operators: true - prefer_initializing_formals: true - prefer_inlined_adds: true - prefer_int_literals: false - prefer_interpolation_to_compose_strings: true - prefer_is_empty: true - prefer_is_not_empty: true - prefer_is_not_operator: true - prefer_iterable_whereType: true - prefer_mixin: true - prefer_null_aware_method_calls: true - prefer_null_aware_operators: true - prefer_single_quotes: true - prefer_spread_collections: true - prefer_typing_uninitialized_variables: true - provide_deprecation_message: true - public_member_api_docs: false - recursive_getters: true - require_trailing_commas: true - sized_box_for_whitespace: true - sized_box_shrink_expand: true - slash_for_doc_comments: true - sort_child_properties_last: true - sort_constructors_first: true - sort_unnamed_constructors_first: true - tighten_type_of_initializing_formals: true - type_annotate_public_apis: true - type_init_formals: true - unawaited_futures: true - unnecessary_await_in_return: true - unnecessary_brace_in_string_interps: true - unnecessary_const: false - unnecessary_constructor_name: true - unnecessary_final: true - unnecessary_getters_setters: true - unnecessary_lambdas: true - unnecessary_late: true - unnecessary_new: true - unnecessary_null_aware_assignments: true - unnecessary_null_checks: true - unnecessary_null_in_if_null_operators: true - unnecessary_nullable_for_final_variable_declarations: true - unnecessary_overrides: true - unnecessary_parenthesis: true - unnecessary_raw_strings: true - unnecessary_string_escapes: true - unnecessary_string_interpolations: true - unnecessary_this: true - use_decorated_box: true - use_full_hex_values_for_flutter_colors: true - use_function_type_syntax_for_parameters: true - use_if_null_to_convert_nulls_to_bools: true - use_is_even_rather_than_modulo: true - use_late_for_private_fields_and_variables: true - use_named_constants: true - use_raw_strings: false - use_rethrow_when_possible: true - use_setters_to_change_properties: true - use_string_buffers: true - use_test_throws_matchers: true - use_to_and_as_if_applicable: true - void_checks: true - # pub rules - depend_on_referenced_packages: true - lowercase_with_underscores: true - secure_pubspec_urls: false - sort_pub_dependencies: false # Additional information about this file can be found at -# https://dart.dev/guides/language/analysis-options +# https://dart.dev/guides/language/analysis-options \ No newline at end of file diff --git a/example/.metadata b/example/.metadata index 9e70ade..5651284 100644 --- a/example/.metadata +++ b/example/.metadata @@ -15,24 +15,9 @@ migration: - platform: root create_revision: 52b3dc25f6471c27b2144594abb11c741cb88f57 base_revision: 52b3dc25f6471c27b2144594abb11c741cb88f57 - - platform: android - create_revision: 52b3dc25f6471c27b2144594abb11c741cb88f57 - base_revision: 52b3dc25f6471c27b2144594abb11c741cb88f57 - platform: ios create_revision: 52b3dc25f6471c27b2144594abb11c741cb88f57 base_revision: 52b3dc25f6471c27b2144594abb11c741cb88f57 - - platform: linux - create_revision: 52b3dc25f6471c27b2144594abb11c741cb88f57 - base_revision: 52b3dc25f6471c27b2144594abb11c741cb88f57 - - platform: macos - create_revision: 52b3dc25f6471c27b2144594abb11c741cb88f57 - base_revision: 52b3dc25f6471c27b2144594abb11c741cb88f57 - - platform: web - create_revision: 52b3dc25f6471c27b2144594abb11c741cb88f57 - base_revision: 52b3dc25f6471c27b2144594abb11c741cb88f57 - - platform: windows - create_revision: 52b3dc25f6471c27b2144594abb11c741cb88f57 - base_revision: 52b3dc25f6471c27b2144594abb11c741cb88f57 # User provided section diff --git a/example/analysis_options.yaml b/example/analysis_options.yaml index 0530d9c..872a1eb 100644 --- a/example/analysis_options.yaml +++ b/example/analysis_options.yaml @@ -1,214 +1,4 @@ include: package:flutter_lints/flutter.yaml -analyzer: - errors: - todo: ignore - exclude: [lib/generated_plugin_registrant.dart] -linter: - # https://dart.dev/tools/linter-rules#lints - rules: - # error rules - always_use_package_imports: false - avoid_dynamic_calls: true - avoid_empty_else: true - avoid_print: true - avoid_relative_lib_imports: true - avoid_returning_null_for_future: true - avoid_slow_async_io: true - avoid_type_to_string: true - avoid_types_as_parameter_names: true - avoid_web_libraries_in_flutter: true - cancel_subscriptions: true - close_sinks: true - comment_references: false - control_flow_in_finally: true - diagnostic_describe_all_properties: false - empty_statements: true - hash_and_equals: true - invariant_booleans: true - iterable_contains_unrelated_type: true - list_remove_unrelated_type: true - literal_only_boolean_expressions: true - no_adjacent_strings_in_list: true - no_duplicate_case_values: true - no_logic_in_create_state: true - prefer_relative_imports: false - prefer_void_to_null: true - test_types_in_equals: true - throw_in_finally: true - unnecessary_statements: true - unrelated_type_equality_checks: true - unsafe_html: true - use_build_context_synchronously: true - use_key_in_widget_constructors: true - valid_regexps: true - # style rules - always_declare_return_types: true - always_put_control_body_on_new_line: true - always_put_required_named_parameters_first: true - always_require_non_null_named_parameters: true - always_specify_types: false - annotate_overrides: true - avoid_annotating_with_dynamic: false - avoid_bool_literals_in_conditional_expressions: true - avoid_catches_without_on_clauses: false - avoid_catching_errors: false - avoid_classes_with_only_static_members: true - avoid_double_and_int_checks: true - avoid_equals_and_hash_code_on_mutable_classes: false - avoid_escaping_inner_quotes: false - avoid_field_initializers_in_const_classes: true - avoid_final_parameters: true - avoid_function_literals_in_foreach_calls: true - avoid_implementing_value_types: true - avoid_init_to_null: true - avoid_js_rounded_ints: true - avoid_multiple_declarations_per_line: true - avoid_null_checks_in_equality_operators: true - avoid_positional_boolean_parameters: true - avoid_private_typedef_functions: true - avoid_redundant_argument_values: false - avoid_renaming_method_parameters: true - avoid_return_types_on_setters: true - avoid_returning_null: true - avoid_returning_null_for_void: true - avoid_returning_this: true - avoid_setters_without_getters: true - avoid_shadowing_type_parameters: true - avoid_single_cascade_in_expression_statements: true - avoid_types_on_closure_parameters: false - avoid_unnecessary_containers: false - avoid_unused_constructor_parameters: true - avoid_void_async: true - await_only_futures: true - camel_case_extensions: true - camel_case_types: true - cascade_invocations: true - cast_nullable_to_non_nullable: true - conditional_uri_does_not_exist: true - constant_identifier_names: true - curly_braces_in_flow_control_structures: true - deprecated_consistency: true - directives_ordering: true - do_not_use_environment: true - empty_catches: true - empty_constructor_bodies: true - eol_at_end_of_file: true - exhaustive_cases: true - file_names: true - flutter_style_todos: true - implementation_imports: true - join_return_with_assignment: true - leading_newlines_in_multiline_strings: true - library_names: true - library_prefixes: true - library_private_types_in_public_api: true - lines_longer_than_80_chars: true - missing_whitespace_between_adjacent_strings: true - no_default_cases: true - no_leading_underscores_for_library_prefixes: true - no_leading_underscores_for_local_identifiers: true - no_runtimeType_toString: true - non_constant_identifier_names: true - noop_primitive_operations: true - null_check_on_nullable_type_parameter: true - null_closures: true - omit_local_variable_types: true - one_member_abstracts: true - only_throw_errors: true - overridden_fields: true - package_api_docs: true - package_prefixed_library_names: true - parameter_assignments: true - prefer_adjacent_string_concatenation: true - prefer_asserts_in_initializer_lists: true - prefer_asserts_with_message: true - prefer_collection_literals: true - prefer_conditional_assignment: true - prefer_const_constructors: true - prefer_const_constructors_in_immutables: true - prefer_const_declarations: false - prefer_const_literals_to_create_immutables: false - prefer_constructors_over_static_methods: true - prefer_contains: true - prefer_double_quotes: false - prefer_equal_for_default_values: true - prefer_expression_function_bodies: false - prefer_final_fields: true - prefer_final_in_for_each: false - prefer_final_locals: false - prefer_final_parameters: false - prefer_for_elements_to_map_fromIterable: true - prefer_foreach: true - prefer_function_declarations_over_variables: true - prefer_generic_function_type_aliases: true - prefer_if_elements_to_conditional_expressions: true - prefer_if_null_operators: true - prefer_initializing_formals: true - prefer_inlined_adds: true - prefer_int_literals: false - prefer_interpolation_to_compose_strings: true - prefer_is_empty: true - prefer_is_not_empty: true - prefer_is_not_operator: true - prefer_iterable_whereType: true - prefer_mixin: true - prefer_null_aware_method_calls: true - prefer_null_aware_operators: true - prefer_single_quotes: true - prefer_spread_collections: true - prefer_typing_uninitialized_variables: true - provide_deprecation_message: true - public_member_api_docs: false - recursive_getters: true - require_trailing_commas: true - sized_box_for_whitespace: true - sized_box_shrink_expand: true - slash_for_doc_comments: true - sort_child_properties_last: true - sort_constructors_first: true - sort_unnamed_constructors_first: true - tighten_type_of_initializing_formals: true - type_annotate_public_apis: true - type_init_formals: true - unawaited_futures: true - unnecessary_await_in_return: true - unnecessary_brace_in_string_interps: true - unnecessary_const: false - unnecessary_constructor_name: true - unnecessary_final: true - unnecessary_getters_setters: true - unnecessary_lambdas: true - unnecessary_late: true - unnecessary_new: true - unnecessary_null_aware_assignments: true - unnecessary_null_checks: true - unnecessary_null_in_if_null_operators: true - unnecessary_nullable_for_final_variable_declarations: true - unnecessary_overrides: true - unnecessary_parenthesis: true - unnecessary_raw_strings: true - unnecessary_string_escapes: true - unnecessary_string_interpolations: true - unnecessary_this: true - use_decorated_box: true - use_full_hex_values_for_flutter_colors: true - use_function_type_syntax_for_parameters: true - use_if_null_to_convert_nulls_to_bools: true - use_is_even_rather_than_modulo: true - use_late_for_private_fields_and_variables: true - use_named_constants: true - use_raw_strings: false - use_rethrow_when_possible: true - use_setters_to_change_properties: true - use_string_buffers: true - use_test_throws_matchers: true - use_to_and_as_if_applicable: true - void_checks: true - # pub rules - depend_on_referenced_packages: true - lowercase_with_underscores: true - secure_pubspec_urls: false - sort_pub_dependencies: false # Additional information about this file can be found at -# https://dart.dev/guides/language/analysis-options +# https://dart.dev/guides/language/analysis-options \ No newline at end of file diff --git a/example/lib/main.dart b/example/lib/main.dart index 8ee9e82..028ab20 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -21,95 +21,82 @@ class _TimetableDemoState extends State { bool _horizontal = true; final ScrollController _scrollController = ScrollController(); final List blocks = [ - TimeBlock( - start: const TimeOfDay(hour: 14, minute: 0), - end: const TimeOfDay(hour: 15, minute: 0), - id: 0, - ), TimeBlock( start: const TimeOfDay(hour: 8, minute: 0), end: const TimeOfDay(hour: 9, minute: 0), + child: Container( + color: Colors.red, + child: const Padding( + padding: const EdgeInsets.all(8.0), + child: const Text( + 'Exercise', + style: TextStyle(color: Colors.white), + ), + ), + ), id: 1, ), TimeBlock( - start: const TimeOfDay(hour: 9, minute: 15), - end: const TimeOfDay(hour: 10, minute: 0), - id: 1, - ), - TimeBlock( - start: const TimeOfDay(hour: 10, minute: 15), - end: const TimeOfDay(hour: 11, minute: 0), - child: Container(color: Colors.purple, height: 300, width: 50), + start: const TimeOfDay(hour: 10, minute: 0), + end: const TimeOfDay(hour: 12, minute: 0), + child: Container( + color: Colors.orange, + child: const Padding( + padding: const EdgeInsets.all(8.0), + child: const Text( + 'Brunch', + style: TextStyle(color: Colors.white), + ), + ), + ), childDimension: 300, - id: 2, + id: 3, ), TimeBlock( - start: const TimeOfDay(hour: 6, minute: 15), - end: const TimeOfDay(hour: 7, minute: 0), - child: Container(color: Colors.blue, height: 300, width: 300), - childDimension: 300, - id: 2, - ), + start: const TimeOfDay(hour: 14, minute: 0), + end: const TimeOfDay(hour: 15, minute: 0), + id: 100, + child: const SizedBox( + height: 300, + child: Text( + 'Clean Living Room', + style: TextStyle(color: Colors.white), + ), + )), TimeBlock( - start: const TimeOfDay(hour: 18, minute: 0), - end: const TimeOfDay(hour: 18, minute: 30), - child: - const SizedBox(width: 60, height: 60, child: const Text('High Tea')), - childDimension: 60, - id: 10, - ), - TimeBlock( - start: const TimeOfDay(hour: 18, minute: 0), - end: const TimeOfDay(hour: 18, minute: 30), - child: const SizedBox( - height: 60, - width: 60, - child: const Text('High Tea'), - ), - childDimension: 60, - id: 10, - ), - TimeBlock( - start: const TimeOfDay(hour: 18, minute: 0), - end: const TimeOfDay(hour: 18, minute: 30), - child: const SizedBox( - height: 60, - width: 60, - child: const Text('High Tea'), - ), - childDimension: 60, - id: 10, - ), - TimeBlock( - start: const TimeOfDay(hour: 18, minute: 0), - end: const TimeOfDay(hour: 18, minute: 30), - child: const SizedBox( - height: 50, - width: 50, - child: const Text('High Tea'), - ), - childDimension: 60, - id: 0, - ), - TimeBlock( - start: const TimeOfDay(hour: 14, minute: 0), - end: const TimeOfDay(hour: 15, minute: 0), - id: 100, - ), - TimeBlock( - start: const TimeOfDay(hour: 14, minute: 0), - end: const TimeOfDay(hour: 15, minute: 0), - id: 101, - ), + start: const TimeOfDay(hour: 14, minute: 0), + end: const TimeOfDay(hour: 15, minute: 0), + id: 101, + child: const SizedBox( + height: 200, + child: Text( + 'Clean Kitchen', + style: TextStyle(color: Colors.white), + ), + )), TimeBlock( start: const TimeOfDay(hour: 14, minute: 0), end: const TimeOfDay(hour: 15, minute: 0), id: 102, + child: const SizedBox( + height: 100, + child: Text( + 'Clean Bathroom', + style: TextStyle(color: Colors.white), + ), + ), ), TimeBlock( start: const TimeOfDay(hour: 14, minute: 0), end: const TimeOfDay(hour: 15, minute: 0), id: 103, + child: const SizedBox( + height: 50, + child: Text( + 'Clean Toilet', + style: TextStyle(color: Colors.white), + ), + ), ), ]; @@ -123,29 +110,28 @@ class _TimetableDemoState extends State { Widget build(BuildContext context) { var size = MediaQuery.of(context).size; return Scaffold( + appBar: AppBar( + title: const Text('Timetable Demo'), + ), // backgroundColor: Colors.green, - body: Padding( - padding: EdgeInsets.only(top: MediaQuery.of(context).padding.top), - child: Column( - children: [ - // toggle between horizontal and vertical - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - TextButton( - onPressed: () { - setState(() { - _horizontal = !_horizontal; - }); - }, - child: Text(_horizontal ? 'Horizontal' : 'Vertical'), - ), - ], - ), - // toggle between grouped and ungrouped blocks - Row( + body: Column( + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ + // toggle between horizontal and vertical + const Text('Axis horizontal'), + Switch( + value: _horizontal, + onChanged: (value) { + setState(() { + _horizontal = value; + }); + }, + ), + // toggle between grouped and ungrouped blocks const Text('Grouped'), Switch( value: _grouped, @@ -157,25 +143,25 @@ class _TimetableDemoState extends State { ), ], ), - Container( - color: Colors.white, - child: Timetable( - size: Size(size.width, size.height * 0.64), - tableDirection: _horizontal ? Axis.horizontal : Axis.vertical, - startHour: 3, - endHour: 24, - timeBlocks: blocks, - scrollController: _scrollController, - combineBlocks: true, - mergeBlocks: _grouped, - theme: const TableTheme( - tablePaddingStart: 0, - blockPaddingBetween: 10, - ), + ), + Container( + color: Colors.white, + child: Timetable( + size: Size(size.width, size.height * 0.64), + tableDirection: _horizontal ? Axis.horizontal : Axis.vertical, + startHour: 3, + endHour: 24, + timeBlocks: blocks, + scrollController: _scrollController, + combineBlocks: true, + mergeBlocks: _grouped, + theme: const TableTheme( + tablePaddingStart: 0, + blockPaddingBetween: 10, ), ), - ], - ), + ), + ], ), ); } diff --git a/example/pubspec.lock b/example/pubspec.lock index d414ba5..35b2503 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -5,49 +5,56 @@ packages: dependency: transitive description: name: async - url: "https://pub.dartlang.org" + sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0 + url: "https://pub.dev" source: hosted - version: "2.9.0" + version: "2.10.0" boolean_selector: dependency: transitive description: name: boolean_selector - url: "https://pub.dartlang.org" + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" characters: dependency: transitive description: name: characters - url: "https://pub.dartlang.org" + sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c + url: "https://pub.dev" source: hosted version: "1.2.1" clock: dependency: transitive description: name: clock - url: "https://pub.dartlang.org" + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" source: hosted version: "1.1.1" collection: dependency: transitive description: name: collection - url: "https://pub.dartlang.org" + sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0 + url: "https://pub.dev" source: hosted - version: "1.16.0" + version: "1.17.0" cupertino_icons: dependency: "direct main" description: name: cupertino_icons - url: "https://pub.dartlang.org" + sha256: e35129dc44c9118cee2a5603506d823bab99c68393879edb440e0090d07586be + url: "https://pub.dev" source: hosted version: "1.0.5" fake_async: dependency: transitive description: name: fake_async - url: "https://pub.dartlang.org" + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.dev" source: hosted version: "1.3.1" flutter: @@ -59,7 +66,8 @@ packages: dependency: "direct dev" description: name: flutter_lints - url: "https://pub.dartlang.org" + sha256: aeb0b80a8b3709709c9cc496cdc027c5b3216796bc0af0ce1007eaf24464fd4c + url: "https://pub.dev" source: hosted version: "2.0.1" flutter_test: @@ -67,39 +75,52 @@ packages: description: flutter source: sdk version: "0.0.0" + js: + dependency: transitive + description: + name: js + sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7" + url: "https://pub.dev" + source: hosted + version: "0.6.5" lints: dependency: transitive description: name: lints - url: "https://pub.dartlang.org" + sha256: "5cfd6509652ff5e7fe149b6df4859e687fca9048437857cb2e65c8d780f396e3" + url: "https://pub.dev" source: hosted version: "2.0.0" matcher: dependency: transitive description: name: matcher - url: "https://pub.dartlang.org" + sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72" + url: "https://pub.dev" source: hosted - version: "0.12.12" + version: "0.12.13" material_color_utilities: dependency: transitive description: name: material_color_utilities - url: "https://pub.dartlang.org" + sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 + url: "https://pub.dev" source: hosted - version: "0.1.5" + version: "0.2.0" meta: dependency: transitive description: name: meta - url: "https://pub.dartlang.org" + sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42" + url: "https://pub.dev" source: hosted version: "1.8.0" path: dependency: transitive description: name: path - url: "https://pub.dartlang.org" + sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b + url: "https://pub.dev" source: hosted version: "1.8.2" sky_engine: @@ -111,58 +132,65 @@ packages: dependency: transitive description: name: source_span - url: "https://pub.dartlang.org" + sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 + url: "https://pub.dev" source: hosted - version: "1.9.0" + version: "1.9.1" stack_trace: dependency: transitive description: name: stack_trace - url: "https://pub.dartlang.org" + sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 + url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.11.0" stream_channel: dependency: transitive description: name: stream_channel - url: "https://pub.dartlang.org" + sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" string_scanner: dependency: transitive description: name: string_scanner - url: "https://pub.dartlang.org" + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.2.0" term_glyph: dependency: transitive description: name: term_glyph - url: "https://pub.dartlang.org" + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" source: hosted version: "1.2.1" test_api: dependency: transitive description: name: test_api - url: "https://pub.dartlang.org" + sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206 + url: "https://pub.dev" source: hosted - version: "0.4.12" + version: "0.4.16" timetable: dependency: "direct main" description: path: ".." relative: true source: path - version: "0.0.2" + version: "1.0.0" vector_math: dependency: transitive description: name: vector_math - url: "https://pub.dartlang.org" + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.4" sdks: - dart: ">=2.17.6 <3.0.0" + dart: ">=2.18.0 <3.0.0" flutter: ">=1.17.0" diff --git a/example/test/widget_test.dart b/example/test/widget_test.dart index 8a1e288..0453e1f 100644 --- a/example/test/widget_test.dart +++ b/example/test/widget_test.dart @@ -1,7 +1,7 @@ -import 'package:flutter_test/flutter_test.dart'; +// import 'package:flutter_test/flutter_test.dart'; -void main() { - test('', () { - expect(true, isTrue); - }); -} +// void main() { +// test('', () { +// expect(true, isTrue); +// }); +// } diff --git a/flutter_timetable.gif b/flutter_timetable.gif new file mode 100644 index 0000000..b2b45a0 Binary files /dev/null and b/flutter_timetable.gif differ diff --git a/lib/src/timetable.dart b/lib/src/timetable.dart index 125c3dc..f7c5eee 100644 --- a/lib/src/timetable.dart +++ b/lib/src/timetable.dart @@ -27,7 +27,7 @@ class Timetable extends StatefulWidget { this.startHour = 0, this.endHour = 24, this.blockDimension = 50, - this.blockColor = const Color(0x80FF0000), + this.blockColor = Colors.blue, this.hourDimension = 80, this.theme = const TableTheme(), this.mergeBlocks = false, @@ -275,7 +275,7 @@ class _TimetableState extends State { return (TextPainter( text: TextSpan( text: '22:22', - style: widget.theme.timeStyle ?? Theme.of(context).textTheme.bodyText1, + style: widget.theme.timeStyle ?? Theme.of(context).textTheme.bodyLarge, ), maxLines: 1, textScaleFactor: MediaQuery.of(context).textScaleFactor, diff --git a/lib/src/widgets/block.dart b/lib/src/widgets/block.dart index ee20473..df4e885 100644 --- a/lib/src/widgets/block.dart +++ b/lib/src/widgets/block.dart @@ -13,7 +13,7 @@ class Block extends StatelessWidget { required this.blockDimension, required this.hourDimension, required this.blockDirection, - this.blockColor = const Color(0x80FF0000), + this.blockColor = Colors.blue, this.linePadding = 8, this.child, Key? key, @@ -49,6 +49,7 @@ class Block extends StatelessWidget { @override Widget build(BuildContext context) { return Container( + color: blockColor, margin: EdgeInsets.only( top: (blockDirection == Axis.vertical) ? (((start.hour - startHour) * Duration.minutesPerHour) + @@ -76,10 +77,9 @@ class Block extends StatelessWidget { _sizePerMinute() : null, child: child ?? - Container( + SizedBox( height: (blockDirection == Axis.horizontal) ? blockDimension : 0, width: (blockDirection == Axis.vertical) ? blockDimension : 0, - color: blockColor, ), ); } diff --git a/lib/src/widgets/table.dart b/lib/src/widgets/table.dart index d5ddd49..8df2a62 100644 --- a/lib/src/widgets/table.dart +++ b/lib/src/widgets/table.dart @@ -58,7 +58,7 @@ class Table extends StatelessWidget { '${((i == 24) ? '00' : i.toString()).padLeft(2, '0')}' ':00', style: theme.timeStyle ?? - Theme.of(context).textTheme.bodyText1, + Theme.of(context).textTheme.bodyLarge, ), SizedBox(height: theme.tableTextOffset), Container( @@ -126,7 +126,7 @@ class Table extends StatelessWidget { Text( '${i.toString().padLeft(2, '0')}:00', style: theme.timeStyle ?? - Theme.of(context).textTheme.bodyText1, + Theme.of(context).textTheme.bodyLarge, ), SizedBox( width: theme.tableTextOffset, @@ -183,7 +183,7 @@ class Table extends StatelessWidget { var textPainter = TextPainter( text: TextSpan( text: text, - style: theme.timeStyle ?? Theme.of(context).textTheme.bodyText1, + style: theme.timeStyle ?? Theme.of(context).textTheme.bodyLarge, ), textDirection: TextDirection.ltr, )..layout(); diff --git a/pubspec.yaml b/pubspec.yaml index 2f255ce..fc523ae 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,10 +1,10 @@ name: timetable description: Flutter package to create a Timetable Widget that display blocks of widgets inside a timetable. -version: 0.0.2 +version: 1.0.0 repository: https://github.com/Iconica-Development/timetable environment: - sdk: ">=2.17.6 <3.0.0" + sdk: ">=2.18.0 <3.0.0" flutter: ">=1.17.0" dependencies: