///////////////////////////////////////////////////////////////////////////// // Name: pokegen/PokeModrUI.cpp // Purpose: Main window handling // Author: Ben Boeckel // Modified by: Ben Boeckel // Created: Wed Jan 23 10:42:50 2008 // Copyright: ©2007-2008 Ben Boeckel and Nerdy Productions // Licence: // 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 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License along // with this program. If not, see . ///////////////////////////////////////////////////////////////////////////// #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "PokeModrUI.h" #include "PokeModTreeItem.h" #include PokeModrUI::PokeModrUI(KConfigGroup cfg, KConfigGroup history, QWidget* parent) : KMainWindow(parent), config(cfg), recent("&Recent Files...", NULL), clipboard(NULL) { setupUi(this); QMetaObject::connectSlotsByName(this); recent.loadEntries(history); KMenuBar* menubar = new KMenuBar(this); KMenu* menuFile = new KMenu("&File", menubar); menuFile->addAction(KStandardAction::openNew(this, SLOT(on_actionNew_triggered()), menuFile)); menuFile->addAction(KStandardAction::open(this, SLOT(on_actionOpen_triggered()), menuFile)); menuFile->addAction(KStandardAction::openRecent(this, SLOT(openPokeMod(const KUrl&)), menuFile)); menuFile->addSeparator(); menuFile->addAction(KStandardAction::save(this, SLOT(on_actionSave_triggered()), menuFile)); menuFile->addAction(KStandardAction::saveAs(this, SLOT(on_actionSaveAs_triggered()), menuFile)); menuFile->addSeparator(); menuFile->addAction(KStandardAction::quit(this, SLOT(on_actionQuit_triggered()), menuFile)); menubar->addMenu(menuFile); KMenu* menuEdit = new KMenu("&Edit", menubar); menuEdit->addAction(KStandardAction::cut(menuEdit)); menuEdit->addAction(KStandardAction::copy(menuEdit)); menuEdit->addAction(KStandardAction::paste(menuEdit)); menuEdit->addSeparator(); KAction* menuCut = new KAction(KIcon("edit-cut"), "Cu&t Object", menuEdit); menuCut->setShortcut(KShortcut("Alt+X")); menuEdit->addAction(menuCut); connect(menuCut, SIGNAL(triggered()), this, SLOT(on_actionCut_triggered())); KAction* menuCopy = new KAction(KIcon("edit-copy"), "Cop&y Object", menuEdit); menuCopy->setShortcut(KShortcut("Alt+C")); menuEdit->addAction(menuCopy); connect(menuCopy, SIGNAL(triggered()), this, SLOT(on_actionCopy_triggered())); KAction* menuPaste = new KAction(KIcon("edit-paste"), "Past&e Object", menuEdit); menuPaste->setShortcut(KShortcut("Alt+V")); menuEdit->addAction(menuPaste); connect(menuPaste, SIGNAL(triggered()), this, SLOT(on_actionPaste_triggered())); menuEdit->addSeparator(); menuEdit->addAction(KStandardAction::preferences(this, SLOT(on_actionPreferences_triggered()), menuEdit)); menubar->addMenu(menuEdit); menubar->addMenu(customHelpMenu(false)); setMenuBar(menubar); KToolBar* toolbar = new KToolBar("toolbar", this, Qt::TopToolBarArea, false, true, true); toolbar->addAction(KStandardAction::openNew(this, SLOT(on_actionNew_triggered()), toolbar)); toolbar->addAction(KStandardAction::open(this, SLOT(on_actionOpen_triggered()), toolbar)); toolbar->addAction(KStandardAction::openRecent(this, SLOT(openPokeMod(const KUrl&)), toolbar)); toolbar->addSeparator(); toolbar->addAction(KStandardAction::save(this, SLOT(on_actionSave_triggered()), toolbar)); toolbar->addAction(KStandardAction::saveAs(this, SLOT(on_actionSaveAs_triggered()), toolbar)); toolbar->addSeparator(); toolbar->addAction(KStandardAction::cut(toolbar)); toolbar->addAction(KStandardAction::copy(toolbar)); toolbar->addAction(KStandardAction::paste(toolbar)); toolbar->addSeparator(); KAction* toolbarCut = new KAction(KIcon("edit-cut"), "Cu&t Object", toolbar); toolbar->addAction(toolbarCut); connect(toolbarCut, SIGNAL(triggered()), this, SLOT(on_actionCut_triggered())); KAction* toolbarCopy = new KAction(KIcon("edit-copy"), "Cop&y Object", toolbar); toolbar->addAction(toolbarCopy); connect(toolbarCopy, SIGNAL(triggered()), this, SLOT(on_actionCopy_triggered())); KAction* toolbarPaste = new KAction(KIcon("edit-paste"), "Past&e Object", toolbar); toolbar->addAction(toolbarPaste); connect(toolbarPaste, SIGNAL(triggered()), this, SLOT(on_actionPaste_triggered())); toolbar->addSeparator(); toolbar->addAction(KStandardAction::preferences(this, SLOT(on_actionPreferences_triggered()), toolbar)); toolbar->addSeparator(); toolbar->addAction(KStandardAction::quit(this, SLOT(on_actionQuit_triggered()), toolbar)); addToolBar(toolbar); splitter->setSizes(QList() << cfg.readEntry("treeWidth", 100) << cfg.readEntry("panelWidth", 100)); // if (cfg.readEntry("reloadOnStart", false)) // { // for (int i = 0; i < cfg.readEntry("openedFiles", 0); ++i) // openPokeMod(recent.urls().at(i)); // } setAutoSaveSettings("MainWindow", true); rebuildTree(); } PokeModrUI::~PokeModrUI() { on_actionQuit_triggered(); } void PokeModrUI::rebuildTree() { treePokemod->clear(); for (QMutableListIterator i(pokemods); i.hasNext(); ) new PokeModTreeItem(treePokemod, i.next()); } void PokeModrUI::openPokeMod(const KUrl& path) { if (path.isLocalFile()) { pokemods.append(new Pokemod(path.path())); recent.addUrl(path); recent.saveEntries(config); rebuildTree(); } } void PokeModrUI::savePokeMod() { if (formPanel->widget()) static_cast(formPanel->widget())->getOriginal()->getPokemod()->save(); } void PokeModrUI::closePokeMod() { if (formPanel->widget()) { ObjectUI* o = static_cast(formPanel->widget()); const Pokemod* p = o->getOriginal()->getPokemod(); if (!o->close()) return; switch (KMessageBox::questionYesNoCancel(this, "You have unsaved changes, would you like to save them?", "Unsaved PokéMod")) { case KMessageBox::Yes: on_actionSave_triggered(); case KMessageBox::No: break; case KMessageBox::Cancel: return; } for (QMutableListIterator i(pokemods); i.hasNext(); i.next()) { if (i.value() == p) { i.remove(); break; } } delete p; rebuildTree(); } } void PokeModrUI::closeEvent(QCloseEvent* event) { on_actionQuit_triggered(); event->accept(); } void PokeModrUI::setChangedTitle(const bool c) { if (formPanel->widget()) setWindowTitle(QString::fromUtf8("%1%2 - PokéModr").arg(static_cast(formPanel->widget())->getOriginal()->getPokemod()->getTitle()).arg(c ? "*" : "")); else setWindowTitle(QString::fromUtf8("PokéModr")); } void PokeModrUI::on_actionNew_triggered() { QString dir = KFileDialog::getExistingDirectory(KUrl(KStandardDirs::locateLocal("data", "pokegen/pokemods", true)), this, QString::fromUtf8("New PokéMod")); if (dir != "") openPokeMod(KUrl(dir)); } void PokeModrUI::on_actionOpen_triggered() { QString dir = KFileDialog::getExistingDirectory(KUrl(KStandardDirs::locateLocal("data", "pokegen/pokemods", true)), this, QString::fromUtf8("Open PokéMod")); if (dir != "") openPokeMod(KUrl(dir)); } void PokeModrUI::on_actionSave_triggered() { if (!treePokemod->currentItem()) return; static_cast(treePokemod->currentItem())->save(); static_cast(static_cast(treePokemod->currentItem())->getObject())->getPokemod()->save(); } void PokeModrUI::on_actionSaveAs_triggered() { if (!treePokemod->currentItem()) return; QString dir = KFileDialog::getExistingDirectory(KUrl(KStandardDirs::locateLocal("data", "pokegen/pokemods", true)), this, QString::fromUtf8("Open PokéMod")); if (dir != "") { static_cast(treePokemod->currentItem())->save(); static_cast(treePokemod->currentItem())->getPokemod()->setPath(dir); } } void PokeModrUI::on_actionQuit_triggered() { while (pokemods.size()) closePokeMod(); if (clipboard) delete clipboard; close(); } void PokeModrUI::on_actionCut_triggered() { if (!treePokemod->currentItem()) return; if (clipboard) delete clipboard; clipboard = static_cast(treePokemod->currentItem())->cut(); } void PokeModrUI::on_actionCopy_triggered() { if (!treePokemod->currentItem()) return; if (clipboard) delete clipboard; clipboard = static_cast(treePokemod->currentItem())->copy(); } void PokeModrUI::on_actionPaste_triggered() { if (!clipboard || !treePokemod->currentItem()) return; static_cast(treePokemod->currentItem())->paste(clipboard); } void PokeModrUI::on_actionPreferences_triggered() { } void PokeModrUI::on_splitter_splitterMoved() { config.writeEntry("treeWidth", splitter->sizes()[0]); config.writeEntry("panelWidth", splitter->sizes()[1]); } void PokeModrUI::on_treePokemod_currentItemChanged(QTreeWidgetItem* current, QTreeWidgetItem* previous) { if (!static_cast(current)->getUi()) { if (previous) treePokemod->setCurrentItem(previous); current->setSelected(false); return; } if (formPanel->widget()) { if (!static_cast(formPanel->widget())->close()) return; } formPanel->setWidget(static_cast(current)->getUi()); formPanel->show(); } void PokeModrUI::on_treePokemod_customContextMenuRequested(const QPoint& pos) { if (treePokemod->itemAt(pos)) static_cast(treePokemod->itemAt(pos))->makeMenu(pos); else { } }