mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 00:22:43 +00:00 
			
		
		
		
	 a4d52b122d
			
		
	
	
		a4d52b122d
		
	
	
	
	
		
			
			Fix a crash when opening a folder, and another one when trying to open a newly created folder. It was not safe to modify a GModelSelection while it's being iterated over. Fixes #536.
		
			
				
	
	
		
			68 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			68 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #pragma once
 | |
| 
 | |
| #include <AK/HashTable.h>
 | |
| #include <LibGUI/GModelIndex.h>
 | |
| 
 | |
| class GAbstractView;
 | |
| 
 | |
| class GModelSelection {
 | |
| public:
 | |
|     GModelSelection(GAbstractView& view)
 | |
|         : m_view(view)
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     int size() const { return m_indexes.size(); }
 | |
|     bool is_empty() const { return m_indexes.is_empty(); }
 | |
|     bool contains(const GModelIndex& index) const { return m_indexes.contains(index); }
 | |
|     bool contains_row(int row) const
 | |
|     {
 | |
|         for (auto& index : m_indexes) {
 | |
|             if (index.row() == row)
 | |
|                 return true;
 | |
|         }
 | |
|         return false;
 | |
|     }
 | |
| 
 | |
|     void set(const GModelIndex&);
 | |
|     void add(const GModelIndex&);
 | |
|     void toggle(const GModelIndex&);
 | |
|     bool remove(const GModelIndex&);
 | |
|     void clear();
 | |
| 
 | |
|     template<typename Callback>
 | |
|     void for_each_index(Callback callback)
 | |
|     {
 | |
|         for (auto& index : indexes())
 | |
|             callback(index);
 | |
|     }
 | |
| 
 | |
|     template<typename Callback>
 | |
|     void for_each_index(Callback callback) const
 | |
|     {
 | |
|         for (auto& index : indexes())
 | |
|             callback(index);
 | |
|     }
 | |
| 
 | |
|     Vector<GModelIndex> indexes() const
 | |
|     {
 | |
|         Vector<GModelIndex> selected_indexes;
 | |
| 
 | |
|         for (auto& index : m_indexes)
 | |
|             selected_indexes.append(index);
 | |
|             
 | |
|         return selected_indexes;
 | |
|     }
 | |
| 
 | |
|     // FIXME: This doesn't guarantee that what you get is the lowest or "first" index selected..
 | |
|     GModelIndex first() const
 | |
|     {
 | |
|         if (m_indexes.is_empty())
 | |
|             return {};
 | |
|         return *m_indexes.begin();
 | |
|     }
 | |
| 
 | |
| private:
 | |
|     GAbstractView& m_view;
 | |
|     HashTable<GModelIndex> m_indexes;
 | |
| };
 |