Browse Source

feat: add TextField API

Cheng Zhao 7 years ago
parent
commit
ba3700141f

+ 57 - 0
atom/browser/api/atom_api_text_field.cc

@@ -0,0 +1,57 @@
+// Copyright (c) 2018 GitHub, Inc.
+// Use of this source code is governed by the MIT license that can be
+// found in the LICENSE file.
+
+#include "atom/browser/api/atom_api_text_field.h"
+
+#include "atom/common/api/constructor.h"
+#include "native_mate/dictionary.h"
+#include "ui/views/controls/textfield/textfield.h"
+
+#include "atom/common/node_includes.h"
+
+namespace atom {
+
+namespace api {
+
+TextField::TextField() : View(new views::Textfield()) {
+  view()->set_owned_by_client();
+}
+
+TextField::~TextField() {}
+
+// static
+mate::WrappableBase* TextField::New(mate::Arguments* args) {
+  // Constructor call.
+  auto* view = new TextField();
+  view->InitWith(args->isolate(), args->GetThis());
+  return view;
+}
+
+// static
+void TextField::BuildPrototype(v8::Isolate* isolate,
+                               v8::Local<v8::FunctionTemplate> prototype) {
+  prototype->SetClassName(mate::StringToV8(isolate, "TextField"));
+}
+
+}  // namespace api
+
+}  // namespace atom
+
+namespace {
+
+using atom::api::TextField;
+
+void Initialize(v8::Local<v8::Object> exports,
+                v8::Local<v8::Value> unused,
+                v8::Local<v8::Context> context,
+                void* priv) {
+  v8::Isolate* isolate = context->GetIsolate();
+  mate::Dictionary dict(isolate, exports);
+  dict.Set("TextField", mate::CreateConstructor<TextField>(
+                            isolate, base::Bind(&TextField::New)));
+}
+
+}  // namespace
+
+NODE_BUILTIN_MODULE_CONTEXT_AWARE(atom_browser_text_field, Initialize)

+ 34 - 0
atom/browser/api/atom_api_text_field.h

@@ -0,0 +1,34 @@
+// Copyright (c) 2018 GitHub, Inc.
+// Use of this source code is governed by the MIT license that can be
+// found in the LICENSE file.
+
+#ifndef ATOM_BROWSER_API_ATOM_API_TEXT_FIELD_H_
+#define ATOM_BROWSER_API_ATOM_API_TEXT_FIELD_H_
+
+#include "atom/browser/api/atom_api_view.h"
+#include "native_mate/handle.h"
+
+namespace atom {
+
+namespace api {
+
+class TextField : public View {
+ public:
+  static mate::WrappableBase* New(mate::Arguments* args);
+
+  static void BuildPrototype(v8::Isolate* isolate,
+                             v8::Local<v8::FunctionTemplate> prototype);
+
+ private:
+  TextField();
+  ~TextField() override;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(TextField);
+};
+
+}  // namespace api
+
+}  // namespace atom
+
+#endif  // ATOM_BROWSER_API_ATOM_API_TEXT_FIELD_H_

+ 2 - 1
atom/common/node_bindings.cc

@@ -66,7 +66,8 @@
 
 #define ELECTRON_VIEW_MODULES(V) \
   V(atom_browser_box_layout)     \
-  V(atom_browser_layout_manager)
+  V(atom_browser_layout_manager) \
+  V(atom_browser_text_field)
 
 #define ELECTRON_DESKTOP_CAPTURER_MODULE(V) V(atom_browser_desktop_capturer)
 

+ 3 - 0
filenames.gypi

@@ -785,12 +785,15 @@
         'js_sources': [
           'lib/browser/api/box-layout.js',
           'lib/browser/api/layout-manager.js',
+          'lib/browser/api/text-field.js',
         ],
         'lib_sources': [
           'atom/browser/api/atom_api_box_layout.cc',
           'atom/browser/api/atom_api_box_layout.h',
           'atom/browser/api/atom_api_layout_manager.cc',
           'atom/browser/api/atom_api_layout_manager.h',
+          'atom/browser/api/atom_api_text_field.cc',
+          'atom/browser/api/atom_api_text_field.h',
         ],
       }],  # enable_view_api
       ['mas_build==1', {

+ 1 - 0
lib/browser/api/module-list.js

@@ -21,6 +21,7 @@ module.exports = [
   {name: 'screen', file: 'screen'},
   {name: 'session', file: 'session'},
   {name: 'systemPreferences', file: 'system-preferences'},
+  {name: 'TextField', file: 'text-field'},
   {name: 'TopLevelWindow', file: 'top-level-window'},
   {name: 'TouchBar', file: 'touch-bar'},
   {name: 'Tray', file: 'tray'},

+ 15 - 0
lib/browser/api/text-field.js

@@ -0,0 +1,15 @@
+'use strict'
+
+const electron = require('electron')
+
+const {View} = electron
+const {TextField} = process.atomBinding('text_field')
+
+Object.setPrototypeOf(TextField.prototype, View.prototype)
+
+TextField.prototype._init = function () {
+  // Call parent class's _init.
+  View.prototype._init.call(this)
+}
+
+module.exports = TextField