diff --git a/Userland/Applications/HexEditor/HexEditorWidget.cpp b/Userland/Applications/HexEditor/HexEditorWidget.cpp index 00cb644ea8..00d3bd62e7 100644 --- a/Userland/Applications/HexEditor/HexEditorWidget.cpp +++ b/Userland/Applications/HexEditor/HexEditorWidget.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #include @@ -59,10 +60,20 @@ ErrorOr HexEditorWidget::setup() m_side_panel_container = *find_descendant_of_type_named("side_panel_container"); m_value_inspector_container = *find_descendant_of_type_named("value_inspector_container"); m_value_inspector = *find_descendant_of_type_named("value_inspector"); + m_value_inspector_endianness = *find_descendant_of_type_named("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::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 HexEditorWidget::initialize_menubar(GUI::Window& window) { auto file_menu = window.add_menu("&File"_string); @@ -679,31 +703,8 @@ ErrorOr 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&) { diff --git a/Userland/Applications/HexEditor/HexEditorWidget.gml b/Userland/Applications/HexEditor/HexEditorWidget.gml index cce6468829..02f6770d97 100644 --- a/Userland/Applications/HexEditor/HexEditorWidget.gml +++ b/Userland/Applications/HexEditor/HexEditorWidget.gml @@ -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 diff --git a/Userland/Applications/HexEditor/HexEditorWidget.h b/Userland/Applications/HexEditor/HexEditorWidget.h index 7c6fb7df4e..b0a3a2d6c9 100644 --- a/Userland/Applications/HexEditor/HexEditorWidget.h +++ b/Userland/Applications/HexEditor/HexEditorWidget.h @@ -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 m_statusbar; RefPtr m_toolbar; @@ -99,8 +99,11 @@ private: RefPtr m_search_results; RefPtr m_search_results_container; RefPtr m_side_panel_container; + RefPtr m_value_inspector_container; RefPtr m_value_inspector; + RefPtr m_value_inspector_endianness; + Vector m_endianness_options; RefPtr m_annotations_container; RefPtr m_annotations; diff --git a/Userland/Applications/HexEditor/ValueInspectorModel.h b/Userland/Applications/HexEditor/ValueInspectorModel.h index 7fa3bc4406..9bbec33828 100644 --- a/Userland/Applications/HexEditor/ValueInspectorModel.h +++ b/Userland/Applications/HexEditor/ValueInspectorModel.h @@ -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(); }