diff --git a/CMakeLists.txt b/CMakeLists.txt index 1d9f3d6c..84ca6af5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,7 +3,7 @@ cmake_minimum_required(VERSION 2.8.2) PROJECT( FindObject ) SET(PROJECT_PREFIX find_object) -ADD_DEFINITIONS(-DPROJECT_NAME="${PROJECT_NAME}") +ADD_DEFINITIONS(-DPROJECT_PREFIX="${PROJECT_PREFIX}") ####################### # VERSION @@ -37,6 +37,24 @@ SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/lib) FIND_PACKAGE(OpenCV REQUIRED) # tested on 2.3.1 FIND_PACKAGE(Qt4 COMPONENTS QtCore QtGui) # tested on Qt4.7 +####### OSX BUNDLE CMAKE_INSTALL_PREFIX ####### +OPTION(BUILD_AS_BUNDLE "Set to ON to build as bundle (DragNDrop)" OFF) +IF(APPLE AND BUILD_AS_BUNDLE) + #Force to Off, easiest to package into the bundle + SET( BUILD_SHARED_LIBS OFF ) + + # Required when packaging, and set CMAKE_INSTALL_PREFIX to "/". + SET(CPACK_SET_DESTDIR TRUE) + + SET(CMAKE_BUNDLE_NAME + "${PROJECT_NAME}") + SET(CMAKE_BUNDLE_LOCATION "/") + + # make sure CMAKE_INSTALL_PREFIX ends in / + SET(CMAKE_INSTALL_PREFIX + "/${CMAKE_BUNDLE_NAME}.app/Contents") +ENDIF(APPLE AND BUILD_AS_BUNDLE) + ####### SOURCES (Projects) ####### ADD_SUBDIRECTORY( src ) @@ -81,12 +99,31 @@ IF(WIN32) #SET(CPACK_NSIS_INSTALLED_ICON_NAME bin\\\\${PROJECT_NAME}.exe) SET(CPACK_PACKAGE_EXECUTABLES "${PROJECT_NAME}" "${PROJECT_NAME}" ${CPACK_PACKAGE_EXECUTABLES}) SET(CPACK_CREATE_DESKTOP_LINKS "${PROJECT_NAME}" ${CPACK_CREATE_DESKTOP_LINKS}) -ENDIF(WIN32) +ELSEIF(APPLE) + IF(BUILD_AS_BUNDLE) + # On APPLE and if BUILD_AS_BUNDLE=ON, the project is created as a bundle + # over the main app (see ./src).Here we package only this bundle. Note + # that we set CMAKE_INSTALL_PREFIX to "/" when packaging to DragNDrop... + SET(CPACK_GENERATOR "DragNDrop") + ELSE() + SET(CPACK_GENERATOR "PackageMaker;TBZ2") + ENDIF() + + SET(CPACK_SOURCE_GENERATOR "TBZ2") + + #SET(CPACK_PACKAGE_ICON "${PROJECT_SOURCE_DIR}/app/src/${PROJECT_NAME}.icns") +ENDIF() INCLUDE(CPack) +####################### +# OUTPUT INFO +####################### MESSAGE(STATUS "--------------------------------------------") MESSAGE(STATUS "Info :") MESSAGE(STATUS " CMAKE_INSTALL_PREFIX = ${CMAKE_INSTALL_PREFIX}") MESSAGE(STATUS " CMAKE_BUILD_TYPE = ${CMAKE_BUILD_TYPE}") +IF(APPLE) +MESSAGE(STATUS " BUILD_AS_BUNDLE = ${BUILD_AS_BUNDLE}") +ENDIF(APPLE) MESSAGE(STATUS "--------------------------------------------") \ No newline at end of file diff --git a/README b/README index 8a321199..cc0b4cc9 100644 --- a/README +++ b/README @@ -1,13 +1,38 @@ ++--------------------------------------------------- ++ Build from source ++--------------------------------------------------- Requirements : -Cmake (tested on 2.8.2) -Qt4 (tested on 4.7) -OpenCV (tested on 2.3.1) +-MinGW (only on Windows) -Build from source: +Ubuntu / Mac OS X $ cd find_object/build $ cmake .. $ make $ cd ../bin $ ./find_object - (enjoy!) \ No newline at end of file + +Windows + $ cd find_object/build + $ cmake -G"MinGW Makefiles" .. + $ make + $ cd ../bin + $ find_object + ++--------------------------------------------------- ++ Packaging ++--------------------------------------------------- +MacOSX (DragNDrop) : + > cd build + > cmake -DBUILD_AS_BUNDLE=ON .. + > make -j4 + > make package + +Windows : + > cd build + > cmake -G"MinGW Makefiles" .. + > make -j4 + > make package \ No newline at end of file diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 69f41995..66e40dc4 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -29,8 +29,6 @@ QT4_WRAP_CPP(moc_srcs ${headers_ui}) ### Qt Gui stuff end### - - SET(SRC_FILES ./MainWindow.cpp ./AddObjectDialog.cpp @@ -63,15 +61,24 @@ SET(LIBRARIES INCLUDE_DIRECTORIES(${INCLUDE_DIRS}) # create an executable file -ADD_EXECUTABLE(find_object WIN32 ${SRC_FILES}) +IF(APPLE AND BUILD_AS_BUNDLE) + ADD_EXECUTABLE(find_object MACOSX_BUNDLE ${SRC_FILES}) +ELSE() + ADD_EXECUTABLE(find_object WIN32 ${SRC_FILES}) +ENDIF() # Linking with Qt libraries TARGET_LINK_LIBRARIES(find_object ${LIBRARIES}) -IF(WIN32) +IF(APPLE AND BUILD_AS_BUNDLE) + SET_TARGET_PROPERTIES(find_object PROPERTIES + OUTPUT_NAME ${CMAKE_BUNDLE_NAME}) +ELSEIF(WIN32) SET_TARGET_PROPERTIES(find_object PROPERTIES OUTPUT_NAME ${PROJECT_NAME}) -ENDIF(WIN32) - +ELSE() + SET_TARGET_PROPERTIES(find_object PROPERTIES + OUTPUT_NAME ${PROJECT_PREFIX}) +ENDIF() #--------------------------- # Installation stuff @@ -79,12 +86,25 @@ ENDIF(WIN32) INSTALL(TARGETS find_object RUNTIME DESTINATION bin COMPONENT runtime BUNDLE DESTINATION "${CMAKE_BUNDLE_LOCATION}" COMPONENT runtime) - + +#--------------------------- +# Dependencies packaging +#--------------------------- +IF(APPLE AND BUILD_AS_BUNDLE) + INSTALL(CODE "execute_process(COMMAND ln -s \"../MacOS/${CMAKE_BUNDLE_NAME}\" ${PROJECT_NAME} + WORKING_DIRECTORY \$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/bin)") +ENDIF(APPLE AND BUILD_AS_BUNDLE) + SET(APPS "\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/bin/${PROJECT_NAME}${CMAKE_EXECUTABLE_SUFFIX}") -IF(WIN32) +IF((APPLE AND BUILD_AS_BUNDLE) OR WIN32) SET(plugin_dest_dir bin) SET(qtconf_dest_dir bin) - + IF(APPLE) + SET(plugin_dest_dir MacOS) + SET(qtconf_dest_dir Resources) + SET(APPS "\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/MacOS/${CMAKE_BUNDLE_NAME}") + ENDIF(APPLE) + # Install needed Qt plugins by copying directories from the qt installation # One can cull what gets copied by using 'REGEX "..." EXCLUDE' # Exclude debug libraries @@ -97,6 +117,9 @@ IF(WIN32) # install a qt.conf file # this inserts some cmake code into the install script to write the file SET(QT_CONF_FILE [Paths]\nPlugins=plugins) + IF(APPLE) + SET(QT_CONF_FILE [Paths]\nPlugins=MacOS/plugins) + ENDIF(APPLE) INSTALL(CODE " file(WRITE \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${qtconf_dest_dir}/qt.conf\" \"${QT_CONF_FILE}\") " COMPONENT runtime) @@ -115,5 +138,5 @@ IF(WIN32) include(\"BundleUtilities\") fixup_bundle(\"${APPS}\" \"\${QTPLUGINS}\" \"${DIRS}\") " COMPONENT runtime) -ENDIF(WIN32) +ENDIF((APPLE AND BUILD_AS_BUNDLE) OR WIN32) diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index e5334ff2..2d73fd11 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -32,7 +32,12 @@ MainWindow::MainWindow(QWidget * parent) : connect(&cameraTimer_, SIGNAL(timeout()), this, SLOT(update())); QByteArray geometry; +#ifdef WIN32 + //TODO Maybe use the Documents and Settings Settings::loadSettings(Settings::iniDefaultFileName, &geometry); +#else + Settings::loadSettings(QString("%1/.%2/%3").arg(QDir::homePath()).arg(PROJECT_PREFIX).arg(Settings::iniDefaultFileName), &geometry); +#endif this->restoreGeometry(geometry); ui_->toolBox->setupUi(); @@ -73,13 +78,18 @@ MainWindow::~MainWindow() void MainWindow::closeEvent(QCloseEvent * event) { +#ifdef WIN32 + //TODO Maybe use the Documents and Settings Settings::saveSettings(Settings::iniDefaultFileName, this->saveGeometry()); +#else + Settings::saveSettings(QString("%1/.%2/%3").arg(QDir::homePath()).arg(PROJECT_PREFIX).arg(Settings::iniDefaultFileName), this->saveGeometry()); +#endif QMainWindow::closeEvent(event); } void MainWindow::loadObjects() { - QString fileName = QFileDialog::getOpenFileName(this, tr("Load objects..."), "", "*.obj"); + QString fileName = QFileDialog::getOpenFileName(this, tr("Load objects..."), QDir::homePath(), "*.obj"); if(!fileName.isEmpty()) { QFile file(fileName); @@ -113,7 +123,7 @@ void MainWindow::loadObjects() } void MainWindow::saveObjects() { - QString fileName = QFileDialog::getSaveFileName(this, tr("Save objects..."), Settings::currentDetectorType()+Settings::currentDescriptorType()+QString("%1.obj").arg(objects_.size()), "*.obj"); + QString fileName = QFileDialog::getSaveFileName(this, tr("Save objects..."), (QDir::homePath() + "/") +Settings::currentDetectorType()+Settings::currentDescriptorType()+QString("%1.obj").arg(objects_.size()), "*.obj"); if(!fileName.isEmpty()) { if(!fileName.endsWith(".obj")) diff --git a/src/Object.cpp b/src/Object.cpp index 4e5688a2..563b93ff 100644 --- a/src/Object.cpp +++ b/src/Object.cpp @@ -381,10 +381,17 @@ void Object::contextMenuEvent(QContextMenuEvent * event) if(action == _saveImage) { QString text; + if(_savedFileName.isEmpty()) + { +#ifndef WIN32 + _savedFileName = QDir::homePath(); +#endif + _savedFileName+="/figure.png"; + } text = QFileDialog::getSaveFileName(this, tr("Save figure to ..."), _savedFileName, "*.png *.xpm *.jpg *.pdf"); if(!text.isEmpty()) { - if(!text.endsWith(".png") && !text.endsWith(".png") && !text.endsWith(".png") && !text.endsWith(".png")) + if(!text.endsWith(".png") && !text.endsWith(".xpm") && !text.endsWith(".jpg") && !text.endsWith(".pdf")) { text.append(".png");//default } diff --git a/src/Settings.cpp b/src/Settings.cpp index 0acc2bdf..aa015b8e 100644 --- a/src/Settings.cpp +++ b/src/Settings.cpp @@ -16,7 +16,7 @@ ParametersMap Settings::defaultParameters_; ParametersMap Settings::parameters_; ParametersType Settings::parametersType_; Settings Settings::dummyInit_; -const char * Settings::iniDefaultFileName = "./" PROJECT_NAME ".ini"; +const char * Settings::iniDefaultFileName = "config.ini"; void Settings::loadSettings(const QString & fileName, QByteArray * windowGeometry) { diff --git a/src/Settings.h b/src/Settings.h index a33587cb..27b2bc31 100644 --- a/src/Settings.h +++ b/src/Settings.h @@ -116,7 +116,7 @@ class Settings public: virtual ~Settings(){} - static const char * iniDefaultFileName; // "./" PROJECT_NAME ".ini" + static const char * iniDefaultFileName; // "config.ini" static void loadSettings(const QString & fileName = iniDefaultFileName, QByteArray * windowGeometry = 0); static void saveSettings(const QString & fileName = iniDefaultFileName, const QByteArray & windowGeometry = QByteArray());