Merge branch 'dev'

Close #143
This commit is contained in:
Yuya Ochiai
2016-06-24 00:15:57 +09:00
58 changed files with 1798 additions and 571 deletions

View File

@@ -5,14 +5,41 @@
### Changes
- Changed the license, from MIT License to Apache License, Version 2.0.
### Improvements
- Added **Add** button next to the "Teams" label on the Setting page.
- Added **Edit** button on the team list on the Setting page.
### Fixes
#### Windows
- Added the tooltip for the tray icon in order to show count of unread channels/mantions.
- Fixed the pixelated app icon on the top left of the window.
- Fixed the blurred tray icon.
#### OS X
- Fixed that two icons appear on a notification.
### Improvements
- Added shortcuts
- Zoom
- Ctrl+0 (View -> Actual Size): Reset the zoom level.
- Ctrl+Plus (View -> Zoom In)
- Ctrl+Minus (View -> Zoom Out)
- Control window
- Ctrl+W (Window -> Close): On Windows and Linux, this works as minimize for the main window.
- Ctrl+M (Window -> Minimize)
- Switch teams (these shotcuts also reopen the main window)
- Ctrl+{1-9} (Window -> *Team name*): Open the *n*-th tab.
- Ctrl+Tab or Alt+Command+Right (Window -> Select Next Team): Open the right tab.
- Ctrl+Shift+Tab or Alt+Command+Left (Window -> Select Previous Team): Open the left tab.
- Added **Add** button next to the "Teams" label on the Setting page.
- Added **Edit** button on the team list on the Setting page.
- Added **Help** menu to indicate the application version.
- Added auto-reloading when the tab failed to load the team.
#### Windows
- Added the tooltip text for the tray icon in order to show count of unread channels/mantions.
- Added the option to launch the application on login.
- Added the option to blink the taskbar icon when a new message has arrived.
- Added installers (experimental)
#### OS X
- Added colored badges to the menu icon when there are unread channels/mentions.
#### Linux
- Added the option to show the icon on menu bar. (requires libappindicator1 on Ubuntu)
@@ -30,6 +57,10 @@
#### Windows and OS X
- Added a right-click menu option for tray icon to open the Desktop application on Windows and OS X.
### Known issues
- The shortcuts can't switch teams twice in a raw.
- The team pages are not correctly rendered until the window is resized when the zoom level is changed.
## Release v1.2.0 (Beta)

View File

@@ -5,7 +5,7 @@ machine:
- sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 20
- sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 20
node:
version: 5.10.0
version: 6.1.0
services:
- docker
@@ -13,11 +13,10 @@ dependencies:
cache_directories:
- "~/.electron"
- "src/node_modules"
- "~/docker_cache"
post:
- ./docker/circle_docker_build.sh
- mkdir -p ~/.electron
- docker run --rm -it -v `pwd`:/home/xclient/electron-mattermost -v ~/.electron:/home/xclient/.electron yuya-oc/em-builder ./electron-mattermost/docker/package_in_docker.sh
- docker run --rm -it -v `pwd`:/project -v ~/.electron:/root/.electron electronuserland/electron-builder:wine ./docker/package_in_docker.sh
- sudo chown -R ubuntu:ubuntu release
- mv release/Mattermost-win32-ia32 release/mattermost-desktop-win32
- mv release/Mattermost-win32-x64 release/mattermost-desktop-win64
- mv release/Mattermost-darwin-x64 release/mattermost-desktop-osx
@@ -29,11 +28,10 @@ dependencies:
- tar zcvf $CIRCLE_ARTIFACTS/mattermost-desktop-linux-ia32.tar.gz -C release mattermost-desktop-linux-ia32
- tar zcvf $CIRCLE_ARTIFACTS/mattermost-desktop-linux-x64.tar.gz -C release mattermost-desktop-linux-x64
- cp release/*.deb $CIRCLE_ARTIFACTS/
- cp release/windows-installer-ia32/mattermost-setup-ia32.exe $CIRCLE_ARTIFACTS/
- cp release/windows-installer-x64/mattermost-setup-x64.exe $CIRCLE_ARTIFACTS/
test:
override:
- node_modules/.bin/mocha --reporter mocha-circleci-reporter
- node_modules/.bin/gulp prettify:verify
post:
- mv test-results.xml $CIRCLE_TEST_REPORTS/

View File

@@ -54,3 +54,5 @@ deploy linux-ia32 tar.gz
deploy linux-x64 tar.gz
upload mattermost-desktop-$RELEASE_TAG-linux-ia32.deb release/mattermost-desktop-$RELEASE_TAG-ia32.deb
upload mattermost-desktop-$RELEASE_TAG-linux-x64.deb release/mattermost-desktop-$RELEASE_TAG.deb
upload mattermost-setup-$RELEASE_TAG-win32.exe release/windows-installer-ia32/mattermost-setup-ia32.exe
upload mattermost-setup-$RELEASE_TAG-win64.exe release/windows-installer-x64/mattermost-setup-x64.exe

View File

@@ -1,15 +0,0 @@
FROM suchja/wine:latest
MAINTAINER Yuya Ochiai <yuya0321@gmail.com>
ENV NODE_VERSION=v5.10.0
ENV PATH=$HOME/.nodebrew/current/bin:$PATH
USER root
RUN apt-get update && apt-get -y install wget bzip2 zip
# electron-builder
RUN apt-get update && apt-get -y install ruby ruby-dev gcc make icnsutils graphicsmagick xz-utils && gem install fpm
USER xclient
# install Node.js
RUN curl -L git.io/nodebrew | perl - setup && nodebrew install-binary $NODE_VERSION && nodebrew use $NODE_VERSION

View File

@@ -1,13 +0,0 @@
#!/bin/sh
# execute from source root
set -ex
CACHE_DIR=~/docker_cache
if [ -e ${CACHE_DIR}/em-builder.tar ] && md5sum -c ${CACHE_DIR}/dockerfile.md5sum
then
docker load < ${CACHE_DIR}/em-builder.tar
else
mkdir -p ${CACHE_DIR}
docker build -t yuya-oc/em-builder docker
md5sum docker/Dockerfile > ${CACHE_DIR}/dockerfile.md5sum
docker save yuya-oc/em-builder > ${CACHE_DIR}/em-builder.tar
fi

View File

@@ -1,6 +1,6 @@
#!/bin/sh
# This script should be executed in docker container.
set -ex
cd electron-mattermost
npm run package:all
npm run package:linux
npm run installer

View File

@@ -148,6 +148,17 @@ Below lists menu options (shortcut keys are listed in brackets, `Ctrl` becomes `
- **Clear Cache and Reload** (Ctrl+Shift+R) - Clear cached content in application and reload page
- **Toggle Full Screen** (F11) - Toggle application from window to full screen and back
- **Toggle Developer Tools** (Ctrl+Shift+I) - Turn on and off sidebar showing developer tools
- **Actual Size** (Ctrl+0) - Reset zoom level
- **Zoom In** (Ctrl+Plus) - Enlarge the rendered contents size
- **Zoom In** (Ctrl+Minus) - Shrink the rendered contents size
- **Window**
- **Close** (Ctrl+W) - Close the window (On Window and Linux, the main window is minimized)
- **Minimize** (Ctrl+M) - Minimize the window
- ***Team Name*** (Ctrl+{1-9}) - Open the *n*-th tab
- **Select Next Team** (Ctrl+Tab, Alt+Command+Right) - Open the right tab
- **Select Previous Team** (Ctrl+Shift+Tab, Alt+Command+Left) - Open the left tab
- **Help**
- ***Version*** Indicate the application version
## Notifications

View File

@@ -14,8 +14,11 @@ var electron = require('electron-connect').server.create({
path: './dist'
});
var packager = require('electron-packager');
const fs = require('fs');
var sources = ['**/*.js', '**/*.css', '**/*.html', '!**/node_modules/**', '!dist/**', '!release/**'];
const distPackageAuthor = 'Mattermost, Inc.'
var sources = ['**/*.js', '**/*.json', '**/*.css', '**/*.html', '!**/node_modules/**', '!dist/**', '!release/**', '!**/test_config.json'];
gulp.task('prettify', ['prettify:sources', 'prettify:jsx']);
gulp.task('prettify:verify', ['prettify:sources:verify', 'prettify:jsx:verify'])
@@ -77,9 +80,15 @@ gulp.task('prettify:jsx:verify', function() {
});
gulp.task('build', ['sync-meta', 'webpack', 'copy'], function() {
return gulp.src('src/package.json')
.pipe(gulp.dest('dist'));
gulp.task('build', ['sync-meta', 'webpack', 'copy'], function(cb) {
const appPackageJson = require('./src/package.json');
const distPackageJson = Object.assign({}, appPackageJson, {
author: {
name: distPackageAuthor,
email: 'noreply'
}
});
fs.writeFile('./dist/package.json', JSON.stringify(distPackageJson, null, ' '), cb);
});
gulp.task('webpack', ['webpack:main', 'webpack:browser', 'webpack:webview']);
@@ -192,8 +201,8 @@ function makePackage(platform, arch, callback) {
"app-version": packageJson.version,
icon: 'resources/icon',
"version-string": {
CompanyName: packageJson.author.name,
LegalCopyright: 'Copyright (c) 2015 - ' + new Date().getFullYear() + ' ' + packageJson.author.name,
CompanyName: distPackageAuthor,
LegalCopyright: `Copyright (c) 2015 - ${new Date().getFullYear()} ${packageJson.author.name}`,
FileDescription: packageJson.description,
OriginalFilename: packageJson.productName + '.exe',
ProductVersion: packageJson.version,
@@ -239,6 +248,5 @@ gulp.task('sync-meta', function() {
appPackageJson.description = packageJson.description;
appPackageJson.author = packageJson.author;
appPackageJson.license = packageJson.license;
var fs = require('fs');
fs.writeFileSync('./src/package.json', JSON.stringify(appPackageJson, null, ' ') + '\n');
});

View File

@@ -19,7 +19,7 @@
"start": "electron dist",
"watch": "gulp watch",
"serve": "gulp watch",
"test": "gulp build && mocha --recursive test/specs && gulp prettify:verify",
"test": "gulp build && mocha --reporter mocha-circleci-reporter --recursive test/specs && gulp prettify:verify",
"package": "gulp package",
"package:windows": "gulp package:windows",
"package:osx": "gulp package:osx",
@@ -32,13 +32,13 @@
"babel-core": "^6.7.5",
"babel-loader": "^6.2.4",
"babel-preset-react": "^6.5.0",
"chromedriver": "^2.20.0",
"chai": "^3.5.0",
"chai-as-promised": "^5.3.0",
"del": "^2.2.0",
"electron-builder": "5.2.1",
"electron-connect": "^0.3.7",
"electron-packager": "^7.0.1",
"electron-prebuilt": "0.37.8",
"electron-squirrel-startup": "^1.0.0",
"electron-prebuilt": "1.2.2",
"electron-winstaller": "^2.2.0",
"esformatter": "^0.9.3",
"esformatter-jsx": "^5.0.0",
@@ -50,12 +50,11 @@
"json-loader": "^0.5.4",
"mocha": "^2.3.4",
"mocha-circleci-reporter": "0.0.1",
"spectron": "~3.2.0",
"rimraf": "^2.5.2",
"should": "^8.0.1",
"style-loader": "^0.13.0",
"through2": "^2.0.1",
"vinyl-named": "^1.1.0",
"webdriverio": "^3.3.0",
"webpack": "^1.12.15",
"webpack-stream": "^3.1.0"
},

View File

@@ -0,0 +1,58 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
x="0px"
y="0px"
viewBox="0 0 500 500"
style="enable-background:new 0 0 500 500;"
xml:space="preserve"
id="svg2"
inkscape:version="0.91 r13725"
sodipodi:docname="ClickedMenuIcon.svg"><metadata
id="metadata14"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs12" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1342"
inkscape:window-height="773"
id="namedview10"
showgrid="false"
inkscape:zoom="0.472"
inkscape:cx="-312.89678"
inkscape:cy="250"
inkscape:window-x="485"
inkscape:window-y="333"
inkscape:window-maximized="0"
inkscape:current-layer="svg2" /><style
type="text/css"
id="style4"> .st0{fill-rule:evenodd;clip-rule:evenodd;fill:#222222;} </style><g
id="XMLID_1_"
style="fill:#ffffff;fill-opacity:1;stroke:none"
transform="matrix(0.99998928,0,0,0.99998928,-0.01497322,0.02529433)"><g
id="XMLID_3_"
style="fill:#ffffff;fill-opacity:1;stroke:none"><path
id="XMLID_4_"
class="st0"
d="m 396.9,47.7 2.6,53.1 c 43,47.5 60,114.8 38.6,178.1 C 406.1,373.3 300.7,423 202.7,389.8 104.7,356.6 51.1,253.1 83,158.7 104.5,95.2 159.2,52 222.5,40.5 L 256.7,0.1 C 150,-2.8 49.3,63.4 13.3,169.9 -31,300.6 39.1,442.5 169.9,486.7 300.7,530.9 442.5,460.9 486.8,330.1 522.7,223.9 483.1,110.3 396.9,47.7 Z"
style="clip-rule:evenodd;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
inkscape:connector-curvature="0" /></g><path
id="XMLID_2_"
class="st0"
d="m 335.6,204.3 -1.8,-74.2 -1.5,-42.7 -1,-37 c 0,0 0.2,-17.8 -0.4,-22 -0.1,-0.9 -0.4,-1.6 -0.7,-2.2 0,-0.1 -0.1,-0.2 -0.1,-0.3 0,-0.1 -0.1,-0.2 -0.1,-0.2 -0.7,-1.2 -1.8,-2.1 -3.1,-2.6 -1.4,-0.5 -2.9,-0.4 -4.2,0.2 0,0 -0.1,0 -0.1,0 -0.2,0.1 -0.3,0.1 -0.4,0.2 -0.6,0.3 -1.2,0.7 -1.8,1.3 -3,3 -13.7,17.2 -13.7,17.2 l -23.2,28.8 -27.1,33 -46.5,57.8 c 0,0 -21.3,26.6 -16.6,59.4 4.7,32.8 29.1,48.7 48,55.1 18.9,6.4 48,8.5 71.6,-14.7 23.5,-23 22.7,-57.1 22.7,-57.1 z"
style="clip-rule:evenodd;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
inkscape:connector-curvature="0" /></g></svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@@ -0,0 +1,69 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
x="0px"
y="0px"
viewBox="0 0 500 500"
style="enable-background:new 0 0 500 500;"
xml:space="preserve"
id="svg2"
inkscape:version="0.91 r13725"
sodipodi:docname="ClickedMenuIconMention.svg"><metadata
id="metadata14"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs12"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4148"><g
id="g4150"
style="fill:#000000;fill-opacity:0.70196078;stroke:none"
transform="matrix(0.99998928,0,0,0.99998928,-0.01497322,0.02529433)"><g
id="g4152"
style="fill:#000000;fill-opacity:0.70196078;stroke:none"><path
id="path4154"
class="st0"
d="m 396.9,47.7 2.6,53.1 c 43,47.5 60,114.8 38.6,178.1 C 406.1,373.3 300.7,423 202.7,389.8 104.7,356.6 51.1,253.1 83,158.7 104.5,95.2 159.2,52 222.5,40.5 L 256.7,0.1 C 150,-2.8 49.3,63.4 13.3,169.9 -31,300.6 39.1,442.5 169.9,486.7 300.7,530.9 442.5,460.9 486.8,330.1 522.7,223.9 483.1,110.3 396.9,47.7 Z"
style="clip-rule:evenodd;fill:#000000;fill-opacity:0.70196078;fill-rule:evenodd;stroke:none"
inkscape:connector-curvature="0" /></g><path
id="path4156"
class="st0"
d="m 335.6,204.3 -1.8,-74.2 -1.5,-42.7 -1,-37 c 0,0 0.2,-17.8 -0.4,-22 -0.1,-0.9 -0.4,-1.6 -0.7,-2.2 0,-0.1 -0.1,-0.2 -0.1,-0.3 0,-0.1 -0.1,-0.2 -0.1,-0.2 -0.7,-1.2 -1.8,-2.1 -3.1,-2.6 -1.4,-0.5 -2.9,-0.4 -4.2,0.2 0,0 -0.1,0 -0.1,0 -0.2,0.1 -0.3,0.1 -0.4,0.2 -0.6,0.3 -1.2,0.7 -1.8,1.3 -3,3 -13.7,17.2 -13.7,17.2 l -23.2,28.8 -27.1,33 -46.5,57.8 c 0,0 -21.3,26.6 -16.6,59.4 4.7,32.8 29.1,48.7 48,55.1 18.9,6.4 48,8.5 71.6,-14.7 23.5,-23 22.7,-57.1 22.7,-57.1 z"
style="clip-rule:evenodd;fill:#000000;fill-opacity:0.70196078;fill-rule:evenodd;stroke:none"
inkscape:connector-curvature="0" /></g></clipPath></defs><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1278"
inkscape:window-height="1368"
id="namedview10"
showgrid="false"
inkscape:zoom="0.472"
inkscape:cx="-382.01244"
inkscape:cy="250"
inkscape:window-x="1273"
inkscape:window-y="0"
inkscape:window-maximized="0"
inkscape:current-layer="svg2" /><style
type="text/css"
id="style4"> .st0{fill-rule:evenodd;clip-rule:evenodd;fill:#222222;} </style><path
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M -62.5 -62.5 L -62.5 562.5 L 562.5 562.5 L 562.5 -62.5 L -62.5 -62.5 z M 343.75 156.25 A 187.5 187.5 0 0 1 531.25 343.75 A 187.5 187.5 0 0 1 343.75 531.25 A 187.5 187.5 0 0 1 156.25 343.75 A 187.5 187.5 0 0 1 343.75 156.25 z "
id="rect4141"
clip-path="url(#clipPath4148)" /><circle
style="opacity:1;fill:#ff1744;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path4137"
cx="343.75"
cy="343.75"
r="156.25" /></svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

@@ -0,0 +1,69 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
x="0px"
y="0px"
viewBox="0 0 500 500"
style="enable-background:new 0 0 500 500;"
xml:space="preserve"
id="svg2"
inkscape:version="0.91 r13725"
sodipodi:docname="ClickedMenuIconUnread.svg"><metadata
id="metadata14"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs12"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4148"><g
id="g4150"
style="fill:#000000;fill-opacity:0.70196078;stroke:none"
transform="matrix(0.99998928,0,0,0.99998928,-0.01497322,0.02529433)"><g
id="g4152"
style="fill:#000000;fill-opacity:0.70196078;stroke:none"><path
id="path4154"
class="st0"
d="m 396.9,47.7 2.6,53.1 c 43,47.5 60,114.8 38.6,178.1 C 406.1,373.3 300.7,423 202.7,389.8 104.7,356.6 51.1,253.1 83,158.7 104.5,95.2 159.2,52 222.5,40.5 L 256.7,0.1 C 150,-2.8 49.3,63.4 13.3,169.9 -31,300.6 39.1,442.5 169.9,486.7 300.7,530.9 442.5,460.9 486.8,330.1 522.7,223.9 483.1,110.3 396.9,47.7 Z"
style="clip-rule:evenodd;fill:#000000;fill-opacity:0.70196078;fill-rule:evenodd;stroke:none"
inkscape:connector-curvature="0" /></g><path
id="path4156"
class="st0"
d="m 335.6,204.3 -1.8,-74.2 -1.5,-42.7 -1,-37 c 0,0 0.2,-17.8 -0.4,-22 -0.1,-0.9 -0.4,-1.6 -0.7,-2.2 0,-0.1 -0.1,-0.2 -0.1,-0.3 0,-0.1 -0.1,-0.2 -0.1,-0.2 -0.7,-1.2 -1.8,-2.1 -3.1,-2.6 -1.4,-0.5 -2.9,-0.4 -4.2,0.2 0,0 -0.1,0 -0.1,0 -0.2,0.1 -0.3,0.1 -0.4,0.2 -0.6,0.3 -1.2,0.7 -1.8,1.3 -3,3 -13.7,17.2 -13.7,17.2 l -23.2,28.8 -27.1,33 -46.5,57.8 c 0,0 -21.3,26.6 -16.6,59.4 4.7,32.8 29.1,48.7 48,55.1 18.9,6.4 48,8.5 71.6,-14.7 23.5,-23 22.7,-57.1 22.7,-57.1 z"
style="clip-rule:evenodd;fill:#000000;fill-opacity:0.70196078;fill-rule:evenodd;stroke:none"
inkscape:connector-curvature="0" /></g></clipPath></defs><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1278"
inkscape:window-height="1368"
id="namedview10"
showgrid="false"
inkscape:zoom="0.472"
inkscape:cx="-382.01244"
inkscape:cy="250"
inkscape:window-x="1273"
inkscape:window-y="0"
inkscape:window-maximized="0"
inkscape:current-layer="svg2" /><style
type="text/css"
id="style4"> .st0{fill-rule:evenodd;clip-rule:evenodd;fill:#222222;} </style><path
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M -62.5 -62.5 L -62.5 562.5 L 562.5 562.5 L 562.5 -62.5 L -62.5 -62.5 z M 343.75 156.25 A 187.5 187.5 0 0 1 531.25 343.75 A 187.5 187.5 0 0 1 343.75 531.25 A 187.5 187.5 0 0 1 156.25 343.75 A 187.5 187.5 0 0 1 343.75 156.25 z "
id="rect4141"
clip-path="url(#clipPath4148)" /><circle
style="opacity:1;fill:#00e5ff;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path4137"
cx="343.75"
cy="343.75"
r="156.25" /></svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

@@ -0,0 +1,58 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
x="0px"
y="0px"
viewBox="0 0 500 500"
style="enable-background:new 0 0 500 500;"
xml:space="preserve"
id="svg2"
inkscape:version="0.91 r13725"
sodipodi:docname="MenuIcon.svg"><metadata
id="metadata14"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs12" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1342"
inkscape:window-height="773"
id="namedview10"
showgrid="false"
inkscape:zoom="0.472"
inkscape:cx="-337.92373"
inkscape:cy="250"
inkscape:window-x="485"
inkscape:window-y="333"
inkscape:window-maximized="0"
inkscape:current-layer="svg2" /><style
type="text/css"
id="style4"> .st0{fill-rule:evenodd;clip-rule:evenodd;fill:#222222;} </style><g
id="XMLID_1_"
style="fill:#000000;fill-opacity:0.70196078;stroke:none"
transform="matrix(0.99998928,0,0,0.99998928,-0.01497322,0.02529433)"><g
id="XMLID_3_"
style="fill:#000000;fill-opacity:0.70196078;stroke:none"><path
id="XMLID_4_"
class="st0"
d="m 396.9,47.7 2.6,53.1 c 43,47.5 60,114.8 38.6,178.1 C 406.1,373.3 300.7,423 202.7,389.8 104.7,356.6 51.1,253.1 83,158.7 104.5,95.2 159.2,52 222.5,40.5 L 256.7,0.1 C 150,-2.8 49.3,63.4 13.3,169.9 -31,300.6 39.1,442.5 169.9,486.7 300.7,530.9 442.5,460.9 486.8,330.1 522.7,223.9 483.1,110.3 396.9,47.7 Z"
style="clip-rule:evenodd;fill:#000000;fill-opacity:0.70196078;fill-rule:evenodd;stroke:none"
inkscape:connector-curvature="0" /></g><path
id="XMLID_2_"
class="st0"
d="m 335.6,204.3 -1.8,-74.2 -1.5,-42.7 -1,-37 c 0,0 0.2,-17.8 -0.4,-22 -0.1,-0.9 -0.4,-1.6 -0.7,-2.2 0,-0.1 -0.1,-0.2 -0.1,-0.3 0,-0.1 -0.1,-0.2 -0.1,-0.2 -0.7,-1.2 -1.8,-2.1 -3.1,-2.6 -1.4,-0.5 -2.9,-0.4 -4.2,0.2 0,0 -0.1,0 -0.1,0 -0.2,0.1 -0.3,0.1 -0.4,0.2 -0.6,0.3 -1.2,0.7 -1.8,1.3 -3,3 -13.7,17.2 -13.7,17.2 l -23.2,28.8 -27.1,33 -46.5,57.8 c 0,0 -21.3,26.6 -16.6,59.4 4.7,32.8 29.1,48.7 48,55.1 18.9,6.4 48,8.5 71.6,-14.7 23.5,-23 22.7,-57.1 22.7,-57.1 z"
style="clip-rule:evenodd;fill:#000000;fill-opacity:0.70196078;fill-rule:evenodd;stroke:none"
inkscape:connector-curvature="0" /></g></svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@@ -0,0 +1,69 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
x="0px"
y="0px"
viewBox="0 0 500 500"
style="enable-background:new 0 0 500 500;"
xml:space="preserve"
id="svg2"
inkscape:version="0.91 r13725"
sodipodi:docname="MenuIconMention.svg"><metadata
id="metadata14"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs12"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4148"><g
id="g4150"
style="fill:#000000;fill-opacity:0.70196078;stroke:none"
transform="matrix(0.99998928,0,0,0.99998928,-0.01497322,0.02529433)"><g
id="g4152"
style="fill:#000000;fill-opacity:0.70196078;stroke:none"><path
id="path4154"
class="st0"
d="m 396.9,47.7 2.6,53.1 c 43,47.5 60,114.8 38.6,178.1 C 406.1,373.3 300.7,423 202.7,389.8 104.7,356.6 51.1,253.1 83,158.7 104.5,95.2 159.2,52 222.5,40.5 L 256.7,0.1 C 150,-2.8 49.3,63.4 13.3,169.9 -31,300.6 39.1,442.5 169.9,486.7 300.7,530.9 442.5,460.9 486.8,330.1 522.7,223.9 483.1,110.3 396.9,47.7 Z"
style="clip-rule:evenodd;fill:#000000;fill-opacity:0.70196078;fill-rule:evenodd;stroke:none"
inkscape:connector-curvature="0" /></g><path
id="path4156"
class="st0"
d="m 335.6,204.3 -1.8,-74.2 -1.5,-42.7 -1,-37 c 0,0 0.2,-17.8 -0.4,-22 -0.1,-0.9 -0.4,-1.6 -0.7,-2.2 0,-0.1 -0.1,-0.2 -0.1,-0.3 0,-0.1 -0.1,-0.2 -0.1,-0.2 -0.7,-1.2 -1.8,-2.1 -3.1,-2.6 -1.4,-0.5 -2.9,-0.4 -4.2,0.2 0,0 -0.1,0 -0.1,0 -0.2,0.1 -0.3,0.1 -0.4,0.2 -0.6,0.3 -1.2,0.7 -1.8,1.3 -3,3 -13.7,17.2 -13.7,17.2 l -23.2,28.8 -27.1,33 -46.5,57.8 c 0,0 -21.3,26.6 -16.6,59.4 4.7,32.8 29.1,48.7 48,55.1 18.9,6.4 48,8.5 71.6,-14.7 23.5,-23 22.7,-57.1 22.7,-57.1 z"
style="clip-rule:evenodd;fill:#000000;fill-opacity:0.70196078;fill-rule:evenodd;stroke:none"
inkscape:connector-curvature="0" /></g></clipPath></defs><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1278"
inkscape:window-height="1368"
id="namedview10"
showgrid="false"
inkscape:zoom="0.472"
inkscape:cx="-2.7751473"
inkscape:cy="250"
inkscape:window-x="1273"
inkscape:window-y="0"
inkscape:window-maximized="0"
inkscape:current-layer="svg2" /><style
type="text/css"
id="style4"> .st0{fill-rule:evenodd;clip-rule:evenodd;fill:#222222;} </style><path
style="opacity:1;fill:#000000;fill-opacity:0.7019608;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M -62.5 -62.5 L -62.5 562.5 L 562.5 562.5 L 562.5 -62.5 L -62.5 -62.5 z M 343.75 156.25 A 187.5 187.5 0 0 1 531.25 343.75 A 187.5 187.5 0 0 1 343.75 531.25 A 187.5 187.5 0 0 1 156.25 343.75 A 187.5 187.5 0 0 1 343.75 156.25 z "
id="rect4141"
clip-path="url(#clipPath4148)" /><circle
style="opacity:1;fill:#ff1744;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path4137"
cx="343.75"
cy="343.75"
r="156.25" /></svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

View File

@@ -0,0 +1,69 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
x="0px"
y="0px"
viewBox="0 0 500 500"
style="enable-background:new 0 0 500 500;"
xml:space="preserve"
id="svg2"
inkscape:version="0.91 r13725"
sodipodi:docname="MenuIconUnread.svg"><metadata
id="metadata14"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
id="defs12"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4148"><g
id="g4150"
style="fill:#000000;fill-opacity:0.70196078;stroke:none"
transform="matrix(0.99998928,0,0,0.99998928,-0.01497322,0.02529433)"><g
id="g4152"
style="fill:#000000;fill-opacity:0.70196078;stroke:none"><path
id="path4154"
class="st0"
d="m 396.9,47.7 2.6,53.1 c 43,47.5 60,114.8 38.6,178.1 C 406.1,373.3 300.7,423 202.7,389.8 104.7,356.6 51.1,253.1 83,158.7 104.5,95.2 159.2,52 222.5,40.5 L 256.7,0.1 C 150,-2.8 49.3,63.4 13.3,169.9 -31,300.6 39.1,442.5 169.9,486.7 300.7,530.9 442.5,460.9 486.8,330.1 522.7,223.9 483.1,110.3 396.9,47.7 Z"
style="clip-rule:evenodd;fill:#000000;fill-opacity:0.70196078;fill-rule:evenodd;stroke:none"
inkscape:connector-curvature="0" /></g><path
id="path4156"
class="st0"
d="m 335.6,204.3 -1.8,-74.2 -1.5,-42.7 -1,-37 c 0,0 0.2,-17.8 -0.4,-22 -0.1,-0.9 -0.4,-1.6 -0.7,-2.2 0,-0.1 -0.1,-0.2 -0.1,-0.3 0,-0.1 -0.1,-0.2 -0.1,-0.2 -0.7,-1.2 -1.8,-2.1 -3.1,-2.6 -1.4,-0.5 -2.9,-0.4 -4.2,0.2 0,0 -0.1,0 -0.1,0 -0.2,0.1 -0.3,0.1 -0.4,0.2 -0.6,0.3 -1.2,0.7 -1.8,1.3 -3,3 -13.7,17.2 -13.7,17.2 l -23.2,28.8 -27.1,33 -46.5,57.8 c 0,0 -21.3,26.6 -16.6,59.4 4.7,32.8 29.1,48.7 48,55.1 18.9,6.4 48,8.5 71.6,-14.7 23.5,-23 22.7,-57.1 22.7,-57.1 z"
style="clip-rule:evenodd;fill:#000000;fill-opacity:0.70196078;fill-rule:evenodd;stroke:none"
inkscape:connector-curvature="0" /></g></clipPath></defs><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1278"
inkscape:window-height="1368"
id="namedview10"
showgrid="false"
inkscape:zoom="0.472"
inkscape:cx="-2.7751473"
inkscape:cy="250"
inkscape:window-x="1273"
inkscape:window-y="0"
inkscape:window-maximized="0"
inkscape:current-layer="svg2" /><style
type="text/css"
id="style4"> .st0{fill-rule:evenodd;clip-rule:evenodd;fill:#222222;} </style><path
style="opacity:1;fill:#000000;fill-opacity:0.7019608;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M -62.5 -62.5 L -62.5 562.5 L 562.5 562.5 L 562.5 -62.5 L -62.5 -62.5 z M 343.75 156.25 A 187.5 187.5 0 0 1 531.25 343.75 A 187.5 187.5 0 0 1 343.75 531.25 A 187.5 187.5 0 0 1 156.25 343.75 A 187.5 187.5 0 0 1 343.75 156.25 z "
id="rect4141"
clip-path="url(#clipPath4148)" /><circle
style="opacity:1;fill:#00e5ff;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path4137"
cx="343.75"
cy="343.75"
r="156.25" /></svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 18 KiB

309
resources/windows/tray.svg Normal file
View File

@@ -0,0 +1,309 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="197.83778mm"
height="197.83778mm"
viewBox="0 0 701.00002 701.00002"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
inkscape:export-filename="D:\Users\yuya-oc\Desktop\path4147.png"
inkscape:export-xdpi="4.1084166"
inkscape:export-ydpi="4.1084166"
sodipodi:docname="tray.svg">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.35"
inkscape:cx="-149.50001"
inkscape:cy="294.7857"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="1856"
inkscape:window-height="1057"
inkscape:window-x="56"
inkscape:window-y="-8"
inkscape:window-maximized="1" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="レイヤー 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-13.071442,-124.71934)">
<circle
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:20;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path4147"
cx="363.07144"
cy="475.71936"
r="340"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90" />
<image
y="124.71934"
x="13.071442"
id="image4144"
xlink:href="data:image/png;base64,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
"
style="image-rendering:optimizeQuality"
preserveAspectRatio="none"
height="701"
width="701" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 20 KiB

View File

@@ -0,0 +1,315 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="197.83778mm"
height="197.83778mm"
viewBox="0 0 701.00002 701.00002"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
inkscape:export-filename="D:\Users\yuya-oc\Desktop\path4147.png"
inkscape:export-xdpi="4.1084166"
inkscape:export-ydpi="4.1084166"
sodipodi:docname="tray_mention.svg">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.35"
inkscape:cx="-148.07144"
inkscape:cy="294.7857"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="1856"
inkscape:window-height="1057"
inkscape:window-x="56"
inkscape:window-y="-8"
inkscape:window-maximized="1" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="レイヤー 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-13.071442,-124.71934)">
<circle
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:20;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path4147"
cx="363.07144"
cy="475.71936"
r="340"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90" />
<image
y="124.71934"
x="13.071442"
id="image4144"
xlink:href="data:image/png;base64,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
"
style="image-rendering:optimizeQuality"
preserveAspectRatio="none"
height="701"
width="701" />
<circle
style="opacity:1;fill:#ff1744;fill-opacity:1;stroke:#000000;stroke-width:20;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path4149"
cx="538.07147"
cy="650.71936"
r="165" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 20 KiB

View File

@@ -0,0 +1,315 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="197.83778mm"
height="197.83778mm"
viewBox="0 0 701.00002 701.00002"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
inkscape:export-filename="D:\Users\yuya-oc\Desktop\path4147.png"
inkscape:export-xdpi="4.1084166"
inkscape:export-ydpi="4.1084166"
sodipodi:docname="tray_unread.svg">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.35"
inkscape:cx="-148.07144"
inkscape:cy="294.7857"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="1856"
inkscape:window-height="1057"
inkscape:window-x="56"
inkscape:window-y="-8"
inkscape:window-maximized="1" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="レイヤー 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-13.071442,-124.71934)">
<circle
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:20;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path4147"
cx="363.07144"
cy="475.71936"
r="340"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90" />
<image
y="124.71934"
x="13.071442"
id="image4144"
xlink:href="data:image/png;base64,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
"
style="image-rendering:optimizeQuality"
preserveAspectRatio="none"
height="701"
width="701" />
<circle
style="opacity:1;fill:#00e5ff;fill-opacity:1;stroke:#000000;stroke-width:20;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path4149"
cx="538.07147"
cy="650.71936"
r="165" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 20 KiB

View File

@@ -4,35 +4,40 @@ const createWindowsInstaller = require('electron-winstaller').createWindowsInsta
const path = require('path')
const rimraf = require('rimraf')
deleteOutputFolder()
.then(getInstallerConfig)
.then(createWindowsInstaller)
.catch((error) => {
console.error(error.message || error)
process.exit(1)
})
const archList = ['ia32', 'x64'];
archList.forEach((arch) => {
deleteOutputFolder(arch)
.then(getInstallerConfig)
.then(createWindowsInstaller)
.catch((error) => {
console.error(error.message || error)
process.exit(1)
})
})
function getInstallerConfig() {
function getInstallerConfig(arch) {
const rootPath = path.join(__dirname, '..')
const outPath = path.join(rootPath, 'release')
return Promise.resolve({
appDirectory: path.join(outPath, 'Mattermost-win32-x64'),
appDirectory: path.join(outPath, `Mattermost-win32-${arch}`),
authors: 'Mattermost, Inc.',
owners: 'Mattermost, Inc.',
iconUrl: 'https://raw.githubusercontent.com/mattermost/desktop/master/resources/icon.ico',
//loadingGif: path.join(rootPath, 'assets', 'img', 'loading.gif'),
noMsi: true,
outputDirectory: path.join(outPath, 'windows-installer'),
setupExe: 'Mattermost.exe',
outputDirectory: path.join(outPath, `windows-installer-${arch}`),
setupExe: `mattermost-setup-${arch}.exe`,
setupIcon: path.join(rootPath, 'resources', 'icon.ico'),
skipUpdateIcon: true,
exe: 'Mattermost.exe'
})
}
function deleteOutputFolder() {
function deleteOutputFolder(arch) {
return new Promise((resolve, reject) => {
rimraf(path.join(__dirname, '..', 'out', 'windows-installer'), (error) => {
error ? reject(error) : resolve()
rimraf(path.join(__dirname, '..', 'out', `windows-installer-${arch}`), (error) => {
error ? reject(error) : resolve(arch)
})
})
}

View File

@@ -15,9 +15,7 @@ const ListGroupItem = ReactBootstrap.ListGroupItem;
const LoginModal = require('./components/loginModal.jsx');
const electron = require('electron');
const remote = electron.remote;
const ipcRenderer = electron.ipcRenderer;
const {remote, ipcRenderer, webFrame, shell} = require('electron');
const osLocale = require('os-locale');
const fs = require('fs');
@@ -54,6 +52,16 @@ var MainPage = React.createClass({
loginQueue: loginQueue
});
});
// can't switch tabs sequencially for some reason...
ipcRenderer.on('switch-tab', (event, key) => {
this.handleSelect(key);
});
ipcRenderer.on('select-next-tab', (event) => {
this.handleSelect(this.state.key + 1);
});
ipcRenderer.on('select-previous-tab', (event) => {
this.handleSelect(this.state.key - 1);
});
var focusListener = function() {
var webview = document.getElementById('mattermostView' + thisObj.state.key);
@@ -69,8 +77,9 @@ var MainPage = React.createClass({
});
},
handleSelect: function(key) {
const newKey = (this.props.teams.length + key) % this.props.teams.length;
this.setState({
key: key
key: newKey
});
this.handleOnTeamFocused(key);
},
@@ -277,7 +286,7 @@ var TabBar = React.createClass({
var MattermostView = React.createClass({
getInitialState: function() {
return {
did_fail_load: null
errorInfo: null
};
},
handleUnreadCountChange: function(unreadCount, mentionCount, isUnread, isMentioned) {
@@ -308,8 +317,14 @@ var MattermostView = React.createClass({
icon: '../resources/appicon.png'
});
thisObj.setState({
did_fail_load: e
errorInfo: e
});
setTimeout(() => {
thisObj.setState({
errorInfo: null
});
webview.reload();
}, 30000);
});
// Open link in browserWindow. for exmaple, attached files.
@@ -325,13 +340,16 @@ var MattermostView = React.createClass({
window.open(e.url, 'Mattermost', 'nodeIntegration=no');
} else {
// if the link is external, use default browser.
require('shell').openExternal(e.url);
shell.openExternal(e.url);
}
});
webview.addEventListener("dom-ready", function() {
// webview.openDevTools();
// In order to apply the zoom level to webview.
webFrame.setZoomLevel(parseInt(localStorage.getItem('zoomLevel')));
// Use 'Meiryo UI' and 'MS Gothic' to prevent CJK fonts on Windows(JP).
if (process.platform === 'win32') {
var applyCssFile = function(cssFile) {
@@ -391,14 +409,16 @@ var MattermostView = React.createClass({
});
},
render: function() {
const errorView = this.state.errorInfo ? (<ErrorView id={ this.props.id + '-fail' } style={ this.props.style } className="errorView" errorInfo={ this.state.errorInfo }></ErrorView>) : null;
// 'disablewebsecurity' is necessary to display external images.
// However, it allows also CSS/JavaScript.
// So webview should use 'allowDisplayingInsecureContent' as same as BrowserWindow.
if (this.state.did_fail_load === null) {
return (<webview id={ this.props.id } className="mattermostView" style={ this.props.style } preload="webview/mattermost.js" src={ this.props.src } ref="webview"></webview>);
} else {
return (<ErrorView id={ this.props.id + '-fail' } className="errorView" errorInfo={ this.state.did_fail_load } style={ this.props.style }></ErrorView>)
}
// Need to keep webview mounted when failed to load.
return (<div>
{ errorView }
<webview id={ this.props.id } className="mattermostView" style={ this.props.style } preload="webview/mattermost.js" src={ this.props.src } ref="webview"></webview>
</div>);
}
});
@@ -453,7 +473,7 @@ var showUnreadBadgeWindows = function(unreadCount, mentionCount) {
const sendBadge = function(dataURL, description) {
// window.setOverlayIcon() does't work with NativeImage across remote boundaries.
// https://github.com/atom/electron/issues/4011
electron.ipcRenderer.send('update-unread', {
ipcRenderer.send('update-unread', {
overlayDataURL: dataURL,
description: description,
unreadCount: unreadCount,
@@ -481,7 +501,7 @@ var showUnreadBadgeOSX = function(unreadCount, mentionCount) {
remote.app.dock.setBadge('');
}
electron.ipcRenderer.send('update-unread', {
ipcRenderer.send('update-unread', {
unreadCount: unreadCount,
mentionCount: mentionCount
});
@@ -496,7 +516,7 @@ var showUnreadBadgeLinux = function(unreadCount, mentionCount) {
remote.app.dock.setBadge('');
}*/
electron.ipcRenderer.send('update-unread', {
ipcRenderer.send('update-unread', {
unreadCount: unreadCount,
mentionCount: mentionCount
});
@@ -518,6 +538,22 @@ var showUnreadBadge = function(unreadCount, mentionCount) {
}
}
if (!localStorage.getItem('zoomLevel')) {
localStorage.setItem('zoomLevel', 0);
}
webFrame.setZoomLevel(parseInt(localStorage.getItem('zoomLevel')));
ipcRenderer.on('zoom-in', (event, increment) => {
const zoomLevel = webFrame.getZoomLevel() + increment
webFrame.setZoomLevel(zoomLevel);
localStorage.setItem('zoomLevel', zoomLevel);
});
ipcRenderer.on('zoom-reset', (event) => {
webFrame.setZoomLevel(0);
localStorage.setItem('zoomLevel', 0);
});
ReactDOM.render(
<MainPage teams={ config.teams } onUnreadCountChange={ showUnreadBadge } />,
document.getElementById('content')

View File

@@ -2,6 +2,10 @@ const OriginalNotification = Notification;
function override(eventHandlers) {
Notification = function(title, options) {
// Notification Center shows app's icon, so there were two icons on the notification.
if (process.platform === 'darwin') {
delete options.icon;
}
this.notification = new OriginalNotification(title, options);
if (eventHandlers.notification) {
eventHandlers.notification(title, options);

View File

@@ -1,6 +1,6 @@
'use strict';
const remote = require('electron').remote;
const {remote, ipcRenderer} = require('electron');
const settings = require('../common/settings');
const React = require('react');
@@ -34,9 +34,7 @@ var SettingsPage = React.createClass({
config = settings.loadDefault();
}
this.setState({
showAddTeamForm: false
});
config.showAddTeamForm = false;
return config;
},
@@ -54,10 +52,8 @@ var SettingsPage = React.createClass({
this.setState({
teams: teams
});
this.handleSave(false);
},
handleSave: function(toIndex) {
handleSave: function() {
var config = {
teams: this.state.teams,
hideMenuBar: this.state.hideMenuBar,
@@ -85,9 +81,10 @@ var SettingsPage = React.createClass({
});
}
if (typeof toIndex == 'undefined' || toIndex) {
backToIndex();
}
ipcRenderer.send('update-menu', config);
ipcRenderer.send('update-config');
backToIndex();
},
handleCancel: function() {
backToIndex();
@@ -117,16 +114,10 @@ var SettingsPage = React.createClass({
autostart: this.refs.autostart.getChecked()
});
},
handleShowTeamForm: function() {
if (!this.state.showAddTeamForm) {
this.setState({
showAddTeamForm: true
});
} else {
this.setState({
showAddTeamForm: false
});
}
toggleShowTeamForm: function() {
this.setState({
showAddTeamForm: !this.state.showAddTeamForm
});
},
handleFlashWindowSetting: function(item) {
this.setState({
@@ -136,11 +127,6 @@ var SettingsPage = React.createClass({
});
},
render: function() {
var buttonStyle = {
marginTop: 20
};
var teams_row = (
<Row>
<Col md={ 12 }>
@@ -166,7 +152,7 @@ var SettingsPage = React.createClass({
}
options.push(<Input key="inputDisableWebSecurity" ref="disablewebsecurity" type="checkbox" label="Allow mixed content (Enabling allows both secure and insecure content, images and scripts to render and execute. Disabling allows only secure content.)"
checked={ this.state.disablewebsecurity } onChange={ this.handleChangeDisableWebSecurity } />);
//OSX has an option in the tray, to set the app to autostart, so we choose to not support this option for OSX
//OSX has an option in the Dock, to set the app to autostart, so we choose to not support this option for OSX
if (process.platform === 'win32' || process.platform === 'linux') {
options.push(<Input key="inputAutoStart" ref="autostart" type="checkbox" label="Start app on login." checked={ this.state.autostart } onChange={ this.handleChangeAutoStart } />);
}
@@ -179,55 +165,58 @@ var SettingsPage = React.createClass({
</Row>
) : null;
var notificationSettings = [
{
label: 'Never',
state: 0
},
/* ToDo: Idle isn't implemented yet
{
label: 'Only when idle (after 10 seconds)',
state: 1
},*/
{
label: 'Always',
state: 2
}
];
var notifications_row = null;
if (process.platform === 'win32') {
var notificationSettings = [
{
label: 'Never',
state: 0
},
/* ToDo: Idle isn't implemented yet
{
label: 'Only when idle (after 10 seconds)',
state: 1
},*/
{
label: 'Always',
state: 2
}
];
var that = this;
var notificationElements = notificationSettings.map(function(item) {
var boundClick = that.handleFlashWindowSetting.bind(that, item);
return (
<Input key={ "flashWindow" + item.state } name="handleFlashWindow" ref={ "flashWindow" + item.state } type="radio" label={ item.label } value={ item.state } onChange={ boundClick }
checked={ that.state.notifications.flashWindow == item.state ? "checked" : "" } />
);
});
var that = this;
var notificationElements = notificationSettings.map(function(item) {
var boundClick = that.handleFlashWindowSetting.bind(that, item);
return (
<Input key={ "flashWindow" + item.state } name="handleFlashWindow" ref={ "flashWindow" + item.state } type="radio" label={ item.label } value={ item.state } onChange={ boundClick }
checked={ that.state.notifications.flashWindow == item.state ? "checked" : "" } />
);
});
var notifications = (
<Row>
<Col md={ 12 }>
<h2>Notifications</h2> Configure, that the taskicon in the taskbar blinks when you were mentioned.
{ notificationElements }
</Col>
</Row>
)
notifications_row = (
<Row>
<Col md={ 12 }>
<h3>Notifications</h3> Configure, that the taskicon in the taskbar blinks when new message arrives.
{ notificationElements }
</Col>
</Row>
);
}
return (
<Grid className="settingsPage">
<Row>
<Col xs={ 4 } sm={ 1 } md={ 2 } lg={ 2 }>
<Col xs={ 4 } sm={ 2 } md={ 2 } lg={ 1 }>
<h2>Teams</h2>
</Col>
<Col xs={ 4 } sm={ 2 } md={ 1 } lg={ 1 } mdPull={ 1 }>
<Button className="pull-right" style={ buttonStyle } bsSize="small" onClick={ this.handleShowTeamForm }>
<Col xs={ 8 } sm={ 10 } md={ 10 } lg={ 11 }>
<Button bsSize="small" style={ { marginTop: 20 } } onClick={ this.toggleShowTeamForm }>
<Glyphicon glyph="plus" />
</Button>
</Col>
</Row>
{ teams_row }
{ options_row }
{ notifications }
{ notifications_row }
<div>
<hr />
</div>
@@ -264,7 +253,7 @@ var TeamList = React.createClass({
var teams = this.props.teams;
// check if team already exists and then change existing team or add new one
if (!team.index && teams[team.index]) {
if ((team.index !== undefined) && teams[team.index]) {
teams[team.index].name = team.name;
teams[team.index].url = team.url;
} else {

View File

@@ -1,7 +1,15 @@
'use strict';
const electron = require('electron');
const app = electron.app; // Module to control application life.
const {
app,
BrowserWindow,
Menu,
Tray,
ipcMain,
nativeImage,
dialog,
systemPreferences
} = require('electron');
if (process.platform === 'win32') {
var cmd = process.argv[1];
@@ -19,11 +27,6 @@ if (process.platform === 'win32') {
require('electron-squirrel-startup');
const BrowserWindow = electron.BrowserWindow; // Module to create native browser window.
const Menu = electron.Menu;
const Tray = electron.Tray;
const ipc = electron.ipcMain;
const nativeImage = electron.nativeImage;
const fs = require('fs');
const path = require('path');
@@ -63,6 +66,23 @@ catch (e) {
config = settings.loadDefault();
console.log('Failed to read or upgrade config.json');
}
ipcMain.on('update-config', () => {
config = settings.readFileSync(configFile);
});
// Only for OS X
const switchMenuIconImages = function(icons, isDarkMode) {
if (isDarkMode) {
icons.normal = icons.clicked.normal;
icons.unread = icons.clicked.unread;
icons.mention = icons.clicked.mention;
}
else {
icons.normal = icons.light.normal;
icons.unread = icons.light.unread;
icons.mention = icons.light.mention;
}
};
// Keep a global reference of the window object, if you don't, the window will
// be closed automatically when the JavaScript object is garbage collected.
@@ -72,16 +92,25 @@ const trayImages = function() {
switch (process.platform) {
case 'win32':
return {
normal: nativeImage.createFromPath(path.resolve(__dirname, 'resources/tray.png')),
unread: nativeImage.createFromPath(path.resolve(__dirname, 'resources/tray_unread.png')),
mention: nativeImage.createFromPath(path.resolve(__dirname, 'resources/tray_mention.png'))
normal: nativeImage.createFromPath(path.resolve(__dirname, 'resources/windows/tray.ico')),
unread: nativeImage.createFromPath(path.resolve(__dirname, 'resources/windows/tray_unread.ico')),
mention: nativeImage.createFromPath(path.resolve(__dirname, 'resources/windows/tray_mention.ico'))
};
case 'darwin':
return {
normal: nativeImage.createFromPath(path.resolve(__dirname, 'resources/osx/MenuIconTemplate.png')),
unread: nativeImage.createFromPath(path.resolve(__dirname, 'resources/osx/MenuIconUnreadTemplate.png')),
mention: nativeImage.createFromPath(path.resolve(__dirname, 'resources/osx/MenuIconMentionTemplate.png'))
const icons = {
light: {
normal: nativeImage.createFromPath(path.resolve(__dirname, 'resources/osx/MenuIcon.png')),
unread: nativeImage.createFromPath(path.resolve(__dirname, 'resources/osx/MenuIconUnread.png')),
mention: nativeImage.createFromPath(path.resolve(__dirname, 'resources/osx/MenuIconMention.png'))
},
clicked: {
normal: nativeImage.createFromPath(path.resolve(__dirname, 'resources/osx/ClickedMenuIcon.png')),
unread: nativeImage.createFromPath(path.resolve(__dirname, 'resources/osx/ClickedMenuIconUnread.png')),
mention: nativeImage.createFromPath(path.resolve(__dirname, 'resources/osx/ClickedMenuIconMention.png'))
}
};
switchMenuIconImages(icons, systemPreferences.isDarkMode());
return icons;
case 'linux':
var resourcesDir = 'resources/linux/' + (config.trayIconTheme || 'light') + '/';
return {
@@ -144,7 +173,7 @@ app.on('certificate-error', function(event, webContents, url, error, certificate
detail = `Certificate is different from previous one.\n\n` + detail;
}
electron.dialog.showMessageBox(mainWindow, {
dialog.showMessageBox(mainWindow, {
title: 'Certificate error',
message: `Do you trust certificate from "${certificate.issuerName}"?`,
detail: detail,
@@ -167,7 +196,7 @@ app.on('certificate-error', function(event, webContents, url, error, certificate
const loginCallbackMap = new Map();
ipc.on('login-credentials', function(event, request, user, password) {
ipcMain.on('login-credentials', function(event, request, user, password) {
const callback = loginCallbackMap.get(JSON.stringify(request));
if (callback != null) {
callback(user, password);
@@ -188,6 +217,14 @@ app.on('ready', function() {
if (shouldShowTrayIcon()) {
// set up tray icon
trayIcon = new Tray(trayImages.normal);
if (process.platform === 'darwin') {
trayIcon.setPressedImage(trayImages.clicked.normal);
systemPreferences.subscribeNotification('AppleInterfaceThemeChangedNotification', (event, userInfo) => {
switchMenuIconImages(trayImages, systemPreferences.isDarkMode());
trayIcon.setImage(trayImages.normal);
});
}
trayIcon.setToolTip(app.getName());
trayIcon.on('click', function() {
mainWindow.focus();
@@ -198,7 +235,7 @@ app.on('ready', function() {
trayIcon.on('balloon-click', function() {
mainWindow.focus();
});
ipc.on('notified', function(event, arg) {
ipcMain.on('notified', function(event, arg) {
if (process.platform === 'win32') {
if (config.notifications.flashWindow === 2) {
mainWindow.flashFrame(true);
@@ -217,22 +254,31 @@ app.on('ready', function() {
// Set overlay icon from dataURL
// Set trayicon to show "dot"
ipc.on('update-unread', function(event, arg) {
ipcMain.on('update-unread', function(event, arg) {
if (process.platform === 'win32') {
const overlay = arg.overlayDataURL ? electron.nativeImage.createFromDataURL(arg.overlayDataURL) : null;
const overlay = arg.overlayDataURL ? nativeImage.createFromDataURL(arg.overlayDataURL) : null;
mainWindow.setOverlayIcon(overlay, arg.description);
}
if (arg.mentionCount > 0) {
trayIcon.setImage(trayImages.mention);
if (process.platform === 'darwin') {
trayIcon.setPressedImage(trayImages.clicked.mention);
}
trayIcon.setToolTip(arg.mentionCount + ' unread mentions');
}
else if (arg.unreadCount > 0) {
trayIcon.setImage(trayImages.unread);
if (process.platform === 'darwin') {
trayIcon.setPressedImage(trayImages.clicked.unread);
}
trayIcon.setToolTip(arg.unreadCount + ' unread channels');
}
else {
trayIcon.setImage(trayImages.normal);
if (process.platform === 'darwin') {
trayIcon.setPressedImage(trayImages.clicked.normal);
}
trayIcon.setToolTip(app.getName());
}
});
@@ -248,8 +294,7 @@ app.on('ready', function() {
// follow Electron's defaults
window_options = {};
}
if (process.platform === 'win32' || process.platform === 'linux') {
// On HiDPI Windows environment, the taskbar icon is pixelated. So this line is necessary.
if (process.platform === 'linux') {
window_options.icon = path.resolve(__dirname, 'resources/appicon.png');
}
window_options.title = app.getName();
@@ -265,6 +310,13 @@ app.on('ready', function() {
// and load the index.html of the app.
mainWindow.loadURL('file://' + __dirname + '/browser/index.html');
// Set application menu
ipcMain.on('update-menu', (event, config) => {
var app_menu = appMenu.createMenu(mainWindow, config);
Menu.setApplicationMenu(app_menu);
});
ipcMain.emit('update-menu', true, config);
// set up context menu for tray icon
if (shouldShowTrayIcon()) {
const tray_menu = require('./main/menus/tray').createDefault(mainWindow);
@@ -314,9 +366,6 @@ app.on('ready', function() {
saveWindowState(bounds_info_path, mainWindow);
});
var app_menu = appMenu.createMenu(mainWindow);
Menu.setApplicationMenu(app_menu);
// Emitted when the window is closed.
mainWindow.on('closed', function() {
// Dereference the window object, usually you would store windows

View File

@@ -3,7 +3,8 @@
const {
app,
dialog,
ipcMain
ipcMain,
shell
} = require('electron');
const path = require('path');
const fs = require('fs');
@@ -23,7 +24,7 @@ function init(mainWindow) {
function initDialogEvent(mainWindow) {
ipcMain.on('confirm-protocol', (event, protocol, URL) => {
if (allowedProtocols.indexOf(protocol) !== -1) {
require('shell').openExternal(URL);
shell.openExternal(URL);
return;
}
dialog.showMessageBox(mainWindow, {
@@ -47,7 +48,7 @@ function initDialogEvent(mainWindow) {
});
// fallthrough
case 0:
require('shell').openExternal(URL);
shell.openExternal(URL);
break;
default:
break;

View File

@@ -3,7 +3,11 @@
const electron = require('electron');
const Menu = electron.Menu;
var createTemplate = function(mainWindow) {
var createTemplate = function(mainWindow, config) {
const separatorItem = {
type: 'separator'
};
var app_name = electron.app.getName();
var first_menu_name = (process.platform === 'darwin') ? app_name : 'File';
var template = [];
@@ -134,9 +138,25 @@ var createTemplate = function(mainWindow) {
focusedWindow.setFullScreen(!focusedWindow.isFullScreen());
}
}
}, separatorItem, {
label: 'Actual Size',
accelerator: 'CmdOrCtrl+0',
click: () => {
mainWindow.webContents.send('zoom-reset');
}
}, {
type: 'separator'
label: 'Zoom In',
accelerator: 'CmdOrCtrl+Plus',
click: () => {
mainWindow.webContents.send('zoom-in', 1);
}
}, {
label: 'Zoom Out',
accelerator: 'CmdOrCtrl+-',
click: () => {
mainWindow.webContents.send('zoom-in', -1);
}
}, separatorItem, {
label: 'Toggle Developer Tools',
accelerator: (function() {
if (process.platform === 'darwin') {
@@ -151,8 +171,56 @@ var createTemplate = function(mainWindow) {
focusedWindow.toggleDevTools();
}
}
}, ]
}]
});
const window_menu = {
label: '&Window',
submenu: [{
label: 'Minimize',
accelerator: 'CmdOrCtrl+M',
click: function(item, focusedWindow) {
if (focusedWindow) {
focusedWindow.minimize();
}
}
}, {
label: 'Close',
accelerator: 'CmdOrCtrl+W',
click: function(item, focusedWindow) {
if (focusedWindow) {
focusedWindow.close();
}
}
}, {
type: 'separator'
}, ...config.teams.slice(0, 9).map((team, i) => {
return {
label: team.name,
accelerator: `CmdOrCtrl+${i + 1}`,
click: (item, focusedWindow) => {
mainWindow.show(); // for OS X
mainWindow.webContents.send('switch-tab', i);
}
};
}), separatorItem, {
label: 'Select Next Team',
accelerator: (process.platform === 'darwin') ? 'Alt+Cmd+Right' : 'CmdOrCtrl+Tab',
click: () => {
mainWindow.webContents.send('select-next-tab');
},
enabled: (config.teams.length > 1)
}, {
label: 'Select Previous Team',
accelerator: (process.platform === 'darwin') ? 'Alt+Cmd+Left' : 'CmdOrCtrl+Shift+Tab',
click: () => {
mainWindow.webContents.send('select-previous-tab');
},
enabled: (config.teams.length > 1)
}]
}
template.push(window_menu);
template.push({
label: '&Help',
submenu: [{
@@ -163,8 +231,8 @@ var createTemplate = function(mainWindow) {
return template;
};
var createMenu = function(mainWindow) {
return Menu.buildFromTemplate(createTemplate(mainWindow));
var createMenu = function(mainWindow, config) {
return Menu.buildFromTemplate(createTemplate(mainWindow, config));
};
module.exports = {

View File

@@ -15,6 +15,7 @@
"dependencies": {
"auto-launch": "^2.0.1",
"bootstrap": "^3.3.6",
"electron-squirrel-startup": "^1.0.0",
"os-locale": "^1.4.0",
"react": "^15.0.1",
"react-bootstrap": "~0.29.0",

Binary file not shown.

After

Width:  |  Height:  |  Size: 440 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 913 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 520 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 480 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1023 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 487 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1002 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 522 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 497 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 735 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 715 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

View File

@@ -1,7 +1,14 @@
'use strict';
const chai = require('chai');
const chaiAsPromised = require('chai-as-promised');
chai.should();
chai.use(chaiAsPromised);
const path = require('path');
const webdriverio = require('webdriverio');
const Application = require('spectron').Application;
const source_root_dir = path.join(__dirname, '../..');
const electron_binary_path = (function() {
@@ -13,29 +20,27 @@ const electron_binary_path = (function() {
return path.join(source_root_dir, 'node_modules/electron-prebuilt/dist/electron' + exe_extension);
}
})();
const config_file_path = path.join(source_root_dir, 'test_config.json');
const config_file_path = path.join(source_root_dir, 'test/test_config.json');
const mattermost_url = 'http://example.com/team';
var options = {
host: 'localhost', // Use localhost as chrome driver server
port: 9515, // "9515" is the port opened by chrome driver.
desiredCapabilities: {
browserName: 'chrome',
chromeOptions: {
binary: electron_binary_path, // Path to your Electron binary.
args: ['app=' + path.join(source_root_dir, 'dist'), '--config-file=' + config_file_path] // Optional, perhaps 'app=' + /path/to/your/app/
}
}
};
module.exports = {
sourceRootDir: source_root_dir,
configFilePath: config_file_path,
mattermostURL: mattermost_url,
spawnChromeDriver: function() {
return require('child_process').spawn('node_modules/chromedriver/lib/chromedriver/chromedriver', ['--url-base=wd/hub', '--port=9515']);
getSpectronApp: function() {
const app = new Application({
path: electron_binary_path,
args: [`${path.join(source_root_dir, 'dist')}`, '--config-file=' + config_file_path]
});
chaiAsPromised.transferPromiseness = app.transferPromiseness
return app;
},
getWebDriverIoClient: function() {
return webdriverio.remote(options);
shouldTestForPlatforms: function(testCase, platforms) {
if (platforms.indexOf(process.platform) !== -1) {
return;
}
else {
testCase.skip();
}
}
}

View File

@@ -1,6 +1,5 @@
'use strict';
const should = require('should');
const path = require('path');
const fs = require('fs');
@@ -9,49 +8,43 @@ const env = require('../modules/environment');
describe('application', function() {
this.timeout(10000);
var chromedriver;
var client;
before(function(done) {
chromedriver = env.spawnChromeDriver();
client = env.getWebDriverIoClient();
fs.unlink(env.configFilePath, function(err) {
// waiting for chromedriver
setTimeout(done, 1000);
beforeEach(function(done) {
this.app = env.getSpectronApp();
fs.unlink(env.configFilePath, () => {
done();
});
});
afterEach(function() {
return client.end();
if (this.app && this.app.isRunning()) {
return this.app.stop()
}
});
after(function() {
chromedriver.kill();
it('should show a window', function() {
return this.app.start().then(() => {
return this.app.client.waitUntilWindowLoaded()
.getWindowCount().should.eventually.equal(1)
.browserWindow.isDevToolsOpened().should.eventually.be.false
.browserWindow.isVisible().should.eventually.be.true
});
});
it('should show settings.html when there is no config file', function() {
return client
.init()
.pause(1000)
.getUrl().then(function(url) {
var p = path.parse(url);
p.base.should.equal('settings.html');
})
.end();
return this.app.start().then(() => {
return this.app.client.waitUntilWindowLoaded()
.getUrl().should.eventually.match(/\/settings.html$/)
});
});
it('should show index.html when there is config file', function() {
fs.writeFileSync(env.configFilePath, JSON.stringify({
url: env.mattermostURL
}));
return client
.init()
.pause(1000)
.getUrl().then(function(url) {
var p = path.parse(url);
p.base.should.equal('index.html');
})
.end();
return this.app.start().then(() => {
return this.app.client.waitUntilWindowLoaded()
.getUrl().should.eventually.match(/\/index.html$/)
});
});
it('should upgrade v0 config file', function() {
@@ -59,17 +52,13 @@ describe('application', function() {
fs.writeFileSync(env.configFilePath, JSON.stringify({
url: env.mattermostURL
}));
return client
.init()
.pause(1000)
.getUrl().then(function(url) {
var p = path.parse(url);
p.base.should.equal('index.html');
})
.end().then(function() {
var str = fs.readFileSync(env.configFilePath, 'utf8');
var config = JSON.parse(str);
config.version.should.equal(settings.version);
});
return this.app.start().then(() => {
return this.app.client.waitUntilWindowLoaded()
.getUrl().should.eventually.match(/\/index.html$/)
}).then(function() {
var str = fs.readFileSync(env.configFilePath, 'utf8');
var config = JSON.parse(str);
config.version.should.equal(settings.version);
});
});
});

View File

@@ -1,6 +1,5 @@
'use strict';
const should = require('should');
const path = require('path');
const fs = require('fs');
@@ -20,87 +19,49 @@ describe('browser/index.html', function() {
}]
};
var chromedriver;
var client;
before(function(done) {
chromedriver = env.spawnChromeDriver();
client = env.getWebDriverIoClient();
fs.unlink(env.configFilePath, function(err) {
// waiting for chromedriver
setTimeout(done, 1000);
});
});
beforeEach(function() {
fs.writeFileSync(env.configFilePath, JSON.stringify(config));
this.app = env.getSpectronApp();
return this.app.start();
});
afterEach(function() {
return client.end();
});
after(function() {
chromedriver.kill();
if (this.app && this.app.isRunning()) {
return this.app.stop()
}
});
it('should NOT show tabs when there is one team', function() {
fs.writeFileSync(env.configFilePath, JSON.stringify({
url: env.mattermostURL
}));
return client
.init()
.isExisting('#tabBar').then(function(isExisting) {
isExisting.should.be.false();
})
.end();
return this.app.restart().then(() => {
return this.app.client.waitUntilWindowLoaded()
.isExisting('#tabBar').should.eventually.be.false
});
});
it('should set src of webview from config file', function() {
return client
.init()
.getAttribute('#mattermostView0', 'src').then(function(attribute) {
attribute.should.equal(config.teams[0].url);
})
.getAttribute('#mattermostView1', 'src').then(function(attribute) {
attribute.should.equal(config.teams[1].url);
})
.isExisting('#mattermostView2').then(function(isExisting) {
isExisting.should.be.false();
})
.end();
return this.app.client.waitUntilWindowLoaded()
.getAttribute('#mattermostView0', 'src').should.eventually.equal(config.teams[0].url)
.getAttribute('#mattermostView1', 'src').should.eventually.equal(config.teams[1].url)
.isExisting('#mattermostView2').should.eventually.be.false
});
it('should set name of tab from config file', function() {
return client
.init()
.getText('#teamTabItem0').then(function(text) {
text.should.equal(config.teams[0].name);
})
.getText('#teamTabItem1').then(function(text) {
text.should.equal(config.teams[1].name);
})
.isExisting('#teamTabItem2').then(function(isExisting) {
isExisting.should.be.false();
})
.end();
return this.app.client.waitUntilWindowLoaded()
.getText('#teamTabItem0').should.eventually.equal(config.teams[0].name)
.getText('#teamTabItem1').should.eventually.equal(config.teams[1].name)
});
it('should show only the selected team', function() {
return client
.init()
.pause(1000)
.waitForVisible('#mattermostView0', 1000)
.isVisible('#mattermostView1').then(function(visility) {
visility.should.be.false();
})
return this.app.client.waitUntilWindowLoaded()
.isVisible('#mattermostView0').should.eventually.be.true
.isVisible('#mattermostView1').should.eventually.be.false
.click('#teamTabItem1')
.pause(1000)
.waitForVisible('#mattermostView1', 1000)
.isVisible('#mattermostView0').then(function(visility) {
visility.should.be.false();
})
.end();
.isVisible('#mattermostView1').should.eventually.be.true
.isVisible('#mattermostView0').should.eventually.be.false
});
it('should show error when using incorrect URL', function() {
@@ -112,9 +73,9 @@ describe('browser/index.html', function() {
url: 'http://false'
}]
}));
return client
.init()
.waitForVisible('#mattermostView0-fail', 20000)
.end();
return this.app.restart().then(() => {
return this.app.client.waitUntilWindowLoaded()
.waitForVisible('#mattermostView0-fail', 20000)
});
});
});

View File

@@ -1,6 +1,5 @@
'use strict';
const should = require('should');
const path = require('path');
const fs = require('fs');
@@ -8,8 +7,8 @@ const env = require('../../modules/environment');
function initClient(client) {
return client
.init()
.url('file://' + path.join(env.sourceRootDir, 'dist/browser/settings.html'));
.url('file://' + path.join(env.sourceRootDir, 'dist/browser/settings.html'))
.waitUntilWindowLoaded();
}
describe('browser/settings.html', function() {
@@ -26,96 +25,68 @@ describe('browser/settings.html', function() {
}]
};
var chromedriver;
var client;
before(function(done) {
chromedriver = env.spawnChromeDriver();
client = env.getWebDriverIoClient();
fs.unlink(env.configFilePath, function(err) {
// waiting for chromedriver
setTimeout(done, 1000);
});
});
beforeEach(function() {
fs.writeFileSync(env.configFilePath, JSON.stringify(config));
this.app = env.getSpectronApp();
return this.app.start();
});
afterEach(function() {
return client.end();
});
after(function() {
chromedriver.kill();
if (this.app && this.app.isRunning()) {
return this.app.stop()
}
});
it('should show index.thml when Cancel button is clicked', function() {
return initClient(client)
.waitForExist('#btnCancel')
return initClient(this.app.client)
.click('#btnCancel')
.pause(1000)
.getUrl().then(function(url) {
var url_split = url.split('/');
url_split[url_split.length - 1].should.equal('index.html');
})
.end();
.getUrl().should.eventually.match(/\/index.html$/)
});
it('should show index.thml when Save button is clicked', function() {
return initClient(client)
.waitForExist('#btnSave')
return initClient(this.app.client)
.click('#btnSave')
.pause(1000)
.getUrl().then(function(url) {
var url_split = url.split('/');
url_split[url_split.length - 1].should.equal('index.html');
})
.end();
.getUrl().should.eventually.match(/\/index.html$/)
});
describe('Options', function() {
describe('Hide Menu Bar', function() {
it('should appear on win32 or linux', function() {
return initClient(client)
.isExisting('#inputHideMenuBar').then(function(isExisting) {
if (process.platform === 'win32' || process.platform === 'linux') {
isExisting.should.be.true();
}
else {
isExisting.should.be.false();
}
})
.end();
const expected = (process.platform === 'win32' || process.platform === 'linux');
return initClient(this.app.client)
.isExisting('#inputHideMenuBar').should.eventually.equal(expected)
});
if (process.platform === 'win32' || process.platform === 'linux') {
[true, false].forEach(function(v) {
it(`should be loaded from config: ${v}`, function() {
var new_config = {};
Object.assign(new_config, config);
new_config.hideMenuBar = v;
fs.writeFileSync(env.configFilePath, JSON.stringify(new_config));
return initClient(client)
.isSelected('#inputHideMenuBar input').then(function(value) {
value.should.equal(v);
})
.end();
[true, false].forEach(function(v) {
it(`should be loaded from config: ${v}`, function() {
env.shouldTestForPlatforms(this, ['win32', 'linux']);
var new_config = {};
Object.assign(new_config, config);
new_config.hideMenuBar = v;
fs.writeFileSync(env.configFilePath, JSON.stringify(new_config));
return this.app.restart().then(() => {
return initClient(this.app.client)
.isSelected('#inputHideMenuBar input').should.eventually.equal(v)
.browserWindow.isMenuBarAutoHide().should.eventually.equal(v);
});
});
});
it('should be saved as config.json', function() {
return initClient(client)
.click('#inputHideMenuBar input')
.click('#btnSave')
.pause(1000)
.then(function() {
const saved_config = JSON.parse(fs.readFileSync(env.configFilePath, 'utf8'));
saved_config.hideMenuBar.should.be.true();
})
.end();
});
}
it('should be saved as config.json', function() {
env.shouldTestForPlatforms(this, ['win32', 'linux']);
return this.app.restart().then(() => {
return initClient(this.app.client)
.click('#inputHideMenuBar input')
.click('#btnSave')
.pause(1000)
})
.then(() => {
const saved_config = JSON.parse(fs.readFileSync(env.configFilePath, 'utf8'));
saved_config.hideMenuBar.should.be.true;
});
});
});
});
});

View File

@@ -1,4 +1,3 @@
const should = require('should');
const fs = require('fs');
const settings = require('../../src/common/settings');