MACVENTURE: Tidy up Inventory window system
This commit is contained in:
parent
b460964284
commit
9905cd24d3
5 changed files with 87 additions and 45 deletions
|
@ -56,7 +56,7 @@ enum {
|
|||
};
|
||||
|
||||
enum {
|
||||
kDragThreshold = 5
|
||||
kDragThreshold = 1
|
||||
};
|
||||
|
||||
static const Graphics::MenuData menuSubItems[] = {
|
||||
|
@ -320,21 +320,17 @@ void Gui::initWindows() {
|
|||
_exitsWindow->setCallback(exitsWindowCallback, this);
|
||||
loadBorder(_exitsWindow, "border_no_scroll_inac.bmp", false);
|
||||
loadBorder(_exitsWindow, "border_no_scroll_act.bmp", true);
|
||||
|
||||
|
||||
}
|
||||
|
||||
void Gui::assignObjReferences() {
|
||||
|
||||
findWindowData(kSelfWindow).objRef = 0;
|
||||
|
||||
}
|
||||
|
||||
WindowReference Gui::createInventoryWindow(ObjID objRef) {
|
||||
Graphics::MacWindow *newWindow = _wm.addWindow(true, true, true);
|
||||
WindowData newData;
|
||||
GlobalSettings settings = _engine->getGlobalSettings();
|
||||
newData.refcon = (WindowReference)ABS(_inventoryWindows.size()); // This is a HACK
|
||||
newData.refcon = (WindowReference)ABS(_inventoryWindows.size() + kInventoryStart); // This is a HACK
|
||||
|
||||
if (_windowData->back().refcon < 0x80) { // There is already another inventory window
|
||||
newData.bounds = _windowData->back().bounds; // Inventory windows are always last
|
||||
|
@ -606,23 +602,21 @@ void Gui::drawSelfWindow() {
|
|||
}
|
||||
|
||||
void Gui::drawInventories() {
|
||||
Common::List<WindowData>::const_iterator it = _windowData->begin();
|
||||
while (it != _windowData->end() && (*it).refcon >= 0x80) {
|
||||
it++;
|
||||
}
|
||||
|
||||
|
||||
Graphics::ManagedSurface *srf;
|
||||
while (it != _windowData->end()) {
|
||||
srf = _inventoryWindows[(*it).refcon]->getSurface();
|
||||
BorderBounds border = borderBounds((*it).type);
|
||||
for (uint i = 0; i < _inventoryWindows.size(); i++) {
|
||||
const WindowData &data = getWindowData((WindowReference)(kInventoryStart + i));
|
||||
srf = findWindow(data.refcon)->getSurface(); // HACK
|
||||
BorderBounds border = borderBounds(data.type);
|
||||
srf->fillRect(Common::Rect(
|
||||
border.leftOffset,
|
||||
border.topOffset,
|
||||
srf->w + border.rightOffset,
|
||||
srf->h + border.bottomOffset), kColorWhite);
|
||||
drawObjectsInWindow((*it).refcon, _inventoryWindows[(*it).refcon]->getSurface());
|
||||
it++;
|
||||
drawObjectsInWindow(data.refcon, srf);
|
||||
|
||||
findWindow((*it).refcon)->setDirty(true);
|
||||
findWindow(data.refcon)->setDirty(true);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -864,8 +858,8 @@ WindowData & Gui::findWindowData(WindowReference reference) {
|
|||
}
|
||||
|
||||
Graphics::MacWindow * Gui::findWindow(WindowReference reference) {
|
||||
if (reference < 0x80) { // It's an inventory window
|
||||
return _inventoryWindows[reference];
|
||||
if (reference < 0x80 && reference >= kInventoryStart) { // It's an inventory window
|
||||
return _inventoryWindows[reference - kInventoryStart];
|
||||
}
|
||||
switch (reference) {
|
||||
case MacVenture::kNoWindow:
|
||||
|
@ -921,6 +915,8 @@ void Gui::selectDraggable(ObjID child, WindowReference origin, Common::Point sta
|
|||
if (_engine->isObjClickable(child) && _draggedObj.id == 0) {
|
||||
_draggedObj.hasMoved = false;
|
||||
_draggedObj.id = child;
|
||||
_draggedObj.startPos = startPos;
|
||||
_draggedObj.startWin = origin;
|
||||
_draggedObj.mouseOffset = (_engine->getObjPosition(child) + getWindowSurfacePos(origin)) - startPos;
|
||||
_draggedObj.pos = startPos + _draggedObj.mouseOffset;
|
||||
}
|
||||
|
@ -928,14 +924,19 @@ void Gui::selectDraggable(ObjID child, WindowReference origin, Common::Point sta
|
|||
|
||||
void Gui::handleDragRelease(Common::Point pos, bool shiftPressed, bool isDoubleClick) {
|
||||
WindowReference destinationWindow = findWindowAtPoint(pos);
|
||||
if (_draggedObj.id != 0 && _draggedObj.hasMoved) {
|
||||
if (_draggedObj.id != 0) {
|
||||
if (_draggedObj.hasMoved) {
|
||||
ObjID destObject = getWindowData(destinationWindow).objRef;
|
||||
debug("drop the object at obj %d", destObject);
|
||||
pos -= _draggedObj.startPos;
|
||||
pos = localize(pos, _draggedObj.startWin, destinationWindow);
|
||||
debug("drop the object at obj %d, pos (%d, %d)", destObject, pos.x, pos.y);
|
||||
|
||||
_engine->handleObjectDrop(_draggedObj.id, pos, destObject);
|
||||
}
|
||||
_engine->handleObjectSelect(_draggedObj.id, destinationWindow, shiftPressed, isDoubleClick);
|
||||
|
||||
_draggedObj.id = 0;
|
||||
_draggedObj.hasMoved = false;
|
||||
}
|
||||
}
|
||||
|
||||
Common::Rect Gui::calculateClickRect(Common::Point clickPos, Common::Rect windowBounds) {
|
||||
|
@ -944,6 +945,22 @@ Common::Rect Gui::calculateClickRect(Common::Point clickPos, Common::Rect window
|
|||
return Common::Rect(left - kCursorWidth, top - kCursorHeight, left + kCursorWidth, top + kCursorHeight);
|
||||
}
|
||||
|
||||
Common::Point Gui::localize(Common::Point point, WindowReference origin, WindowReference target) {
|
||||
Graphics::MacWindow *oriWin = findWindow(origin);
|
||||
Graphics::MacWindow *destWin = findWindow(target);
|
||||
if (origin != target) {
|
||||
// ori.local to global
|
||||
point.x += oriWin->getDimensions().left;
|
||||
point.y += oriWin->getDimensions().top;
|
||||
if (destWin) {
|
||||
// dest.globalToLocal
|
||||
point.x -= destWin->getDimensions().left;
|
||||
point.y -= destWin->getDimensions().top;
|
||||
}
|
||||
}
|
||||
return point;
|
||||
}
|
||||
|
||||
|
||||
/* HANDLERS */
|
||||
void Gui::handleMenuAction(MenuAction action) {
|
||||
|
@ -1177,7 +1194,7 @@ bool MacVenture::Gui::processExitsEvents(WindowClick click, Common::Event & even
|
|||
event.mouse.x - _exitsWindow->getDimensions().left,
|
||||
event.mouse.y - _exitsWindow->getDimensions().top);
|
||||
|
||||
CommandButton data;
|
||||
CommandButton button;
|
||||
if (!_exitsData)
|
||||
return false;
|
||||
|
||||
|
@ -1185,14 +1202,15 @@ bool MacVenture::Gui::processExitsEvents(WindowClick click, Common::Event & even
|
|||
for (; it != _exitsData->end(); ++it) {
|
||||
if (it->isInsideBounds(position)) {
|
||||
it->select();
|
||||
data = *it;
|
||||
button = *it;
|
||||
_engine->handleObjectSelect(button.getData().refcon, kExitsWindow, false, false);
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
it->unselect();
|
||||
}
|
||||
}
|
||||
|
||||
_engine->handleObjectSelect(data.getData().refcon, kExitsWindow, false, false);
|
||||
}
|
||||
return getWindowData(kExitsWindow).visible;
|
||||
}
|
||||
|
@ -1238,7 +1256,7 @@ void Gui::processCursorTick() {
|
|||
|
||||
void Gui::handleSingleClick(Common::Point pos) {
|
||||
debug("Single Click");
|
||||
handleDragRelease(_draggedObj.pos, false, false);
|
||||
handleDragRelease(pos, false, false);
|
||||
|
||||
// HACK For test, please delete me
|
||||
//WindowReference destinationWindow = findWindowAtPoint(pos);
|
||||
|
@ -1248,7 +1266,7 @@ void Gui::handleSingleClick(Common::Point pos) {
|
|||
|
||||
void Gui::handleDoubleClick(Common::Point pos) {
|
||||
debug("Double Click");
|
||||
handleDragRelease(_draggedObj.pos, false, true);
|
||||
handleDragRelease(pos, false, true);
|
||||
|
||||
// HACK For test, please delete me
|
||||
//WindowReference destinationWindow = findWindowAtPoint(pos);
|
||||
|
|
|
@ -65,6 +65,7 @@ enum MenuAction {
|
|||
|
||||
enum WindowReference {
|
||||
kNoWindow = 0,
|
||||
kInventoryStart = 1,
|
||||
kCommandsWindow = 0x80,
|
||||
kMainGameWindow = 0x81,
|
||||
kOutConsoleWindow = 0x82,
|
||||
|
@ -171,6 +172,8 @@ struct DraggedObj {
|
|||
ObjID id;
|
||||
Common::Point pos;
|
||||
Common::Point mouseOffset;
|
||||
Common::Point startPos;
|
||||
WindowReference startWin;
|
||||
bool hasMoved;
|
||||
};
|
||||
|
||||
|
@ -312,6 +315,7 @@ private: // Methods
|
|||
void selectDraggable(ObjID child, WindowReference origin, Common::Point startPos);
|
||||
void handleDragRelease(Common::Point pos, bool shiftPressed, bool isDoubleClick);
|
||||
Common::Rect calculateClickRect(Common::Point clickPos, Common::Rect windowBounds);
|
||||
Common::Point localize(Common::Point point, WindowReference origin, WindowReference target);
|
||||
|
||||
};
|
||||
|
||||
|
@ -357,7 +361,6 @@ public:
|
|||
}
|
||||
|
||||
bool processEvent(const Common::Event &event) {
|
||||
executeState();
|
||||
|
||||
if (event.type == Common::EVENT_MOUSEMOVE) {
|
||||
_pos = event.mouse;
|
||||
|
|
|
@ -231,6 +231,10 @@ void MacVentureEngine::enqueueObject(ObjectQueueID type, ObjID objID, ObjID targ
|
|||
QueuedObject obj;
|
||||
obj.id = type;
|
||||
|
||||
if (type == kUpdateObject && isObjEnqueued(objID)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (type == kUpdateWindow) { obj.target = target; }
|
||||
|
||||
if (type != kHightlightExits) {
|
||||
|
@ -247,6 +251,14 @@ void MacVentureEngine::enqueueObject(ObjectQueueID type, ObjID objID, ObjID targ
|
|||
_objQueue.push_back(obj);
|
||||
}
|
||||
|
||||
bool MacVentureEngine::isObjEnqueued(ObjID objID) {
|
||||
Common::Array<QueuedObject>::const_iterator it;
|
||||
for (it = _objQueue.begin(); it != _objQueue.end(); it++) {
|
||||
if ((*it).object == objID) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void MacVentureEngine::enqueueText(TextQueueID type, ObjID target, ObjID source, ObjID text) {
|
||||
QueuedText newText;
|
||||
newText.id = type;
|
||||
|
@ -337,18 +349,17 @@ void MacVentureEngine::handleObjectSelect(ObjID objID, WindowReference win, bool
|
|||
void MacVentureEngine::handleObjectDrop(ObjID objID, Common::Point delta, ObjID newParent) {
|
||||
_destObject = newParent;
|
||||
updateDelta(delta);
|
||||
selectControl(kOperate);
|
||||
activateCommand(kOperate);
|
||||
selectControl(kMoveObject);
|
||||
activateCommand(kMoveObject);
|
||||
refreshReady();
|
||||
preparedToRun();
|
||||
}
|
||||
|
||||
void MacVentureEngine::updateDelta(Common::Point newPos) {
|
||||
Common::Point newDelta = newPos - _deltaPoint;
|
||||
debug("Update delta: Old(%d, %d), New(%d, %d)",
|
||||
_deltaPoint.x, _deltaPoint.y,
|
||||
newDelta.x, newDelta.y);
|
||||
_deltaPoint = newDelta;
|
||||
newPos.x, newPos.y);
|
||||
_deltaPoint = newPos;
|
||||
}
|
||||
|
||||
void MacVentureEngine::focusObjWin(ObjID objID) {
|
||||
|
@ -620,7 +631,12 @@ void MacVentureEngine::focusObjectWindow(ObjID objID) {
|
|||
|
||||
void MacVentureEngine::openObject(ObjID objID) {
|
||||
|
||||
debug("openObject: %d", objID);
|
||||
debug("Open Object[%d] parent[%d] x[%d] y[%d]",
|
||||
objID,
|
||||
_world->getObjAttr(objID, kAttrParentObject),
|
||||
_world->getObjAttr(objID, kAttrPosX),
|
||||
_world->getObjAttr(objID, kAttrPosY));
|
||||
|
||||
if (getObjWindow(objID)) return;
|
||||
if (objID == _world->getObjAttr(1, kAttrParentObject)) {
|
||||
_gui->updateWindowInfo(kMainGameWindow, objID, _world->getChildren(objID, true));
|
||||
|
@ -712,10 +728,13 @@ void MacVentureEngine::checkObject(QueuedObject old) {
|
|||
}
|
||||
|
||||
void MacVentureEngine::reflectSwap(ObjID fromID, ObjID toID) {
|
||||
warning("reflectSwap: untested");
|
||||
//warning("reflectSwap: untested");
|
||||
WindowReference from = getObjWindow(fromID);
|
||||
WindowReference to = getObjWindow(toID);
|
||||
WindowReference tmp = to;
|
||||
debug("Swap Object[%d] to Object[%d], from win[%d] to win[%d] ",
|
||||
fromID, toID, from, to);
|
||||
|
||||
if (!to) {
|
||||
tmp = from;
|
||||
}
|
||||
|
|
|
@ -270,6 +270,8 @@ private:
|
|||
void toggleExits();
|
||||
void zoomObject(ObjID objID);
|
||||
|
||||
bool isObjEnqueued(ObjID obj);
|
||||
|
||||
// Data loading
|
||||
bool loadGlobalSettings();
|
||||
bool loadTextHuffman();
|
||||
|
|
|
@ -51,14 +51,14 @@ bool ScriptEngine::runControl(ControlAction action, ObjID source, ObjID destinat
|
|||
frame.haltedInFirst = false;
|
||||
frame.haltedInFamily = false;
|
||||
_frames.push_back(frame);
|
||||
debug(3, "SCRIPT: Stored frame %d, action: %d src: %d dest: %d point: (%d, %d)",
|
||||
debug(2, "SCRIPT: Stored frame %d, action: %d src: %d dest: %d point: (%d, %d)",
|
||||
_frames.size() - 1, frame.action, frame.src, frame.dest, frame.x, frame.y);
|
||||
|
||||
return resume(true);
|
||||
}
|
||||
|
||||
bool ScriptEngine::resume(bool execAll) {
|
||||
debug(3, "SCRIPT: Resume");
|
||||
debug(2, "SCRIPT: Resume");
|
||||
while (_frames.size()) {
|
||||
bool fail = execFrame(execAll);
|
||||
if (fail) return true;
|
||||
|
@ -146,7 +146,7 @@ bool ScriptEngine::execFrame(bool execAll) {
|
|||
|
||||
bool ScriptEngine::loadScript(EngineFrame * frame, uint32 scriptID) {
|
||||
if (_scripts->getItemByteSize(scriptID) > 0) {
|
||||
debug(3, "SCRIPT: Loading function %d", scriptID);
|
||||
debug(2, "SCRIPT: Loading function %d", scriptID);
|
||||
// Insert the new script at the front
|
||||
frame->scripts.push_front(ScriptAsset(scriptID, _scripts));
|
||||
return runFunc(frame);
|
||||
|
@ -165,7 +165,7 @@ bool ScriptEngine::resumeFunc(EngineFrame * frame) {
|
|||
|
||||
bool ScriptEngine::runFunc(EngineFrame *frame) {
|
||||
ScriptAsset &script = frame->scripts.front();
|
||||
debug(3, "SCRIPT: Executing function %d", script.getId());
|
||||
debug(2, "SCRIPT: Executing function %d", script.getId());
|
||||
EngineState *state = &frame->state;
|
||||
byte op;
|
||||
while (script.hasNext()) {
|
||||
|
@ -927,7 +927,7 @@ bool ScriptEngine::opbcCALL(EngineState * state, EngineFrame * frame, ScriptAsse
|
|||
return true;
|
||||
frame->scripts.pop_front();
|
||||
script = frame->scripts.front();
|
||||
debug(3, "SCRIPT: Return from fuction %d", id);
|
||||
debug(2, "SCRIPT: Return from fuction %d", id);
|
||||
}
|
||||
|
||||
void ScriptEngine::opbdFOOB(EngineState * state, EngineFrame * frame) {
|
||||
|
@ -1203,7 +1203,7 @@ void ScriptAsset::loadInstructions() {
|
|||
for (uint i = 0; i < amount; i++) {
|
||||
_instructions.push_back(res->readByte());
|
||||
}
|
||||
debug(3, "SCRIPT: Load %d instructions for script %d", amount, _id);
|
||||
debug(2, "SCRIPT: Load %d instructions for script %d", amount, _id);
|
||||
}
|
||||
|
||||
} // End of namespace MacVenture
|
Loading…
Add table
Add a link
Reference in a new issue