├── app
├── clock.css
├── clock.js
├── icon.png
├── index.html
├── main.js
└── package.json
├── app_option
├── clock.css
├── clock.js
├── icon.png
├── img
│ ├── clock_bg.png
│ ├── clock_hh.png
│ ├── clock_mm.png
│ └── clock_ss.png
├── index.html
├── main.js
└── package.json
├── icon.ico
├── readme.md
├── screenshot_app.png
└── screenshot_app_option.png
/app/clock.css:
--------------------------------------------------------------------------------
1 | @import url(http://fonts.googleapis.com/css?family=Iceland);
2 |
3 | body {
4 | overflow: hidden;
5 | margin: 0;
6 | padding: 0;
7 | border: 5px solid rgb(42, 42, 42);
8 | background-color: rgba(24, 24, 24, .7);
9 | box-shadow: 0 0 8px 3px #000 inset;
10 |
11 | -webkit-app-region: drag;
12 | -webkit-user-select: none;
13 | }
14 |
15 | #digital_clock {
16 | font-family: "Iceland";
17 | font-size: 25px;
18 | line-height: 22px;
19 | margin-top: 9px;
20 | text-align: center;
21 | color: #fff;
22 | text-shadow: 1px 1px 3px #000;
23 | }
24 |
--------------------------------------------------------------------------------
/app/clock.js:
--------------------------------------------------------------------------------
1 | // ウィンドウを開く
2 | openWindow();
3 |
4 | // 時計の描画処理をスタート
5 | clock();
6 |
7 | function openWindow () {
8 | // ウィンドウのオブジェクトを取得
9 | var win = require("remote").getCurrentWindow();
10 |
11 | // ウィンドウ位置を復元
12 | if (localStorage.getItem("windowPosition")) {
13 | var pos = JSON.parse(localStorage.getItem("windowPosition"));
14 | win.setPosition(pos[0], pos[1]);
15 | }
16 |
17 | // クローズ時にウィンドウ位置を保存
18 | win.on("close", function() {
19 | localStorage.setItem("windowPosition", JSON.stringify(win.getPosition()));
20 | });
21 |
22 | // ウィンドウを表示
23 | win.show();
24 | }
25 |
26 | function clock () {
27 | // 現在日時を取得
28 | var d = new Date();
29 |
30 | // デジタル時計を更新
31 | updateDigitalClock(d);
32 |
33 | // 次の「0ミリ秒」に実行されるよう、次の描画処理を予約
34 | var delay = 1000 - new Date().getMilliseconds();
35 | setTimeout(clock, delay);
36 | }
37 |
38 | function updateDigitalClock (d) {
39 | var AA_str = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
40 | var YY = d.getFullYear().toString().slice(-2);
41 | var MM = d.getMonth() + 1;
42 | var DD = d.getDate();
43 | var AA = d.getDay();
44 | var hh = d.getHours();
45 | var mm = d.getMinutes();
46 | var ss = d.getSeconds();
47 |
48 | // 桁あわせ
49 | if(MM < 10) { MM = "0" + MM; }
50 | if(DD < 10) { DD = "0" + DD; }
51 | if(hh < 10) { hh = "0" + hh; }
52 | if(mm < 10) { mm = "0" + mm; }
53 | if(ss < 10) { ss = "0" + ss; }
54 |
55 | var text = YY + '/' + MM + '/' + DD + ' (' + AA_str[AA] + ')
' + hh + ':' + mm + ':' + ss
56 | document.getElementById("digital_clock").innerHTML = text;
57 | }
58 |
--------------------------------------------------------------------------------
/app/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SallyAcolyte/tutorial_clock/79a011119e963b7c3c2bb0cab9c0796d7640ca14/app/icon.png
--------------------------------------------------------------------------------
/app/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
clock
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/app/main.js:
--------------------------------------------------------------------------------
1 | var app = require("app");
2 | var BrowserWindow = require("browser-window");
3 |
4 | var mainWindow = null;
5 |
6 | app.on("window-all-closed", function() {
7 | if (process.platform != "darwin") {
8 | app.quit();
9 | }
10 | });
11 |
12 | app.on("ready", function() {
13 | mainWindow = new BrowserWindow({
14 | // ウィンドウ作成時のオプション
15 | "width": 180,
16 | "height": 70,
17 | "transparent": true, // ウィンドウの背景を透過
18 | "frame": false, // 枠の無いウィンドウ
19 | "resizable": false, // ウィンドウのリサイズを禁止
20 | "skip-taskbar": true, // タスクバーに表示しない
21 | "show": false // アプリ起動時にウィンドウを表示しない
22 | });
23 |
24 | // index.html を開く
25 | mainWindow.loadUrl("file://" + __dirname + "/index.html");
26 |
27 | mainWindow.on("closed", function() {
28 | mainWindow = null;
29 | });
30 |
31 | // タスクトレイに格納
32 | var Menu = require("menu");
33 | var Tray = require("tray");
34 | var nativeImage = require("native-image");
35 |
36 | var trayIcon = new Tray(nativeImage.createFromPath(__dirname + "/icon.png"));
37 |
38 | // タスクトレイに右クリックメニューを追加
39 | var contextMenu = Menu.buildFromTemplate([
40 | { label: "表示", click: function () { mainWindow.focus(); } },
41 | { label: "終了", click: function () { mainWindow.close(); } }
42 | ]);
43 | trayIcon.setContextMenu(contextMenu);
44 |
45 | // タスクトレイのツールチップをアプリ名に
46 | trayIcon.setToolTip(app.getName());
47 |
48 | // タスクトレイが左クリックされた場合、アプリのウィンドウをアクティブに
49 | trayIcon.on("clicked", function () {
50 | mainWindow.focus();
51 | });
52 | // タスクトレイに格納 ここまで
53 | });
54 |
--------------------------------------------------------------------------------
/app/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name" : "tutorial_clock_digital",
3 | "version" : "0.0.1",
4 | "main" : "main.js"
5 | }
6 |
--------------------------------------------------------------------------------
/app_option/clock.css:
--------------------------------------------------------------------------------
1 | @import url(http://fonts.googleapis.com/css?family=Iceland);
2 |
3 | body {
4 | overflow: hidden;
5 | width: 250px;
6 | height: 70px;
7 | margin: 0;
8 | padding: 0;
9 |
10 | -webkit-app-region: drag;
11 | -webkit-user-select: none;
12 | }
13 |
14 | .content {
15 | height: calc(100% - 10px);
16 | border: 5px solid rgb(42, 42, 42);
17 | border-left-width: 70px;
18 | background-color: rgba(24, 24, 24, .7);
19 | box-shadow: 0 0 8px 3px #000 inset;
20 | }
21 |
22 | .analog {
23 | position: absolute;
24 | left: 5;
25 | float: left;
26 | width: 60px;
27 | }
28 |
29 | .analog .pin {
30 | position: absolute;
31 | }
32 |
33 | .digital .text {
34 | font-family: "Iceland";
35 | font-size: 25px;
36 | line-height: 22px;
37 | margin-top: 9px;
38 | text-align: center;
39 | color: #fff;
40 | text-shadow: 1px 1px 3px #000;
41 | }
42 |
--------------------------------------------------------------------------------
/app_option/clock.js:
--------------------------------------------------------------------------------
1 | // ウィンドウを開く
2 | openWindow();
3 |
4 | // 時計の描画処理をスタート
5 | clock();
6 |
7 | function openWindow () {
8 | // ウィンドウのオブジェクトを取得
9 | var win = require("remote").getCurrentWindow();
10 |
11 | // ウィンドウ位置を復元
12 | if (localStorage.getItem("windowPosition")) {
13 | var pos = JSON.parse(localStorage.getItem("windowPosition"));
14 | win.setPosition(pos[0], pos[1]);
15 | }
16 |
17 | // クローズ時にウィンドウ位置を保存
18 | win.on("close", function() {
19 | localStorage.setItem("windowPosition", JSON.stringify(win.getPosition()));
20 | });
21 |
22 | // ウィンドウを表示
23 | win.show();
24 | }
25 |
26 | function clock () {
27 | // 現在日時を取得
28 | var d = new Date();
29 |
30 | // アナログ時計を更新
31 | updateAnalogClock(d);
32 |
33 | // デジタル時計を更新
34 | updateDigitalClock(d);
35 |
36 | // 次の「0ミリ秒」に実行されるよう、次の描画処理を予約
37 | var delay = 1000 - new Date().getMilliseconds();
38 | setTimeout(clock, delay);
39 | }
40 |
41 | function updateAnalogClock (d) {
42 | // 秒針
43 | var ss_deg = d.getSeconds() * 6;
44 | document.getElementById("pin_ss").style.transform = "rotate(" + ss_deg + "deg)";
45 |
46 | // 分針
47 | var mm_deg = d.getMinutes() * 6 + d.getSeconds() / 10;
48 | document.getElementById("pin_mm").style.transform = "rotate(" + mm_deg + "deg)";
49 |
50 | // 時針
51 | var hh_deg = d.getHours() * 30 + d.getMinutes() / 2;
52 | document.getElementById("pin_hh").style.transform = "rotate(" + hh_deg + "deg)";
53 | }
54 |
55 | function updateDigitalClock (d) {
56 | var AA_str = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
57 | var YY = d.getFullYear().toString().slice(-2);
58 | var MM = d.getMonth() + 1;
59 | var DD = d.getDate();
60 | var AA = d.getDay();
61 | var hh = d.getHours();
62 | var mm = d.getMinutes();
63 | var ss = d.getSeconds();
64 |
65 | // 桁あわせ
66 | if(MM < 10) { MM = "0" + MM; }
67 | if(DD < 10) { DD = "0" + DD; }
68 | if(hh < 10) { hh = "0" + hh; }
69 | if(mm < 10) { mm = "0" + mm; }
70 | if(ss < 10) { ss = "0" + ss; }
71 |
72 | var text = YY + '/' + MM + '/' + DD + ' (' + AA_str[AA] + ')
' + hh + ':' + mm + ':' + ss
73 | document.getElementById("digital_text").innerHTML = text;
74 | }
75 |
--------------------------------------------------------------------------------
/app_option/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SallyAcolyte/tutorial_clock/79a011119e963b7c3c2bb0cab9c0796d7640ca14/app_option/icon.png
--------------------------------------------------------------------------------
/app_option/img/clock_bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SallyAcolyte/tutorial_clock/79a011119e963b7c3c2bb0cab9c0796d7640ca14/app_option/img/clock_bg.png
--------------------------------------------------------------------------------
/app_option/img/clock_hh.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SallyAcolyte/tutorial_clock/79a011119e963b7c3c2bb0cab9c0796d7640ca14/app_option/img/clock_hh.png
--------------------------------------------------------------------------------
/app_option/img/clock_mm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SallyAcolyte/tutorial_clock/79a011119e963b7c3c2bb0cab9c0796d7640ca14/app_option/img/clock_mm.png
--------------------------------------------------------------------------------
/app_option/img/clock_ss.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SallyAcolyte/tutorial_clock/79a011119e963b7c3c2bb0cab9c0796d7640ca14/app_option/img/clock_ss.png
--------------------------------------------------------------------------------
/app_option/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | clock
4 |
5 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/app_option/main.js:
--------------------------------------------------------------------------------
1 | var app = require("app");
2 | var BrowserWindow = require("browser-window");
3 |
4 | var mainWindow = null;
5 |
6 | app.on("window-all-closed", function() {
7 | if (process.platform != "darwin") {
8 | app.quit();
9 | }
10 | });
11 |
12 | app.on("ready", function() {
13 | mainWindow = new BrowserWindow({
14 | // ウィンドウ作成時のオプション
15 | "width": 250,
16 | "height": 70,
17 | "transparent": true, // ウィンドウの背景を透過
18 | "frame": false, // 枠の無いウィンドウ
19 | "resizable": false, // ウィンドウのリサイズを禁止
20 | "skip-taskbar": true, // タスクバーに表示しない
21 | "show": false // アプリ起動時にウィンドウを表示しない
22 | });
23 |
24 | // index.html を開く
25 | mainWindow.loadUrl("file://" + __dirname + "/index.html");
26 |
27 | mainWindow.on("closed", function() {
28 | mainWindow = null;
29 | });
30 |
31 | // タスクトレイに格納
32 | var Menu = require("menu");
33 | var Tray = require("tray");
34 | var nativeImage = require("native-image");
35 |
36 | var trayIcon = new Tray(nativeImage.createFromPath(__dirname + "/icon.png"));
37 |
38 | // タスクトレイに右クリックメニューを追加
39 | var contextMenu = Menu.buildFromTemplate([
40 | { label: "表示", click: function () { mainWindow.focus(); } },
41 | { label: "終了", click: function () { mainWindow.close(); } }
42 | ]);
43 | trayIcon.setContextMenu(contextMenu);
44 |
45 | // タスクトレイのツールチップをアプリ名に
46 | trayIcon.setToolTip(app.getName());
47 |
48 | // タスクトレイが左クリックされた場合、アプリのウィンドウをアクティブに
49 | trayIcon.on("clicked", function () {
50 | mainWindow.focus();
51 | });
52 | // タスクトレイに格納 ここまで
53 | });
54 |
--------------------------------------------------------------------------------
/app_option/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name" : "tutorial_clock",
3 | "version" : "0.0.1",
4 | "main" : "main.js"
5 | }
6 |
--------------------------------------------------------------------------------
/icon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SallyAcolyte/tutorial_clock/79a011119e963b7c3c2bb0cab9c0796d7640ca14/icon.ico
--------------------------------------------------------------------------------
/readme.md:
--------------------------------------------------------------------------------
1 | # tutorial_clock
2 | Electronによる、シンプルな時計ウィジェット
3 |
4 | ## app
5 | 
6 | [Electronでデスクトップウィジェットを作るまで - Qiita](http://qiita.com/SallyAcolyte/items/94ed26ab62b8b32b1b2c)用のサンプルプログラム
7 |
8 | ダウンロード: [tutorial_clock_app.zip](https://github.com/SallyAcolyte/tutorial_clock/releases/download/0.0.1/tutorial_clock_app.zip)
9 |
10 | ## app_option
11 | 
12 | appにアナログ時計を追加したもの
13 |
14 | ダウンロード: [tutorial_clock_app_option.zip](https://github.com/SallyAcolyte/tutorial_clock/releases/download/0.0.1/tutorial_clock_app_option.zip)
15 |
--------------------------------------------------------------------------------
/screenshot_app.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SallyAcolyte/tutorial_clock/79a011119e963b7c3c2bb0cab9c0796d7640ca14/screenshot_app.png
--------------------------------------------------------------------------------
/screenshot_app_option.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SallyAcolyte/tutorial_clock/79a011119e963b7c3c2bb0cab9c0796d7640ca14/screenshot_app_option.png
--------------------------------------------------------------------------------