diff options
| -rw-r--r-- | engines/illusions/duckman/menusystem_duckman.cpp | 77 | ||||
| -rw-r--r-- | engines/illusions/duckman/menusystem_duckman.h | 14 | ||||
| -rw-r--r-- | engines/illusions/menusystem.cpp | 39 | ||||
| -rw-r--r-- | engines/illusions/menusystem.h | 7 | 
4 files changed, 127 insertions, 10 deletions
diff --git a/engines/illusions/duckman/menusystem_duckman.cpp b/engines/illusions/duckman/menusystem_duckman.cpp index 8a9e1cce47..554be9aac5 100644 --- a/engines/illusions/duckman/menusystem_duckman.cpp +++ b/engines/illusions/duckman/menusystem_duckman.cpp @@ -110,12 +110,26 @@ BaseMenu *DuckmanMenuSystem::createOptionsMenu() {  	BaseMenu *menu = new BaseMenu(this, 0x00120003, 12, 17, 11, 27, 1);  	menu->addText("              GAME OPTIONS             @@@@");  	menu->addText("--------------------------------------"); -	menu->addMenuItem(new MenuItem("SFX Volume     @@{~~~~~~~~~~~~|~~~} @@@", new MenuActionReturnChoice(this, 21))); -	menu->addMenuItem(new MenuItem("Music Volume  @@@{~~~~~~~~~~~~|~~~} @@@", new MenuActionReturnChoice(this, 21))); -	menu->addMenuItem(new MenuItem("Speech Volume {~~~~~~~~~~~~|~~~} @@@", new MenuActionReturnChoice(this, 21))); -	menu->addMenuItem(new MenuItem("Text Duration @@@{~~~~~~~~~~~~|~~~} @@@", new MenuActionReturnChoice(this, 21))); -	menu->addMenuItem(new MenuItem("Restore Defaults                      @@", new MenuActionReturnChoice(this, 21))); -	menu->addMenuItem(new MenuItem("Back                                       @@@", new MenuActionLeaveMenu(this))); +	MenuActionUpdateSlider *action = new MenuActionUpdateSlider(this, menu); +	MenuItem *menuItem = new MenuItem("SFX Volume     @@{~~~~~~~~~~~~|~~~} @@@", action); +	action->setMenuItem(menuItem); +	menu->addMenuItem(menuItem); + +	action = new MenuActionUpdateSlider(this, menu); +	menuItem = new MenuItem("Music Volume  @@@{~~~~~~~~~~~~|~~~} @@@", action); +	action->setMenuItem(menuItem); +	menu->addMenuItem(menuItem); + +	action = new MenuActionUpdateSlider(this, menu); +	menuItem = new MenuItem("Speech Volume {~~~~~~~~~~~~|~~~} @@@", action); +	action->setMenuItem(menuItem); +	menu->addMenuItem(menuItem); + +	action = new MenuActionUpdateSlider(this, menu); +	menuItem = new MenuItem("Text Duration @@@{~~~~~~~~~~~~|~~~} @@@", action); +	action->setMenuItem(menuItem); +	menu->addMenuItem(menuItem); +  	return menu;  } @@ -290,4 +304,55 @@ void MenuActionInventoryAddRemove::execute() {  	_menuSystem->leaveMenu();  } +MenuActionUpdateSlider::MenuActionUpdateSlider(BaseMenuSystem *menuSystem, BaseMenu *menu) +			: BaseMenuAction(menuSystem), menu(menu) { +	menuItem = NULL; +} + +void MenuActionUpdateSlider::execute() { +	assert(menuItem); +	Common::String text = menuItem->getText(); +	Common::Point point = menuItem->getMouseClickPoint(); +	int offset = 0; +	_menuSystem->calcMenuItemTextPositionAtPoint(point, offset); +	int newSliderValue = calcNewSliderValue(text, offset); + +	debug(0, "item text: %s, (%d, %d), New slider value: %d", text.c_str(), point.x, point.y, newSliderValue); + +	menuItem->setText(text); +	_menuSystem->redrawMenuText(menu); +	// TODO update slider here set value callback. +} + +int MenuActionUpdateSlider::calcNewSliderValue(Common::String &text, int newOffset) { +	int newSliderValue = 0; +	int start = 0; +	int end = 0; +	int currentPosition = 0; +	for(int i = 0; i < text.size(); i++) { +		switch (text[i]) { +			case '{' : start = i; break; +			case '}' : end = i; break; +			case '|' : currentPosition = i; break; +			default: break; +		} +	} + +	if (newOffset >= start && newOffset <= end) { +		if (newOffset == start) { +			newSliderValue = 0; +		} else if (newOffset == end) { +			newSliderValue = 15; +		} else { +			newSliderValue = newOffset - (start + 1); +		} + +		text.setChar('~', currentPosition); +		text.setChar('|', start + 1 + newSliderValue); + +		return newSliderValue; +	} +	return currentPosition - start - 1; +} +  } // End of namespace Illusions diff --git a/engines/illusions/duckman/menusystem_duckman.h b/engines/illusions/duckman/menusystem_duckman.h index 2921277630..22bfefa794 100644 --- a/engines/illusions/duckman/menusystem_duckman.h +++ b/engines/illusions/duckman/menusystem_duckman.h @@ -83,6 +83,20 @@ protected:  	int _choiceIndex;  }; +class MenuActionUpdateSlider : public BaseMenuAction { +public: +	MenuActionUpdateSlider(BaseMenuSystem *menuSystem, BaseMenu *baseMenu); +	void setMenuItem(MenuItem *newMmenuItem) { +		menuItem = newMmenuItem; +	} + +	virtual void execute(); +protected: +	MenuItem *menuItem; +	BaseMenu *menu; +	int calcNewSliderValue(Common::String &text, int newOffset); +}; +  } // End of namespace Illusions  #endif // ILLUSIONS_DUCKMAN_MENUSYSTEM_DUCKMAN_H diff --git a/engines/illusions/menusystem.cpp b/engines/illusions/menusystem.cpp index e1aacf78ee..fbb52ee862 100644 --- a/engines/illusions/menusystem.cpp +++ b/engines/illusions/menusystem.cpp @@ -44,7 +44,8 @@ MenuItem::~MenuItem() {  	delete _action;  } -void MenuItem::executeAction() { +void MenuItem::executeAction(const Common::Point &point) { +	_mouseClickPoint = point;  	_action->execute();  } @@ -371,7 +372,7 @@ void BaseMenuSystem::closeMenu() {  }  void BaseMenuSystem::handleClick(uint menuItemIndex, const Common::Point &mousePos) { -	debug(0, "BaseMenuSystem::handleClick() menuItemIndex: %d", menuItemIndex); +	debug(0, "BaseMenuSystem::handleClick() menuItemIndex: %d click point: (%d, %d)", menuItemIndex, mousePos.x, mousePos.y);  	if (menuItemIndex == 0) {  	    playSoundEffect14(); @@ -379,7 +380,7 @@ void BaseMenuSystem::handleClick(uint menuItemIndex, const Common::Point &mouseP  	}  	MenuItem *menuItem = _activeMenu->getMenuItem(menuItemIndex - 1); -	menuItem->executeAction(); +	menuItem->executeAction(mousePos);  } @@ -544,6 +545,38 @@ void BaseMenuSystem::updateTimeOut(bool resetTimeOut) {  } +void BaseMenuSystem::redrawMenuText(BaseMenu *menu) { +	_vm->_screenText->removeText(); +	drawMenuText(menu); +} + +bool BaseMenuSystem::calcMenuItemTextPositionAtPoint(Common::Point pt, int &offset) { +	uint menuItemIndex; +	if(!calcMenuItemIndexAtPoint(pt, menuItemIndex)) { +		return false; +	} + +	WRect rect; + +	MenuItem *menuItem = _activeMenu->getMenuItem(menuItemIndex - 1); +	calcMenuItemRect(menuItemIndex, rect); +	int x = pt.x - rect._topLeft.x; +	Common::String text = menuItem->getText(); +	FontResource *font = _vm->_dict->findFont(_activeMenu->_fontId); + +	uint curX = 0; +	for (int i=0; i < text.size(); i++) { +		int16 w = font->getCharInfo(text[i])->_width; +		if (x >= curX && x <= curX + w) { +			offset = i; +			return true; +		} +		curX = curX + w; +	} + +	return false; +} +  // MenuTextBuilder  MenuTextBuilder::MenuTextBuilder() : _pos(0) { diff --git a/engines/illusions/menusystem.h b/engines/illusions/menusystem.h index 0a7f432e99..cc761167a0 100644 --- a/engines/illusions/menusystem.h +++ b/engines/illusions/menusystem.h @@ -45,11 +45,14 @@ class MenuItem {  public:  	MenuItem(const Common::String text, BaseMenuAction *action);  	~MenuItem(); -	void executeAction(); +	void executeAction(const Common::Point &point);  	const Common::String& getText() const { return _text; } +	void setText(const Common::String &text) { _text = text; } +	const Common::Point& getMouseClickPoint() { return _mouseClickPoint; };  protected:  	Common::String _text;  	BaseMenuAction *_action; +	Common::Point _mouseClickPoint;  };  class BaseMenu { @@ -98,12 +101,14 @@ public:  	void closeMenu();  	void handleClick(uint menuItemIndex, const Common::Point &mousePos);  	uint drawMenuText(BaseMenu *menu); +	void redrawMenuText(BaseMenu *menu);  	void update(Control *cursorControl);  	void setTimeOutDuration(uint32 duration, uint timeOutMenuChoiceIndex);  	void setMenuCallerThreadId(uint32 menuCallerThreadId);  	void setMenuChoiceOffsets(MenuChoiceOffsets menuChoiceOffsets, int16 *menuChoiceOffset);  	void setSavegameSlotNum(int slotNum);  	void setSavegameDescription(Common::String desc); +	bool calcMenuItemTextPositionAtPoint(Common::Point pt, int &offset);  	virtual bool initMenuCursor() = 0;  	virtual int getGameState() = 0;  	virtual void setGameState(int gameState) = 0;  | 
