mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-10-31 10:30:06 +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::KeyboardModifiers lastKeyboardModifiers_ { | ||||||
|       Qt::KeyboardModifier::NoModifier}; |       Qt::KeyboardModifier::NoModifier}; | ||||||
| 
 | 
 | ||||||
|    std::shared_ptr<types::EventHandler> pickedEventHandler_ {nullptr}; |    std::weak_ptr<types::EventHandler> weakPickedEventHandler_ {}; | ||||||
| 
 | 
 | ||||||
|    uint64_t frameDraws_; |    uint64_t frameDraws_; | ||||||
| 
 | 
 | ||||||
|  | @ -1320,11 +1320,12 @@ bool MapWidget::event(QEvent* e) | ||||||
|       return true; |       return true; | ||||||
|    } |    } | ||||||
| 
 | 
 | ||||||
|    if (p->pickedEventHandler_ != nullptr && |    auto pickedEventHandler = p->weakPickedEventHandler_.lock(); | ||||||
|        p->pickedEventHandler_->event_ != nullptr) |    if (pickedEventHandler != nullptr && pickedEventHandler->event_ != nullptr) | ||||||
|    { |    { | ||||||
|       p->pickedEventHandler_->event_(e); |       pickedEventHandler->event_(e); | ||||||
|    } |    } | ||||||
|  |    pickedEventHandler.reset(); | ||||||
| 
 | 
 | ||||||
|    return QOpenGLWidget::event(e); |    return QOpenGLWidget::event(e); | ||||||
| } | } | ||||||
|  | @ -1593,34 +1594,35 @@ void MapWidgetImpl::RunMousePicking() | ||||||
|    } |    } | ||||||
| 
 | 
 | ||||||
|    // If no draw item was picked, hide the tooltip
 |    // If no draw item was picked, hide the tooltip
 | ||||||
|  |    auto prevPickedEventHandler = weakPickedEventHandler_.lock(); | ||||||
|    if (!itemPicked) |    if (!itemPicked) | ||||||
|    { |    { | ||||||
|       util::tooltip::Hide(); |       util::tooltip::Hide(); | ||||||
| 
 | 
 | ||||||
|       if (pickedEventHandler_ != nullptr) |       if (prevPickedEventHandler != nullptr) | ||||||
|       { |       { | ||||||
|          // Send leave event to picked event handler
 |          // Send leave event to picked event handler
 | ||||||
|          if (pickedEventHandler_->event_ != nullptr) |          if (prevPickedEventHandler->event_ != nullptr) | ||||||
|          { |          { | ||||||
|             QEvent event(QEvent::Type::Leave); |             QEvent event(QEvent::Type::Leave); | ||||||
|             pickedEventHandler_->event_(&event); |             prevPickedEventHandler->event_(&event); | ||||||
|          } |          } | ||||||
| 
 | 
 | ||||||
|          // Reset picked event handler
 |          // Reset picked event handler
 | ||||||
|          pickedEventHandler_ = nullptr; |          weakPickedEventHandler_.reset(); | ||||||
|       } |       } | ||||||
|    } |    } | ||||||
|    else if (eventHandler != nullptr) |    else if (eventHandler != nullptr) | ||||||
|    { |    { | ||||||
|       // If the event handler changed
 |       // If the event handler changed
 | ||||||
|       if (pickedEventHandler_ != eventHandler) |       if (prevPickedEventHandler != eventHandler) | ||||||
|       { |       { | ||||||
|          // Send leave event to old event handler
 |          // Send leave event to old event handler
 | ||||||
|          if (pickedEventHandler_ != nullptr && |          if (prevPickedEventHandler != nullptr && | ||||||
|              pickedEventHandler_->event_ != nullptr) |              prevPickedEventHandler->event_ != nullptr) | ||||||
|          { |          { | ||||||
|             QEvent event(QEvent::Type::Leave); |             QEvent event(QEvent::Type::Leave); | ||||||
|             pickedEventHandler_->event_(&event); |             prevPickedEventHandler->event_(&event); | ||||||
|          } |          } | ||||||
| 
 | 
 | ||||||
|          // Send enter event to new event handler
 |          // Send enter event to new event handler
 | ||||||
|  | @ -1631,8 +1633,15 @@ void MapWidgetImpl::RunMousePicking() | ||||||
|          } |          } | ||||||
| 
 | 
 | ||||||
|          // Store picked event handler
 |          // Store picked event handler
 | ||||||
|          pickedEventHandler_ = eventHandler; |          weakPickedEventHandler_ = eventHandler; | ||||||
|       } |       } | ||||||
|  | 
 | ||||||
|  |       eventHandler.reset(); | ||||||
|  |    } | ||||||
|  | 
 | ||||||
|  |    if (prevPickedEventHandler != nullptr) | ||||||
|  |    { | ||||||
|  |       prevPickedEventHandler.reset(); | ||||||
|    } |    } | ||||||
| 
 | 
 | ||||||
|    Q_EMIT widget_->MouseCoordinateChanged( |    Q_EMIT widget_->MouseCoordinateChanged( | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Dan Paulat
						Dan Paulat