mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-10-31 01:30:05 +00:00 
			
		
		
		
	Use a weak pointer to store picked event handler
Fixes crash while item is picked and changing layers
This commit is contained in:
		
							parent
							
								
									f2b2fce5c5
								
							
						
					
					
						commit
						2e1b537c87
					
				
					 1 changed files with 22 additions and 13 deletions
				
			
		|  | @ -244,7 +244,7 @@ public: | |||
|    Qt::KeyboardModifiers lastKeyboardModifiers_ { | ||||
|       Qt::KeyboardModifier::NoModifier}; | ||||
| 
 | ||||
|    std::shared_ptr<types::EventHandler> pickedEventHandler_ {nullptr}; | ||||
|    std::weak_ptr<types::EventHandler> weakPickedEventHandler_ {}; | ||||
| 
 | ||||
|    uint64_t frameDraws_; | ||||
| 
 | ||||
|  | @ -1320,11 +1320,12 @@ bool MapWidget::event(QEvent* e) | |||
|       return true; | ||||
|    } | ||||
| 
 | ||||
|    if (p->pickedEventHandler_ != nullptr && | ||||
|        p->pickedEventHandler_->event_ != nullptr) | ||||
|    auto pickedEventHandler = p->weakPickedEventHandler_.lock(); | ||||
|    if (pickedEventHandler != nullptr && pickedEventHandler->event_ != nullptr) | ||||
|    { | ||||
|       p->pickedEventHandler_->event_(e); | ||||
|       pickedEventHandler->event_(e); | ||||
|    } | ||||
|    pickedEventHandler.reset(); | ||||
| 
 | ||||
|    return QOpenGLWidget::event(e); | ||||
| } | ||||
|  | @ -1593,34 +1594,35 @@ void MapWidgetImpl::RunMousePicking() | |||
|    } | ||||
| 
 | ||||
|    // If no draw item was picked, hide the tooltip
 | ||||
|    auto prevPickedEventHandler = weakPickedEventHandler_.lock(); | ||||
|    if (!itemPicked) | ||||
|    { | ||||
|       util::tooltip::Hide(); | ||||
| 
 | ||||
|       if (pickedEventHandler_ != nullptr) | ||||
|       if (prevPickedEventHandler != nullptr) | ||||
|       { | ||||
|          // Send leave event to picked event handler
 | ||||
|          if (pickedEventHandler_->event_ != nullptr) | ||||
|          if (prevPickedEventHandler->event_ != nullptr) | ||||
|          { | ||||
|             QEvent event(QEvent::Type::Leave); | ||||
|             pickedEventHandler_->event_(&event); | ||||
|             prevPickedEventHandler->event_(&event); | ||||
|          } | ||||
| 
 | ||||
|          // Reset picked event handler
 | ||||
|          pickedEventHandler_ = nullptr; | ||||
|          weakPickedEventHandler_.reset(); | ||||
|       } | ||||
|    } | ||||
|    else if (eventHandler != nullptr) | ||||
|    { | ||||
|       // If the event handler changed
 | ||||
|       if (pickedEventHandler_ != eventHandler) | ||||
|       if (prevPickedEventHandler != eventHandler) | ||||
|       { | ||||
|          // Send leave event to old event handler
 | ||||
|          if (pickedEventHandler_ != nullptr && | ||||
|              pickedEventHandler_->event_ != nullptr) | ||||
|          if (prevPickedEventHandler != nullptr && | ||||
|              prevPickedEventHandler->event_ != nullptr) | ||||
|          { | ||||
|             QEvent event(QEvent::Type::Leave); | ||||
|             pickedEventHandler_->event_(&event); | ||||
|             prevPickedEventHandler->event_(&event); | ||||
|          } | ||||
| 
 | ||||
|          // Send enter event to new event handler
 | ||||
|  | @ -1631,8 +1633,15 @@ void MapWidgetImpl::RunMousePicking() | |||
|          } | ||||
| 
 | ||||
|          // Store picked event handler
 | ||||
|          pickedEventHandler_ = eventHandler; | ||||
|          weakPickedEventHandler_ = eventHandler; | ||||
|       } | ||||
| 
 | ||||
|       eventHandler.reset(); | ||||
|    } | ||||
| 
 | ||||
|    if (prevPickedEventHandler != nullptr) | ||||
|    { | ||||
|       prevPickedEventHandler.reset(); | ||||
|    } | ||||
| 
 | ||||
|    Q_EMIT widget_->MouseCoordinateChanged( | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Dan Paulat
						Dan Paulat