From 5b65088426688f94630d15938f32354af17f2921 Mon Sep 17 00:00:00 2001 From: Eduardo Bart Date: Thu, 24 Jan 2013 15:45:26 -0200 Subject: [PATCH] Improve tab navigation and scrolling * Fix with use with over creatures when you are over force use objects * Fix textedit wrapping --- modules/corelib/ui/uimovabletabbar.lua | 76 ++++++++++++++---------- modules/corelib/ui/uiscrollbar.lua | 31 +++++++--- modules/game_interface/gameinterface.lua | 1 + src/client/tile.cpp | 7 +-- src/framework/ui/uitextedit.cpp | 4 +- 5 files changed, 73 insertions(+), 46 deletions(-) diff --git a/modules/corelib/ui/uimovabletabbar.lua b/modules/corelib/ui/uimovabletabbar.lua index c2c03a66..dbddec70 100644 --- a/modules/corelib/ui/uimovabletabbar.lua +++ b/modules/corelib/ui/uimovabletabbar.lua @@ -11,17 +11,42 @@ local function updateMargins(tabBar, ignored) local currentMargin = 0 for i = 1, #tabBar.tabs do - if tabBar.tabs[i] ~= ignored then - if i == 1 then - tabBar.tabs[i]:setMarginLeft(0) - else - tabBar.tabs[i]:setMarginLeft(tabBar.tabSpacing * (i - 1) + currentMargin) - end + tabBar.tabs[i]:setMarginLeft(currentMargin) + currentMargin = currentMargin + tabBar.tabSpacing + tabBar.tabs[i]:getWidth() + end +end + +local function updateIndexes(tabBar, tab, xoff) + local tabs = tabBar.tabs + local currentMargin = 0 + local prevIndex = table.find(tabs, tab) + local newIndex = prevIndex + local xmid = xoff + tab:getWidth()/2 + for i = 1, #tabs do + local nextTab = tabs[i] + if xmid >= currentMargin + nextTab:getWidth()/2 then + newIndex = table.find(tabs, nextTab) end - currentMargin = currentMargin + tabBar.tabs[i]:getWidth() + currentMargin = currentMargin + tabBar.tabSpacing * (i - 1) + tabBar.tabs[i]:getWidth() + end + if newIndex ~= prevIndex then + table.remove(tabs, table.find(tabs, tab)) + table.insert(tabs, newIndex, tab) end end +local function getMaxMargin(tabBar, tab) + if #tabBar.tabs == 0 then return end + + local maxMargin = 0 + for i = 1, #tabBar.tabs do + if tabBar.tabs[i] ~= tab then + maxMargin = maxMargin + tabBar.tabs[i]:getWidth() + end + end + return maxMargin + tabBar.tabSpacing * (#tabBar.tabs- 1) +end + local function onTabMousePress(tab, mousePos, mouseButton) if mouseButton == MouseRightButton then if tab.menuCallback then tab.menuCallback(tab, mousePos, mouseButton) end @@ -29,8 +54,9 @@ local function onTabMousePress(tab, mousePos, mouseButton) end end -local function onTabDragEnter(tab) +local function onTabDragEnter(tab, mousePos) tab:raise() + tab.hotSpot = mousePos.x - tab:getMarginLeft() tab.tabBar.selected = tab return true end @@ -43,29 +69,17 @@ end local function onTabDragMove(tab, mousePos, mouseMoved) if tab == tab.tabBar.selected then - local newMargin = tab:getMarginLeft() + mouseMoved.x - if newMargin >= -tab.tabBar.tabSpacing and newMargin < tab.tabBar:getWidth() - tab:getWidth() then - tab:setMarginLeft(newMargin) - end + local xoff = mousePos.x - tab.hotSpot - local tabs = tab.tabBar.tabs - local lastMargin = -tab.tabBar.tabSpacing - for i = 1, #tabs do - local nextMargin = tabs[i + 1] and (tabs[i + 1] == tab and (tabs[i]:getMarginLeft() + tabs[i]:getWidth() + tab.tabBar.tabSpacing) or tabs[i + 1]:getMarginLeft()) or tab.tabBar:getWidth() - if (tab:getMarginLeft()+(tabs[i]:getWidth()/2)) >= lastMargin and (tab:getMarginLeft()+(tabs[i]:getWidth()/2)) < 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, tab) - break - else - updateMargins(tab.tabBar, tab) - break - end - end - lastMargin = tab.tabBar.tabs[i]:getMarginLeft() == 0 and -tab.tabBar.tabSpacing or tab.tabBar.tabs[i]:getMarginLeft() - end + -- update indexes + updateIndexes(tab.tabBar, tab, xoff) + updateIndexes(tab.tabBar, tab, xoff) + + -- update margins + updateMargins(tab.tabBar) + xoff = math.max(xoff, 0) + xoff = math.min(xoff, getMaxMargin(tab.tabBar, tab)) + tab:setMarginLeft(xoff) end end @@ -81,7 +95,7 @@ function UIMoveableTabBar.create() tabbar:setFocusable(false) tabbar.tabs = {} tabbar.selected = nil -- dragged tab - tabbar.tabSpacing = 5 + tabbar.tabSpacing = 0 tabbar.tabsMoveable = false return tabbar end diff --git a/modules/corelib/ui/uiscrollbar.lua b/modules/corelib/ui/uiscrollbar.lua index 73007029..a9b3fca3 100644 --- a/modules/corelib/ui/uiscrollbar.lua +++ b/modules/corelib/ui/uiscrollbar.lua @@ -82,18 +82,30 @@ local function updateSlider(self) end end -local function parseSliderPos(self, pos, move) - local point, delta +local function parseSliderPos(self, slider, pos, move) + local delta, hotDistance if self.orientation == 'vertical' then - point = pos.y delta = move.y + hotDistance = pos.y - slider:getY() else - point = pos.x delta = move.x + hotDistance = pos.x - slider:getX() + end + + if (delta > 0 and hotDistance + delta > self.hotDistance) or + (delta < 0 and hotDistance + delta < self.hotDistance) then + local range, pxrange, px, offset, center = calcValues(self) + local newvalue = self.value + delta * (range / (pxrange - px)) + self:setValue(newvalue) + end +end + +local function parseSliderPress(self, slider, pos, button) + if self.orientation == 'vertical' then + self.hotDistance = pos.y - slider:getY() + else + self.hotDistance = pos.x - slider:getX() end - local range, pxrange, px, offset, center = calcValues(self) - local newvalue = self.value + delta * (range / (pxrange - px)) - self:setValue(newvalue) end -- public functions @@ -114,10 +126,11 @@ end function UIScrollBar:onSetup() self.setupDone = true - --signalcall(self.onValueChange, self, self.value) + local sliderButton = self:getChildById('sliderButton') g_mouse.bindAutoPress(self:getChildById('decrementButton'), function() self:decrement() end, 300) g_mouse.bindAutoPress(self:getChildById('incrementButton'), function() self:increment() end, 300) - g_mouse.bindPressMove(self:getChildById('sliderButton'), function(mousePos, mouseMoved) parseSliderPos(self, mousePos, mouseMoved) end) + g_mouse.bindPressMove(sliderButton, function(mousePos, mouseMoved) parseSliderPos(self, sliderButton, mousePos, mouseMoved) end) + g_mouse.bindPress(sliderButton, function(mousePos, mouseButton) parseSliderPress(self, sliderButton, mousePos, mouseButton) end) updateSlider(self) end diff --git a/modules/game_interface/gameinterface.lua b/modules/game_interface/gameinterface.lua index 93139816..5f023f15 100644 --- a/modules/game_interface/gameinterface.lua +++ b/modules/game_interface/gameinterface.lua @@ -311,6 +311,7 @@ function onUseWith(clickedWidget, mousePosition) if clickedWidget:getClassName() == 'UIMap' then local tile = clickedWidget:getTile(mousePosition) if tile then + print('use on' .. tile:getTopMultiUseThing():getClassName()) g_game.useWith(selectedThing, tile:getTopMultiUseThing()) end elseif clickedWidget:getClassName() == 'UIItem' and not clickedWidget:isVirtual() then diff --git a/src/client/tile.cpp b/src/client/tile.cpp index af5c082f..03c9208c 100644 --- a/src/client/tile.cpp +++ b/src/client/tile.cpp @@ -449,15 +449,15 @@ ThingPtr Tile::getTopMultiUseThing() if(isEmpty()) return nullptr; + if(CreaturePtr topCreature = getTopCreature()) + return topCreature; + for(uint i = 0; i < m_things.size(); ++i) { ThingPtr thing = m_things[i]; if(thing->isForceUse()) return thing; } - if(CreaturePtr topCreature = getTopCreature()) - return topCreature; - for(uint i = 0; i < m_things.size(); ++i) { ThingPtr thing = m_things[i]; if(!thing->isGround() && !thing->isGroundBorder() && !thing->isOnBottom() && !thing->isOnTop()) { @@ -467,7 +467,6 @@ ThingPtr Tile::getTopMultiUseThing() } } - for(uint i = 0; i < m_things.size(); ++i) { ThingPtr thing = m_things[i]; if(!thing->isGround() && !thing->isGroundBorder() && !thing->isOnTop()) diff --git a/src/framework/ui/uitextedit.cpp b/src/framework/ui/uitextedit.cpp index 98b5d831..747659a9 100644 --- a/src/framework/ui/uitextedit.cpp +++ b/src/framework/ui/uitextedit.cpp @@ -480,7 +480,7 @@ std::string UITextEdit::cut() void UITextEdit::wrapText() { - setText(m_font->wrapText(m_text, getPaddingRect().width())); + setText(m_font->wrapText(m_text, getPaddingRect().width() - m_textOffset.x)); } void UITextEdit::moveCursorHorizontally(bool right) @@ -552,7 +552,7 @@ std::string UITextEdit::getDisplayedText() text = m_text; if(m_textWrap && m_rect.isValid()) - text = m_font->wrapText(text, getWidth() - m_textOffset.x); + text = m_font->wrapText(text, getPaddingRect().width() - m_textOffset.x); return text; }