From 2e48c5e8688410e31bee78e180b5267e1703d442 Mon Sep 17 00:00:00 2001 From: GenevensiS <66968533+G-e-n-e-v-e-n-s-i-S@users.noreply.github.com> Date: Thu, 22 May 2025 22:15:35 +0200 Subject: [PATCH] Allow "Default" in slider fields --- src/gui/drop_down_list.cpp | 100 ++++++++++++++++++++----------------- src/gui/value/choice.cpp | 28 ++++++----- 2 files changed, 68 insertions(+), 60 deletions(-) diff --git a/src/gui/drop_down_list.cpp b/src/gui/drop_down_list.cpp index 4d263a51..48350125 100644 --- a/src/gui/drop_down_list.cpp +++ b/src/gui/drop_down_list.cpp @@ -15,12 +15,12 @@ #include #include #include - -bool DropDownList::slider_loaded; -wxBitmap DropDownList::slider_left; -wxBitmap DropDownList::slider_right; -wxBitmap DropDownList::slider_center; -wxBitmap DropDownList::slider_tick; + +bool DropDownList::slider_loaded; +wxBitmap DropDownList::slider_left; +wxBitmap DropDownList::slider_right; +wxBitmap DropDownList::slider_center; +wxBitmap DropDownList::slider_tick; // ----------------------------------------------------------------------------- : DropDownHider @@ -110,15 +110,15 @@ void DropDownList::show(bool in_place, wxPoint pos, RealRect* rect) { } // determine dropdown size RealSize border_size(2,2); // GetClientSize() - GetSize(), assume 1px borders - RealSize size; - if (is_slider) { - size.height = 70 + marginH * 2; - size.width = min(1000.0, max(150.0, max(100.0 + count, item_size.width + marginW * 2))); - } else { + RealSize size; + if (is_slider) { + size.height = 70 + marginH * 2; + size.width = min(1000.0, max(150.0, max(100.0 + count, item_size.width + marginW * 2))); + } else { int line_count = 0; for (size_t i = 0; i < count; ++i) if (lineBelow(i)) line_count += 1; - size.height = item_size.height * count + marginH * 2 + line_count; - size.width = item_size.width + marginW * 2; + size.height = item_size.height * count + marginH * 2 + line_count; + size.width = item_size.width + marginW * 2; } // determine placement int parent_height = 0; @@ -316,37 +316,40 @@ void DropDownList::draw(DC& dc) { dc.SetPen(*wxTRANSPARENT_PEN); dc.SetBrush(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); dc.DrawRectangle(0, 0, cs.x, cs.y); - dc.SetFont(*wxNORMAL_FONT); + dc.SetFont(*wxNORMAL_FONT); if (is_slider) { - // If it's a slider, draw the slider - cs = GetClientSize(); - dc.SetPen(*wxBLACK_PEN); + // If it's a slider, draw the slider + cs = GetClientSize(); + dc.SetPen(*wxBLACK_PEN); dc.SetFont(wxFont(12, wxFONTFAMILY_SWISS, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, _("Arial"))); + + String first_item = capitalize(itemText(0)); + if (first_item == _("Default")) first_item = capitalize(itemText(1)); + String last_item = capitalize(itemText(count-1)); int first_text_width; - dc.GetTextExtent(capitalize(itemText(0)), &first_text_width, nullptr); int last_text_width; - dc.GetTextExtent(capitalize(itemText(count-1)), &last_text_width, nullptr); - dc.DrawText(capitalize(itemText(0)), marginW + 4, 14); - dc.DrawText(capitalize(itemText(count-1)), cs.x - marginW - 4 - last_text_width, 14); - - int slider_start = first_text_width + marginW + 16; - int slider_end = cs.x - (last_text_width + marginW + 16); - dc.DrawBitmap(slider_left, slider_start, 14); + dc.GetTextExtent(first_item, &first_text_width, nullptr); + dc.GetTextExtent(last_item, &last_text_width, nullptr); + dc.DrawText(first_item, marginW + 8, 14); + dc.DrawText(last_item, cs.x - last_text_width - marginW - 8, 14); + + int slider_start = first_text_width + marginW + 20; + int slider_end = cs.x - last_text_width - marginW - 20; + dc.DrawBitmap(slider_left, slider_start, 14); for (size_t i = slider_start + 19; i < slider_end - 19; i+=19) { - dc.DrawBitmap(slider_center, i, 14); - } - dc.DrawBitmap(slider_right, slider_end - 19, 14); - - int selected_index = selected_item < 0 ? 0 : selected_item; - int slider_pos = round((double)selected_index/(count - 1) * (slider_end - slider_start)) + slider_start; - dc.DrawBitmap(slider_tick, slider_pos - 7, 9); // -7 cause the bitmap is 15 pixels wide - + dc.DrawBitmap(slider_center, i, 14); + } + dc.DrawBitmap(slider_right, slider_end - 19, 14); + int selected_index = selected_item < 0 ? 0 : selected_item; + int slider_pos = round((double)selected_index/(count-1) * (slider_end - slider_start)) + slider_start; + dc.DrawBitmap(slider_tick, slider_pos - 7, 9); // -7 cause the slider_tick bitmap is 15 pixels wide + int selected_text_width; - dc.GetTextExtent(capitalize(itemText(selected_index)), &selected_text_width, nullptr); - dc.DrawText(capitalize(itemText(selected_index)), slider_pos - selected_text_width/2, 44); + dc.GetTextExtent(capitalize(itemText(selected_index)), &selected_text_width, nullptr); + dc.DrawText(capitalize(itemText(selected_index)), slider_pos - selected_text_width/2, 44); dc.SetFont(*wxNORMAL_FONT); - } else { + } else { // If it's not a slider, draw the list of items int y = marginH - visible_start; for (size_t i = 0; i < count; ++i) { @@ -424,21 +427,24 @@ void DropDownList::onMotion(wxMouseEvent& ev) { ev.Skip(); return; } - // find selected item + // find selected item size_t count = itemCount(); if (is_slider) { + String first_item = capitalize(itemText(0)); + if (first_item == _("Default")) first_item = capitalize(itemText(1)); + String last_item = capitalize(itemText(count-1)); int first_text_width; - GetTextExtent(capitalize(itemText(0)), &first_text_width, nullptr); int last_text_width; - GetTextExtent(capitalize(itemText(count - 1)), &last_text_width, nullptr); - int slider_start = first_text_width + marginW + 16; - int slider_end = cs.x - (last_text_width + marginW + 16); - int slider_pos = ev.GetX(); - if (slider_pos < slider_start) slider_pos = slider_start; - if (slider_pos > slider_end) slider_pos = slider_end; - int selected_item = round(((double)(slider_pos - slider_start)) / (slider_end - slider_start) * (count - 1)); + GetTextExtent(first_item, &first_text_width, nullptr); + GetTextExtent(last_item, &last_text_width, nullptr); + int slider_start = first_text_width + marginW + 20; + int slider_end = cs.x - last_text_width - marginW - 20; + int slider_pos = ev.GetX(); + if (slider_pos < slider_start) slider_pos = slider_start; + if (slider_pos > slider_end) slider_pos = slider_end; + int selected_item = round(((double)(slider_pos - slider_start)) / (slider_end - slider_start) * (count-1)); selectItem(selected_item); - } else { + } else { int startY = marginH - visible_start; for (size_t i = 0; i < count; ++i) { int endY = startY + (int)item_size.height; @@ -570,4 +576,4 @@ BEGIN_EVENT_TABLE(DropDownList,wxPopupWindow) EVT_LEAVE_WINDOW (DropDownList::onMouseLeave) EVT_MOUSEWHEEL (DropDownList::onMouseWheel) EVT_SCROLLWIN (DropDownList::onScroll) -END_EVENT_TABLE () +END_EVENT_TABLE () diff --git a/src/gui/value/choice.cpp b/src/gui/value/choice.cpp index 3e0377ab..1ec70e71 100644 --- a/src/gui/value/choice.cpp +++ b/src/gui/value/choice.cpp @@ -200,28 +200,30 @@ END_EVENT_TABLE() DropDownChoiceList::DropDownChoiceList(Window* parent, bool is_submenu, ValueViewer& cve, ChoiceField::ChoiceP group) : DropDownChoiceListBase(parent, is_submenu, cve, group) -{ - // determine if slider - size_t count = itemCount(); - if (count > 2) { +{ + // determine if slider + size_t count = itemCount(); + if (count > 3) { int value; try { - value = std::stoi(itemText(0).ToStdString()); + String first_item = capitalize(itemText(0)); + if (first_item != _("Default")) value = std::stoi(first_item.ToStdString()); value = std::stoi(itemText(1).ToStdString()); - value = std::stoi(itemText(count - 1).ToStdString()); - // the choices are numbers, use a slider - is_slider = true; - // load slider images if needed - if (!slider_loaded) { + value = std::stoi(itemText(count - 2).ToStdString()); + value = std::stoi(itemText(count - 1).ToStdString()); + // the choices are numbers, use a slider + is_slider = true; + // load slider images if needed + if (!slider_loaded) { slider_loaded = true; slider_left = load_resource_image(_("slider_left")); slider_right = load_resource_image(_("slider_right")); slider_center = load_resource_image(_("slider_center")); slider_tick = load_resource_image(_("slider_tick")); } - } - catch (...) {} - } + } + catch (...) {} + } } void DropDownChoiceList::onShow() {