Example #1
0
bool PHPWorkspace::CanCreateProjectAtPath(const wxFileName& projectFileName, bool prompt) const
{
    wxString newpath = projectFileName.GetPath(wxPATH_GET_SEPARATOR | wxPATH_GET_VOLUME);
    const PHPProject::Map_t& projects = GetProjects();
    PHPProject::Map_t::const_iterator iter = projects.begin();
    for(; iter != projects.end(); ++iter) {
        if(newpath.StartsWith(iter->second->GetFilename().GetPath(wxPATH_GET_SEPARATOR | wxPATH_GET_VOLUME))) {
            // The new path is a sub folder of a project
            if(prompt) {
                wxString message;
                message << _("Unable to create a project at the selected path\n") << _("Path '") << newpath
                        << _("' is already part of project '") << iter->second->GetName() << "'";
                ::wxMessageBox(message, "CodeLite", wxOK | wxICON_ERROR | wxCENTER);
            }
            return false;

        } else if(iter->second->GetFilename().GetPath(wxPATH_GET_SEPARATOR | wxPATH_GET_VOLUME).StartsWith(newpath)) {
            // The new project is a parent of an existing project
            if(prompt) {
                wxString message;
                message << _("Unable to create a project at the selected path\n") << _("Project '")
                        << iter->second->GetName() << _("' is located under this path");
                ::wxMessageBox(message, "CodeLite", wxOK | wxICON_ERROR | wxCENTER);
            }
            return false;
        }
    }
    return true;
}
Example #2
0
wxArrayString PHPWorkspace::GetWorkspaceProjects() const
{
    wxArrayString projectArr;
    PHPProject::Map_t projects = GetProjects();
    std::for_each(projects.begin(), projects.end(), [&](PHPProject::Map_t::value_type p) {
        projectArr.Add(p.second->GetName());
    });
    return projectArr;
}
Example #3
0
void Application::ShowMainGUIWindow()
{
  //Settings
  ImVec4  const   headingClr(1.0f, 0.0f, 1.0f, 1.0f);
  int     const   nSpacing        = 3;
  float   const   sliderOffset    = -90.0f;
  float   const   vRotMins[2]     = { 0.0f, 0.0f };
  float   const   vRotMaxs[2]     = { Dg::Constants<float>::PI * 2.0f, Dg::Constants<float>::PI };
  char    const * vRotformats[2]  = { "yaw = %.2f", "pitch = %.2f" };
  float   const   powers2[2]      = { 1.0f, 1.0f };
  float   const   posMins[3]      = { -10.0f, -10.0f, -10.0f };
  float   const   posMaxs[3]      = { 10.0f, 10.0f, 10.0f };
  char    const * posFormats[3]   = { "x = %.2f", "y = %.2f", "z = %.2f" };
  float   const   powers3[3]      = { 1.0f, 1.0f, 1.0f };

  //Statics for saving...
  static int          save_currentItem = -1;
  static int          save_lastItem = -2;
  static char         save_buf[128] = {};
  static std::string  save_finalFile;

  //Statics for opening...
  static int          open_currentItem = -1;

  ImGui::Begin("Editor");

  //----------------------------------------------------------------------------------
  //  Menu Bar
  //----------------------------------------------------------------------------------
  if (ImGui::BeginMenuBar())
  {
    if (ImGui::BeginMenu("File"))
    {
      if (ImGui::MenuItem("New")) 
      {
        m_windowStack.push(Modal::NewProjectRequest);
        if (m_projData.dirty)
        {
          m_windowStack.push(Modal::SavePrompt);
        }
      }
      if (ImGui::MenuItem("Open"))
      {
        m_windowStack.push(Modal::OpenWindow);
        if (m_projData.dirty)
        {
          m_windowStack.push(Modal::SavePrompt);
        }
      }
      if (ImGui::MenuItem("Save")) 
      {
        if (m_projData.name == "")
        {
          m_windowStack.push(Modal::SaveAsWindow);
        }
        else
        {
          Event_SaveProject e;
          e.SetFileName(m_projectPath + m_projData.name + "." + m_fileExt);
          m_eventManager.PushEvent(e);
        }
      }
      if (ImGui::MenuItem("Save As.."))
      {
        m_windowStack.push(Modal::SaveAsWindow);
      }
      ImGui::Separator();
      if (ImGui::MenuItem("Quit", "Esc")) { m_shouldQuit = true; }
      ImGui::EndMenu();
    }
    if (ImGui::BeginMenu("Options"))
    {
      ImGui::MenuItem("Example UI", NULL, &UI::showExampleWindow);
      ImGui::Separator();
      ImGui::MenuItem("Blending", NULL, &UI::showAlphaBlendingWindow);
      ImGui::MenuItem("Metrics", NULL, &UI::showMetrics);
      ImGui::EndMenu();
    }
    if (ImGui::BeginMenu("Help"))
    {
      if (ImGui::MenuItem("View Help", NULL, &UI::showHelp)) 
      { 
        m_windowStack.push(Modal::ViewHelp); 
      }
      ImGui::Separator();
      if (ImGui::MenuItem("About", NULL, &UI::showAbout))
      {
        m_windowStack.push(Modal::ViewAbout);
      }
      ImGui::EndMenu();
    }
    ImGui::EndMenuBar();
  }


  //----------------------------------------------------------------------------------
  //  Help Window
  //----------------------------------------------------------------------------------
  if (!m_windowStack.empty() && m_windowStack.top() == Modal::ViewHelp)
  {
    ImGui::OpenPopup("Help");
  }
  if (ImGui::BeginPopupModal("Help", NULL, ImGuiWindowFlags_AlwaysAutoResize))
  {
    ImGui::Text("Helpful tips:");
    ImGui::BulletText("Add / remove particle emitters and attractors.");
    ImGui::BulletText("Unchecking the 'Relative Force' option may increase performance");
    ImGui::Text(""); ImGui::SameLine(ImGui::GetWindowWidth() - 140.0f);
    if (ImGui::Button("OK", ImVec2(130, 0)))
    {
      UI::showHelp = false;
      m_windowStack.pop();
      ImGui::CloseCurrentPopup();
    }
    ImGui::EndPopup();
  }


  //----------------------------------------------------------------------------------
  //  About Window
  //----------------------------------------------------------------------------------
  if (!m_windowStack.empty() && m_windowStack.top() == Modal::ViewAbout)
  {
    ImGui::OpenPopup("About");
  }
  if (ImGui::BeginPopupModal("About", NULL, ImGuiWindowFlags_AlwaysAutoResize))
  {
    ImGui::Text("A simple particle system using components from the Dg library.");
    if (ImGui::Button("OK", ImVec2(130, 0)))
    {
      UI::showAbout = false;
      m_windowStack.pop();
      ImGui::CloseCurrentPopup();
    }
    ImGui::EndPopup();
  }


  //----------------------------------------------------------------------------------
  //  New Project created info box
  //----------------------------------------------------------------------------------
  if (!m_windowStack.empty() && m_windowStack.top() == Modal::NewProjectRequest)
  {
    Event_NewProject e;
    m_eventManager.PushEvent(e);
    m_windowStack.pop();
  }


  //----------------------------------------------------------------------------------
  //  Save Prompt
  //----------------------------------------------------------------------------------
  if (!m_windowStack.empty() && m_windowStack.top() == Modal::SavePrompt)
  {
    ImGui::OpenPopup("Save current Project?");
  }
  if (ImGui::BeginPopupModal("Save current Project?", NULL, ImGuiWindowFlags_AlwaysAutoResize))
  {
    bool finished = false;
    if (ImGui::Button("Yes", ImVec2(80, 0)))
    {
      m_windowStack.pop();
      m_windowStack.push(Modal::SaveAsWindow);
      ImGui::CloseCurrentPopup();
    }
    ImGui::SameLine();
    if (ImGui::Button("No", ImVec2(80, 0)))
    {
      m_windowStack.pop();
      ImGui::CloseCurrentPopup();
    }
    ImGui::EndPopup();
  }


  //----------------------------------------------------------------------------------
  //  Overwrite Prompt
  //----------------------------------------------------------------------------------
  if (!m_windowStack.empty() && m_windowStack.top() == Modal::OverwriteWindow)
  {
    ImGui::OpenPopup("Overwrite?");
  }
  if (ImGui::BeginPopupModal("Overwrite?", NULL, ImGuiWindowFlags_AlwaysAutoResize))
  {
    ImGui::Text("File already exists. Overwrite?");
    if (ImGui::Button("Yes", ImVec2(80, 0)))
    {
      //Save...
      m_projData.name = std::string(save_buf);
      Event_SaveProject e;
      e.SetFileName(save_finalFile);
      m_eventManager.PushEvent(e);

      //Reset
      memset(save_buf, 0, sizeof(save_buf) / sizeof(char));
      save_lastItem = -2;
      save_currentItem = -1;
      m_windowStack.pop();
      ImGui::CloseCurrentPopup();
    }
    ImGui::SameLine();
    if (ImGui::Button("No", ImVec2(80, 0)))
    {
      m_windowStack.pop();
      m_windowStack.push(Modal::SaveAsWindow);
      ImGui::CloseCurrentPopup();
    }
    ImGui::EndPopup();
  }


  //----------------------------------------------------------------------------------
  //  Save As Window
  //----------------------------------------------------------------------------------
  if (!m_windowStack.empty() && m_windowStack.top() == Modal::SaveAsWindow)
  {
    ImGui::OpenPopup("Save As..");
  }
  if (ImGui::BeginPopupModal("Save As..", NULL, ImGuiWindowFlags_AlwaysAutoResize))
  {
    std::vector<std::string> files = GetProjects();

    CreateFileList(files, "Files", &save_currentItem);

    if (save_currentItem != save_lastItem && save_currentItem >= 0)
    {
      strcpy_s(save_buf, 128, files[save_currentItem].data());
      save_lastItem = save_currentItem;
    }
    ImGui::InputText("File name", save_buf, 128);

    bool shouldClose = false;
    bool shouldReset = true;
    if (ImGui::Button("Save", ImVec2(120, 0)))
    {
      save_finalFile = m_projectPath + std::string(save_buf);
      std::string dotExt = std::string(".") + m_fileExt;
      if (save_finalFile.rfind(dotExt) != save_finalFile.size() - 4)
      {
        save_finalFile += dotExt;
      }
      m_windowStack.pop();
      shouldClose = true;
      if (FileExists(save_finalFile))
      {
        m_windowStack.push(Modal::OverwriteWindow);
        shouldReset = false;
      }
      else
      {
        //Save...
        m_projData.name = std::string(save_buf);
        Event_SaveProject e;
        e.SetFileName(save_finalFile);
        m_eventManager.PushEvent(e);
      }
    }
    ImGui::SameLine();
    if (ImGui::Button("Cancel", ImVec2(120, 0)))
    {
      m_windowStack.pop();
      shouldClose = true;
    }

    if (shouldClose)
    {
      if (shouldReset)
      {
        memset(save_buf, 0, sizeof(save_buf) / sizeof(save_buf[0]));
        save_lastItem = -2;
        save_currentItem = -1;
      }

      ImGui::CloseCurrentPopup();
    }
    ImGui::EndPopup();
  }


  //----------------------------------------------------------------------------------
  //  Open Project Window
  //----------------------------------------------------------------------------------
  if (!m_windowStack.empty() && m_windowStack.top() == Modal::OpenWindow)
  {
    ImGui::OpenPopup("Open file");
  }
  if (ImGui::BeginPopupModal("Open file", NULL, ImGuiWindowFlags_AlwaysAutoResize))
  {
    std::vector<std::string> files = GetProjects();
    CreateFileList(files, "Files", &open_currentItem);

    bool finished = false;
    if (ImGui::Button("Open", ImVec2(120, 0)))
    {
      if (open_currentItem != -1)
      {
        m_projData.name = files[open_currentItem];
        Event_LoadProject e;
        e.SetFileName(m_projectPath + files[open_currentItem]);
        m_eventManager.PushEvent(e);
      }
      finished = true;
    }
    ImGui::SameLine();
    if (ImGui::Button("Cancel", ImVec2(120, 0)))
    {
      finished = true;
    }
    if (finished)
    {
      open_currentItem = -1;
      m_windowStack.pop();
      ImGui::CloseCurrentPopup();
    }
    ImGui::EndPopup();
  }

  //----------------------------------------------------------------------------------
  //  General particle sytem options
  //----------------------------------------------------------------------------------
  if (ImGui::CollapsingHeader("Particle system options", ImGuiTreeNodeFlags_DefaultOpen))
  {
    ImGui::TextColored(headingClr, "Optional updaters");
    ImGui::Checkbox("Color", &m_projData.parSysOpts[0].useUpdaterColor);
    ImGui::Checkbox("Size", &m_projData.parSysOpts[0].useUpdaterSize);
    ImGui::Checkbox("Relative force", &m_projData.parSysOpts[0].useUpdaterRelativeForce);
  }


  //----------------------------------------------------------------------------------
  //  Emitters
  //----------------------------------------------------------------------------------
  if (ImGui::CollapsingHeader("Emitters", ImGuiTreeNodeFlags_DefaultOpen))
  {
    if (ImGui::Button("Add Emitter"))
    {
      m_projData.newEmitters++;
    }

    ImGui::SameLine();
    if (ImGui::Button("Kill Emitter")
      && m_projData.emitterFocus >= 0
      && m_projData.emitterFocus < m_projData.eData.size())
    {
      m_projData.eData[m_projData.emitterFocus].first.shouldDie = true;
    }

    //This doesn't work :( Have to use char**
    //typedef char inner_array_t[32];
    //inner_array_t * currentEmitters = new inner_array_t[4];

    char ** currentEmitters = new char*[m_projData.eData.size()];
    for (int i = 0; i < m_projData.eData.size(); ++i)
    {
      currentEmitters[i] = new char[32]();
      sprintf_s(currentEmitters[i], 32, "Emitter %i", m_projData.eData[i].first.ID);
    }
    ImGui::PushItemWidth(sliderOffset);
    ImGui::ListBox("Emitter", &m_projData.emitterFocus, (char const **)currentEmitters, (int)m_projData.eData.size(), 5);
    ImGui::PopItemWidth();
    ImGui::Separator();

    for (int i = 0; i < m_projData.eData.size(); ++i)
    {
      delete[] currentEmitters[i];
    }
    delete[] currentEmitters;

    if (m_projData.eData.size() > 0)
    {
      EmitterData & curEmData = m_projData.eData[m_projData.emitterFocus].first;

      CreateSpacing(nSpacing);
      ImGui::Checkbox("Turn emitter off/on", &curEmData.on);

      CreateSpacing(nSpacing);
      ImGui::TextColored(headingClr, "Emission method");
      ImGui::RadioButton("Linear", &curEmData.type, E_Emitter_Linear); ImGui::SameLine();
      ImGui::RadioButton("Random", &curEmData.type, E_Emitter_Random);

      CreateSpacing(nSpacing);
      ImGui::TextColored(headingClr, "Define emitter shape");
      ImGui::RadioButton("Point", &curEmData.posGenMethod, E_GenPosPoint); ImGui::SameLine();
      //ImGui::RadioButton("Box", &curEmData.posGenMethod, E_GenPosBox); ImGui::SameLine();
      ImGui::RadioButton("Sphere", &curEmData.posGenMethod, E_GenPosSphere);

      if (curEmData.posGenMethod == E_GenPosBox)
      {
        float mins[3] = { 0.0f, 0.0f, 0.0f };
        float maxs[3] = { 10.0f, 10.0f, 10.0f };
        char const * formats[3] = { "l = %.2f", "w = %.2f", "h = %.2f" };
        ImGui::PushItemWidth(sliderOffset);
        ImGui::SliderFloatNi("Dimensions", &curEmData.boxDim[0], 3, mins, maxs, formats, powers3);
        ImGui::PopItemWidth();
      }

      if (curEmData.posGenMethod == E_GenPosSphere)
      {
        CreateSpacing(nSpacing);
        ImGui::TextColored(headingClr, "Define sphere geometry");
        ImGui::PushItemWidth(sliderOffset);
        ImGui::SliderFloat("Radius", &curEmData.transform[6], 0.0f, 10.0f, "%.1f");
        ImGui::PopItemWidth();
      }

      {
        CreateSpacing(nSpacing);
        ImGui::TextColored(headingClr, "Place Emitter");
        ImGui::PushItemWidth(sliderOffset);
        ImGui::SliderFloatNi("Position", &curEmData.transform[0], 3, posMins, posMaxs, posFormats, powers3);
        ImGui::PopItemWidth();
      }


      //TODO 2D placer
      //if (UI::showEmitterPlacer)
      //{
      //ImGui::Begin("Place Emitter"); ImGui::PushStyleColor(ImGuiCol_Button, ImColor::HSV(1 / 7.0f, 0.6f, 0.6f));
      //ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImColor::HSV(1 / 7.0f, 0.7f, 0.6f));
      //ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImColor::HSV(1 / 7.0f, 0.8f, 0.6f));
      //ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0, 0));
      //ImGui::Button("Drag Me", ImVec2(100.0f, 100.0f));
      //ImGui::PopStyleVar();
      //ImGui::PopStyleColor(3);
      //if (ImGui::IsItemActive())
      //{
      //ImVec2 rect_min = ImGui::GetItemRectMin();
      //ImVec2 rect_max = ImGui::GetItemRectMax();
      //
      //ImVec2 relPos;
      //relPos.x = (ImGui::GetIO().MousePos.x - rect_min.x) / (rect_max.x / rect_min.x);
      //relPos.y = (ImGui::GetIO().MousePos.y - rect_min.y) / (rect_max.y / rect_min.y);
      //
      //ImGui::Text("Rel pos (%.1f, %.1f)", relPos.x, relPos.y);
      //}
      //if (ImGui::Button("Close"))
      //{
      //UI::showEmitterPlacer = false;
      //}
      //ImGui::End();
      //}


      if (curEmData.posGenMethod == E_GenPosBox)
      {
        float mins[3] = { 0.0f, 0.0f, 0.0f };
        float maxs[3] = { Dg::Constants<float>::PI * 2.0f, Dg::Constants<float>::PI * 2.0f, Dg::Constants<float>::PI * 2.0f };
        char const * formats[3] = { "rz = %.2f", "ry = %.2f", "rx = %.2f" };
        float powers[3] = { 1.0f, 1.0f, 1.0f };
        ImGui::PushItemWidth(sliderOffset);
        ImGui::SliderFloatNi("Rotation", &curEmData.transform[3], 3, mins, maxs, formats, powers);
        ImGui::PopItemWidth();
      }

      CreateSpacing(nSpacing);
      ImGui::TextColored(headingClr, "Define Initial velocity vector");
      ImGui::RadioButton("Direction", &curEmData.velGenMethod, E_GenVelCone); ImGui::SameLine();
      ImGui::RadioButton("Outwards", &curEmData.velGenMethod, E_GenVelOutwards);

      if (curEmData.velGenMethod == E_GenVelCone)
      {
        float mins[3] = { 0.0f, 0.0f, 0.0f };
        float maxs[3] = { Dg::Constants<float>::PI * 2.0f, Dg::Constants<float>::PI, Dg::Constants<float>::PI };
        char const * formats[3] = { "yaw = %.2f", "pitch = %.2f", "spread = %.2f" };
        float powers[3] = { 1.0f, 1.0f, 1.0f };
        ImGui::PushItemWidth(sliderOffset);
        ImGui::SliderFloatNi("yaw, pitch, sprd", &curEmData.velCone[0], 3, mins, maxs, formats, powers);
        ImGui::PopItemWidth();
      }

      CreateSpacing(nSpacing);
      ImGui::TextColored(headingClr, "Other attributes");
      ImGui::PushItemWidth(sliderOffset);
      ImGui::ColorEdit4("Start color", curEmData.colors);
      ImGui::ColorEdit4("End color", &curEmData.colors[4]);
      ImGui::SliderFloat("Rate", &curEmData.rate, 0.0f, 500.0f, "%.2f par/s", 2.0f);
      ImGui::SliderFloat("Velocity", &curEmData.velocity, 0.0f, 10.0f, "%.2f m/s");
      if (m_projData.parSysOpts[0].useUpdaterRelativeForce)
      {
        ImGui::SliderFloat("Rel force", &curEmData.relativeForce, 0.0f, 10.0f, "%.4f m/s", 3.0f);
      }
      ImGui::SliderFloat("Life", &curEmData.life, 0.0f, 60.0f, "%.2f s");
      ImGui::SliderFloat("Start size", curEmData.sizes, 0.0f, 1.0f, "%.2f m");
      ImGui::SliderFloat("End size", &curEmData.sizes[1], 0.0f, 1.0f, "%.2f m");

      ImGui::PopItemWidth();
    }
  }

  //----------------------------------------------------------------------------------
  //  Attractors
  //----------------------------------------------------------------------------------
  if (ImGui::CollapsingHeader("Attractors", ImGuiTreeNodeFlags_DefaultOpen))
  {
    if (ImGui::Button("Add Attractor"))
    {
      m_projData.newAttractors++;
    }

    ImGui::SameLine();
    if (ImGui::Button("Kill Attractor")
      && m_projData.attrFocus < m_projData.aData.size()
      && m_projData.attrFocus >= 0)
    {
      m_projData.aData[m_projData.attrFocus].first.shouldDie = true;
    }

    char ** currentAttractors = new char*[m_projData.aData.size()];
    for (int i = 0; i < m_projData.aData.size(); ++i)
    {
      currentAttractors[i] = new char[32]();
      sprintf_s(currentAttractors[i], 32, "Attractor %i", m_projData.aData[i].first.ID);
    }
    ImGui::PushItemWidth(sliderOffset);
    ImGui::ListBox("Attractor", &m_projData.attrFocus, (char const **)currentAttractors, (int)m_projData.aData.size(), 5);
    ImGui::PopItemWidth();
    ImGui::Separator();

    for (int i = 0; i < m_projData.aData.size(); ++i)
    {
      delete[] currentAttractors[i];
    }
    delete[] currentAttractors;


    if (m_projData.aData.size() > 0)
    {
      CreateSpacing(nSpacing);

      AttractorData & curAttData = m_projData.aData[m_projData.attrFocus].first;

      ImGui::Checkbox("Show attractor", &curAttData.show);

      ImGui::TextColored(headingClr, "Attractor type");
      ImGui::PushItemWidth(sliderOffset);

      const char* attrForces[] = { "Force is constant", "Force is a function of distance", "Force is a function of sq distance" };
      ImGui::ListBox("Force", &curAttData.attenuationMethod, attrForces, ((int)(sizeof(attrForces) / sizeof(*attrForces))), 3);

      const char* attrShapes[] = { "Global", "Point", "Line", "Plane" };
      ImGui::ListBox("Shape", &curAttData.type, attrShapes, ((int)(sizeof(attrShapes) / sizeof(*attrShapes))), 5);

      CreateSpacing(nSpacing);
      ImGui::TextColored(headingClr, "Strength");
      ImGui::SliderFloat("Strength", &curAttData.strength, -100.0f, 100.0f, "%.2f m/s");
      ImGui::SliderFloat("Max accel", &curAttData.maxAppliedAccelMag, 0.0f, 500.0f, "%.2f m/s", 2.0f);

      CreateSpacing(nSpacing);
      ImGui::TextColored(headingClr, "Position Attractor");
      switch (curAttData.type)
      {
      case E_AttGlobal:
      {
        ImGui::SliderFloatNi("Accel dir", &curAttData.transform[3], 2, vRotMins, vRotMaxs, vRotformats, powers2);
        break;
      }
      case E_AttPoint:
      {
        ImGui::SliderFloatNi("Att Pos", &curAttData.transform[0], 3, posMins, posMaxs, posFormats, powers3);
        break;
      }
      case E_AttLine:
      {
        ImGui::SliderFloatNi("Line origin", &curAttData.transform[0], 3, posMins, posMaxs, posFormats, powers3);
        ImGui::SliderFloatNi("Line dir", &curAttData.transform[3], 2, vRotMins, vRotMaxs, vRotformats, powers2);
        break;
      }
      case E_AttPlane:
      {

        ImGui::SliderFloatNi("Normal", &curAttData.transform[3], 2, vRotMins, vRotMaxs, vRotformats, powers2);
        ImGui::SliderFloatNi("Plane origin", &curAttData.transform[0], 3, posMins, posMaxs, posFormats, powers3);
        break;
      }
      default: //E_AttNone:
      {
        break;
      }
      }

      ImGui::PopItemWidth();
    }
  }
  ImGui::End();
}