Skip to content

Commit

Permalink
Add a menu bar to help with discoverability
Browse files Browse the repository at this point in the history
  • Loading branch information
jpmonettas committed Mar 18, 2024
1 parent 08f5b9a commit 704a7e3
Show file tree
Hide file tree
Showing 4 changed files with 88 additions and 60 deletions.
3 changes: 2 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@
- List functions calls
- List prints with the printer
- Multi-thread timeline

- Add a menu bar to help with discoverability
### Changes

- Change Exceptions from a ComboBox to MenuButton
Expand Down
8 changes: 4 additions & 4 deletions deps.edn
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@
io.github.clojure/tools.build {:mvn/version "0.9.4" :exclusions [com.google.guava/guava org.slf4j/slf4j-nop]}
com.github.flow-storm/hansel {:mvn/version "0.1.83"}

org.openjfx/javafx-controls {:mvn/version "21.0.1"}
org.openjfx/javafx-base {:mvn/version "21.0.1"}
org.openjfx/javafx-graphics {:mvn/version "21.0.1"}
org.openjfx/javafx-swing {:mvn/version "21.0.1"}
org.openjfx/javafx-controls {:mvn/version "21.0.3-ea+1"}
org.openjfx/javafx-base {:mvn/version "21.0.3-ea+1"}
org.openjfx/javafx-graphics {:mvn/version "21.0.3-ea+1"}
org.openjfx/javafx-swing {:mvn/version "21.0.3-ea+1"}

org.kordamp.ikonli/ikonli-javafx {:mvn/version "11.5.0"}
org.kordamp.ikonli/ikonli-materialdesign-pack {:mvn/version "11.5.0"}
Expand Down
103 changes: 55 additions & 48 deletions src-dbg/flow_storm/debugger/ui/main.clj
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@

(:require [flow-storm.debugger.ui.utils
:as ui-utils
:refer [label icon-button event-handler h-box progress-indicator progress-bar tab tab-pane border-pane
:refer [label icon-button event-handler h-box v-box progress-indicator progress-bar tab tab-pane border-pane
key-combo-match? menu-button]]
[flow-storm.debugger.ui.flows.screen :as flows-screen]
[flow-storm.debugger.ui.flows.general :as ui-general]
Expand All @@ -40,7 +40,7 @@
[javafx.scene Scene Node]
[javafx.stage Stage]
[javafx.geometry Pos]
[javafx.scene.control ToolBar]
[javafx.scene.control ToolBar MenuBar]
[javafx.application Platform]
[javafx.scene.input KeyCode]))

Expand Down Expand Up @@ -180,16 +180,6 @@
:tooltip "Cancel current running task (search, etc) (Ctrl-g)"
:on-click (fn [] (runtime-api/interrupt-all-tasks rt-api))
:disable true)
clear-btn (icon-button :icon-name "mdi-delete-forever"
:tooltip "Clean all debugger and runtime values references (Ctrl-l)"
:on-click (fn [] (clear-all)))
unblock-threads-btn (icon-button :icon-name "mdi-run"
:tooltip "Unblock all blocked threads if any (Ctrl-u)"
:on-click (fn [] (runtime-api/unblock-all-threads rt-api)))
open-book-btn (ui-utils/icon-button :icon-name "mdi-book"
:on-click (fn []
(bookmarks/show-bookmarks))
:tooltip "Open bookmarks")
quick-jump-textfield (doto (h-box [(label "Quick jump:")
(ui-utils/autocomplete-textfield
(fn []
Expand All @@ -209,11 +199,8 @@
exceptions-box (doto (h-box [(:menu-button exceptions-menu-data)]
"hidden-pane")
(.setAlignment Pos/CENTER_LEFT))
tools [clear-btn
tools [record-btn
task-cancel-btn
record-btn
unblock-threads-btn
open-book-btn
quick-jump-textfield
exceptions-box]]

Expand All @@ -223,6 +210,56 @@
(store-obj "record-btn" record-btn)
(ToolBar. (into-array Node tools))))

(defn- toggle-debug-mode []
(dbg-state/toggle-debug-mode)
(log (format "DEBUG MODE %s" (if (:debug-mode? (dbg-state/debugger-config)) "ENABLED" "DISABLED"))))

(defn- build-menu-bar []
(let [mb (MenuBar.)
view-menu (ui-utils/make-menu {:label "_View"
:items [{:text "Bookmarks"
:on-click (fn [] (bookmarks/show-bookmarks))}
{:text "Toggle theme"
:on-click (fn []
(dbg-state/rotate-theme)
(dbg-state/reset-theming))
:accel {:mods [:ctrl]
:key-code KeyCode/T}}
{:text "Increase font size"
:on-click (fn []
(dbg-state/inc-font-size)
(dbg-state/reset-theming))
:accel {:mods [:ctrl :shift]
:key-code KeyCode/EQUALS}}
{:text "Decrease font size"
:on-click (fn []
(dbg-state/dec-font-size)
(dbg-state/reset-theming))
:accel {:mods [:ctrl]
:key-code KeyCode/MINUS}}
{:text "Toggle debug mode"
:on-click (fn [] (toggle-debug-mode))
:accel {:mods [:ctrl]
:key-code KeyCode/D}}]})
actions-menu (ui-utils/make-menu {:label "_Actions"
:items [{:text "Clear recordings"
:on-click (fn [] (clear-all))
:accel {:mods [:ctrl]
:key-code KeyCode/L}}
{:text "Unblock all threads"
:on-click (fn [] (runtime-api/unblock-all-threads rt-api))
:accel {:mods [:ctrl]
:key-code KeyCode/U}}]})]

(-> mb
.getMenus
(.addAll [view-menu actions-menu]))
mb))

(defn- build-top-bar-pane []
(v-box [(build-menu-bar)
(build-tool-bar-pane)]))

(defn set-task-cancel-btn-enable [enable?]
(ui-utils/run-later
(let [[task-cancel-btn] (obj-lookup "task-cancel-btn")]
Expand All @@ -241,7 +278,7 @@
"mdi-record")))))

(defn- build-main-pane []
(let [mp (border-pane {:top (build-tool-bar-pane)
(let [mp (border-pane {:top (build-top-bar-pane)
:center (main-tabs-pane)
:bottom (bottom-box)})]
(ui-utils/add-class mp "main-pane")
Expand All @@ -260,10 +297,6 @@
(catch Exception e
(log-error "Couldn't start theme listener" e))))

(defn- toggle-debug-mode []
(dbg-state/toggle-debug-mode)
(log (format "DEBUG MODE %s" (if (:debug-mode? (dbg-state/debugger-config)) "ENABLED" "DISABLED"))))

(defn stop-ui []
(let [{:keys [theme-listener]} ui]

Expand Down Expand Up @@ -345,39 +378,13 @@
(doto scene
(.setOnKeyPressed (event-handler
[kev]
(let [key-name (.getName (.getCode kev))
shift? (.isShiftDown kev)]
(let [key-name (.getName (.getCode kev))]

(cond

(key-combo-match? kev "g" [:ctrl])
(runtime-api/interrupt-all-tasks rt-api)

(key-combo-match? kev "l" [:ctrl])
(clear-all)

(key-combo-match? kev "d" [:ctrl])
(toggle-debug-mode)

(key-combo-match? kev "t" [:ctrl])
(do
(dbg-state/rotate-theme)
(dbg-state/reset-theming))

(or (= (.getCode kev) KeyCode/ADD)
(and shift? (= (.getCode kev) KeyCode/EQUALS)))
(do
(dbg-state/inc-font-size)
(dbg-state/reset-theming))

(= KeyCode/MINUS (.getCode kev))
(do
(dbg-state/dec-font-size)
(dbg-state/reset-theming))

(key-combo-match? kev "u" [:ctrl])
(runtime-api/unblock-all-threads rt-api)

(key-combo-match? kev "f" [:shift]) (ui-general/select-main-tools-tab :flows)
(key-combo-match? kev "b" [:shift]) (ui-general/select-main-tools-tab :browser)
(key-combo-match? kev "t" [:shift]) (ui-general/select-main-tools-tab :taps)
Expand Down
34 changes: 27 additions & 7 deletions src-dbg/flow_storm/debugger/ui/utils.clj
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@
(:require [flow-storm.utils :refer [log-error]]
[clojure.string :as str]
[flow-storm.debugger.state :as dbg-state :refer [store-obj obj-lookup]])
(:import [javafx.scene.control Button ContextMenu Label ListView SelectionMode ListCell MenuItem ScrollPane Tab
(:import [javafx.scene.control Button Menu ContextMenu Label ListView SelectionMode ListCell MenuItem ScrollPane Tab
Alert ButtonType Alert$AlertType ProgressIndicator ProgressBar TextField TextArea TableView TableColumn TableCell TableRow
TabPane$TabClosingPolicy TabPane$TabDragPolicy TableColumn$CellDataFeatures TabPane Tooltip MenuButton MenuItem
ComboBox CheckBox TextInputDialog]
[javafx.scene.input KeyCharacterCombination KeyCombination$Modifier KeyCombination]
[javafx.scene.input KeyCharacterCombination KeyCombination$Modifier KeyCombination KeyCodeCombination]
[javafx.scene.layout HBox VBox BorderPane]
[javafx.geometry Side Pos]
[javafx.stage Screen]
Expand Down Expand Up @@ -61,6 +61,11 @@
(defmacro event-handler [arg & body]
`(event-handler* (fn ~(symbol "event-handler-fn") ~arg ~@body)))

(defn- mod-k->key-comb [m]
(case m
:shift KeyCombination/SHIFT_DOWN
:ctrl KeyCombination/CONTROL_DOWN))

(defn make-context-menu [items]
(let [cm (ContextMenu.)
cm-items (->> items
Expand All @@ -72,6 +77,25 @@
(.addAll ^objects (into-array Object cm-items)))
cm))

(defn make-menu [{:keys [label items]}]
(let [menu (Menu. label)
menu-items (->> items
(mapv (fn [{:keys [text on-click accel]}]
(let [mi (MenuItem. text)]
(.setOnAction mi (event-handler [_] (on-click)))
(when accel
(.setAccelerator mi (KeyCodeCombination.
(:key-code accel)
(into-array KeyCombination$Modifier (mapv mod-k->key-comb (:mods accel))))))
mi))))]

(.setMnemonicParsing menu true)

(-> menu
.getItems
(.addAll ^objects (into-array Object menu-items)))
menu))

(defn stage-screen-info [stage]
(let [screen (first
(Screen/getScreensForRectangle (.getX stage)
Expand Down Expand Up @@ -783,11 +807,7 @@
`key-name` should be a stirng with the key name.
`modifiers` should be a collection of modifiers like :ctrl, :shift"
[kev key-name modifiers]
(let [mod-k->key-comb (fn [m]
(case m
:shift KeyCombination/SHIFT_DOWN
:ctrl KeyCombination/CONTROL_DOWN))
k (KeyCharacterCombination. key-name (into-array KeyCombination$Modifier (mapv mod-k->key-comb modifiers)))]
(let [k (KeyCharacterCombination. key-name (into-array KeyCombination$Modifier (mapv mod-k->key-comb modifiers)))]
(.match k kev)))

(defn thread-label [thread-id thread-name]
Expand Down

0 comments on commit 704a7e3

Please sign in to comment.