diff --git a/Makefile b/Makefile index 6728a89d2..17c553f3c 100644 --- a/Makefile +++ b/Makefile @@ -68,9 +68,10 @@ SOURCES = \ equipment.c \ file.c \ info.c \ - main.c \ + main.cpp \ parse-xml.c \ planner.c \ + subsurfacestartup.c \ profile.c \ save-xml.c \ sha1.c \ diff --git a/dive.h b/dive.h index 2c69cbff8..64da53c87 100644 --- a/dive.h +++ b/dive.h @@ -628,12 +628,6 @@ extern void add_event(struct divecomputer *dc, int time, int type, int flags, in /* UI related protopypes */ -extern void init_ui(int *argcp, char ***argvp); -extern void init_qt_ui(int *argcp, char ***argvp, char *errormessage); - -extern void run_ui(void); -extern void exit_ui(void); - extern void report_error(GError* error); extern void add_cylinder_description(cylinder_type_t *); diff --git a/main.cpp b/main.cpp new file mode 100644 index 000000000..68e8c3708 --- /dev/null +++ b/main.cpp @@ -0,0 +1,63 @@ +/* main.c */ +#include +#include +#include +#include +#include +#include + +#include "qt-gui.h" +#include "version.h" +#include "subsurfacestartup.h" +#include "qt-ui/mainwindow.h" + +#include + +int main(int argc, char **argv) +{ + int i; + bool no_filenames = TRUE; + const char *path; + char *error_message = NULL; + + /* set up l18n - the search directory needs to change + * so that it uses the correct system directory when + * subsurface isn't run from the local directory */ + path = subsurface_gettext_domainpath(argv[0]); + setlocale(LC_ALL, ""); + bindtextdomain("subsurface", path); + bind_textdomain_codeset("subsurface", "utf-8"); + textdomain("subsurface"); + + setup_system_prefs(); + prefs = default_prefs; + + subsurface_command_line_init(&argc, &argv); + init_ui(&argc, &argv); + parse_xml_init(); + + QStringList files; + QStringList importedFiles; + for (i = 1; i < argc; i++) { + const char *a = argv[i]; + if (a[0] == '-') { + parse_argument(a); + continue; + } + if (imported) + importedFiles.push_back( QString(a) ); + else + files.push_back( QString(a) ); + } + if (no_filenames) { + files.push_back( QString(prefs.default_filename) ); + } + process_dives(imported, FALSE); + parse_xml_exit(); + subsurface_command_line_exit(&argc, &argv); + mainWindow()->loadFiles(files); + mainWindow()->importFiles(importedFiles); + run_ui(); + exit_ui(); + return 0; +} diff --git a/qt-gui.cpp b/qt-gui.cpp index eb199f0ab..7414ad426 100644 --- a/qt-gui.cpp +++ b/qt-gui.cpp @@ -70,18 +70,6 @@ static QApplication *application = NULL; int error_count; const char *existing_filename; -void init_qt_ui(int *argcp, char ***argvp, char *errormessage) -{ - application->installTranslator(new Translator(application)); - MainWindow *window = new MainWindow(); - window->showError(errormessage); - window->show(); - if (existing_filename && existing_filename[0] != '\0') - window->setTitle(MWTF_FILENAME); - else - window->setTitle(MWTF_DEFAULT); -} - const char *getSetting(QSettings &s, QString name) { QVariant v; @@ -127,6 +115,15 @@ void init_ui(int *argcp, char ***argvp) default_dive_computer_product = getSetting(s,"dive_computer_product"); default_dive_computer_device = getSetting(s, "dive_computer_device"); s.endGroup(); + + application->installTranslator(new Translator(application)); + MainWindow *window = new MainWindow(); + window->show(); + if (existing_filename && existing_filename[0] != '\0') + window->setTitle(MWTF_FILENAME); + else + window->setTitle(MWTF_DEFAULT); + return; } diff --git a/qt-gui.h b/qt-gui.h new file mode 100644 index 000000000..43a006a4c --- /dev/null +++ b/qt-gui.h @@ -0,0 +1,10 @@ +#ifndef QT_GUI_H +#define QT_GUI_H + +void init_ui(int *argcp, char ***argvp); +void init_qt_ui(int *argcp, char ***argvp, char *errormessage); + +void run_ui(void); +void exit_ui(void); + +#endif diff --git a/qt-ui/mainwindow.cpp b/qt-ui/mainwindow.cpp index 245f4b347..4eead9616 100644 --- a/qt-ui/mainwindow.cpp +++ b/qt-ui/mainwindow.cpp @@ -117,22 +117,7 @@ void MainWindow::on_actionOpen_triggered() QByteArray fileNamePtr = filename.toLocal8Bit(); on_actionClose_triggered(); - - char *error = NULL; - parse_file(fileNamePtr.data(), &error); - set_filename(fileNamePtr.data(), TRUE); - setTitle(MWTF_FILENAME); - - if (error != NULL) { - showError(error); - free(error); - } - process_dives(FALSE, FALSE); - - ui->InfoWidget->reload(); - ui->globe->reload(); - ui->ListWidget->reload(DiveTripModel::TREE); - ui->ListWidget->setFocus(); + loadFiles( QStringList() << filename ); } void MainWindow::on_actionSave_triggered() @@ -193,23 +178,7 @@ void MainWindow::on_actionImport_triggered() settings.setValue("LastDir", fileInfo.dir().path()); settings.endGroup(); - QByteArray fileNamePtr; - char *error = NULL; - for (int i = 0; i < fileNames.size(); ++i) { - fileNamePtr = fileNames.at(i).toLocal8Bit(); - parse_file(fileNamePtr.data(), &error); - if (error != NULL) { - showError(error); - free(error); - error = NULL; - } - } - process_dives(FALSE, FALSE); - - ui->InfoWidget->reload(); - ui->globe->reload(); - ui->ListWidget->reload(DiveTripModel::TREE); - ui->ListWidget->setFocus(); + importFiles(fileNames); } void MainWindow::on_actionExportUDDF_triggered() @@ -755,3 +724,49 @@ void MainWindow::setTitle(enum MainWindowTitleFormat format) break; } } + +void MainWindow::importFiles(const QStringList fileNames) +{ + QByteArray fileNamePtr; + char *error = NULL; + for (int i = 0; i < fileNames.size(); ++i) { + fileNamePtr = fileNames.at(i).toLocal8Bit(); + parse_file(fileNamePtr.data(), &error); + if (error != NULL) { + showError(error); + free(error); + error = NULL; + } + } + process_dives(TRUE, FALSE); + + ui->InfoWidget->reload(); + ui->globe->reload(); + ui->ListWidget->reload(DiveTripModel::TREE); + ui->ListWidget->setFocus(); +} + +void MainWindow::loadFiles(const QStringList fileNames) +{ + char *error = NULL; + QByteArray fileNamePtr; + + for (int i = 0; i < fileNames.size(); ++i) { + fileNamePtr = fileNames.at(i).toLocal8Bit(); + parse_file(fileNamePtr.data(), &error); + set_filename(fileNamePtr.data(), TRUE); + setTitle(MWTF_FILENAME); + + if (error != NULL) { + showError(error); + free(error); + } + } + + process_dives(FALSE, FALSE); + + ui->InfoWidget->reload(); + ui->globe->reload(); + ui->ListWidget->reload(DiveTripModel::TREE); + ui->ListWidget->setFocus(); +} diff --git a/qt-ui/mainwindow.h b/qt-ui/mainwindow.h index 0b0b0055d..6cc99db96 100644 --- a/qt-ui/mainwindow.h +++ b/qt-ui/mainwindow.h @@ -51,6 +51,8 @@ public: // when the profile's visible. void disableDcShortcuts(); void enableDcShortcuts(); + void loadFiles(const QStringList files); + void importFiles(const QStringList importFiles); private slots: /* file menu action */ diff --git a/main.c b/subsurfacestartup.c similarity index 67% rename from main.c rename to subsurfacestartup.c index ca64b5518..bf093ed9c 100644 --- a/main.c +++ b/subsurfacestartup.c @@ -1,17 +1,7 @@ -/* main.c */ -#include -#include -#include -#include -#include -#include +#include "subsurfacestartup.h" +#include #include -#include "dive.h" -#include "divelist.h" -#include "libdivecomputer.h" -#include "version.h" - struct preferences prefs; struct preferences default_prefs = { .units = SI_UNITS, @@ -49,8 +39,8 @@ struct units *get_units() /* random helper functions, used here or elsewhere */ static int sortfn(const void *_a, const void *_b) { - const struct dive *a = *(void **)_a; - const struct dive *b = *(void **)_b; + const struct dive *a = (const struct dive*) *(void **)_a; + const struct dive *b = (const struct dive*) *(void **)_b; if (a->when < b->when) return -1; @@ -86,7 +76,7 @@ const char *monthname(int mon) /* * track whether we switched to importing dives */ -static gboolean imported = FALSE; +bool imported = FALSE; static void print_version() { printf("Subsurface v%s, ", VERSION_STRING); @@ -103,7 +93,7 @@ static void print_help() { printf("\n --version Prints current version\n\n"); } -static void parse_argument(const char *arg) +void parse_argument(const char *arg) { const char *p = arg+1; @@ -122,10 +112,7 @@ static void parse_argument(const char *arg) exit(0); } if (strcmp(arg, "--import") == 0) { - /* mark the dives so far as the base, - * everything after is imported */ - process_dives(FALSE, FALSE); - imported = TRUE; + imported = TRUE; /* mark the dives so far as the base, * everything after is imported */ return; } if (strcmp(arg, "--verbose") == 0) { @@ -171,7 +158,7 @@ void renumber_dives(int nr) * I guess Burma and Liberia should trigger this too. I'm too * lazy to look up the territory names, though. */ -static void setup_system_prefs(void) +void setup_system_prefs(void) { const char *env; @@ -194,59 +181,3 @@ static void setup_system_prefs(void) default_prefs.units = IMPERIAL_units; } - -int main(int argc, char **argv) -{ - int i; - gboolean no_filenames = TRUE; - const char *path; - char *error_message = NULL; - - /* set up l18n - the search directory needs to change - * so that it uses the correct system directory when - * subsurface isn't run from the local directory */ - path = subsurface_gettext_domainpath(argv[0]); - setlocale(LC_ALL, ""); - bindtextdomain("subsurface", path); - bind_textdomain_codeset("subsurface", "utf-8"); - textdomain("subsurface"); - - setup_system_prefs(); - prefs = default_prefs; - - subsurface_command_line_init(&argc, &argv); - parse_xml_init(); - - init_ui(&argc, &argv); - - for (i = 1; i < argc; i++) { - const char *a = argv[i]; - if (a[0] == '-') { - parse_argument(a); - continue; - } - set_filename(NULL, TRUE); - - parse_file(a, &error_message); - if (no_filenames) - { - set_filename(a, TRUE); - no_filenames = FALSE; - } - } - if (no_filenames) { - const char *filename = prefs.default_filename; - parse_file(filename, NULL); - /* don't report errors - this file may not exist, but make - sure we remember this as the filename in use */ - set_filename(filename, FALSE); - } - process_dives(imported, FALSE); - parse_xml_exit(); - subsurface_command_line_exit(&argc, &argv); - - init_qt_ui(&argc, &argv, error_message); /* qt bit delayed until dives are parsed */ - run_ui(); - exit_ui(); - return 0; -} diff --git a/subsurfacestartup.h b/subsurfacestartup.h new file mode 100644 index 000000000..8a2420345 --- /dev/null +++ b/subsurfacestartup.h @@ -0,0 +1,25 @@ +#ifndef SUBSURFACESTARTUP_H +#define SUBSURFACESTARTUP_H + +#include "dive.h" +#include "divelist.h" +#include "libdivecomputer.h" +#include "version.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern struct preferences prefs; +extern struct preferences default_prefs; +extern bool imported; + +void setup_system_prefs(void); +void parse_argument(const char *arg); + +#ifdef __cplusplus +} +#endif + +#endif