diff --git a/bin/app/data/ApplicationSettings_template.xml b/bin/app/data/ApplicationSettings_template.xml
index 0a9838f4..8cbce6dd 100644
--- a/bin/app/data/ApplicationSettings_template.xml
+++ b/bin/app/data/ApplicationSettings_template.xml
@@ -38,4 +38,12 @@
+
+
+
+
+
+
+
+
diff --git a/bin/app/data/gui/settingwindows/listbox.css b/bin/app/data/gui/setting_window/listbox.css
similarity index 100%
rename from bin/app/data/gui/settingwindows/listbox.css
rename to bin/app/data/gui/setting_window/listbox.css
diff --git a/bin/app/data/gui/settingwindows/projectsetup.css b/bin/app/data/gui/setting_window/window.css
similarity index 100%
rename from bin/app/data/gui/settingwindows/projectsetup.css
rename to bin/app/data/gui/setting_window/window.css
diff --git a/src/app/CMakeLists.txt b/src/app/CMakeLists.txt
index 6032b91e..bbd76ed2 100644
--- a/src/app/CMakeLists.txt
+++ b/src/app/CMakeLists.txt
@@ -19,22 +19,13 @@ add_files(
qt/element/QtDirectoryListBox.h
qt/element/QtLineEdit.cpp
qt/element/QtLineEdit.h
- qt/element/QtMainWindow.cpp
- qt/element/QtMainWindow.h
- qt/element/QtProjectSetupScreen.cpp
- qt/element/QtProjectSetupScreen.h
qt/element/QtRefreshBar.cpp
qt/element/QtRefreshBar.h
qt/element/QtSearchBar.cpp
qt/element/QtSearchBar.h
- qt/element/QtSettingsWindow.cpp
- qt/element/QtSettingsWindow.h
qt/element/QtSmartSearchBox.cpp
qt/element/QtSmartSearchBox.h
- qt/element/QtSplashScreen.cpp
- qt/element/QtSplashScreen.h
- qt/element/QtStartScreen.cpp
- qt/element/QtStartScreen.h
+
qt/element/QtStatusBar.cpp
qt/element/QtStatusBar.h
qt/element/QtUndoRedo.cpp
@@ -98,5 +89,18 @@ add_files(
qt/view/QtViewWidgetWrapper.cpp
qt/view/QtViewWidgetWrapper.h
+ qt/window/QtApplicationSettingsScreen.cpp
+ qt/window/QtApplicationSettingsScreen.h
+ qt/window/QtMainWindow.cpp
+ qt/window/QtMainWindow.h
+ qt/window/QtProjectSetupScreen.cpp
+ qt/window/QtProjectSetupScreen.h
+ qt/window/QtSettingsWindow.cpp
+ qt/window/QtSettingsWindow.h
+ qt/window/QtSplashScreen.cpp
+ qt/window/QtSplashScreen.h
+ qt/window/QtStartScreen.cpp
+ qt/window/QtStartScreen.h
+
main.cpp
)
diff --git a/src/app/main.cpp b/src/app/main.cpp
index ea0e4124..f1a2c473 100644
--- a/src/app/main.cpp
+++ b/src/app/main.cpp
@@ -8,9 +8,10 @@
#include "Application.h"
#include "includes.h" // defines 'void setup(int argc, char *argv[])'
-#include "qt/element/QtSplashScreen.h"
+#include "qt/window/QtSplashScreen.h"
#include "qt/utility/utilityQt.h"
#include "qt/view/QtViewFactory.h"
+#include "version.h"
void init()
{
@@ -37,7 +38,7 @@ int main(int argc, char *argv[])
QtSplashScreen* splash = new QtSplashScreen(whitePixmap, Qt::WindowStaysOnTopHint);
splash->setMessage("Loading UI");
- splash->setVersion("0.1");
+ splash->setVersion(GIT_VERSION_NUMBER);
splash->exec(qtApp);
init();
diff --git a/src/app/qt/element/QtDirectoryListBox.cpp b/src/app/qt/element/QtDirectoryListBox.cpp
index 7ea17d0e..636d0d81 100644
--- a/src/app/qt/element/QtDirectoryListBox.cpp
+++ b/src/app/qt/element/QtDirectoryListBox.cpp
@@ -81,7 +81,7 @@ QtDirectoryListBox::QtDirectoryListBox(QWidget *parent)
m_list->setObjectName("list");
m_list->setAttribute(Qt::WA_MacShowFocusRect, 0);
- setStyleSheet(utility::getStyleSheet("data/gui/settingwindows/listbox.css").c_str());
+ setStyleSheet(utility::getStyleSheet("data/gui/setting_window/listbox.css").c_str());
layout->addWidget(m_list);
QWidget* buttonContainer = new QWidget(this);
diff --git a/src/app/qt/view/QtMainView.cpp b/src/app/qt/view/QtMainView.cpp
index 5e557aab..40180670 100644
--- a/src/app/qt/view/QtMainView.cpp
+++ b/src/app/qt/view/QtMainView.cpp
@@ -2,7 +2,7 @@
#include "utility/logging/logging.h"
-#include "qt/element/QtMainWindow.h"
+#include "qt/window/QtMainWindow.h"
QtMainView::QtMainView()
{
diff --git a/src/app/qt/window/QtApplicationSettingsScreen.cpp b/src/app/qt/window/QtApplicationSettingsScreen.cpp
new file mode 100644
index 00000000..d5deb5f5
--- /dev/null
+++ b/src/app/qt/window/QtApplicationSettingsScreen.cpp
@@ -0,0 +1,82 @@
+#include "qt/window/QtApplicationSettingsScreen.h"
+
+#include
+#include
+#include
+#include
+
+#include "utility/messaging/type/MessageLoadProject.h"
+#include "utility/messaging/type/MessageRefresh.h"
+
+#include "settings/ApplicationSettings.h"
+
+QtApplicationSettingsScreen::QtApplicationSettingsScreen(QWidget *parent)
+ : QtSettingsWindow(parent)
+{
+ raise();
+}
+
+QSize QtApplicationSettingsScreen::sizeHint() const
+{
+ return QSize(600,600);
+}
+
+void QtApplicationSettingsScreen::setup()
+{
+ setupForm();
+
+ updateTitle("PREFERENCES");
+ updateDoneButton("Save");
+}
+
+void QtApplicationSettingsScreen::load()
+{
+ ApplicationSettings* appSettings = ApplicationSettings::getInstance().get();
+
+ m_includePaths->setList(appSettings->getHeaderSearchPaths());
+
+ if (m_frameworkPaths)
+ {
+ m_frameworkPaths->setList(appSettings->getFrameworkSearchPaths());
+ }
+}
+
+void QtApplicationSettingsScreen::populateForm(QFormLayout* layout)
+{
+ int minimumWidthForSecondCol = 360;
+
+ QLabel* includePathsLabel = new QLabel("Include Paths");
+ m_includePaths = new QtDirectoryListBox(this);
+ m_includePaths->setMinimumWidth(minimumWidthForSecondCol);
+ layout->addRow(includePathsLabel, m_includePaths);
+
+ if (QSysInfo::macVersion() != QSysInfo::MV_None)
+ {
+ QLabel* frameworkPathsLabel = new QLabel("Framework Paths");
+ m_frameworkPaths = new QtDirectoryListBox(this);
+ m_frameworkPaths->setMinimumWidth(minimumWidthForSecondCol);
+ layout->addRow(frameworkPathsLabel, m_frameworkPaths);
+ }
+}
+
+void QtApplicationSettingsScreen::handleCancelButtonPress()
+{
+ emit canceled();
+}
+
+void QtApplicationSettingsScreen::handleUpdateButtonPress()
+{
+ ApplicationSettings* appSettings = ApplicationSettings::getInstance().get();
+
+ appSettings->setHeaderSearchPaths(m_includePaths->getList());
+
+ if (m_frameworkPaths)
+ {
+ appSettings->setFrameworkSearchPaths(m_frameworkPaths->getList());
+ }
+
+ appSettings->save();
+
+ MessageRefresh().dispatch();
+ emit finished();
+}
diff --git a/src/app/qt/window/QtApplicationSettingsScreen.h b/src/app/qt/window/QtApplicationSettingsScreen.h
new file mode 100644
index 00000000..e802f7d9
--- /dev/null
+++ b/src/app/qt/window/QtApplicationSettingsScreen.h
@@ -0,0 +1,40 @@
+#ifndef QT_APPLICATION_SETTINGS_SCREEN_H
+#define QT_APPLICATION_SETTINGS_SCREEN_H
+
+#include
+#include
+
+#include "utility/file/FilePath.h"
+
+#include "qt/element/QtDirectoryListBox.h"
+#include "qt/window/QtSettingsWindow.h"
+
+class QtApplicationSettingsScreen
+ : public QtSettingsWindow
+{
+ Q_OBJECT
+
+public:
+ QtApplicationSettingsScreen(QWidget* parent = 0);
+ QSize sizeHint() const Q_DECL_OVERRIDE;
+
+ virtual void setup() override;
+
+ void load();
+
+protected:
+ virtual void populateForm(QFormLayout* layout);
+
+private slots:
+ void handleCancelButtonPress();
+ void handleUpdateButtonPress();
+
+private:
+ QPushButton* m_cancelButton;
+ QPushButton* m_updateButton;
+
+ QtDirectoryListBox* m_includePaths;
+ QtDirectoryListBox* m_frameworkPaths;
+};
+
+#endif //QT_APPLICATION_SETTINGS_SCREEN_H
diff --git a/src/app/qt/element/QtMainWindow.cpp b/src/app/qt/window/QtMainWindow.cpp
similarity index 85%
rename from src/app/qt/element/QtMainWindow.cpp
rename to src/app/qt/window/QtMainWindow.cpp
index ba7faed6..a6f5fd80 100644
--- a/src/app/qt/element/QtMainWindow.cpp
+++ b/src/app/qt/window/QtMainWindow.cpp
@@ -1,4 +1,4 @@
-#include "qt/element/QtMainWindow.h"
+#include "qt/window/QtMainWindow.h"
#include
#include
@@ -7,11 +7,10 @@
#include
#include
-#include "version.h"
-
#include "component/view/View.h"
#include "component/view/CompositeView.h"
#include "qt/view/QtViewWidgetWrapper.h"
+#include "settings/ApplicationSettings.h"
#include "utility/logging/logging.h"
#include "utility/messaging/type/MessageFind.h"
#include "utility/messaging/type/MessageInterruptTasks.h"
@@ -23,6 +22,7 @@
#include "utility/messaging/type/MessageUndo.h"
#include "utility/messaging/type/MessageWindowFocus.h"
#include "utility/messaging/type/MessageZoom.h"
+#include "version.h"
QtMainWindow::QtMainWindow()
: m_startScreenWasVisible(false)
@@ -50,9 +50,21 @@ QtMainWindow::QtMainWindow()
void QtMainWindow::init()
{
- showStartScreen();
-}
+ ApplicationSettings* appSettings = ApplicationSettings::getInstance().get();
+ if (appSettings->getUserHasSeenSettings())
+ {
+ showStartScreen();
+ }
+ else
+ {
+ openSettings();
+ m_startScreenWasVisible = true;
+
+ appSettings->setUserHasSeenSettings(true);
+ appSettings->save();
+ }
+}
QtMainWindow::~QtMainWindow()
{
@@ -156,6 +168,11 @@ void QtMainWindow::about()
void QtMainWindow::hideScreens()
{
+ if (m_applicationSettingsScreen)
+ {
+ m_applicationSettingsScreen->hide();
+ }
+
if (m_startScreen)
{
m_startScreen->hide();
@@ -167,49 +184,69 @@ void QtMainWindow::hideScreens()
}
}
+void QtMainWindow::closeScreens()
+{
+ hideScreens();
+ m_startScreenWasVisible = false;
+}
+
void QtMainWindow::restoreScreens()
+{
+ if (m_startScreenWasVisible)
+ {
+ showStartScreen();
+ }
+ else
+ {
+ closeScreens();
+ }
+}
+
+void QtMainWindow::openSettings()
{
hideScreens();
- if (m_startScreen && m_startScreenWasVisible)
+ if (!m_applicationSettingsScreen)
{
- m_startScreen->show();
+ m_applicationSettingsScreen = std::make_shared(this);
+ m_applicationSettingsScreen->setup();
+ connect(m_applicationSettingsScreen.get(), SIGNAL(finished()), this, SLOT(restoreScreens()));
+ connect(m_applicationSettingsScreen.get(), SIGNAL(canceled()), this, SLOT(restoreScreens()));
}
- m_startScreenWasVisible = false;
+ m_applicationSettingsScreen->load();
+ m_applicationSettingsScreen->show();
}
void QtMainWindow::showStartScreen()
{
+ hideScreens();
+
if (!m_startScreen)
{
m_startScreen = std::make_shared(this);
m_startScreen->setup();
- connect(m_startScreen.get(), SIGNAL(finished()), this, SLOT(hideScreens()));
+ connect(m_startScreen.get(), SIGNAL(finished()), this, SLOT(closeScreens()));
+ connect(m_startScreen.get(), SIGNAL(canceled()), this, SLOT(closeScreens()));
+
+ connect(m_startScreen.get(), SIGNAL(openOpenProjectDialog()), this, SLOT(openProject()));
+ connect(m_startScreen.get(), SIGNAL(openNewProjectDialog()), this, SLOT(newProject()));
}
m_startScreen->show();
m_startScreenWasVisible = true;
-
- if (m_newProjectDialog)
- {
- m_newProjectDialog->hide();
- }
}
void QtMainWindow::newProject()
{
- if (m_startScreen)
- {
- m_startScreen->hide();
- }
+ hideScreens();
if (!m_newProjectDialog)
{
m_newProjectDialog = std::make_shared(this);
m_newProjectDialog->setup();
- connect(m_newProjectDialog.get(), SIGNAL(finished()), this, SLOT(hideScreens()));
+ connect(m_newProjectDialog.get(), SIGNAL(finished()), this, SLOT(closeScreens()));
connect(m_newProjectDialog.get(), SIGNAL(canceled()), this, SLOT(restoreScreens()));
}
@@ -229,6 +266,7 @@ void QtMainWindow::openProject(const QString &path)
if (!fileName.isEmpty())
{
MessageLoadProject(fileName.toStdString()).dispatch();
+ closeScreens();
}
}
@@ -307,6 +345,7 @@ void QtMainWindow::switchColorScheme()
void QtMainWindow::handleEscapeShortcut()
{
+ closeScreens();
MessageInterruptTasks().dispatch();
}
@@ -362,6 +401,7 @@ void QtMainWindow::setupHelpMenu()
menu->addAction(tr("&About"), this, SLOT(about()));
menu->addAction(tr("About &Qt"), QCoreApplication::instance(), SLOT(aboutQt()));
//menu->addAction(tr("Licences"), QCoreApplication::instance(), SLOT(showLicences()));
+ menu->addAction(tr("Preferences..."), this, SLOT(openSettings()));
}
void QtMainWindow::setupShortcuts()
diff --git a/src/app/qt/element/QtMainWindow.h b/src/app/qt/window/QtMainWindow.h
similarity index 83%
rename from src/app/qt/element/QtMainWindow.h
rename to src/app/qt/window/QtMainWindow.h
index deace827..795a91cf 100644
--- a/src/app/qt/element/QtMainWindow.h
+++ b/src/app/qt/window/QtMainWindow.h
@@ -5,11 +5,12 @@
#include
#include
+#include
#include
-#include
-#include "QtStartScreen.h"
-#include "QtProjectSetupScreen.h"
+#include "qt/window/QtApplicationSettingsScreen.h"
+#include "qt/window/QtStartScreen.h"
+#include "qt/window/QtProjectSetupScreen.h"
class QDockWidget;
class View;
@@ -39,9 +40,11 @@ protected:
public slots:
void about();
void hideScreens();
+ void closeScreens();
void restoreScreens();
- void showStartScreen();
+ void openSettings();
+ void showStartScreen();
void newProject();
void openProject(const QString &path = QString());
void editProject();
@@ -73,6 +76,7 @@ private:
QDockWidget* getDockWidgetForView(View* view) const;
+ std::shared_ptr m_applicationSettingsScreen;
std::shared_ptr m_startScreen;
std::shared_ptr m_newProjectDialog;
diff --git a/src/app/qt/element/QtProjectSetupScreen.cpp b/src/app/qt/window/QtProjectSetupScreen.cpp
similarity index 64%
rename from src/app/qt/element/QtProjectSetupScreen.cpp
rename to src/app/qt/window/QtProjectSetupScreen.cpp
index 724f4680..2aeac136 100644
--- a/src/app/qt/element/QtProjectSetupScreen.cpp
+++ b/src/app/qt/window/QtProjectSetupScreen.cpp
@@ -1,19 +1,15 @@
-#include "qt/element/QtProjectSetupScreen.h"
+#include "qt/window/QtProjectSetupScreen.h"
#include
#include
#include
-#include
#include
#include
-#include
#include
-#include "settings/ProjectSettings.h"
-#include "utility/logging/logging.h"
-#include "qt/utility/QtDeviceScaledPixmap.h"
#include "utility/messaging/type/MessageLoadProject.h"
-#include "qt/utility/utilityQt.h"
+
+#include "settings/ProjectSettings.h"
QtTextLine::QtTextLine(QWidget *parent)
: QWidget(parent)
@@ -59,43 +55,50 @@ void QtTextLine::handleButtonPress()
}
}
+
QtProjectSetupScreen::QtProjectSetupScreen(QWidget *parent)
: QtSettingsWindow(parent)
{
raise();
}
+QSize QtProjectSetupScreen::sizeHint() const
+{
+ return QSize(600,600);
+}
+
void QtProjectSetupScreen::setup()
{
- QtDeviceScaledPixmap coati_logo("data/gui/startscreen/logo.png");
- coati_logo.scaleToWidth(400);
- QLabel* coatiLogoLabel = new QLabel(m_window);
- coatiLogoLabel->setPixmap(coati_logo.pixmap());
- coatiLogoLabel->resize(coati_logo.width(), coati_logo.height());
- coatiLogoLabel->move(100, 100);
+ setupForm();
+}
- setStyleSheet(utility::getStyleSheet("data/gui/settingwindows/projectsetup.css").c_str());
- QVBoxLayout* windowLayout = new QVBoxLayout();
- windowLayout->setContentsMargins(25, 30, 25, 20);
+void QtProjectSetupScreen::loadEmpty()
+{
+ updateTitle("NEW PROJECT");
+ updateDoneButton("Create");
+}
- m_title = new QLabel();
- m_title->setObjectName("titleLabel");
- windowLayout->addWidget(m_title);
- windowLayout->addSpacing(30);
+void QtProjectSetupScreen::loadProjectSettings()
+{
+ updateTitle("EDIT PROJECT");
+ updateDoneButton("Save");
- QScrollArea* scrollArea = new QScrollArea();
- scrollArea->setObjectName("formArea");
- scrollArea->setFrameShadow(QFrame::Plain);
- scrollArea->setWidgetResizable(true);
+ ProjectSettings* projSettings = ProjectSettings::getInstance().get();
- QWidget* form = new QWidget();
- form->setObjectName("form");
- scrollArea->setWidget(form);
+ m_projectName->setText(QString::fromStdString(projSettings->getFilePath().withoutExtension().fileName()));
+ m_projectFileLocation->setText(QString::fromStdString(projSettings->getFilePath().parentDirectory().str()));
- QFormLayout *layout = new QFormLayout();
- layout->setContentsMargins(10, 10, 10, 10);
- layout->setHorizontalSpacing(20);
+ m_sourcePaths->setList(projSettings->getSourcePaths());
+ m_includePaths->setList(projSettings->getHeaderSearchPaths());
+ if (m_frameworkPaths)
+ {
+ m_frameworkPaths->setList(projSettings->getFrameworkSearchPaths());
+ }
+}
+
+void QtProjectSetupScreen::populateForm(QFormLayout* layout)
+{
int minimumWidthForSecondCol = 360;
QLabel* nameLabel = new QLabel("Name");
@@ -132,62 +135,14 @@ void QtProjectSetupScreen::setup()
m_frameworkPaths->setMinimumWidth(minimumWidthForSecondCol);
layout->addRow(frameworkPathsLabel, m_frameworkPaths);
}
-
- form->setLayout(layout);
-
- m_createButton = new QPushButton("Create");
- m_createButton->setObjectName("windowButton");
- m_cancelButton = new QPushButton("Cancel");
- m_cancelButton->setObjectName("windowButton");
- m_updateButton = new QPushButton("Update");
- m_updateButton->setObjectName("windowButton");
-
- connect(m_createButton, SIGNAL(clicked()), this, SLOT(handleCreateButtonPress()));
- connect(m_cancelButton, SIGNAL(clicked()), this, SLOT(handleCancelButtonPress()));
- connect(m_updateButton, SIGNAL(clicked()), this, SLOT(handleUpdateButtonPress()));
-
- QHBoxLayout* buttons = new QHBoxLayout();
- buttons->addWidget(m_cancelButton);
- buttons->addStretch();
- buttons->addWidget(m_createButton);
- buttons->addWidget(m_updateButton);
-
- windowLayout->addWidget(scrollArea);
- windowLayout->addSpacing(20);
- windowLayout->addLayout(buttons);
-
- m_window->setLayout(windowLayout);
- resize(QSize(600, 620));
-
- scrollArea->raise();
}
-void QtProjectSetupScreen::loadEmpty()
+void QtProjectSetupScreen::handleCancelButtonPress()
{
- m_updateButton->hide();
- m_createButton->show();
-
- m_title->setText("NEW PROJECT");
+ emit canceled();
}
-void QtProjectSetupScreen::loadProjectSettings()
-{
- m_updateButton->show();
- m_createButton->hide();
-
- m_title->setText("EDIT PROJECT");
-
- ProjectSettings* projSettings = ProjectSettings::getInstance().get();
-
- m_projectName->setText(QString::fromStdString(projSettings->getFilePath().withoutExtension().fileName()));
- m_projectFileLocation->setText(QString::fromStdString(projSettings->getFilePath().parentDirectory().str()));
-
- m_sourcePaths->setList(projSettings->getSourcePaths());
- m_includePaths->setList(projSettings->getHeaderSearchPaths());
- m_frameworkPaths->setList(projSettings->getFrameworkSearchPaths());
-}
-
-void QtProjectSetupScreen::handleCreateButtonPress()
+void QtProjectSetupScreen::handleDoneButtonPress()
{
if (m_projectName->text().isEmpty())
{
@@ -232,18 +187,3 @@ void QtProjectSetupScreen::handleCreateButtonPress()
MessageLoadProject(projectFile).dispatch();
emit finished();
}
-
-void QtProjectSetupScreen::handleCancelButtonPress()
-{
- emit canceled();
-}
-
-void QtProjectSetupScreen::handleUpdateButtonPress()
-{
- handleCreateButtonPress();
-}
-
-QSize QtProjectSetupScreen::sizeHint() const
-{
- return QSize(600,600);
-}
diff --git a/src/app/qt/element/QtProjectSetupScreen.h b/src/app/qt/window/QtProjectSetupScreen.h
similarity index 85%
rename from src/app/qt/element/QtProjectSetupScreen.h
rename to src/app/qt/window/QtProjectSetupScreen.h
index a13006ee..28128e8e 100644
--- a/src/app/qt/element/QtProjectSetupScreen.h
+++ b/src/app/qt/window/QtProjectSetupScreen.h
@@ -1,16 +1,14 @@
#ifndef QT_PROJECT_SETUP_SCREEN_H
#define QT_PROJECT_SETUP_SCREEN_H
-#include
#include
#include
-#include "QtSettingsWindow.h"
-
#include "utility/file/FilePath.h"
#include "qt/element/QtDirectoryListBox.h"
#include "qt/element/QtLineEdit.h"
+#include "qt/window/QtSettingsWindow.h"
class QtTextLine
: public QWidget
@@ -45,21 +43,17 @@ public:
void loadEmpty();
void loadProjectSettings();
-signals:
- void finished();
- void canceled();
+protected:
+ virtual void populateForm(QFormLayout* layout);
private slots:
- void handleCreateButtonPress();
void handleCancelButtonPress();
- void handleUpdateButtonPress();
+ void handleDoneButtonPress();
private:
QLineEdit* m_projectName;
QtTextLine* m_projectFileLocation;
- QLabel* m_title;
-
QPushButton* m_createButton;
QPushButton* m_cancelButton;
QPushButton* m_updateButton;
diff --git a/src/app/qt/element/QtSettingsWindow.cpp b/src/app/qt/window/QtSettingsWindow.cpp
similarity index 50%
rename from src/app/qt/element/QtSettingsWindow.cpp
rename to src/app/qt/window/QtSettingsWindow.cpp
index 4dbc8111..18382dc2 100644
--- a/src/app/qt/element/QtSettingsWindow.cpp
+++ b/src/app/qt/window/QtSettingsWindow.cpp
@@ -1,12 +1,21 @@
-#include "qt/element/QtSettingsWindow.h"
+#include "qt/window/QtSettingsWindow.h"
+#include
#include
+#include
+#include
+#include
#include
+#include "qt/utility/QtDeviceScaledPixmap.h"
+#include "qt/utility/utilityQt.h"
#include "utility/messaging/type/MessageInterruptTasks.h"
QtSettingsWindow::QtSettingsWindow(QWidget *parent, int displacement)
: QWidget(parent, Qt::Dialog | Qt::FramelessWindowHint)
+ , m_title(nullptr)
+ , m_cancelButton(nullptr)
+ , m_doneButton(nullptr)
, m_mousePressedInWindow(false)
{
QSize windowSize = sizeHint();
@@ -46,19 +55,19 @@ QtSettingsWindow::QtSettingsWindow(QWidget *parent, int displacement)
this->raise();
}
+QSize QtSettingsWindow::sizeHint() const
+{
+ return QSize(500, 500);
+}
+
void QtSettingsWindow::keyPressEvent(QKeyEvent *event)
{
if (event->key() == Qt::Key_Escape)
{
- this->hide();
+ emit canceled();
}
}
-QSize QtSettingsWindow::sizeHint() const
-{
- return QSize(500, 500);
-}
-
void QtSettingsWindow::resizeEvent(QResizeEvent *event)
{
QSize windowSize = event->size()-QSize(10, 10 + m_displacment);
@@ -94,3 +103,81 @@ void QtSettingsWindow::mouseReleaseEvent(QMouseEvent *event)
m_mousePressedInWindow = false;
}
}
+
+void QtSettingsWindow::setupForm()
+{
+ QtDeviceScaledPixmap coati_logo("data/gui/startscreen/logo.png");
+ coati_logo.scaleToWidth(400);
+ QLabel* coatiLogoLabel = new QLabel(m_window);
+ coatiLogoLabel->setPixmap(coati_logo.pixmap());
+ coatiLogoLabel->resize(coati_logo.width(), coati_logo.height());
+ coatiLogoLabel->move(100, 100);
+
+ setStyleSheet(utility::getStyleSheet("data/gui/setting_window/window.css").c_str());
+ QVBoxLayout* windowLayout = new QVBoxLayout();
+ windowLayout->setContentsMargins(25, 30, 25, 20);
+
+ m_title = new QLabel();
+ m_title->setObjectName("titleLabel");
+ windowLayout->addWidget(m_title);
+ windowLayout->addSpacing(30);
+
+ QScrollArea* scrollArea = new QScrollArea();
+ scrollArea->setObjectName("formArea");
+ scrollArea->setFrameShadow(QFrame::Plain);
+ scrollArea->setWidgetResizable(true);
+
+ QWidget* form = new QWidget();
+ form->setObjectName("form");
+ scrollArea->setWidget(form);
+
+ QFormLayout* layout = new QFormLayout();
+ layout->setContentsMargins(10, 10, 10, 10);
+ layout->setHorizontalSpacing(20);
+
+ populateForm(layout);
+
+ form->setLayout(layout);
+
+ m_cancelButton = new QPushButton("Cancel");
+ m_cancelButton->setObjectName("windowButton");
+ m_doneButton = new QPushButton("Done");
+ m_doneButton->setObjectName("windowButton");
+
+ connect(m_cancelButton, SIGNAL(clicked()), this, SLOT(handleCancelButtonPress()));
+ connect(m_doneButton, SIGNAL(clicked()), this, SLOT(handleDoneButtonPress()));
+
+ QHBoxLayout* buttons = new QHBoxLayout();
+ buttons->addWidget(m_cancelButton);
+ buttons->addStretch();
+ buttons->addWidget(m_doneButton);
+
+ windowLayout->addWidget(scrollArea);
+ windowLayout->addSpacing(20);
+ windowLayout->addLayout(buttons);
+
+ m_window->setLayout(windowLayout);
+ resize(QSize(600, 620));
+
+ scrollArea->raise();
+}
+
+void QtSettingsWindow::populateForm(QFormLayout* layout)
+{
+}
+
+void QtSettingsWindow::updateTitle(QString title)
+{
+ if (m_title)
+ {
+ m_title->setText(title);
+ }
+}
+
+void QtSettingsWindow::updateDoneButton(QString text)
+{
+ if (m_doneButton)
+ {
+ m_doneButton->setText(text);
+ }
+}
\ No newline at end of file
diff --git a/src/app/qt/element/QtSettingsWindow.h b/src/app/qt/window/QtSettingsWindow.h
similarity index 69%
rename from src/app/qt/element/QtSettingsWindow.h
rename to src/app/qt/window/QtSettingsWindow.h
index 91e38ee8..c3b517ad 100644
--- a/src/app/qt/element/QtSettingsWindow.h
+++ b/src/app/qt/window/QtSettingsWindow.h
@@ -4,6 +4,10 @@
#include
#include
+class QFormLayout;
+class QLabel;
+class QPushButton;
+
class QtSettingsWindow
: public QWidget
{
@@ -16,6 +20,10 @@ public:
virtual void setup() = 0;
+signals:
+ void finished();
+ void canceled();
+
protected:
void keyPressEvent(QKeyEvent* event) Q_DECL_OVERRIDE;
void resizeEvent(QResizeEvent* event) Q_DECL_OVERRIDE;
@@ -23,8 +31,19 @@ protected:
void mousePressEvent(QMouseEvent *event) Q_DECL_OVERRIDE;
void mouseReleaseEvent(QMouseEvent *event) Q_DECL_OVERRIDE;
+ void setupForm();
+ virtual void populateForm(QFormLayout* layout);
+
+ void updateTitle(QString title);
+ void updateDoneButton(QString text);
+
QWidget* m_window;
+ QLabel* m_title;
+
+ QPushButton* m_cancelButton;
+ QPushButton* m_doneButton;
+
private:
int m_displacment;
QPoint m_dragPosition;
diff --git a/src/app/qt/element/QtSplashScreen.cpp b/src/app/qt/window/QtSplashScreen.cpp
similarity index 96%
rename from src/app/qt/element/QtSplashScreen.cpp
rename to src/app/qt/window/QtSplashScreen.cpp
index 430546b6..4c4b4f1f 100644
--- a/src/app/qt/element/QtSplashScreen.cpp
+++ b/src/app/qt/window/QtSplashScreen.cpp
@@ -1,4 +1,4 @@
-#include "qt/element/QtSplashScreen.h"
+#include "qt/window/QtSplashScreen.h"
#include
#include
@@ -88,7 +88,6 @@ void QtSplashScreen::drawContents(QPainter *painter)
QRect r = rect();
r.setRect(r.x() + 5, r.height() - 20, r.width() - 10, 20);
- // TODO: automated Version number
painter->drawText(r, Qt::AlignRight, QString("Coati v").append(m_version));
// Draw message at given position, limited to 43 chars
diff --git a/src/app/qt/element/QtSplashScreen.h b/src/app/qt/window/QtSplashScreen.h
similarity index 100%
rename from src/app/qt/element/QtSplashScreen.h
rename to src/app/qt/window/QtSplashScreen.h
diff --git a/src/app/qt/element/QtStartScreen.cpp b/src/app/qt/window/QtStartScreen.cpp
similarity index 88%
rename from src/app/qt/element/QtStartScreen.cpp
rename to src/app/qt/window/QtStartScreen.cpp
index 826ac6c4..d867dce2 100644
--- a/src/app/qt/element/QtStartScreen.cpp
+++ b/src/app/qt/window/QtStartScreen.cpp
@@ -1,4 +1,4 @@
-#include "qt/element/QtStartScreen.h"
+#include "qt/window/QtStartScreen.h"
#include
#include
@@ -33,7 +33,6 @@ QtStartScreen::QtStartScreen(QWidget *parent)
void QtStartScreen::setup()
{
setStyleSheet(utility::getStyleSheet("data/gui/startscreen/startscreen.css").c_str());
- std::vector recentProjects = ApplicationSettings::getInstance()->getRecentProjects();
QtDeviceScaledPixmap coati_logo("data/gui/startscreen/logo_schriftzug.png");
coati_logo.scaleToWidth(200);
@@ -54,20 +53,19 @@ void QtStartScreen::setup()
m_openProjectButton->setObjectName("projectButton");
connect(m_openProjectButton, SIGNAL(clicked()), this, SLOT(handleOpenProjectButton()));
- connect(this, SIGNAL(openOpenProjectDialog()), parent(), SLOT(openProject()));
- connect(this, SIGNAL(openNewProjectDialog()), parent(), SLOT(newProject()));
-
QLabel* recentProjectsLabel = new QLabel("Recent Projects: ", this);
recentProjectsLabel->setGeometry(300, 234, 300, 50);
recentProjectsLabel->setObjectName("recentLabel");
int position = 290;
QIcon cpp_icon("data/gui/startscreen/Icon_CPP.png");
- for (std::string project : recentProjects)
+ std::vector recentProjects = ApplicationSettings::getInstance()->getRecentProjects();
+ for (size_t i = 0; i < recentProjects.size() && i < 7; i++)
{
- if (FileSystem::exists(project.c_str()))
+ FilePath project = recentProjects[i];
+ if (project.exists())
{
- QtRecentProjectButton* button = new QtRecentProjectButton(project.c_str(), this);
+ QtRecentProjectButton* button = new QtRecentProjectButton(project.str().c_str(), this);
button->setAttribute(Qt::WA_LayoutUsesWidgetRect); // fixes layouting on Mac
button->setIcon(cpp_icon);
button->setIconSize(QSize(25, 25));
diff --git a/src/app/qt/element/QtStartScreen.h b/src/app/qt/window/QtStartScreen.h
similarity index 81%
rename from src/app/qt/element/QtStartScreen.h
rename to src/app/qt/window/QtStartScreen.h
index 82445dbc..273fc783 100644
--- a/src/app/qt/element/QtStartScreen.h
+++ b/src/app/qt/window/QtStartScreen.h
@@ -1,21 +1,26 @@
-#ifndef STARTSCREEN_H
-#define STARTSCREEN_H
+#ifndef QT_START_SCREEN_H
+#define QT_START_SCREEN_H
-#include
-#include "QtSettingsWindow.h"
+#include
+
+#include "qt/window/QtSettingsWindow.h"
class QtRecentProjectButton
: public QPushButton
{
-Q_OBJECT
+ Q_OBJECT
+
public:
QtRecentProjectButton(const QString& text, QWidget* parent);
+
public slots:
void handleButtonClick();
+
private:
std::string m_projectFile;
};
+
class QtStartScreen
: public QtSettingsWindow
{
@@ -29,7 +34,6 @@ public:
signals:
void openOpenProjectDialog();
void openNewProjectDialog();
- void finished();
private slots:
void handleNewProjectButton();
@@ -42,4 +46,4 @@ private:
std::vector m_recentProjects;
};
-#endif //STARTSCREEN_H
+#endif // QT_START_SCREEN_H
diff --git a/src/lib/Application.cpp b/src/lib/Application.cpp
index 1ae8176a..6546c2ee 100644
--- a/src/lib/Application.cpp
+++ b/src/lib/Application.cpp
@@ -27,6 +27,8 @@ std::shared_ptr Application::create(ViewFactory* viewFactory)
ptr->m_componentManager->setup(ptr->m_mainView.get());
ptr->m_mainView->loadLayout();
+ ptr->m_project = Project::create(ptr->m_storageCache.get());
+
return ptr;
}
@@ -53,9 +55,9 @@ Application::~Application()
m_mainView->saveLayout();
}
-void Application::loadProject(const std::string& projectSettingsFilePath)
+void Application::loadProject(const FilePath& projectSettingsFilePath)
{
- MessageStatus("Loading Project: " + projectSettingsFilePath).dispatch();
+ MessageStatus("Loading Project: " + projectSettingsFilePath.str()).dispatch();
m_storageCache->clear();
m_componentManager->refreshViews();
@@ -78,7 +80,7 @@ void Application::reloadProject()
m_project->parseCode();
}
-void Application::saveProject(const std::string& projectSettingsFilePath)
+void Application::saveProject(const FilePath& projectSettingsFilePath)
{
if (!m_project->saveProjectSettings(projectSettingsFilePath))
{
@@ -140,13 +142,13 @@ void Application::handleMessage(MessageSaveProject* message)
saveProject(message->projectSettingsFilePath);
}
-void Application::updateRecentProjects(const std::string& projectSettingsFilePath)
+void Application::updateRecentProjects(const FilePath& projectSettingsFilePath)
{
ApplicationSettings* appSettings = ApplicationSettings::getInstance().get();
- std::vector recentProjects = appSettings->getRecentProjects();
+ std::vector recentProjects = appSettings->getRecentProjects();
if (recentProjects.size())
{
- std::vector::iterator it = std::find(recentProjects.begin(), recentProjects.end(), projectSettingsFilePath);
+ std::vector::iterator it = std::find(recentProjects.begin(), recentProjects.end(), projectSettingsFilePath);
if (it != recentProjects.end())
{
recentProjects.erase(it);
diff --git a/src/lib/Application.h b/src/lib/Application.h
index 47b78b52..568a3e40 100644
--- a/src/lib/Application.h
+++ b/src/lib/Application.h
@@ -27,10 +27,9 @@ public:
~Application();
- void loadProject(const std::string& projectSettingsFilePath);
- void loadSource(const std::string& sourceDirectoryPath);
- void saveProject(const std::string& projectSettingsFilePath);
+ void loadProject(const FilePath& projectSettingsFilePath);
void reloadProject();
+ void saveProject(const FilePath& projectSettingsFilePath);
private:
Application();
@@ -40,7 +39,7 @@ private:
virtual void handleMessage(MessageRefresh* message);
virtual void handleMessage(MessageSaveProject* message);
- void updateRecentProjects(const std::string& projectSettingsFilePath);
+ void updateRecentProjects(const FilePath& projectSettingsFilePath);
std::shared_ptr m_project;
std::shared_ptr m_storageCache;
diff --git a/src/lib/Project.cpp b/src/lib/Project.cpp
index 1747226d..9423b305 100644
--- a/src/lib/Project.cpp
+++ b/src/lib/Project.cpp
@@ -21,7 +21,7 @@ Project::~Project()
{
}
-bool Project::loadProjectSettings(const std::string& projectSettingsFile)
+bool Project::loadProjectSettings(const FilePath& projectSettingsFile)
{
bool success = ProjectSettings::getInstance()->load(projectSettingsFile);
if (success)
@@ -34,28 +34,28 @@ bool Project::loadProjectSettings(const std::string& projectSettingsFile)
return success;
}
-bool Project::saveProjectSettings(const std::string& projectSettingsFile)
+bool Project::saveProjectSettings(const FilePath& projectSettingsFile)
{
- if (projectSettingsFile.size())
+ if (!projectSettingsFile.empty())
{
m_projectSettingsFilepath = projectSettingsFile;
}
- if (!m_projectSettingsFilepath.size())
+ if (m_projectSettingsFilepath.empty())
{
return false;
}
ProjectSettings::getInstance()->save(m_projectSettingsFilepath);
- LOG_INFO_STREAM(<< "ProjectSettings saved to file: " << m_projectSettingsFilepath);
+ LOG_INFO_STREAM(<< "ProjectSettings saved to file: " << m_projectSettingsFilepath.str());
return true;
}
void Project::clearProjectSettings()
{
- m_projectSettingsFilepath.clear();
+ m_projectSettingsFilepath = FilePath();
ProjectSettings::getInstance()->clear();
m_fileManager.reset();
@@ -63,7 +63,7 @@ void Project::clearProjectSettings()
void Project::reloadProjectSettings()
{
- if (m_projectSettingsFilepath.size())
+ if (!m_projectSettingsFilepath.empty())
{
ProjectSettings::getInstance()->load(m_projectSettingsFilepath);
updateFileManager();
@@ -78,6 +78,11 @@ void Project::clearStorage()
void Project::parseCode()
{
+ if (m_projectSettingsFilepath.empty())
+ {
+ return;
+ }
+
std::shared_ptr projSettings = ProjectSettings::getInstance();
m_fileManager.fetchFilePaths();
diff --git a/src/lib/Project.h b/src/lib/Project.h
index ae05fb48..725190cb 100644
--- a/src/lib/Project.h
+++ b/src/lib/Project.h
@@ -17,8 +17,8 @@ public:
~Project();
- bool loadProjectSettings(const std::string& projectSettingsFile);
- bool saveProjectSettings(const std::string& projectSettingsFile);
+ bool loadProjectSettings(const FilePath& projectSettingsFile);
+ bool saveProjectSettings(const FilePath& projectSettingsFile);
void clearProjectSettings();
void reloadProjectSettings();
@@ -38,7 +38,7 @@ private:
StorageAccessProxy* const m_storageAccessProxy;
- std::string m_projectSettingsFilepath;
+ FilePath m_projectSettingsFilepath;
FileManager m_fileManager;
std::shared_ptr m_storage;
diff --git a/src/lib/settings/ApplicationSettings.cpp b/src/lib/settings/ApplicationSettings.cpp
index bf878b53..10ec9ac7 100644
--- a/src/lib/settings/ApplicationSettings.cpp
+++ b/src/lib/settings/ApplicationSettings.cpp
@@ -26,11 +26,21 @@ std::vector ApplicationSettings::getHeaderSearchPaths() const
return getPathValues("source/HeaderSearchPaths/HeaderSearchPath");
}
+bool ApplicationSettings::setHeaderSearchPaths(const std::vector& headerSearchPaths)
+{
+ return setPathValues("source/HeaderSearchPaths/HeaderSearchPath", headerSearchPaths);
+}
+
std::vector ApplicationSettings::getFrameworkSearchPaths() const
{
return getPathValues("source/FrameworkSearchPaths/FrameworkSearchPath");
}
+bool ApplicationSettings::setFrameworkSearchPaths(const std::vector& frameworkSearchPaths)
+{
+ return setPathValues("source/FrameworkSearchPaths/FrameworkSearchPath", frameworkSearchPaths);
+}
+
std::vector ApplicationSettings::getCompilerFlags() const
{
std::vector defaultValues;
@@ -101,11 +111,22 @@ ApplicationSettings::ApplicationSettings()
{
}
-std::vector ApplicationSettings::getRecentProjects() const {
- std::vector recentProjects;
- return getValues("recentProjects/projectFilePath", recentProjects);
+std::vector ApplicationSettings::getRecentProjects() const
+{
+ return getPathValues("user/recent_projects/recent_project");
}
-bool ApplicationSettings::setRecentProjects(const std::vector &recentProjects) {
- return setValues("recentProjects/projectFilePath", recentProjects);
+bool ApplicationSettings::setRecentProjects(const std::vector &recentProjects)
+{
+ return setPathValues("user/recent_projects/recent_project", recentProjects);
+}
+
+bool ApplicationSettings::getUserHasSeenSettings() const
+{
+ return getValue("user/has_seen_settings", false);
+}
+
+void ApplicationSettings::setUserHasSeenSettings(bool hasSeenSettings)
+{
+ setValue("user/has_seen_settings", hasSeenSettings);
}
diff --git a/src/lib/settings/ApplicationSettings.h b/src/lib/settings/ApplicationSettings.h
index 9075e256..ed796187 100644
--- a/src/lib/settings/ApplicationSettings.h
+++ b/src/lib/settings/ApplicationSettings.h
@@ -16,7 +16,11 @@ public:
// source
std::vector getHeaderSearchPaths() const;
+ bool setHeaderSearchPaths(const std::vector& headerSearchPaths);
+
std::vector getFrameworkSearchPaths() const;
+ bool setFrameworkSearchPaths(const std::vector& frameworkSearchPaths);
+
std::vector getCompilerFlags() const;
// application
@@ -29,10 +33,6 @@ public:
std::string getColorSchemePath() const;
void setColorSchemePath(const std::string& colorSchemePath);
- //recent projects
- std::vector getRecentProjects() const;
- bool setRecentProjects(const std::vector& recentProjects);
-
// code
int getCodeTabWidth() const;
void setCodeTabWidth(int codeTabWidth);
@@ -43,6 +43,13 @@ public:
int getCodeSnippetExpandRange() const;
void setCodeSnippetExpandRange(int range);
+ // user
+ bool getUserHasSeenSettings() const;
+ void setUserHasSeenSettings(bool hasSeenSettings);
+
+ std::vector getRecentProjects() const;
+ bool setRecentProjects(const std::vector& recentProjects);
+
private:
ApplicationSettings();
ApplicationSettings(const ApplicationSettings&);