mirror of
https://github.com/OpenMW/openmw.git
synced 2025-12-13 16:43:07 +00:00
allow picking up objects from the gameworld with the mouse in inventory mode
This commit is contained in:
parent
b886aea298
commit
b8464d4ce5
8 changed files with 87 additions and 12 deletions
|
|
@ -138,6 +138,7 @@ namespace MWGui
|
||||||
void Console::disable()
|
void Console::disable()
|
||||||
{
|
{
|
||||||
setVisible(false);
|
setVisible(false);
|
||||||
|
setSelectedObject(MWWorld::Ptr());
|
||||||
// Remove keyboard focus from the console input whenever the
|
// Remove keyboard focus from the console input whenever the
|
||||||
// console is turned off
|
// console is turned off
|
||||||
MyGUI::InputManager::getInstance().setKeyFocusWidget(NULL);
|
MyGUI::InputManager::getInstance().setKeyFocusWidget(NULL);
|
||||||
|
|
@ -379,12 +380,14 @@ namespace MWGui
|
||||||
void Console::setSelectedObject(const MWWorld::Ptr& object)
|
void Console::setSelectedObject(const MWWorld::Ptr& object)
|
||||||
{
|
{
|
||||||
mPtr = object;
|
mPtr = object;
|
||||||
setTitle("#{sConsoleTitle} (" + mPtr.getCellRef().refID + ")");
|
if (!mPtr.isEmpty())
|
||||||
|
setTitle("#{sConsoleTitle} (" + mPtr.getCellRef().refID + ")");
|
||||||
|
else
|
||||||
|
setTitle("#{sConsoleTitle}");
|
||||||
}
|
}
|
||||||
|
|
||||||
void Console::onReferenceUnavailable()
|
void Console::onReferenceUnavailable()
|
||||||
{
|
{
|
||||||
mPtr = MWWorld::Ptr();
|
setSelectedObject(MWWorld::Ptr());
|
||||||
setTitle("#{sConsoleTitle}");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -470,7 +470,7 @@ void ContainerBase::drawItems()
|
||||||
if(displayCount > 0 && !(onlyMagic && it->second != ItemState_Barter && MWWorld::Class::get(*iter).getEnchantment(*iter) == "" && iter->getTypeName() != typeid(ESM::Potion).name()))
|
if(displayCount > 0 && !(onlyMagic && it->second != ItemState_Barter && MWWorld::Class::get(*iter).getEnchantment(*iter) == "" && iter->getTypeName() != typeid(ESM::Potion).name()))
|
||||||
{
|
{
|
||||||
std::string path = std::string("icons\\");
|
std::string path = std::string("icons\\");
|
||||||
path+=MWWorld::Class::get(*iter).getInventoryIcon(*iter);
|
path += MWWorld::Class::get(*iter).getInventoryIcon(*iter);
|
||||||
|
|
||||||
// background widget (for the "equipped" frame and magic item background image)
|
// background widget (for the "equipped" frame and magic item background image)
|
||||||
bool isMagic = (MWWorld::Class::get(*iter).getEnchantment(*iter) != "");
|
bool isMagic = (MWWorld::Class::get(*iter).getEnchantment(*iter) != "");
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,7 @@
|
||||||
#include "../mwworld/world.hpp"
|
#include "../mwworld/world.hpp"
|
||||||
#include "../mwworld/player.hpp"
|
#include "../mwworld/player.hpp"
|
||||||
|
|
||||||
|
#include "inventorywindow.hpp"
|
||||||
#include "window_manager.hpp"
|
#include "window_manager.hpp"
|
||||||
#include "container.hpp"
|
#include "container.hpp"
|
||||||
#include "console.hpp"
|
#include "console.hpp"
|
||||||
|
|
@ -266,6 +267,7 @@ void HUD::onWorldClicked(MyGUI::Widget* _sender)
|
||||||
mDragAndDrop->mDraggedWidget = 0;
|
mDragAndDrop->mDraggedWidget = 0;
|
||||||
|
|
||||||
MWBase::Environment::get().getWindowManager()->setDragDrop(false);
|
MWBase::Environment::get().getWindowManager()->setDragDrop(false);
|
||||||
|
MWBase::Environment::get().getWindowManager()->getInventoryWindow()->drawItems();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -287,9 +289,10 @@ void HUD::onWorldClicked(MyGUI::Widget* _sender)
|
||||||
|
|
||||||
if (mode == GM_Console)
|
if (mode == GM_Console)
|
||||||
MWBase::Environment::get().getWindowManager()->getConsole()->setSelectedObject(object);
|
MWBase::Environment::get().getWindowManager()->getConsole()->setSelectedObject(object);
|
||||||
else if (mode == GM_Console || GM_Inventory)
|
else if ((mode == GM_Container) || (mode == GM_Inventory))
|
||||||
{
|
{
|
||||||
// pick up object
|
// pick up object
|
||||||
|
MWBase::Environment::get().getWindowManager()->getInventoryWindow()->pickUpObject(object);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,8 @@
|
||||||
#include "../mwworld/player.hpp"
|
#include "../mwworld/player.hpp"
|
||||||
#include "../mwbase/environment.hpp"
|
#include "../mwbase/environment.hpp"
|
||||||
#include "../mwworld/manualref.hpp"
|
#include "../mwworld/manualref.hpp"
|
||||||
|
#include "../mwworld/actiontake.hpp"
|
||||||
|
#include "../mwsound/soundmanager.hpp"
|
||||||
|
|
||||||
#include "window_manager.hpp"
|
#include "window_manager.hpp"
|
||||||
#include "widgets.hpp"
|
#include "widgets.hpp"
|
||||||
|
|
@ -276,13 +278,65 @@ namespace MWGui
|
||||||
if (mWindowManager.getSpellWindow())
|
if (mWindowManager.getSpellWindow())
|
||||||
mWindowManager.getSpellWindow()->updateSpells();
|
mWindowManager.getSpellWindow()->updateSpells();
|
||||||
|
|
||||||
// update selected weapon icon
|
// update selected weapon icon
|
||||||
MWWorld::InventoryStore& invStore = MWWorld::Class::get(mPtr).getInventoryStore(mPtr);
|
MWWorld::InventoryStore& invStore = MWWorld::Class::get(mPtr).getInventoryStore(mPtr);
|
||||||
MWWorld::ContainerStoreIterator weaponSlot = invStore.getSlot(MWWorld::InventoryStore::Slot_CarriedRight);
|
MWWorld::ContainerStoreIterator weaponSlot = invStore.getSlot(MWWorld::InventoryStore::Slot_CarriedRight);
|
||||||
if (weaponSlot == invStore.end())
|
if (weaponSlot == invStore.end())
|
||||||
mWindowManager.unsetSelectedWeapon();
|
mWindowManager.unsetSelectedWeapon();
|
||||||
else
|
else
|
||||||
mWindowManager.setSelectedWeapon(*weaponSlot, 100); /// \todo track weapon durability
|
mWindowManager.setSelectedWeapon(*weaponSlot, 100); /// \todo track weapon durability
|
||||||
|
}
|
||||||
|
|
||||||
|
void InventoryWindow::pickUpObject (MWWorld::Ptr object)
|
||||||
|
{
|
||||||
|
/// \todo scripts
|
||||||
|
|
||||||
|
// make sure the object is of a type that can be picked up
|
||||||
|
std::string type = object.getTypeName();
|
||||||
|
if ( (type != typeid(ESM::Apparatus).name())
|
||||||
|
&& (type != typeid(ESM::Armor).name())
|
||||||
|
&& (type != typeid(ESM::Book).name())
|
||||||
|
&& (type != typeid(ESM::Clothing).name())
|
||||||
|
&& (type != typeid(ESM::Ingredient).name())
|
||||||
|
&& (type != typeid(ESM::Light).name())
|
||||||
|
&& (type != typeid(ESM::Miscellaneous).name())
|
||||||
|
&& (type != typeid(ESM::Tool).name())
|
||||||
|
&& (type != typeid(ESM::Probe).name())
|
||||||
|
&& (type != typeid(ESM::Repair).name())
|
||||||
|
&& (type != typeid(ESM::Potion).name()))
|
||||||
|
return;
|
||||||
|
|
||||||
|
// sound
|
||||||
|
std::string sound = MWWorld::Class::get(object).getUpSoundId(object);
|
||||||
|
MWBase::Environment::get().getSoundManager()->playSound(sound, 1, 1);
|
||||||
|
|
||||||
|
int count = object.getRefData().getCount();
|
||||||
|
MWWorld::ActionTake action(object);
|
||||||
|
action.execute();
|
||||||
|
mDragAndDrop->mIsOnDragAndDrop = true;
|
||||||
|
mDragAndDrop->mDraggedCount = count;
|
||||||
|
|
||||||
|
std::string path = std::string("icons\\");
|
||||||
|
path += MWWorld::Class::get(object).getInventoryIcon(object);
|
||||||
|
MyGUI::ImageBox* baseWidget = mContainerWidget->createWidget<ImageBox>("ImageBox", MyGUI::IntCoord(0, 0, 42, 42), MyGUI::Align::Default);
|
||||||
|
baseWidget->detachFromWidget();
|
||||||
|
baseWidget->attachToWidget(mDragAndDrop->mDragAndDropWidget);
|
||||||
|
baseWidget->setUserData(object);
|
||||||
|
mDragAndDrop->mDraggedWidget = baseWidget;
|
||||||
|
ImageBox* image = baseWidget->createWidget<ImageBox>("ImageBox", MyGUI::IntCoord(5, 5, 32, 32), MyGUI::Align::Default);
|
||||||
|
int pos = path.rfind(".");
|
||||||
|
path.erase(pos);
|
||||||
|
path.append(".dds");
|
||||||
|
image->setImageTexture(path);
|
||||||
|
image->setNeedMouseFocus(false);
|
||||||
|
|
||||||
|
// text widget that shows item count
|
||||||
|
MyGUI::TextBox* text = image->createWidget<MyGUI::TextBox>("SandBrightText", MyGUI::IntCoord(0, 14, 32, 18), MyGUI::Align::Default, std::string("Label"));
|
||||||
|
text->setTextAlign(MyGUI::Align::Right);
|
||||||
|
text->setNeedMouseFocus(false);
|
||||||
|
text->setTextShadow(true);
|
||||||
|
text->setTextShadowColour(MyGUI::Colour(0,0,0));
|
||||||
|
text->setCaption(getCountString(count));
|
||||||
|
mDragAndDrop->mDraggedFrom = this;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,8 @@ namespace MWGui
|
||||||
|
|
||||||
void onFrame();
|
void onFrame();
|
||||||
|
|
||||||
|
void pickUpObject (MWWorld::Ptr object);
|
||||||
|
|
||||||
int getPlayerGold();
|
int getPlayerGold();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
|
||||||
|
|
@ -89,6 +89,16 @@ namespace MWGui
|
||||||
|
|
||||||
bool allowSelectedItem = true;
|
bool allowSelectedItem = true;
|
||||||
|
|
||||||
|
// make sure that the item is still in the player inventory, otherwise it can't be selected
|
||||||
|
bool found = false;
|
||||||
|
for (MWWorld::ContainerStoreIterator it(store.begin()); it != store.end(); ++it)
|
||||||
|
{
|
||||||
|
if (*it == selectedItem)
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
if (!found)
|
||||||
|
allowSelectedItem = false;
|
||||||
|
|
||||||
// if the selected item can be equipped, make sure that it actually is equipped
|
// if the selected item can be equipped, make sure that it actually is equipped
|
||||||
std::pair<std::vector<int>, bool> slots;
|
std::pair<std::vector<int>, bool> slots;
|
||||||
slots = MWWorld::Class::get(selectedItem).getEquipmentSlots(selectedItem);
|
slots = MWWorld::Class::get(selectedItem).getEquipmentSlots(selectedItem);
|
||||||
|
|
|
||||||
|
|
@ -300,6 +300,8 @@ namespace MWGui
|
||||||
services = ref->base->AI.services;
|
services = ref->base->AI.services;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// \todo what about potions, there doesn't seem to be a flag for them??
|
||||||
|
|
||||||
if (item.getTypeName() == typeid(ESM::Weapon).name())
|
if (item.getTypeName() == typeid(ESM::Weapon).name())
|
||||||
return services & ESM::NPC::Weapon;
|
return services & ESM::NPC::Weapon;
|
||||||
else if (item.getTypeName() == typeid(ESM::Armor).name())
|
else if (item.getTypeName() == typeid(ESM::Armor).name())
|
||||||
|
|
|
||||||
|
|
@ -638,6 +638,7 @@ void WindowManager::processChangedSettings(const Settings::CategorySettingVector
|
||||||
hud->onResChange(x, y);
|
hud->onResChange(x, y);
|
||||||
console->onResChange(x, y);
|
console->onResChange(x, y);
|
||||||
mSettingsWindow->center();
|
mSettingsWindow->center();
|
||||||
|
mDragAndDrop->mDragAndDropWidget->setSize(MyGUI::IntSize(x, y));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue