HexEditor: Move endianness selector to Value Inspector panel

It's clearer to have the choice here than hidden away in a menu. It also
means we don't need the column heading to say the endianness.
This commit is contained in:
Sam Atkins 2024-05-04 17:12:16 +01:00 committed by Andrew Kaster
parent 6d72d02d7e
commit 926a275794
4 changed files with 48 additions and 26 deletions

View file

@ -24,6 +24,7 @@
#include <LibGUI/Button.h>
#include <LibGUI/FilePicker.h>
#include <LibGUI/InputBox.h>
#include <LibGUI/ItemListModel.h>
#include <LibGUI/Menu.h>
#include <LibGUI/Menubar.h>
#include <LibGUI/MessageBox.h>
@ -59,10 +60,20 @@ ErrorOr<void> HexEditorWidget::setup()
m_side_panel_container = *find_descendant_of_type_named<GUI::DynamicWidgetContainer>("side_panel_container");
m_value_inspector_container = *find_descendant_of_type_named<GUI::Widget>("value_inspector_container");
m_value_inspector = *find_descendant_of_type_named<GUI::TableView>("value_inspector");
m_value_inspector_endianness = *find_descendant_of_type_named<GUI::ComboBox>("value_inspector_endianness");
// FIXME: Set this in GML once the compiler supports it.
m_side_panel_container->set_container_with_individual_order(true);
// TODO: Switch to regular strings once ComboBox::on_change passes a String
m_endianness_options.append("Little Endian");
m_endianness_options.append("Big Endian");
m_value_inspector_endianness->set_model(GUI::ItemListModel<ByteString>::create(m_endianness_options));
m_value_inspector_endianness->set_only_allow_values_from_model(true);
m_value_inspector_endianness->on_change = [this](ByteString const& value, GUI::ModelIndex const&) {
set_inspector_little_endian(value == "Little Endian");
};
m_value_inspector->on_activation = [this](GUI::ModelIndex const& index) {
if (!index.is_valid())
return;
@ -529,6 +540,19 @@ void HexEditorWidget::update_inspector_values(size_t position)
m_value_inspector->update();
}
void HexEditorWidget::set_inspector_little_endian(bool little_endian, bool force)
{
if (m_value_inspector_little_endian == little_endian && !force)
return;
m_value_inspector_little_endian = little_endian;
update_inspector_values(m_editor->selection_start_offset());
m_value_inspector_endianness->set_selected_index(little_endian ? 0 : 1);
Config::write_bool("HexEditor"sv, "Layout"sv, "UseLittleEndianInValueInspector"sv, m_value_inspector_little_endian);
}
ErrorOr<void> HexEditorWidget::initialize_menubar(GUI::Window& window)
{
auto file_menu = window.add_menu("&File"_string);
@ -679,31 +703,8 @@ ErrorOr<void> HexEditorWidget::initialize_menubar(GUI::Window& window)
action->set_checked(true);
}
m_value_inspector_mode_actions.set_exclusive(true);
auto inspector_mode_menu = view_menu->add_submenu("Value Inspector &Mode"_string);
auto little_endian_mode = GUI::Action::create_checkable("&Little Endian", [&](auto& action) {
m_value_inspector_little_endian = action.is_checked();
update_inspector_values(m_editor->selection_start_offset());
Config::write_bool("HexEditor"sv, "Layout"sv, "UseLittleEndianInValueInspector"sv, m_value_inspector_little_endian);
});
m_value_inspector_mode_actions.add_action(little_endian_mode);
inspector_mode_menu->add_action(little_endian_mode);
auto big_endian_mode = GUI::Action::create_checkable("&Big Endian", [this](auto& action) {
m_value_inspector_little_endian = !action.is_checked();
update_inspector_values(m_editor->selection_start_offset());
Config::write_bool("HexEditor"sv, "Layout"sv, "UseLittleEndianInValueInspector"sv, m_value_inspector_little_endian);
});
m_value_inspector_mode_actions.add_action(big_endian_mode);
inspector_mode_menu->add_action(big_endian_mode);
auto use_little_endian = Config::read_bool("HexEditor"sv, "Layout"sv, "UseLittleEndianInValueInspector"sv, true);
m_value_inspector_little_endian = use_little_endian;
little_endian_mode->set_checked(use_little_endian);
big_endian_mode->set_checked(!use_little_endian);
set_inspector_little_endian(use_little_endian, true);
view_menu->add_separator();
view_menu->add_action(GUI::CommonActions::make_fullscreen_action([&](auto&) {

View file

@ -47,6 +47,24 @@
preferred_height: "grow"
visible: false
@GUI::ToolbarContainer {
name: "value_inspector_toolbar_container"
@GUI::Toolbar {
name: "value_inspector_toolbar"
@GUI::Label {
text: "Mode:"
preferred_width: 40
}
@GUI::ComboBox {
name: "value_inspector_endianness"
preferred_width: 120
}
}
}
@GUI::TableView {
name: "value_inspector"
activates_on_selection: true

View file

@ -48,6 +48,7 @@ private:
void set_search_results_visible(bool visible);
void set_value_inspector_visible(bool visible);
void update_inspector_values(size_t position);
void set_inspector_little_endian(bool little_endian, bool force = false);
virtual void drag_enter_event(GUI::DragEvent&) override;
virtual void drop_event(GUI::DropEvent&) override;
@ -91,7 +92,6 @@ private:
GUI::ActionGroup m_offset_format_actions;
GUI::ActionGroup m_bytes_per_row_actions;
GUI::ActionGroup m_value_inspector_mode_actions;
RefPtr<GUI::Statusbar> m_statusbar;
RefPtr<GUI::Toolbar> m_toolbar;
@ -99,8 +99,11 @@ private:
RefPtr<GUI::TableView> m_search_results;
RefPtr<GUI::Widget> m_search_results_container;
RefPtr<GUI::DynamicWidgetContainer> m_side_panel_container;
RefPtr<GUI::Widget> m_value_inspector_container;
RefPtr<GUI::TableView> m_value_inspector;
RefPtr<GUI::ComboBox> m_value_inspector_endianness;
Vector<ByteString> m_endianness_options;
RefPtr<GUI::Widget> m_annotations_container;
RefPtr<GUI::TableView> m_annotations;

View file

@ -69,7 +69,7 @@ public:
case Column::Type:
return "Type"_string;
case Column::Value:
return m_is_little_endian ? "Value (Little Endian)"_string : "Value (Big Endian)"_string;
return "Value"_string;
}
VERIFY_NOT_REACHED();
}