Browse Source

Ajout calcul nombre premier et modification config

Arthur Brandao 5 years ago
parent
commit
3658dbb1b8

+ 1 - 4
app/main/application-menu.js

@@ -34,10 +34,7 @@ let template = [
     submenu: [
       {
         label: 'Calcul nombre premier',
-        click: () => {
-          console.log('prime-number');
-          demo.primeNumber();
-        }
+        click: demo.primeNumber
       },
       {
         label: 'Reduire l\'application',

+ 2 - 1
app/main/context-menu.js

@@ -1,4 +1,5 @@
 const { Menu, MenuItem, app } = require('electron');
+const config = require('../../config');
 const func = require('./function/menu');
 
 const menu = new Menu();
@@ -14,7 +15,7 @@ menu.append(new MenuItem({type: 'separator'}));
 menu.append(new MenuItem({
     label: 'Exporter en markdown',
     type: 'checkbox',
-    checked: false,
+    checked: config.defaultExportToMarkdown,
     click: () => {
         exportToMd = !exportToMd;
     }

+ 26 - 17
app/main/function/demo-application-menu.js

@@ -13,23 +13,32 @@ demoMenu.primeNumberPopup = function () {
 };
 
 demoMenu.primeNumber = function () {
-    // Only one calc at the same time
-    if (hiddenWindow) {
-        return;
-    }
-    //const number = 409291;
-    const number = 12000000003;
-    // Wait prime number is calculated
-    ipcMain.once('prime-number-result', (event, result) => {
-        let message = `Le nombre ${number} ` + (result ? 'est premier' : 'n\'est pas premier'); 
-        dialog.message('Résultat du test de primalité', message);
-        hiddenWindow.close();
-    });
-    //Create hidden window to calc prime number
-    hiddenWindow = window.hidden(path.join(__dirname, '../../renderer/page/prime-number/prime-number.html'));
-    // Send number to test when window is ready
-    hiddenWindow.on('ready-to-show', () => {
-        hiddenWindow.webContents.send('calc-prime-number', number);
+    // demand number to the user
+    dialog.custom(path.join(__dirname, '../../renderer/page/dialog/dialog.html'), number => {
+        //number = 409291;
+        //number = 12000000003;
+        // If no answer
+        if (!number) {
+            return;
+        }
+        // Only one calc at the same time
+        if (hiddenWindow) {
+            dialog.error('Un calcul est déjà en cours', 'Impossible de calculer plusieurs nombre premier en même temps');
+            return;
+        }
+        // Wait prime number is calculated
+        ipcMain.once('prime-number-result', (event, result) => {
+            let message = `Le nombre ${number} ` + (result ? 'est premier' : 'n\'est pas premier'); 
+            dialog.message('Résultat du test de primalité', message);
+            hiddenWindow.close();
+            hiddenWindow = null;
+        });
+        //Create hidden window to calc prime number
+        hiddenWindow = window.hidden(path.join(__dirname, '../../renderer/page/prime-number/prime-number.html'));
+        // Send number to test when window is ready
+        hiddenWindow.on('ready-to-show', () => {
+            hiddenWindow.webContents.send('calc-prime-number', number);
+        });
     });
 };
 

+ 33 - 1
app/main/function/dialog.js

@@ -1,4 +1,6 @@
-const {dialog} = require('electron');
+const {dialog, ipcMain} = require('electron');
+const window = require('../../../helper/window');
+const config = require('../../../config');
 const dlg = {};
 
 dlg.messagePromise = function(title, content, type = '', buttons = ['Ok'], defaultButton = 0, attach = true) {
@@ -52,4 +54,34 @@ dlg.error = function (title, content) {
     dialog.showErrorBox(title, content);
 }
 
+dlg.customPromise = function (file) {
+    let win = null;
+    return new Promise(resolve => {
+        // Genererate key for answer
+        const key = '-' + Math.random().toString(36).substr(2, 9);
+        // Wait win answser
+        ipcMain.once('dialog-answer' + key, (arg, answer) => {
+            win.close();
+            resolve(answer);
+        });
+        // Create win
+        win = window.frameless(file, mainWindow, config.dialog.width, config.dialog.height);
+        // When win is ready send the key
+        win.on('focus', () => {
+            setTimeout(() => {
+                win.webContents.send('dialog-key', key);
+            }, 500);
+        })
+    });
+}
+
+dlg.custom = function (file, callback) {
+    const promise = dlg.customPromise(file);
+    if (callback) {
+        promise.then(data => {
+            callback(data);
+        });
+    }
+}
+
 module.exports = dlg;

+ 45 - 0
app/renderer/page/dialog/dialog.html

@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <meta charset="UTF-8">
+        <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
+        <link type="text/css" rel="stylesheet" href="../../common/css/material-icons.css"/>  
+        <link type="text/css" rel="stylesheet" href="../../common/css/materialize.min.css"  media="screen,projection"/>
+        <link type="text/css" rel="stylesheet" href="../../common/css/style.min.css"  media="screen,projection"/>
+        <title>Electronotes</title>
+    </head>
+    <body class="grey lighten-4">
+        <main class="contianer">
+            <div class="row mtop-2">
+                <div class="col s12 center-align">
+                    Veuilliez entrer un nombre pour tester si il est premier.<br/>
+                    Le calcul ce fait en tache de fond et l'application continue a être disponible.<br/>
+                    Pour que le calcul prenne un peu de temps il est recommandé de choisir un nombre autour de 10000000000 (10 milliards).
+                </div>
+            </div>
+            <div class="row">
+                <div class="input-field col s12 m8 offset-m2">
+                    <input id="number" type="number">
+                    <label for="number">Nombre à tester</label>
+                </div>
+            </div>
+            <div class="row">
+                <div class="col s12 m6 center-align mtop-1">
+                    <button class="waves-effect waves-light blue btn-large" onclick="closeWindow()"><i class="material-icons right">close</i>Fermer</button>
+                </div>
+                <div class="col s12 m6 center-align mtop-1">
+                    <button class="waves-effect waves-light blue btn-large" onclick="validate()"><i class="material-icons right">send</i>Valider</button>
+                </div>
+            </div>
+        </main>
+                
+        <!-- Load electronotes.js first to have all functions and commons imports -->
+        <script type="text/javascript" src="../../common/js/electronotes.js"></script>
+        <!-- Load other common files -->
+        <script type="text/javascript" src="../../common/js/event.js"></script>
+        <script type="text/javascript" src="../../common/js/binder.js"></script>
+        <script type="text/javascript" src="../../common/js/materialize.min.js"></script>
+        <!-- Load personnal js -->
+        <script type="text/javascript" src="dialog.js"></script>
+    </body>
+</html>

+ 35 - 0
app/renderer/page/dialog/dialog.js

@@ -0,0 +1,35 @@
+let answerKey = '';
+
+ipcRenderer.once('dialog-key', (event, key) => {
+    answerKey = key;
+})
+
+function closeWindow() {
+    ipcRenderer.send('dialog-answer' + answerKey, false);
+    remote.getCurrentWindow().close();
+}
+
+function validate() {
+    if(!$('#number').val()) {
+        M.toast({
+            html: 'Le nombre est invalide',
+            classes: 'red'
+        });
+    } else if (('' + parseInt($('#number').val())) !== $('#number').val()) {
+        M.toast({
+            html: 'Le nombre n\'est pas un entier',
+            classes: 'red'
+        });
+    } else if (parseInt($('#number').val()) < 1) {
+        M.toast({
+            html: 'Le nombre doit être un entier positif',
+            classes: 'red'
+        });
+    } else {
+        send(parseInt($('#number').val()));
+    }
+}
+
+function send(number) {
+    ipcRenderer.send('dialog-answer' + answerKey, number);
+}

+ 6 - 1
config.json

@@ -2,5 +2,10 @@
     "window": {
         "width": 1200,
         "height": 720
-    }
+    },
+    "dialog": {
+        "width": 700,
+        "height": 320
+    },
+    "defaultExportToMarkdown": true
 }

+ 24 - 0
helper/window.js

@@ -52,4 +52,28 @@ window.simple = function (file, width, height) {
     return win;
 }
 
+window.frameless = function (file, parent, width, height) {
+    // Default values
+    width = width ? width : config.window.width;
+    height = height ? height : config.window.height;
+    // Options
+    const opts = {
+        width: width,
+        height: height,
+        frame: false,
+        icon: path.join(__dirname, '../electronotes.png'),
+        webPreferences: {
+            nodeIntegration: true
+        }
+    }
+    // Add parent if have one
+    if (parent) {
+        opts.parent = parent;
+    }
+    // New window
+    const win = new BrowserWindow (opts);
+    win.loadFile(file);
+    return win;
+}
+
 module.exports = window;

+ 2 - 1
main.js

@@ -1,4 +1,5 @@
 const { app, BrowserWindow } = require('electron');
+const config = require('./config');
 const file = require('./helper/file');
 const window = require('./helper/window');
 const path = require('path');
@@ -17,7 +18,7 @@ if (require('electron-squirrel-startup')) { // eslint-disable-line global-requir
 // Global var
 global.mainWindow;
 global.exportToMd;
-exportToMd = false;
+exportToMd = config.defaultExportToMarkdown;
 let launchInfo;
 let indexFile = 'index.html';