GUI: implement scrolltext

issue #1961
applied on Checkbox
This commit is contained in:
tildearrow 2024-11-10 04:14:39 -05:00
parent 76554cb8a2
commit e7375fd733
7 changed files with 78 additions and 23 deletions

View file

@ -1305,6 +1305,10 @@ ImGuiIO::ImGuiIO()
// Inertial scrolling options (when ImGuiConfigFlags_InertialScrollEnable is set)
ConfigInertialScrollToleranceSqr = 36.0f;
// ScrollText options
ScrollTextSpeed = 100.0f;
ScrollTextSpacing = 8.0f;
// Miscellaneous options
MouseDrawCursor = false;
#ifdef __APPLE__

View file

@ -510,6 +510,9 @@ namespace ImGui
IMGUI_API void BulletTextV(const char* fmt, va_list args) IM_FMTLIST(1);
IMGUI_API void SeparatorText(const char* label); // currently: formatted text with an horizontal line
// Widgets: ScrollText (tildearrow)
IMGUI_API void ScrollText(ImGuiID id, const char* text, const ImVec2& pos, ImVec2 size=ImVec2(0,0), bool alwaysScroll=false);
// Widgets: Main
// - Most widgets return true when the value has been changed or when pressed/selected
// - You may also use one of the many IsItemXXX functions (e.g. IsItemActive, IsItemHovered, etc.) to query widget state.
@ -2093,6 +2096,10 @@ struct ImGuiIO
// Inertial scrolling options (when ImGuiConfigFlags_InertialScrollEnable is set)
float ConfigInertialScrollToleranceSqr;// = 36.0f // After a point moves past this distance, inertial scroll begins
// ScrollText options
float ScrollTextSpeed; // = 100.0f;
float ScrollTextSpacing; // = 8.0f;
// Miscellaneous options
bool MouseDrawCursor; // = false // Request ImGui to draw a mouse cursor for you (if you are on a platform without a mouse cursor). Cannot be easily renamed to 'io.ConfigXXX' because this is frequently used by backend implementations.
bool ConfigMacOSXBehaviors; // = defined(__APPLE__) // OS X style: Text editing cursor movement using Alt instead of Ctrl, Shortcuts using Cmd/Super instead of Ctrl, Line/Text Start and End using Cmd+Arrows instead of Home/End, Double click selects by word instead of selecting whole text, Multi-selection in lists uses Cmd/Super instead of Ctrl.

View file

@ -527,6 +527,59 @@ void ImGui::BulletTextV(const char* fmt, va_list args)
RenderText(bb.Min + ImVec2(g.FontSize + style.FramePadding.x * 2, 0.0f), text_begin, text_end, false);
}
//-------------------------------------------------------------------------
// [SECTION] Widgets: ScrollText (tildearrow)
//-------------------------------------------------------------------------
// - ScrollText()
//-------------------------------------------------------------------------
void ImGui::ScrollText(ImGuiID id, const char* text, const ImVec2& pos, ImVec2 size, bool alwaysScroll) {
ImGuiContext& g = *GImGui;
ImGuiWindow* window=g.CurrentWindow;
ImDrawList* dl=window->DrawList;
ImGuiStorage* storage=GetStateStorage();
ImVec2 textSize=ImGui::CalcTextSize(text);
bool mustNotScroll=false;
if (size.x==0) {
size.x=((window->DC.CurrentColumns || g.CurrentTable) ? window->WorkRect.Max : window->ContentRegionRect.Max).x-pos.x;
if (textSize.x<size.x) {
size.x=textSize.x;
mustNotScroll=true;
}
}
if (size.y==0) {
size.y=ImGui::GetFontSize();
}
ImVec2 minArea=pos;
ImVec2 maxArea=ImVec2(
minArea.x+size.x,
minArea.y+size.y
);
ImRect rect=ImRect(minArea,maxArea);
bool hovered=ImGui::IsMouseHoveringRect(rect.Min,rect.Max);
float textPos=storage->GetFloat(id,0.0f);
dl->PushClipRect(minArea,maxArea,true);
if (hovered || alwaysScroll) {
minArea.x-=textPos;
}
dl->AddText(minArea,ImGui::GetColorU32(ImGuiCol_Text),text);
if ((hovered || alwaysScroll) && !mustNotScroll) {
textPos+=ImGui::GetIO().DeltaTime*g.IO.ScrollTextSpeed;
if (textPos>textSize.x) {
textPos-=textSize.x+size.x+g.IO.ScrollTextSpacing;
}
g.IO.IsSomethingHappening=true;
} else {
textPos=0.0;
}
storage->SetFloat(id,textPos);
dl->PopClipRect();
}
//-------------------------------------------------------------------------
// [SECTION] Widgets: Main
//-------------------------------------------------------------------------
@ -1283,8 +1336,9 @@ bool ImGui::Checkbox(const char* label, bool* v)
ImVec2 label_pos = ImVec2(check_bb.Max.x + style.ItemInnerSpacing.x, check_bb.Min.y + style.FramePadding.y);
if (g.LogEnabled)
LogRenderedText(&label_pos, mixed_value ? "[~]" : *v ? "[x]" : "[ ]");
if (label_size.x > 0.0f)
RenderText(label_pos, label);
if (label_size.x > 0.0f) {
ScrollText(id, label, label_pos, ImVec2(0,0), hovered);
}
IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags | ImGuiItemStatusFlags_Checkable | (*v ? ImGuiItemStatusFlags_Checked : 0));
return pressed;

View file

@ -347,6 +347,15 @@ void FurnaceGUI::drawDebug() {
}
ImGui::TreePop();
}
if (ImGui::TreeNode("Scroll Text Test")) {
/*
ImGui::ScrollText(ImGui::GetID("scrolltest1"),"Lorem ipsum, quia dolor sit, amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt, ut labore et dolore magnam aliquam quaerat voluptatem. ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?");
ImGui::ScrollText(ImGui::GetID("scrolltest2"),"quis autem vel eum iure reprehenderit");
ImGui::ScrollText(ImGui::GetID("scrolltest3"),"qui in ea voluptate velit esse",ImVec2(100.0f*dpiScale,0),true);
ImGui::ScrollText(ImGui::GetID("scrolltest4"),"quam nihil molestiae consequatur, vel illum, qui dolorem eum fugiat, quo voluptas nulla pariatur?",ImVec2(0,0),true);
*/
ImGui::TreePop();
}
if (ImGui::TreeNode("Pitch Table Calculator")) {
ImGui::InputDouble("Clock",&ptcClock);
ImGui::InputDouble("Divider/FreqBase",&ptcDivider);

View file

@ -548,24 +548,6 @@ void FurnaceGUI::sameLineMaybe(float width) {
if (ImGui::GetContentRegionAvail().x<width) ImGui::NewLine();
}
void FurnaceGUI::ScrollText(ImGuiID id, const char* text, const ImVec2& size, bool alwaysScroll) {
ImDrawList* dl=ImGui::GetWindowDrawList();
ImGuiWindow* window=ImGui::GetCurrentWindow();
ImVec2 minArea=window->DC.CursorPos;
ImVec2 maxArea=ImVec2(
minArea.x+size.x,
minArea.y+size.y
);
ImRect rect=ImRect(minArea,maxArea);
ImGuiStyle& style=ImGui::GetStyle();
ImGui::ItemSize(size,style.FramePadding.y);
if (ImGui::ItemAdd(rect,id)) {
// TODO
dl->AddText(minArea,ImGui::GetColorU32(ImGuiCol_Text),text);
}
}
const char* FurnaceGUI::getSystemName(DivSystem which) {
/*
if (settings.chipNames) {

View file

@ -2792,9 +2792,6 @@ class FurnaceGUI {
// inverted checkbox
bool InvCheckbox(const char* label, bool* value);
// scrolling text
void ScrollText(ImGuiID id, const char* text, const ImVec2& size=ImVec2(0,0), bool alwaysScroll=false);
// mixer stuff
ImVec2 calcPortSetSize(String label, int ins, int outs);
bool portSet(String label, unsigned int portSetID, int ins, int outs, int activeIns, int activeOuts, int& clickedPort, std::map<unsigned int,ImVec2>& portPos);

View file

@ -6497,6 +6497,8 @@ void FurnaceGUI::applyUISettings(bool updateFonts) {
ImGui::GetIO().ConfigWindowsMoveFromTitleBarOnly=settings.moveWindowTitle;
ImGui::GetIO().ConfigInertialScrollToleranceSqr=pow(dpiScale*4.0f,2.0f);
ImGui::GetIO().MouseDoubleClickTime=settings.doubleClickTime;
ImGui::GetIO().ScrollTextSpacing=8.0*dpiScale;
ImGui::GetIO().ScrollTextSpeed=60.0*dpiScale;
for (int i=0; i<256; i++) {
ImVec4& base=uiColors[GUI_COLOR_PATTERN_EFFECT_PITCH];