Skip to content

Commit

Permalink
qml application with cmake
Browse files Browse the repository at this point in the history
  • Loading branch information
RobBuchananCompPhys committed May 13, 2024
1 parent 7d0de7e commit a803ec3
Show file tree
Hide file tree
Showing 6 changed files with 262 additions and 0 deletions.
49 changes: 49 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,7 @@ if(WIN32)
else(PARALLEL)
set(target_name Dissolve)
set(gui_target_name Dissolve-GUI)
set(qmlgui_target_name Dissolve-GUI-QML)
endif(PARALLEL)

# Adjust external include directories for GUI
Expand All @@ -157,6 +158,7 @@ if(UNIX)
else(PARALLEL)
set(target_name dissolve)
set(gui_target_name dissolve-gui)
set(qmlgui_target_name dissolve-gui-qml)
endif(PARALLEL)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
endif(UNIX)
Expand All @@ -176,6 +178,7 @@ if(APPLE)
else(PARALLEL)
set(target_name dissolve)
set(gui_target_name dissolve-gui)
set(qmlgui_target_name dissolve-gui-qml)
endif(PARALLEL)

add_definitions(-D_MAC)
Expand Down Expand Up @@ -254,6 +257,24 @@ if(GUI)
${Qt6OpenGLWidgets_INCLUDE_DIRS}
)

# Dissolve QML GUI
qt_add_executable(${qmlgui_target_name} MACOSX_BUNDLE ${SRCS}/dissolve-gui-qml.cpp ${SRCS}/gui-qml/resources.qrc)

# Set project-local include directories for target (we expect to need less of these dependencies over time)
target_include_directories(
${qmlgui_target_name}
PRIVATE ${PROJECT_SOURCE_DIR}/src
${PROJECT_BINARY_DIR}/src
${CMAKE_BINARY_DIR}/src/gui/gui_autogen/include
${FREETYPE_INCLUDE_DIRS}
${Qt6Core_INCLUDE_DIRS}
${Qt6Gui_INCLUDE_DIRS}
${Qt6OpenGL_INCLUDE_DIRS}
${Qt6Widgets_INCLUDE_DIRS}
${Qt6OpenGL_INCLUDE_DIRS}
${Qt6OpenGLWidgets_INCLUDE_DIRS}
)

endif(GUI)

# Set basic link libs for executables
Expand Down Expand Up @@ -354,6 +375,34 @@ if(GUI)
${THREADING_LINK_LIBS}
)

# Main Dissolve GUI
target_link_libraries(
${qmlgui_target_name}
PUBLIC ${WHOLE_ARCHIVE_FLAG}
${BASIC_LINK_LIBS}
# Module gui libs
${MODULEGUI_LINK_LIBS}
moduleWidgetProducer
# Main gui libs
render
widgets
keywordWidgets
delegates
models
gui
${NO_WHOLE_ARCHIVE_FLAG}
PRIVATE # External libs
Qt6::Widgets
Qt6::Core
Qt6::Qml
OpenGL::GL
${GUI_LINK_LIBS}
${FREETYPE_LIBRARIES}
${FTGL_LIBRARIES}
${CORE_LINK_LIBS}
${THREADING_LINK_LIBS}
)

qt_generate_deploy_qml_app_script(
TARGET
${gui_target_name}
Expand Down
1 change: 1 addition & 0 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ add_subdirectory(neta)

if(GUI)
add_subdirectory(gui)
add_subdirectory(gui-qml)
endif(GUI)

add_subdirectory(modules)
101 changes: 101 additions & 0 deletions src/dissolve-gui-qml.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
// SPDX-License-Identifier: GPL-3.0-or-later
// Copyright (c) 2024 Team Dissolve and contributors

#include "base/messenger.h"
#include "base/processPool.h"
#include "gui/gui.h"
#include "gui/types.h"
#include "main/cli.h"
#include "main/dissolve.h"
#include "main/version.h"
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QSurfaceFormat>
#include <clocale>

int main(int args, char **argv)
{
// Instantiate main classes
CoreData coreData;
Dissolve dissolve(coreData);

// Parse CLI options
CLIOptions options;
if (options.parse(args, argv, true) != CLIOptions::Success)
return 1;

// Initialise random seed
srand(options.randomSeed().value_or((unsigned)time(nullptr)));

QGuiApplication app(args, argv);

QQmlApplicationEngine engine;
const QUrl url(u"qrc:/main/qml/DissolveMain.qml"_qs);

QObject::connect(
&engine,
&QQmlApplicationEngine::objectCreationFailed,
&app,
[]() { QCoreApplication::exit(-1); },
Qt::QueuedConnection
);
engine.load(url);

Types::registerDissolveQmlTypes();
QCoreApplication::setOrganizationName("Team Dissolve");
QCoreApplication::setOrganizationDomain("www.projectdissolve.com");
QCoreApplication::setApplicationName("Dissolve-GUI-QML");

// Set native siblings attribute to prevent odd rendering artefacts on some systems
app.setAttribute(Qt::AA_DontCreateNativeWidgetSiblings);

// Ensure that the C locale is set, otherwise printf() and friends may not use dot for the radix point
setlocale(LC_NUMERIC, "C");
QLocale::setDefault(QLocale::C);

// Print GPL license information
Messenger::print("Dissolve-GUI-QML {} version {}, Copyright (C) 2024 Team Dissolve and contributors.\n", Version::appType(),
Version::info());
Messenger::print("Source repository: {}.\n", Version::repoUrl());
Messenger::print("Dissolve comes with ABSOLUTELY NO WARRANTY.\n");
Messenger::print("This is free software, and you are welcome to redistribute it under certain conditions.\n");
Messenger::print("For more details read the GPL at <http://www.gnu.org/copyleft/gpl.html>.\n");

// Flag to track our success in loading the input file and restart file
auto loadSuccessful = true;

// Set restart file frequency
dissolve.setRestartFileFrequency(options.noRestartFile() ? 0 : options.restartFileFrequency());

// If an input file was specified, load it here
if (options.inputFile())
// loadSuccessful = dissolveWindow.loadInputFile(options.inputFile().value());

// Load restart file if input file load was specified and loaded successfully
if (options.inputFile() && loadSuccessful)
{
if (options.ignoreRestartFile())
Messenger::print("Restart file (if it exists) will be ignored.\n");
else
{
auto actualRestartFile{options.restartFilename().value_or(std::string(dissolve.restartFilename()))};
// loadSuccessful = dissolveWindow.loadRestartFile(actualRestartFile);
}

// Iterate before launching the GUI?
if (loadSuccessful && options.nIterations() > 0)
{
// Prepare for run
if (!dissolve.prepare())
return 1;

// Run main simulation
dissolve.iterate(options.nIterations());
}
}

auto result = app.exec();

// Done.
return result;
}
32 changes: 32 additions & 0 deletions src/gui-qml/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# Target 'gui'
add_library(
gui-qml
# Qt Resources
resources.qrc
)

target_include_directories(
gui-qml
PRIVATE ${PROJECT_SOURCE_DIR}/src
${PROJECT_BINARY_DIR}/src
${Qt6Widgets_INCLUDE_DIRS}
${FREETYPE_INCLUDE_DIRS}
Qt6::OpenGL
Qt6::OpenGLWidgets
Qt6::Core
)

target_link_libraries(
gui-qml
PRIVATE models
base
Qt6::OpenGL
Qt6::OpenGLWidgets
Qt6::Quick
Qt6::QuickControls2
Qt6::Core
Qt6::Gui
Qt6::Qml
Qt6::QmlModels
Qt6::QuickWidgets
)
74 changes: 74 additions & 0 deletions src/gui-qml/qml/DissolveMain.qml
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts

ApplicationWindow {
id: dissolveWindow
visible: true
width: 819
height: 743
title: "Dissolve"

menuBar: MenuBar {
id: mainMenu

Menu {
title: "&File"

MenuItem {
text: "&New"
}

MenuItem {
text: "&Open..."
}

MenuItem {
text: "Open R&ecent"
}

MenuItem {
text: "Save"
}

MenuItem {
text: "Save As..."
}

MenuItem {
text: "Load Restart Point..."
}

MenuItem {
text: "Save Restart Point..."
}

MenuItem {
text: "Close"
}

MenuItem {
text: "Quit"
}
}
}

TabBar {
id: tabBar
width: parent.width

// DEFAULT TABS

TabButton {
id: messagesTab
text: "Messages"
width: implicitWidth
}

TabButton {
id: forceFieldTab
text: "Forcefield"
width: implicitWidth
}
}
}
5 changes: 5 additions & 0 deletions src/gui-qml/resources.qrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<RCC>
<qresource prefix="main">
<file>qml/DissolveMain.qml</file>
</qresource>
</RCC>

0 comments on commit a803ec3

Please sign in to comment.