/////////////////////////////////////////////////////////////////////////////
// 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
{
}
}