From 70e17b5f8f10869eec5448367187451bf9bd3a8a Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Thu, 24 May 2018 17:11:08 +0900 Subject: [PATCH] feat: add LabelButton API --- atom/browser/api/atom_api_button.cc | 4 ++ atom/browser/api/atom_api_button.h | 9 ++-- atom/browser/api/atom_api_label_button.cc | 58 +++++++++++++++++++++++ atom/browser/api/atom_api_label_button.h | 36 ++++++++++++++ atom/common/node_bindings.cc | 1 + filenames.gypi | 7 ++- lib/browser/api/label-button.js | 15 ++++++ lib/browser/api/module-list.js | 1 + 8 files changed, 126 insertions(+), 5 deletions(-) create mode 100644 atom/browser/api/atom_api_label_button.cc create mode 100644 atom/browser/api/atom_api_label_button.h create mode 100644 lib/browser/api/label-button.js diff --git a/atom/browser/api/atom_api_button.cc b/atom/browser/api/atom_api_button.cc index 61177aab08b..841fec758bd 100644 --- a/atom/browser/api/atom_api_button.cc +++ b/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"); diff --git a/atom/browser/api/atom_api_button.h b/atom/browser/api/atom_api_button.h index f290ff379ef..efc9489e2c7 100644 --- a/atom/browser/api/atom_api_button.h +++ b/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 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); }; diff --git a/atom/browser/api/atom_api_label_button.cc b/atom/browser/api/atom_api_label_button.cc new file mode 100644 index 00000000000..beaa9ccb4a1 --- /dev/null +++ b/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 prototype) { + prototype->SetClassName(mate::StringToV8(isolate, "LabelButton")); +} + +} // namespace api + +} // namespace atom + +namespace { + +using atom::api::LabelButton; + +void Initialize(v8::Local exports, + v8::Local unused, + v8::Local context, + void* priv) { + v8::Isolate* isolate = context->GetIsolate(); + mate::Dictionary dict(isolate, exports); + dict.Set("LabelButton", mate::CreateConstructor( + isolate, base::Bind(&LabelButton::New))); +} + +} // namespace + +NODE_BUILTIN_MODULE_CONTEXT_AWARE(atom_browser_label_button, Initialize) diff --git a/atom/browser/api/atom_api_label_button.h b/atom/browser/api/atom_api_label_button.h new file mode 100644 index 00000000000..28cd902dcec --- /dev/null +++ b/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 + +#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 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_ diff --git a/atom/common/node_bindings.cc b/atom/common/node_bindings.cc index f7659b6fdd4..20dfe412cb7 100644 --- a/atom/common/node_bindings.cc +++ b/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) diff --git a/filenames.gypi b/filenames.gypi index 02383c798f5..be5e128cf91 100644 --- a/filenames.gypi +++ b/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', diff --git a/lib/browser/api/label-button.js b/lib/browser/api/label-button.js new file mode 100644 index 00000000000..9a85cd917b8 --- /dev/null +++ b/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 diff --git a/lib/browser/api/module-list.js b/lib/browser/api/module-list.js index 739accbaf2d..7de59088531 100644 --- a/lib/browser/api/module-list.js +++ b/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'},