Просмотр исходного кода

Adding widget resized event which can be used to absolutely size/position widgets, possibly overlapping

Josh Engebretson 9 лет назад
Родитель
Сommit
ddf521669f

+ 42 - 0
Resources/EditorData/AtomicEditor/editor/ui/scenetoolbar.tb.txt

@@ -0,0 +1,42 @@
+definitions
+	menubutton
+		lp: height: 28, width: 28
+		skin TBButton.uniformflat
+TBLayout: distribution: gravity, spacing: 4
+	TBButton
+		@include definitions>menubutton
+		TBSkinImage: skin: PlayButton, id: skin_image
+		id maintoolbar_play
+		tooltip Play project
+	TBButton
+		@include definitions>menubutton
+		TBSkinImage: skin: PauseButton, id: skin_image
+		id maintoolbar_pause
+		tooltip Pause/Resume playing project
+	TBButton
+		@include definitions>menubutton
+		TBSkinImage: skin: StepButton, id: skin_image
+		id maintoolbar_step
+		tooltip Step paused project 1 frame
+	TBLayout: gravity: left right
+		TBWidget	
+	TBButton: toggle-mode: 1
+		@include definitions>menubutton
+		TBSkinImage: skin: 3DTranslateBitmap
+		id 3d_translate
+		tooltip Translate
+	TBButton: toggle-mode: 1
+		@include definitions>menubutton
+		TBSkinImage: skin: 3DRotateBitmap
+		id 3d_rotate
+		tooltip Rotate
+	TBButton: toggle-mode: 1
+		@include definitions>menubutton
+		TBSkinImage: skin: 3DScaleBitmap
+		id 3d_scale
+		tooltip Scale
+	TBButton: toggle-mode: 1
+		lp: width: 64
+		text: "Local"
+		id 3d_axismode
+		tooltip Effect world or local object

+ 26 - 1
Script/AtomicEditor/ui/resourceEditors/Scene3dResourceEditorBuilder.ts

@@ -21,6 +21,28 @@
 //
 import EditorEvents = require("../../editor/EditorEvents");
 
+class SceneToolbar extends Atomic.UIWidget {
+
+    constructor(parent: Atomic.UIWidget) {
+
+        super();
+
+        this.load("AtomicEditor/editor/ui/scenetoolbar.tb.txt");
+
+        parent.addChild(this);
+
+        this.subscribeToEvent(parent, "WidgetResized", (ev:Atomic.UIWidgetResizedEvent) => {
+
+          this.setPosition(0,0);
+          this.setSize(parent.width, 32);
+
+        });
+
+    }
+}
+
+
+
 export default class Scene3dResourceEditorBuilder implements Editor.Extensions.ResourceEditorBuilder {
 
     canHandleResource(resourcePath: string) : boolean {
@@ -28,9 +50,12 @@ export default class Scene3dResourceEditorBuilder implements Editor.Extensions.R
         return ext == ".scene";
     }
 
-    getEditor(resourceFram: Atomic.UIWidget, resourcePath: string, tabContainer: Atomic.UITabContainer) : Editor.ResourceEditor {
+    getEditor(resourceFrame: Atomic.UIWidget, resourcePath: string, tabContainer: Atomic.UITabContainer) : Editor.ResourceEditor {
 
         const editor = new Editor.SceneEditor3D(resourcePath, tabContainer);
+
+        let toolbar = new SceneToolbar(editor.sceneView3D);
+
         editor.sendEvent(EditorEvents.ActiveSceneEditorChange, { sceneEditor: editor });
 
         return editor;

+ 8 - 0
Script/TypeScript/AtomicWork.d.ts

@@ -192,6 +192,14 @@ declare module Atomic {
         widget: UIWidget;
     }
 
+    export interface UIWidgetResizedEvent {
+        widget: UIWidget;
+        height: number;
+        width: number;
+        oldWidth: number;
+        oldHeight: number;
+    }
+
     export interface UIWidgetDeletedEvent {
 
         widget: UIWidget;

+ 9 - 0
Source/Atomic/UI/UIEvents.h

@@ -66,6 +66,15 @@ ATOMIC_EVENT(E_WIDGETFOCUSCHANGED, WidgetFocusChanged)
 }
 
 
+ATOMIC_EVENT(E_WIDGETRESIZED, WidgetResized)
+{
+    ATOMIC_PARAM(P_WIDGET, Widget);        // UIWidget pointer
+    ATOMIC_PARAM(P_WIDTH, Width);          // int
+    ATOMIC_PARAM(P_HEIGHT, Height);        // int
+    ATOMIC_PARAM(P_OLDWIDTH, OldWidth);    // int
+    ATOMIC_PARAM(P_OLDHEIGHT, OldHeight);  // int
+}
+
 ATOMIC_EVENT(E_WIDGETDELETED, WidgetDeleted)
 {
     ATOMIC_PARAM(P_WIDGET, Widget);             // UIWidget pointer

+ 14 - 0
Source/Atomic/UI/UIWidget.cpp

@@ -1204,4 +1204,18 @@ IntVector2 UIWidget::ConvertFromRoot(const IntVector2 position) const
     return result;
 }
 
+void UIWidget::OnResized(int oldWidth, int oldHeight)
+{
+    VariantMap eventData;
+
+    using namespace WidgetResized;
+    eventData[P_WIDGET] = this;
+    eventData[P_WIDTH] = widget_->GetRect().w;
+    eventData[P_HEIGHT] = widget_->GetRect().h;
+    eventData[P_OLDWIDTH] = oldWidth;
+    eventData[P_OLDHEIGHT] = oldHeight;
+
+    SendEvent(E_WIDGETRESIZED, eventData);
+}
+
 }

+ 5 - 2
Source/Atomic/UI/UIWidget.h

@@ -212,8 +212,7 @@ class UIWidget : public Object, public tb::TBWidgetDelegate
 
 
     /// Set focus to first widget which accepts it
-    void SetFocusRecursive();
-    void OnFocusChanged(bool focused);
+    void SetFocusRecursive();    
 
     void SetState(UI_WIDGET_STATE state, bool on);
     bool GetState(UI_WIDGET_STATE state);
@@ -332,8 +331,12 @@ protected:
 
     void SetWidget(tb::TBWidget* widget);
 
+    // TBWidgetDelegate methods
     virtual bool OnEvent(const tb::TBWidgetEvent &ev);
     virtual void OnDelete();
+    void OnFocusChanged(bool focused);
+    virtual void OnResized(int oldWidth, int oldHeight);
+
 
     String id_;
     tb::TBWidget* widget_;

+ 5 - 0
Source/ThirdParty/TurboBadger/tb_layout.cpp

@@ -482,6 +482,11 @@ void TBLayout::OnResized(int old_w, int old_h)
     InvalidateLayout(INVALIDATE_LAYOUT_TARGET_ONLY);
     SizeConstraints sc(GetRect().w, GetRect().h);
     ValidateLayout(sc);
+
+    TBWidgetDelegate* delegate = GetDelegate();
+
+    if (delegate)
+        delegate->OnResized(old_w, old_h);
 }
 
 void TBLayout::OnInflateChild(TBWidget *child)

+ 3 - 0
Source/ThirdParty/TurboBadger/tb_widgets.cpp

@@ -890,6 +890,9 @@ void TBWidget::OnResized(int old_w, int old_h)
 
         child->SetRect(rect);
     }
+
+    if (m_delegate)
+        m_delegate->OnResized(old_w, old_h);
 }
 
 void TBWidget::OnInflateChild(TBWidget *child)

+ 1 - 0
Source/ThirdParty/TurboBadger/tb_widgets.h

@@ -350,6 +350,7 @@ public:
     virtual bool OnEvent(const TBWidgetEvent &ev) = 0;
     virtual void OnFocusChanged(bool focused) = 0;
     virtual void OnDelete() = 0;
+    virtual void OnResized(int oldWidth, int oldHeight) = 0;
 };
 
 /** The base TBWidget class.