Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Jun 1, 2010, 9:28:28 PM (14 years ago)
Author:
dafrick
Message:

Made the QuestGUI completely lua based in an attempt to remove a segfault that occured when closing orxonox. Successfully, I might add. ;)
In the process of doing so I expanded the GUITools by adding a function that calculates the height that text in an input window needs, with word-wrap enabled.
Also fixed a small error in the Quest_PirateAttack level.

Location:
code/branches/presentation3/data
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • code/branches/presentation3/data/gui/scripts/GUITools.lua

    r6746 r7072  
    4545    return 0.008*ratio/0.3204
    4646end
     47
     48function getStaticTextWindowHeight(window)
     49    local lookAndFeel = CEGUI.WidgetLookManager:getSingleton():getWidgetLook(window:getLookNFeel())
     50    local formattedArea = lookAndFeel:getNamedArea("WithFrameTextRenderArea"):getArea():getPixelRect(window)
     51    local frameHeight = window:getUnclippedPixelRect():getHeight() - formattedArea:getHeight()
     52    local lines = window:getFont():getFormattedLineCount(window:getText(), formattedArea, CEGUI.WordWrapLeftAligned)
     53    local height = lines * window:getFont():getLineSpacing() + frameHeight
     54    return height
     55end
  • code/branches/presentation3/data/gui/scripts/PickupInventory.lua

    r6996 r7072  
    247247end
    248248
    249 -- TODO: Smarter
    250249function P.getNewDetailNumber()
    251250    local number = table.getn(P.detailsWindows)
  • code/branches/presentation3/data/gui/scripts/QuestGUI.lua

    r6746 r7072  
    33local P = createMenuSheet("QuestGUI")
    44
    5 function P.show()
    6     P.window:show() -- TODO: Do this through parent...
    7     P.visible = true
    8 
     5P.rootWindow = nil
     6P.detailsWindows = {}
     7P.quests = {}
     8P.hints = {}
     9P.player = nil
     10
     11-- design parameters
     12P.indentWidth = 20
     13P.scrollbarWidth = 13
     14P.buttonHeight = 30
     15P.titleHeight = 26
     16P.borderWidth = 5
     17
     18function P.onShow()
     19
     20    local questsList = winMgr:getWindow("orxonox/QuestGUI/QuestsList")
     21
     22    P.player = orxonox.GUIManager:getInstance():getPlayer(P.name)
     23    P.rootWindow = P.createQuestGUI();
     24
     25    questsList:addChildWindow(P.rootWindow)
     26end
     27
     28function P.onHide()
     29    P.cleanup()
     30end
     31
     32function P.createQuestGUI()
    933    local questManager = orxonox.QuestManager:getInstance()
    1034
    11     local questsList = winMgr:getWindow("orxonox/QuestGUI/QuestsList")
    12 
    13     local window = questManager:getQuestGUI(P.name)
    14 
    15     questsList:addChildWindow(window)
    16 
     35    local depth = 0
     36    local index = 0
     37
     38    local questWindow = winMgr:createWindow("MenuWidgets/ScrollablePane", "orxonox/QuestGUI/Quests")
     39    questWindow:setSize(CEGUI.UVector2(CEGUI.UDim(1, 0),CEGUI.UDim(1, 0)))
     40
     41    -- Iterate through all parent-quests.
     42    local numParentQuests = orxonox.QuestManager:getInstance():getNumParentQuests(P.player)
     43    local i = 0
     44    while i <= numParentQuests-1 do
     45        local quest = orxonox.QuestManager:getInstance():getParentQuest(P.player, i)
     46        index = P.createQuestNodes(questWindow, quest, depth, index)
     47        i = i+1
     48    end
     49
     50    return questWindow
     51end
     52
     53function P.createQuestNodes(root, parent, depth, index)
     54    local number = table.getn(P.quests)+1
     55    local name = "orxonox/QuestGUI/Quests/" .. number
     56    local node = winMgr:createWindow("MenuWidgets/TabButton", name)
     57    node:setText(orxonox.QuestManager:getInstance():getDescription(parent):getTitle())
     58    node:setPosition(CEGUI.UVector2(CEGUI.UDim(0, P.indentWidth*depth), CEGUI.UDim(0, P.buttonHeight*index)))
     59    node:setSize(CEGUI.UVector2(CEGUI.UDim(1, -P.indentWidth*depth-P.scrollbarWidth), CEGUI.UDim(0, P.buttonHeight)))
     60    orxonox.GUIManager:subscribeEventHelper(node, "Clicked", P.name .. ".openDetails_clicked")
     61    root:addChildWindow(node)
     62   
     63    table.insert(P.quests, parent)
     64
     65    index = index+1
     66
     67    -- Iterate through all sub-quests.
     68    local numQuests = orxonox.QuestManager:getInstance():getNumSubQuests(parent, P.player)
     69    local i = 0
     70    while i <= numQuests-1 do
     71        local quest = orxonox.QuestManager:getInstance():getSubQuest(parent, P.player, i)
     72        index = P.createQuestNodes(root, quest, depth+1, index)
     73        i = i+1
     74    end
     75
     76    return index;
     77end
     78
     79function P.cleanup()
     80    winMgr:destroyWindow(P.rootWindow)
     81    for k,v in pairs(P.detailsWindows) do
     82        if v ~= nil then
     83            winMgr:destroyWindow(v)
     84            P.detailsWindows[k] = nil
     85        end
     86    end
     87    P.detailsWindows = {}
     88
     89    P.quests = {}
     90    P.hints = {}
     91    P.player = nil
     92
     93    winMgr:destroyWindow(P.rootWindow)
     94    P.rootWindow = nil
     95end
     96
     97function P.openDetails_clicked(e)
     98    --Get some numbers from the window
     99    local we = CEGUI.toWindowEventArgs(e)
     100    local name = we.window:getName()
     101    local match = string.gmatch(name, "%d+")
     102    local questNr = tonumber(match())
     103
     104    name = name .. "/Details" .. P.getNewDetailNumber()
     105    quest = P.quests[questNr]
     106
     107    local details = winMgr:createWindow("MenuWidgets/FrameWindow", name)
     108    details:setSize(CEGUI.UVector2(CEGUI.UDim(0.7, 0), CEGUI.UDim(0.7, 0)))
     109    details:setPosition(CEGUI.UVector2(CEGUI.UDim(0.1, 0), CEGUI.UDim(0.1, 0)))
     110    details:setText(orxonox.QuestManager:getInstance():getDescription(quest):getTitle())
     111    details:setProperty("Alpha", 1.0)
     112    details:setProperty("InheritsAlpha", "setFalse")
     113    orxonox.GUIManager:subscribeEventHelper(details, "CloseClicked", P.name .. ".closeDetails_clicked")
     114
     115    table.insert(P.detailsWindows, details)
     116
     117    name = name .. "/Scrollable"
     118    local window = winMgr:createWindow("MenuWidgets/ScrollablePane", name)
     119    window:setSize(CEGUI.UVector2(CEGUI.UDim(1.0, -2*P.borderWidth),CEGUI.UDim(1.0, -P.titleHeight)))
     120    window:setPosition(CEGUI.UVector2(CEGUI.UDim(0, P.borderWidth), CEGUI.UDim(0, P.titleHeight)))
     121    details:addChildWindow(window)
     122
     123    local offset = 0
     124
     125    local status = winMgr:createWindow("MenuWidgets/StaticText", name .. "/Status")
     126    window:addChildWindow(status)
     127    status:setProperty("HorzFormatting", "WordWrapLeftAligned")
     128    status:setProperty("VertFormatting", "TopAligned")
     129    if quest:isActive(P.player) then
     130        status:setText("This quest is active.")
     131    elseif quest:isCompleted(P.player) then
     132        status:setText("This quest was completed.")
     133    elseif quest:isFailed(P.player) then
     134        status:setText("This quest was failed.")
     135    end
     136    status:setPosition(CEGUI.UVector2(CEGUI.UDim(0, 0), CEGUI.UDim(0, offset)))
     137    status:setSize(CEGUI.UVector2(CEGUI.UDim(1.0, -P.scrollbarWidth), CEGUI.UDim(1.0, 0)))
     138    local height = getStaticTextWindowHeight(status)
     139    status:setHeight(CEGUI.UDim(0, height))
     140    offset = offset + height
     141
     142    local descriptionTitle = winMgr:createWindow("MenuWidgets/StaticText", name .. "/Description/Title");
     143    window:addChildWindow(descriptionTitle)
     144    descriptionTitle:setProperty("HorzFormatting", "HorzCentred")
     145    descriptionTitle:setProperty("VertFormatting", "TopAligned")
     146    descriptionTitle:setText("Description:")
     147    descriptionTitle:setPosition(CEGUI.UVector2(CEGUI.UDim(0, 0), CEGUI.UDim(0, offset)))
     148    descriptionTitle:setSize(CEGUI.UVector2(CEGUI.UDim(1.0, -P.scrollbarWidth), CEGUI.UDim(1.0, 0)))
     149    height = getStaticTextWindowHeight(descriptionTitle)
     150    descriptionTitle:setHeight(CEGUI.UDim(0, height))
     151    offset = offset + height
     152
     153    local description = winMgr:createWindow("MenuWidgets/StaticText", name .. "/Description");
     154    window:addChildWindow(description)
     155    description:setProperty("HorzFormatting", "WordWrapLeftAligned")
     156    description:setProperty("VertFormatting", "TopAligned")
     157    description:setText(orxonox.QuestManager:getInstance():getDescription(quest):getDescription())
     158    description:setPosition(CEGUI.UVector2(CEGUI.UDim(0, 0), CEGUI.UDim(0, offset)))
     159    description:setSize(CEGUI.UVector2(CEGUI.UDim(1.0, -P.scrollbarWidth), CEGUI.UDim(1.0, 0)))
     160    height = getStaticTextWindowHeight(description)
     161    description:setHeight(CEGUI.UDim(0, height))
     162    offset = offset + height
     163
     164    -- Display the hints of this quest
     165    local numHints = orxonox.QuestManager:getInstance():getNumHints(quest, P.player)
     166    if numHints > 0 then
     167        local hintsTitle = winMgr:createWindow("MenuWidgets/StaticText", name .. "/Hints/Title");
     168        window:addChildWindow(hintsTitle)
     169        hintsTitle:setProperty("HorzFormatting", "HorzCentred")
     170        hintsTitle:setProperty("VertFormatting", "TopAligned")
     171        hintsTitle:setText("Hints:")
     172        hintsTitle:setPosition(CEGUI.UVector2(CEGUI.UDim(0, 0), CEGUI.UDim(0, offset)))
     173        hintsTitle:setSize(CEGUI.UVector2(CEGUI.UDim(1.0, -P.scrollbarWidth), CEGUI.UDim(1.0, 0)))
     174        height = getStaticTextWindowHeight(hintsTitle)
     175        hintsTitle:setHeight(CEGUI.UDim(0, height))
     176        offset = offset + height
     177    end
     178    local i = 0
     179    while i <= numHints-1 do
     180        local hint = orxonox.QuestManager:getInstance():getHints(quest, P.player, i)
     181        table.insert(P.hints, hint)
     182        local number = table.getn(P.hints)
     183        local node = winMgr:createWindow("MenuWidgets/TabButton", name .. "/Hints" .. number)
     184        node:setText(orxonox.QuestManager:getInstance():getDescription(hint):getTitle())
     185        node:setPosition(CEGUI.UVector2(CEGUI.UDim(0, 0), CEGUI.UDim(0, offset)))
     186        node:setSize(CEGUI.UVector2(CEGUI.UDim(1, -P.scrollbarWidth), CEGUI.UDim(0, P.buttonHeight)))
     187        window:addChildWindow(node)
     188        offset = offset + P.buttonHeight
     189
     190        orxonox.GUIManager:subscribeEventHelper(node, "Clicked", P.name .. ".openHintDetails_clicked")
     191        i = i+1
     192    end
     193
     194    local window = winMgr:getWindow("orxonox/QuestGUI/Background")
     195    window:addChildWindow(details)
     196end
     197
     198function P.getNewDetailNumber()
     199    local number = table.getn(P.detailsWindows)
     200    for k,v in pairs(P.detailsWindows) do
     201        if v == nil then
     202            number = k-1
     203        end
     204    end
     205    return number+1
     206end
     207
     208function P.closeDetails_clicked(e)
     209    local we = CEGUI.toWindowEventArgs(e)
     210    local name = we.window:getName()
     211    local match = string.gmatch(name, "%d+")
     212    match()
     213    local detailsNr = tonumber(match())
     214
     215    winMgr:destroyWindow(P.detailsWindows[detailsNr])
     216    P.detailsWindows[detailsNr] = nil
     217end
     218
     219function P.openHintDetails_clicked(e)
     220    --Get some numbers from the window
     221    local we = CEGUI.toWindowEventArgs(e)
     222    local name = we.window:getName()
     223    local match = string.gmatch(name, "%d+")
     224    match()
     225    match()
     226    local hintNr = tonumber(match())
     227
     228    name = name .. "/Details" .. P.getNewDetailNumber()
     229    hint = P.hints[hintNr]
     230
     231    local details = winMgr:createWindow("MenuWidgets/FrameWindow", name)
     232    details:setSize(CEGUI.UVector2(CEGUI.UDim(0.7, 0), CEGUI.UDim(0.7, 0)))
     233    details:setPosition(CEGUI.UVector2(CEGUI.UDim(0.1, 0), CEGUI.UDim(0.1, 0)))
     234    details:setText(orxonox.QuestManager:getInstance():getDescription(hint):getTitle())
     235    details:setProperty("Alpha", 1.0)
     236    details:setProperty("InheritsAlpha", "setFalse")
     237    orxonox.GUIManager:subscribeEventHelper(details, "CloseClicked", P.name .. ".closeHintDetails_clicked")
     238
     239    table.insert(P.detailsWindows, details)
     240
     241    name = name .. "/Scrollable"
     242    local window = winMgr:createWindow("MenuWidgets/ScrollablePane", name)
     243    window:setSize(CEGUI.UVector2(CEGUI.UDim(1.0, -2*P.borderWidth),CEGUI.UDim(1.0, -P.titleHeight)))
     244    window:setPosition(CEGUI.UVector2(CEGUI.UDim(0, P.borderWidth), CEGUI.UDim(0, P.titleHeight)))
     245    details:addChildWindow(window)
     246
     247    local offset = 0
     248   
     249    local descriptionTitle = winMgr:createWindow("MenuWidgets/StaticText", name .. "/Description/Title");
     250    window:addChildWindow(descriptionTitle)
     251    descriptionTitle:setProperty("HorzFormatting", "HorzCentred")
     252    descriptionTitle:setProperty("VertFormatting", "TopAligned")
     253    descriptionTitle:setText("Description:")
     254    descriptionTitle:setPosition(CEGUI.UVector2(CEGUI.UDim(0, 0), CEGUI.UDim(0, offset)))
     255    descriptionTitle:setSize(CEGUI.UVector2(CEGUI.UDim(1.0, -P.scrollbarWidth), CEGUI.UDim(1.0, 0)))
     256    height = getStaticTextWindowHeight(descriptionTitle)
     257    descriptionTitle:setHeight(CEGUI.UDim(0, height))
     258    offset = offset + height
     259
     260    local description = winMgr:createWindow("MenuWidgets/StaticText", name .. "/Description");
     261    window:addChildWindow(description)
     262    description:setProperty("HorzFormatting", "WordWrapLeftAligned")
     263    description:setProperty("VertFormatting", "TopAligned")
     264    description:setText(orxonox.QuestManager:getInstance():getDescription(hint):getDescription())
     265    description:setPosition(CEGUI.UVector2(CEGUI.UDim(0, 0), CEGUI.UDim(0, offset)))
     266    description:setSize(CEGUI.UVector2(CEGUI.UDim(1.0, -P.scrollbarWidth), CEGUI.UDim(1.0, 0)))
     267    height = getStaticTextWindowHeight(description)
     268    description:setHeight(CEGUI.UDim(0, height))
     269
     270    local window = winMgr:getWindow("orxonox/QuestGUI/Background")
     271    window:addChildWindow(details)
     272end
     273
     274function P.closeHintDetails_clicked(e)
     275    local we = CEGUI.toWindowEventArgs(e)
     276    local name = we.window:getName()
     277    local match = string.gmatch(name, "%d+")
     278    match()
     279    match()
     280    match()
     281    local detailsNr = tonumber(match())
     282
     283    winMgr:destroyWindow(P.detailsWindows[detailsNr])
     284    P.detailsWindows[detailsNr] = nil
    17285end
    18286
  • code/branches/presentation3/data/levels/Quest_PirateAttack.oxw

    r7036 r7072  
    158158                                        <attached>
    159159                                                <Billboard position="0,0,0" scale=3 colour="1.0,1.0,0" material="Examples/Flare" />
    160                                                 <DistanceTrigger name=questbeacon2  targetname=Me position="0,0,0" distance=400 target="Pawn" />
     160                                                <DistanceTrigger name=questbeacon2 targetname=Me position="0,0,0" target=DistanceTriggerBeacon distance=400 />
    161161                                        </attached>
    162162                                        <effects>
  • code/branches/presentation3/data/levels/pickups.oxw

    r7038 r7072  
    66<?lua
    77  include("templates/spaceship_assff.oxt")
    8   include("templates/spaceship_pirate.oxt")
    98  include("templates/pickup_representation_templates.oxt")
    109  include("templates/lodinformation.oxt")
Note: See TracChangeset for help on using the changeset viewer.