Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(67)

Side by Side Diff: sky/framework/elements/sky-radio.sky

Issue 1132063007: Rationalize Dart mojo and sky package structure (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « sky/framework/elements/sky-menu-item.sky ('k') | sky/framework/elements/sky-scrollable.sky » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 <!--
2 // Copyright 2015 The Chromium Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 -->
6 <import src="sky-element.sky" />
7 <import src="sky-icon.sky" />
8
9 <sky-element attributes="selected:boolean, group:string">
10 <template>
11 <style>
12 :host {
13 display: inline-flex;
14 -webkit-user-select: none;
15 margin: 8px 16px;
16 }
17 </style>
18 <sky-icon size="18" />
19 </template>
20 <script>
21 import "dart:sky";
22
23 final Map<Node, _RadioGroupController> _controllerMap = new Map();
24
25 class _RadioGroupController {
26 static _RadioGroupController forRadio(radio) {
27 Node owner = radio.owner;
28 return _controllerMap.putIfAbsent(owner, () =>
29 new _RadioGroupController(owner));
30 }
31
32 final Node _scope;
33 final Set<SkyRadio> _radios = new Set<SkyRadio>();
34
35 _RadioGroupController(this._scope);
36
37 void addRadio(SkyRadio radio) {
38 _radios.add(radio);
39 // If this new radio is default-selected, take selection from the group.
40 if (radio.selected)
41 takeSelectionFromGroup(radio);
42 }
43
44 void removeRadio(SkyRadio radio) {
45 _radios.remove(radio);
46 if (_radios.isEmpty)
47 _controllerMap.remove(_scope);
48 }
49
50 void takeSelectionFromGroup(SkyRadio selectedRadio) {
51 String group = selectedRadio.group;
52 if (group == null)
53 return;
54 _radios.forEach((SkyRadio radio) {
55 if (selectedRadio == radio)
56 return;
57 if (radio.group != group)
58 return;
59 radio.selected = false;
60 });
61 }
62 }
63
64 const String _kOnIcon = 'toggle/radio_button_on_black';
65 const String _kOffIcon = 'toggle/radio_button_off_black';
66
67 @Tagname('sky-radio')
68 class SkyRadio extends SkyElement {
69 _RadioGroupController _controller;
70 SkyIcon _icon;
71
72 SkyRadio() {
73 addEventListener('click', _handleClick);
74 }
75
76 void shadowRootReady() {
77 _icon = shadowRoot.querySelector('sky-icon');
78 _icon.type = selected ? _kOnIcon : _kOffIcon;
79 }
80
81 void attached() {
82 super.attached();
83 _controller = _RadioGroupController.forRadio(this);
84 _controller.addRadio(this);
85 }
86
87 void detached() {
88 super.detached();
89 _controller.removeRadio(this);
90 _controller = null;
91 }
92
93 void selectedChanged(bool oldValue, bool newValue) {
94 if (_icon != null)
95 _icon.type = newValue ? _kOnIcon : _kOffIcon;
96 if (newValue && _controller != null)
97 _controller.takeSelectionFromGroup(this);
98 }
99
100 void groupChanged(String oldValue, String newValue) {
101 if (selected && _controller != null)
102 _controller.takeSelectionFromGroup(this);
103 }
104
105 _handleClick(_) {
106 this.selected = true;
107 }
108 }
109
110 _init(script) => register(script, SkyRadio);
111 </script>
112 </sky-element>
OLDNEW
« no previous file with comments | « sky/framework/elements/sky-menu-item.sky ('k') | sky/framework/elements/sky-scrollable.sky » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698