diff --git a/data/styles/20-popupmenus.otui b/data/styles/20-popupmenus.otui index 163fc39e..15aa0473 100644 --- a/data/styles/20-popupmenus.otui +++ b/data/styles/20-popupmenus.otui @@ -1,17 +1,9 @@ PopupMenuButton < UIButton height: 18 - margin-left: 5 - margin-right: 5 - margin-top: 1 - margin-bottom: 1 size: 0 21 - text-offset: 0 0 + text-offset: 4 0 + text-align: left font: verdana-11px-antialised - - image-source: /images/ui/button_popupmenu - image-color: white - image-clip: 0 0 20 20 - image-border: 2 color: #aaaaaa background-color: alpha @@ -24,6 +16,13 @@ PopupMenuButton < UIButton $disabled: color: #555555 +PopupMenuShortcutLabel < Label + font: verdana-11px-antialised + text-align: right + anchors.fill: parent + margin-right: 2 + margin-left: 5 + PopupMenuSeparator < UIWidget margin-left: 2 margin-right: 2 @@ -39,5 +38,4 @@ PopupMenu < UIPopupMenu width: 50 image-source: /images/ui/menubox image-border: 3 - padding-top: 3 - padding-bottom: 3 + padding: 3 diff --git a/modules/corelib/ui/uipopupmenu.lua b/modules/corelib/ui/uipopupmenu.lua index c02ed2e9..f13bc7f1 100644 --- a/modules/corelib/ui/uipopupmenu.lua +++ b/modules/corelib/ui/uipopupmenu.lua @@ -33,11 +33,23 @@ function UIPopupMenu:display(pos) currentMenu = self end -function UIPopupMenu:onGeometryChange() +function UIPopupMenu:onGeometryChange(oldRect, newRect) + local parent = self:getParent() + if not parent then return end + local ymax = parent:getY() + parent:getHeight() + local xmax = parent:getX() + parent:getWidth() + if newRect.y + newRect.height > ymax then + local newy = newRect.y - newRect.height + if newy > 0 and newy + newRect.height < ymax then self:setY(newy) end + end + if newRect.x + newRect.width > xmax then + local newx = newRect.x - newRect.width + if newx > 0 and newx + newRect.width < xmax then self:setX(newx) end + end self:bindRectToParent() end -function UIPopupMenu:addOption(optionName, optionCallback) +function UIPopupMenu:addOption(optionName, optionCallback, shortcut) local optionWidget = g_ui.createWidget(self:getStyleName() .. 'Button', self) local lastOptionWidget = self:getLastChild() optionWidget.onClick = function(self) @@ -46,6 +58,13 @@ function UIPopupMenu:addOption(optionName, optionCallback) end optionWidget:setText(optionName) local width = optionWidget:getTextSize().width + optionWidget:getMarginLeft() + optionWidget:getMarginRight() + 15 + + if shortcut then + local shortcutLabel = g_ui.createWidget(self:getStyleName() .. 'ShortcutLabel', optionWidget) + shortcutLabel:setText(shortcut) + width = width + shortcutLabel:getTextSize().width + shortcutLabel:getMarginLeft() + shortcutLabel:getMarginRight() + end + self:setWidth(math.max(self:getWidth(), width)) end diff --git a/modules/game_console/console.lua b/modules/game_console/console.lua index 605b283e..735f0a5c 100644 --- a/modules/game_console/console.lua +++ b/modules/game_console/console.lua @@ -433,7 +433,7 @@ function addTabText(text, speaktype, tab, creatureName) end label.onMouseRelease = function (self, mousePos, mouseButton) - processMessageMenu(mousePos, mouseButton, creatureName, text) + processMessageMenu(mousePos, mouseButton, creatureName, text, self) end if consoleBuffer:getChildCount() > MAX_LINES then @@ -460,7 +460,7 @@ function processChannelTabMenu(tab, mousePos, mouseButton) menu:display(mousePos) end -function processMessageMenu(mousePos, mouseButton, creatureName, text) +function processMessageMenu(mousePos, mouseButton, creatureName, text, label) if mouseButton == MouseRightButton then local menu = g_ui.createWidget('PopupMenu') if creatureName then @@ -481,20 +481,18 @@ function processMessageMenu(mousePos, mouseButton, creatureName, text) end menu:addSeparator() end - --TODO select all - menu:addOption(tr('Copy message'), function () g_window.setClipboardText(text) end) - if modules.game_ruleviolation.hasWindowAccess() then - menu:addSeparator() menu:addOption(tr('Rule Violation'), function() modules.game_ruleviolation.show(creatureName, text:match('.+%:%s(.+)')) end) + menu:addSeparator() end - menu:addSeparator() menu:addOption(tr('Copy name'), function () g_window.setClipboardText(creatureName) end) - else - --TODO select all - menu:addOption(tr('Copy message'), function () g_window.setClipboardText(text) end) end + if label:hasSelection() then + menu:addOption(tr('Copy'), function() g_window.setClipboardText(label:getSelection()) end, '(Ctrl+C)') + end + menu:addOption(tr('Copy message'), function() g_window.setClipboardText(text) end) + menu:addOption(tr('Select all'), function() label:selectAll() end) menu:display(mousePos) end end diff --git a/modules/game_interface/gameinterface.lua b/modules/game_interface/gameinterface.lua index efd52e94..7fb454a9 100644 --- a/modules/game_interface/gameinterface.lua +++ b/modules/game_interface/gameinterface.lua @@ -344,24 +344,28 @@ end function createThingMenu(menuPosition, lookThing, useThing, creatureThing) if not g_game.isOnline() then return end local menu = g_ui.createWidget('PopupMenu') + local classic = modules.client_options.getOption('classicControl') + local shortcut = nil + if not classic then shortcut = '(Shift)' else shortcut = nil end if lookThing then - menu:addOption(tr('Look'), function() g_game.look(lookThing) end) + menu:addOption(tr('Look'), function() g_game.look(lookThing) end, shortcut) end + if not classic then shortcut = '(Ctrl)' else shortcut = nil end if useThing then if useThing:isContainer() then if useThing:getParentContainer() then - menu:addOption(tr('Open'), function() g_game.open(useThing, useThing:getParentContainer()) end) + menu:addOption(tr('Open'), function() g_game.open(useThing, useThing:getParentContainer()) end, shortcut) menu:addOption(tr('Open in new window'), function() g_game.open(useThing) end) else - menu:addOption(tr('Open'), function() g_game.open(useThing) end) + menu:addOption(tr('Open'), function() g_game.open(useThing) end, shortcut) end else if useThing:isMultiUse() then - menu:addOption(tr('Use with ...'), function() startUseWith(useThing) end) + menu:addOption(tr('Use with ...'), function() startUseWith(useThing) end, shortcut) else - menu:addOption(tr('Use'), function() g_game.use(useThing) end) + menu:addOption(tr('Use'), function() g_game.use(useThing) end, shortcut) end end @@ -410,10 +414,11 @@ function createThingMenu(menuPosition, lookThing, useThing, creatureThing) end else + if not classic then shortcut = '(Alt)' else shortcut = nil end if g_game.getAttackingCreature() ~= creatureThing then - menu:addOption(tr('Attack'), function() g_game.attack(creatureThing) end) + menu:addOption(tr('Attack'), function() g_game.attack(creatureThing) end, shortcut) else - menu:addOption(tr('Stop Attack'), function() g_game.cancelAttack() end) + menu:addOption(tr('Stop Attack'), function() g_game.cancelAttack() end, shortcut) end if g_game.getFollowingCreature() ~= creatureThing then @@ -472,7 +477,6 @@ function createThingMenu(menuPosition, lookThing, useThing, creatureThing) menu:addSeparator() menu:addOption(tr('Copy Name'), function() g_window.setClipboardText(creatureThing:getName()) end) - end menu:display(menuPosition)