Moved QuaZip and Zipper to DLib
[dashstudio.git] / src / shell / mainwindow.cpp
blob653564e028be12e00c05f5e044b598374c446025
1 /***************************************************************************
2 * Copyright (C) 2007 by David Cuadrado *
3 * krawek@gmail.com *
4 * *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
9 * *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
14 * *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, write to the *
17 * Free Software Foundation, Inc., *
18 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
19 ***************************************************************************/
21 #include "mainwindow.h"
23 // DLib
24 #include <dcore/config.h>
25 #include <dgui/application.h>
26 #include <dgui/iconloader.h>
27 #include <dgui/osd.h>
29 // YAMF
30 #include <yamf/common/yamf.h>
32 #include <yamf/model/project.h>
34 #include <yamf/gui/projectview.h>
36 #include <yamf/drawing/view.h>
37 #include <yamf/drawing/paintarea.h>
38 #include <yamf/drawing/brushmanager.h>
40 // DASH
42 #include "documentviewer.h"
43 #include "projectmanager.h"
44 #include "settingsdialog.h"
45 #include "newprojectdialog.h"
47 #include <components/timeline/timeline.h>
48 #include <components/colorpalette/colorpalette.h>
49 #include <components/library/librarywidget.h>
50 #include <components/base/manager.h>
52 #include <components/colorpalette/mixer.h>
53 #include <components/colorpalette/palettes.h>
55 // Qt
57 #include <QMessageBox>
58 #include <QMenuBar>
59 #include <QMenu>
60 #include <QWorkspace>
61 #include <QApplication>
62 #include <QFileDialog>
63 #include <QTimer>
64 #include <QSettings>
65 #include <QCloseEvent>
67 #define COMING_SOON QMessageBox::warning(this, tr("Coming soon"), tr("Not implemented yet"));
69 MainWindow::MainWindow(QWidget *parent)
70 : Ideality::StackedMainWindow(parent)
72 setWindowTitle(tr("Dash"));
74 YAMF::initialize();
76 m_actionManager = new DGui::ActionManager(this);
77 m_componentManager = new Component::Manager(this);
79 m_projectManager = new ProjectManager(this);
80 m_viewer = new DocumentViewer(m_projectManager->project(), this);
82 loadSettings();
84 setupFileActions();
85 setupEditActions();
87 setupMenu();
88 setupComponents();
90 m_projectManager->registerModule(m_viewer);
91 foreach(Component::Widget *module, m_componentManager->widgets())
93 m_projectManager->registerModule(module);
97 addWidget(m_viewer, Dash::Drawing);
98 addWidget(new QWorkspace(this), Dash::Animation);
101 QTimer::singleShot(100, this, SLOT(loadLastProject()));
105 MainWindow::~MainWindow()
107 delete m_actionManager;
111 void MainWindow::setupFileActions()
113 QAction *newProject = new QAction( DGui::IconLoader::self()->load("project.png"), tr("New project"), this);
114 newProject->setShortcut(QKeySequence::New);
115 connect(newProject, SIGNAL(triggered()), this, SLOT(newProject()));
117 newProject->setStatusTip(tr( "Opens a new project"));
118 m_actionManager->add( newProject, "newproject", "file" );
121 QAction *openFile = new QAction( DGui::IconLoader::self()->load("open.png"), tr( "Open project" ), this);
122 openFile->setShortcut(QKeySequence::Open);
124 connect(openFile, SIGNAL(triggered()), this, SLOT(openProject()));
126 m_actionManager->add( openFile, "openproject", "file" );
127 openFile->setStatusTip(tr("Loads an existent project"));
129 QAction *openFromServer = new QAction(DGui::IconLoader::self()->load("open.png"), tr("Open project from server..."), this);
131 connect(openFromServer, SIGNAL(triggered()), this, SLOT(openProjectFromServer()));
132 m_actionManager->add(openFromServer, "openprojectfromserver", "file");
134 QAction *exportToServer = new QAction(QIcon(), tr("Export project to server..."), this);
136 connect(exportToServer, SIGNAL(triggered()), this, SLOT(exportProjectToServer()));
137 m_actionManager->add(exportToServer, "exportprojecttoserver", "file");
139 QAction *save = new QAction( DGui::IconLoader::self()->load("save.png"), tr( "Save project..." ), this);
140 save->setShortcut(QKeySequence::Save);
142 connect(save, SIGNAL(triggered()), this, SLOT(saveProject()));
143 m_actionManager->add( save, "saveproject", "file" );
144 save->setStatusTip(tr("Saves the current project in the current location"));
146 QAction *saveAs = new QAction( tr( "Save project &As..." ), this);
147 connect(saveAs, SIGNAL(triggered()), this, SLOT(saveProjectAs()));
148 saveAs->setStatusTip(tr("Opens a dialog box to save the current project in any location"));
149 m_actionManager->add( saveAs, "saveprojectas", "file" );
151 QAction *close = new QAction(DGui::IconLoader::self()->load("close.png"), tr( "Cl&ose project" ), this);
152 close->setShortcut(QKeySequence::Close);
153 connect(close, SIGNAL(triggered()), this, SLOT(closeProject()));
154 close->setStatusTip(tr("Closes the active project"));
155 m_actionManager->add( close, "closeproject", "file" );
157 QAction *exportProject = new QAction( DGui::IconLoader::self()->load("export.png"), tr( "&Export..." ), this);
159 connect(exportProject, SIGNAL(triggered()), this, SLOT(exportProject()));
160 exportProject->setStatusTip(tr("Exports project to different formats"));
161 m_actionManager->add( exportProject, "export", "file" );
164 void MainWindow::setupEditActions()
166 QAction *settings = new QAction(DGui::IconLoader::self()->load("settings.png"), tr( "Settings..." ), this);
167 connect(settings, SIGNAL(triggered()), this, SLOT(configure()));
168 // settings->setStatusTip(tr(""));
169 m_actionManager->add( settings, "settings", "edit" );
172 void MainWindow::setupMenu()
175 QMenu *fileMenu = menuBar()->addMenu(tr("&File"));
178 QMenu *newMenu = fileMenu->addMenu(tr("New..."));
179 newMenu->addAction(m_actionManager->find("newproject"));
182 fileMenu->addAction(m_actionManager->find("openproject"));
183 fileMenu->addAction(m_actionManager->find("openprojectfromserver"));
184 fileMenu->addAction(m_actionManager->find("exportprojecttoserver"));
186 fileMenu->addSeparator();
188 fileMenu->addAction(m_actionManager->find("saveproject"));
189 fileMenu->addAction(m_actionManager->find("saveprojectas"));
191 fileMenu->addSeparator();
193 fileMenu->addAction(m_actionManager->find("closeproject"));
195 fileMenu->addSeparator();
197 fileMenu->addAction(m_actionManager->find("export"));
199 fileMenu->addSeparator();
201 QAction *quit = fileMenu->addAction(tr("&Quit"));
202 connect(quit, SIGNAL(triggered()), qApp, SLOT(closeAllWindows()));
206 QMenu *editMenu = menuBar()->addMenu(tr("&Edit"));
207 editMenu->addAction( m_actionManager->find("settings") );
211 QMenu *workspaceMenu = menuBar()->addMenu(tr("&Workspace"));
212 connect( workspaceMenu, SIGNAL(triggered( QAction * )), this, SLOT(changePerspective( QAction *)));
214 QActionGroup *workspaces = new QActionGroup(this);
215 workspaces->setExclusive(true);
217 QAction *drawingAction = new QAction( tr("Drawing"), workspaceMenu );
218 drawingAction->setShortcut(QKeySequence(Qt::Key_F9));
219 drawingAction->setCheckable(true);
220 drawingAction->setChecked(true);
221 drawingAction->setData(Dash::Drawing );
223 QAction *animationAction = new QAction( tr("Animation"), workspaceMenu );
224 animationAction->setShortcut(QKeySequence(Qt::Key_F10));
225 animationAction->setCheckable(true);
226 animationAction->setData(Dash::Animation);
228 workspaces->addAction(drawingAction);
229 workspaces->addAction(animationAction);
231 workspaceMenu->addActions(workspaces->actions());
235 QMenu *helpMenu = menuBar()->addMenu(tr("&Help"));
237 helpMenu->addAction(tr("Contents..."), this, SLOT(showHelp()))->setShortcut(QKeySequence::HelpContents);
238 helpMenu->addSeparator();
239 helpMenu->addAction(tr("About Dash..."), this, SLOT(aboutDash()));
240 helpMenu->addAction(tr("About Qt..."), qApp, SLOT(aboutQt()));
244 void MainWindow::setupComponents()
246 Component::TimeLine *tl = new Component::TimeLine(m_projectManager->project());
247 m_componentManager->add(tl);
249 connectToPaintArea(tl);
252 // m_viewer->view()->paintArea()->brushManager()->setPen(QPen(Qt::blue,3));
254 // Component::ColorPalette *colorPalette = new Component::ColorPalette(m_projectManager->project());
255 // m_componentManager->add(colorPalette);
257 Component::LibraryWidget *library = new Component::LibraryWidget(m_projectManager->project());
258 m_componentManager->add(library);
260 Mixer *mixer = new Mixer(m_projectManager->project());
261 addToolView(mixer, Qt::LeftDockWidgetArea, Dash::Drawing);
263 Component::Palettes *palettes = new Component::Palettes;
264 palettes->setWindowTitle(tr("Color palette") );
265 addToolView(palettes, Qt::LeftDockWidgetArea, Dash::Drawing);
267 /*********************/
268 m_projectView = new YAMF::Gui::ProjectView(m_projectManager->project());
269 addToolView(m_projectView, Qt::RightDockWidgetArea, Dash::All);
272 void MainWindow::newProject()
274 if(!closeProject()) return;
276 NewProjectDialog dialog;
278 if( dialog.exec() == QDialog::Accepted )
280 m_projectManager->createProject(dialog.projectName(), dialog.author(), dialog.description());
282 foreach(QString scene, dialog.scenes())
284 m_projectManager->createScene(scene, dialog.framesPerScene());
287 m_projectView->setProject(m_projectManager->project());
291 bool MainWindow::openProject()
293 if(!closeProject()) return false;
295 QString filePath = QFileDialog::getOpenFileName(this, QString(), QString(), tr("Dash project (*.dsh)") );
297 if( filePath.isEmpty() )
299 return false;
302 return openProject(filePath);
305 bool MainWindow::openProject(const QString &filePath)
307 if( m_projectManager->loadProject(filePath) )
309 m_currentFile = filePath;
310 m_projectView->setProject(m_projectManager->project());
312 m_viewer->view()->setCurrentFrame(0, 0, 0);
314 return true;
317 return false;
320 void MainWindow::openProjectFromServer()
322 COMING_SOON;
325 void MainWindow::exportProjectToServer()
327 COMING_SOON;
330 void MainWindow::saveProject()
332 if( m_currentFile.isEmpty() )
334 saveProjectAs();
335 return;
338 if( m_projectManager->saveProject(m_currentFile) )
340 DGui::Osd::self()->display(tr("Project %1 saved").arg(m_projectManager->project()->projectName()), DGui::Osd::Info);
342 else
344 m_currentFile = QString();
345 DGui::Osd::self()->display(tr("Cannot save the project!"), DGui::Osd::Error );
349 void MainWindow::autoSaveProject()
351 if( m_projectManager->project()->isOpen() && !m_currentFile.isEmpty() )
353 QTimer::singleShot(100, this, SLOT(saveProject()));
357 void MainWindow::saveProjectAs()
359 QString filePath = QFileDialog::getSaveFileName(this);
361 if( !filePath.isEmpty() )
363 m_currentFile = filePath;
365 if( !m_currentFile.endsWith(".dsh") )
366 m_currentFile += ".dsh";
368 QTimer::singleShot(0, this, SLOT(saveProject()));
372 bool MainWindow::closeProject()
374 if(!m_projectManager->project()->isOpen())
376 return true;
379 if ( m_projectManager->isModified() )
381 QMessageBox mb(QApplication::applicationName (), tr("Do you want to save?"),
382 QMessageBox::Information,
383 QMessageBox::Yes | QMessageBox::Default,
384 QMessageBox::No,
385 QMessageBox::Cancel | QMessageBox::Escape);
386 mb.setButtonText(QMessageBox::Yes, tr("Save"));
387 mb.setButtonText(QMessageBox::No, tr("Discard"));
389 switch(mb.exec())
391 case QMessageBox::Yes:
393 saveProject();
395 break;
396 case QMessageBox::No:
399 break;
400 case QMessageBox::Cancel:
402 return false;
404 break;
408 setUpdatesEnabled(false);
410 m_projectManager->closeProject();
411 m_projectView->reload();
412 m_currentFile = QString();
414 setUpdatesEnabled(true);
416 return true;
419 void MainWindow::exportProject()
421 COMING_SOON;
424 void MainWindow::loadLastProject()
426 DCore::Config *config = dApp->config("General");
427 QString lastProject = config->value("last_project", QString()).toString();
428 config->endGroup();
430 if( !lastProject.isEmpty() )
432 openProject(lastProject);
436 // EDIT
438 void MainWindow::configure()
440 SettingsDialog settings;
441 if( settings.exec() != QDialog::Rejected )
443 loadSettings();
447 // HELP
449 void MainWindow::showHelp()
451 COMING_SOON;
454 void MainWindow::aboutDash()
456 QMessageBox::about(this, tr("About Dash..."), tr("Dash is a tool to build up animations and ...") );
461 void MainWindow::changePerspective( QAction *action )
463 bool ok = false;
465 int id = action->data().toInt(&ok);
467 if(ok)
469 setCurrentPerspective(id);
473 void MainWindow::connectToPaintArea(QObject *object)
475 if( object->metaObject()->indexOfSignal("frameSelected(int,int,int)") > -1 )
477 connect(object, SIGNAL(frameSelected(int, int, int)), m_viewer->view(), SLOT(setCurrentFrame(int, int, int)));
481 void MainWindow::saveSettings()
483 DCore::Config *config = dApp->config("General");
484 config->setValue("last_project", m_currentFile);
485 config->endGroup();
488 void MainWindow::loadSettings()
490 // Section General
491 DCore::Config *config = dApp->config("General");
493 m_saver.setInterval(config->value("save_project_interval", 15).toInt() * 60 * 1000);
495 if(config->value("auto_save_project", true).toBool() )
497 m_saver.start();
499 else
501 m_saver.stop();
504 config->endGroup();
508 void MainWindow::closeEvent(QCloseEvent *event)
510 saveSettings();
512 if (! closeProject() )
514 event->ignore();
515 return;
518 Ideality::StackedMainWindow::closeEvent(event);