mirror of
https://github.com/penpot/penpot.git
synced 2025-05-17 04:16:11 +02:00
✨ Add new debug panel
This commit is contained in:
parent
0a69bc03b0
commit
440983d2b9
7 changed files with 227 additions and 7 deletions
|
@ -44,6 +44,17 @@
|
||||||
(mth/to-fixed (.-e this) precision)
|
(mth/to-fixed (.-e this) precision)
|
||||||
(mth/to-fixed (.-f this) precision))))
|
(mth/to-fixed (.-f this) precision))))
|
||||||
|
|
||||||
|
(defn format-precision
|
||||||
|
[mtx precision]
|
||||||
|
(when mtx
|
||||||
|
(dm/fmt "matrix(%, %, %, %, %, %)"
|
||||||
|
(mth/to-fixed (.-a mtx) precision)
|
||||||
|
(mth/to-fixed (.-b mtx) precision)
|
||||||
|
(mth/to-fixed (.-c mtx) precision)
|
||||||
|
(mth/to-fixed (.-d mtx) precision)
|
||||||
|
(mth/to-fixed (.-e mtx) precision)
|
||||||
|
(mth/to-fixed (.-f mtx) precision))))
|
||||||
|
|
||||||
(defn matrix?
|
(defn matrix?
|
||||||
"Return true if `v` is Matrix instance."
|
"Return true if `v` is Matrix instance."
|
||||||
[v]
|
[v]
|
||||||
|
|
|
@ -19,11 +19,13 @@
|
||||||
[app.main.ui.workspace.right-header :refer [right-header]]
|
[app.main.ui.workspace.right-header :refer [right-header]]
|
||||||
[app.main.ui.workspace.sidebar.assets :refer [assets-toolbox]]
|
[app.main.ui.workspace.sidebar.assets :refer [assets-toolbox]]
|
||||||
[app.main.ui.workspace.sidebar.debug :refer [debug-panel]]
|
[app.main.ui.workspace.sidebar.debug :refer [debug-panel]]
|
||||||
|
[app.main.ui.workspace.sidebar.debug-shape-info :refer [debug-shape-info]]
|
||||||
[app.main.ui.workspace.sidebar.history :refer [history-toolbox]]
|
[app.main.ui.workspace.sidebar.history :refer [history-toolbox]]
|
||||||
[app.main.ui.workspace.sidebar.layers :refer [layers-toolbox]]
|
[app.main.ui.workspace.sidebar.layers :refer [layers-toolbox]]
|
||||||
[app.main.ui.workspace.sidebar.options :refer [options-toolbox]]
|
[app.main.ui.workspace.sidebar.options :refer [options-toolbox]]
|
||||||
[app.main.ui.workspace.sidebar.shortcuts :refer [shortcuts-container]]
|
[app.main.ui.workspace.sidebar.shortcuts :refer [shortcuts-container]]
|
||||||
[app.main.ui.workspace.sidebar.sitemap :refer [sitemap]]
|
[app.main.ui.workspace.sidebar.sitemap :refer [sitemap]]
|
||||||
|
[app.util.debug :as dbg]
|
||||||
[app.util.i18n :refer [tr]]
|
[app.util.i18n :refer [tr]]
|
||||||
[app.util.object :as obj]
|
[app.util.object :as obj]
|
||||||
[rumext.v2 :as mf]))
|
[rumext.v2 :as mf]))
|
||||||
|
@ -134,10 +136,11 @@
|
||||||
current-section* (mf/use-state :info)
|
current-section* (mf/use-state :info)
|
||||||
current-section (deref current-section*)
|
current-section (deref current-section*)
|
||||||
|
|
||||||
can-be-expanded? (and (not is-comments?)
|
can-be-expanded? (or (dbg/enabled? :shape-panel)
|
||||||
|
(and (not is-comments?)
|
||||||
(not is-history?)
|
(not is-history?)
|
||||||
is-inspect?
|
is-inspect?
|
||||||
(= current-section :code))
|
(= current-section :code)))
|
||||||
|
|
||||||
{:keys [on-pointer-down on-lost-pointer-capture on-pointer-move set-size size]}
|
{:keys [on-pointer-down on-lost-pointer-capture on-pointer-move set-size size]}
|
||||||
(use-resize-hook :code 276 276 768 :x true :right)
|
(use-resize-hook :code 276 276 768 :x true :right)
|
||||||
|
@ -176,6 +179,9 @@
|
||||||
|
|
||||||
[:div {:class (stl/css :settings-bar-inside)}
|
[:div {:class (stl/css :settings-bar-inside)}
|
||||||
(cond
|
(cond
|
||||||
|
(dbg/enabled? :shape-panel)
|
||||||
|
[:& debug-shape-info]
|
||||||
|
|
||||||
(true? is-comments?)
|
(true? is-comments?)
|
||||||
[:& comments-sidebar]
|
[:& comments-sidebar]
|
||||||
|
|
||||||
|
|
|
@ -60,6 +60,7 @@ $width-settings-bar-max: $s-500;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
|
z-index: 0;
|
||||||
&.not-expand {
|
&.not-expand {
|
||||||
max-width: $width-settings-bar;
|
max-width: $width-settings-bar;
|
||||||
}
|
}
|
||||||
|
|
101
frontend/src/app/main/ui/workspace/sidebar/debug_shape_info.cljs
Normal file
101
frontend/src/app/main/ui/workspace/sidebar/debug_shape_info.cljs
Normal file
|
@ -0,0 +1,101 @@
|
||||||
|
;; This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
;; License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
;;
|
||||||
|
;; Copyright (c) KALEIDOS INC
|
||||||
|
|
||||||
|
(ns app.main.ui.workspace.sidebar.debug-shape-info
|
||||||
|
(:require-macros [app.main.style :as stl])
|
||||||
|
(:require
|
||||||
|
[app.common.data :as d]
|
||||||
|
[app.common.data.macros :as dm]
|
||||||
|
[app.common.geom.matrix :as gmt]
|
||||||
|
[app.main.data.workspace :as dw]
|
||||||
|
[app.main.refs :as refs]
|
||||||
|
[app.main.store :as st]
|
||||||
|
[app.main.ui.icons :as i]
|
||||||
|
[debug :as dbg]
|
||||||
|
[rumext.v2 :as mf]))
|
||||||
|
|
||||||
|
(def remove-attrs
|
||||||
|
#{:id :name})
|
||||||
|
|
||||||
|
(def vertical-layout-attrs
|
||||||
|
#{})
|
||||||
|
|
||||||
|
(def custom-renderer
|
||||||
|
{:parent-id :shape-link
|
||||||
|
:frame-id :shape-link
|
||||||
|
:shapes :shape-list
|
||||||
|
:shape-ref :shape-link
|
||||||
|
:transform :matrix-render
|
||||||
|
:transform-inverse :matrix-render
|
||||||
|
:selrect :rect-render
|
||||||
|
:points :points-render})
|
||||||
|
|
||||||
|
(mf/defc shape-link
|
||||||
|
[{:keys [id objects]}]
|
||||||
|
[:a {:class (stl/css :shape-link)
|
||||||
|
:on-click #(st/emit! (dw/select-shape id))}
|
||||||
|
(dm/str (dm/get-in objects [id :name]) " #" id)])
|
||||||
|
|
||||||
|
(mf/defc debug-shape-attr
|
||||||
|
[{:keys [attr value objects]}]
|
||||||
|
|
||||||
|
(case (get custom-renderer attr)
|
||||||
|
:shape-link
|
||||||
|
[:& shape-link {:id value :objects objects}]
|
||||||
|
|
||||||
|
:shape-list
|
||||||
|
[:div {:class (stl/css :shape-list)}
|
||||||
|
(for [id value]
|
||||||
|
[:& shape-link {:id id :objects objects}])]
|
||||||
|
|
||||||
|
:matrix-render
|
||||||
|
[:div (dm/str (gmt/format-precision value 2))]
|
||||||
|
|
||||||
|
:rect-render
|
||||||
|
[:div (dm/fmt "X:% Y:% W:% H:%" (:x value) (:y value) (:width value) (:height value))]
|
||||||
|
|
||||||
|
:points-render
|
||||||
|
[:div {:class (stl/css :point-list)}
|
||||||
|
(for [point value]
|
||||||
|
[:div (dm/fmt "(%, %)" (:x point) (:y point))])]
|
||||||
|
|
||||||
|
[:div {:class (stl/css :attrs-container-value)} (str value)]))
|
||||||
|
|
||||||
|
(mf/defc debug-shape-info
|
||||||
|
[]
|
||||||
|
(let [objects (mf/deref refs/workspace-page-objects)
|
||||||
|
selected (->> (mf/deref refs/selected-shapes)
|
||||||
|
(map (d/getf objects)))]
|
||||||
|
|
||||||
|
[:div {:class (stl/css :shape-info)}
|
||||||
|
[:div {:class (stl/css :shape-info-title)}
|
||||||
|
[:span "Debug"]
|
||||||
|
[:div {:class (stl/css :close-button)
|
||||||
|
:on-click #(dbg/disable! :shape-panel)}
|
||||||
|
i/close-refactor]]
|
||||||
|
|
||||||
|
(if (empty? selected)
|
||||||
|
[:div {:class (stl/css :attrs-container)} "No shapes selected"]
|
||||||
|
(for [[idx current] (d/enumerate selected)]
|
||||||
|
[:div {:class (stl/css :attrs-container) :key (dm/str "shape" idx)}
|
||||||
|
[:div {:class (stl/css :shape-title)}
|
||||||
|
[:div {:class (stl/css :shape-name)} (:name current)]
|
||||||
|
[:button {:on-click #(debug/dump-object (dm/str (:id current)))} "object"]
|
||||||
|
[:button {:on-click #(debug/dump-subtree (dm/str (:id current)) true)} "tree"]]
|
||||||
|
|
||||||
|
[:div {:class (stl/css :shape-attrs)}
|
||||||
|
(let [attrs (->> (keys current)
|
||||||
|
(remove remove-attrs))
|
||||||
|
attrs (concat [:frame-id :parent-id :shapes]
|
||||||
|
(->> attrs (remove #{:frame-id :parent-id :shapes})))]
|
||||||
|
(for [attr attrs]
|
||||||
|
(when-let [value (get current attr)]
|
||||||
|
[:div {:class (stl/css-case :attrs-container-attr true
|
||||||
|
:vertical-layout (contains? vertical-layout-attrs attr))
|
||||||
|
:key (dm/str "att-" idx "-" attr)}
|
||||||
|
[:div {:class (stl/css :attrs-container-name)} (d/name attr)]
|
||||||
|
|
||||||
|
[:& debug-shape-attr {:attr attr :value value :objects objects}]])))]]))]))
|
|
@ -0,0 +1,98 @@
|
||||||
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
//
|
||||||
|
// Copyright (c) KALEIDOS INC
|
||||||
|
|
||||||
|
@import "refactor/common-refactor.scss";
|
||||||
|
|
||||||
|
.shape-info {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
background-color: var(--panel-background-color);
|
||||||
|
color: white;
|
||||||
|
font-size: $fs-12;
|
||||||
|
}
|
||||||
|
|
||||||
|
.shape-info-title {
|
||||||
|
@include flexCenter;
|
||||||
|
@include tabTitleTipography;
|
||||||
|
position: relative;
|
||||||
|
height: $s-32;
|
||||||
|
min-height: $s-32;
|
||||||
|
margin: $s-8 $s-8 0 $s-8;
|
||||||
|
border-radius: $br-8;
|
||||||
|
background-color: var(--panel-title-background-color);
|
||||||
|
|
||||||
|
span {
|
||||||
|
@include flexCenter;
|
||||||
|
flex-grow: 1;
|
||||||
|
color: var(--title-foreground-color-hover);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.close-button {
|
||||||
|
@extend .button-tertiary;
|
||||||
|
position: absolute;
|
||||||
|
right: $s-2;
|
||||||
|
top: $s-2;
|
||||||
|
height: $s-28;
|
||||||
|
width: $s-28;
|
||||||
|
border-radius: $br-6;
|
||||||
|
svg {
|
||||||
|
@extend .button-icon;
|
||||||
|
stroke: var(--icon-foreground);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.attrs-container {
|
||||||
|
padding: $s-16 $s-8;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.shape-title {
|
||||||
|
font-size: $fs-14;
|
||||||
|
padding-bottom: $s-4;
|
||||||
|
background: $db-cuaternary;
|
||||||
|
color: $df-primary;
|
||||||
|
padding: $s-8;
|
||||||
|
border-radius: $s-8;
|
||||||
|
display: flex;
|
||||||
|
gap: $s-4;
|
||||||
|
}
|
||||||
|
.shape-name {
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.attrs-container-attr {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: 25% auto;
|
||||||
|
padding: $s-4 0;
|
||||||
|
|
||||||
|
&.vertical-layout {
|
||||||
|
grid-template-columns: auto;
|
||||||
|
grid-template-rows: auto 1fr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.shape-attrs {
|
||||||
|
overflow: auto;
|
||||||
|
height: calc(100% - 8px);
|
||||||
|
padding-bottom: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.shape-link {
|
||||||
|
color: $df-primary;
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
.shape-list {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: $s-4;
|
||||||
|
}
|
||||||
|
|
||||||
|
.point-list {
|
||||||
|
display: flex;
|
||||||
|
gap: $s-8;
|
||||||
|
}
|
|
@ -77,7 +77,10 @@
|
||||||
:grid-layout
|
:grid-layout
|
||||||
|
|
||||||
;; Show an overlay to the grid cells to know its properties
|
;; Show an overlay to the grid cells to know its properties
|
||||||
:grid-cells})
|
:grid-cells
|
||||||
|
|
||||||
|
;; Show info about shapes
|
||||||
|
:shape-panel})
|
||||||
|
|
||||||
(defn enable!
|
(defn enable!
|
||||||
[option]
|
[option]
|
||||||
|
|
|
@ -57,14 +57,14 @@
|
||||||
:app.main.data.websocket/send-message
|
:app.main.data.websocket/send-message
|
||||||
:app.main.data.workspace.selection/change-hover-state})
|
:app.main.data.workspace.selection/change-hover-state})
|
||||||
|
|
||||||
(defn- enable!
|
(defn enable!
|
||||||
[option]
|
[option]
|
||||||
(dbg/enable! option)
|
(dbg/enable! option)
|
||||||
(when (= :events option)
|
(when (= :events option)
|
||||||
(set! st/*debug-events* true))
|
(set! st/*debug-events* true))
|
||||||
(js* "app.main.reinit()"))
|
(js* "app.main.reinit()"))
|
||||||
|
|
||||||
(defn- disable!
|
(defn disable!
|
||||||
[option]
|
[option]
|
||||||
(dbg/disable! option)
|
(dbg/disable! option)
|
||||||
(when (= :events option)
|
(when (= :events option)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue