[MouseItemWidget] Refactored a little bit.

This commit is contained in:
Quentin Bazin 2020-03-01 17:52:35 +01:00
parent 578b5271ac
commit 1c21f89caa
2 changed files with 74 additions and 59 deletions

View File

@ -54,16 +54,8 @@ void MouseItemWidget::onEvent(const SDL_Event &event) {
m_isDragging = false;
}
else {
m_isDragging = true;
m_isLeftClickDrag = event.button.button == SDL_BUTTON_LEFT;
m_draggedStack = getStack();
m_dragOrigin = nullptr;
if (m_currentItemWidget && (m_currentItemWidget->stack().amount() == 0 || m_currentItemWidget->stack().item().stringID() == m_draggedStack.item().stringID())) {
m_dragOrigin = m_currentItemWidget;
m_draggedSlots[m_currentItemWidget] = m_currentItemWidget->stack();
}
else if (event.button.button == SDL_BUTTON_LEFT || event.button.button == SDL_BUTTON_RIGHT) {
startDragging(event.button.button == SDL_BUTTON_LEFT);
}
}
else if (event.type == SDL_MOUSEBUTTONUP) {
@ -78,12 +70,7 @@ void MouseItemWidget::onEvent(const SDL_Event &event) {
}
}
m_isDragging = false;
for (auto &it : m_draggedSlots)
it.first->setChanged(true);
m_draggedSlots.clear();
stopDragging();
}
}
@ -113,51 +100,75 @@ void MouseItemWidget::rightClickBehaviour() {
}
}
void MouseItemWidget::startDragging(bool isLeftClickDrag) {
m_isDragging = true;
m_isLeftClickDrag = isLeftClickDrag;
m_draggedStack = getStack();
m_dragOrigin = nullptr;
if (m_currentItemWidget && (m_currentItemWidget->stack().amount() == 0 || m_currentItemWidget->stack().item().stringID() == m_draggedStack.item().stringID())) {
m_dragOrigin = m_currentItemWidget;
m_draggedSlots[m_currentItemWidget] = m_currentItemWidget->stack();
}
}
void MouseItemWidget::stopDragging() {
m_isDragging = false;
for (auto &it : m_draggedSlots)
it.first->setChanged(true);
m_draggedSlots.clear();
}
void MouseItemWidget::draggingBehaviour(ItemWidget *newItemWidget) {
if (newItemWidget->stack().amount() == 0 || newItemWidget->stack().item().stringID() == m_draggedStack.item().stringID()) {
auto it = m_draggedSlots.find(newItemWidget);
if (it == m_draggedSlots.end()) {
if (m_draggedSlots.empty())
m_dragOrigin = newItemWidget;
m_draggedSlots.emplace(std::make_pair(newItemWidget, newItemWidget->stack()));
}
}
if (m_draggedSlots.size() > 1) {
if (m_isLeftClickDrag) {
for (auto &it : m_draggedSlots) {
u16 splitAmount = m_draggedStack.amount() / m_draggedSlots.size();
if (splitAmount > 0) {
it.first->setStack(m_draggedStack.item().stringID(), it.second.amount() + splitAmount);
it.first->update();
}
}
u16 remainingAmount = (m_draggedStack.amount() == 1) ? 0 : m_draggedStack.amount() % m_draggedSlots.size();
setStack(remainingAmount ? m_draggedStack.item().stringID() : "_:air", remainingAmount);
}
else if (m_draggedStack.amount() > 0 && (newItemWidget->stack().amount() == 0 || newItemWidget->stack().item().stringID() == m_draggedStack.item().stringID())) {
if (m_dragOrigin) {
m_dragOrigin->setStack(m_draggedStack.item().stringID(), m_dragOrigin->stack().amount() + 1);
m_draggedStack.setAmount(m_draggedStack.amount() - 1);
setStack(m_draggedStack.amount() ? m_draggedStack.item().stringID() : "_:air", m_draggedStack.amount());
m_dragOrigin = nullptr;
}
newItemWidget->setStack(m_draggedStack.item().stringID(), newItemWidget->stack().amount() + 1);
m_draggedStack.setAmount(m_draggedStack.amount() - 1);
setStack(m_draggedStack.amount() ? m_draggedStack.item().stringID() : "_:air", m_draggedStack.amount());
}
}
}
void MouseItemWidget::updateCurrentItem(ItemWidget *currentItemWidget) {
if (currentItemWidget) {
if (m_isDragging && currentItemWidget != m_currentItemWidget) {
if (currentItemWidget->stack().amount() == 0 || currentItemWidget->stack().item().stringID() == m_draggedStack.item().stringID()) {
auto it = m_draggedSlots.find(currentItemWidget);
if (it == m_draggedSlots.end()) {
if (m_draggedSlots.empty())
m_dragOrigin = currentItemWidget;
m_draggedSlots.emplace(std::make_pair(currentItemWidget, currentItemWidget->stack()));
}
}
if (m_draggedSlots.size() > 1) {
if (m_isLeftClickDrag) {
for (auto &it : m_draggedSlots) {
u16 splitAmount = m_draggedStack.amount() / m_draggedSlots.size();
if (splitAmount > 0) {
it.first->setStack(m_draggedStack.item().stringID(), it.second.amount() + splitAmount);
it.first->update();
}
}
u16 remainingAmount = (m_draggedStack.amount() == 1) ? 0 : m_draggedStack.amount() % m_draggedSlots.size();
setStack(remainingAmount ? m_draggedStack.item().stringID() : "_:air", remainingAmount);
}
else if (m_draggedStack.amount() > 0 && (currentItemWidget->stack().amount() == 0 || currentItemWidget->stack().item().stringID() == m_draggedStack.item().stringID())) {
if (m_dragOrigin) {
m_dragOrigin->setStack(m_draggedStack.item().stringID(), m_dragOrigin->stack().amount() + 1);
m_draggedStack.setAmount(m_draggedStack.amount() - 1);
setStack(m_draggedStack.amount() ? m_draggedStack.item().stringID() : "_:air", m_draggedStack.amount());
m_dragOrigin = nullptr;
}
currentItemWidget->setStack(m_draggedStack.item().stringID(), currentItemWidget->stack().amount() + 1);
m_draggedStack.setAmount(m_draggedStack.amount() - 1);
setStack(m_draggedStack.amount() ? m_draggedStack.item().stringID() : "_:air", m_draggedStack.amount());
}
}
}
if (m_isDragging && currentItemWidget != m_currentItemWidget)
draggingBehaviour(currentItemWidget);
m_currentItemWidget = (currentItemWidget->stack().item().id()) ? currentItemWidget : nullptr;
m_tooltipText.setText(currentItemWidget->stack().item().label() + " [" + std::to_string(currentItemWidget->stack().item().id()) + "]");

View File

@ -43,6 +43,10 @@ class MouseItemWidget : public ItemWidget {
void leftClickBehaviour();
void rightClickBehaviour();
void startDragging(bool isLeftClickDrag);
void stopDragging();
void draggingBehaviour(ItemWidget *newItemWidget);
const ItemWidget *currentItemWidget() const { return m_currentItemWidget; }
void updateCurrentItem(ItemWidget *currentItemWidget);