From 060c1cf8e7191fb886a85704c22113e112503e96 Mon Sep 17 00:00:00 2001 From: Eduardo Bart Date: Mon, 26 Mar 2012 19:24:01 -0300 Subject: [PATCH] ui changes * create UIResizeBorder * restore miniwindow * scroll fixes --- modules/client_terminal/terminal.lua | 4 + modules/client_terminal/terminal.otui | 14 +- modules/core_lib/core_lib.otmod | 1 + modules/core_lib/widgets/uiresizeborder.lua | 88 ++++++++ modules/core_lib/widgets/uisplitter.lua | 2 + modules/core_styles/styles/splitters.otui | 9 + modules/game/game.otmod | 2 + modules/game/gameinterface.otui | 2 +- modules/game/styles/miniwindow.otui | 31 ++- modules/game/widgets/uiminiwindow.lua | 36 ++++ .../game/widgets/uiminiwindowcontainer.lua | 4 + modules/game_inventory/inventory.lua | 2 +- modules/game_inventory/inventory.otui | 194 +++++++++--------- src/framework/ui/uianchorlayout.cpp | 18 +- src/framework/ui/uiwidget.cpp | 24 ++- src/framework/ui/uiwidget.h | 1 + 16 files changed, 325 insertions(+), 107 deletions(-) create mode 100644 modules/core_lib/widgets/uiresizeborder.lua create mode 100644 modules/core_styles/styles/splitters.otui create mode 100644 modules/game/widgets/uiminiwindow.lua diff --git a/modules/client_terminal/terminal.lua b/modules/client_terminal/terminal.lua index d423fb79..69d3dfa4 100644 --- a/modules/client_terminal/terminal.lua +++ b/modules/client_terminal/terminal.lua @@ -114,11 +114,15 @@ function Terminal.init() terminalWindow.onDoubleClick = function(self) if poped then self:fill('parent') + self:getChildById('bottomResizeBorder'):disable() + self:getChildById('rightResizeBorder'):disable() poped = false else self:breakAnchors() self:resize(g_window.getWidth()/2, g_window.getHeight()/2) self:move(g_window.getWidth()/2, g_window.getHeight()/2) + self:getChildById('bottomResizeBorder'):enable() + self:getChildById('rightResizeBorder'):enable() poped = true end end diff --git a/modules/client_terminal/terminal.otui b/modules/client_terminal/terminal.otui index 62c71d07..7d306e39 100644 --- a/modules/client_terminal/terminal.otui +++ b/modules/client_terminal/terminal.otui @@ -41,4 +41,16 @@ UIWindow margin-left: 5 font: terminus-14px-bold - + ResizeBorder + id: bottomResizeBorder + anchors.bottom: parent.bottom + anchors.left: parent.left + anchors.right: parent.right + enabled: false + + ResizeBorder + id: rightResizeBorder + anchors.right: parent.right + anchors.top: parent.top + anchors.bottom: parent.bottom + enabled: false diff --git a/modules/core_lib/core_lib.otmod b/modules/core_lib/core_lib.otmod index 9a3d8c57..70d166e1 100644 --- a/modules/core_lib/core_lib.otmod +++ b/modules/core_lib/core_lib.otmod @@ -42,4 +42,5 @@ Module dofile 'widgets/uisplitter' dofile 'widgets/uiscrollbar' dofile 'widgets/uiscrollarea' + dofile 'widgets/uiresizeborder' diff --git a/modules/core_lib/widgets/uiresizeborder.lua b/modules/core_lib/widgets/uiresizeborder.lua new file mode 100644 index 00000000..7139fe51 --- /dev/null +++ b/modules/core_lib/widgets/uiresizeborder.lua @@ -0,0 +1,88 @@ +UIResizeBorder = extends(UIWidget) + +function UIResizeBorder.create() + local resizeborder = UIResizeBorder.internalCreate() + resizeborder:setFocusable(false) + resizeborder.minimum = 0 + resizeborder.maximum = 1000 + return resizeborder +end + +function UIResizeBorder:onHoverChange(hovered) + if hovered then + if self:getWidth() > self:getHeight() then + Mouse.setVerticalCursor() + self.vertical = true + else + Mouse.setHorizontalCursor() + self.vertical = false + end + if not self:isPressed() then + Effects.fadeIn(self) + end + else + if not self:isPressed() then + Mouse.restoreCursor() + Effects.fadeOut(self) + end + end +end + +function UIResizeBorder:onMouseMove(mousePos, mouseMoved) + if self:isPressed() then + if self.vertical then + local delta = mousePos.y - self:getY() - self:getHeight()/2 + local parent = self:getParent() + local newsize = math.min(math.max(parent:getHeight() + delta, self.minimum), self.maximum) + if newsize ~= currentMargin then + self.newsize = newsize + if not self.event or self.event:isExecuted() then + self.event = addEvent(function() + parent:setHeight(self.newsize) + end) + end + end + else + local delta = mousePos.x - self:getX() - self:getWidth()/2 + local parent = self:getParent() + local newsize = math.min(math.max(parent:getWidth() + delta, self.minimum), self.maximum) + if newsize ~= currentMargin then + self.newsize = newsize + if not self.event or self.event:isExecuted() then + self.event = addEvent(function() + parent:setWidth(self.newsize) + end) + end + end + end + return true + end +end + +function UIResizeBorder:onMouseRelease(mousePos, mouseButton) + if not self:isHovered() then + Mouse.restoreCursor() + Effects.fadeOut(self) + end +end + +function UIResizeBorder:onStyleApply(styleName, styleNode) + for name,value in pairs(styleNode) do + if name == 'maximum' then + self:setMaximum(tonumber(value)) + elseif name == 'minimum' then + self:setMinimum(tonumber(value)) + end + end +end + +function UIResizeBorder:setMaximum(maximum) + self.maximum = maximum +end + +function UIResizeBorder:setMinimum(minimum) + self.minimum = minimum +end + +function UIResizeBorder:getMaximum() return self.maximum end +function UIResizeBorder:getMinimum() return self.minimum end \ No newline at end of file diff --git a/modules/core_lib/widgets/uisplitter.lua b/modules/core_lib/widgets/uisplitter.lua index 26ab2f2d..871b980c 100644 --- a/modules/core_lib/widgets/uisplitter.lua +++ b/modules/core_lib/widgets/uisplitter.lua @@ -33,6 +33,7 @@ function UISplitter:onMouseMove(mousePos, mouseMoved) if self.vertical then local delta = mousePos.y - self:getY() - self:getHeight()/2 local newMargin = self:canUpdateMargin(self:getMarginBottom() - delta) + local currentMargin = self:getMarginBottom() if newMargin ~= currentMargin then self.newMargin = newMargin if not self.event or self.event:isExecuted() then @@ -44,6 +45,7 @@ function UISplitter:onMouseMove(mousePos, mouseMoved) else local delta = mousePos.x - self:getX() - self:getWidth()/2 local newMargin = self:canUpdateMargin(self:getMarginRight() - delta) + local currentMargin = self:getMarginRight() if newMargin ~= currentMargin then self.newMargin = newMargin if not self.event or self.event:isExecuted() then diff --git a/modules/core_styles/styles/splitters.otui b/modules/core_styles/styles/splitters.otui new file mode 100644 index 00000000..ca9a4f6f --- /dev/null +++ b/modules/core_styles/styles/splitters.otui @@ -0,0 +1,9 @@ +Splitter < UISplitter + size: 4 4 + opacity: 0 + background: #ffffff44 + +ResizeBorder < UIResizeBorder + size: 4 4 + opacity: 0 + background: #ffffff44 \ No newline at end of file diff --git a/modules/game/game.otmod b/modules/game/game.otmod index 53d26ae4..017b88b2 100644 --- a/modules/game/game.otmod +++ b/modules/game/game.otmod @@ -30,6 +30,8 @@ Module dofile 'widgets/uigamemap' dofile 'widgets/uiitem' + dofile 'widgets/uiminiwindow' + dofile 'widgets/uiminiwindowcontainer' dofile 'creature' dofile 'player' diff --git a/modules/game/gameinterface.otui b/modules/game/gameinterface.otui index 29e34bba..d68117cd 100644 --- a/modules/game/gameinterface.otui +++ b/modules/game/gameinterface.otui @@ -1,4 +1,4 @@ -GameSidePanel < Panel +GameSidePanel < UIMiniWindowContainer image-source: images/sidepanel.png image-border: 4 diff --git a/modules/game/styles/miniwindow.otui b/modules/game/styles/miniwindow.otui index b9d042b2..dcb6f5fb 100644 --- a/modules/game/styles/miniwindow.otui +++ b/modules/game/styles/miniwindow.otui @@ -10,14 +10,39 @@ MiniWindow < UIMiniWindow margin-left: 6 margin-right: 6 move-policy: free updated - image-source: /core_styles/styles/images/mini_window.png + image-source: /game/images/miniwindow.png image-border: 4 image-border-top: 23 - padding: 25 8 2 8 + image-border-left: 23 $on: height: 24 image-border-bottom: 1 + ResizeBorder + id: bottomResizeBorder + anchors.bottom: parent.bottom + anchors.left: parent.left + anchors.right: parent.right + height: 2 + margin-bottom: 1 + minimum: 70 + + VerticalScrollBar + id: miniwindowScrollBar + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.right: parent.right + step: 14 + margin-top: 22 + margin-right: 2 + margin-bottom: 2 + fade-effect: false + +MiniWindowContents < ScrollablePanel + anchors.fill: parent + padding: 25 21 2 8 + vertical-scrollbar: miniwindowScrollBar + BorderlessGameWindow < UIWindow - focusable: false \ No newline at end of file + focusable: false diff --git a/modules/game/widgets/uiminiwindow.lua b/modules/game/widgets/uiminiwindow.lua new file mode 100644 index 00000000..1293a0d2 --- /dev/null +++ b/modules/game/widgets/uiminiwindow.lua @@ -0,0 +1,36 @@ +UIMiniWindow = extends(UIWindow) + +function UIMiniWindow.create() + local miniwindow = UIMiniWindow.internalCreate() + return miniwindow +end + +function UIMiniWindow:onDragEnter(mousePos) + local parent = self:getParent() + if not parent then return false end + + if parent:getClassName() == 'UIMiniWindowContainer' then + local containerParent = parent:getParent() + parent:removeChild(self) + containerParent:addChild(self) + end + + local oldPos = self:getPosition() + self.movingReference = { x = mousePos.x - oldPos.x, y = mousePos.y - oldPos.y } + self:setPosition(oldPos) + return true +end + +function UIMiniWindow:onDragLeave(droppedWidget, mousePos) + -- TODO: drop on other interfaces +end + +function UIMiniWindow:onFocusChange(focused) + -- miniwindows only raises when its outside MiniWindowContainers + if not focused then return end + local parent = self:getParent() + if parent and parent:getClassName() ~= 'UIMiniWindowContainer' then + self:raise() + end +end + diff --git a/modules/game/widgets/uiminiwindowcontainer.lua b/modules/game/widgets/uiminiwindowcontainer.lua index 7f9dbec2..944bfd8c 100644 --- a/modules/game/widgets/uiminiwindowcontainer.lua +++ b/modules/game/widgets/uiminiwindowcontainer.lua @@ -7,6 +7,10 @@ function UIMiniWindowContainer.create() return container end +function UIMiniWindowContainer:onDrop(widget, mousePos) + print 'drop' +end + function UIMiniWindowContainer:getClassName() return 'UIMiniWindowContainer' end diff --git a/modules/game_inventory/inventory.lua b/modules/game_inventory/inventory.lua index 168a96d0..673b48a6 100644 --- a/modules/game_inventory/inventory.lua +++ b/modules/game_inventory/inventory.lua @@ -13,7 +13,7 @@ function Inventory.init() Keyboard.bindKeyDown('Ctrl+I', Inventory.toggle) - inventoryWindow = displayUI('inventory.otui', GameInterface.getRightPanel()) + inventoryWindow = displayUI('inventory.otui', GameInterface.getRightPanel()):getChildById('inventoryWindow') inventoryButton = TopMenu.addGameToggleButton('inventoryButton', 'Inventory (Ctrl+I)', 'inventory.png', Inventory.toggle) inventoryButton:setOn(true) diff --git a/modules/game_inventory/inventory.otui b/modules/game_inventory/inventory.otui index 59125ffc..dce5182c 100644 --- a/modules/game_inventory/inventory.otui +++ b/modules/game_inventory/inventory.otui @@ -1,111 +1,113 @@ -BorderlessGameWindow - id: inventoryWindow +MiniWindow + text: Inventory + icon: inventory.png width: 192 height: 154 - margin-top: 10 - margin-left: 6 - margin-right: 6 - Item - // head - id: slot1 - anchors.top: parent.top - anchors.horizontalCenter: parent.horizontalCenter - &position: {x=65535, y=1, z=0} + MiniWindowContents + id: inventoryWindow - Item - // armor - id: slot4 - anchors.top: prev.bottom - anchors.horizontalCenter: prev.horizontalCenter - margin-top: 5 - &position: {x=65535, y=4, z=0} + Item + // head + id: slot1 + anchors.top: parent.top + anchors.horizontalCenter: parent.horizontalCenter + &position: {x=65535, y=1, z=0} - Item - // legs - id: slot7 - anchors.top: prev.bottom - anchors.horizontalCenter: prev.horizontalCenter - margin-top: 5 - &position: {x=65535, y=7, z=0} + Item + // armor + id: slot4 + anchors.top: prev.bottom + anchors.horizontalCenter: prev.horizontalCenter + margin-top: 5 + &position: {x=65535, y=4, z=0} - Item - // feet - id: slot8 - anchors.top: prev.bottom - anchors.horizontalCenter: prev.horizontalCenter - margin-top: 5 - &position: {x=65535, y=8, z=0} + Item + // legs + id: slot7 + anchors.top: prev.bottom + anchors.horizontalCenter: prev.horizontalCenter + margin-top: 5 + &position: {x=65535, y=7, z=0} - Item - // necklace - id: slot2 - anchors.top: parent.top - anchors.right: slot1.left - margin-top: 10 - margin-right: 5 - &position: {x=65535, y=2, z=0} + Item + // feet + id: slot8 + anchors.top: prev.bottom + anchors.horizontalCenter: prev.horizontalCenter + margin-top: 5 + margin-bottom: 10 + &position: {x=65535, y=8, z=0} - Item - // left - id: slot6 - anchors.top: prev.bottom - anchors.horizontalCenter: prev.horizontalCenter - margin-top: 5 - &position: {x=65535, y=6, z=0} + Item + // necklace + id: slot2 + anchors.top: parent.top + anchors.right: slot1.left + margin-top: 10 + margin-right: 5 + &position: {x=65535, y=2, z=0} - Item - // ring - id: slot9 - anchors.top: prev.bottom - anchors.horizontalCenter: prev.horizontalCenter - margin-top: 5 - &position: {x=65535, y=9, z=0} + Item + // left + id: slot6 + anchors.top: prev.bottom + anchors.horizontalCenter: prev.horizontalCenter + margin-top: 5 + &position: {x=65535, y=6, z=0} - Item - // backpack - id: slot3 - anchors.top: parent.top - anchors.left: slot1.right - margin-top: 10 - margin-left: 5 - &position: {x=65535, y=3, z=0} + Item + // ring + id: slot9 + anchors.top: prev.bottom + anchors.horizontalCenter: prev.horizontalCenter + margin-top: 5 + &position: {x=65535, y=9, z=0} - Item - // right - id: slot5 - anchors.top: prev.bottom - anchors.horizontalCenter: prev.horizontalCenter - margin-top: 5 - &position: {x=65535, y=5, z=0} + Item + // backpack + id: slot3 + anchors.top: parent.top + anchors.left: slot1.right + margin-top: 10 + margin-left: 5 + &position: {x=65535, y=3, z=0} - Item - // ammo - id: slot10 - anchors.top: prev.bottom - anchors.horizontalCenter: prev.horizontalCenter - margin-top: 5 - &position: {x=65535, y=10, z=0} + Item + // right + id: slot5 + anchors.top: prev.bottom + anchors.horizontalCenter: prev.horizontalCenter + margin-top: 5 + &position: {x=65535, y=5, z=0} - GameLabel - id: soul - anchors.top: slot9.bottom - anchors.bottom: slot8.bottom - anchors.left: slot9.left - anchors.right: slot9.right - margin-top: 5 - text-align: center - image-source: /core_styles/styles/images/panel_flat.png - image-border: 1 + Item + // ammo + id: slot10 + anchors.top: prev.bottom + anchors.horizontalCenter: prev.horizontalCenter + margin-top: 5 + &position: {x=65535, y=10, z=0} - GameLabel - id: capacity - anchors.top: slot10.bottom - anchors.bottom: slot8.bottom - anchors.left: slot10.left - anchors.right: slot10.right - margin-top: 5 - text-align: center - image-source: /core_styles/styles/images/panel_flat.png - image-border: 1 + GameLabel + id: soul + anchors.top: slot9.bottom + anchors.bottom: slot8.bottom + anchors.left: slot9.left + anchors.right: slot9.right + margin-top: 5 + text-align: center + image-source: /core_styles/styles/images/panel_flat.png + image-border: 1 + + GameLabel + id: capacity + anchors.top: slot10.bottom + anchors.bottom: slot8.bottom + anchors.left: slot10.left + anchors.right: slot10.right + margin-top: 5 + text-align: center + image-source: /core_styles/styles/images/panel_flat.png + image-border: 1 diff --git a/src/framework/ui/uianchorlayout.cpp b/src/framework/ui/uianchorlayout.cpp index d28011af..4a2fa6f7 100644 --- a/src/framework/ui/uianchorlayout.cpp +++ b/src/framework/ui/uianchorlayout.cpp @@ -155,6 +155,23 @@ void UIAnchorLayout::updateWidget(const UIWidgetPtr& widget, UIAnchorGroup& anch break; } + if(hookedWidget == parentWidget) { + switch(anchor.getHookedEdge()) { + case Fw::AnchorLeft: + case Fw::AnchorRight: + case Fw::AnchorHorizontalCenter: + point -= parentWidget->getVirtualOffset().x; + break; + case Fw::AnchorBottom: + case Fw::AnchorTop: + case Fw::AnchorVerticalCenter: + point -= parentWidget->getVirtualOffset().y; + break; + default: + break; + } + } + switch(anchor.getAnchoredEdge()) { case Fw::AnchorHorizontalCenter: newRect.moveHorizontalCenter(point + widget->getMarginLeft() - widget->getMarginRight()); @@ -197,7 +214,6 @@ void UIAnchorLayout::updateWidget(const UIWidgetPtr& widget, UIAnchorGroup& anch } } - newRect.translate(-parentWidget->getVirtualOffset()); widget->setRect(newRect); anchorGroup.setUpdated(true); } diff --git a/src/framework/ui/uiwidget.cpp b/src/framework/ui/uiwidget.cpp index 02ca1c85..87d88515 100644 --- a/src/framework/ui/uiwidget.cpp +++ b/src/framework/ui/uiwidget.cpp @@ -902,19 +902,35 @@ Rect UIWidget::getClippingRect() return rect; } +Rect UIWidget::getMarginRect() +{ + Rect rect = m_rect; + rect.expand(m_margin.top, m_margin.right, m_margin.bottom, m_margin.left); + return rect; +} + Rect UIWidget::getChildrenRect() { Rect childrenRect; for(const UIWidgetPtr& child : m_children) { - if(!child->isExplicitlyVisible() || !child->getRect().isValid() || child->getOpacity() == 0.0f) + if(!child->isExplicitlyVisible() || !child->getRect().isValid()) continue; + Rect marginRect = child->getMarginRect(); if(!childrenRect.isValid()) - childrenRect = child->getRect(); + childrenRect = marginRect; else - childrenRect = childrenRect.united(child->getRect()); + childrenRect = childrenRect.united(marginRect); } + + Rect myClippingRect = getClippingRect(); if(!childrenRect.isValid()) - childrenRect = getClippingRect(); + childrenRect = myClippingRect; + else { + if(childrenRect.width() < myClippingRect.width()) + childrenRect.setWidth(myClippingRect.width()); + if(childrenRect.height() < myClippingRect.height()) + childrenRect.setHeight(myClippingRect.height()); + } return childrenRect; } diff --git a/src/framework/ui/uiwidget.h b/src/framework/ui/uiwidget.h index 289f4bfb..530d4706 100644 --- a/src/framework/ui/uiwidget.h +++ b/src/framework/ui/uiwidget.h @@ -134,6 +134,7 @@ public: bool hasChild(const UIWidgetPtr& child); int getChildIndex(const UIWidgetPtr& child); Rect getClippingRect(); + Rect getMarginRect(); Rect getChildrenRect(); UIAnchorLayoutPtr getAnchoredLayout(); UIWidgetPtr getRootParent();