Compare commits
	
		
			7 Commits
		
	
	
		
			d230662924
			...
			8d60355ccf
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 8d60355ccf | |||
| 0551b4f91f | |||
| ecae09f82d | |||
| e68d384340 | |||
| e2c7f5ba75 | |||
| f1d9a07940 | |||
| f5a38892b1 | 
							
								
								
									
										28
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										28
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							@ -360,3 +360,31 @@ jobs:
 | 
			
		||||
      - name: Build Qtk
 | 
			
		||||
        shell: bash
 | 
			
		||||
        run: cmake --build build/ --config Release
 | 
			
		||||
 | 
			
		||||
  release:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    if: startsWith(github.event.workflow_run.head_branch, 'v')
 | 
			
		||||
    needs: [Qtk, Qtk-Library, Qtk-Plugins]
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: Download Installer Artifact
 | 
			
		||||
        uses: actions/download-artifact@v4
 | 
			
		||||
        with:
 | 
			
		||||
          name: Qtk Packages
 | 
			
		||||
          path: |
 | 
			
		||||
            build/packages/*
 | 
			
		||||
            install/*
 | 
			
		||||
 | 
			
		||||
      - name: Create GitHub Release
 | 
			
		||||
        id: create_release
 | 
			
		||||
        uses: softprops/action-gh-release@v1
 | 
			
		||||
        with:
 | 
			
		||||
          tag_name: ${{ github.event.workflow_run.head_branch }}
 | 
			
		||||
          name: Qtk ${{ github.event.workflow_run.head_branch }}
 | 
			
		||||
          draft: true
 | 
			
		||||
          prerelease: false
 | 
			
		||||
          generate_release_notes: true
 | 
			
		||||
          files: |
 | 
			
		||||
            build/packages/*
 | 
			
		||||
            install/*
 | 
			
		||||
        env:
 | 
			
		||||
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
			
		||||
							
								
								
									
										35
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										35
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
								
							@ -1,35 +0,0 @@
 | 
			
		||||
name: Release
 | 
			
		||||
 | 
			
		||||
on:
 | 
			
		||||
  workflow_run:
 | 
			
		||||
    workflows: ["Build"]
 | 
			
		||||
    types:
 | 
			
		||||
      - completed
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  release:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    if: startsWith(github.event.workflow_run.head_branch, 'v')
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: Download Installer Artifact
 | 
			
		||||
        uses: actions/download-artifact@v4
 | 
			
		||||
        with:
 | 
			
		||||
          name: Qtk Packages
 | 
			
		||||
          path: |
 | 
			
		||||
            build/packages/*
 | 
			
		||||
            install/*
 | 
			
		||||
 | 
			
		||||
      - name: Create GitHub Release
 | 
			
		||||
        id: create_release
 | 
			
		||||
        uses: softprops/action-gh-release@v1
 | 
			
		||||
        with:
 | 
			
		||||
          tag_name: ${{ github.event.workflow_run.head_branch }}
 | 
			
		||||
          name: Qtk ${{ github.event.workflow_run.head_branch }}
 | 
			
		||||
          draft: true
 | 
			
		||||
          prerelease: false
 | 
			
		||||
          generate_release_notes: true
 | 
			
		||||
          files: |
 | 
			
		||||
            build/packages/*
 | 
			
		||||
            install/*
 | 
			
		||||
        env:
 | 
			
		||||
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
			
		||||
@ -9,7 +9,11 @@
 | 
			
		||||
# Qtk Application
 | 
			
		||||
################################################################################
 | 
			
		||||
 | 
			
		||||
set(QTK_GUI_SOURCES qtkscene.cpp qtkscene.h main.cpp)
 | 
			
		||||
set(QTK_GUI_SOURCES
 | 
			
		||||
    qtkmainwindow.cpp qtkmainwindow.h qtkmainwindow.ui
 | 
			
		||||
    qtkscene.cpp qtkscene.h
 | 
			
		||||
    main.cpp
 | 
			
		||||
)
 | 
			
		||||
qt_add_executable(qtk_gui ${QTK_GUI_SOURCES})
 | 
			
		||||
target_link_libraries(qtk_gui PRIVATE qtk_plugin_library)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -8,7 +8,7 @@
 | 
			
		||||
 | 
			
		||||
#include <QApplication>
 | 
			
		||||
 | 
			
		||||
#include "designer-plugins/qtkmainwindow.h"
 | 
			
		||||
#include "qtkmainwindow.h"
 | 
			
		||||
#include "qtkscene.h"
 | 
			
		||||
 | 
			
		||||
int main(int argc, char * argv[])
 | 
			
		||||
@ -24,7 +24,7 @@ int main(int argc, char * argv[])
 | 
			
		||||
  // NOTE: We set the scene here and not in QtkMainWindow to detach the scene
 | 
			
		||||
  // from the QtkWidget plugin (qtk_plugin_library build target).
 | 
			
		||||
  // Once we can save / load scenes, this call, and QtkScene, can be removed.
 | 
			
		||||
  window->getQtkWidget()->setScene(new QtkScene);
 | 
			
		||||
  window->setScene(new QtkScene);
 | 
			
		||||
 | 
			
		||||
  window->show();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -25,6 +25,7 @@ MainWindow::MainWindow(QWidget * parent) : QMainWindow(parent)
 | 
			
		||||
  // Initialize static container for all active QtkWidgets
 | 
			
		||||
  auto qtkWidgets = findChildren<Qtk::QtkWidget *>();
 | 
			
		||||
  for (auto & qtkWidget : qtkWidgets) {
 | 
			
		||||
    qtkWidget->setMainWindow(this);
 | 
			
		||||
    // NOTE: Set a temporary scene for the widget to use for initialization.
 | 
			
		||||
    // This should be replaced by loading a scene, or creating a new (unsaved)
 | 
			
		||||
    // scene when Qtk is opened.
 | 
			
		||||
@ -39,6 +40,8 @@ MainWindow::MainWindow(QWidget * parent) : QMainWindow(parent)
 | 
			
		||||
            &Qtk::Scene::sceneUpdated,
 | 
			
		||||
            this,
 | 
			
		||||
            &MainWindow::refreshScene);
 | 
			
		||||
 | 
			
		||||
    // Update the ToolBox details panel when an item is double-clicked.
 | 
			
		||||
    connect(qtkWidget,
 | 
			
		||||
            &Qtk::QtkWidget::objectFocusChanged,
 | 
			
		||||
            ui_->qtk__ToolBox,
 | 
			
		||||
@ -100,3 +103,12 @@ void MainWindow::refreshScene(const QString & sceneName)
 | 
			
		||||
  // TODO: Select TreeView using sceneName
 | 
			
		||||
  ui_->qtk__TreeView->updateView(getQtkWidget()->getScene());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void MainWindow::setScene(Qtk::Scene * scene)
 | 
			
		||||
{
 | 
			
		||||
  connect(scene,
 | 
			
		||||
          &Qtk::Scene::sceneUpdated,
 | 
			
		||||
          MainWindow::getMainWindow(),
 | 
			
		||||
          &MainWindow::refreshScene);
 | 
			
		||||
  ui_->qtk__QtkWidget->setScene(scene);
 | 
			
		||||
}
 | 
			
		||||
@ -14,8 +14,7 @@
 | 
			
		||||
#include <QMainWindow>
 | 
			
		||||
#include <QPlainTextEdit>
 | 
			
		||||
 | 
			
		||||
#include "debugconsole.h"
 | 
			
		||||
#include "designer-plugins/qtkwidget.h"
 | 
			
		||||
#include "designer-plugins/debugconsole.h"
 | 
			
		||||
 | 
			
		||||
namespace Ui
 | 
			
		||||
{
 | 
			
		||||
@ -97,6 +96,11 @@ class MainWindow : public QMainWindow
 | 
			
		||||
     */
 | 
			
		||||
    Qtk::QtkWidget * getQtkWidget(const QString & name);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
       * @param scene The new scene to view.
 | 
			
		||||
     */
 | 
			
		||||
    void setScene(Qtk::Scene * scene);
 | 
			
		||||
 | 
			
		||||
  public slots:
 | 
			
		||||
    /**
 | 
			
		||||
     * Trigger a refresh for widgets related to a scene that has been updated.
 | 
			
		||||
@ -310,19 +310,19 @@
 | 
			
		||||
  <customwidget>
 | 
			
		||||
   <class>Qtk::QtkWidget</class>
 | 
			
		||||
   <extends>QOpenGLWidget</extends>
 | 
			
		||||
   <header>qtkwidget.h</header>
 | 
			
		||||
   <header>designer-plugins/qtkwidget.h</header>
 | 
			
		||||
   <container>1</container>
 | 
			
		||||
  </customwidget>
 | 
			
		||||
  <customwidget>
 | 
			
		||||
   <class>Qtk::TreeView</class>
 | 
			
		||||
   <extends>QDockWidget</extends>
 | 
			
		||||
   <header>treeview.h</header>
 | 
			
		||||
   <header>designer-plugins/treeview.h</header>
 | 
			
		||||
   <container>1</container>
 | 
			
		||||
  </customwidget>
 | 
			
		||||
  <customwidget>
 | 
			
		||||
   <class>Qtk::ToolBox</class>
 | 
			
		||||
   <extends>QDockWidget</extends>
 | 
			
		||||
   <header>toolbox.h</header>
 | 
			
		||||
   <header>designer-plugins/toolbox.h</header>
 | 
			
		||||
   <container>1</container>
 | 
			
		||||
  </customwidget>
 | 
			
		||||
 </customwidgets>
 | 
			
		||||
@ -15,7 +15,6 @@ set(
 | 
			
		||||
    debugconsole.cpp debugconsole.ui
 | 
			
		||||
    toolbox.cpp toolbox.ui
 | 
			
		||||
    treeview.cpp treeview.ui
 | 
			
		||||
    qtkmainwindow.cpp qtkmainwindow.h qtkmainwindow.ui
 | 
			
		||||
)
 | 
			
		||||
set(
 | 
			
		||||
    QTK_PLUGIN_LIBRARY_HEADERS
 | 
			
		||||
 | 
			
		||||
@ -7,19 +7,21 @@
 | 
			
		||||
##############################################################################*/
 | 
			
		||||
 | 
			
		||||
#include <QKeyEvent>
 | 
			
		||||
#include <QMainWindow>
 | 
			
		||||
#include <QMimeData>
 | 
			
		||||
#include <QVBoxLayout>
 | 
			
		||||
 | 
			
		||||
#include "qtk/input.h"
 | 
			
		||||
#include "qtk/scene.h"
 | 
			
		||||
#include "qtk/shape.h"
 | 
			
		||||
 | 
			
		||||
#include "debugconsole.h"
 | 
			
		||||
#include "qtkmainwindow.h"
 | 
			
		||||
#include "qtkwidget.h"
 | 
			
		||||
 | 
			
		||||
using namespace Qtk;
 | 
			
		||||
 | 
			
		||||
/// Static manager for all QtkWidget instances.
 | 
			
		||||
QtkWidgetManager QtkWidget::mWidgetManager;
 | 
			
		||||
 | 
			
		||||
/*******************************************************************************
 | 
			
		||||
 * Constructors, Destructors
 | 
			
		||||
 ******************************************************************************/
 | 
			
		||||
@ -35,9 +37,11 @@ QtkWidget::QtkWidget(QWidget * parent, const QString & name, Scene * scene) :
 | 
			
		||||
    QOpenGLWidget(parent), mDebugLogger(Q_NULLPTR),
 | 
			
		||||
    mConsole(new DebugConsole(this, name)), mScene(Q_NULLPTR)
 | 
			
		||||
{
 | 
			
		||||
  setObjectName(name);
 | 
			
		||||
  mWidgetManager.add_widget(this);
 | 
			
		||||
 | 
			
		||||
  setAcceptDrops(true);
 | 
			
		||||
  setScene(scene);
 | 
			
		||||
  setObjectName(name);
 | 
			
		||||
  QSurfaceFormat format;
 | 
			
		||||
  format.setRenderableType(QSurfaceFormat::OpenGL);
 | 
			
		||||
  format.setProfile(QSurfaceFormat::CoreProfile);
 | 
			
		||||
@ -79,8 +83,10 @@ void QtkWidget::initializeGL()
 | 
			
		||||
  connect(this, SIGNAL(frameSwapped()), this, SLOT(update()));
 | 
			
		||||
 | 
			
		||||
  // Add the debug console widget to the window and set its hidden state.
 | 
			
		||||
  MainWindow::getMainWindow()->addDockWidget(
 | 
			
		||||
      Qt::DockWidgetArea::BottomDockWidgetArea, mConsole);
 | 
			
		||||
  if (mMainWindow != nullptr) {
 | 
			
		||||
    mMainWindow->addDockWidget(Qt::DockWidgetArea::BottomDockWidgetArea,
 | 
			
		||||
                               mConsole);
 | 
			
		||||
  }
 | 
			
		||||
  mConsole->setHidden(!mConsoleActive);
 | 
			
		||||
 | 
			
		||||
  // Initialize OpenGL debug context
 | 
			
		||||
@ -127,10 +133,6 @@ void QtkWidget::setScene(Scene * scene)
 | 
			
		||||
{
 | 
			
		||||
  if (mScene != Q_NULLPTR) {
 | 
			
		||||
    delete mScene;
 | 
			
		||||
    connect(scene,
 | 
			
		||||
            &Scene::sceneUpdated,
 | 
			
		||||
            MainWindow::getMainWindow(),
 | 
			
		||||
            &MainWindow::refreshScene);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  mScene = scene;
 | 
			
		||||
 | 
			
		||||
@ -119,6 +119,18 @@ namespace Qtk
 | 
			
		||||
       */
 | 
			
		||||
      void setScene(Qtk::Scene * scene);
 | 
			
		||||
 | 
			
		||||
      /**
 | 
			
		||||
       * @param window The QMainWindow that owns this QtkWidget.
 | 
			
		||||
       */
 | 
			
		||||
      void setMainWindow(QMainWindow * window) { mMainWindow = window; }
 | 
			
		||||
 | 
			
		||||
      /*************************************************************************
 | 
			
		||||
       * Public Members
 | 
			
		||||
       ************************************************************************/
 | 
			
		||||
 | 
			
		||||
      /// Static manager for all QtkWidget instances.
 | 
			
		||||
      static class QtkWidgetManager mWidgetManager;
 | 
			
		||||
 | 
			
		||||
    public slots:
 | 
			
		||||
 | 
			
		||||
      /**
 | 
			
		||||
@ -211,6 +223,55 @@ namespace Qtk
 | 
			
		||||
      Qtk::Scene * mScene;
 | 
			
		||||
      Qtk::DebugConsole * mConsole;
 | 
			
		||||
      bool mConsoleActive = true;
 | 
			
		||||
      QMainWindow * mMainWindow = Q_NULLPTR;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Struct to help manage QtkWidget instances.
 | 
			
		||||
   * When a QtkWidget is constructed we register it by calling add_widget().
 | 
			
		||||
   * Widgets can be retrieved by their unique name.
 | 
			
		||||
   */
 | 
			
		||||
  struct QtkWidgetManager {
 | 
			
		||||
      /**
 | 
			
		||||
       * Get a QtkWidget by name.
 | 
			
		||||
       *
 | 
			
		||||
       * @param name The name of the QtkWidget to retrieve.
 | 
			
		||||
       */
 | 
			
		||||
      QtkWidget * get_widget(const QString & name = "QtkWidget")
 | 
			
		||||
      {
 | 
			
		||||
        if (mQtkWidgets.count(name) == 0) {
 | 
			
		||||
          qDebug() << this
 | 
			
		||||
                   << " Attempt to get QtkWidget that doesn't exist: " << name;
 | 
			
		||||
          return Q_NULLPTR;
 | 
			
		||||
        }
 | 
			
		||||
        return mQtkWidgets[name];
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      /**
 | 
			
		||||
       * Register a QtkWidget with this manager.
 | 
			
		||||
       *
 | 
			
		||||
       * If the QObject::objectName is unset the widget and QObject is renamed
 | 
			
		||||
       * 'Unamed-QtkWidget'.
 | 
			
		||||
       *
 | 
			
		||||
       * @param widget Pointer to the QtkWidget to register to this manager.
 | 
			
		||||
       */
 | 
			
		||||
      void add_widget(QtkWidget * widget)
 | 
			
		||||
      {
 | 
			
		||||
        auto name = widget->objectName();
 | 
			
		||||
        name = name == "" ? "Unamed-QtkWidget" : name;
 | 
			
		||||
        if (mQtkWidgets.count(name)) {
 | 
			
		||||
          qDebug()
 | 
			
		||||
              << "[QtkWidgetManager " << this
 | 
			
		||||
              << " ] Failed to add a QtkWidget with the previously used name '"
 | 
			
		||||
              << name << "'";
 | 
			
		||||
        }
 | 
			
		||||
        qDebug() << this << " Adding new QtkWidget named '" << name << "'";
 | 
			
		||||
        mQtkWidgets[name] = widget;
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
    private:
 | 
			
		||||
      std::unordered_map<QString, QtkWidget *> mQtkWidgets;
 | 
			
		||||
  };
 | 
			
		||||
}  // namespace Qtk
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -8,7 +8,7 @@
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include "toolbox.h"
 | 
			
		||||
#include "qtkmainwindow.h"
 | 
			
		||||
#include "qtkwidget.h"
 | 
			
		||||
#include "ui_toolbox.h"
 | 
			
		||||
 | 
			
		||||
#include <QFormLayout>
 | 
			
		||||
@ -25,7 +25,7 @@ ToolBox::ToolBox(QWidget * parent) : QDockWidget(parent), ui(new Ui::ToolBox)
 | 
			
		||||
void ToolBox::updateFocus(const QString & name)
 | 
			
		||||
{
 | 
			
		||||
  auto object =
 | 
			
		||||
      MainWindow::getMainWindow()->getQtkWidget()->getScene()->getObject(name);
 | 
			
		||||
      Qtk::QtkWidget::mWidgetManager.get_widget()->getScene()->getObject(name);
 | 
			
		||||
  if (object != Q_NULLPTR) {
 | 
			
		||||
    removePages();
 | 
			
		||||
    createPageProperties(object);
 | 
			
		||||
 | 
			
		||||
@ -8,7 +8,7 @@
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include "treeview.h"
 | 
			
		||||
#include "qtkmainwindow.h"
 | 
			
		||||
#include "qtkwidget.h"
 | 
			
		||||
#include "ui_treeview.h"
 | 
			
		||||
 | 
			
		||||
/*******************************************************************************
 | 
			
		||||
@ -49,7 +49,7 @@ void Qtk::TreeView::updateView(const Qtk::Scene * scene)
 | 
			
		||||
void Qtk::TreeView::itemFocus(QTreeWidgetItem * item, int column)
 | 
			
		||||
{
 | 
			
		||||
  const QString & name = item->text(column);
 | 
			
		||||
  auto scene = MainWindow::getMainWindow()->getQtkWidget()->getScene();
 | 
			
		||||
  auto scene = QtkWidget::mWidgetManager.get_widget()->getScene();
 | 
			
		||||
  auto object = scene->getObject(name);
 | 
			
		||||
  // If the object is a mesh or model, focus the camera on it.
 | 
			
		||||
  if (object == Q_NULLPTR) {
 | 
			
		||||
@ -70,5 +70,5 @@ void Qtk::TreeView::itemFocus(QTreeWidgetItem * item, int column)
 | 
			
		||||
  camera_transform.translate(0.0f, 0.0f, 3.0f);
 | 
			
		||||
 | 
			
		||||
  // Emit signal from qtk widget for new object focus. Triggers GUI updates.
 | 
			
		||||
  emit MainWindow::getMainWindow() -> getQtkWidget()->objectFocusChanged(name);
 | 
			
		||||
  emit QtkWidget::mWidgetManager.get_widget()->objectFocusChanged(name);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -43,7 +43,7 @@ template <> MeshRenderer * Scene::addObject(MeshRenderer * object)
 | 
			
		||||
{
 | 
			
		||||
  initSceneObjectName(object);
 | 
			
		||||
  mMeshes.push_back(object);
 | 
			
		||||
  sceneUpdated(mSceneName);
 | 
			
		||||
  emit sceneUpdated(mSceneName);
 | 
			
		||||
  return object;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -51,7 +51,7 @@ template <> Model * Scene::addObject(Model * object)
 | 
			
		||||
{
 | 
			
		||||
  initSceneObjectName(object);
 | 
			
		||||
  mModels.push_back(object);
 | 
			
		||||
  sceneUpdated(mSceneName);
 | 
			
		||||
  emit sceneUpdated(mSceneName);
 | 
			
		||||
  return object;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -118,10 +118,8 @@ void Scene::setSkybox(Skybox * skybox)
 | 
			
		||||
 | 
			
		||||
void Scene::initSceneObjectName(Object * object)
 | 
			
		||||
{
 | 
			
		||||
  mObjectCount[object->getName()] = mObjectCount.count(object->getName()) + 1;
 | 
			
		||||
 | 
			
		||||
  // If the object exists make it's name unique.
 | 
			
		||||
  auto count = mObjectCount[object->getName()];
 | 
			
		||||
  // If the object name exists make it unique.
 | 
			
		||||
  auto count = ++mObjectCount[object->getName()];
 | 
			
		||||
  if (count > 1) {
 | 
			
		||||
    object->setName(object->getName() + " (" + std::to_string(count) + ")");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user