mirror of
https://github.com/ocogeclub/ocoge.git
synced 2024-11-22 07:39:49 +00:00
245 lines
7.5 KiB
JavaScript
245 lines
7.5 KiB
JavaScript
"use strict";
|
||
|
||
/** Node.js または Electron 固有の機能を利用した関数のモジュール ************* */
|
||
|
||
// ローカルプロパティ
|
||
// Hard Coding!!!
|
||
const appName = 'ocoge';
|
||
const defpath = '/home/pi/Documents/ocoge_docs/';
|
||
const mascotDefPath = '/home/pi/Applications/ocoge/img/';
|
||
// Require
|
||
const fs = require('fs');
|
||
const path = require("path");
|
||
const mainWin = require('electron').remote.getCurrentWindow();
|
||
const dialog = require('electron').remote.dialog;
|
||
const shell = require('electron').shell;
|
||
const clipboard = require('electron').clipboard;
|
||
|
||
|
||
var saveFilepath = null;
|
||
var wsChanged = false;
|
||
var mascotFilePath = mascotDefPath + 'cogechee.png';
|
||
|
||
// 0で数値の桁合わせ
|
||
// NUM=値 LEN=桁数
|
||
const zeroPadding = (NUM, LEN) => (Array(LEN).join('0') + NUM).slice(-LEN);
|
||
|
||
// 現在の日付時刻から workspace フォルダ内のユニークなファイルパスを作成
|
||
const getUniqueFilepath = () => {
|
||
let today = new Date();
|
||
let filename = today.getFullYear() + '-' + zeroPadding((today.getMonth() + 1), 2) + '-' + zeroPadding(today.getDate(), 2) + '-' + zeroPadding(today.getHours(), 2) + '-' + zeroPadding(today.getMinutes(), 2) + '-' + zeroPadding(today.getSeconds(), 2);
|
||
let filepath = path.join(defpath, filename);
|
||
return filepath;
|
||
}
|
||
|
||
// クリップボードにコピー
|
||
exports.copyText = text => clipboard.writeText(text);
|
||
|
||
// リンクを外部ブラウザで開く
|
||
exports.openURL = (url) => {
|
||
shell.openExternal(url);
|
||
}
|
||
|
||
// タイトルバーにファイル名を表示
|
||
// const setTitle = () => {
|
||
// if (saveFilepath) let title = appName;
|
||
// else let title = saveFilepath + ' - ' + appName;
|
||
// mainWin.setTitle(title);
|
||
// }
|
||
|
||
// saveFilepath を更新
|
||
// ウィンドウタイトルバーテキストを変更
|
||
const setSaveFilepath = filepath => {
|
||
let title;
|
||
saveFilepath = filepath;
|
||
// if (filepath) title = filepath + ' - ' + appName;
|
||
// else title = appName;
|
||
// mainWin.setTitle(title);
|
||
this.setWsChanged(false);
|
||
}
|
||
|
||
// ワークスペースが変更された・保存された
|
||
// ウィンドウタイトルバーテキストを変更
|
||
exports.setWsChanged = changed => {
|
||
let title;
|
||
wsChanged = changed;
|
||
if (saveFilepath) title = saveFilepath + ' - ' + appName;
|
||
else title = appName;
|
||
if (changed) title = '*' + title;
|
||
mainWin.setTitle(title);
|
||
}
|
||
|
||
// 保存ファイルプロパティを更新
|
||
exports.newFile = () => setSaveFilepath(null);
|
||
|
||
// ワークスペースファイル読み込みの一連の動作のラッパ
|
||
exports.loadWsFile = () => {
|
||
let filepath = openFile('xml', defpath);
|
||
if (filepath.length > 0) {
|
||
if (saveFilepath === null) {
|
||
setSaveFilepath(filepath);
|
||
} //読み込みに失敗してもsaveFilepathが更新されてしまうのはちょっと具合が悪いかも
|
||
return readFromFile(filepath);
|
||
} else {
|
||
return '';
|
||
}
|
||
}
|
||
// その他ファイル読み込みの一連の動作のラッパ
|
||
exports.loadFile = ext => {
|
||
let filepath = openFile(ext, defpath);
|
||
if (filepath.length > 0) {
|
||
return readFromFile(filepath);
|
||
} else {
|
||
return '';
|
||
}
|
||
}
|
||
exports.selectMascotFile = () => {
|
||
return openFile('png', mascotDefPath);
|
||
}
|
||
// オープンファイルダイアログ
|
||
const openFile = (ext, dpath) => {
|
||
let filter;
|
||
if (ext == 'xml') {
|
||
filter = { name: 'XML - Extensible Markup Language', extensions: ['xml'] };
|
||
} else if (ext == 'js') {
|
||
filter = { name: 'JS - JavaScript', extensions: ['js'] };
|
||
} else if (ext == 'png') {
|
||
filter = { name: 'PNG - Portable Network Graphics', extensions: ['png'] };
|
||
} else {
|
||
filter = { name: 'text file', extensions: ['txt'] };
|
||
}
|
||
let filepaths = dialog.showOpenDialogSync(mainWin, {
|
||
properties: ['openFile'],
|
||
title: 'Select a file',
|
||
defaultPath: dpath,
|
||
filters: [
|
||
filter
|
||
]
|
||
});
|
||
if (filepaths == undefined) {
|
||
return '';
|
||
} else {
|
||
return filepaths[0];
|
||
}
|
||
}
|
||
// ファイルからデータを読み込み
|
||
const readFromFile = filepath => {
|
||
let data = '';
|
||
try {
|
||
data = fs.readFileSync(filepath, 'utf-8');
|
||
}
|
||
catch (err) {
|
||
console.log(err);
|
||
}
|
||
return data;
|
||
}
|
||
// テキストファイル読み込み: 外部スクリプト動的読み込みに使用
|
||
exports.readTextFile = filepath => {
|
||
return readFromFile(filepath);
|
||
}
|
||
|
||
// ワークスペースファイル保存の一連の動作のラッパ
|
||
exports.saveWsFile = data => {
|
||
if (saveFilepath === null) {
|
||
let filepath = selectSaveFile('xml');
|
||
if (filepath === undefined) { //キャンセル
|
||
return undefined;
|
||
} else {
|
||
setSaveFilepath(filepath);
|
||
} //これも保存が成功したら変更するようにすべきかしら
|
||
} else this.setWsChanged(false);
|
||
return writeToFile(saveFilepath, data);
|
||
}
|
||
// その他ファイル保存の一連の動作のラッパ
|
||
exports.saveFile = (data, ext) => {
|
||
let filepath = selectSaveFile(ext);
|
||
if (filepath === undefined) { //キャンセル
|
||
return undefined;
|
||
}
|
||
return writeToFile(filepath, data);
|
||
}
|
||
// ファイル保存ダイアログ
|
||
const selectSaveFile = ext => {
|
||
let filter, filter_name;
|
||
let defName;
|
||
if (ext == 'xml') {
|
||
filter = { name: 'xml file', extensions: ['xml'] };
|
||
defName = getUniqueFilepath() + '.xml';
|
||
} else if (ext == 'js' || ext == 'py') {
|
||
if (ext == 'js') filter_name = 'javascript file';
|
||
else filter_name = 'python file'
|
||
filter = { name: filter_name, extensions: [ext] };
|
||
// ワークスペース保存名がある場合、それをベースにファイル名の候補を決める
|
||
if (saveFilepath === null) {
|
||
defName = getUniqueFilepath() + '.' + ext;
|
||
} else {
|
||
let dirname = path.dirname(saveFilepath);
|
||
let basename = path.basename(saveFilepath, '.xml');
|
||
defName = path.join(dirname, basename) + '.' + ext;
|
||
}
|
||
} else {
|
||
filter = { name: 'text file', extensions: ['txt'] };
|
||
}
|
||
let filename = dialog.showSaveDialogSync(mainWin, {
|
||
title: '保存先を決定してください',
|
||
defaultPath: defName,
|
||
filters: [filter]
|
||
});
|
||
return filename;
|
||
}
|
||
// ファイル書き込み
|
||
const writeToFile = (filepath, data) => {
|
||
try {
|
||
fs.writeFileSync(filepath, data);
|
||
return true;
|
||
}
|
||
catch (err) {
|
||
return false;
|
||
}
|
||
}
|
||
|
||
// 子プロセス関連
|
||
let children = [];
|
||
// 新しい子プロセスを作成し、配列に保存
|
||
exports.addChild = (child) => {
|
||
children.push(child);
|
||
}
|
||
// 全ての子プロセスを殺し、配列をクリア
|
||
exports.killAllChildren = () => {
|
||
children.forEach(function (child) {
|
||
child.kill();
|
||
});
|
||
children = [];
|
||
}
|
||
|
||
// 設定(保存ファイルパスと未保存フラグ)をローカルストレージに保存
|
||
exports.savePrefsToLS = () => {
|
||
let wc = '0';
|
||
if (wsChanged) wc = '1';
|
||
let o = { 'saveFilepath': saveFilepath, 'wsChanged': wc, 'mascotFilePath': mascotFilePath };
|
||
let s = JSON.stringify(o);
|
||
localStorage.setItem("ocoge.json", s);
|
||
}
|
||
|
||
// 設定(保存ファイルパスと未保存フラグ)をローカルストレージからロード
|
||
exports.loadPrefsFromLS = () => {
|
||
let s = localStorage.getItem("ocoge.json");
|
||
if (s !== null) {
|
||
let o = JSON.parse(s);
|
||
setSaveFilepath(o.saveFilepath);
|
||
if (o.wsChanged == '0') this.setWsChanged(false);
|
||
else this.setWsChanged(true);
|
||
if (o.mascotFilePath) this.setMascotFilePath(o.mascotFilePath);
|
||
}
|
||
}
|
||
|
||
// マスコット画像パスをプロパティにセット
|
||
exports.setMascotFilePath = fpath => mascotFilePath = fpath;
|
||
exports.getMascotFilePath = () => mascotFilePath;
|
||
|
||
|
||
// ファイル名にアプリケーションのドキュメントルートまでのパスをつけて返す
|
||
exports.getDocPath = filename => {
|
||
return path.join(appDocRoot, filename);
|
||
}
|