Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 17 additions & 10 deletions GUI/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,13 @@ include( FindPkgConfig )

add_compile_definitions(QT_NO_KEYWORDS)

find_package(QT NAMES Qt6 Qt5 COMPONENTS Widgets SerialPort Network REQUIRED)
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Widgets SerialPort Network REQUIRED)
find_package(QT NAMES Qt6 Qt5 COMPONENTS Widgets SerialPort Network OpenGLWidgets REQUIRED)
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Widgets SerialPort Network OpenGLWidgets REQUIRED)
find_package(fmt)
# Dear ImGui + the node editor used by the track panels. qtimgui (vendored under
# qtimgui/) provides the Qt/OpenGL backend and is compiled straight into train-gui.
find_package(imgui CONFIG REQUIRED)
find_package(unofficial-imgui-node-editor CONFIG REQUIRED)
if(UNIX)
find_package(Threads)
find_package(dbus-cxx COMPONENTS qt)
Expand Down Expand Up @@ -111,12 +115,14 @@ set(PROJECT_SOURCES
lcc/cdi/grouptype.cpp
lcc/cdi/grouptype.h
trainutils.qrc
panels/paneldisplay.h panels/paneldisplay.cpp
panels/turnoutdisplay.h panels/turnoutdisplay.cpp
panels/panellayout.h panels/panellayout.cpp

panels/paneltoolswidget.h panels/paneltoolswidget.cpp panels/paneltoolswidget.ui
common/turnout.h common/turnout.cpp

qtimgui/src/ImGuiRenderer.h qtimgui/src/ImGuiRenderer.cpp
qtimgui/src/QtImGui.h qtimgui/src/QtImGui.cpp
panels/imguipanelwidget.h panels/imguipanelwidget.cpp
panels/panelmodel.h panels/panelmodel.cpp
panels/panelfields.h panels/panelfields.cpp
panels/panelstorage.h panels/panelstorage.cpp
)

if(UNIX)
Expand Down Expand Up @@ -152,9 +158,6 @@ if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
qt_add_executable(train-gui
${PROJECT_SOURCES}
loconet/loconetturnout.h loconet/loconetturnout.cpp
panels/propertyeditor.h panels/propertyeditor.cpp panels/propertyeditor.ui
panels/connectable.h panels/connectable.cpp
panels/tracksegment.h panels/tracksegment.cpp
loconet/loconetprogrammer.h loconet/loconetprogrammer.cpp
loconet/loconetprogrammingresult.h loconet/loconetprogrammingresult.cpp
loconet/loconetprogrammingrequest.h loconet/loconetprogrammingrequest.cpp
Expand Down Expand Up @@ -196,12 +199,16 @@ target_link_libraries(train-gui PRIVATE
fmt::fmt
log4cxx
log4cxx-qt
Qt${QT_VERSION_MAJOR}::OpenGLWidgets
imgui::imgui
unofficial::imgui-node-editor::imgui-node-editor
)
target_include_directories(train-gui PRIVATE
${train-required_INCLUDE_DIRS}
../LCC
../LocoNetCommunications
../LoconetTCPUtil
qtimgui/src
)
target_compile_options(train-gui PRIVATE
$<$<CXX_COMPILER_ID:MSVC>: /Zc:preprocessor /Zc:__cplusplus>
Expand Down
102 changes: 58 additions & 44 deletions GUI/mainwindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,14 @@
#include "throttledisplay.h"
#include "loconet/loconetthrottle.h"
#include "lccmemorydisplay.h"
#include "panels/paneldisplay.h"
#include "panels/paneltoolswidget.h"
#include "panels/imguipanelwidget.h"
#include "panels/panelstorage.h"
#include "systemconnection.h"
#include "speedo/speedoconnection.h"
#include "speedmatcher.h"
#include "speedometerdisplay.h"

#include <QInputDialog>
#include <QScrollArea>
#include <QHostAddress>
#include <QSerialPortInfo>
#include <QErrorMessage>
Expand All @@ -44,9 +43,11 @@ MainWindow::MainWindow(QWidget *parent)
ads::CDockManager::setAutoHideConfigFlags(ads::CDockManager::DefaultAutoHideConfig);
m_dockManager = new ads::CDockManager(this);

m_panelTools = new PanelToolsWidget(this);
m_panelToolboxWidget = new ads::CDockWidget("Panel Toolbox");
m_panelToolboxWidget->setWidget(m_panelTools);
// Not in mainwindow.ui (no actionOpenPanel there to auto-connect to) --
// added the same way the per-panel/per-connection submenus below are,
// programmatically, since it only needs to exist once at the top level.
QAction* openPanelAction = ui->menuPanels->addAction(tr("Open panel..."));
connect(openPanelAction, &QAction::triggered, this, &MainWindow::onOpenPanelTriggered);

connect(ui->menu_loconet_connect_to, &QMenu::aboutToShow,
this, &MainWindow::scanForLoconetConnections);
Expand Down Expand Up @@ -563,60 +564,73 @@ void MainWindow::on_action_loconet_manual_Serial_triggered()

void MainWindow::on_actionNewPanel_triggered()
{
ads::CDockWidget* DockWidget = new ads::CDockWidget("Panel");
PanelDisplay* panelDisp = new PanelDisplay();
if(!m_state->m_connections.empty()){
panelDisp->addTurnout(m_state->m_connections[0]->getDCCTurnout(1));
}
ads::CDockWidget* dockWidget = new ads::CDockWidget("Panel");
ImguiPanelWidget* panel = new ImguiPanelWidget(m_state);
dockWidget->setWidget(panel);
m_dockManager->addDockWidget(ads::TopDockWidgetArea, dockWidget);

QScrollArea* scrollArea = new QScrollArea();
scrollArea->setWidget(panelDisp);
scrollArea->setAlignment(Qt::AlignTop | Qt::AlignLeft);
newPanelAdded(panel, dockWidget);
}

DockWidget->setWidget(scrollArea);
m_dockManager->addDockWidget(ads::TopDockWidgetArea, DockWidget);
void MainWindow::onOpenPanelTriggered()
{
const QStringList names = PanelStorage::savedPanelNames();
const QString name = QInputDialog::getItem(this, "Open Panel", "Select a panel to open", names, 0, false);
if(name.isEmpty()){
return;
}

newPanelAdded(panelDisp, DockWidget);
}
ads::CDockWidget* dockWidget = new ads::CDockWidget("Panel");
ImguiPanelWidget* panel = new ImguiPanelWidget(m_state);
if(!panel->load(name)){
LOG4CXX_ERROR_FMT(logger, "Could not load panel '{}'", name.toStdString());
}
dockWidget->setWindowTitle(panel->getName());
dockWidget->setWidget(panel);
m_dockManager->addDockWidget(ads::TopDockWidgetArea, dockWidget);

void MainWindow::newPanelAdded(PanelDisplay* panel, ads::CDockWidget* dockWidget){
bool firstPanel = m_panels.empty();
newPanelAdded(panel, dockWidget);
}

void MainWindow::newPanelAdded(ImguiPanelWidget* panel, ads::CDockWidget* dockWidget){
LOG4CXX_DEBUG_FMT(logger, "Added new panel");
m_panels.push_back(panel);

connect(m_panelTools, &PanelToolsWidget::allowMovingChanged,
panel, &PanelDisplay::allowMovingChanged);

panel->setPanelToolsWidget(m_panelTools);

if(firstPanel){
m_dockManager->addAutoHideDockWidget(ads::SideBarLeft, m_panelToolboxWidget);
}

QMenu* menu = ui->menuPanels->addMenu(panel->getName());
QAction* actionRename = menu->addAction("Rename panel");
connect(actionRename, &QAction::triggered,
[panel,this](){
QString oldName = panel->getName();
[panel, menu, dockWidget, this](){
QString newName = QInputDialog::getText(this, "New Name", "Input new name of panel", QLineEdit::Normal, panel->getName());
LOG4CXX_DEBUG_FMT(logger, "Rename panel {} to {}", oldName.toStdString(), newName.toStdString());
if(newName.isEmpty()){
return;
}
panel->setName(newName);
menu->setTitle(newName);
dockWidget->setWindowTitle(newName);
});

QAction* resizePanelAction = menu->addAction(tr("Set panel size..."));
connect(resizePanelAction, &QAction::triggered, this, [panel, this]() {
bool ok1, ok2;
int w = QInputDialog::getInt(this, tr("Panel Width"),
tr("Width (pixels):"), panel->width(),
100, 10000, 1, &ok1);
if (!ok1) return;
int h = QInputDialog::getInt(this, tr("Panel Height"),
tr("Height (pixels):"), panel->height(),
100, 10000, 1, &ok2);
if (!ok2) return;
panel->setPanelSize(QSize(w, h));
QAction* actionSave = menu->addAction("Save panel");
connect(actionSave, &QAction::triggered,
[panel, this](){
if(!panel->save()){
LOG4CXX_ERROR_FMT(logger, "Could not save panel '{}'", panel->getName().toStdString());
}
});

QAction* actionSaveAs = menu->addAction("Save panel as...");
connect(actionSaveAs, &QAction::triggered,
[panel, menu, dockWidget, this](){
QString newName = QInputDialog::getText(this, "Save As", "Input name to save panel as", QLineEdit::Normal, panel->getName());
if(newName.isEmpty()){
return;
}
if(panel->saveAs(newName)){
menu->setTitle(newName);
dockWidget->setWindowTitle(newName);
}else{
LOG4CXX_ERROR_FMT(logger, "Could not save panel as '{}'", newName.toStdString());
}
});
}


Expand Down
12 changes: 4 additions & 8 deletions GUI/mainwindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,7 @@ namespace Ui { class MainWindow; }
QT_END_NAMESPACE

struct TrainUtilsState;
class PanelDisplay;
class PanelToolsWidget;
class ImguiPanelWidget;

class MainWindow : public QMainWindow
{
Expand Down Expand Up @@ -49,6 +48,7 @@ private Q_SLOTS:
void on_action_loconet_manual_Serial_triggered();

void on_actionNewPanel_triggered();
void onOpenPanelTriggered();

void on_action_speedo_Manual_Serial_triggered();

Expand All @@ -59,16 +59,12 @@ private Q_SLOTS:
void addSubmenusLoconetConnection(QMenu* parentMenu, QString connectionName);
void addSubmenusSpeedoConnection(QMenu* parentMenu, QString connectionName);
void newConnectionMade(std::shared_ptr<SystemConnection> conn);
void newPanelAdded(PanelDisplay* panel, ads::CDockWidget* dockWidget = nullptr);
void newPanelAdded(ImguiPanelWidget* panel, ads::CDockWidget* dockWidget);

private:
Ui::MainWindow *ui;
ads::CDockManager* m_dockManager;
TrainUtilsState* m_state;
QVector<PanelDisplay*> m_panels;

// panel tools
ads::CDockWidget* m_panelToolboxWidget;
PanelToolsWidget* m_panelTools;
QVector<ImguiPanelWidget*> m_panels;
};
#endif // MAINWINDOW_H
5 changes: 0 additions & 5 deletions GUI/panels/connectable.cpp

This file was deleted.

16 changes: 0 additions & 16 deletions GUI/panels/connectable.h

This file was deleted.

Loading
Loading