mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-10-31 06:10:04 +00:00 
			
		
		
		
	Fixing alert dock refresh for both new alerts and expired alerts
Fixes #29
This commit is contained in:
		
							parent
							
								
									704b9e03b9
								
							
						
					
					
						commit
						ed4cc033bb
					
				
					 2 changed files with 64 additions and 5 deletions
				
			
		|  | @ -310,7 +310,8 @@ void AlertModel::HandleAlert(const types::TextEventKey& alertKey, | |||
|    // Update row
 | ||||
|    if (!p->textEventKeys_.contains(alertKey)) | ||||
|    { | ||||
|       beginInsertRows(QModelIndex(), 0, 0); | ||||
|       int newIndex = p->textEventKeys_.size(); | ||||
|       beginInsertRows(QModelIndex(), newIndex, newIndex); | ||||
|       p->textEventKeys_.push_back(alertKey); | ||||
|       endInsertRows(); | ||||
|    } | ||||
|  |  | |||
|  | @ -2,6 +2,12 @@ | |||
| #include <scwx/qt/model/alert_model.hpp> | ||||
| #include <scwx/qt/types/qt_types.hpp> | ||||
| #include <scwx/util/logger.hpp> | ||||
| #include <scwx/util/threads.hpp> | ||||
| 
 | ||||
| #include <chrono> | ||||
| #include <mutex> | ||||
| 
 | ||||
| #include <boost/asio/steady_timer.hpp> | ||||
| 
 | ||||
| namespace scwx | ||||
| { | ||||
|  | @ -16,14 +22,22 @@ static const auto        logger_    = scwx::util::Logger::Create(logPrefix_); | |||
| class AlertProxyModelImpl | ||||
| { | ||||
| public: | ||||
|    explicit AlertProxyModelImpl(); | ||||
|    ~AlertProxyModelImpl() = default; | ||||
|    explicit AlertProxyModelImpl(AlertProxyModel* self); | ||||
|    ~AlertProxyModelImpl(); | ||||
| 
 | ||||
|    void UpdateAlerts(); | ||||
| 
 | ||||
|    AlertProxyModel* self_; | ||||
| 
 | ||||
|    bool alertActiveFilterEnabled_; | ||||
| 
 | ||||
|    boost::asio::steady_timer alertUpdateTimer_; | ||||
|    std::mutex                alertMutex_ {}; | ||||
| }; | ||||
| 
 | ||||
| AlertProxyModel::AlertProxyModel(QObject* parent) : | ||||
|     QSortFilterProxyModel(parent), p(std::make_unique<AlertProxyModelImpl>()) | ||||
|     QSortFilterProxyModel(parent), | ||||
|     p(std::make_unique<AlertProxyModelImpl>(this)) | ||||
| { | ||||
| } | ||||
| AlertProxyModel::~AlertProxyModel() = default; | ||||
|  | @ -63,8 +77,52 @@ bool AlertProxyModel::filterAcceptsRow(int                sourceRow, | |||
|           QSortFilterProxyModel::filterAcceptsRow(sourceRow, sourceParent); | ||||
| } | ||||
| 
 | ||||
| AlertProxyModelImpl::AlertProxyModelImpl() : alertActiveFilterEnabled_ {false} | ||||
| AlertProxyModelImpl::AlertProxyModelImpl(AlertProxyModel* self) : | ||||
|     self_ {self}, | ||||
|     alertActiveFilterEnabled_ {false}, | ||||
|     alertUpdateTimer_ {scwx::util::io_context()} | ||||
| { | ||||
|    // Schedule alert update
 | ||||
|    UpdateAlerts(); | ||||
| } | ||||
| 
 | ||||
| AlertProxyModelImpl::~AlertProxyModelImpl() | ||||
| { | ||||
|    std::unique_lock lock(alertMutex_); | ||||
|    alertUpdateTimer_.cancel(); | ||||
| } | ||||
| 
 | ||||
| void AlertProxyModelImpl::UpdateAlerts() | ||||
| { | ||||
|    logger_->trace("UpdateAlerts"); | ||||
| 
 | ||||
|    // Take a unique lock before modifying feature lists
 | ||||
|    std::unique_lock lock(alertMutex_); | ||||
| 
 | ||||
|    // Re-evaluate for expired alerts
 | ||||
|    if (alertActiveFilterEnabled_) | ||||
|    { | ||||
|       self_->invalidateRowsFilter(); | ||||
|    } | ||||
| 
 | ||||
|    using namespace std::chrono; | ||||
|    alertUpdateTimer_.expires_after(15s); | ||||
|    alertUpdateTimer_.async_wait( | ||||
|       [=](const boost::system::error_code& e) | ||||
|       { | ||||
|          if (e == boost::asio::error::operation_aborted) | ||||
|          { | ||||
|             logger_->debug("Alert update timer cancelled"); | ||||
|          } | ||||
|          else if (e != boost::system::errc::success) | ||||
|          { | ||||
|             logger_->warn("Alert update timer error: {}", e.message()); | ||||
|          } | ||||
|          else | ||||
|          { | ||||
|             UpdateAlerts(); | ||||
|          } | ||||
|       }); | ||||
| } | ||||
| 
 | ||||
| } // namespace model
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Dan Paulat
						Dan Paulat