From e7a977dd5c1f400f064b5d6c304d1aa4600f0dec Mon Sep 17 00:00:00 2001 From: Andreas Stallinger Date: Mon, 3 Aug 2015 17:24:24 +0200 Subject: [PATCH] UI: ProjectSettingsUI ProjectSettingsUI for creation of new Projects + StartScreen design update --- .gitignore | 1 + CMakeLists.txt | 20 +- bin/app/data/gui/settingwindows/listbox.css | 27 +++ .../data/gui/settingwindows/projectsetup.css | 39 ++++ bin/app/data/gui/startscreen/Icon_CPP.png | Bin 0 -> 3639 bytes bin/app/data/gui/startscreen/icon_file.png | Bin 0 -> 3197 bytes bin/app/data/gui/startscreen/logo.png | Bin 0 -> 53002 bytes .../data/gui/startscreen/logo_schriftzug.png | Bin 0 -> 36778 bytes bin/app/data/gui/startscreen/startscreen.css | 28 +++ cmake/CLANGConfig.cmake | 50 +++-- src/app/CMakeLists.txt | 6 + src/app/qt/element/QtDirectoryListBox.cpp | 122 ++++++++++++ src/app/qt/element/QtDirectoryListBox.h | 30 +++ src/app/qt/element/QtMainWindow.cpp | 30 +-- src/app/qt/element/QtMainWindow.h | 4 + src/app/qt/element/QtProjectSetupScreen.cpp | 185 ++++++++++++++++++ src/app/qt/element/QtProjectSetupScreen.h | 51 +++++ src/app/qt/element/QtSettingsWindow.cpp | 89 +++++++++ src/app/qt/element/QtSettingsWindow.h | 31 +++ src/app/qt/element/QtSplashScreen.cpp | 2 +- src/app/qt/element/QtStartScreen.cpp | 96 ++++----- src/app/qt/element/QtStartScreen.h | 6 +- src/app/qt/view/QtMainView.cpp | 1 + src/lib/Application.cpp | 11 +- src/lib/settings/ApplicationSettings.cpp | 9 + src/lib/settings/ApplicationSettings.h | 4 + src/lib/settings/ProjectSettings.cpp | 10 + src/lib/settings/ProjectSettings.h | 3 + 28 files changed, 764 insertions(+), 91 deletions(-) create mode 100644 bin/app/data/gui/settingwindows/listbox.css create mode 100644 bin/app/data/gui/settingwindows/projectsetup.css create mode 100644 bin/app/data/gui/startscreen/Icon_CPP.png create mode 100644 bin/app/data/gui/startscreen/icon_file.png create mode 100755 bin/app/data/gui/startscreen/logo.png create mode 100755 bin/app/data/gui/startscreen/logo_schriftzug.png create mode 100644 bin/app/data/gui/startscreen/startscreen.css create mode 100644 src/app/qt/element/QtDirectoryListBox.cpp create mode 100644 src/app/qt/element/QtDirectoryListBox.h create mode 100644 src/app/qt/element/QtProjectSetupScreen.cpp create mode 100644 src/app/qt/element/QtProjectSetupScreen.h create mode 100644 src/app/qt/element/QtSettingsWindow.cpp create mode 100644 src/app/qt/element/QtSettingsWindow.h diff --git a/.gitignore b/.gitignore index 65b688eb..169c581d 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,4 @@ /bin/test/data/TestSettings.xml .DS_Store +.idea diff --git a/CMakeLists.txt b/CMakeLists.txt index 61dce226..9e191484 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -35,7 +35,16 @@ project(${PROJECT_NAME}) # Clang ------------------------------------------------------------------------ -find_package(LLVM REQUIRED PATHS "$ENV{CLANG_DIR}/build/share/llvm/cmake") +if(UNIX AND NOT APPLE) + if ("${CMAKE_BUILD_TYPE}" STREQUAL "Release") + find_package(LLVM REQUIRED PATHS "$ENV{CLANG_DIR}/build_release/share/llvm/cmake") + else() + find_package(LLVM REQUIRED PATHS "$ENV{CLANG_DIR}/build_debug/share/llvm/cmake") + endif() +else() + find_package(LLVM REQUIRED PATHS "$ENV{CLANG_DIR}/build/share/llvm/cmake") +endif() + find_package(CLANG REQUIRED PATHS "${CMAKE_SOURCE_DIR}/cmake") add_definitions(${CLANG_DEFINITIONS}) @@ -110,6 +119,15 @@ set(CMAKE_AUTOMOC ON) set(CMAKE_PREFIX_PATH "$ENV{QT_DIR}/") find_package(Qt5Widgets) + +if(Qt5Widgets_FOUND) + MESSAGE(STATUS "Found Qt ${Qt5Widgets_VERSION_STRING}") + # FIX: Qt was built with -reduce-relocations + if (Qt5_POSITION_INDEPENDENT_CODE) + SET(CMAKE_POSITION_INDEPENDENT_CODE ON) + endif() +endif() + find_package(Qt5PrintSupport) if (WIN32) file(WRITE ${CMAKE_SOURCE_DIR}/build/Coati.rc diff --git a/bin/app/data/gui/settingwindows/listbox.css b/bin/app/data/gui/settingwindows/listbox.css new file mode 100644 index 00000000..89782c7a --- /dev/null +++ b/bin/app/data/gui/settingwindows/listbox.css @@ -0,0 +1,27 @@ +.QtDirectoryListBox { + border: 1px solid lightgray; + border-radius: 15px; + background-color: rgba(255, 255, 255, 200); +} + +.QListWidget { + border: none; + background: transparent; +} + +#roundedButton { + font-size: 15px; + color: white; + border-radius: 10px; + background: dimgray; + width: 20px; + height: 20px; +} + +#roundedButton:hover { + background: lightgray; +} + +#dropInfo { + color: lightgray; +} diff --git a/bin/app/data/gui/settingwindows/projectsetup.css b/bin/app/data/gui/settingwindows/projectsetup.css new file mode 100644 index 00000000..38a9ffe8 --- /dev/null +++ b/bin/app/data/gui/settingwindows/projectsetup.css @@ -0,0 +1,39 @@ +QLineEdit { + border-radius: 10px; + border: 1px solid lightgrey; + background-color: rgba(255, 255, 255, 200); +} + +#form { + background-color: rgba(255, 255, 255, 200); + border: none; +} + +#moreButton { + font-size: 15px; + margin-left: 10px; + color: gray; + border-radius: 10px; + border: 1px solid lightgray; + background: white; + width: 40px; + height: 20px; +} + +#moreutton:hover { + background: lightgray; +} + +#windowButton { + margin-left: 10px; + color: black; + border-radius: 10px; + border: 1px solid lightgray; + background: white; + width: 40px; + height: 20px; +} + +#windowButton:hover { + background: lightgray; +} diff --git a/bin/app/data/gui/startscreen/Icon_CPP.png b/bin/app/data/gui/startscreen/Icon_CPP.png new file mode 100644 index 0000000000000000000000000000000000000000..1ce2a01ffd5db857de43f2acd7a15ad977407e4b GIT binary patch literal 3639 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 X(xOA^bC8eD?+aL%*cw+u+@t>kOhV!Q literal 0 HcmV?d00001 diff --git a/bin/app/data/gui/startscreen/logo.png b/bin/app/data/gui/startscreen/logo.png new file mode 100755 index 0000000000000000000000000000000000000000..2c45335a66909b849e5f33b970621d69b1762679 GIT binary patch literal 53002 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 nRuz6slId43Gmw^V}Mf5sna2~`ourVWoZ2eEC^ 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 V*6)};h{Ls0l2el{d-^uue*n=z?kNBO literal 0 HcmV?d00001 diff --git a/bin/app/data/gui/startscreen/startscreen.css b/bin/app/data/gui/startscreen/startscreen.css new file mode 100644 index 00000000..c59555ff --- /dev/null +++ b/bin/app/data/gui/startscreen/startscreen.css @@ -0,0 +1,28 @@ +#projectButton { + font-size: 17pt; + border: 1px solid lightgray; + border-radius: 10px; + background: white; +} + +#projectButton:hover { + color: white; + background: navy; +} + +#recentButton{ + font-size: 12pt; + color: black; + background: none; + border: none; +} + +#recentButton:hover{ + background: lightgray; + border-radius: 10px; +} + +#recentLabel { + font-size: 16pt; + color: black; +} diff --git a/cmake/CLANGConfig.cmake b/cmake/CLANGConfig.cmake index cba3b8c9..ea3260c5 100644 --- a/cmake/CLANGConfig.cmake +++ b/cmake/CLANGConfig.cmake @@ -1,21 +1,43 @@ -execute_process( - COMMAND $ENV{CLANG_DIR}/build/bin/llvm-config --cxxflags - OUTPUT_VARIABLE CLANG_DEFINITIONS -) +if(UNIX AND NOT APPLE) -set(CLANG_INCLUDE_DIRS - "$ENV{CLANG_DIR}/llvm/tools/clang/include" - "$ENV{CLANG_DIR}/build/tools/clang/include" -) + execute_process( + COMMAND $ENV{CLANG_DIR}/build_debug/bin/llvm-config --cxxflags + OUTPUT_VARIABLE CLANG_DEFINITIONS + ) -set(CLANG_LIBRARY_DIRS "$ENV{CLANG_DIR}/build/lib") -if (UNIX) - if ("${CMAKE_BUILD_TYPE}" STREQUAL "Release") - set(CLANG_LIBRARY_DIRS "$ENV{CLANG_DIR}/build/Release+Asserts/lib") - endif() -endif () + set(CLANG_INCLUDE_DIRS + "$ENV{CLANG_DIR}/llvm/tools/clang/include" + "$ENV{CLANG_DIR}/build_debug/tools/clang/include" + ) + set(CLANG_LIBRARY_DIRS "$ENV{CLANG_DIR}/build_debug/lib") + if (UNIX) + if ("${CMAKE_BUILD_TYPE}" STREQUAL "Release") + set(CLANG_LIBRARY_DIRS "$ENV{CLANG_DIR}/build_release/lib") + endif() + endif () + +else() + + execute_process( + COMMAND $ENV{CLANG_DIR}/build/bin/llvm-config --cxxflags + OUTPUT_VARIABLE CLANG_DEFINITIONS + ) + + set(CLANG_INCLUDE_DIRS + "$ENV{CLANG_DIR}/llvm/tools/clang/include" + "$ENV{CLANG_DIR}/build/tools/clang/include" + ) + + set(CLANG_LIBRARY_DIRS "$ENV{CLANG_DIR}/build_debug/lib") + if (UNIX) + if ("${CMAKE_BUILD_TYPE}" STREQUAL "Release") + set(CLANG_LIBRARY_DIRS "$ENV{CLANG_DIR}/build/Release+Asserts/lib") + endif() + endif () + +endif() set(CLANG_LIBRARIES #clangApplyReplacements diff --git a/src/app/CMakeLists.txt b/src/app/CMakeLists.txt index 868937dc..0c42b3b7 100644 --- a/src/app/CMakeLists.txt +++ b/src/app/CMakeLists.txt @@ -15,12 +15,18 @@ add_files( qt/element/QtCodeFileList.h qt/element/QtCodeSnippet.cpp qt/element/QtCodeSnippet.h + qt/element/QtDirectoryListBox.cpp + qt/element/QtDirectoryListBox.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 diff --git a/src/app/qt/element/QtDirectoryListBox.cpp b/src/app/qt/element/QtDirectoryListBox.cpp new file mode 100644 index 00000000..c763aa86 --- /dev/null +++ b/src/app/qt/element/QtDirectoryListBox.cpp @@ -0,0 +1,122 @@ +#include "qt/element/QtDirectoryListBox.h" + +#include +#include +#include +#include +#include + +#include "qt/utility/utilityQt.h" + +QtDirectoryListBox::QtDirectoryListBox(QWidget *parent) + :QFrame(parent) +{ + setObjectName("QtListBox"); + setMinimumHeight(150); + QBoxLayout* layout = new QVBoxLayout(); + layout->setSpacing(0); + layout->setContentsMargins(10, 10, 10, 10); + layout->setAlignment(Qt::AlignTop); + m_list = new QListWidget(this); + + setStyleSheet(utility::getStyleSheet("data/gui/settingwindows/listbox.css").c_str()); + layout->addWidget(m_list); + + QWidget* buttonContainer = new QWidget(this); + QBoxLayout* innerLayout = new QHBoxLayout(); + innerLayout->setContentsMargins(0,0,0,0); + + m_addButton = new QPushButton("+",this); + m_addButton->resize(20,20); + m_addButton->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed); + m_addButton->setObjectName("roundedButton"); + innerLayout->addWidget(m_addButton); + + m_removeButton = new QPushButton("-",this); + m_removeButton->resize(20,20); + m_removeButton->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed); + m_removeButton->setObjectName("roundedButton"); + innerLayout->addWidget(m_removeButton); + + QLabel* dropInfoText = new QLabel("You can drop Folders here"); + dropInfoText->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); + dropInfoText->setObjectName("dropInfo"); + dropInfoText->setAlignment(Qt::AlignRight); + innerLayout->addWidget(dropInfoText); + buttonContainer->setLayout(innerLayout); + layout->addWidget(buttonContainer); + setLayout(layout); + + connect(m_addButton, SIGNAL(clicked()), this, SLOT(addListBoxItem())); + connect(m_removeButton, SIGNAL(clicked()), this, SLOT(removeListBoxItem())); + + setAcceptDrops(true); +} + +void QtDirectoryListBox::dropEvent(QDropEvent *event) +{ + QFileInfo fileInfo; + foreach(QUrl url, event->mimeData()->urls()) + { + fileInfo.setFile(url.toLocalFile()); + if(fileInfo.isDir()) + { + QListWidgetItem *item = new QListWidgetItem(m_list); + m_list->addItem(item); + item->setText(url.toLocalFile()); + } + } +} + +std::vector QtDirectoryListBox::getList() +{ + std::vector list; + for( int i = 0; i < m_list->count(); ++i) + { + QListWidgetItem* item = m_list->item(i); + list.push_back(item->text().toStdString()); + } + + return list; +} + +void QtDirectoryListBox::addListBoxItem() +{ + QFileDialog dialog(this); + dialog.setFileMode(QFileDialog::DirectoryOnly); + dialog.setOption(QFileDialog::ShowDirsOnly, true); + dialog.setOption(QFileDialog::DontUseNativeDialog,true); + + // enable multiselection of directories + QListView *l = dialog.findChild("listView"); + if (l) + { + l->setSelectionMode(QAbstractItemView::MultiSelection); + } + QTreeView *t = dialog.findChild(); + if (t) + { + t->setSelectionMode(QAbstractItemView::MultiSelection); + } + + if(dialog.exec()) + { + QStringList list = dialog.selectedFiles(); + for(int i = 0; i < list.size(); i++) + { + QListWidgetItem *item = new QListWidgetItem(m_list); + m_list->addItem(item); + item->setText(list.at(i)); + } + } +} + +void QtDirectoryListBox::removeListBoxItem() +{ + qDeleteAll(m_list->selectedItems()); +} + +void QtDirectoryListBox::dragEnterEvent(QDragEnterEvent *event) +{ + event->accept(); +} diff --git a/src/app/qt/element/QtDirectoryListBox.h b/src/app/qt/element/QtDirectoryListBox.h new file mode 100644 index 00000000..33f1c732 --- /dev/null +++ b/src/app/qt/element/QtDirectoryListBox.h @@ -0,0 +1,30 @@ +#ifndef QT_DIRECTORYLISTBOX_H +#define QT_DIRECTORYLISTBOX_H + +#include +#include +#include +#include + +#include "utility/file/FilePath.h" + +class QtDirectoryListBox : public QFrame +{ +Q_OBJECT +public: + QtDirectoryListBox(QWidget *parent); + std::vector getList(); +protected: + void dropEvent(QDropEvent *event); + void dragEnterEvent(QDragEnterEvent* event); +private: + QPushButton* m_addButton; + QPushButton* m_removeButton; + QListWidget* m_list; + +private slots: + void addListBoxItem(); + void removeListBoxItem(); +}; + +#endif //QT_DIRECTORYLISTBOX_H diff --git a/src/app/qt/element/QtMainWindow.cpp b/src/app/qt/element/QtMainWindow.cpp index f16776ba..3990b3d8 100644 --- a/src/app/qt/element/QtMainWindow.cpp +++ b/src/app/qt/element/QtMainWindow.cpp @@ -9,7 +9,6 @@ #include "component/view/View.h" #include "component/view/CompositeView.h" -#include "qt/element/QtStartScreen.h" #include "qt/view/QtViewWidgetWrapper.h" #include "utility/logging/logging.h" #include "utility/messaging/type/MessageFind.h" @@ -31,6 +30,7 @@ QtMainWindow::QtMainWindow() setDockNestingEnabled(true); setWindowIcon(QIcon("./data/gui/icon/logo_1024_1024.png")); + setWindowFlags(Qt::Widget); QApplication::setOverrideCursor(Qt::ArrowCursor); @@ -44,13 +44,17 @@ QtMainWindow::QtMainWindow() // Need to call loadLayout here for right DockWidget size on Linux // Seconde call is in Application.cpp loadLayout(); +} +void QtMainWindow::init() +{ // StartScreen m_startScreen = std::make_shared(this); - m_startScreen->setWindowModality(Qt::WindowModal); + m_startScreen->setup(); m_startScreen->show(); } + QtMainWindow::~QtMainWindow() { } @@ -60,8 +64,8 @@ void QtMainWindow::addView(View* view) QDockWidget* dock = new QDockWidget(tr(view->getName().c_str()), this); dock->setWidget(QtViewWidgetWrapper::getWidgetOfView(view)); dock->setObjectName(QString::fromStdString("Dock" + view->getName())); - // dock->setFeatures(QDockWidget::NoDockWidgetFeatures); - // dock->setTitleBarWidget(new QWidget()); + //dock->setFeatures(QDockWidget::NoDockWidgetFeatures); + //dock->setTitleBarWidget(new QWidget()); addDockWidget(Qt::TopDockWidgetArea, dock); m_dockWidgets.push_back(std::make_pair(view, dock)); } @@ -149,12 +153,9 @@ void QtMainWindow::about() void QtMainWindow::newProject() { - QString sourceDir = QFileDialog::getExistingDirectory(this, tr("Open Directory")); - - if (!sourceDir.isEmpty()) - { - MessageLoadSource(sourceDir.toStdString()).dispatch(); - } + m_newProjectDialog = std::make_shared(this); + m_newProjectDialog->setup(); + m_newProjectDialog->show(); } void QtMainWindow::openProject(const QString &path) @@ -241,7 +242,14 @@ void QtMainWindow::switchColorScheme() void QtMainWindow::handleEscapeShortcut() { - m_startScreen->hide(); + if(m_startScreen) + { + m_startScreen->hide(); + } + if(m_newProjectDialog) + { + m_newProjectDialog->hide(); + } MessageInterruptTasks().dispatch(); } diff --git a/src/app/qt/element/QtMainWindow.h b/src/app/qt/element/QtMainWindow.h index ccf01a14..907fe9b8 100644 --- a/src/app/qt/element/QtMainWindow.h +++ b/src/app/qt/element/QtMainWindow.h @@ -9,6 +9,7 @@ #include #include "QtStartScreen.h" +#include "QtProjectSetupScreen.h" class QDockWidget; class View; @@ -21,6 +22,8 @@ public: QtMainWindow(); ~QtMainWindow(); + void init(); + void addView(View* view); void removeView(View* view); @@ -62,6 +65,7 @@ private: QDockWidget* getDockWidgetForView(View* view) const; std::shared_ptr m_startScreen; + std::shared_ptr m_newProjectDialog; std::vector> m_dockWidgets; diff --git a/src/app/qt/element/QtProjectSetupScreen.cpp b/src/app/qt/element/QtProjectSetupScreen.cpp new file mode 100644 index 00000000..59be4c67 --- /dev/null +++ b/src/app/qt/element/QtProjectSetupScreen.cpp @@ -0,0 +1,185 @@ +#include "qt/element/QtProjectSetupScreen.h" + +#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" + +QtTextLine::QtTextLine(QWidget *parent) + :QWidget(parent) +{ + QBoxLayout* layout = new QHBoxLayout(); + layout->setSpacing(0); + layout->setContentsMargins(1, 1, 1, 1); + layout->setAlignment(Qt::AlignTop); + + setLayout(layout); + + m_data = new QLineEdit(this); + m_button = new QPushButton("..."); + m_button->setMaximumWidth(40); + m_button->setObjectName("moreButton"); + layout->addWidget(m_data); + layout->addWidget(m_button); + + connect(m_button, SIGNAL(clicked()), this, SLOT(handleButtonPress())); +} + +QString QtTextLine::getText() +{ + return m_data->text(); +} + +void QtTextLine::setText(QString text) +{ + m_data->setText(text); +} + +void QtTextLine::handleButtonPress() +{ + QString file = QFileDialog::getExistingDirectory(this, tr("Select File"), ""); + if (!file.isEmpty()) + { + m_data->setText(file); + } +} + +QtProjectSetupScreen::QtProjectSetupScreen(QWidget *parent) + : QtSettingsWindow(parent) +{ + raise(); +} + +void QtProjectSetupScreen::setup() +{ + setStyleSheet(utility::getStyleSheet("data/gui/settingwindows/projectsetup.css").c_str()); + QVBoxLayout* windowLayout = new QVBoxLayout(); + windowLayout->setContentsMargins(20,30,20,20); + QLabel* windowTitleLabel = new QLabel("NEW PROJECT"); + windowLayout->addWidget(windowTitleLabel); + windowLayout->addSpacing(30); + + QScrollArea* scrollArea = new QScrollArea(); + scrollArea->setObjectName("coatiBackground"); + QWidget* form = new QWidget(); + form->setObjectName("form"); + scrollArea->setWidget(form); + scrollArea->setFrameShadow(QFrame::Plain); + scrollArea->setWidgetResizable(true); + QFormLayout *layout = new QFormLayout(); + layout->setContentsMargins(20,30,20,20); + + //Background Image + QPalette p = palette(); + QPixmap pixmap1("data/gui/startscreen/logo.png"); + QRect rect = scrollArea->rect(); + QSize size(rect.width()-90,rect.height()); + QPixmap pixmap(pixmap1.scaled(size)); + p.setBrush(QPalette::Background, pixmap); + scrollArea->setPalette(p); + + QLabel* nameLabel = new QLabel("Name"); + m_projectName = new QLineEdit(); + layout->addRow(nameLabel, m_projectName); + + QLabel* locationLabel = new QLabel("Location"); + m_projectFileLocation = new QtTextLine(this); + layout->addRow(locationLabel, m_projectFileLocation); + + /* + QLabel* languageLabel = new QLabel("Language"); + QComboBox* language = new QComboBox(); + language->insertItem(0, "C++"); + layout->addRow(languageLabel, language); + */ + + QLabel* sourcePathsLabel = new QLabel("Sourcepaths"); + m_sourcePaths = new QtDirectoryListBox(this); + layout->addRow(sourcePathsLabel, m_sourcePaths); + + QLabel* includePathsLabel = new QLabel("IncludePaths"); + m_includePaths = new QtDirectoryListBox(this); + layout->addRow(includePathsLabel, m_includePaths); + + if(QSysInfo::macVersion() != QSysInfo::MV_None) + { + QLabel* frameworkPathsLabel = new QLabel("FrameworkPaths"); + m_frameworkPaths = new QtDirectoryListBox(this); + layout->addRow(frameworkPathsLabel, m_frameworkPaths); + } + form->setLayout(layout); + + QPushButton* createButton = new QPushButton("Create"); + createButton->setObjectName("windowButton"); + QPushButton* cancelButton = new QPushButton("Cancel"); + cancelButton->setObjectName("windowButton"); + + connect(createButton, SIGNAL(clicked()), this, SLOT(handleCreateButtonPress())); + connect(cancelButton, SIGNAL(clicked()), this, SLOT(handleCancelButtonPress())); + + QHBoxLayout* buttons = new QHBoxLayout(); + buttons->addSpacing(100); + buttons->addWidget(createButton); + buttons->addWidget(cancelButton); + buttons->addSpacing(30); + + windowLayout->addWidget(scrollArea); + windowLayout->addSpacing(20); + windowLayout->addLayout(buttons); + + m_window->setLayout(windowLayout); + resize(QSize(600,600)); +} + +void QtProjectSetupScreen::handleCancelButtonPress() +{ + hide(); +} + +void QtProjectSetupScreen::handleCreateButtonPress() +{ + bool error = false; + if(m_projectName->text().isEmpty()) + { + QMessageBox msgBox; + msgBox.setText("Please Enter a Project Name"); + msgBox.exec(); + error = true; + } + if(m_projectFileLocation->getText().isEmpty()) + { + QMessageBox msgBox; + msgBox.setText("Location for the ProjectFiles is empty"); + msgBox.exec(); + error = true; + } + + if(!error) + { + ProjectSettings::getInstance()->setSourcePaths(m_sourcePaths->getList()); + ProjectSettings::getInstance()->setHeaderSearchPaths(m_includePaths->getList()); + if(m_frameworkPaths) + { + ProjectSettings::getInstance()->setFrameworkSearchPaths(m_frameworkPaths->getList()); + } + std::string projectFile = + m_projectFileLocation->getText().toStdString() + "/" + m_projectName->text().toStdString() + ".xml"; + ProjectSettings::getInstance()->save(projectFile); + MessageLoadProject(projectFile).dispatch(); + } +} + +QSize QtProjectSetupScreen::sizeHint() const +{ + return QSize(600,600); +} diff --git a/src/app/qt/element/QtProjectSetupScreen.h b/src/app/qt/element/QtProjectSetupScreen.h new file mode 100644 index 00000000..47428ee2 --- /dev/null +++ b/src/app/qt/element/QtProjectSetupScreen.h @@ -0,0 +1,51 @@ +#ifndef QTPROJECTSETUPSCREEN_H +#define QTPROJECTSETUPSCREEN_H + +#include +#include +#include +#include + +#include "QtSettingsWindow.h" + +#include "qt/element/QtDirectoryListBox.h" +#include "utility/file/FilePath.h" + +class QtTextLine : public QWidget +{ +Q_OBJECT +public: + QtTextLine(QWidget *parent); + QString getText(); + void setText(QString text); +private: + QPushButton* m_button; + QLineEdit* m_data; +private slots: + void handleButtonPress(); +}; + +class QtProjectSetupScreen : public QtSettingsWindow +{ +Q_OBJECT +public: + QtProjectSetupScreen(QWidget* parent = 0); + QSize sizeHint() const Q_DECL_OVERRIDE; + virtual void setup(); +private slots: + void handleCreateButtonPress(); + void handleCancelButtonPress(); + +private: + QLineEdit* m_projectName; + QtDirectoryListBox *m_includePaths; + QtDirectoryListBox *m_sourcePaths; + QtDirectoryListBox *m_frameworkPaths; + QtTextLine* m_projectFileLocation; + std::vector compilerFlags; + std::vector sourceExtensions; + std::vector headerExtensions; +}; + + +#endif //QTPROJECTSETUPSCREEN_H diff --git a/src/app/qt/element/QtSettingsWindow.cpp b/src/app/qt/element/QtSettingsWindow.cpp new file mode 100644 index 00000000..b6a3b48e --- /dev/null +++ b/src/app/qt/element/QtSettingsWindow.cpp @@ -0,0 +1,89 @@ +#include "qt/element/QtSettingsWindow.h" + +#include + +#include "utility/messaging/type/MessageInterruptTasks.h" + +QtSettingsWindow::QtSettingsWindow(QWidget *parent, int displacement) + : QWidget(parent, Qt::Dialog | Qt::FramelessWindowHint ) + , m_mousePressedInWindow(false) +{ + QSize windowSize = sizeHint(); + move(parent->pos().x()+parent->width()/2-250,parent->pos().y()+parent->height()/2-250); + setAttribute(Qt::WA_TranslucentBackground, true); + m_displacment = displacement; + m_window = new QWidget(this); + windowSize.setHeight(windowSize.height()-displacement-10); + windowSize.setWidth(windowSize.width()-10); + m_window->move(0,displacement); + //m_window->setFixedSize(windowSize); + m_window->resize(windowSize); + std::string frameStyle = + "#SettingWindow {" + "font-size: 17pt; " + "border: 1px solid lightgray;" + "border-radius: 15px; " + "background: white; " + "background-image: url(:/data/gui/icon/logo_1024_1024.png); " + "}"; + m_window->setStyleSheet(frameStyle.c_str()); + m_window->setObjectName("SettingWindow"); + + // test with window shadow + QGraphicsDropShadowEffect *effect = new QGraphicsDropShadowEffect; + effect->setBlurRadius(5); + effect->setXOffset(2); + effect->setYOffset(2); + effect->setColor(Qt::darkGray); + m_window->setGraphicsEffect(effect); + + this->raise(); +} + +void QtSettingsWindow::keyPressEvent(QKeyEvent *event) +{ + if(event->key() == Qt::Key_Escape) + { + this->hide(); + } +} + +QSize QtSettingsWindow::sizeHint() const +{ + return QSize(500, 500); +} + +void QtSettingsWindow::resizeEvent(QResizeEvent *event) { + QSize windowSize = event->size()-QSize(10,10+m_displacment); + m_window->resize(windowSize); + m_window->move(0,m_displacment); +} + +void QtSettingsWindow::mouseMoveEvent(QMouseEvent *event) +{ + if (event->buttons() & Qt::LeftButton && m_mousePressedInWindow) + { + move(event->globalPos() - m_dragPosition); + event->accept(); + } +} + +void QtSettingsWindow::mousePressEvent(QMouseEvent *event) +{ + if (event->button() == Qt::LeftButton) + { + m_dragPosition = event->globalPos() - frameGeometry().topLeft(); + event->accept(); + m_mousePressedInWindow = true; + } +} + +void QtSettingsWindow::mouseReleaseEvent(QMouseEvent *event) +{ + if (event->button() == Qt::LeftButton) + { + m_dragPosition = event->globalPos() - frameGeometry().topLeft(); + event->accept(); + m_mousePressedInWindow = false; + } +} diff --git a/src/app/qt/element/QtSettingsWindow.h b/src/app/qt/element/QtSettingsWindow.h new file mode 100644 index 00000000..89f79b34 --- /dev/null +++ b/src/app/qt/element/QtSettingsWindow.h @@ -0,0 +1,31 @@ +#ifndef QTSETTINGSWINDOW_H +#define QTSETTINGSWINDOW_H + +#include +#include + +class QtSettingsWindow : public QWidget +{ + Q_OBJECT + +public: + QtSettingsWindow(QWidget* parent = 0, int displacement = 0); + QSize sizeHint() const Q_DECL_OVERRIDE; + virtual void setup() = 0; + +protected: + QWidget* m_window; + + void keyPressEvent(QKeyEvent* event); + void resizeEvent(QResizeEvent* event); + void mouseMoveEvent(QMouseEvent *event) Q_DECL_OVERRIDE; + void mousePressEvent(QMouseEvent *event) Q_DECL_OVERRIDE; + void mouseReleaseEvent(QMouseEvent *event) Q_DECL_OVERRIDE; +private: + int m_displacment; + QPoint m_dragPosition; + bool m_mousePressedInWindow; + //void mouse +}; + +#endif //QTSETTINGSWINDOW_H diff --git a/src/app/qt/element/QtSplashScreen.cpp b/src/app/qt/element/QtSplashScreen.cpp index 563981df..430546b6 100644 --- a/src/app/qt/element/QtSplashScreen.cpp +++ b/src/app/qt/element/QtSplashScreen.cpp @@ -1,4 +1,4 @@ -#include "QtSplashScreen.h" +#include "qt/element/QtSplashScreen.h" #include #include diff --git a/src/app/qt/element/QtStartScreen.cpp b/src/app/qt/element/QtStartScreen.cpp index 6ef6eb69..faf32e9b 100644 --- a/src/app/qt/element/QtStartScreen.cpp +++ b/src/app/qt/element/QtStartScreen.cpp @@ -1,17 +1,22 @@ -#include "QtStartScreen.h" +#include "qt/element/QtStartScreen.h" #include +#include +#include +#include "settings/ApplicationSettings.h" #include "utility/file/FileSystem.h" #include "utility/messaging/type/MessageLoadProject.h" #include "qt/utility/QtDeviceScaledPixmap.h" +#include "qt/utility/utilityQt.h" QtRecentProjectButton::QtRecentProjectButton(const QString &text, QWidget *parent) : QPushButton(text, parent) { m_projectFile = text.toStdString(); this->setText(FileSystem::fileName(text.toStdString()).c_str()); + this->setToolTip(m_projectFile.c_str()); } void QtRecentProjectButton::handleButtonClick() @@ -21,90 +26,61 @@ void QtRecentProjectButton::handleButtonClick() }; QtStartScreen::QtStartScreen(QWidget *parent) - : QWidget(parent, Qt::Dialog | Qt::Popup | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint ) + : QtSettingsWindow(parent, 50) { - setGeometry(parent->pos().x()+parent->width()/2-250,parent->pos().y()+parent->height()/2-250,500,500); + this->raise(); +} - QPalette palette; - QLinearGradient linearGradient(QPointF(0, 275), QPointF(0, 500)); - linearGradient.setColorAt(0, QColor(46, 61, 135)); - linearGradient.setColorAt(1, QColor(0, 120, 195)); - palette.setBrush(QPalette::Window, *(new QBrush(linearGradient))); - this->setPalette(palette); - - QtDeviceScaledPixmap coati_logo("data/gui/startscreen/logo_white.png"); - coati_logo.scaleToWidth(100); +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(250); QLabel* coatiLogoLabel = new QLabel(this); coatiLogoLabel->setPixmap(coati_logo.pixmap()); - coatiLogoLabel->setGeometry(30, 30, coati_logo.width(), coati_logo.height()); - - std::string buttonStyle = - "QPushButton {" - "font-size: 17pt; " - "border-radius: 10px; " - "background: white; " - "} " - "QPushButton:hover {" - "background: rgba(255, 255, 255, 0.8); " - "}"; + coatiLogoLabel->resize(coati_logo.width(), coati_logo.height()); + coatiLogoLabel->move(30,10); m_newProjectButton = new QPushButton("New Project", this); m_newProjectButton->setAttribute(Qt::WA_LayoutUsesWidgetRect); // fixes layouting on Mac m_newProjectButton->setGeometry(30, 375, 140, 30); - m_newProjectButton->setStyleSheet(buttonStyle.c_str()); + m_newProjectButton->setObjectName("projectButton"); connect(m_newProjectButton, SIGNAL(clicked()), this, SLOT(handleNewProjectButton())); m_openProjectButton = new QPushButton("Open Project", this); m_openProjectButton->setAttribute(Qt::WA_LayoutUsesWidgetRect); // fixes layouting on Mac m_openProjectButton->setGeometry(30, 420, 140, 30); - m_openProjectButton->setStyleSheet(buttonStyle.c_str()); + 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())); + connect(this, SIGNAL(openOpenProjectDialog()), parent(), SLOT(openProject())); + connect(this, SIGNAL(openNewProjectDialog()), parent(), SLOT(newProject())); QLabel* recentProjectsLabel = new QLabel("RECENT PROJECTS: ", this); recentProjectsLabel->setGeometry(300, 129, 300, 50); - recentProjectsLabel->setStyleSheet( - "QLabel {" - "font-size: 16pt; " - "color: white; " - "}" - ); - - std::vector extensions; - extensions.push_back(".xml"); - std::vector recentProjects = FileSystem::getFileNamesFromDirectory("data/projects", extensions); + recentProjectsLabel->setObjectName("recentLabel"); int position = 200; - QIcon cpp_icon("data/gui/startscreen/cpluspluss_icon.png"); + QIcon cpp_icon("data/gui/startscreen/Icon_CPP.png"); for (std::string project : recentProjects) { - QtRecentProjectButton* button = new QtRecentProjectButton(project.c_str(), this); - button->setAttribute(Qt::WA_LayoutUsesWidgetRect); // fixes layouting on Mac - button->setIcon(cpp_icon); - button->setIconSize(QSize(25, 25)); - button->setStyleSheet( - "QPushButton{" - "font-size: 12pt; " - // "text-align: left; " // when using this the QPixmap is drawn without regard of the screens DPI - "color: white; " - "background: none; " - "border: none; " - "} " - "QPushButton:hover{" - "background: rgba(255, 255, 255, 0.15); " - "border-radius: 10px; " - "}" - ); - button->minimumSizeHint(); // force font loading - button->setGeometry(292, position, button->fontMetrics().width(button->text()) + 45, 40); - connect(button, SIGNAL(clicked()), button, SLOT(handleButtonClick())); - position += 40; + if(FileSystem::exists(project.c_str())) + { + QtRecentProjectButton* button = new QtRecentProjectButton(project.c_str(), this); + button->setAttribute(Qt::WA_LayoutUsesWidgetRect); // fixes layouting on Mac + button->setIcon(cpp_icon); + button->setIconSize(QSize(25, 25)); + button->setObjectName("recentButton"); + button->minimumSizeHint(); // force font loading + button->setGeometry(292, position, button->fontMetrics().width(button->text()) + 45, 40); + connect(button, SIGNAL(clicked()), button, SLOT(handleButtonClick())); + position += 40; + } } - this->raise(); + resize(600,500); } QSize QtStartScreen::sizeHint() const diff --git a/src/app/qt/element/QtStartScreen.h b/src/app/qt/element/QtStartScreen.h index c3422405..3a2e1d8e 100644 --- a/src/app/qt/element/QtStartScreen.h +++ b/src/app/qt/element/QtStartScreen.h @@ -1,9 +1,8 @@ #ifndef STARTSCREEN_H #define STARTSCREEN_H -#include -#include #include +#include "QtSettingsWindow.h" class QtRecentProjectButton : public QPushButton { @@ -16,13 +15,14 @@ private: std::string m_projectFile; }; -class QtStartScreen : public QWidget +class QtStartScreen : public QtSettingsWindow { Q_OBJECT public: QtStartScreen(QWidget* parent = 0); QSize sizeHint() const Q_DECL_OVERRIDE; + virtual void setup(); signals: void openOpenProjectDialog(); diff --git a/src/app/qt/view/QtMainView.cpp b/src/app/qt/view/QtMainView.cpp index 405cfcb2..5e557aab 100644 --- a/src/app/qt/view/QtMainView.cpp +++ b/src/app/qt/view/QtMainView.cpp @@ -8,6 +8,7 @@ QtMainView::QtMainView() { m_window = std::make_shared(); m_window->show(); + m_window->init(); } QtMainView::~QtMainView() diff --git a/src/lib/Application.cpp b/src/lib/Application.cpp index 2548da72..2f7f81d1 100644 --- a/src/lib/Application.cpp +++ b/src/lib/Application.cpp @@ -61,9 +61,18 @@ void Application::loadProject(const std::string& projectSettingsFilePath) m_componentManager->refreshViews(); m_project = Project::create(m_storageCache.get()); - m_project->loadProjectSettings(projectSettingsFilePath); m_project->parseCode(); + + std::vector recentProjects = ApplicationSettings::getInstance()->getRecentProjects(); + recentProjects.erase(std::find(recentProjects.begin(),recentProjects.end(),projectSettingsFilePath)); + recentProjects.insert(recentProjects.begin(),projectSettingsFilePath); + if(recentProjects.size() > 7) + { + recentProjects.pop_back(); + } + ApplicationSettings::getInstance()->setRecentProjects(recentProjects); + ApplicationSettings::getInstance()->save("data/ApplicationSettings.xml"); } void Application::loadSource(const std::string& sourceDirectoryPath) diff --git a/src/lib/settings/ApplicationSettings.cpp b/src/lib/settings/ApplicationSettings.cpp index bf83e48f..bf878b53 100644 --- a/src/lib/settings/ApplicationSettings.cpp +++ b/src/lib/settings/ApplicationSettings.cpp @@ -100,3 +100,12 @@ void ApplicationSettings::setCodeSnippetExpandRange(int range) ApplicationSettings::ApplicationSettings() { } + +std::vector ApplicationSettings::getRecentProjects() const { + std::vector recentProjects; + return getValues("recentProjects/projectFilePath", recentProjects); +} + +bool ApplicationSettings::setRecentProjects(const std::vector &recentProjects) { + return setValues("recentProjects/projectFilePath", recentProjects); +} diff --git a/src/lib/settings/ApplicationSettings.h b/src/lib/settings/ApplicationSettings.h index 29827381..9075e256 100644 --- a/src/lib/settings/ApplicationSettings.h +++ b/src/lib/settings/ApplicationSettings.h @@ -29,6 +29,10 @@ 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); diff --git a/src/lib/settings/ProjectSettings.cpp b/src/lib/settings/ProjectSettings.cpp index 221f4585..1d4080d4 100644 --- a/src/lib/settings/ProjectSettings.cpp +++ b/src/lib/settings/ProjectSettings.cpp @@ -78,3 +78,13 @@ std::vector ProjectSettings::getSourceExtensions() const defaultValues.push_back(".cpp"); return getValues("source/Extensions/SourceExtensions", defaultValues); } + +bool ProjectSettings::setHeaderExtensions(const std::vector &headerExtensions) +{ + return setValues("source/Extensions/HeaderExtensions", headerExtensions); +} + +bool ProjectSettings::setSourceExtensions(const std::vector &sourceExtensions) +{ + return setValues("source/Extensions/SourceExtensions", sourceExtensions); +} diff --git a/src/lib/settings/ProjectSettings.h b/src/lib/settings/ProjectSettings.h index 4d8b0bff..9b772c7c 100644 --- a/src/lib/settings/ProjectSettings.h +++ b/src/lib/settings/ProjectSettings.h @@ -31,6 +31,9 @@ public: std::vector getHeaderExtensions() const; std::vector getSourceExtensions() const; + bool setHeaderExtensions(const std::vector& headerExtensions); + bool setSourceExtensions(const std::vector& sourceExtensions); + private: ProjectSettings(); ProjectSettings(const ProjectSettings&);