diff options
| author | Robert Bieber <robby@bieberphoto.com> | 2010-06-17 05:37:01 +0000 |
|---|---|---|
| committer | Robert Bieber <robby@bieberphoto.com> | 2010-06-17 05:37:01 +0000 |
| commit | ca564287ee3f48945d45c7d92be7a83452f53745 (patch) | |
| tree | d6e502bb604f925240a742b3bac2c813a98c447b /utils/themeeditor/gui/editorwindow.cpp | |
| parent | ba07b2055c7eb8f2add96f55cb52b40b9ccb3d63 (diff) | |
| download | rockbox-ca564287ee3f48945d45c7d92be7a83452f53745.zip rockbox-ca564287ee3f48945d45c7d92be7a83452f53745.tar.gz rockbox-ca564287ee3f48945d45c7d92be7a83452f53745.tar.bz2 rockbox-ca564287ee3f48945d45c7d92be7a83452f53745.tar.xz | |
Theme Editor: Moved source files into subdirectories
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@26876 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'utils/themeeditor/gui/editorwindow.cpp')
| -rw-r--r-- | utils/themeeditor/gui/editorwindow.cpp | 468 |
1 files changed, 468 insertions, 0 deletions
diff --git a/utils/themeeditor/gui/editorwindow.cpp b/utils/themeeditor/gui/editorwindow.cpp new file mode 100644 index 0000000..675520d --- /dev/null +++ b/utils/themeeditor/gui/editorwindow.cpp @@ -0,0 +1,468 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2010 Robert Bieber + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + +#include "editorwindow.h" +#include "projectmodel.h" +#include "ui_editorwindow.h" + +#include <QDesktopWidget> +#include <QFileSystemModel> +#include <QSettings> +#include <QFileDialog> +#include <QGraphicsScene> + +EditorWindow::EditorWindow(QWidget *parent) : + QMainWindow(parent), + ui(new Ui::EditorWindow) +{ + ui->setupUi(this); + prefs = new PreferencesDialog(this); + project = 0; + loadSettings(); + setupUI(); + setupMenus(); +} + +void EditorWindow::loadTabFromSkinFile(QString fileName) +{ + /* Checking to see if the file is already open */ + for(int i = 0; i < ui->editorTabs->count(); i++) + { + TabContent* current = dynamic_cast<TabContent*> + (ui->editorTabs->widget(i)); + if(current->file() == fileName) + { + ui->editorTabs->setCurrentIndex(i); + return; + } + } + + /* Adding a new document*/ + SkinDocument* doc = new SkinDocument(parseStatus, fileName); + addTab(doc); + ui->editorTabs->setCurrentWidget(doc); + +} + +void EditorWindow::loadConfigTab(ConfigDocument* doc) +{ + for(int i = 0; i < ui->editorTabs->count(); i++) + { + TabContent* current = dynamic_cast<TabContent*> + (ui->editorTabs->widget(i)); + if(current->file() == doc->file()) + { + ui->editorTabs->setCurrentIndex(i); + doc->deleteLater(); + return; + } + } + + addTab(doc); + ui->editorTabs->setCurrentWidget(doc); + + QObject::connect(doc, SIGNAL(titleChanged(QString)), + this, SLOT(tabTitleChanged(QString))); +} + +void EditorWindow::loadSettings() +{ + + QSettings settings; + + /* Main Window location */ + settings.beginGroup("EditorWindow"); + QSize size = settings.value("size").toSize(); + QPoint pos = settings.value("position").toPoint(); + QByteArray state = settings.value("state").toByteArray(); + settings.endGroup(); + + if(!(size.isNull() || pos.isNull() || state.isNull())) + { + resize(size); + move(pos); + restoreState(state); + } + +} + +void EditorWindow::saveSettings() +{ + + QSettings settings; + + /* Saving window and panel positions */ + settings.beginGroup("EditorWindow"); + settings.setValue("position", pos()); + settings.setValue("size", size()); + settings.setValue("state", saveState()); + settings.endGroup(); +} + +void EditorWindow::setupUI() +{ + /* Connecting the tab bar signals */ + QObject::connect(ui->editorTabs, SIGNAL(currentChanged(int)), + this, SLOT(shiftTab(int))); + QObject::connect(ui->editorTabs, SIGNAL(tabCloseRequested(int)), + this, SLOT(closeTab(int))); + + /* Connecting the code gen button */ + QObject::connect(ui->fromTree, SIGNAL(pressed()), + this, SLOT(updateCurrent())); + + /* Connecting the preferences dialog */ + QObject::connect(ui->actionPreferences, SIGNAL(triggered()), + prefs, SLOT(exec())); + + /* Setting up the parse status label */ + parseStatus = new QLabel(this); + ui->statusbar->addPermanentWidget(parseStatus); + + /* Setting the selection for parse tree highlighting initially NULL */ + parseTreeSelection = 0; + + /* Adding the skin viewer */ + viewer = new SkinViewer(this); + ui->skinPreviewLayout->addWidget(viewer); + + //TODO: Remove this test code + QGraphicsScene* test = new QGraphicsScene(); + test->addRect(0,0,50,50); + + viewer->setScene(test); +} + +void EditorWindow::setupMenus() +{ + /* Connecting panel show actions */ + QObject::connect(ui->actionFile_Panel, SIGNAL(triggered()), + this, SLOT(showPanel())); + QObject::connect(ui->actionDisplay_Panel, SIGNAL(triggered()), + this, SLOT(showPanel())); + QObject::connect(ui->actionPreview_Panel, SIGNAL(triggered()), + this, SLOT(showPanel())); + + /* Connecting the document management actions */ + QObject::connect(ui->actionNew_Document, SIGNAL(triggered()), + this, SLOT(newTab())); + QObject::connect(ui->actionToolbarNew, SIGNAL(triggered()), + this, SLOT(newTab())); + + QObject::connect(ui->actionClose_Document, SIGNAL(triggered()), + this, SLOT(closeCurrent())); + + QObject::connect(ui->actionSave_Document, SIGNAL(triggered()), + this, SLOT(saveCurrent())); + QObject::connect(ui->actionSave_Document_As, SIGNAL(triggered()), + this, SLOT(saveCurrentAs())); + QObject::connect(ui->actionToolbarSave, SIGNAL(triggered()), + this, SLOT(saveCurrent())); + + QObject::connect(ui->actionOpen_Document, SIGNAL(triggered()), + this, SLOT(openFile())); + QObject::connect(ui->actionToolbarOpen, SIGNAL(triggered()), + this, SLOT(openFile())); + + QObject::connect(ui->actionOpen_Project, SIGNAL(triggered()), + this, SLOT(openProject())); +} + +void EditorWindow::addTab(TabContent *doc) +{ + ui->editorTabs->addTab(doc, doc->title()); + + /* Connecting to title change events */ + QObject::connect(doc, SIGNAL(titleChanged(QString)), + this, SLOT(tabTitleChanged(QString))); + QObject::connect(doc, SIGNAL(lineChanged(int)), + this, SLOT(lineChanged(int))); + + /* Connecting to settings change events */ + if(doc->type() == TabContent::Skin) + dynamic_cast<SkinDocument*>(doc)->connectPrefs(prefs); +} + + +void EditorWindow::newTab() +{ + SkinDocument* doc = new SkinDocument(parseStatus); + addTab(doc); + ui->editorTabs->setCurrentWidget(doc); +} + +void EditorWindow::shiftTab(int index) +{ + TabContent* widget = dynamic_cast<TabContent*> + (ui->editorTabs->currentWidget()); + if(index < 0) + { + ui->parseTree->setModel(0); + ui->actionSave_Document->setEnabled(false); + ui->actionSave_Document_As->setEnabled(false); + ui->actionClose_Document->setEnabled(false); + ui->actionToolbarSave->setEnabled(false); + ui->fromTree->setEnabled(false); + } + else if(widget->type() == TabContent::Config) + { + ui->actionSave_Document->setEnabled(true); + ui->actionSave_Document_As->setEnabled(true); + ui->actionClose_Document->setEnabled(true); + ui->actionToolbarSave->setEnabled(true); + } + else + { + /* Syncing the tree view and the status bar */ + SkinDocument* doc = dynamic_cast<SkinDocument*>(widget); + ui->parseTree->setModel(doc->getModel()); + parseStatus->setText(doc->getStatus()); + + ui->actionSave_Document->setEnabled(true); + ui->actionSave_Document_As->setEnabled(true); + ui->actionClose_Document->setEnabled(true); + ui->actionToolbarSave->setEnabled(true); + ui->fromTree->setEnabled(true); + + sizeColumns(); + + } +} + +bool EditorWindow::closeTab(int index) +{ + TabContent* widget = dynamic_cast<TabContent*> + (ui->editorTabs->widget(index)); + if(widget->requestClose()) + { + ui->editorTabs->removeTab(index); + widget->deleteLater(); + return true; + } + + return false; +} + +void EditorWindow::closeCurrent() +{ + closeTab(ui->editorTabs->currentIndex()); +} + +void EditorWindow::saveCurrent() +{ + if(ui->editorTabs->currentIndex() >= 0) + dynamic_cast<TabContent*>(ui->editorTabs->currentWidget())->save(); +} + +void EditorWindow::saveCurrentAs() +{ + if(ui->editorTabs->currentIndex() >= 0) + dynamic_cast<TabContent*>(ui->editorTabs->currentWidget())->saveAs(); +} + +void EditorWindow::openFile() +{ + QStringList fileNames; + QSettings settings; + + settings.beginGroup("SkinDocument"); + QString directory = settings.value("defaultDirectory", "").toString(); + fileNames = QFileDialog::getOpenFileNames(this, tr("Open Files"), directory, + SkinDocument::fileFilter()); + + for(int i = 0; i < fileNames.count(); i++) + { + if(!QFile::exists(fileNames[i])) + continue; + + QString current = fileNames[i]; + + loadTabFromSkinFile(current); + + /* And setting the new default directory */ + current.chop(current.length() - current.lastIndexOf('/') - 1); + settings.setValue("defaultDirectory", current); + + } + + settings.endGroup(); +} + +void EditorWindow::openProject() +{ + QString fileName; + QSettings settings; + + settings.beginGroup("ProjectModel"); + QString directory = settings.value("defaultDirectory", "").toString(); + fileName = QFileDialog::getOpenFileName(this, tr("Open Project"), directory, + ProjectModel::fileFilter()); + + if(QFile::exists(fileName)) + { + + if(project) + delete project; + + project = new ProjectModel(fileName, this); + ui->projectTree->setModel(project); + + QObject::connect(ui->projectTree, SIGNAL(activated(QModelIndex)), + project, SLOT(activated(QModelIndex))); + + fileName.chop(fileName.length() - fileName.lastIndexOf('/') - 1); + settings.setValue("defaultDirectory", fileName); + + } + + settings.endGroup(); + +} + +void EditorWindow::configFileChanged(QString configFile) +{ + + QSettings settings; + + settings.beginGroup("ProjectModel"); + + if(QFile::exists(configFile)) + { + + if(project) + delete project; + + project = new ProjectModel(configFile, this); + ui->projectTree->setModel(project); + + QObject::connect(ui->projectTree, SIGNAL(activated(QModelIndex)), + project, SLOT(activated(QModelIndex))); + + configFile.chop(configFile.length() - configFile.lastIndexOf('/') - 1); + settings.setValue("defaultDirectory", configFile); + + } + + settings.endGroup(); + +} + +void EditorWindow::tabTitleChanged(QString title) +{ + TabContent* sender = dynamic_cast<TabContent*>(QObject::sender()); + ui->editorTabs->setTabText(ui->editorTabs->indexOf(sender), title); +} + +void EditorWindow::showPanel() +{ + if(sender() == ui->actionFile_Panel) + ui->projectDock->setVisible(true); + if(sender() == ui->actionPreview_Panel) + ui->skinPreviewDock->setVisible(true); + if(sender() == ui->actionDisplay_Panel) + ui->parseTreeDock->setVisible(true); +} + +void EditorWindow::closeEvent(QCloseEvent* event) +{ + + saveSettings(); + + /* Closing all the tabs */ + for(int i = 0; i < ui->editorTabs->count(); i++) + { + if(!dynamic_cast<TabContent*> + (ui->editorTabs->widget(i))->requestClose()) + { + event->ignore(); + return; + } + } + + event->accept(); +} + +void EditorWindow::updateCurrent() +{ + if(ui->editorTabs->currentIndex() < 0) + return; + + dynamic_cast<SkinDocument*> + (ui->editorTabs->currentWidget())->genCode(); +} + +void EditorWindow::lineChanged(int line) +{ + ui->parseTree->collapseAll(); + if(parseTreeSelection) + parseTreeSelection->deleteLater(); + ParseTreeModel* model = dynamic_cast<ParseTreeModel*> + (ui->parseTree->model()); + parseTreeSelection = new QItemSelectionModel(model); + expandLine(model, QModelIndex(), line); + sizeColumns(); + ui->parseTree->setSelectionModel(parseTreeSelection); + +} + +void EditorWindow::expandLine(ParseTreeModel* model, QModelIndex parent, + int line) +{ + for(int i = 0; i < model->rowCount(parent); i++) + { + QModelIndex dataType = model->index(i, ParseTreeModel::typeColumn, + parent); + QModelIndex dataVal = model->index(i, ParseTreeModel::valueColumn, + parent); + QModelIndex data = model->index(i, ParseTreeModel::lineColumn, parent); + QModelIndex recurse = model->index(i, 0, parent); + + expandLine(model, recurse, line); + + if(model->data(data, Qt::DisplayRole) == line) + { + ui->parseTree->expand(parent); + ui->parseTree->expand(data); + ui->parseTree->scrollTo(parent, QAbstractItemView::PositionAtTop); + + parseTreeSelection->select(data, QItemSelectionModel::Select); + parseTreeSelection->select(dataType, QItemSelectionModel::Select); + parseTreeSelection->select(dataVal, QItemSelectionModel::Select); + } + + } +} + +void EditorWindow::sizeColumns() +{ + /* Setting the column widths */ + ui->parseTree->resizeColumnToContents(ParseTreeModel::lineColumn); + ui->parseTree->resizeColumnToContents(ParseTreeModel::typeColumn); + ui->parseTree->resizeColumnToContents(ParseTreeModel::valueColumn); +} + +EditorWindow::~EditorWindow() +{ + delete ui; + delete prefs; + if(project) + delete project; +} |