CoolFace
Datasetpublic

dlxjj/imradv3

sourceHugging Faceupdated 8mo agoView on Hugging Face
0likes263downloads
ui_horiz_layout.cpp388 linesDownload Raw Back to src
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