• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<!--
2  -- Copyright 2013 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
7<polymer-element name="kb-key" extends="kb-key-base"
8    attributes="image imageSize keyCode keyName shiftModifier weight">
9  <template>
10    <style>
11      :host {
12        /* TODO(kevers): A regression in the Polymer library broke
13         * handling of {{}} in CSS rules. Switch back to
14         * "-webkit-box-flex: {{weight}}" once the regression is fixed
15         * (https://github.com/Polymer/polymer/issues/270). */
16        -webkit-box-flex: 100;
17        background-color: #3b3b3e;
18        /* TODO(rsadam): remove when {{}} regression is fixed */
19        background-image: none;
20        background-position: center center;
21        background-repeat: no-repeat;
22        /* TODO(rsadam): remove when {{}} regression is fixed */
23        background-size: 50%;
24        border-top: 2px solid #4b4b4e;
25        border-radius: 2px;
26        color: #ffffff;
27        display: -webkit-box;
28        font-family: 'Open Sans', 'Noto Sans UI', sans-serif;
29        font-weight: 300;
30        margin-left: 0.25em;
31        position: relative;
32      }
33
34      ::part(key) {
35        bottom: 0;
36        height: 1.2em;
37        left: 0;
38        margin: auto;
39        padding-left: 0.7em;
40        padding-right: 0.7em;
41        position: absolute;
42        right: 0;
43        top: 0;
44      }
45
46      ::part(hint) {
47        color: #7c7c7c;
48        font-size: 70%;
49        position: absolute;
50        right: 7%;
51        top: 5%;
52      }
53
54      :host[invert] ::part(key) {
55        color: #7c7c7c;
56      }
57
58      :host[invert] ::part(hint) {
59        color: #ffffff;
60      }
61    </style>
62    <div id="key" part="key">
63      <content></content>
64    </div>
65    <div part="hint">{{hintText}}</div>
66  </template>
67  <script>
68    Polymer('kb-key', {
69      /**
70       * The background image to display on this key. Does not display an
71       * image if this is the empty string.
72       * @type {string}
73       */
74      image: "",
75
76      /**
77       * The background image size to use if an image is specified. The size
78       * is provided as a string, for example, "50%".
79       * @type {string}
80       */
81      imageSize: "",
82
83      /**
84       * Key codes have been deprecated in DOM3 key events, but are required
85       * for legacy web content. The key codes depend on the position of the
86       * key on the keyboard and is independent of which modifier keys (shift,
87       *  alt, ...) are active.
88       * @type {number|undefined}
89       */
90      keyCode: undefined,
91
92      /**
93       * Name of the key as defined in the DOM3 specification for key events.
94       * Like the keyCode, the keyName is independent of the state of the
95       * modifier keys.
96       * @type {string|undefined}
97       */
98      keyName: undefined,
99
100      /**
101       * Whether the shift key is pressed when producing the key value.
102       * @type {boolean}
103       */
104      shiftModifier: false,
105      /**
106       * Weighting to use for layout in order to properly size the key.
107       * Keys with a high weighting are wider than normal keys.
108       * @type {number}
109       */
110      weight: 100,
111
112      /**
113       * Called when the image attribute changes. This is used to set the
114       * background image of the key.
115       * TODO(rsadam): Remove when polymer {{}} syntax regression is fixed.
116       */
117      imageChanged: function() {
118        if (!this.image)
119          this.style.backgroundImage = "none";
120        else
121          this.style.backgroundImage = "url(images/" + this.image + ".svg)";
122      },
123
124      /**
125       * Called when the image attribute changes. This is used to set the
126       * background image of the key.
127       * TODO(rsadam): Remove when polymer {{}} syntax regression is fixed.
128       */
129      imageSizeChanged: function() {
130        this.style.backgroundSize = this.imageSize;
131      },
132
133      /**
134       * Returns a subset of the key attributes.
135       * @param {string} caller The id of the function that called
136       *     populateDetails.
137       * @return {Object} Mapping of attributes for the key element.
138       */
139      populateDetails: function(caller) {
140        var details = this.super([caller]);
141        details.keyCode = this.keyCode;
142        details.keyName = this.keyName;
143        details.shiftModifier = this.shiftModifier;
144        return details;
145      },
146
147      /**
148       * Adjusts the CSS rules for rendering the key to reflect the new
149       * weight. The preferred way is to use {{weight}} directly in the CSS
150       * rules; however, this is currently broken in the Polymer library.
151       * TODO(kevers): Cleanup once handling of {{}} in CSS rules is fixed.
152       */
153      weightChanged: function() {
154        if (this.weight > 0)
155          this.style['webkitBoxFlex'] = this.weight;
156      },
157    });
158  </script>
159</polymer-element>
160
161<!-- Special keys -->
162<polymer-element name="kb-abc-key" class="symbol dark" char="Invalid"
163    extends="kb-key" weight="125">
164  <script>
165    Polymer('kb-abc-key', {
166      populateDetails: function(caller) {
167        var detail = this.super([caller]);
168        switch (caller) {
169          case ('down'):
170            detail.relegateToShift = true;
171            break;
172          default:
173            break;
174        }
175        return detail;
176      }
177    });
178  </script>
179</polymer-element>
180
181<polymer-element name="kb-hide-keyboard-key" class="hide-keyboard dark"
182    char="Invalid" extends="kb-key">
183  <script>
184    Polymer('kb-hide-keyboard-key', {
185      /**
186       * Timer for a long press event which triggers the display of a keyboard
187       * options menu.
188       * @type {?Function}
189       */
190      longPressTimer: undefined,
191
192      down: function(event) {
193         var self = this;
194         this.longPressTimer = this.asyncMethod(function() {
195           if (self.longPressTimer) {
196             clearTimeout(self.longPressTimer);
197             self.longPressTimer = undefined;
198             var details = {
199               left: this.offsetLeft,
200               top: this.offsetTop,
201               width: this.clientWidth,
202             };
203             this.fire('show-options', details);
204           }
205         }, null, LONGPRESS_DELAY_MSEC);
206      },
207
208      /** @override */
209      ready: function() {
210        this.super();
211        this.image = "keyboard";
212      },
213
214      up: function(event) {
215        if (this.longPressTimer) {
216          clearTimeout(this.longPressTimer);
217          hideKeyboard();
218          this.longPressTimer = undefined;
219        }
220      }
221    });
222  </script>
223</polymer-element>
224