Skip to content

Commit 0793cbb

Browse files
committed
Version 0.2 released
1 parent 748599c commit 0793cbb

File tree

14 files changed

+209
-51
lines changed

14 files changed

+209
-51
lines changed

build.js

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,8 @@ packager({
88
dir: "./build/client",
99
out: "./build/app",
1010
icon: "./icon/icon.ico",
11-
//platform: "win32",
12-
//arch: "x64",
13-
platform: "all",
14-
arch: "all",
11+
platform: "win32,linux",
12+
arch: "x64",
1513
electronVersion: "1.3.4",
1614
overwrite: true,
1715
asar: true,

build_mac.js

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
const packager = require('electron-packager');
2+
const fs = require('fs');
3+
const fsext = require('fs-extra');
4+
const package = require('./package.json');
5+
6+
packager({
7+
name: package['name'],
8+
dir: "./build/client",
9+
out: "./build/app",
10+
icon: "./icon/icon.icns",
11+
platform: "darwin",
12+
arch: "all",
13+
electronVersion: "1.3.4",
14+
overwrite: true,
15+
asar: true,
16+
prune: true,
17+
ignore: "node_modules/electron-connect",
18+
"appVersion": package['version'],
19+
"version-string": {
20+
companyName: "colorful-pico.net",
21+
FileDescription: package['name'],
22+
OriginalFilename: package['name'] + ".exe",
23+
ProductName: package['name'],
24+
InternalName: package['name']
25+
}
26+
}, function (err, appPaths) {
27+
if (err) { console.log(err); return; }
28+
for (var i = 0; i < appPaths.length; ++i) {
29+
var path = appPaths[i];
30+
console.log("Build is done. (path=" + path + ")");
31+
fs.mkdirSync(path + '/config');
32+
fsext.copySync('./config/config.json', path + '/config/config.json');
33+
}
34+
});

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "Blender_Add-on_Manager",
3-
"version": "0.1.0",
3+
"version": "0.2.0",
44
"description": "Blender Add-on Manager",
55
"main": "main.js",
66
"scripts": {

src/client/html/index.html

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,19 @@
3232
<div class="blender-version selectbox-wrapper" ng-show="showBlVerSelect">
3333
<select class="selectbox" name="blVerSelect" ng-change="onAddonSelectorChanged()" ng-model="blVerSelect" ng-options="ver as ver for ver in blVerList">
3434
</select>
35+
<!-- <div class="custom-dir-panel" ng-if="targetIsCustomDir()">
36+
<input type="text" ng-model="customAddonDir" readonly>
37+
<div class="text-button-wrapper">
38+
<div class="text-button" ng-click="openCustomAddonDir()">
39+
Open
40+
</div>
41+
<div class="text-button" ng-click="addCustomAddonDir()">
42+
Add
43+
</div>
44+
</div>
45+
<select class="selectbox" ng-change="onAddonSelectorChanged()" ng-model="customAddonDirSelect", ng-options="var as ver for ver in customAddonDirList">
46+
</select>
47+
</div> -->
3548
</div>
3649
<div class="menu-item-title">
3750
Addon List

src/client/html/partials/addon-info/buttons.html

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
<div class="text-button-wrapper">
2+
<div class="link text-button" data-repo-index="{{i}}" ng-click="onLnBtnClicked($event); $event.stopPropagation();">
3+
Link
4+
</div>
5+
</div>
16
<div class="text-button-wrapper" ng-if="getAddonStatus(key) === 'NOT_INSTALLED'">
27
<div class="download text-button" data-repo-index="{{i}}" ng-click="!isOpsLocked && onDlBtnClicked($event); $event.stopPropagation();" ng-class="{locked: isOpsLocked}">
38
Install

src/client/js/app.js

Lines changed: 88 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@
22

33
import fs from 'fs';
44
import fsext from 'fs-extra';
5-
import path from 'path';
65
import del from 'del';
6+
import electron from 'electron';
7+
import * as Utils from 'utils';
78

9+
let cwd = Utils.getCwd();
810

911
import BlAddonDB from 'bl_add-on_db';
1012
const builder = new BlAddonDB();
@@ -15,17 +17,15 @@ const taskMgr = new TaskMgr();
1517
import Logger from 'logger';
1618
const logger = new Logger();
1719
import * as BlAddon from 'bl-addon';
18-
import * as Utils from 'utils';
1920

2021

21-
var DB_DIR = path.resolve('./db');
22-
var API_VERSION_FILE = path.resolve('./db/version');
23-
var GITHUB_ADDONS_DB = path.resolve('./db/add-on_list.db');
24-
var INSTALLED_ADDONS_DB = path.resolve('./db/installed_add-on_list.db');
25-
var CONFIG_FILE_PATH = path.resolve('./config/config.json');
22+
var DB_DIR = cwd + '/db';
23+
var API_VERSION_FILE = cwd + '/db/version';
24+
var GITHUB_ADDONS_DB = cwd + '/db/add-on_list.db';
25+
var INSTALLED_ADDONS_DB = cwd + '/db/installed_add-on_list.db';
26+
var CONFIG_FILE_PATH = cwd + '/config/config.json';
2627
var BL_INFO_UNDEF = "626c5f696e666f5f@UNDEF";
2728

28-
2929
var config = null;
3030
var app = angular.module('blAddonMgr', [])
3131

@@ -120,6 +120,7 @@ app.controller('MainController', function ($scope, $timeout) {
120120
}
121121

122122
$scope.blVerList = checker.getInstalledBlVers();
123+
//$scope.blVerList.push('Custom');
123124
$scope.addonCategories = [
124125
{id: 1, name: 'All', value: 'All'},
125126
{id: 2, name: '3D View', value: '3D View'},
@@ -146,6 +147,7 @@ app.controller('MainController', function ($scope, $timeout) {
146147
{id: 2, name: 'GitHub', value: 'github'},
147148
{id: 3, name: 'Update', value: 'update'}
148149
];
150+
$scope.customAddonDirList = [];
149151

150152
$scope.githubAddons = loadGitHubAddonDB();
151153
$scope.installedAddons = loadInstalledAddonsDB();
@@ -256,6 +258,37 @@ app.controller('MainController', function ($scope, $timeout) {
256258
return $scope.addonStatus[key]['status'][$scope.blVerSelect];
257259
};
258260

261+
$scope.targetIsCustomDir = () => {
262+
return $scope.blVerSelect === 'Custom';
263+
};
264+
265+
$scope.customAddonDir = "";
266+
267+
$scope.openCustomAddonDir = () => {
268+
const remote = electron.remote;
269+
const dialog = remote.dialog;
270+
dialog.showOpenDialog(null, {
271+
properties: ['openDirectory'],
272+
title: 'Select Custom Add-on Folder',
273+
defaultPath: '.'
274+
}, (folderName) => {
275+
$scope.customAddonDir = folderName;
276+
redrawApp();
277+
});
278+
};
279+
280+
$scope.addCustomAddonDir = () => {
281+
let total = $scope.customAddonDirList.length;
282+
let dir = $scope.customAddonDir;
283+
if (!Utils.isDirectory(dir)) { return; }
284+
console.log(dir);
285+
$scope.customAddonDirList.push({
286+
id: total,
287+
dir: dir
288+
});
289+
consle.log($scope.customAddonDirList);
290+
};
291+
259292
function onAddonSelectorChanged() {
260293
// collect filter condition
261294
var activeList = $scope.addonLists[$scope.addonListActive]['value'];
@@ -320,7 +353,8 @@ app.controller('MainController', function ($scope, $timeout) {
320353
}
321354
main.repoList = addons;
322355

323-
async function installAddon(repo, cb) {
356+
357+
async function installAddon(key, repo, cb) {
324358
try {
325359
logger.category('app').info("Downloding add-on '" + repo['bl_info']['name'] + "' from " + repo['download_url']);
326360
let target = checker.getAddonPath($scope.blVerSelect);
@@ -338,34 +372,53 @@ app.controller('MainController', function ($scope, $timeout) {
338372
const extract = await Utils.extractZipFile(downloadTo, target, true);
339373

340374
let extractedPath = target + checker.getPathSeparator() + repo['repo_name'] + '-master';
341-
let srcPath = repo['src_dir'] + "/" + repo['src_main'];
342-
let sp = srcPath.split("/");
343-
let copiedFile = "";
344-
let targetName = sp[sp.length - 1];
375+
let srcPath = extractedPath + repo['src_dir'] + '/' + repo['src_main'];
376+
let sp = srcPath.split(/[\/\\]/);
377+
let copingFiles = [];
378+
let isPackage = false;
379+
// Package
380+
if (sp[sp.length - 1] == "__init__.py") {
381+
isPackage = true;
382+
}
383+
// Module
384+
else {
385+
isPackage = false;
386+
}
345387
advanceProgressAndUpdate();
346388
advanceProgressAndUpdate();
389+
let basePath = "";
347390
for (let i = 0; i < sp.length - 1; ++i) {
348-
copiedFile += sp[i] + checker.getPathSeparator();
391+
basePath += sp[i] + checker.getPathSeparator();
349392
}
350-
// File
351-
if (targetName != "__init__.py") {
352-
copiedFile += targetName;
393+
if (isPackage) {
394+
let list = fs.readdirSync(basePath);
395+
for (let i = 0; i < list.length; ++i) {
396+
copingFiles.push({ 'path': basePath + list[i], 'filename': list[i]} );
397+
}
353398
}
354-
// Directory
355399
else {
356-
targetName = sp[sp.length - 2];
400+
let modPath = basePath + checker.getPathSeparator() + sp[sp.length - 1];
401+
copingFiles.push({'path': modPath, 'filename': sp[sp.length - 1]});
357402
}
358-
let source = extractedPath + copiedFile;
359403
// copy add-on to add-on directory
360-
fsext.copySync(source, target + checker.getPathSeparator() + targetName);
404+
let targetDir = target;
405+
if (isPackage) {
406+
targetDir = target + checker.getPathSeparator() + key;
407+
fs.mkdirSync(targetDir);
408+
}
409+
for (let i = 0; i < copingFiles.length; ++i) {
410+
let source = copingFiles[i]['path'];
411+
let target = targetDir + checker.getPathSeparator() + copingFiles[i]['filename'];
412+
fsext.copySync(source, target);
413+
}
361414
advanceProgressAndUpdate();
362415
// delete garbage data
363416
del.sync([extractedPath], {force: true});
364417

365418
cb();
366419
}
367420
catch (e) {
368-
logger.category('app').err(e);
421+
logger.category('app').error(e);
369422
}
370423
}
371424

@@ -378,12 +431,20 @@ app.controller('MainController', function ($scope, $timeout) {
378431
logger.category('app').info("Deleted '" + deleteFrom + "'");
379432
}
380433

434+
function onLnBtnClicked($event) {
435+
let repoIndex = $($event.target).data('repo-index');
436+
let repo = $scope.addonStatus[main.repoList[repoIndex]]['github'];
437+
let url = repo['url'];
438+
electron.shell.openExternal(url);
439+
}
440+
381441
function onDlBtnClicked($event) {
382442
setTaskAndUpdate('INSTALL');
383443
let repoIndex = $($event.target).data('repo-index');
384444
let repo = $scope.addonStatus[main.repoList[repoIndex]]['github'];
445+
let key = main.repoList[repoIndex];
385446
$scope.isOpsLocked = true;
386-
installAddon(repo, () => {
447+
installAddon(key, repo, () => {
387448
try {
388449
advanceProgressAndUpdate();
389450
updateInstalledAddonDB();
@@ -419,14 +480,15 @@ app.controller('MainController', function ($scope, $timeout) {
419480
let repoIndex = $($event.target).data('repo-index');
420481
let repoInstalled = $scope.addonStatus[main.repoList[repoIndex]]['installed'][blVer];
421482
let repoGitHub = $scope.addonStatus[main.repoList[repoIndex]]['github'];
483+
let key = main.repoList[repoIndex];
422484
$scope.isOpsLocked = true;
423485
try {
424486
removeAddon(repoInstalled);
425487
}
426488
catch (e) {
427489
logger.category('app').err(e);
428490
}
429-
installAddon(repoGitHub, () => {
491+
installAddon(key, repoGitHub, () => {
430492
try {
431493
advanceProgressAndUpdate();
432494
updateInstalledAddonDB();
@@ -440,6 +502,8 @@ app.controller('MainController', function ($scope, $timeout) {
440502
});
441503
}
442504

505+
// "Link" button
506+
$scope.onLnBtnClicked = onLnBtnClicked;
443507
// "Download" button
444508
$scope.onDlBtnClicked = onDlBtnClicked;
445509
// "Remove" button

src/client/sass/components/_button.scss

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,30 @@
1818
background-color: $button-hover-bgcolor;
1919
}
2020
}
21+
.remove {
22+
color: $body-color + #442020;
23+
background-color: $button-bgcolor + #440000;
24+
&:hover {
25+
color: $body-color + #300000;
26+
background-color: $button-hover-bgcolor + #300000;
27+
}
28+
}
29+
.update {
30+
color: $body-color + #202044;
31+
background-color: $button-bgcolor + #000044;
32+
&:hover {
33+
color: $body-color + #000030;
34+
background-color: $button-hover-bgcolor + #000030;
35+
}
36+
}
37+
.download {
38+
color: $body-color + #103310;
39+
background-color: $button-hover-bgcolor + #002500;
40+
&:hover {
41+
color: $body-color + #101810;
42+
background-color: $button-hover-bgcolor + #001500;
43+
}
44+
}
2145
.locked {
2246
color: $body-color - #202020;
2347
background-color: $button-bgcolor - #202020;
@@ -27,12 +51,4 @@
2751
background-color: $button-bgcolor - #202020;
2852
}
2953
}
30-
.remove {
31-
color: $body-color + #442020;
32-
background-color: $button-bgcolor + #440000;
33-
}
34-
.update {
35-
color: $body-color + #202044;
36-
background-color: $button-bgcolor + #000044;
37-
}
3854
}

src/client/sass/lib/_variables.scss

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ $selector-hover-color: #E0E0E0;
1515
$selector-hover-bgcolor: #393939;
1616

1717
$button-bgcolor: #404040;
18-
$button-hover-bgcolor: #606060;
18+
$button-hover-bgcolor: $button-bgcolor - #101010;
1919

2020
$selectbox-bgcolor: $button-bgcolor;
2121
$selectbox-hover-bgcolor: $button-hover-bgcolor;

src/lib/js/bl-addon.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ export function filterAddons(addons, source, status, blVer, category, regex) {
107107
let categoryMatched = (category.indexOf('All') != -1) || (category.indexOf(elm['bl_info']['category']) != -1);
108108

109109
// filtered by search string
110-
let regexp = new RegExp(regex);
110+
let regexp = new RegExp(regex, "i");
111111
let nameMatched = (elm['bl_info']['name'] != undefined && elm['bl_info']['name'].match(regexp) != null);
112112
let authorMatched = (elm['bl_info']['author'] != undefined && elm['bl_info']['author'].match(regexp) != null);
113113
let descMatched = (elm['bl_info']['description'] != undefined && elm['bl_info']['description'].match(regexp) != null);

src/lib/js/logger.js

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,15 @@ import path from 'path';
44
import log4js from 'log4js';
55
import log4jsExt from 'log4js-extend';
66

7+
import * as Utils from 'utils';
8+
9+
const MAX_LOG_SIZE = 3 * 1024 * 1024; // 3MiB
10+
const MAX_BACKUPS = 3;
711

812
export default class Logger
913
{
1014
constructor () {
15+
let cwd = Utils.getCwd();
1116
let config = {
1217
"log4js": {
1318
"level": "ALL",
@@ -16,14 +21,18 @@ export default class Logger
1621
{
1722
"category": "lib",
1823
"type": "file",
19-
"filename": "logs/lib.log"
24+
"backups": MAX_BACKUPS,
25+
"maxLogSize": MAX_LOG_SIZE,
26+
"filename": cwd + "/logs/lib.log"
2027
},
2128
{
2229
"category": "app",
2330
"type": "file",
24-
"filename": "logs/app.log"
31+
"backups": MAX_BACKUPS,
32+
"maxLogSize": MAX_LOG_SIZE,
33+
"filename": cwd + "/logs/app.log"
2534
}
26-
]
35+
]
2736
}
2837
}
2938
};

0 commit comments

Comments
 (0)