Moveable Tabbars, Stretch/Shrink Fix

Added key 'moveable' to tabbars
(tabbars are ordered with margins now, not with anchors to the previous
widget)

If stretching is forbidden by options the mapPanel will now update when
the window is resized
This commit is contained in:
Samuel 2012-10-10 22:20:32 +02:00
parent 478e796dbd
commit f48fb4343f
5 changed files with 98 additions and 7 deletions

View File

@ -11,13 +11,8 @@ TabBarButton < UIButton
color: #aaaaaa color: #aaaaaa
anchors.top: parent.top anchors.top: parent.top
padding: 5 padding: 5
$first:
anchors.left: parent.left anchors.left: parent.left
$!first:
anchors.left: prev.right
margin-left: 5
$hover !checked: $hover !checked:
image-clip: 0 20 20 20 image-clip: 0 20 20 20

View File

@ -9,7 +9,9 @@ function UISplitter.create()
end end
function UISplitter:onHoverChange(hovered) function UISplitter:onHoverChange(hovered)
if hovered then -- Check if margin can be changed
local margin = (self.vertical and self:getMarginBottom() or self:getMarginRight())
if hovered and (self:canUpdateMargin(margin + 1) ~= margin or self:canUpdateMargin(margin - 1) ~= margin) then
if g_mouse.isCursorChanged() or g_mouse.isPressed() then return end if g_mouse.isCursorChanged() or g_mouse.isPressed() then return end
if self:getWidth() > self:getHeight() then if self:getWidth() > self:getHeight() then
g_mouse.setVerticalCursor() g_mouse.setVerticalCursor()

View File

@ -6,6 +6,60 @@ local function onTabClick(tab)
tab.tabBar:selectTab(tab) tab.tabBar:selectTab(tab)
end end
local function updateMargins(tabBar)
if #tabBar.tabs == 0 then return end
local currentMargin = 0
for i = 1, #tabBar.tabs do
if i == 1 then
tabBar.tabs[i]:setMarginLeft(0)
else
tabBar.tabs[i]:setMarginLeft(5 * (i - 1) + currentMargin)
end
currentMargin = currentMargin + tabBar.tabs[i]:getWidth()
end
end
local function onTabMousePress(tab, mousePos, mouseButton)
if mouseButton == MouseLeftButton and tab.tabBar.tabsMoveable then
tab.tabBar.selected = tab
end
end
local function onTabMouseRelease(tab, mousePos, mouseButton)
local tabs = tab.tabBar.tabs
if tab.tabBar.selected then
local lastMargin = -5
for i = 1, #tabs do
local nextMargin = tabs[i + 1] and (tabs[i + 1] == tab and (tabs[i]:getMarginLeft() + tabs[i]:getWidth() + 5) or tabs[i + 1]:getMarginLeft()) or tab.tabBar:getWidth()
if tab:getMarginLeft() >= lastMargin and tab:getMarginLeft() < nextMargin then
if tabs[i] ~= tab then
local newIndex = table.find(tab.tabBar.tabs, tab.tabBar.tabs[i])
table.remove(tab.tabBar.tabs, table.find(tab.tabBar.tabs, tab))
table.insert(tab.tabBar.tabs, newIndex, tab)
updateMargins(tab.tabBar)
break
else
updateMargins(tab.tabBar)
break
end
end
lastMargin = tab.tabBar.tabs[i]:getMarginLeft() == 0 and -5 or tab.tabBar.tabs[i]:getMarginLeft()
end
end
tab.tabBar.selected = nil
end
local function onTabMouseMove(tab, mousePos, mouseMoved)
if tab == tab.tabBar.selected then
local newMargin = tab:getMarginLeft() + mouseMoved.x
if newMargin >= -5 and newMargin < tab.tabBar:getWidth() - tab:getWidth() then
tab:setMarginLeft(newMargin)
end
end
end
local function tabBlink(tab) local function tabBlink(tab)
if not tab.blinking then return end if not tab.blinking then return end
tab:setOn(not tab:isOn()) tab:setOn(not tab:isOn())
@ -17,6 +71,8 @@ function UITabBar.create()
local tabbar = UITabBar.internalCreate() local tabbar = UITabBar.internalCreate()
tabbar:setFocusable(false) tabbar:setFocusable(false)
tabbar.tabs = {} tabbar.tabs = {}
tabbar.selected = nil -- dragged tab
tabsMoveable = false
return tabbar return tabbar
end end
@ -41,16 +97,52 @@ function UITabBar:addTab(text, panel)
tab:setText(text) tab:setText(text)
tab:setWidth(tab:getTextSize().width + tab:getPaddingLeft() + tab:getPaddingRight()) tab:setWidth(tab:getTextSize().width + tab:getPaddingLeft() + tab:getPaddingRight())
tab.onClick = onTabClick tab.onClick = onTabClick
tab.onMousePress = onTabMousePress
tab.onMouseRelease = onTabMouseRelease
tab.onMouseMove = onTabMouseMove
tab.onDestroy = function() tab.tabPanel:destroy() end tab.onDestroy = function() tab.tabPanel:destroy() end
table.insert(self.tabs, tab) table.insert(self.tabs, tab)
if #self.tabs == 1 then if #self.tabs == 1 then
self:selectTab(tab) self:selectTab(tab)
tab:setMarginLeft(0)
else
local newMargin = 5 * (#self.tabs - 1)
for i = 1, #self.tabs - 1 do
newMargin = newMargin + self.tabs[i]:getWidth()
end
tab:setMarginLeft(newMargin)
end end
return tab return tab
end end
-- Additional function to move the tab by lua
function UITabBar:moveTab(tab, units)
local index = table.find(self.tabs, tab)
if index == nil then return end
local focus = false
if self.currentTab == tab then
self:selectPrevTab()
focus = true
end
table.remove(self.tabs, index)
local newIndex = math.min(#self.tabs+1, math.max(index + units, 1))
table.insert(self.tabs, newIndex, tab)
if focus then self:selectTab(tab) end
updateMargins(self)
return newIndex
end
function UITabBar:onStyleApply(styleName, styleNode)
if styleNode['moveable'] then
self.tabsMoveable = styleNode['moveable']
end
end
function UITabBar:removeTab(tab) function UITabBar:removeTab(tab)
local index = table.find(self.tabs, tab) local index = table.find(self.tabs, tab)
if index == nil then return end if index == nil then return end

View File

@ -78,6 +78,7 @@ Panel
anchors.top: prev.top anchors.top: prev.top
anchors.right: next.left anchors.right: next.left
margin-left: 5 margin-left: 5
moveable: true
TabButton TabButton
id: nextChannelButton id: nextChannelButton

View File

@ -22,6 +22,7 @@ function init()
gameRootPanel = g_ui.displayUI('gameinterface.otui') gameRootPanel = g_ui.displayUI('gameinterface.otui')
gameRootPanel:hide() gameRootPanel:hide()
gameRootPanel:lower() gameRootPanel:lower()
gameRootPanel.onGeometryChange = updateStretchShrink
mouseGrabberWidget = gameRootPanel:getChildById('mouseGrabber') mouseGrabberWidget = gameRootPanel:getChildById('mouseGrabber')
mouseGrabberWidget.onMouseRelease = onMouseGrabberRelease mouseGrabberWidget.onMouseRelease = onMouseGrabberRelease