Flask と Electron で作るデスクトップアプリ ②「デザイン編」

## はじめに
Flask と Electron で作るデスクトップアプリ第2章です。

前回の導入編を見てない人はこちらから
[Flask と Electron で作るデスクトップアプリ ①「導入編」](https://qiita.com/BUU-SAN/items/af3ae2c9835cd06dddc4)

さて、本題に入りまして、今回導入するのがデザインを簡易的にそれっぽくデザインを見せるため、**Bootstrap5**のサンプルを使っていきます。
Bootstrapの使い方なんて分からねーよって人は他の人の紹介している記事かその内、使い方も説明しようかと思います。
公式ドキュメントを見る練習として自分で考えるのもありです。

## Bootstrap5
ここではBootstrapとは何ぞやという説明は省きます。何を使っているかだけ説明します。
今回は[Bootstrap5 の公式サイト](https://getbootstrap.jp/)にあるドキュメントからサンプルのソースコード一部を参照してデザインとして使っています。
もともと用意されている[サンプルページ](https://getbootstrap.jp/docs/5.0/examples/)もありますが、ドキュメントのサンプルから少しずつ組み立てることで構成を理解しやすいと思うので興味がある人は用意されているものではなく一部抜粋のみで構成していきます。


## デザイン
### メニューをデフォルトから自作へ
「setMenuBarVisibility」を js に追加することで上にあるメニューを非表示にします。
```ruby:index.js
app.on('ready', function() {
  PythonShell.run('./app.py');
  const openWindow = function() {
    mainWindow = new BrowserWindow({width: 800, height: 600 });
    mainWindow.setMenuBarVisibility(false); // 追加
    mainWindow.loadURL('http://localhost:5000');
  };
  openWindow();
});
```
Bootstrap の公式の[Navbar](https://getbootstrap.jp/docs/5.0/components/navbar/)から以下のサンプルコードをbodyタグの下に挿入します。
```ruby:index.html
    <div class="collapse" id="navbarToggleExternalContent">
      <div class="bg-dark p-4">
        <h5 class="text-white h4">Collapsed content</h5>
        <span class="text-muted">Toggleable via the navbar brand.</span>
      </div>
    </div>
    <nav class="navbar navbar-dark bg-dark">
      <div class="container-fluid">
        <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarToggleExternalContent" aria-controls="navbarToggleExternalContent" aria-expanded="false" aria-label="Toggle navigation">
          <span class="navbar-toggler-icon"></span>
        </button>
      </div>
    </nav>
```
結果はドーン
![Nav.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1660691/8eed2a71-ae83-c26c-0fd8-b51128682341.png)
左上を押すことで下記のようになります。
iタグを入れれば遷移できるようにもなります。
![Nav_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1660691/08f33be2-ae19-6e99-75eb-dab277daab67.png)


### 全画面表示
こちらはElectronの設定のみです。
kioskモード、全画面表示、フレームOFFの設定を追加。
```ruby:index.js
app.on('ready', function() {
  PythonShell.run('./app.py');
  const openWindow = function() {
    mainWindow = new BrowserWindow({width: 800, height: 600, kiosk: true, 'fullscreen': true, 'frame': false}); // 更新
    mainWindow.setMenuBarVisibility(false);
    mainWindow.loadURL('http://localhost:5000');
  };
  openWindow();
});
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1660691/1819e955-b5d4-03b8-ce0b-2bbb0c0d770c.png)
**おまけ**
常に最前線に表示
```ruby:index.js
mainWindow.setAlwaysOnTop(true, "screen-saver")
```
ワークスペース（デスクトップ）を移動しても表示
```ruby:index.js
mainWindow.setVisibleOnAllWorkspaces(true)
```
### メインの画面から遷移
flask を記載している app.py にルートを追加します。
後はその遷移先を指定してあげればよし。
```ruby:app.py (追記)
@app.route("/dashbord", methods=("GET", "POST"))
def dashboard():
    return render_template("dashboard.html")
```
```ruby:index.html (追記)
   <div class="collapse" id="navbarToggleExternalContent">
      <div class="bg-dark p-4">
        <h5 class="text-white h4">Collapsed content</h5>
        <span class="text-muted">Toggleable via the navbar brand.</span>
        <div><a href="/"  class="btn btn-outline-danger">Home</a></div> // 追加
        <div><a href="/dashboard" class="btn btn-outline-danger">dashboard</a></div> // 追加
      </div>
    </div>
```
+ ボタンを用意したので「dashboard」ボタンを押下すると次の画像へ
![electron_Page1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1660691/74267d52-88f9-37fe-bc6e-e72c2c72e3d1.png)
+ この通りPage2に遷移しました。このようにして複数の画面を使って遷移していきましょう。
![electron_Page2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1660691/24910522-705f-727a-3a9c-5c078c5929d5.png)


### ダークモード
Electronの公式から[ダークモード](https://www.electronjs.org/ja/docs/latest/tutorial/dark-mode)のサンプルです。
構成を割と変えてしまったので、[Github](https://github.com/aburayamakeito/Flask-Electron/tree/main/qiita_sample_dark_mode)に起動できるソースコードを載せているのでそちらを参考にしてください。
ちなみに実行したらこんな感じです。
+ デフォルト
![electron_ノーマルモード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1660691/723c2bc4-fbc9-c36d-e31a-879f0b050871.png)
+ ダークモード
![electron_ダークモード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1660691/d7060cc6-a5e3-372f-3668-0154d5591425.png)



## まとめ
Bootstrap5 と言いつつ Electron の機能使いまくりでした。。
ちょろっと公式ドキュメントから引っ張てくるだけでもこれくらいの機能はあるので、他の機能も興味がある人は調べてみてください！！
どちらの特性も使えることもある意味でいい点ではあると思います。
なぜ、ElectronやFlaskだけの構成だけにせず、ElectronとFlaskの構成にしているのか説明をしていなかったので、説明すると長いので今回は省きますが次回がその次くらいに説明します。
次回はElectronとFlask構成で実際に何か作ってみようかと思います。お楽しみください！！