Added initial version of selection highlight
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 483 B |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 493 B |
Before Width: | Height: | Size: 6.5 KiB After Width: | Height: | Size: 1.3 KiB |
BIN
Mods/vcmi/Data/radialMenu/itemInactive.png
Normal file
After Width: | Height: | Size: 676 B |
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 628 B |
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 678 B |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 490 B |
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 934 B |
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 914 B |
@@ -23,9 +23,19 @@ RadialMenuItem::RadialMenuItem(const std::string & imageName, const std::string
|
|||||||
{
|
{
|
||||||
OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE;
|
OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE;
|
||||||
|
|
||||||
image = IImage::createFromFile("radialMenu/" + imageName, EImageBlitMode::COLORKEY);
|
inactiveImage = std::make_shared<CPicture>("radialMenu/itemInactive", Point(0, 0));
|
||||||
picture = std::make_shared<CPicture>(image, Point(0, 0));
|
selectedImage = std::make_shared<CPicture>("radialMenu/itemEmpty", Point(0, 0));
|
||||||
pos = picture->pos;
|
|
||||||
|
iconImage = std::make_shared<CPicture>("radialMenu/" + imageName, Point(0, 0));
|
||||||
|
|
||||||
|
pos = selectedImage->pos;
|
||||||
|
selectedImage->setEnabled(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void RadialMenuItem::setSelected(bool selected)
|
||||||
|
{
|
||||||
|
selectedImage->setEnabled(selected);
|
||||||
|
inactiveImage->setEnabled(!selected);
|
||||||
}
|
}
|
||||||
|
|
||||||
RadialMenu::RadialMenu(const Point & positionToCenter, const std::vector<RadialMenuConfig> & menuConfig)
|
RadialMenu::RadialMenu(const Point & positionToCenter, const std::vector<RadialMenuConfig> & menuConfig)
|
||||||
@@ -33,10 +43,10 @@ RadialMenu::RadialMenu(const Point & positionToCenter, const std::vector<RadialM
|
|||||||
OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE;
|
OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE;
|
||||||
pos += positionToCenter;
|
pos += positionToCenter;
|
||||||
|
|
||||||
addItem(Point(0,0), true, "itemEmpty", "", [](){});
|
Point itemSize = Point(70, 80);
|
||||||
|
|
||||||
Point itemSize = items.back()->pos.dimensions();
|
|
||||||
moveBy(-itemSize / 2);
|
moveBy(-itemSize / 2);
|
||||||
|
pos.w = itemSize.x;
|
||||||
|
pos.h = itemSize.y;
|
||||||
|
|
||||||
for (auto const & item : menuConfig)
|
for (auto const & item : menuConfig)
|
||||||
addItem(item.itemPosition, item.enabled, item.imageName, item.hoverText, item.callback);
|
addItem(item.itemPosition, item.enabled, item.imageName, item.hoverText, item.callback);
|
||||||
@@ -87,6 +97,17 @@ void RadialMenu::gesturePanning(const Point & initialPosition, const Point & cur
|
|||||||
{
|
{
|
||||||
auto item = findNearestItem(currentPosition);
|
auto item = findNearestItem(currentPosition);
|
||||||
GH.statusbar()->write(item->hoverText);
|
GH.statusbar()->write(item->hoverText);
|
||||||
|
|
||||||
|
if (item != selectedItem)
|
||||||
|
{
|
||||||
|
if (selectedItem)
|
||||||
|
selectedItem->setSelected(false);
|
||||||
|
|
||||||
|
item->setSelected(true);
|
||||||
|
selectedItem = item;
|
||||||
|
|
||||||
|
GH.windows().totalRedraw();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RadialMenu::gesture(bool on, const Point & initialPosition, const Point & finalPosition)
|
void RadialMenu::gesture(bool on, const Point & initialPosition, const Point & finalPosition)
|
||||||
|
@@ -37,13 +37,16 @@ class RadialMenuItem : public CIntObject
|
|||||||
{
|
{
|
||||||
friend class RadialMenu;
|
friend class RadialMenu;
|
||||||
|
|
||||||
std::shared_ptr<IImage> image;
|
std::shared_ptr<CPicture> iconImage;
|
||||||
std::shared_ptr<CPicture> picture;
|
std::shared_ptr<CPicture> selectedImage;
|
||||||
|
std::shared_ptr<CPicture> inactiveImage;
|
||||||
std::function<void()> callback;
|
std::function<void()> callback;
|
||||||
std::string hoverText;
|
std::string hoverText;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
RadialMenuItem(const std::string & imageName, const std::string & hoverText, const std::function<void()> & callback);
|
RadialMenuItem(const std::string & imageName, const std::string & hoverText, const std::function<void()> & callback);
|
||||||
|
|
||||||
|
void setSelected(bool selected);
|
||||||
};
|
};
|
||||||
|
|
||||||
class RadialMenu : public CIntObject
|
class RadialMenu : public CIntObject
|
||||||
@@ -52,6 +55,8 @@ class RadialMenu : public CIntObject
|
|||||||
|
|
||||||
std::shared_ptr<CGStatusBar> statusBar;
|
std::shared_ptr<CGStatusBar> statusBar;
|
||||||
|
|
||||||
|
std::shared_ptr<RadialMenuItem> selectedItem;
|
||||||
|
|
||||||
void addItem(const Point & offset, bool enabled, const std::string & path, const std::string & hoverText, const std::function<void()> & callback);
|
void addItem(const Point & offset, bool enabled, const std::string & path, const std::string & hoverText, const std::function<void()> & callback);
|
||||||
|
|
||||||
std::shared_ptr<RadialMenuItem> findNearestItem(const Point & cursorPosition) const;
|
std::shared_ptr<RadialMenuItem> findNearestItem(const Point & cursorPosition) const;
|
||||||
|