Browse Source

feat: add LabelButton API

Cheng Zhao 7 years ago
parent
commit
70e17b5f8f

+ 4 - 0
atom/browser/api/atom_api_button.cc

@@ -19,6 +19,10 @@ Button::Button(views::Button* button) : View(button) {
 
 Button::~Button() {}
 
+void Button::ButtonPressed(views::Button* sender, const ui::Event& event) {
+  Emit("click");
+}
+
 // static
 mate::WrappableBase* Button::New(mate::Arguments* args) {
   args->ThrowError("Button can not be created directly");

+ 6 - 3
atom/browser/api/atom_api_button.h

@@ -7,23 +7,26 @@
 
 #include "atom/browser/api/atom_api_view.h"
 #include "native_mate/handle.h"
-#include "ui/views/controls/button/label_button.h"
+#include "ui/views/controls/button/button.h"
 
 namespace atom {
 
 namespace api {
 
-class Button : public View, views::ButtonListener {
+class Button : public View, public views::ButtonListener {
  public:
   static mate::WrappableBase* New(mate::Arguments* args);
 
   static void BuildPrototype(v8::Isolate* isolate,
                              v8::Local<v8::FunctionTemplate> prototype);
 
- private:
+ protected:
   explicit Button(views::Button* view);
   ~Button() override;
 
+  // views::ButtonListener:
+  void ButtonPressed(views::Button* sender, const ui::Event& event) override;
+
  private:
   DISALLOW_COPY_AND_ASSIGN(Button);
 };

+ 58 - 0
atom/browser/api/atom_api_label_button.cc

@@ -0,0 +1,58 @@
+// 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_label_button.h"
+
+#include "atom/common/api/constructor.h"
+#include "base/strings/utf_string_conversions.h"
+#include "native_mate/dictionary.h"
+#include "ui/views/controls/button/label_button.h"
+
+#include "atom/common/node_includes.h"
+
+namespace atom {
+
+namespace api {
+
+LabelButton::LabelButton(const std::string& text)
+    : Button(new views::LabelButton(this, base::UTF8ToUTF16(text))) {}
+
+LabelButton::~LabelButton() {}
+
+// static
+mate::WrappableBase* LabelButton::New(mate::Arguments* args,
+                                      const std::string& text) {
+  // Constructor call.
+  auto* view = new LabelButton(text);
+  view->InitWith(args->isolate(), args->GetThis());
+  return view;
+}
+
+// static
+void LabelButton::BuildPrototype(v8::Isolate* isolate,
+                                 v8::Local<v8::FunctionTemplate> prototype) {
+  prototype->SetClassName(mate::StringToV8(isolate, "LabelButton"));
+}
+
+}  // namespace api
+
+}  // namespace atom
+
+namespace {
+
+using atom::api::LabelButton;
+
+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("LabelButton", mate::CreateConstructor<LabelButton>(
+                              isolate, base::Bind(&LabelButton::New)));
+}
+
+}  // namespace
+
+NODE_BUILTIN_MODULE_CONTEXT_AWARE(atom_browser_label_button, Initialize)

+ 36 - 0
atom/browser/api/atom_api_label_button.h

@@ -0,0 +1,36 @@
+// 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_LABEL_BUTTON_H_
+#define ATOM_BROWSER_API_ATOM_API_LABEL_BUTTON_H_
+
+#include <string>
+
+#include "atom/browser/api/atom_api_button.h"
+
+namespace atom {
+
+namespace api {
+
+class LabelButton : public Button {
+ public:
+  static mate::WrappableBase* New(mate::Arguments* args,
+                                  const std::string& text);
+
+  static void BuildPrototype(v8::Isolate* isolate,
+                             v8::Local<v8::FunctionTemplate> prototype);
+
+ protected:
+  explicit LabelButton(const std::string& text);
+  ~LabelButton() override;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(LabelButton);
+};
+
+}  // namespace api
+
+}  // namespace atom
+
+#endif  // ATOM_BROWSER_API_ATOM_API_LABEL_BUTTON_H_

+ 1 - 0
atom/common/node_bindings.cc

@@ -67,6 +67,7 @@
 #define ELECTRON_VIEW_MODULES(V) \
   V(atom_browser_box_layout)     \
   V(atom_browser_button)         \
+  V(atom_browser_label_button)   \
   V(atom_browser_layout_manager) \
   V(atom_browser_text_field)
 

+ 5 - 2
filenames.gypi

@@ -785,14 +785,17 @@
         'js_sources': [
           'lib/browser/api/box-layout.js',
           'lib/browser/api/button.js',
+          'lib/browser/api/label-button.js',
           'lib/browser/api/layout-manager.js',
           'lib/browser/api/text-field.js',
         ],
         'lib_sources': [
-          'atom/browser/api/atom_api_button.cc',
-          'atom/browser/api/atom_api_button.h',
           'atom/browser/api/atom_api_box_layout.cc',
           'atom/browser/api/atom_api_box_layout.h',
+          'atom/browser/api/atom_api_button.cc',
+          'atom/browser/api/atom_api_button.h',
+          'atom/browser/api/atom_api_label_button.cc',
+          'atom/browser/api/atom_api_label_button.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',

+ 15 - 0
lib/browser/api/label-button.js

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

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

@@ -11,6 +11,7 @@ module.exports = [
   {name: 'globalShortcut', file: 'global-shortcut'},
   {name: 'ipcMain', file: 'ipc-main'},
   {name: 'inAppPurchase', file: 'in-app-purchase'},
+  {name: 'LabelButton', file: 'label-button'},
   {name: 'LayoutManager', file: 'layout-manager'},
   {name: 'Menu', file: 'menu'},
   {name: 'MenuItem', file: 'menu-item'},