From c5437d8e0f967fbb4c2caa25033dc136b9464605 Mon Sep 17 00:00:00 2001 From: Glenn Slotte Date: Tue, 21 Jan 2020 03:42:24 +0100 Subject: [PATCH] Warn when closing window with unsaved changes (#1230) * add MessageBox component * use element instead of string as message, since lacking rich text * refactor: replace Buffers.ofBufferOpt with Option.map * add actions * trigger modal from canQuit callback * model * behaviour * view --- src/Components/MessageBox.re | 71 ++++++++++++++++++++ src/Model/Actions.re | 4 ++ src/Model/Buffers.re | 15 ++--- src/Model/Modal.re | 2 + src/Model/State.re | 2 + src/Store/LifecycleStoreConnector.re | 52 +++++++++++---- src/Store/StoreThread.re | 13 ++++ src/UI/Modals.re | 98 ++++++++++++++++++++++++++++ src/UI/Root.re | 56 +++++++++------- src/bin_editor/Oni2_editor.re | 2 +- 10 files changed, 267 insertions(+), 48 deletions(-) create mode 100644 src/Components/MessageBox.re create mode 100644 src/Model/Modal.re create mode 100644 src/UI/Modals.re diff --git a/src/Components/MessageBox.re b/src/Components/MessageBox.re new file mode 100644 index 0000000000..a0e6d6d2c9 --- /dev/null +++ b/src/Components/MessageBox.re @@ -0,0 +1,71 @@ +open Oni_Core; + +open Revery.UI; +open Revery.UI.Components; + +type action('msg) = { + label: string, + msg: 'msg, +}; + +module Styles = { + open Style; + + let container = (~theme: Theme.t) => [backgroundColor(theme.background)]; + + let message = [ + padding(20), + paddingBottom(30) // I don't know why this is needed, but it is + ]; + + let actions = [flexDirection(`Row)]; + + let buttonOuter = (~isHovered, ~theme: Theme.t) => [ + isHovered + ? backgroundColor(theme.menuSelectionBackground) + : backgroundColor(theme.editorBackground), + flexGrow(1), + ]; + + let buttonInner = [padding(10)]; + + let buttonText = (~isHovered, ~theme: Theme.t, ~font: UiFont.t) => [ + fontFamily(font.fontFile), + color(theme.foreground), + isHovered + ? backgroundColor(theme.menuSelectionBackground) + : backgroundColor(theme.editorBackground), + fontSize(14), + alignSelf(`Center), + ]; +}; + +let%component button = (~text, ~onClick, ~theme, ~font, ()) => { + let%hook (isHovered, setHovered) = Hooks.state(false); + + + setHovered(_ => true)} + onMouseOut={_ => setHovered(_ => false)} + style=Styles.buttonInner> + + + ; +}; + +let make = (~children as message, ~theme, ~font, ~actions, ~onAction, ()) => + + message + + {actions + |> List.map(action => +