mirror of
https://github.com/SerenityOS/serenity.git
synced 2026-11-07 04:29:30 -10:00
To support drag-and-drop for LibWeb, the drag events need the full mime data from WindowServer, not just the list of stringified mime types. We only provided the full data in the drop events. This patch provides the Core::MimeData type, as well as other mouse-event information needed for LibWeb (what buttons / modifiers are pressed). To do this, we add a specific WindowServer IPC to inform the Application of the event. We previously tagged mouse-move events with some drag data and formed the drag event client-side. That extra data is removed in favor of this new IPC.
84 lines
2.9 KiB
C++
84 lines
2.9 KiB
C++
/*
|
|
* Copyright (c) 2018-2020, Andreas Kling <[email protected]>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <LibGUI/Model.h>
|
|
|
|
namespace GUI {
|
|
|
|
class SortingProxyModel
|
|
: public Model
|
|
, private ModelClient {
|
|
public:
|
|
static ErrorOr<NonnullRefPtr<SortingProxyModel>> create(NonnullRefPtr<Model> source)
|
|
{
|
|
return adopt_nonnull_ref_or_enomem(new (nothrow) SortingProxyModel(move(source)));
|
|
}
|
|
|
|
virtual ~SortingProxyModel() override;
|
|
|
|
virtual int tree_column() const override { return m_source->tree_column(); }
|
|
virtual int row_count(ModelIndex const& = ModelIndex()) const override;
|
|
virtual int column_count(ModelIndex const& = ModelIndex()) const override;
|
|
virtual ErrorOr<String> column_name(int) const override;
|
|
virtual Variant data(ModelIndex const&, ModelRole = ModelRole::Display) const override;
|
|
virtual void invalidate() override;
|
|
virtual StringView drag_data_type() const override;
|
|
virtual ModelIndex parent_index(ModelIndex const&) const override;
|
|
virtual ModelIndex index(int row, int column, ModelIndex const& parent) const override;
|
|
virtual bool is_editable(ModelIndex const&) const override;
|
|
virtual bool is_searchable() const override;
|
|
virtual void set_data(ModelIndex const&, Variant const&) override;
|
|
virtual Vector<ModelIndex> matches(StringView, unsigned = MatchesFlag::AllMatching, ModelIndex const& = ModelIndex()) override;
|
|
virtual bool accepts_drag(ModelIndex const&, Core::MimeData const&) const override;
|
|
|
|
virtual bool is_column_sortable(int column_index) const override;
|
|
|
|
virtual bool less_than(ModelIndex const&, ModelIndex const&) const;
|
|
|
|
ModelIndex map_to_source(ModelIndex const&) const;
|
|
ModelIndex map_to_proxy(ModelIndex const&) const;
|
|
|
|
ModelRole sort_role() const { return m_sort_role; }
|
|
void set_sort_role(ModelRole role) { m_sort_role = role; }
|
|
|
|
virtual void sort(int column, SortOrder) override;
|
|
|
|
protected:
|
|
explicit SortingProxyModel(NonnullRefPtr<Model> source);
|
|
|
|
private:
|
|
// NOTE: The internal_data() of indices points to the corresponding Mapping object for that index.
|
|
struct Mapping {
|
|
Vector<int> source_rows;
|
|
Vector<int> proxy_rows;
|
|
ModelIndex source_parent;
|
|
};
|
|
|
|
using InternalMapIterator = HashMap<ModelIndex, NonnullOwnPtr<Mapping>>::IteratorType;
|
|
|
|
void sort_mapping(Mapping&, int column, SortOrder);
|
|
|
|
// ^ModelClient
|
|
virtual void model_did_update(unsigned) override;
|
|
|
|
Model& source() { return *m_source; }
|
|
Model const& source() const { return *m_source; }
|
|
|
|
void update_sort(unsigned = UpdateFlag::DontInvalidateIndices);
|
|
InternalMapIterator build_mapping(ModelIndex const& proxy_index);
|
|
|
|
NonnullRefPtr<Model> m_source;
|
|
|
|
HashMap<ModelIndex, NonnullOwnPtr<Mapping>> m_mappings;
|
|
ModelRole m_sort_role { ModelRole::Sort };
|
|
int m_last_key_column { -1 };
|
|
SortOrder m_last_sort_order { SortOrder::Ascending };
|
|
};
|
|
|
|
}
|