mirror of
https://github.com/ocornut/imgui.git
synced 2025-04-05 05:25:08 +00:00
Demo: (Refactor) Moved code into DemoWindowWidgetsDragAndDrop() section.
This commit is contained in:
parent
9b486e47fe
commit
0758594bd2
1 changed files with 156 additions and 151 deletions
307
imgui_demo.cpp
307
imgui_demo.cpp
|
@ -256,6 +256,7 @@ static void DemoWindowWidgetsCollapsingHeaders();
|
|||
static void DemoWindowWidgetsComboBoxes();
|
||||
static void DemoWindowWidgetsColorAndPickers();
|
||||
static void DemoWindowWidgetsDataTypes();
|
||||
static void DemoWindowWidgetsDragAndDrop();
|
||||
static void DemoWindowWidgetsDragsAndSliders();
|
||||
static void DemoWindowWidgetsImages();
|
||||
static void DemoWindowWidgetsListBoxes();
|
||||
|
@ -833,6 +834,7 @@ static void DemoWindowWidgets(ImGuiDemoWindowData* demo_data)
|
|||
DemoWindowWidgetsComboBoxes();
|
||||
DemoWindowWidgetsColorAndPickers();
|
||||
DemoWindowWidgetsDataTypes();
|
||||
DemoWindowWidgetsDragAndDrop();
|
||||
DemoWindowWidgetsDragsAndSliders();
|
||||
DemoWindowWidgetsImages();
|
||||
DemoWindowWidgetsListBoxes();
|
||||
|
@ -849,157 +851,6 @@ static void DemoWindowWidgets(ImGuiDemoWindowData* demo_data)
|
|||
DemoWindowWidgetsTreeNodes();
|
||||
DemoWindowWidgetsVerticalSliders();
|
||||
|
||||
IMGUI_DEMO_MARKER("Widgets/Drag and drop");
|
||||
if (ImGui::TreeNode("Drag and Drop"))
|
||||
{
|
||||
IMGUI_DEMO_MARKER("Widgets/Drag and drop/Standard widgets");
|
||||
if (ImGui::TreeNode("Drag and drop in standard widgets"))
|
||||
{
|
||||
// ColorEdit widgets automatically act as drag source and drag target.
|
||||
// They are using standardized payload strings IMGUI_PAYLOAD_TYPE_COLOR_3F and IMGUI_PAYLOAD_TYPE_COLOR_4F
|
||||
// to allow your own widgets to use colors in their drag and drop interaction.
|
||||
// Also see 'Demo->Widgets->Color/Picker Widgets->Palette' demo.
|
||||
HelpMarker("You can drag from the color squares.");
|
||||
static float col1[3] = { 1.0f, 0.0f, 0.2f };
|
||||
static float col2[4] = { 0.4f, 0.7f, 0.0f, 0.5f };
|
||||
ImGui::ColorEdit3("color 1", col1);
|
||||
ImGui::ColorEdit4("color 2", col2);
|
||||
ImGui::TreePop();
|
||||
}
|
||||
|
||||
IMGUI_DEMO_MARKER("Widgets/Drag and drop/Copy-swap items");
|
||||
if (ImGui::TreeNode("Drag and drop to copy/swap items"))
|
||||
{
|
||||
enum Mode
|
||||
{
|
||||
Mode_Copy,
|
||||
Mode_Move,
|
||||
Mode_Swap
|
||||
};
|
||||
static int mode = 0;
|
||||
if (ImGui::RadioButton("Copy", mode == Mode_Copy)) { mode = Mode_Copy; } ImGui::SameLine();
|
||||
if (ImGui::RadioButton("Move", mode == Mode_Move)) { mode = Mode_Move; } ImGui::SameLine();
|
||||
if (ImGui::RadioButton("Swap", mode == Mode_Swap)) { mode = Mode_Swap; }
|
||||
static const char* names[9] =
|
||||
{
|
||||
"Bobby", "Beatrice", "Betty",
|
||||
"Brianna", "Barry", "Bernard",
|
||||
"Bibi", "Blaine", "Bryn"
|
||||
};
|
||||
for (int n = 0; n < IM_ARRAYSIZE(names); n++)
|
||||
{
|
||||
ImGui::PushID(n);
|
||||
if ((n % 3) != 0)
|
||||
ImGui::SameLine();
|
||||
ImGui::Button(names[n], ImVec2(60, 60));
|
||||
|
||||
// Our buttons are both drag sources and drag targets here!
|
||||
if (ImGui::BeginDragDropSource(ImGuiDragDropFlags_None))
|
||||
{
|
||||
// Set payload to carry the index of our item (could be anything)
|
||||
ImGui::SetDragDropPayload("DND_DEMO_CELL", &n, sizeof(int));
|
||||
|
||||
// Display preview (could be anything, e.g. when dragging an image we could decide to display
|
||||
// the filename and a small preview of the image, etc.)
|
||||
if (mode == Mode_Copy) { ImGui::Text("Copy %s", names[n]); }
|
||||
if (mode == Mode_Move) { ImGui::Text("Move %s", names[n]); }
|
||||
if (mode == Mode_Swap) { ImGui::Text("Swap %s", names[n]); }
|
||||
ImGui::EndDragDropSource();
|
||||
}
|
||||
if (ImGui::BeginDragDropTarget())
|
||||
{
|
||||
if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload("DND_DEMO_CELL"))
|
||||
{
|
||||
IM_ASSERT(payload->DataSize == sizeof(int));
|
||||
int payload_n = *(const int*)payload->Data;
|
||||
if (mode == Mode_Copy)
|
||||
{
|
||||
names[n] = names[payload_n];
|
||||
}
|
||||
if (mode == Mode_Move)
|
||||
{
|
||||
names[n] = names[payload_n];
|
||||
names[payload_n] = "";
|
||||
}
|
||||
if (mode == Mode_Swap)
|
||||
{
|
||||
const char* tmp = names[n];
|
||||
names[n] = names[payload_n];
|
||||
names[payload_n] = tmp;
|
||||
}
|
||||
}
|
||||
ImGui::EndDragDropTarget();
|
||||
}
|
||||
ImGui::PopID();
|
||||
}
|
||||
ImGui::TreePop();
|
||||
}
|
||||
|
||||
IMGUI_DEMO_MARKER("Widgets/Drag and Drop/Drag to reorder items (simple)");
|
||||
if (ImGui::TreeNode("Drag to reorder items (simple)"))
|
||||
{
|
||||
// FIXME: there is temporary (usually single-frame) ID Conflict during reordering as a same item may be submitting twice.
|
||||
// This code was always slightly faulty but in a way which was not easily noticeable.
|
||||
// Until we fix this, enable ImGuiItemFlags_AllowDuplicateId to disable detecting the issue.
|
||||
ImGui::PushItemFlag(ImGuiItemFlags_AllowDuplicateId, true);
|
||||
|
||||
// Simple reordering
|
||||
HelpMarker(
|
||||
"We don't use the drag and drop api at all here! "
|
||||
"Instead we query when the item is held but not hovered, and order items accordingly.");
|
||||
static const char* item_names[] = { "Item One", "Item Two", "Item Three", "Item Four", "Item Five" };
|
||||
for (int n = 0; n < IM_ARRAYSIZE(item_names); n++)
|
||||
{
|
||||
const char* item = item_names[n];
|
||||
ImGui::Selectable(item);
|
||||
|
||||
if (ImGui::IsItemActive() && !ImGui::IsItemHovered())
|
||||
{
|
||||
int n_next = n + (ImGui::GetMouseDragDelta(0).y < 0.f ? -1 : 1);
|
||||
if (n_next >= 0 && n_next < IM_ARRAYSIZE(item_names))
|
||||
{
|
||||
item_names[n] = item_names[n_next];
|
||||
item_names[n_next] = item;
|
||||
ImGui::ResetMouseDragDelta();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ImGui::PopItemFlag();
|
||||
ImGui::TreePop();
|
||||
}
|
||||
|
||||
IMGUI_DEMO_MARKER("Widgets/Drag and Drop/Tooltip at target location");
|
||||
if (ImGui::TreeNode("Tooltip at target location"))
|
||||
{
|
||||
for (int n = 0; n < 2; n++)
|
||||
{
|
||||
// Drop targets
|
||||
ImGui::Button(n ? "drop here##1" : "drop here##0");
|
||||
if (ImGui::BeginDragDropTarget())
|
||||
{
|
||||
ImGuiDragDropFlags drop_target_flags = ImGuiDragDropFlags_AcceptBeforeDelivery | ImGuiDragDropFlags_AcceptNoPreviewTooltip;
|
||||
if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_4F, drop_target_flags))
|
||||
{
|
||||
IM_UNUSED(payload);
|
||||
ImGui::SetMouseCursor(ImGuiMouseCursor_NotAllowed);
|
||||
ImGui::SetTooltip("Cannot drop here!");
|
||||
}
|
||||
ImGui::EndDragDropTarget();
|
||||
}
|
||||
|
||||
// Drop source
|
||||
static ImVec4 col4 = { 1.0f, 0.0f, 0.2f, 1.0f };
|
||||
if (n == 0)
|
||||
ImGui::ColorButton("drag me", col4);
|
||||
|
||||
}
|
||||
ImGui::TreePop();
|
||||
}
|
||||
|
||||
ImGui::TreePop();
|
||||
}
|
||||
|
||||
IMGUI_DEMO_MARKER("Widgets/Querying Item Status (Edited,Active,Hovered etc.)");
|
||||
if (ImGui::TreeNode("Querying Item Status (Edited/Active/Hovered etc.)"))
|
||||
{
|
||||
|
@ -1912,6 +1763,160 @@ static void DemoWindowWidgetsDataTypes()
|
|||
// [SECTION] DemoWindowWidgetsDragAndDrop()
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
static void DemoWindowWidgetsDragAndDrop()
|
||||
{
|
||||
IMGUI_DEMO_MARKER("Widgets/Drag and drop");
|
||||
if (ImGui::TreeNode("Drag and Drop"))
|
||||
{
|
||||
IMGUI_DEMO_MARKER("Widgets/Drag and drop/Standard widgets");
|
||||
if (ImGui::TreeNode("Drag and drop in standard widgets"))
|
||||
{
|
||||
// ColorEdit widgets automatically act as drag source and drag target.
|
||||
// They are using standardized payload strings IMGUI_PAYLOAD_TYPE_COLOR_3F and IMGUI_PAYLOAD_TYPE_COLOR_4F
|
||||
// to allow your own widgets to use colors in their drag and drop interaction.
|
||||
// Also see 'Demo->Widgets->Color/Picker Widgets->Palette' demo.
|
||||
HelpMarker("You can drag from the color squares.");
|
||||
static float col1[3] = { 1.0f, 0.0f, 0.2f };
|
||||
static float col2[4] = { 0.4f, 0.7f, 0.0f, 0.5f };
|
||||
ImGui::ColorEdit3("color 1", col1);
|
||||
ImGui::ColorEdit4("color 2", col2);
|
||||
ImGui::TreePop();
|
||||
}
|
||||
|
||||
IMGUI_DEMO_MARKER("Widgets/Drag and drop/Copy-swap items");
|
||||
if (ImGui::TreeNode("Drag and drop to copy/swap items"))
|
||||
{
|
||||
enum Mode
|
||||
{
|
||||
Mode_Copy,
|
||||
Mode_Move,
|
||||
Mode_Swap
|
||||
};
|
||||
static int mode = 0;
|
||||
if (ImGui::RadioButton("Copy", mode == Mode_Copy)) { mode = Mode_Copy; } ImGui::SameLine();
|
||||
if (ImGui::RadioButton("Move", mode == Mode_Move)) { mode = Mode_Move; } ImGui::SameLine();
|
||||
if (ImGui::RadioButton("Swap", mode == Mode_Swap)) { mode = Mode_Swap; }
|
||||
static const char* names[9] =
|
||||
{
|
||||
"Bobby", "Beatrice", "Betty",
|
||||
"Brianna", "Barry", "Bernard",
|
||||
"Bibi", "Blaine", "Bryn"
|
||||
};
|
||||
for (int n = 0; n < IM_ARRAYSIZE(names); n++)
|
||||
{
|
||||
ImGui::PushID(n);
|
||||
if ((n % 3) != 0)
|
||||
ImGui::SameLine();
|
||||
ImGui::Button(names[n], ImVec2(60, 60));
|
||||
|
||||
// Our buttons are both drag sources and drag targets here!
|
||||
if (ImGui::BeginDragDropSource(ImGuiDragDropFlags_None))
|
||||
{
|
||||
// Set payload to carry the index of our item (could be anything)
|
||||
ImGui::SetDragDropPayload("DND_DEMO_CELL", &n, sizeof(int));
|
||||
|
||||
// Display preview (could be anything, e.g. when dragging an image we could decide to display
|
||||
// the filename and a small preview of the image, etc.)
|
||||
if (mode == Mode_Copy) { ImGui::Text("Copy %s", names[n]); }
|
||||
if (mode == Mode_Move) { ImGui::Text("Move %s", names[n]); }
|
||||
if (mode == Mode_Swap) { ImGui::Text("Swap %s", names[n]); }
|
||||
ImGui::EndDragDropSource();
|
||||
}
|
||||
if (ImGui::BeginDragDropTarget())
|
||||
{
|
||||
if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload("DND_DEMO_CELL"))
|
||||
{
|
||||
IM_ASSERT(payload->DataSize == sizeof(int));
|
||||
int payload_n = *(const int*)payload->Data;
|
||||
if (mode == Mode_Copy)
|
||||
{
|
||||
names[n] = names[payload_n];
|
||||
}
|
||||
if (mode == Mode_Move)
|
||||
{
|
||||
names[n] = names[payload_n];
|
||||
names[payload_n] = "";
|
||||
}
|
||||
if (mode == Mode_Swap)
|
||||
{
|
||||
const char* tmp = names[n];
|
||||
names[n] = names[payload_n];
|
||||
names[payload_n] = tmp;
|
||||
}
|
||||
}
|
||||
ImGui::EndDragDropTarget();
|
||||
}
|
||||
ImGui::PopID();
|
||||
}
|
||||
ImGui::TreePop();
|
||||
}
|
||||
|
||||
IMGUI_DEMO_MARKER("Widgets/Drag and Drop/Drag to reorder items (simple)");
|
||||
if (ImGui::TreeNode("Drag to reorder items (simple)"))
|
||||
{
|
||||
// FIXME: there is temporary (usually single-frame) ID Conflict during reordering as a same item may be submitting twice.
|
||||
// This code was always slightly faulty but in a way which was not easily noticeable.
|
||||
// Until we fix this, enable ImGuiItemFlags_AllowDuplicateId to disable detecting the issue.
|
||||
ImGui::PushItemFlag(ImGuiItemFlags_AllowDuplicateId, true);
|
||||
|
||||
// Simple reordering
|
||||
HelpMarker(
|
||||
"We don't use the drag and drop api at all here! "
|
||||
"Instead we query when the item is held but not hovered, and order items accordingly.");
|
||||
static const char* item_names[] = { "Item One", "Item Two", "Item Three", "Item Four", "Item Five" };
|
||||
for (int n = 0; n < IM_ARRAYSIZE(item_names); n++)
|
||||
{
|
||||
const char* item = item_names[n];
|
||||
ImGui::Selectable(item);
|
||||
|
||||
if (ImGui::IsItemActive() && !ImGui::IsItemHovered())
|
||||
{
|
||||
int n_next = n + (ImGui::GetMouseDragDelta(0).y < 0.f ? -1 : 1);
|
||||
if (n_next >= 0 && n_next < IM_ARRAYSIZE(item_names))
|
||||
{
|
||||
item_names[n] = item_names[n_next];
|
||||
item_names[n_next] = item;
|
||||
ImGui::ResetMouseDragDelta();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ImGui::PopItemFlag();
|
||||
ImGui::TreePop();
|
||||
}
|
||||
|
||||
IMGUI_DEMO_MARKER("Widgets/Drag and Drop/Tooltip at target location");
|
||||
if (ImGui::TreeNode("Tooltip at target location"))
|
||||
{
|
||||
for (int n = 0; n < 2; n++)
|
||||
{
|
||||
// Drop targets
|
||||
ImGui::Button(n ? "drop here##1" : "drop here##0");
|
||||
if (ImGui::BeginDragDropTarget())
|
||||
{
|
||||
ImGuiDragDropFlags drop_target_flags = ImGuiDragDropFlags_AcceptBeforeDelivery | ImGuiDragDropFlags_AcceptNoPreviewTooltip;
|
||||
if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_4F, drop_target_flags))
|
||||
{
|
||||
IM_UNUSED(payload);
|
||||
ImGui::SetMouseCursor(ImGuiMouseCursor_NotAllowed);
|
||||
ImGui::SetTooltip("Cannot drop here!");
|
||||
}
|
||||
ImGui::EndDragDropTarget();
|
||||
}
|
||||
|
||||
// Drop source
|
||||
static ImVec4 col4 = { 1.0f, 0.0f, 0.2f, 1.0f };
|
||||
if (n == 0)
|
||||
ImGui::ColorButton("drag me", col4);
|
||||
|
||||
}
|
||||
ImGui::TreePop();
|
||||
}
|
||||
|
||||
ImGui::TreePop();
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// [SECTION] DemoWindowWidgetsDragsAndSliders()
|
||||
//-----------------------------------------------------------------------------
|
||||
|
|
Loading…
Add table
Reference in a new issue