mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 01:57:45 +00:00
HexEditor: Add 'Find All' option to Find Dialog to find all matches
This commit is contained in:
parent
d7797c8bf8
commit
6aa766f8ca
9 changed files with 238 additions and 30 deletions
82
Userland/Applications/HexEditor/SearchResultsModel.h
Normal file
82
Userland/Applications/HexEditor/SearchResultsModel.h
Normal file
|
@ -0,0 +1,82 @@
|
|||
/*
|
||||
* Copyright (c) 2021, the SerenityOS developers.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <AK/Hex.h>
|
||||
#include <AK/NonnullRefPtr.h>
|
||||
#include <AK/String.h>
|
||||
#include <AK/Utf8View.h>
|
||||
#include <AK/Vector.h>
|
||||
#include <LibGUI/Model.h>
|
||||
|
||||
struct Match {
|
||||
int offset;
|
||||
String value;
|
||||
};
|
||||
|
||||
class SearchResultsModel final : public GUI::Model {
|
||||
public:
|
||||
enum Column {
|
||||
Offset,
|
||||
Value
|
||||
};
|
||||
|
||||
explicit SearchResultsModel(const Vector<Match>&& matches)
|
||||
: m_matches(move(matches))
|
||||
{
|
||||
}
|
||||
|
||||
virtual int row_count(const GUI::ModelIndex& = GUI::ModelIndex()) const override
|
||||
{
|
||||
return m_matches.size();
|
||||
}
|
||||
|
||||
virtual int column_count(const GUI::ModelIndex&) const override
|
||||
{
|
||||
return 2;
|
||||
}
|
||||
|
||||
String column_name(int column) const override
|
||||
{
|
||||
switch (column) {
|
||||
case Column::Offset:
|
||||
return "Offset";
|
||||
case Column::Value:
|
||||
return "Value";
|
||||
}
|
||||
VERIFY_NOT_REACHED();
|
||||
}
|
||||
|
||||
virtual GUI::Variant data(const GUI::ModelIndex& index, GUI::ModelRole role) const override
|
||||
{
|
||||
if (role == GUI::ModelRole::TextAlignment)
|
||||
return Gfx::TextAlignment::CenterLeft;
|
||||
if (role == GUI::ModelRole::Custom) {
|
||||
auto& match = m_matches.at(index.row());
|
||||
return match.offset;
|
||||
}
|
||||
if (role == GUI::ModelRole::Display) {
|
||||
auto& match = m_matches.at(index.row());
|
||||
switch (index.column()) {
|
||||
case Column::Offset:
|
||||
return String::formatted("{:#08X}", match.offset);
|
||||
case Column::Value: {
|
||||
Utf8View utf8_view(match.value);
|
||||
if (!utf8_view.validate())
|
||||
return {};
|
||||
return StringView(match.value);
|
||||
}
|
||||
}
|
||||
}
|
||||
return {};
|
||||
}
|
||||
|
||||
virtual void update() override { }
|
||||
|
||||
private:
|
||||
Vector<Match> m_matches;
|
||||
};
|
Loading…
Add table
Add a link
Reference in a new issue