dlxjj/imradv3
0263
1// Generated with ImRAD 0.82// visit github.com/tpecholt/imrad3 4#include "ui_horiz_layout.h"5#include "node_container.h"6 7HorizLayout horizLayout;8 9void HorizLayout::OpenPopup(std::function<void(ImRad::ModalResult)> clb)10{11 callback = clb;12 modalResult = ImRad::None;13 auto *ioUserData = (ImRad::IOUserData *)ImGui::GetIO().UserData;14 ioUserData->dimBgRatio = 1.f;15 ImGui::OpenPopup(ID);16 Init();17}18 19void HorizLayout::ClosePopup(ImRad::ModalResult mr)20{21 modalResult = mr;22 auto *ioUserData = (ImRad::IOUserData *)ImGui::GetIO().UserData;23 ioUserData->dimBgRatio = 0.f;24}25 26void HorizLayout::Draw()27{28 /// @style imrad29 /// @unit px30 /// @begin TopWindow31 auto* ioUserData = (ImRad::IOUserData*)ImGui::GetIO().UserData;32 ID = ImGui::GetID("###HorizLayout");33 ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, { 10, 10 });34 ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, { 5, 10 });35 ImGui::SetNextWindowSize({ 0, 0 }); //{ 640, 480 }36 bool tmpOpen = true;37 if (ImGui::BeginPopupModal("Table Layout Helper###HorizLayout", &tmpOpen, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoCollapse))38 {39 if (ioUserData->activeActivity != "")40 ImRad::RenderDimmedBackground(ioUserData->WorkRect(), ioUserData->dimBgRatio);41 if (modalResult != ImRad::None)42 {43 ImGui::CloseCurrentPopup();44 if (modalResult != ImRad::Cancel)45 callback(modalResult);46 }47 /// @separator48 49 // TODO: Add Draw calls of dependent popup windows here50 51 /// @begin Text52 ImGui::PushStyleColor(ImGuiCol_Text, ImGui::GetStyle().Colors[ImGuiCol_TextDisabled]);53 ImGui::TextUnformatted("Choose alignment");54 ImGui::PopStyleColor();55 /// @end Text56 57 /// @begin Button58 ImGui::PushStyleColor(ImGuiCol_Button, ImGui::GetStyle().Colors[alignment==0?ImGuiCol_ButtonHovered:ImGuiCol_Button]);59 if (ImGui::Button("\xef\x80\xb6", { 0, 0 }))60 {61 OnAlignment();62 }63 ImGui::PopStyleColor();64 if (ImGui::IsItemHovered(ImGuiHoveredFlags_DelayNormal))65 ImGui::SetTooltip("Align left (removes table layout)");66 /// @end Button67 68 /// @begin Button69 ImGui::SameLine(0, 1 * ImGui::GetStyle().ItemSpacing.x);70 ImGui::PushStyleColor(ImGuiCol_Button, ImGui::GetStyle().Colors[alignment==1?ImGuiCol_ButtonHovered:ImGuiCol_Button]);71 if (ImGui::Button("\xef\x80\xb7", { 0, 0 }))72 {73 OnAlignment();74 }75 ImGui::PopStyleColor();76 if (ImGui::IsItemHovered(ImGuiHoveredFlags_DelayNormal))77 ImGui::SetTooltip("Center");78 /// @end Button79 80 /// @begin Button81 ImGui::SameLine(0, 1 * ImGui::GetStyle().ItemSpacing.x);82 ImGui::PushStyleColor(ImGuiCol_Button, ImGui::GetStyle().Colors[alignment==2?ImGuiCol_ButtonHovered:ImGuiCol_Button]);83 if (ImGui::Button("\xef\x80\xb8", { 0, 0 }))84 {85 OnAlignment();86 }87 ImGui::PopStyleColor();88 if (ImGui::IsItemHovered(ImGuiHoveredFlags_DelayNormal))89 ImGui::SetTooltip("Align right");90 /// @end Button91 92 /// @begin Button93 ImGui::SameLine(0, 1 * ImGui::GetStyle().ItemSpacing.x);94 ImGui::PushStyleColor(ImGuiCol_Button, ImGui::GetStyle().Colors[alignment==3?ImGuiCol_ButtonHovered:ImGuiCol_Button]);95 if (ImGui::Button("\xef\x80\xb9", { 0, 0 }))96 {97 OnAlignment();98 }99 ImGui::PopStyleColor();100 if (ImGui::IsItemHovered(ImGuiHoveredFlags_DelayNormal))101 ImGui::SetTooltip("Align left and right");102 /// @end Button103 104 /// @begin Button105 ImGui::SameLine(0, 1 * ImGui::GetStyle().ItemSpacing.x);106 ImGui::PushStyleColor(ImGuiCol_Button, ImGui::GetStyle().Colors[alignment==4?ImGuiCol_ButtonHovered:ImGuiCol_Button]);107 if (ImGui::Button("\xef\x96\x8d", { 0, 0 }))108 {109 OnAlignment();110 }111 ImGui::PopStyleColor();112 if (ImGui::IsItemHovered(ImGuiHoveredFlags_DelayNormal))113 ImGui::SetTooltip("Regular spacing");114 /// @end Button115 116 /// @begin Text117 ImRad::Spacing(1);118 ImGui::PushStyleColor(ImGuiCol_Text, ImGui::GetStyle().Colors[ImGuiCol_TextDisabled]);119 ImGui::TextUnformatted("Item spacing");120 ImGui::PopStyleColor();121 /// @end Text122 123 /// @begin Selectable124 ImGui::PushStyleVar(ImGuiStyleVar_SelectableTextAlign, { 1.f, 0 });125 ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true);126 ImGui::AlignTextToFramePadding();127 ImRad::Selectable("spacing", false, ImGuiSelectableFlags_DontClosePopups, { 65, 0 });128 ImGui::PopItemFlag();129 ImGui::PopStyleVar();130 /// @end Selectable131 132 /// @begin Input133 ImGui::SameLine(0, 2 * ImGui::GetStyle().ItemSpacing.x);134 if (ImGui::IsWindowAppearing())135 ImGui::SetKeyboardFocusHere();136 ImGui::SetNextItemWidth(100);137 ImGui::InputInt("##spacing", &spacing, 1);138 if (ImGui::IsItemActive())139 ioUserData->imeType = ImRad::ImeNumber;140 /// @end Input141 142 /// @begin Selectable143 ImGui::PushStyleVar(ImGuiStyleVar_SelectableTextAlign, { 1.f, 0 });144 ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true);145 ImGui::AlignTextToFramePadding();146 ImRad::Selectable("padding", false, ImGuiSelectableFlags_DontClosePopups, { 65, 0 });147 ImGui::PopItemFlag();148 ImGui::PopStyleVar();149 /// @end Selectable150 151 /// @begin Input152 ImGui::SameLine(0, 2 * ImGui::GetStyle().ItemSpacing.x);153 ImGui::SetNextItemWidth(100);154 ImGui::InputInt("##padding", &padding, 1);155 if (ImGui::IsItemActive())156 ioUserData->imeType = ImRad::ImeNumber;157 /// @end Input158 159 160 /// @begin Text161 ImRad::Spacing(2);162 ImGui::PushStyleColor(ImGuiCol_Text, ImGui::GetStyle().Colors[ImGuiCol_TextDisabled]);163 ImGui::PushTextWrapPos(0);164 ImGui::TextUnformatted(ImRad::Format("{} items will be aligned", selected.size()).c_str());165 ImGui::PopTextWrapPos();166 ImGui::PopStyleColor();167 /// @end Text168 169 170 /// @begin Button171 ImRad::Spacing(2);172 ImGui::BeginDisabled(selected.empty()||alignment<0);173 if (ImGui::Button("OK", { 100, 30 }))174 {175 Work();176 ClosePopup(ImRad::Ok);177 }178 ImGui::EndDisabled();179 /// @end Button180 181 /// @begin Button182 ImGui::SameLine(0, 2 * ImGui::GetStyle().ItemSpacing.x);183 if (ImGui::Button("Cancel", { 100, 30 }) ||184 ImGui::Shortcut(ImGuiKey_Escape))185 {186 ClosePopup(ImRad::Cancel);187 }188 /// @end Button189 190 /// @separator191 ImGui::EndPopup();192 }193 ImGui::PopStyleVar();194 ImGui::PopStyleVar();195 /// @end TopWindow196}197 198void HorizLayout::OnAlignment()199{200 if (ImGui::GetItemID() == ImGui::GetID(ICON_FA_ALIGN_LEFT))201 alignment = 0;202 else if (ImGui::GetItemID() == ImGui::GetID(ICON_FA_ALIGN_CENTER))203 alignment = 1;204 else if (ImGui::GetItemID() == ImGui::GetID(ICON_FA_ALIGN_RIGHT))205 alignment = 2;206 else if (ImGui::GetItemID() == ImGui::GetID(ICON_FA_ALIGN_JUSTIFY))207 alignment = 3;208 else if (ImGui::GetItemID() == ImGui::GetID(ICON_FA_GRIP))209 alignment = 4;210}211 212void HorizLayout::ExpandSelection(std::vector<UINode*>& selected, UINode* root)213{214 if (selected.empty())215 return;216 selected.resize(1);217 auto* table = dynamic_cast<Table*>(selected[0]);218 bool existingLayout = table && !table->header && !(table->flags & ImGuiTableFlags_Borders);219 if (existingLayout) { //layout table was selected220 if (table->children.empty()) {221 selected.clear();222 return;223 }224 selected[0] = table->children[0].get();225 return ExpandSelection(selected, root);226 }227 auto pos = root->FindChild(selected[0]);228 if (!pos) {229 selected.clear();230 return;231 }232 auto* parent = pos->first;233 table = dynamic_cast<Table*>(parent);234 existingLayout = table && !table->header && !(table->flags & ImGuiTableFlags_Borders);235 for (size_t i = pos->second; i >= 1; --i) {236 const auto& pch = parent->children[i - 1];237 const auto& ch = parent->children[i];238 if (!(ch->Behavior() & UINode::SnapSides) ||239 !(pch->Behavior() & UINode::SnapSides))240 break;241 if (!existingLayout &&242 (!ch->sameLine || ch->nextColumn))243 break;244 selected.insert(selected.begin(), pch.get());245 }246 for (size_t i = pos->second + 1; i < parent->children.size(); ++i) {247 const auto& ch = parent->children[i];248 if (!(ch->Behavior() & UINode::SnapSides))249 break;250 if (!existingLayout &&251 (!ch->sameLine || ch->nextColumn))252 break;253 selected.push_back(ch.get());254 }255}256 257void HorizLayout::Work()258{259 if (selected.empty() || alignment < 0)260 return;261 auto pos = root->FindChild(selected[0]);262 auto* parent = pos->first;263 auto* table = dynamic_cast<Table*>(parent);264 bool existingLayout = table && !table->header && !(table->flags & ImGuiTableFlags_Borders);265 float realPadding = padding * ctx->style.ItemSpacing.x;266 float realSpacing = spacing * ctx->style.ItemSpacing.x;267 268 if (alignment == 0) //left alignment269 {270 //remove table271 if (existingLayout)272 {273 pos = root->FindChild(table);274 parent = pos->first;275 int idx = pos->second;276 for (size_t i = 0; i < selected.size(); ++i)277 {278 auto* item = dynamic_cast<Widget*>(selected[i]);279 item->spacing = i ? spacing : (int)table->spacing;280 item->indent = !i ? padding : 0; //hack281 282 //reparent items283 for (auto it = table->children.begin(); it != table->children.end(); ++it)284 if (it->get() == item) {285 it->release();286 table->children.erase(it);287 break;288 }289 290 item->sameLine = i ? true : false;291 item->nextColumn = false;292 parent->children.insert(parent->children.begin() + idx, std::unique_ptr<Widget>(item));293 ++idx;294 }295 assert(parent->children[idx].get() == table);296 parent->children.erase(parent->children.begin() + idx);297 }298 else299 {300 for (size_t i = 0; i < selected.size(); ++i)301 {302 auto* item = dynamic_cast<Widget*>(selected[i]);303 item->spacing = i ? spacing : (int)item->spacing;304 item->indent = !i ? padding : 0; //hack305 }306 }307 }308 else309 {310 int idx = pos->second;311 //create table312 if (!existingLayout)313 {314 auto tab = std::make_unique<Table>(*ctx);315 auto* item = dynamic_cast<Widget*>(selected[0]);316 tab->sameLine = false;317 tab->spacing = item->spacing;318 table = tab.get();319 parent->children.insert(parent->children.begin() + idx, std::move(tab));320 ++idx;321 }322 table->header = false;323 table->flags = ImGuiTableFlags_NoPadOuterX | ImGuiTableFlags_NoPadInnerX;;324 table->columnData.clear();325 326 if (padding) //left padding327 table->columnData.push_back({ "left-margin", ImGuiTableColumnFlags_WidthFixed, realPadding });328 if (alignment == 1 || alignment == 2) //center, right329 table->columnData.push_back({ "left-stretch", ImGuiTableColumnFlags_WidthStretch });330 331 for (size_t i = 0; i < selected.size(); ++i)332 {333 //reparent items334 auto* item = dynamic_cast<Widget*>(selected[i]);335 if (!existingLayout)336 {337 for (auto it = parent->children.begin(); it != parent->children.end(); ++it)338 if (it->get() == item) {339 it->release();340 parent->children.erase(it);341 break;342 }343 table->children.push_back(std::unique_ptr<Widget>(item));344 }345 item->indent = 0;346 if (alignment == 1 || alignment == 2) //center, right347 {348 if (!i)349 table->columnData.push_back({ "content", ImGuiTableColumnFlags_WidthFixed, 0 });350 item->nextColumn = !i ? (int)table->columnData.size() - 1 : 0;351 item->sameLine = !i ? false : true;352 item->spacing = i ? spacing : 0;353 }354 else if (alignment == 3) //left&right355 {356 if (!i)357 table->columnData.push_back({ "left-content", ImGuiTableColumnFlags_WidthStretch });358 else if (i == selected.size() - 1)359 table->columnData.push_back({ "right-content", ImGuiTableColumnFlags_WidthFixed, 0 });360 361 item->nextColumn = !i ? (int)table->columnData.size() - 1 : i == selected.size() - 1 ? 1 : 0;362 item->sameLine = !i ? false : true;363 item->spacing = i ? spacing : 0;364 }365 else if (alignment == 4) //grid366 {367 if (i && spacing)368 table->columnData.push_back({ "spacing" + std::to_string(i), ImGuiTableColumnFlags_WidthFixed, realSpacing });369 table->columnData.push_back({ "item" + std::to_string(i + 1), ImGuiTableColumnFlags_WidthStretch });370 item->sameLine = false;371 item->nextColumn = !i ? (int)table->columnData.size() - 1 : spacing ? 2 : 1;372 item->spacing = 0;373 }374 }375 376 if (alignment == 1) //center377 table->columnData.push_back({ "right-stretch", ImGuiTableColumnFlags_WidthStretch });378 if (padding) //right padding379 table->columnData.push_back({ "right-margin", ImGuiTableColumnFlags_WidthFixed, realPadding });380 }381}382 383void HorizLayout::Init()384{385 alignment = -1; //force user to choose386 ExpandSelection(selected, root);387}388 