Improve tab navigation and scrolling
* Fix with use with over creatures when you are over force use objects * Fix textedit wrapping
This commit is contained in:
		
							parent
							
								
									bc55cbbbd1
								
							
						
					
					
						commit
						5b65088426
					
				| 
						 | 
					@ -11,15 +11,40 @@ local function updateMargins(tabBar, ignored)
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
  local currentMargin = 0
 | 
					  local currentMargin = 0
 | 
				
			||||||
  for i = 1, #tabBar.tabs do
 | 
					  for i = 1, #tabBar.tabs do
 | 
				
			||||||
    if tabBar.tabs[i] ~= ignored then 
 | 
					    tabBar.tabs[i]:setMarginLeft(currentMargin)
 | 
				
			||||||
      if i == 1 then
 | 
					    currentMargin = currentMargin + tabBar.tabSpacing + tabBar.tabs[i]:getWidth()
 | 
				
			||||||
        tabBar.tabs[i]:setMarginLeft(0)
 | 
					 | 
				
			||||||
      else
 | 
					 | 
				
			||||||
        tabBar.tabs[i]:setMarginLeft(tabBar.tabSpacing * (i - 1) + currentMargin)
 | 
					 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
    currentMargin = currentMargin + tabBar.tabs[i]:getWidth()
 | 
					
 | 
				
			||||||
 | 
					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
 | 
					    end
 | 
				
			||||||
 | 
					    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
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
local function onTabMousePress(tab, mousePos, mouseButton)
 | 
					local function onTabMousePress(tab, mousePos, mouseButton)
 | 
				
			||||||
| 
						 | 
					@ -29,8 +54,9 @@ local function onTabMousePress(tab, mousePos, mouseButton)
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
local function onTabDragEnter(tab)
 | 
					local function onTabDragEnter(tab, mousePos)
 | 
				
			||||||
  tab:raise()
 | 
					  tab:raise()
 | 
				
			||||||
 | 
					  tab.hotSpot = mousePos.x - tab:getMarginLeft()
 | 
				
			||||||
  tab.tabBar.selected = tab
 | 
					  tab.tabBar.selected = tab
 | 
				
			||||||
  return true
 | 
					  return true
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
| 
						 | 
					@ -43,29 +69,17 @@ end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
local function onTabDragMove(tab, mousePos, mouseMoved)
 | 
					local function onTabDragMove(tab, mousePos, mouseMoved)
 | 
				
			||||||
  if tab == tab.tabBar.selected then
 | 
					  if tab == tab.tabBar.selected then
 | 
				
			||||||
    local newMargin = tab:getMarginLeft() + mouseMoved.x
 | 
					    local xoff = mousePos.x - tab.hotSpot
 | 
				
			||||||
    if newMargin >= -tab.tabBar.tabSpacing and newMargin < tab.tabBar:getWidth() - tab:getWidth() then
 | 
					 | 
				
			||||||
      tab:setMarginLeft(newMargin)
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    local tabs = tab.tabBar.tabs
 | 
					    -- update indexes
 | 
				
			||||||
    local lastMargin = -tab.tabBar.tabSpacing
 | 
					    updateIndexes(tab.tabBar, tab, xoff)
 | 
				
			||||||
    for i = 1, #tabs do
 | 
					    updateIndexes(tab.tabBar, tab, xoff)
 | 
				
			||||||
      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
 | 
					    -- update margins
 | 
				
			||||||
        if tabs[i] ~= tab then
 | 
					    updateMargins(tab.tabBar)
 | 
				
			||||||
          local newIndex = table.find(tab.tabBar.tabs, tab.tabBar.tabs[i])
 | 
					    xoff = math.max(xoff, 0)
 | 
				
			||||||
          table.remove(tab.tabBar.tabs, table.find(tab.tabBar.tabs, tab))
 | 
					    xoff = math.min(xoff, getMaxMargin(tab.tabBar, tab))
 | 
				
			||||||
          table.insert(tab.tabBar.tabs, newIndex, tab)
 | 
					    tab:setMarginLeft(xoff)
 | 
				
			||||||
          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
 | 
					 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -81,7 +95,7 @@ function UIMoveableTabBar.create()
 | 
				
			||||||
  tabbar:setFocusable(false)
 | 
					  tabbar:setFocusable(false)
 | 
				
			||||||
  tabbar.tabs = {}
 | 
					  tabbar.tabs = {}
 | 
				
			||||||
  tabbar.selected = nil  -- dragged tab
 | 
					  tabbar.selected = nil  -- dragged tab
 | 
				
			||||||
  tabbar.tabSpacing = 5
 | 
					  tabbar.tabSpacing = 0
 | 
				
			||||||
  tabbar.tabsMoveable = false
 | 
					  tabbar.tabsMoveable = false
 | 
				
			||||||
  return tabbar
 | 
					  return tabbar
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -82,19 +82,31 @@ local function updateSlider(self)
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
local function parseSliderPos(self, pos, move)
 | 
					local function parseSliderPos(self, slider, pos, move)
 | 
				
			||||||
  local point, delta
 | 
					  local delta, hotDistance
 | 
				
			||||||
  if self.orientation == 'vertical' then
 | 
					  if self.orientation == 'vertical' then
 | 
				
			||||||
    point = pos.y
 | 
					 | 
				
			||||||
    delta = move.y
 | 
					    delta = move.y
 | 
				
			||||||
 | 
					    hotDistance = pos.y - slider:getY()
 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
    point = pos.x
 | 
					 | 
				
			||||||
    delta = move.x
 | 
					    delta = move.x
 | 
				
			||||||
 | 
					    hotDistance = pos.x - slider:getX()
 | 
				
			||||||
  end
 | 
					  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 range, pxrange, px, offset, center = calcValues(self)
 | 
				
			||||||
    local newvalue = self.value + delta * (range / (pxrange - px))
 | 
					    local newvalue = self.value + delta * (range / (pxrange - px))
 | 
				
			||||||
    self:setValue(newvalue)
 | 
					    self:setValue(newvalue)
 | 
				
			||||||
  end
 | 
					  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
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-- public functions
 | 
					-- public functions
 | 
				
			||||||
function UIScrollBar.create()
 | 
					function UIScrollBar.create()
 | 
				
			||||||
| 
						 | 
					@ -114,10 +126,11 @@ end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function UIScrollBar:onSetup()
 | 
					function UIScrollBar:onSetup()
 | 
				
			||||||
  self.setupDone = true
 | 
					  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('decrementButton'), function() self:decrement() end, 300)
 | 
				
			||||||
  g_mouse.bindAutoPress(self:getChildById('incrementButton'), function() self:increment() 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)
 | 
					  updateSlider(self)
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -311,6 +311,7 @@ function onUseWith(clickedWidget, mousePosition)
 | 
				
			||||||
  if clickedWidget:getClassName() == 'UIMap' then
 | 
					  if clickedWidget:getClassName() == 'UIMap' then
 | 
				
			||||||
    local tile = clickedWidget:getTile(mousePosition)
 | 
					    local tile = clickedWidget:getTile(mousePosition)
 | 
				
			||||||
    if tile then
 | 
					    if tile then
 | 
				
			||||||
 | 
					        print('use on' .. tile:getTopMultiUseThing():getClassName())
 | 
				
			||||||
      g_game.useWith(selectedThing, tile:getTopMultiUseThing())
 | 
					      g_game.useWith(selectedThing, tile:getTopMultiUseThing())
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  elseif clickedWidget:getClassName() == 'UIItem' and not clickedWidget:isVirtual() then
 | 
					  elseif clickedWidget:getClassName() == 'UIItem' and not clickedWidget:isVirtual() then
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -449,15 +449,15 @@ ThingPtr Tile::getTopMultiUseThing()
 | 
				
			||||||
    if(isEmpty())
 | 
					    if(isEmpty())
 | 
				
			||||||
        return nullptr;
 | 
					        return nullptr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if(CreaturePtr topCreature = getTopCreature())
 | 
				
			||||||
 | 
					        return topCreature;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for(uint i = 0; i < m_things.size(); ++i) {
 | 
					    for(uint i = 0; i < m_things.size(); ++i) {
 | 
				
			||||||
        ThingPtr thing = m_things[i];
 | 
					        ThingPtr thing = m_things[i];
 | 
				
			||||||
        if(thing->isForceUse())
 | 
					        if(thing->isForceUse())
 | 
				
			||||||
            return thing;
 | 
					            return thing;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if(CreaturePtr topCreature = getTopCreature())
 | 
					 | 
				
			||||||
        return topCreature;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for(uint i = 0; i < m_things.size(); ++i) {
 | 
					    for(uint i = 0; i < m_things.size(); ++i) {
 | 
				
			||||||
        ThingPtr thing = m_things[i];
 | 
					        ThingPtr thing = m_things[i];
 | 
				
			||||||
        if(!thing->isGround() && !thing->isGroundBorder() && !thing->isOnBottom() && !thing->isOnTop()) {
 | 
					        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) {
 | 
					    for(uint i = 0; i < m_things.size(); ++i) {
 | 
				
			||||||
        ThingPtr thing = m_things[i];
 | 
					        ThingPtr thing = m_things[i];
 | 
				
			||||||
        if(!thing->isGround() && !thing->isGroundBorder() && !thing->isOnTop())
 | 
					        if(!thing->isGround() && !thing->isGroundBorder() && !thing->isOnTop())
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -480,7 +480,7 @@ std::string UITextEdit::cut()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void UITextEdit::wrapText()
 | 
					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)
 | 
					void UITextEdit::moveCursorHorizontally(bool right)
 | 
				
			||||||
| 
						 | 
					@ -552,7 +552,7 @@ std::string UITextEdit::getDisplayedText()
 | 
				
			||||||
        text = m_text;
 | 
					        text = m_text;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if(m_textWrap && m_rect.isValid())
 | 
					    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;
 | 
					    return text;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue