ãã®èšäºã¯ãèšäº
ãJavaScriptã®ãã¹ã¯ãããã¢ããªã±ãŒã·ã§ã³ãã®ç¶ãã§ã
ã ããŒã1ã åã®ããŒãã§ã¯ã次ã®ããšã確èªããŸããã
- nw.jsãã€ã³ã¹ããŒã«ãã
- NW.jsã§ã®ã¢ããªã±ãŒã·ã§ã³ã®æ§ç¯ãšå®è¡
- ãã€ãã£ãã³ã³ãããŒã«ã®æäœã®åºæ¬ïŒã¡ãã¥ãŒã®äœæãªã©ïŒ
ãã®èšäºã§ã¯ããã¹ã¯ãŒããä¿åããããã®ã¢ããªã±ãŒã·ã§ã³ã®äœæãæ€èšããŸãã ã¢ããªã±ãŒã·ã§ã³ã¯æ¯èŒçåçŽã§ãã»ãšãã©ã®éšåã¯å®éã®ãããã¿ã€ãã§ãã ãã ããå¿
èŠã«å¿ããŠæéãããå Žåã¯ã倿ŽããŠæ¥åžžæ¥åã«å®å
šã«äœ¿çšã§ããŸãã
ãã¹ã¯ãŒãä¿åã¢ããªã±ãŒã·ã§ã³ã®åºç€
ãåç¥ã®ããã«ãéçºã¯çŽç²ãªJavaScriptãšããŸããŸãªãã¬ãŒã ã¯ãŒã¯ã®äž¡æ¹ã䜿çšããŠå®è¡ã§ããŸããããã®å€ãã¯éåžžã«å€ã
ããã®çš®é¡ã«è¿·ãããšããããé·ãééžæããããšãã§ããŸãã ã ã¢ããªã±ãŒã·ã§ã³éçºã§ã¯ããã¿ãŒã³ãç¹ã«äººæ°ãããããã®ååã¯MVã§å§ãŸããŸãïŒ
MVC ã
MVVM ã
MVP ïŒã åæ§ã®ãã¿ãŒã³ã䜿çšãããã¬ãŒã ã¯ãŒã¯ã®1ã€ã¯ãã¢ããªã±ãŒã·ã§ã³ãéçºãããšãã«äœ¿çšãã
Angular JSã§ãã ããã«æ
£ããŠããªãå Žåã¯ãããã¥ã¡ã³ãïŒ
ãã¥ãŒããªã¢ã« ã
API ïŒãèªãããšããå§ãããŸãããã·ã¢èªã®
ããã¥ã¢ã«ã§åºæ¬æ
å ±ãåŠã¶ããšãã§ããŸãã
ã¢ããªã±ãŒã·ã§ã³ã¯äœã«ãªããŸããïŒ ãã¹ãŠã®ããŒã¿ã¯ããŒãã«ã«è¡šç€ºããããã°ã€ã³ã衚瀺ããããã¹ã¯ãŒãã®ä»£ããã«ã¢ã¹ã¿ãªã¹ã¯ã衚瀺ãããŸãã ãŠãŒã¶ãŒã¯ãæ°ãããã°ã€ã³/ãã¹ã¯ãŒãã远å ããããäžèŠã«ãªã£ããšã³ããªãåé€ãããã§ããŸãã ããã«ãç·šéãæäŸããå¿
èŠããããŸãã
ã¢ããªã±ãŒã·ã§ã³ã®åºæ¬æ©èœãå®è£
ããŸãã ãããè¡ãã«ã¯ããœãŒã¹ã³ãŒããèŠã€ãããã©ã«ããŒãäœæãããã®äžã«
package.jsonãé
眮ããŸãïŒãããè¡ãæ¹æ³ã«ã€ããŠã¯ãããŒã1ãåç
§ããŠãã ããïŒã
次ã®ãã£ã¬ã¯ããªã§æ§æãããåºæ¬çãªãã©ã«ããŒæ§é ãäœæããŸãã
- CSS-ãã®ãã©ã«ããŒã«ã¹ã¿ã€ã«ãé
眮ããŸãïŒã¡ã€ã³ã®ã¹ã¿ã€ã«ãå«ãindex.cssãã¡ã€ã«ãããã«è¿œå ããŸãïŒ
- ã³ã³ãããŒã©ãŒ -ãããã³ã³ãããŒã©ãŒã«ãªããŸã
- ãã¥ãŒ - ãã¥ãŒã®ãã©ã«ããŒ
- ãã£ã¬ã¯ãã£ã - ãã£ã¬ã¯ãã£ãã®ãããã©ã«ããŒ
- Lib-ã©ã€ãã©ãªïŒ angle.min.jsããã®ãã©ã«ãã«ã³ããŒããå¿
èŠããããŸããangularJSã® è¿œå æ¹æ³ã«ã€ããŠïŒ
ããã«ã
index.htmlãã¡ã€ã«ããããžã§ã¯ãã«ãŒãã«è¿œå ããŸããããã¯ãã¢ããªã±ãŒã·ã§ã³ãžã®ãšã³ããªãã€ã³ãã«ãªããŸãã åºæ¬çãªããŒã¯ã¢ãããäœæããŸãã
åºæ¬çãªããŒã¯ã¢ãã<html ng-app="main"> <head> <meta charset="utf-8"> <title>Password keeper</title> <link rel="stylesheet" type="text/css" href="css/index.css"> </head> <body> <table> <thead> <tr> <td></td> <td>Login</td> <td>Password</td> <td></td> </tr> </thead> <tbody> <tr> <td></td> <td></td> <td></td> <td><a></a></td> </tr> </tbody> <tfoot> <tr> <td></td> <td><a></a></td> <td></td> <td></td> </tr> </tfoot> </table> <script type="text/javascript" src="lib/angular.min.js"></script> </body> </html>
ã¢ããªã±ãŒã·ã§ã³ã¯éåžžã«ã·ã³ãã«ã§ãããããã³ã³ãããŒã©ãŒãäœæãããã®äžã«ã¢ããªã±ãŒã·ã§ã³ã®ãã¹ãŠã®ã¡ã€ã³ããžãã¯ãé
眮ããŸãïŒããžãã¯ã倧ãããªãã«ã€ããŠã
Serviceãã©ã«ããŒã远å ãããã®äžã«
ãµãŒãã¹ãé
眮ããå¿
èŠããããŸãã ãèããïŒã ã³ã³ãããŒã©ãŒã
main ãã³ã³ãããŒã©ãŒãã¡ã€ã«ã
main.ctrl.jsãšåŒã³ãŸã
ã ãããã£ãŠãã³ã³ãããŒã©ãŒã®ãã©ã³ã¯ïŒ
(function () { 'use strict'; angular .module('main', []) .controller('MainCtrl', [MainCtrl]); function MainCtrl() { this.data = []; return this; } })();
ãããã¿ã€ãã®ãŠãŒã¶ãŒå/ãã¹ã¯ãŒããå«ãããŒã¿ã¯ã
ããŒã¿é
åã«é
眮ãã
ãŸã ã ç·šéã®å®è£
ãç°¡çŽ åããã«ã¯ãç¬èªã®
EditableTextèŠçŽ ãäœæãããã£ã¬ã¯ãã£ããšããŠé
眮ããŸãã ãã®èŠçŽ ã¯æ¬¡ã®ããã«æ©èœããŸããèŠçŽ ã¯ããã¹ããšããŠè¡šç€ºãããèŠçŽ ãã¯ãªãã¯ãããšããã¹ããããã¹ãå
¥åãã£ãŒã«ãã«å€ããããã©ãŒã«ã¹ã倱ããããšèŠçŽ ãããã¹ããšããŠåã³è¡šç€ºãããŸãã ãããè¡ãã«ã¯ã
Viewãã©ã«ããŒå
ã«
editableText.htmlãã£ã¬ã¯ãã£ãã®ããŒã¯ã¢ãããã¡ã€ã«ãäœæããŸãã
<input ng-model="value"> <span ng-click="edit()">{{value}}</span>
ãããŠã
ãã£ã¬ã¯ãã£ããã©ã«ããŒå
ã§ã
editableText.jsãã¡ã€ã«ãäœæããŸãã
ç·šéå¯èœãªããã¹ããã£ã¬ã¯ãã£ãã³ãŒã (function () { 'use strict'; angular .module('main') .directive('editableText', [editableText]); function editableText() { var directive = { restrict: 'E', scope: { value: "=" }, templateUrl: 'view/editableText.html', link: function ( $scope, element, attrs ) {
ãã®ãã£ã¬ã¯ãã£ãã«ã¯ã
index.csså
ã«é
眮ã§ããããã€ãã®ã¹ã¿ã€ã«ãå¿
èŠ
ã§ã ã
.editable-text span { cursor: pointer; } .editable-text input { display: none; } .editable-text.active span { display: none; } .editable-text.active input { display: inline-block; }
ãã£ã¬ã¯ãã£ãã®äœ¿ç𿹿³ã¯æ¬¡ã®ãšããã§ãã
<editable-text value="variable"></editable-text>
ãã°ã€ã³ã®å Žåããã¹ãŠãé 調ã§ããããã¹ããŸãã¯ããã¹ããã£ãŒã«ãã®ããããã衚瀺ããŸããããã¹ã¯ãŒãã¯è¡šç€ºãã¹ãã§ã¯ãããŸããã æ¬¡ã®ããã«ãæå·ãã£ãŒã«ãããã£ã¬ã¯ãã£ãã®
ã¹ã³ãŒãã«è¿œå ããŸãã
scope: { value: "=", crypto: "=" }
ãŸãããã£ã¬ã¯ãã£ãã®ããŒã¯ã¢ããã倿ŽããŸãã
<input ng-model="value"> <span ng-click="edit()">{{crypto?'***':value}}</span>
ããã«ãindex.htmlã«ã¹ã¯ãªããã远å ããããšãå¿ããªãã§ãã ããïŒ
<script type="text/javascript" src="lib/angular.min.js"></script> <script type="text/javascript" src="controller/main.ctrl.js"></script> <script type="text/javascript" src="directive/editableText.js"></script>
æ©èœã远å ããŸãã æ¬¡ã®ããã«ã³ã³ãããŒã©ãŒã倿ŽããŸãã
ã³ã³ãããŒã©ãŒã³ãŒã function MainCtrl() { var self = this; this.data = []; this.remove = remove; this.copy = copy; this.add = add; return this; function remove(ind){ self.data.splice(ind, 1); }; function copy(ind){
ããã«ãããŒã¯ã¢ããã®å€æŽãå¿
èŠã§ãã
æçµããŒã¯ã¢ãã <body ng-controller="MainCtrl as ctrl"> <table> <thead> <tr> <td></td> <td>Login</td> <td>Password</td> <td></td> </tr> </thead> <tbody> <tr ng-repeat="record in ctrl.data track by $index"> <td><a ng-click="ctrl.copy($index)">{{$index}}</a></td> <td><editable-text value="record.login"></editable-text></td> <td><editable-text value="record.password" crypto="true"></editable-text></td> <td><a ng-click="ctrl.remove($index)"></a></td> </tr> </tbody> <tfoot> <tr> <td></td> <td><a ng-click="ctrl.add()"></a></td> <td></td> <td></td> </tr> </tfoot> </table> <script type="text/javascript" src="lib/angular.min.js"></script> <script type="text/javascript" src="controller/main.ctrl.js"></script> <script type="text/javascript" src="directive/editableText.js"></script> </body>
ãã®æ®µéã§ãã¹ã¿ã€ãªã³ã°ãè¡ãããšãã§ããŸãã åçŽãªã¹ã¿ã€ã«ã®äŸïŒ
index.cssã«ã¹ã¿ã€ã«ã远å ããŸãããã¹ã¿ã€ã«ã倿°ããå Žåã¯ãã¹ã¿ã€ã«ããã¡ã€ã«ã«åå²ãããã
LESSãªã©ã®ããªããã»ããµã䜿çšããããšãã§ããŸãïŒïŒ
ã¢ããªã±ãŒã·ã§ã³ã¹ã¿ã€ãªã³ã°ã®äŸ table { border-collapse: collapse; margin: auto; width: calc(100% - 40px); } table, table thead, table tfoot, table tbody tr td:first-child, table tbody tr td:nth-child(2), table tbody tr td:nth-child(3), table thead tr td:nth-child(2), table thead tr td:nth-child(3) { border: 1px solid #000; } table td { padding: 5px; } table thead { background: #EEE; } table tbody tr td:first-child { background: #CCC; } table tbody tr td:nth-child(2) { background: #777; color: #FFF; } table tbody tr td:nth-child(3) { background: #555; color: #FFF; } table thead tr td:nth-child(2),table thead tr td:nth-child(3) { text-align: center; } table a { font-size: smaller; cursor: pointer; }
ã¢ããªã±ãŒã·ã§ã³ã¯æ¬¡ã®ãšããã§ãã

ã¯ãªããããŒããæäœãã
ãã®ãããã¢ããªã±ãŒã·ã§ã³ã®åºç€ã¯çšæãããŠããŸãããäž»ãªç®çããŸã å®è£
ããŠããŸããããã¹ã¯ãŒããã³ããŒããããšã¯ã§ããŸããïŒããããã³ããŒããããšã¯ã§ããŸãããéåžžã«äžäŸ¿ã§ãïŒã éå§ããã«ã¯ãNW.jsã§ã¯ãªããããŒããæäœããããšãæ€èšããŠãã ãã
ã¯ãªããããŒããšããç¹å¥ãªãªããžã§ã¯ãããã
ãŸã ãããã¯
ã Windowsã®
ã¯ãªããããŒããšGTKã®
æœè±¡åãšããŠããŸãããŒã¹ãããŒãïŒMacïŒã®
æœè±¡åãšããŠäœ¿çšãããŸãã å·çæç¹ã§ã¯ãããã¹ãã®ã¿ã®æžã蟌ã¿ãšèªã¿åãã®ãµããŒãããããŸãã
ãªããžã§ã¯ããæäœããã«ã¯ã䜿ãæ
£ãã
nw.guiã¢ãžã¥ãŒã«ãå¿
èŠã§ãã
var gui = require('nw.gui'); var clipboard = gui.Clipboard.get();
ç¬èªã®ãªããžã§ã¯ããäœæããããšã¯ã§ãããã·ã¹ãã ãªããžã§ã¯ãã®ã¿ãååŸã§ããããšã«æ³šæããŠãã ããã æ¬¡ã®3ã€ã®æ¹æ³ããµããŒããããŠããŸãã
- get ïŒ[type]ïŒ-ãã®ãªããžã§ã¯ãã®ã¿ã€ãã瀺ãã¯ãªããããŒããããªããžã§ã¯ããååŸããŸããããã©ã«ãã¯textã§ããããããŸã§ã®ãšãããããããµããŒããããŠããå¯äžã®ã¿ã€ãã§ã
- set ïŒdataã[type]ïŒ-ãªããžã§ã¯ããã¯ãªããããŒãã«éä¿¡ããŸãïŒã¿ã€ãã®ã¿-ãããã¹ããããµããŒããããŸãïŒ
- clear-ã¯ãªããããŒããæ¶å»ããŸã
ããã§ãã¢ããªã±ãŒã·ã§ã³ã®æ©èœãçµäºã§ããã³ã³ãããŒã©ãŒã¯æ¬¡ã®ããã«ãªããŸãã
ã³ã³ãããŒã©ãŒã³ãŒã function MainCtrl() { var self = this; var gui = require('nw.gui'); var clipboard = gui.Clipboard.get(); this.data = []; this.remove = remove; this.copy = copy; this.add = add; return this; function remove(ind){ self.data.splice(ind, 1); }; function copy(ind){ clipboard.set(self.data[ind].password); }; function add(){ self.data.push({login: "login", password: "password"}); }; }
ãã¹ã¯ãŒãä¿å
ã¢ããªã±ãŒã·ã§ã³ã®èµ·ååŸããŠãŒã¶ãŒã¯ããã€ãã®ãã¹ã¯ãŒããä¿åããã¢ããªã±ãŒã·ã§ã³ãéããŸããã ç¿æ¥ããã¹ã¯ãŒãããªããªã£ãããšãããããŸããã åé¡ã¯ãããããéãããšãã«åé€ãããéåžžã®ããŒã«ã«å€æ°ã«ä¿åããããšã§ãã
3çªç®ã®éšåã§ã¯ãNW.jsãããŒã¿ããŒã¹ã§ã©ã®ããã«æ©èœããããèŠãŠãããŸãããä»ã®ãšããã¯
localStorageã«ãã¹ã¯ãŒããä¿åã
ãŸã ã æ©èœã®äœæãéå§ããåã«ïŒäœ¿çšããŠããã¢ããªã±ãŒã·ã§ã³ã¯åãªããããã¿ã€ãã§ããïŒãã»ãã¥ãªãã£ã«æ³šæããå¿
èŠããããŸãã ãããè¡ãã«ã¯ããã¹ã¯ãŒããå¹³æã§ä¿åããªãã§ãã ããã
æå·å/埩å·åçšã®ããŸããŸãª
JavaScriptã©ã€ãã©ãªããããŸãã ãã®ãããªã©ã€ãã©ãªã®1ã€ã«
crypto-jsããããŸãã
node.jsã®ã¢ãžã¥ãŒã«ãšããŠã€ã³ã¹ããŒã«ããŸãã ã©ã€ãã©ãªã¯å€æ°ã®æšæºããµããŒãããŠããããã®å®å
šãªãªã¹ãã¯ããã¥ã¡ã³ãã«èšèŒãããŠããŸãã åæã«ããã¹ãŠã®ã¢ãžã¥ãŒã«ãšåå¥ã®ã¢ãžã¥ãŒã«ã®äž¡æ¹ãæ¥ç¶ã§ããŸãã
ã¡ãã»ãŒãžãæå·åããã«ã¯ãæå·åæ¹åŒã䜿çšãããŸãã
var ciphertext = CryptoJS.AES.encrypt('', ' ');
埩å·åã¯ããå°ãè€éã§ãïŒ
var bytes = CryptoJS.AES.decrypt(ciphertext.toString(), ' '); var plaintext = bytes.toString(CryptoJS.enc.Utf8);
ã¢ããªã±ãŒã·ã§ã³ã倿ŽããŠãã¢ããªã±ãŒã·ã§ã³ãéãããšãã«ãã¹ã¯ãŒããä¿åããèµ·åæã«ããŒãã§ããããã«ããŸãã
crypto.svcãµãŒãã¹ãäœæãã
ãµãŒãã¹ãã©ã«ããŒã«é
眮ããŸãïŒãã®ãã©ã«ããŒããŸã äœæããŠããªãå Žåã¯ãã¢ããªã±ãŒã·ã§ã³ã«ãŒãã«äœæããŸãïŒã
ãµãŒãã¹ã³ãŒã (function () { 'use strict'; angular .module('main') .factory('CryptoService', [CryptoService]); function CryptoService() { var CryptoJS = require("crypto-js"); var secretKey = "secretKey"; var service = { encrypt: encrypt, decrypt: decrypt }; return service; function encrypt(data) { return CryptoJS.AES.encrypt(JSON.stringify(data), secretKey); } function decrypt(text) { var bytes = CryptoJS.AES.decrypt(text.toString(), secretKey); var decryptedData = JSON.parse(bytes.toString(CryptoJS.enc.Utf8)); return decryptedData; } } })();
ãµãŒãã¹ã䜿çšããã«ã¯ãã³ã³ãããŒã©ãŒãã¢ããã°ã¬ãŒãããŸãã
ã³ã³ãããŒã©ãŒã³ãŒã (function () { 'use strict'; angular .module('main', []) .controller('MainCtrl', ['$scope', 'CryptoService', MainCtrl]); function MainCtrl($scope, CryptoService) { var self = this; var gui = require('nw.gui'); var clipboard = gui.Clipboard.get(); var localStorageKey = "loginPasswordData" this.data = []; this.remove = remove; this.copy = copy; this.add = add; load(); $scope.$watch("ctrl.data", save, true); return this; function remove(ind){ self.data.splice(ind, 1); }; function copy(ind){ clipboard.set(self.data[ind].password); }; function add(){ self.data.push({login: "login", password: "password"}); }; function load(){ var text = localStorage.getItem(localStorageKey); if(text) { self.data = CryptoService.decrypt(text); } } function save(){ if(self.data) { localStorage.setItem(localStorageKey, CryptoService.encrypt(self.data)); } } } })();
ãµãŒãã¹ã®æ¥ç¶ã«å ããŠã
AngularJSã«æ¢ã«ååšãã
$ scopeãµãŒãã¹ãå¿
èŠã§ããã
$ watchã¡ãœããã䜿çšããŠãããŒã¿ã倿Žãããç¬éã远跡ããããããæéå
ã«ä¿åããŸãïŒ3çªç®ã®åŒæ°ã
trueã§ããããã倿Žã¯é
åã ãã§ãªããæ¿å
¥/åé€ã ãã§ãªãã倿Žã远跡ãããŸãé
åèŠçŽ ãã€ãŸãåã
ã®é
åèŠçŽ ã®ãŠãŒã¶ãŒåãŸãã¯ãã¹ã¯ãŒãã®å€æŽïŒã ãã¥ãŒãéããšãããŒã¿ã®èªã¿èŸŒã¿ãè¡ãããŸãã
ãã¬ã€ã«åãã
ã¢ããªã±ãŒã·ã§ã³ã®åºç€ã¯çšæãããŠããŸããããåç¥ã®ããã«ããã®ãããªããã°ã©ã ã¯ã·ã¹ãã ãã¬ã€ã«æå°åãããŠãããããå€ãã®éããŠãããŠã£ã³ããŠã§ãŠãŒã¶ãŒãéè² è·ã«ãªããªãããã«ãªã£ãŠããŸãã
NW.jsã«å°å
¥ããããã1ã€ã®æœè±¡åã¯ããã¬ã€ã§ããWindowsã®
ã·ã¹ãã ãã¬ã€ ã¢ã€ã³ã³ ãGTKã®
ã¹ããŒã¿ã¹ã¢ã€ã³ã³ ãOSXã®
ã¹ããŒã¿ã¹ã¢ã€ãã ã ãã®ãªããžã§ã¯ãã¯ãæ¢ç¥ã®
guiã¢ãžã¥ãŒã«ã䜿çšããŠäœæãããŸãã
var gui = require("nw.gui"); var tray = new gui.Tray({ title: 'Tray', icon: 'img/icon.png' });
ãã®ãªããžã§ã¯ããæäœãããšãã¯ã倿°ã®ã¹ã³ãŒãã«æ³šæããå¿
èŠããããŸãã颿°å
ã§å€æ°ãäœæãããšã
GCã«ãã£ãŠããã«åé€ãããŸãã ãªããžã§ã¯ããäœæãããšããäŸã§è¡ã£ãããã«ãããã«ããããã£ãäœæã§ããŸãããŸãã¯ãå°ãåŸã§ãããåŠçã§ããŸãã ãã®ãªããžã§ã¯ãã«ã¯ã次ã®ããããã£ãå®çŸ©ã§ããŸãã
- ã¿ã€ãã« -Mac OSXã§ã®ã¿è¡šç€ºãããŸã
- ããŒã«ããã -ãã¹ãŠã®ãã©ãããã©ãŒã ã§å©çšå¯èœãªããŒã«ããã
- ã¢ã€ã³ã³ -ãã¬ã€ã«è¡šç€ºãããã¢ã€ã³ã³ã¯ããã¹ãŠã®ãã©ãããã©ãŒã ã§ãå©çšå¯èœã§ã
- ã¡ãã¥ãŒ -Mac OS Xã®ã¯ãªãã¯ã§è¡šç€ºãããã¡ãã¥ãŒïŒWindowsããã³LinuxçšïŒ-ã·ã³ã°ã«ã¯ãªãã¯ããã³å³ã¯ãªãã¯ã«å¿çããŸãïŒã¡ãã¥ãŒã®äœææ¹æ³ã«ã€ããŠã¯ãã·ãªãŒãºã®æåã®éšåãåç
§ããŠãã ããïŒ
ã¢ããªã±ãŒã·ã§ã³ã§ãã¬ã€ã䜿çšããã«ã¯ãããŒã¯ã¢ããèŠçŽ ãäœæããå¿
èŠããã
ãŸã ãæãæçœãªãªãã·ã§ã³ã¯ãã¿ã³
buttonã§ãã æ¬¡ã«ã
ã¯ãªãã¯ã€ãã³ãããµãã¹ã¯ã©ã€ããã
windowãªããžã§ã¯ãã®ã¡ãœããã䜿çšããå¿
èŠããããŸããããã«ã€ããŠã¯ããããã説æããŸãã
ãŠã£ã³ããŠã§ã®äœæ¥
ãŠã£ã³ããŠãæäœããã«ã¯ãæ¢åã®ãŠã£ã³ããŠãååŸããããæ°ãããŠã£ã³ããŠãäœæããå¿
èŠããããŸãã ãããã£ãŠãã¢ããªã±ãŒã·ã§ã³ã衚瀺ãããŠããçŸåšã®ãŠã£ã³ããŠãååŸããã«ã¯ã次ã®ã³ãã³ããå®è¡ããå¿
èŠããããŸãã
var win = gui.Window.get();
ãããŠãæ°ãããŠã£ã³ããŠãäœæããã«ã¯ãããŒãžãé
眮ãããŠããã¢ãã¬ã¹ããã®ãŠã£ã³ããŠã§éãã¢ãã¬ã¹ãããã³éãããã®ãã©ã¡ãŒã¿ãŒãæå®ããå¿
èŠããããŸãïŒãããã®ãã©ã¡ãŒã¿ãŒã¯ããããã§ã¹ãã®äœææã«æå®ãããã®ã«å¯Ÿå¿ããŸããäžé£ã®èšäºã®æåã®éšåãåç
§ïŒã
var win = gui.Window.open ('https://myurl', { position: 'center', width: 901, height: 127 });
ãã©ã¡ãŒã¿ã«ç¹å¥ãªããããã£
ãã©ãŒã«ã¹ãæž¡ãããšãã§ããŸã
ãtrueãæå®ãããšãæ°ããäœæããããŠã£ã³ããŠã¯ããã«ãã©ãŒã«ã¹ãåãåããŸããããã§ãªãå Žåããã©ãŒã«ã¹ã¯çŸåšã®ãŠã£ã³ããŠã«æ®ããŸãã
æ°ãããŠã£ã³ããŠãäœæããäœæåŸã«ããã䜿çšãããå Žåã¯ã察å¿ããã€ãã³ãã«ãµãã¹ã¯ã©ã€ãããå¿
èŠããããŸãã
win.on ('loaded', function(){
ãã®äŸãããããããã«ããŠã£ã³ããŠã®ããããã£ã®1ã€ã¯ãŠã£ã³ããŠãªããžã§ã¯ãã§ãããã®ãªããžã§ã¯ããããããã¥ã¡ã³ããå«ãæ®ãã®èŠçŽ ãååŸã§ããŸãã ãã®ããããã£ã«å ããŠããŠã£ã³ããŠã¯ä»ã®å€ãã®æ©èœããµããŒãããŠããŸãã
- xãy-ãŠã£ã³ããŠåº§æš
- å¹
ãé«ã -ãŠã£ã³ããŠãµã€ãº
- title-ãŠã£ã³ããŠã®ã¿ã€ãã«
- menu-ãŠã£ã³ããŠã®äžéšã«é
眮ãããã¢ããªã±ãŒã·ã§ã³ã®ã¡ã€ã³ã¡ãã¥ãŒ
ãããã®ããããã£ã¯èªã¿åãã ãã§ãªãã倿Žããããšãã§ããŸãã ãããã«å ããŠãèªã¿åãå°çšããããã£ããããŸãïŒãããã¯ãã¹ãŠè«ççã§ãããtrueãŸãã¯falseã«ãªããŸãïŒ
- isTransparent-ãŠã£ã³ããŠãéæãã©ãã
- isFullscreen-ãŠã£ã³ããŠãå
šç»é¢ã§éããŠãããã©ãã
- isKioskMode-ã¢ããªã±ãŒã·ã§ã³ãããªã¹ã¯modã§éããŠãããã©ãã
ãªããžã§ã¯ãã¯ãããããã£ã«å ããŠã倿°ã®ã¡ãœããããµããŒãããŠããŸãã äž»ãªæ¹æ³ã以äžã«ç€ºãã䟿å®äžã°ã«ãŒãåããŠããŸãã
ãŠã£ã³ããŠã®äœçœ®ãšãµã€ãºã倿Žããæ¹æ³ïŒ
- moveTo -x座æšãšy座æšãšããŠãã©ã¡ãŒã¿ãŒã«æž¡ãããäœçœ®ã«ãŠã£ã³ããŠãç§»åããŸã
- moveBy-ãŠã£ã³ããŠãç¹å®ã®ãã¯ã»ã«æ°ã ãå³ããã³äžã«ç§»åããŸãïŒè² ã®åŒæ°ãå·Šããã³äžã«èšå®ããå ŽåïŒ
- resizeTo-ãŠã£ã³ããŠã®ãµã€ãºã倿ŽããŸããæåã®åŒæ°ã¯å¹
ã瀺ãã2çªç®ã¯ãŠã£ã³ããŠã®é«ãã瀺ããŸã
- resizeBy-ãŠã£ã³ããŠãç¹å®ã®ãã¯ã»ã«æ°ã ãå³ããã³äžã«ãµã€ãºå€æŽããŸãïŒè² ã®åŒæ°ãå·Šããã³äžã«èšå®ããå ŽåïŒ
- setPosition-åŒæ°ãšããŠæž¡ããããŠã£ã³ããŠã®ç¹å®ã®äœçœ®ãèšå®ããŸãïŒçŸåšã¯ 'center'ã®ã¿ããµããŒããããŠããŸãïŒ
ãã©ãŒã«ã¹ãšå¯èŠæ§ãæäœããæ¹æ³ïŒ
- focus-ãŠã£ã³ããŠã«ãã©ãŒã«ã¹ãç§»ãããã®ãã©ã¡ãŒã¿ãŒãªãã®ã¡ãœãã
- blur-ãŠã£ã³ããŠãéã¢ã¯ãã£ãã«ãããã©ã¡ãŒã¿ãªãã®æ¹æ³
- hide-ãŠã£ã³ããŠãé衚瀺ã«ããŸã
- show-ãŠã£ã³ããŠã衚瀺ããŸãããåŒæ°ãšããŠfalseãæž¡ããšãã¡ãœããã¯é衚瀺ãšããŠæ©èœããŸã
ãŠã£ã³ããŠãéãããæå°å/æ¡åŒµãå¶åŸ¡ããæ¹æ³ïŒ
- close-ãŠã£ã³ããŠãéããŸã;ãã®å Žåãcloseã€ãã³ããçºçããŸãããåŒæ°ãšããŠtrueãæž¡ããšãã€ãã³ãã¯çºçããŸãã
- reload-ãŠã£ã³ããŠããªããŒããã
- reloadDev-ãŠã£ã³ããŠããªããŒãããŸãããéçºè
èŠçŽ ã䜿çšããŸã
- æå€§å -ãŠã£ã³ããŠãå
šç»é¢è¡šç€ºã§éããŸã
- unmaximize-ãŠã£ã³ããŠãéããåŸããŠã£ã³ããŠãå
ã®ãµã€ãºã«æ»ããŸã
- æå°å -ãŠã£ã³ããŠãæå°å
- 埩å
-ãŠã£ã³ããŠãå±éããæå°åã®å察åŽ
- setShowInTaskbar-ã¿ã¹ã¯ããŒã«ãŠã£ã³ããŠã衚瀺ãããã©ãã
- setAlwaysOnTop-ãŠã£ã³ããŠãä»ã®ãŠã£ã³ããŠã®äžã«è¡šç€ºãããã©ãã
ç¶æ
ã管çããæ¹æ³ïŒ
- enterFullscreenãleaveFullscreenãtoggleFullscreen-ãã«ã¹ã¯ãªãŒã³ã¢ãŒãã³ã³ãããŒã«
- enterKioskModeãleaveKioskModeãtoggleKioskMode-ããªã¹ã¯ã¢ãŒããå¶åŸ¡ããŸã
- setTransparent-æž¡ãããåŒæ°ã«å¿ããŠããŠã£ã³ããŠã®éæåºŠãèšå®/ã¯ãªã¢ããŸã
- showDevTools-éçºè
ããŒã«ã衚瀺
- closeDevTools-éçºè
ããŒã«ãé衚瀺
- isDevToolsOpen-ãã§ãã¯ïŒéçºè
ããŒã«ã¯éããŠããŸãã
ãŠã£ã³ããŠã®ãµã€ãºã倿Žããæ©èœãå¶åŸ¡ããæ¹æ³
- setResizable-ç»é¢ã®ãµã€ãºã倿Žããæ©èœãèšå®/ãªã»ããããŸã
- setMaximumSize-æå€§ç»é¢ãµã€ãºã®å¶éãèšå®ããŸãïŒæåã®åŒæ°ã¯å¹
ã2çªç®ã¯é«ãã§ãïŒ
- setMinimumSize-æå°ç»é¢ãµã€ãºã«å¶éãèšå®ããŸãïŒæåã®åŒæ°ã¯å¹
ã2çªç®ã¯é«ãã§ãïŒ
ãããã£ãŠã
ãã¬ã€ããã³
ãŠã£ã³ããŠãªããžã§ã¯ãã«ç²ŸéããŠããã®ã§ã
ãã¬ã€ã«æå°åããæ©èœãèšè¿°ããŸãã ãããè¡ãã«ã¯ããã¿ã³ãŸãã¯ãªã³ã¯ãªã©ã®èŠçŽ ãããŒã¯ã¢ããã«è¿œå ããŸãïŒåè¿°ã®ãšããïŒã
<a ng-click="ctrl.toTray()"> </a>
ãããŠãã³ã³ãããŒã©ãŒã次ã®ããã«å€æŽããŸãã
ã³ã³ãããŒã©ãŒã³ãŒã (function () { 'use strict'; angular .module('main', []) .controller('MainCtrl', ['$scope', 'CryptoService', MainCtrl]); function MainCtrl($scope, CryptoService) { var self = this; var localStorageKey = "loginPasswordData" this.data = []; var gui = require('nw.gui'); var clipboard = gui.Clipboard.get(); var win = gui.Window.get(); var tray = new gui.Tray({ title: 'Tray', icon: 'img/test.png' }); tray.on("click", restoreFromTray); this.remove = remove; this.copy = copy; this.add = add; this.toTray = toTray; load(); $scope.$watch("ctrl.data", save, true); return this; function remove(ind){ self.data.splice(ind, 1); }; function copy(ind){ clipboard.set(self.data[ind].password); }; function add(){ self.data.push({login: "login", password: "password"}); }; function load(){ var text = localStorage.getItem(localStorageKey); if(text) { self.data = CryptoService.decrypt(text); } } function save(){ if(self.data) { localStorage.setItem(localStorageKey, CryptoService.encrypt(self.data)); } } function toTray(){ win.minimize(); win.setShowInTaskbar(false); } function restoreFromTray(){ win.restore(); win.setShowInTaskbar(true); } } })();
ãŸãããã®äŸãæ©èœããã«ã¯ã
imgãã©ã«ããŒãäœæããããã«ãã¬ã€ã¢ã€ã³ã³ïŒãã®äŸã§ã¯
img / test.png ïŒãé
眮ããå¿
èŠããããŸãã
ãããã«
èšäºã®äžéšãšããŠãã¹ã¿ã€ã«ããæ©èœã®æ¹åãŸã§ãããŸããŸãªæ¹æ³ã§æ¹åã§ãããããã¿ã€ãã¢ããªã±ãŒã·ã§ã³ãäœæããŸããã äŸïŒ
- æåã®10åã®ãã¹ã¯ãŒãã®keydownã€ãã³ãã«ãµãã¹ã¯ã©ã€ãã§ããŸãã0ãã9ã®ãã¿ã³ãã¯ãªãã¯ãããšããã¹ã¯ãŒããã¯ãªããããŒãã«ã³ããŒããŸããããã«ãããããã°ã©ã ã®äœæ¥ãç°¡çŽ åãããé«éåãããŸãã
- ãã¹ã¯ãŒãã ãã§ãªããã°ã€ã³ãã³ããŒããæ¹æ³ã远å ããŸã
ããã°ã©ãã³ã°ã§é 匵ã£ãŠãã ããïŒ