Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "toonzqt/studiopaletteviewer.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzQt includes
Toshihiro Shimizu 890ddd
#include "toonzqt/menubarcommand.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/paletteviewer.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/dvdialog.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/trepetitionguard.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/gutil.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/icongenerator.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/intfield.h"
Toshihiro Shimizu 890ddd
#include "palettesscanpopup.h"
Toshihiro Shimizu 890ddd
#include "palettedata.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzLib includes
Toshihiro Shimizu 890ddd
#include "toonz/studiopalettecmd.h"
Toshihiro Shimizu 890ddd
#include "toonz/tpalettehandle.h"
Toshihiro Shimizu 890ddd
#include "toonz/txshsimplelevel.h"
Toshihiro Shimizu 890ddd
#include "toonz/toonzscene.h"
Toshihiro Shimizu 890ddd
#include "toonz/sceneproperties.h"
Toshihiro Shimizu 890ddd
#include "toonz/txsheethandle.h"
Toshihiro Shimizu 890ddd
#include "toonz/txshlevelhandle.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzCore includes
Toshihiro Shimizu 890ddd
#include "tconvert.h"
Toshihiro Shimizu 890ddd
#include "tundo.h"
Toshihiro Shimizu 890ddd
#include "tsystem.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "../toonz/menubarcommandids.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// Qt includes
Toshihiro Shimizu 890ddd
#include <qheaderview></qheaderview>
Toshihiro Shimizu 890ddd
#include <qcontextmenuevent></qcontextmenuevent>
Toshihiro Shimizu 890ddd
#include <qmenu></qmenu>
Toshihiro Shimizu 890ddd
#include <qurl></qurl>
Toshihiro Shimizu 890ddd
#include <qpainter></qpainter>
Toshihiro Shimizu 890ddd
#include <qvboxlayout></qvboxlayout>
Toshihiro Shimizu 890ddd
#include <qtoolbar></qtoolbar>
Toshihiro Shimizu 890ddd
#include <qinputdialog></qinputdialog>
Toshihiro Shimizu 890ddd
#include <qpushbutton></qpushbutton>
Toshihiro Shimizu 890ddd
#include <qdrag></qdrag>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include <time.h></time.h>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
using namespace std;
Toshihiro Shimizu 890ddd
using namespace PaletteViewerGUI;
Toshihiro Shimizu 890ddd
using namespace DVGui;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
namespace
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! Return true if path is in folder \b rootPath of \b StudioPalette.
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
bool isInStudioPaletteFolder(TFilePath path, TFilePath rootPath)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (path.getType() != "tpl")
Toshihiro Shimizu 890ddd
		return false;
Toshihiro Shimizu 890ddd
	StudioPalette *studioPalette = StudioPalette::instance();
Toshihiro Shimizu 890ddd
	std::vector<tfilepath> childrenPath;</tfilepath>
Toshihiro Shimizu 890ddd
	studioPalette->getChildren(childrenPath, rootPath);
Toshihiro Shimizu 890ddd
	int i;
Toshihiro Shimizu 890ddd
	for (i = 0; i < (int)childrenPath.size(); i++) {
Toshihiro Shimizu 890ddd
		if (path == childrenPath[i])
Toshihiro Shimizu 890ddd
			return true;
Toshihiro Shimizu 890ddd
		else if (isInStudioPaletteFolder(path, childrenPath[i]))
Toshihiro Shimizu 890ddd
			return true;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return false;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! Return true if path is in a \b StudioPalette folder.
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
bool isInStudioPalette(TFilePath path)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (path.getType() != "tpl")
Toshihiro Shimizu 890ddd
		return false;
Toshihiro Shimizu 890ddd
	StudioPalette *studioPalette = StudioPalette::instance();
Toshihiro Shimizu 890ddd
	if (isInStudioPaletteFolder(path, studioPalette->getLevelPalettesRoot()))
Toshihiro Shimizu 890ddd
		return true;
Toshihiro Shimizu 890ddd
	if (isInStudioPaletteFolder(path, studioPalette->getProjectPalettesRoot()))
Toshihiro Shimizu 890ddd
		return true;
Toshihiro Shimizu 890ddd
	return false;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
} //namespace
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
// StudioPaletteTreeViewer
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
StudioPaletteTreeViewer::StudioPaletteTreeViewer(QWidget *parent,
Toshihiro Shimizu 890ddd
												 TPaletteHandle *studioPaletteHandle,
Toshihiro Shimizu 890ddd
												 TPaletteHandle *levelPaletteHandle,
Toshihiro Shimizu 890ddd
												 TXsheetHandle *xsheetHandle,
Toshihiro Shimizu 890ddd
												 TXshLevelHandle *currentLevelHandle)
Toshihiro Shimizu 890ddd
	: QTreeWidget(parent), m_dropItem(0), m_studioPaletteHandle(studioPaletteHandle), m_levelPaletteHandle(levelPaletteHandle), m_currentLevelHandle(currentLevelHandle), m_xsheetHandle(xsheetHandle), m_folderIcon(QIcon()), m_levelPaletteIcon(QIcon()), m_studioPaletteIcon(QIcon())
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	setIndentation(14);
Toshihiro Shimizu 890ddd
	setAlternatingRowColors(true);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	header()->close();
Toshihiro Shimizu 890ddd
	setUniformRowHeights(true);
Toshihiro Shimizu 890ddd
	setIconSize(QSize(21, 17));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QList<qtreewidgetitem *=""> paletteItems;</qtreewidgetitem>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QString open = QString(":Resources/folder_close.png");
Toshihiro Shimizu 890ddd
	QString close = QString(":Resources/folder_open.png");
Toshihiro Shimizu 890ddd
	m_folderIcon.addFile(close, QSize(21, 17), QIcon::Normal, QIcon::On);
Toshihiro Shimizu 890ddd
	m_folderIcon.addFile(open, QSize(21, 17), QIcon::Normal, QIcon::Off);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QString levelPaletteIcon = QString(":Resources/palette.png");
Toshihiro Shimizu 890ddd
	m_levelPaletteIcon.addPixmap(levelPaletteIcon, QIcon::Normal, QIcon::On);
Toshihiro Shimizu 890ddd
	QString studioPaletteIcon = QString(":Resources/studiopalette.png");
Toshihiro Shimizu 890ddd
	m_studioPaletteIcon.addPixmap(studioPaletteIcon, QIcon::Normal, QIcon::On);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	StudioPalette *studioPalette = StudioPalette::instance();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TFilePath levelPalettePath = studioPalette->getLevelPalettesRoot();
Toshihiro Shimizu 890ddd
	paletteItems.append(createRootItem(levelPalettePath));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TFilePath projectPalettePath = studioPalette->getProjectPalettesRoot();
Toshihiro Shimizu 890ddd
	if (TSystem::doesExistFileOrLevel(projectPalettePath))
Toshihiro Shimizu 890ddd
		paletteItems.append(createRootItem(projectPalettePath));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	insertTopLevelItems(0, paletteItems);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool ret = connect(this, SIGNAL(itemChanged(QTreeWidgetItem *, int)), SLOT(onItemChanged(QTreeWidgetItem *, int)));
Toshihiro Shimizu 890ddd
	ret = ret && connect(this, SIGNAL(itemClicked(QTreeWidgetItem *, int)), SLOT(onItemClicked(QTreeWidgetItem *, int)));
Toshihiro Shimizu 890ddd
	ret = ret && connect(this, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)),
Toshihiro Shimizu 890ddd
						 SLOT(onCurrentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)));
Toshihiro Shimizu 890ddd
	ret = ret && connect(this, SIGNAL(itemClicked(QTreeWidgetItem *, int)), this, SLOT(onTreeItemExpanded(QTreeWidgetItem *)));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//refresh tree with shortcut key
Toshihiro Shimizu 890ddd
	QAction *refreshAct = CommandManager::instance()->getAction(MI_RefreshTree);
Toshihiro Shimizu 890ddd
	ret = ret && connect(refreshAct, SIGNAL(triggered()), this, SLOT(onRefreshTreeShortcutTriggered()));
Toshihiro Shimizu 890ddd
	addAction(refreshAct);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_palettesScanPopup = new PalettesScanPopup();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	setAcceptDrops(true);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//Per la selezione multipla
Toshihiro Shimizu 890ddd
	setSelectionMode(QAbstractItemView::ExtendedSelection);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	StudioPalette::instance()->addListener(this);
Toshihiro Shimizu 890ddd
	TProjectManager::instance()->addListener(this);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	refresh();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	assert(ret);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
StudioPaletteTreeViewer::~StudioPaletteTreeViewer()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	StudioPalette::instance()->removeListener(this);
Toshihiro Shimizu 890ddd
	TProjectManager::instance()->removeListener(this);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
void StudioPaletteTreeViewer::setCurrentLevelHandle(TXshLevelHandle *currentLevelHandle)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_currentLevelHandle = currentLevelHandle;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void StudioPaletteTreeViewer::setLevelPaletteHandle(TPaletteHandle *paletteHandle)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_levelPaletteHandle = paletteHandle;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void StudioPaletteTreeViewer::setStdPaletteHandle(TPaletteHandle *studioPaletteHandle)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_studioPaletteHandle = studioPaletteHandle;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QTreeWidgetItem *StudioPaletteTreeViewer::createRootItem(TFilePath path)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QString rootName = QString::fromStdWString(path.getWideName());
Toshihiro Shimizu 890ddd
	if (rootName != "Toonz Palettes")
Toshihiro Shimizu 890ddd
		rootName = "Project Palettes";
Toshihiro Shimizu 890ddd
	QTreeWidgetItem *rootItem = new QTreeWidgetItem((QTreeWidget *)0, QStringList(rootName));
Toshihiro Shimizu 890ddd
	rootItem->setIcon(0, m_folderIcon);
Toshihiro Shimizu 890ddd
	rootItem->setData(1, Qt::UserRole, toQString(path));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	refreshItem(rootItem);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return rootItem;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool StudioPaletteTreeViewer::isRootItem(QTreeWidgetItem *item)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(item);
Toshihiro Shimizu 890ddd
	TFilePath path = getItemPath(item);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	StudioPalette *studioPalette = StudioPalette::instance();
Toshihiro Shimizu 890ddd
	if (path == studioPalette->getLevelPalettesRoot() ||
Toshihiro Shimizu 890ddd
		path == studioPalette->getProjectPalettesRoot())
Toshihiro Shimizu 890ddd
		return true;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return false;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QTreeWidgetItem *StudioPaletteTreeViewer::createItem(const TFilePath path)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	StudioPalette *studioPalette = StudioPalette::instance();
Toshihiro Shimizu 890ddd
	QString itemName = toQString(TFilePath(path.getWideName()));
Toshihiro Shimizu 890ddd
	QTreeWidgetItem *item = new QTreeWidgetItem((QTreeWidget *)0, QStringList(itemName));
Toshihiro Shimizu 890ddd
	if (studioPalette->isPalette(path)) {
Toshihiro Shimizu 890ddd
		if (studioPalette->hasGlobalName(path))
Toshihiro Shimizu 890ddd
			item->setIcon(0, m_studioPaletteIcon);
Toshihiro Shimizu 890ddd
		else
Toshihiro Shimizu 890ddd
			item->setIcon(0, m_levelPaletteIcon);
Toshihiro Shimizu 890ddd
	} else if (studioPalette->isFolder(path))
Toshihiro Shimizu 890ddd
		item->setIcon(0, m_folderIcon);
Toshihiro Shimizu 890ddd
	item->setData(1, Qt::UserRole, toQString(path));
Toshihiro Shimizu 890ddd
	item->setFlags(item->flags() | Qt::ItemIsEditable);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return item;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TFilePath StudioPaletteTreeViewer::getItemPath(QTreeWidgetItem *item)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TFilePath path = (item) ? TFilePath(item->data(1, Qt::UserRole).toString().toStdWString())
Toshihiro Shimizu 890ddd
							: TFilePath();
Toshihiro Shimizu 890ddd
	return path;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TFilePath StudioPaletteTreeViewer::getCurrentFolderPath()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return getItemPath(currentItem());
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QTreeWidgetItem *StudioPaletteTreeViewer::getItem(const TFilePath path)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QList<qtreewidgetitem *=""> oldItems = findItems(QString(""), Qt::MatchContains, 0);</qtreewidgetitem>
Toshihiro Shimizu 890ddd
	if (oldItems.isEmpty())
Toshihiro Shimizu 890ddd
		return 0;
Toshihiro Shimizu 890ddd
	int i;
Toshihiro Shimizu 890ddd
	for (i = 0; i < (int)oldItems.size(); i++) {
Toshihiro Shimizu 890ddd
		TFilePath oldItemPath(oldItems[i]->data(1, Qt::UserRole).toString().toStdWString());
Toshihiro Shimizu 890ddd
		if (oldItemPath == path)
Toshihiro Shimizu 890ddd
			return oldItems[i];
Toshihiro Shimizu 890ddd
		else {
Toshihiro Shimizu 890ddd
			QTreeWidgetItem *item = getFolderItem(oldItems[i], path);
Toshihiro Shimizu 890ddd
			if (item)
Toshihiro Shimizu 890ddd
				return item;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return 0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QTreeWidgetItem *StudioPaletteTreeViewer::getFolderItem(QTreeWidgetItem *parent, const TFilePath path)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int childrenCount = parent->childCount();
Toshihiro Shimizu 890ddd
	int i;
Toshihiro Shimizu 890ddd
	for (i = 0; i < childrenCount; i++) {
Toshihiro Shimizu 890ddd
		QTreeWidgetItem *item = parent->child(i);
Toshihiro Shimizu 890ddd
		if (getItemPath(item) == path)
Toshihiro Shimizu 890ddd
			return item;
Toshihiro Shimizu 890ddd
		else {
Toshihiro Shimizu 890ddd
			item = getFolderItem(item, path);
Toshihiro Shimizu 890ddd
			if (item)
Toshihiro Shimizu 890ddd
				return item;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return 0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void StudioPaletteTreeViewer::resetDropItem()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (!m_dropItem)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	m_dropItem->setTextColor(0, Qt::black);
Toshihiro Shimizu 890ddd
	m_dropItem = 0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void StudioPaletteTreeViewer::refresh()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_openedItems.clear();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	StudioPalette *studioPalette = StudioPalette::instance();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TFilePath levelPalettePath = studioPalette->getLevelPalettesRoot();
Toshihiro Shimizu 890ddd
	refreshItem(getItem(levelPalettePath));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TFilePath projectPalettePath = studioPalette->getProjectPalettesRoot();
Toshihiro Shimizu 890ddd
	if (!TSystem::doesExistFileOrLevel(projectPalettePath))
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	refreshItem(getItem(projectPalettePath));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//refresh all expanded items
Toshihiro Shimizu 890ddd
	QList<qtreewidgetitem *=""> items = findItems(QString(""), Qt::MatchContains | Qt::MatchRecursive, 0);</qtreewidgetitem>
Toshihiro Shimizu 890ddd
	if (items.isEmpty())
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (int i = 0; i < (int)items.size(); i++)
Toshihiro Shimizu 890ddd
		if (items[i]->isExpanded())
Toshihiro Shimizu 890ddd
			refreshItem(items[i]);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*!When expand a tree, prepare the child items of it 
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
void StudioPaletteTreeViewer::onTreeItemExpanded(QTreeWidgetItem *item)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (!item)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//if this item was not yet opened, then get the children of this item
Toshihiro Shimizu 890ddd
	if (!m_openedItems.contains(item))
Toshihiro Shimizu 890ddd
		refreshItem(item);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//expand the item
Toshihiro Shimizu 890ddd
	item->setExpanded(!item->isExpanded());
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! Refresh tree only when this widget has focus
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
void StudioPaletteTreeViewer::onRefreshTreeShortcutTriggered()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (hasFocus())
Toshihiro Shimizu 890ddd
		refresh();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! Update the content of item
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void StudioPaletteTreeViewer::refreshItem(QTreeWidgetItem *item)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TFilePath folderPath = getItemPath(item);
Toshihiro Shimizu 890ddd
	assert(folderPath != TFilePath());
Toshihiro Shimizu 890ddd
	//correct only tpl files and folders
Toshihiro Shimizu 890ddd
	std::vector<tfilepath> childrenPath;</tfilepath>
Toshihiro Shimizu 890ddd
	StudioPalette::instance()->getChildren(childrenPath, folderPath);
Toshihiro Shimizu 890ddd
	int currentChildCount = item->childCount();
Toshihiro Shimizu 890ddd
	std::vector<qtreewidgetitem *=""> currentChildren;</qtreewidgetitem>
Toshihiro Shimizu 890ddd
	int i;
Toshihiro Shimizu 890ddd
	for (i = 0; i < currentChildCount; i++)
Toshihiro Shimizu 890ddd
		currentChildren.push_back(item->child(i));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int childrenPathCount = childrenPath.size();
Toshihiro Shimizu 890ddd
	int itemIndex = 0;
Toshihiro Shimizu 890ddd
	int pathIndex = 0;
Toshihiro Shimizu 890ddd
	while (itemIndex < currentChildCount || pathIndex < childrenPathCount) {
Toshihiro Shimizu 890ddd
		TFilePath path = (pathIndex < childrenPathCount) ? childrenPath[pathIndex] : TFilePath();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		QTreeWidgetItem *currentItem = (itemIndex < currentChildCount) ? currentChildren[itemIndex] : 0;
Toshihiro Shimizu 890ddd
		TFilePath currentItemPath = getItemPath(currentItem);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (path == currentItemPath) {
Toshihiro Shimizu 890ddd
			itemIndex++;
Toshihiro Shimizu 890ddd
			pathIndex++;
Toshihiro Shimizu 890ddd
		} else if ((!path.isEmpty() && path < currentItemPath) ||
Toshihiro Shimizu 890ddd
				   currentItemPath.isEmpty()) {
Toshihiro Shimizu 890ddd
			currentItem = createItem(path);
Toshihiro Shimizu 890ddd
			item->insertChild(itemIndex, currentItem);
Toshihiro Shimizu 890ddd
			itemIndex++;
Toshihiro Shimizu 890ddd
			pathIndex++;
Toshihiro Shimizu 890ddd
		} else {
Toshihiro Shimizu 890ddd
			assert(currentItemPath < path || path.isEmpty());
Toshihiro Shimizu 890ddd
			assert(currentItem);
Toshihiro Shimizu 890ddd
			item->removeChild(currentItem);
Toshihiro Shimizu 890ddd
			itemIndex++;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	m_openedItems.insert(item);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void StudioPaletteTreeViewer::resetProjectPaletteFolder()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int projectPaletteIndex = 1;
Toshihiro Shimizu 890ddd
	TFilePath projectPalettePath = StudioPalette::instance()->getProjectPalettesRoot();
Toshihiro Shimizu 890ddd
	// Prendo l'item del project palette.
Toshihiro Shimizu 890ddd
	QTreeWidgetItem *projectPaletteItem = topLevelItem(projectPaletteIndex);
Toshihiro Shimizu 890ddd
	if (projectPaletteItem) {
Toshihiro Shimizu 890ddd
		// Se il path dell'item e' uguale a quello del project palette corrente ritorno.
Toshihiro Shimizu 890ddd
		if (getItemPath(projectPaletteItem) == projectPalettePath)
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
		// Altrimenti lo rimuovo.
Toshihiro Shimizu 890ddd
		removeItemWidget(projectPaletteItem, 0);
Toshihiro Shimizu 890ddd
		delete projectPaletteItem;
Toshihiro Shimizu 890ddd
		//clear the item list in order to search the folder from scratch
Toshihiro Shimizu 890ddd
		m_openedItems.clear();
Toshihiro Shimizu 890ddd
		//Toonz Palette is not changed, so resurrect the ToonzPaletteRoot
Toshihiro Shimizu 890ddd
		m_openedItems.insert(topLevelItem(0));
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	if (!TSystem::doesExistFileOrLevel(projectPalettePath))
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	// Creo il nuovo item con il nuovo project folder e lo inserisco nell'albero.
Toshihiro Shimizu 890ddd
	// Items in the ProjectPaletteRoot are refreshed here. Stored in openedItems as well.
Toshihiro Shimizu 890ddd
	QTreeWidgetItem *newProjectPaletteItem = createRootItem(projectPalettePath);
Toshihiro Shimizu 890ddd
	insertTopLevelItem(projectPaletteIndex, newProjectPaletteItem);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	setCurrentItem(0);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void StudioPaletteTreeViewer::onItemClicked(QTreeWidgetItem *item, int column)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (currentItem() && m_studioPaletteHandle && m_currentPalette.getPointer()) {
Toshihiro Shimizu 890ddd
		// if(m_studioPaletteHandle->getPalette() != m_currentPalette.getPointer())
Toshihiro Shimizu 890ddd
		{
Toshihiro Shimizu 890ddd
			m_studioPaletteHandle->setPalette(m_currentPalette.getPointer());
Toshihiro Shimizu 890ddd
			m_studioPaletteHandle->notifyPaletteSwitched();
Toshihiro Shimizu 890ddd
			StudioPaletteCmd::updateAllLinkedStyles(m_levelPaletteHandle, m_xsheetHandle);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void StudioPaletteTreeViewer::onItemChanged(QTreeWidgetItem *item, int column)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (item != currentItem() || isRootItem(item))
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	wstring name = item->text(column).toStdWString();
Toshihiro Shimizu 890ddd
	TFilePath oldPath = getCurrentFolderPath();
Toshihiro Shimizu 890ddd
	if (oldPath.isEmpty() || name.empty() || oldPath.getWideName() == name)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	TFilePath newPath(oldPath.getParentDir() + TFilePath(name + toWideString(oldPath.getDottedType())));
Toshihiro Shimizu 890ddd
	try {
Toshihiro Shimizu 890ddd
		StudioPaletteCmd::movePalette(newPath, oldPath);
Toshihiro Shimizu 890ddd
	} catch (TException &e) {
Toshihiro Shimizu 890ddd
		error(QString(toString(e.getMessage()).c_str()));
Toshihiro Shimizu 890ddd
		item->setText(column, QString::fromStdWString(oldPath.getWideName()));
Toshihiro Shimizu 890ddd
	} catch (...) {
Toshihiro Shimizu 890ddd
		error("Can't rename file");
Toshihiro Shimizu 890ddd
		item->setText(column, QString::fromStdWString(oldPath.getWideName()));
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	refreshItem(getItem(oldPath.getParentDir()));
Toshihiro Shimizu 890ddd
	setCurrentItem(getItem(newPath));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! Called when the current palette is switched
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
void StudioPaletteTreeViewer::onCurrentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TFilePath oldPath = getItemPath(previous);
Toshihiro Shimizu 890ddd
	TFilePath newPath = getCurrentFolderPath();
Toshihiro Shimizu 890ddd
	if (!m_studioPaletteHandle)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (m_currentPalette.getPointer() && m_currentPalette->getDirtyFlag()) {
Toshihiro Shimizu 890ddd
		TFilePath oldPath = StudioPalette::instance()->getPalettePath(m_currentPalette->getGlobalName());
Toshihiro Shimizu 890ddd
		if (oldPath == newPath)
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
		wstring gname = m_currentPalette->getGlobalName();
Toshihiro Shimizu 890ddd
		QString question;
Toshihiro Shimizu 890ddd
		question = "The current palette " + QString::fromStdWString(oldPath.getWideString()) + " \nin the studio palette has been modified. Do you want to save your changes?";
Shinya Kitaoka eabf18
		int ret = DVGui::MsgBox(question, QObject::tr("Save"), QObject::tr("Discard"), QObject::tr("Cancel"), 0);
Toshihiro Shimizu 890ddd
		if (ret == 3) {
Toshihiro Shimizu 890ddd
			setCurrentItem(getItem(oldPath));
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		if (ret == 1) {
Toshihiro Shimizu 890ddd
			//If the palette is level palette (i.e. NOT stdio palette), just overwrite it
Toshihiro Shimizu 890ddd
			if (gname.empty())
Toshihiro Shimizu 890ddd
				StudioPalette::instance()->save(oldPath, m_currentPalette.getPointer());
Toshihiro Shimizu 890ddd
			else
Toshihiro Shimizu 890ddd
				StudioPalette::instance()->setPalette(oldPath, m_currentPalette.getPointer(), false);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		m_currentPalette->setDirtyFlag(false);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	//load palette here
Toshihiro Shimizu 890ddd
	m_currentPalette = StudioPalette::instance()->getPalette(newPath, false);
Toshihiro Shimizu 890ddd
	m_studioPaletteHandle->setPalette(m_currentPalette.getPointer());
Toshihiro Shimizu 890ddd
	m_studioPaletteHandle->notifyPaletteSwitched();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void StudioPaletteTreeViewer::addNewPalette()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (!currentItem()) {
Toshihiro Shimizu 890ddd
		error("Error: No folder selected.");
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	TFilePath newPath;
Toshihiro Shimizu 890ddd
	try {
Toshihiro Shimizu 890ddd
		newPath = StudioPaletteCmd::createPalette(getCurrentFolderPath(), "", 0);
Toshihiro Shimizu 890ddd
	} catch (TException &e) {
Toshihiro Shimizu 890ddd
		error("Can't create palette: " + QString(toString(e.getMessage()).c_str()));
Toshihiro Shimizu 890ddd
	} catch (...) {
Toshihiro Shimizu 890ddd
		error("Can't create palette");
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	refreshItem(currentItem());
Toshihiro Shimizu 890ddd
	setCurrentItem(getItem(newPath));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void StudioPaletteTreeViewer::addNewFolder()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (!currentItem()) {
Toshihiro Shimizu 890ddd
		error("Error: No folder selected.");
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	TFilePath newPath;
Toshihiro Shimizu 890ddd
	try {
Toshihiro Shimizu 890ddd
		newPath = StudioPaletteCmd::addFolder(getCurrentFolderPath());
Toshihiro Shimizu 890ddd
	} catch (TException &e) {
Toshihiro Shimizu 890ddd
		error("Can't create palette folder: " + QString(toString(e.getMessage()).c_str()));
Toshihiro Shimizu 890ddd
	} catch (...) {
Toshihiro Shimizu 890ddd
		error("Can't create palette folder");
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	refreshItem(currentItem());
Toshihiro Shimizu 890ddd
	setCurrentItem(getItem(newPath));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! Convert level palette to studio palette. 
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
void StudioPaletteTreeViewer::convertToStudioPalette()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TFilePath path = getItemPath(currentItem());
Toshihiro Shimizu 890ddd
	StudioPalette *studioPalette = StudioPalette::instance();
Toshihiro Shimizu 890ddd
	if (studioPalette->isPalette(path)) {
Toshihiro Shimizu 890ddd
		TPalette *palette = studioPalette->getPalette(path);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (!palette) {
Toshihiro Shimizu 890ddd
			error("Can't touch palette");
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (m_currentPalette->getPaletteName() != palette->getPaletteName()) {
Toshihiro Shimizu 890ddd
			error("Can't touch palette");
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		QString question;
Toshihiro Shimizu 890ddd
		question = QString::fromStdWString(L"Convert " + path.getWideString() + L" to Studio Palette and Overwrite. \nAre you sure ?");
Shinya Kitaoka eabf18
		int ret = DVGui::MsgBox(question, QObject::tr("Yes"), QObject::tr("No"));
Toshihiro Shimizu 890ddd
		if (ret == 0 || ret == 2)
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		// apply global name
Toshihiro Shimizu 890ddd
		time_t ltime;
Toshihiro Shimizu 890ddd
		time(<ime);
Toshihiro Shimizu 890ddd
		wstring gname = toWideString((int)ltime) + L"_" + toWideString(rand());
Toshihiro Shimizu 890ddd
		m_currentPalette->setGlobalName(gname);
Toshihiro Shimizu 890ddd
		studioPalette->setStylesGlobalNames(m_currentPalette.getPointer());
Toshihiro Shimizu 890ddd
		studioPalette->save(path, m_currentPalette.getPointer());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		m_currentPalette->setDirtyFlag(false);
Toshihiro Shimizu 890ddd
		currentItem()->setIcon(0, m_studioPaletteIcon);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	} else
Toshihiro Shimizu 890ddd
		error("Can't find palette");
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void StudioPaletteTreeViewer::deleteItem(QTreeWidgetItem *item)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QTreeWidgetItem *parent = item->parent();
Toshihiro Shimizu 890ddd
	if (!parent)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (item->childCount() > 0) {
Toshihiro Shimizu 890ddd
		QString question;
Toshihiro Shimizu 890ddd
		question = tr("This folder is not empty. Delete anyway?");
Shinya Kitaoka eabf18
		int ret = DVGui::MsgBox(question, QObject::tr("Yes"), QObject::tr("No"));
Toshihiro Shimizu 890ddd
		if (ret == 0 || ret == 2)
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TFilePath path = getItemPath(item);
Toshihiro Shimizu 890ddd
	StudioPalette *studioPalette = StudioPalette::instance();
Toshihiro Shimizu 890ddd
	if (studioPalette->isFolder(path)) {
Toshihiro Shimizu 890ddd
		try {
Toshihiro Shimizu 890ddd
			StudioPaletteCmd::deleteFolder(path);
Toshihiro Shimizu 890ddd
		} catch (TException &e) {
Toshihiro Shimizu 890ddd
			error("Can't delete folder: " + QString(toString(e.getMessage()).c_str()));
Toshihiro Shimizu 890ddd
		} catch (...) {
Toshihiro Shimizu 890ddd
			error("Can't delete folder");
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		assert(studioPalette->isPalette(path));
Toshihiro Shimizu 890ddd
		try {
Toshihiro Shimizu 890ddd
			StudioPaletteCmd::deletePalette(path);
Toshihiro Shimizu 890ddd
		} catch (TException &e) {
Toshihiro Shimizu 890ddd
			error("Can't delete palette: " + QString(toString(e.getMessage()).c_str()));
Toshihiro Shimizu 890ddd
		} catch (...) {
Toshihiro Shimizu 890ddd
			error("Can't delete palette");
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	refreshItem(parent);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void StudioPaletteTreeViewer::deleteItems()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QList<qtreewidgetitem *=""> items = selectedItems();</qtreewidgetitem>
Toshihiro Shimizu 890ddd
	int count = items.size();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (count == 0) {
Toshihiro Shimizu 890ddd
		error("Nothing to delete");
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	int i;
Toshihiro Shimizu 890ddd
	TUndoManager::manager()->beginBlock();
Toshihiro Shimizu 890ddd
	for (i = 0; i < count; i++)
Toshihiro Shimizu 890ddd
		deleteItem(items[i]);
Toshihiro Shimizu 890ddd
	TUndoManager::manager()->endBlock();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void StudioPaletteTreeViewer::searchForPalette()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_palettesScanPopup->setCurrentFolder(getCurrentFolderPath());
Toshihiro Shimizu 890ddd
	int ret = m_palettesScanPopup->exec();
Toshihiro Shimizu 890ddd
	if (ret == QDialog::Accepted)
Toshihiro Shimizu 890ddd
		refresh();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class InvalidateIconsUndo : public TUndo
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TPaletteP m_targetPalette, m_oldPalette, m_newPalette;
Toshihiro Shimizu 890ddd
	TXshLevelHandle *m_levelHandle;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	InvalidateIconsUndo(TXshLevelHandle *levelHandle)
Toshihiro Shimizu 890ddd
		: m_levelHandle(levelHandle)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void undo() const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		TXshLevel *level = m_levelHandle->getLevel();
Toshihiro Shimizu 890ddd
		if (level) {
Toshihiro Shimizu 890ddd
			std::vector<tframeid> fids;</tframeid>
Toshihiro Shimizu 890ddd
			level->getFids(fids);
Toshihiro Shimizu 890ddd
			invalidateIcons(level, fids);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	void redo() const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		undo();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int getSize() const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return sizeof(*this);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka eabf18
class AdjustPaletteDialog : public DVGui::Dialog
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
private:
Toshihiro Shimizu 890ddd
	IntField *m_tolerance;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	int getTolerance() { return m_tolerance->getValue(); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	AdjustPaletteDialog()
Toshihiro Shimizu 890ddd
		: Dialog(0, true, true, "Adjust Current Level to This Palette")
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		setWindowTitle(tr("Adjust Current Level to This Palette"));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		beginVLayout();
Toshihiro Shimizu 890ddd
		m_tolerance = new IntField(this);
Toshihiro Shimizu 890ddd
		m_tolerance->setRange(0, 255);
Toshihiro Shimizu 890ddd
		m_tolerance->setValue(0);
Toshihiro Shimizu 890ddd
		addWidget(tr("Tolerance"), m_tolerance);
Toshihiro Shimizu 890ddd
		endVLayout();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		QPushButton *okBtn = new QPushButton(tr("Apply"), this);
Toshihiro Shimizu 890ddd
		okBtn->setDefault(true);
Toshihiro Shimizu 890ddd
		QPushButton *cancelBtn = new QPushButton(tr("Cancel"), this);
Toshihiro Shimizu 890ddd
		bool ret = connect(okBtn, SIGNAL(clicked()), this, SLOT(accept()));
Toshihiro Shimizu 890ddd
		ret = ret && connect(cancelBtn, SIGNAL(clicked()), this, SLOT(reject()));
Toshihiro Shimizu 890ddd
		assert(ret);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		addButtonBarWidget(okBtn, cancelBtn);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void StudioPaletteTreeViewer::loadInCurrentPaletteAndAdaptLevel()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QList<qtreewidgetitem *=""> items = selectedItems();</qtreewidgetitem>
Toshihiro Shimizu 890ddd
	assert(items.size() == 1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPalette *palette = m_levelPaletteHandle->getPalette();
Toshihiro Shimizu 890ddd
	if (!palette)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPalette *newPalette = StudioPalette::instance()->getPalette(getItemPath(items[0]), true);
Toshihiro Shimizu 890ddd
	if (!newPalette)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	AdjustPaletteDialog apd;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (apd.exec() != QDialog::Accepted)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/* awful patch: since in StudioPaletteCmd(defined in toonzlib) I cannot use the invalidateIcons(defined in toonzqt) 
Toshihiro Shimizu 890ddd
    i do invalidate icons from here using a "fake TUndo", named InvalidateIconsUndo. 
Toshihiro Shimizu 890ddd
    And, since I need to refresh icons at the end of the processing, i have to put that fake undo twice, one before and one after.
Toshihiro Shimizu 890ddd
    this way , when the user do either an undo or a redo operation, I am ensured that the last operation is the icon refresh...
Toshihiro Shimizu 890ddd
  */
Toshihiro Shimizu 890ddd
	TUndoManager::manager()->beginBlock();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TUndoManager::manager()->add(new InvalidateIconsUndo(m_currentLevelHandle));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	StudioPaletteCmd::loadIntoCurrentPalette(m_levelPaletteHandle, newPalette, m_currentLevelHandle, apd.getTolerance());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TUndoManager::manager()->add(new InvalidateIconsUndo(m_currentLevelHandle));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TUndoManager::manager()->endBlock();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	InvalidateIconsUndo(m_currentLevelHandle).undo();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void StudioPaletteTreeViewer::loadInCurrentPalette()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QList<qtreewidgetitem *=""> items = selectedItems();</qtreewidgetitem>
Toshihiro Shimizu 890ddd
	int count = items.size();
Toshihiro Shimizu 890ddd
	if (count == 0)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPalette *palette = m_levelPaletteHandle->getPalette();
Toshihiro Shimizu 890ddd
	if (!palette)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (palette->isLocked()) {
Shinya Kitaoka eabf18
		DVGui::warning("Palette is Locked!");
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPalette *newPalette = StudioPalette::instance()->getPalette(getItemPath(items[0]), false);
Toshihiro Shimizu 890ddd
	if (!newPalette)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	if (m_xsheetHandle) {
Toshihiro Shimizu 890ddd
		int ret = DVGui::eraseStylesInDemand(palette, m_xsheetHandle, newPalette);
Toshihiro Shimizu 890ddd
		if (ret == 0)
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	StudioPaletteCmd::loadIntoCurrentPalette(m_levelPaletteHandle, newPalette);
Toshihiro Shimizu 890ddd
	m_currentLevelHandle->notifyLevelChange();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TXshLevel *level = m_currentLevelHandle->getLevel();
Toshihiro Shimizu 890ddd
	if (level) {
Toshihiro Shimizu 890ddd
		std::vector<tframeid> fids;</tframeid>
Toshihiro Shimizu 890ddd
		level->getFids(fids);
Toshihiro Shimizu 890ddd
		invalidateIcons(level, fids);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int i;
Toshihiro Shimizu 890ddd
	for (i = 1; i < count; i++) {
Toshihiro Shimizu 890ddd
		TFilePath path = getItemPath(items[i]);
Toshihiro Shimizu 890ddd
		StudioPaletteCmd::mergeIntoCurrentPalette(m_levelPaletteHandle, path);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	// in order to update the title bar of palette viewer
Toshihiro Shimizu 890ddd
	m_levelPaletteHandle->getPalette()->setDirtyFlag(true);
Toshihiro Shimizu 890ddd
	m_levelPaletteHandle->notifyPaletteChanged();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void StudioPaletteTreeViewer::replaceCurrentPalette()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QList<qtreewidgetitem *=""> items = selectedItems();</qtreewidgetitem>
Toshihiro Shimizu 890ddd
	int count = items.size();
Toshihiro Shimizu 890ddd
	if (count == 0)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//exec confirmation dialog
Toshihiro Shimizu 890ddd
	TPalette *current = m_levelPaletteHandle->getPalette();
Toshihiro Shimizu 890ddd
	if (!current)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QString label;
Toshihiro Shimizu 890ddd
	if (count != 1) //replacing to multiple palettes
Toshihiro Shimizu 890ddd
		label = QString::fromStdWString(L"Replacing all selected palettes with the palette \"" + current->getPaletteName() + L"\". \nAre you sure ?");
Toshihiro Shimizu 890ddd
	else {
Toshihiro Shimizu 890ddd
		TPalette *dstPalette = StudioPalette::instance()->getPalette(getItemPath(items[0]));
Toshihiro Shimizu 890ddd
		if (!dstPalette)
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
		label = QString::fromStdWString(L"Replacing the palette \"" + dstPalette->getPaletteName() + L"\" with the palette \"" + current->getPaletteName() + L"\". \nAre you sure ?");
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Shinya Kitaoka eabf18
	int ret = DVGui::MsgBox(label, QObject::tr("Replace"), QObject::tr("Cancel"), 1);
Toshihiro Shimizu 890ddd
	if (ret == 0 || ret == 2)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TUndoManager::manager()->beginBlock();
Toshihiro Shimizu 890ddd
	int i;
Toshihiro Shimizu 890ddd
	for (i = 0; i < count; i++)
Toshihiro Shimizu 890ddd
		StudioPaletteCmd::replaceWithCurrentPalette(m_levelPaletteHandle, m_studioPaletteHandle, getItemPath(items[i]));
Toshihiro Shimizu 890ddd
	TUndoManager::manager()->endBlock();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (m_currentPalette)
Toshihiro Shimizu 890ddd
		m_currentPalette->setDirtyFlag(false);
Toshihiro Shimizu 890ddd
	//in order to update display
Toshihiro Shimizu 890ddd
	onCurrentItemChanged(currentItem(), currentItem());
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void StudioPaletteTreeViewer::mergeToCurrentPalette()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QList<qtreewidgetitem *=""> items = selectedItems();</qtreewidgetitem>
Toshihiro Shimizu 890ddd
	int count = items.size();
Toshihiro Shimizu 890ddd
	if (count == 0)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TUndoManager::manager()->beginBlock();
Toshihiro Shimizu 890ddd
	int i;
Toshihiro Shimizu 890ddd
	for (i = 0; i < count; i++)
Toshihiro Shimizu 890ddd
		StudioPaletteCmd::mergeIntoCurrentPalette(m_levelPaletteHandle, getItemPath(items[i]));
Toshihiro Shimizu 890ddd
	TUndoManager::manager()->endBlock();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void StudioPaletteTreeViewer::paintEvent(QPaintEvent *event)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QTreeWidget::paintEvent(event);
Toshihiro Shimizu 890ddd
	QPainter p(viewport());
Toshihiro Shimizu 890ddd
	if (m_dropItem) {
Toshihiro Shimizu 890ddd
		p.setPen(QColor(50, 105, 200));
Toshihiro Shimizu 890ddd
		p.drawRect(visualItemRect(m_dropItem));
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void StudioPaletteTreeViewer::contextMenuEvent(QContextMenuEvent *event)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TFilePath path = getCurrentFolderPath();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	StudioPalette *studioPalette = StudioPalette::instance();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//Menu' per la selezione singola
Toshihiro Shimizu 890ddd
	QList<qtreewidgetitem *=""> items = selectedItems();</qtreewidgetitem>
Toshihiro Shimizu 890ddd
	int count = items.size();
Toshihiro Shimizu 890ddd
	if (count == 1) {
Toshihiro Shimizu 890ddd
		// Verify if click position is in a row containing an item.
Toshihiro Shimizu 890ddd
		QRect rect = visualItemRect(currentItem());
Toshihiro Shimizu 890ddd
		if (!QRect(0, rect.y(), width(), rect.height()).contains(event->pos()))
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		bool isFolder = (studioPalette->isFolder(path));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		QMenu menu(this);
Toshihiro Shimizu 890ddd
		if (isFolder) {
Toshihiro Shimizu 890ddd
			createMenuAction(menu, "", tr("New Palette"), "addNewPalette()");
Toshihiro Shimizu 890ddd
			createMenuAction(menu, "", tr("New Folder"), "addNewFolder()");
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (studioPalette->isFolder(path) &&
Toshihiro Shimizu 890ddd
			studioPalette->getLevelPalettesRoot() != path &&
Toshihiro Shimizu 890ddd
			studioPalette->getProjectPalettesRoot() != path) {
Toshihiro Shimizu 890ddd
			menu.addSeparator();
Toshihiro Shimizu 890ddd
			createMenuAction(menu, "", tr("Delete Folder"), "deleteItems()");
Toshihiro Shimizu 890ddd
		} else if (studioPalette->isPalette(path)) {
Toshihiro Shimizu 890ddd
			if (m_studioPaletteHandle->getPalette()) {
Toshihiro Shimizu 890ddd
				createMenuAction(menu, "MI_LoadIntoCurrentPalette", tr("Load into Current Palette"), "loadInCurrentPalette()");
Toshihiro Shimizu 890ddd
				createMenuAction(menu, "MI_AdjustCurrentLevelToPalette", tr("Adjust Current Level to This Palette"), "loadInCurrentPaletteAndAdaptLevel()");
Toshihiro Shimizu 890ddd
				createMenuAction(menu, "MI_MergeToCurrentPalette", tr("Merge to Current Palette"), "mergeToCurrentPalette()");
Toshihiro Shimizu 890ddd
				if (!m_studioPaletteHandle->getPalette()->isLocked()) {
Toshihiro Shimizu 890ddd
					createMenuAction(menu, "MI_ReplaceWithCurrentPalette", tr("Replace with Current Palette"), "replaceCurrentPalette()");
Toshihiro Shimizu 890ddd
					menu.addSeparator();
Toshihiro Shimizu 890ddd
					createMenuAction(menu, "MI_DeletePalette", tr("Delete Palette"), "deleteItems()");
Toshihiro Shimizu 890ddd
				}
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
			if (!studioPalette->hasGlobalName(path)) {
Toshihiro Shimizu 890ddd
				menu.addSeparator();
Toshihiro Shimizu 890ddd
				createMenuAction(menu, "", tr("Convert to Studio Palette and Overwrite"), "convertToStudioPalette()");
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (isFolder) {
Toshihiro Shimizu 890ddd
			menu.addSeparator();
Toshihiro Shimizu 890ddd
			createMenuAction(menu, "", tr("Search for Palettes"), "searchForPalette()");
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		menu.exec(event->globalPos());
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//Menu' per la selezione multipla
Toshihiro Shimizu 890ddd
	// Verify if click position is in a row containing an item.
Toshihiro Shimizu 890ddd
	bool areAllPalette = true;
Toshihiro Shimizu 890ddd
	bool isClickInSelection = false;
Toshihiro Shimizu 890ddd
	int i;
Toshihiro Shimizu 890ddd
	for (i = 0; i < count; i++) {
Toshihiro Shimizu 890ddd
		QTreeWidgetItem *item = items[i];
Toshihiro Shimizu 890ddd
		QRect rect = visualItemRect(item);
Toshihiro Shimizu 890ddd
		if (QRect(0, rect.y(), width(), rect.height()).contains(event->pos()))
Toshihiro Shimizu 890ddd
			isClickInSelection = true;
Toshihiro Shimizu 890ddd
		TFilePath path = getItemPath(item);
Toshihiro Shimizu 890ddd
		if (studioPalette->isFolder(path))
Toshihiro Shimizu 890ddd
			areAllPalette = false;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	if (!isClickInSelection)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QMenu menu(this);
Toshihiro Shimizu 890ddd
	if (areAllPalette) {
Toshihiro Shimizu 890ddd
		createMenuAction(menu, "", tr("Load into Current Palette"), "loadInCurrentPalette()");
Toshihiro Shimizu 890ddd
		createMenuAction(menu, "", tr("Merge to Current Palette"), "mergeToCurrentPalette()");
Toshihiro Shimizu 890ddd
		createMenuAction(menu, "", tr("Replace with Current Palette"), "replaceCurrentPalette()");
Toshihiro Shimizu 890ddd
		menu.addSeparator();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	createMenuAction(menu, "", tr("Delete"), "deleteItems()");
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	menu.exec(event->globalPos());
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void StudioPaletteTreeViewer::createMenuAction(QMenu &menu, const char *id, QString name, const char *slot)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QAction *act = menu.addAction(name);
Toshihiro Shimizu 890ddd
	string slotName(slot);
Toshihiro Shimizu 890ddd
	slotName = string("1") + slotName;
Toshihiro Shimizu 890ddd
	connect(act, SIGNAL(triggered()), slotName.c_str());
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void StudioPaletteTreeViewer::mouseMoveEvent(QMouseEvent *event)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	// If left button is not pressed return; is not drag event.
Toshihiro Shimizu 890ddd
	if (!(event->buttons() & Qt::LeftButton))
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	startDragDrop();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void StudioPaletteTreeViewer::startDragDrop()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TRepetitionGuard guard;
Toshihiro Shimizu 890ddd
	if (!guard.hasLock())
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QDrag *drag = new QDrag(this);
Toshihiro Shimizu 890ddd
	QMimeData *mimeData = new QMimeData;
Toshihiro Shimizu 890ddd
	QList<qurl> urls;</qurl>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QList<qtreewidgetitem *=""> items = selectedItems();</qtreewidgetitem>
Toshihiro Shimizu 890ddd
	int i;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (i = 0; i < items.size(); i++) {
Toshihiro Shimizu 890ddd
		//Sposto solo le palette.
Toshihiro Shimizu 890ddd
		TFilePath path = getItemPath(items[i]);
Toshihiro Shimizu 890ddd
		if (!path.isEmpty() &&
Toshihiro Shimizu 890ddd
			(path.getType() == "tpl" || path.getType() == "pli" ||
Toshihiro Shimizu 890ddd
			 path.getType() == "tlv" || path.getType() == "tnz"))
Toshihiro Shimizu 890ddd
			urls.append(pathToUrl(path));
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	if (urls.isEmpty())
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	mimeData->setUrls(urls);
Toshihiro Shimizu 890ddd
	drag->setMimeData(mimeData);
Toshihiro Shimizu 890ddd
	Qt::DropAction dropAction = drag->exec(Qt::CopyAction | Qt::MoveAction);
Toshihiro Shimizu 890ddd
	viewport()->update();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void StudioPaletteTreeViewer::dragEnterEvent(QDragEnterEvent *event)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	const QMimeData *mimeData = event->mimeData();
Toshihiro Shimizu 890ddd
	const PaletteData *paletteData = dynamic_cast<const *="" palettedata="">(mimeData);</const>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (acceptResourceDrop(mimeData->urls())) {
Toshihiro Shimizu 890ddd
		QList<qurl> urls = mimeData->urls();</qurl>
Toshihiro Shimizu 890ddd
		int count = urls.size();
Toshihiro Shimizu 890ddd
		if (count == 0)
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		//Controllo che almeno un url del drag sia una palette da spostare.
Toshihiro Shimizu 890ddd
		bool isPalette = false;
Toshihiro Shimizu 890ddd
		int i;
Toshihiro Shimizu 890ddd
		for (i = 0; i < count; i++) {
Toshihiro Shimizu 890ddd
			QUrl url = urls[i];
Toshihiro Shimizu 890ddd
			TFilePath path(url.toLocalFile().toStdWString());
Toshihiro Shimizu 890ddd
			if (!path.isEmpty() &&
Toshihiro Shimizu 890ddd
				(path.getType() == "tpl" || path.getType() == "pli" ||
Toshihiro Shimizu 890ddd
				 path.getType() == "tlv" || path.getType() == "tnz")) {
Toshihiro Shimizu 890ddd
				isPalette = true;
Toshihiro Shimizu 890ddd
				break;
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		if (!isPalette)
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		event->acceptProposedAction();
Toshihiro Shimizu 890ddd
	} else if (paletteData && paletteData->hasOnlyPalette())
Toshihiro Shimizu 890ddd
		event->acceptProposedAction();
Toshihiro Shimizu 890ddd
	viewport()->update();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void StudioPaletteTreeViewer::dragMoveEvent(QDragMoveEvent *event)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QTreeWidgetItem *item = itemAt(event->pos());
Toshihiro Shimizu 890ddd
	TFilePath newPath = getItemPath(item);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (m_dropItem)
Toshihiro Shimizu 890ddd
		m_dropItem->setTextColor(0, Qt::black);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (item) {
Toshihiro Shimizu 890ddd
		m_dropItem = item;
Toshihiro Shimizu 890ddd
		event->acceptProposedAction();
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		m_dropItem = 0;
Toshihiro Shimizu 890ddd
		event->ignore();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	viewport()->update();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void StudioPaletteTreeViewer::dropEvent(QDropEvent *event)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TFilePath newPath = getItemPath(m_dropItem);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	resetDropItem();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	const QMimeData *mimeData = event->mimeData();
Toshihiro Shimizu 890ddd
	const PaletteData *paletteData = dynamic_cast<const *="" palettedata="">(mimeData);</const>
Toshihiro Shimizu 890ddd
	if (paletteData) {
Toshihiro Shimizu 890ddd
		if (paletteData->hasOnlyPalette()) {
Toshihiro Shimizu 890ddd
			TPalette *palette = paletteData->getPalette();
Toshihiro Shimizu 890ddd
			if (!palette)
Toshihiro Shimizu 890ddd
				return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			try {
Toshihiro Shimizu 890ddd
				StudioPaletteCmd::createPalette(newPath, toString(palette->getPaletteName()), palette);
Toshihiro Shimizu 890ddd
			} catch (TException &e) {
Toshihiro Shimizu 890ddd
				error("Can't create palette: " + QString(toString(e.getMessage()).c_str()));
Toshihiro Shimizu 890ddd
			} catch (...) {
Toshihiro Shimizu 890ddd
				error("Can't create palette");
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (!mimeData->hasUrls() || mimeData->urls().size() == 0)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QList<qurl> urls = mimeData->urls();</qurl>
Toshihiro Shimizu 890ddd
	TUndoManager::manager()->beginBlock();
Toshihiro Shimizu 890ddd
	int i;
Toshihiro Shimizu 890ddd
	for (i = 0; i < urls.size(); i++) {
Toshihiro Shimizu 890ddd
		QUrl url = urls[i];
Toshihiro Shimizu 890ddd
		TFilePath path = TFilePath(url.toLocalFile().toStdWString());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		StudioPalette *studioPalette = StudioPalette::instance();
Toshihiro Shimizu 890ddd
		if (path == newPath || path.getParentDir() == newPath)
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (isInStudioPalette(path)) {
Toshihiro Shimizu 890ddd
			TFilePath newPalettePath = newPath + TFilePath(path.getWideName() + toWideString(path.getDottedType()));
Toshihiro Shimizu 890ddd
			try {
Toshihiro Shimizu 890ddd
				StudioPaletteCmd::movePalette(newPalettePath, path);
Toshihiro Shimizu 890ddd
			} catch (TException &e) {
Toshihiro Shimizu 890ddd
				error("Can't rename palette: " + QString(toString(e.getMessage()).c_str()));
Toshihiro Shimizu 890ddd
			} catch (...) {
Toshihiro Shimizu 890ddd
				error("Can't rename palette");
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	TUndoManager::manager()->endBlock();
Toshihiro Shimizu 890ddd
	event->setDropAction(Qt::CopyAction);
Toshihiro Shimizu 890ddd
	event->accept();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void StudioPaletteTreeViewer::dragLeaveEvent(QDragLeaveEvent *event)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	resetDropItem();
Toshihiro Shimizu 890ddd
	update();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
// StudioPaletteViewer
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
StudioPaletteViewer::StudioPaletteViewer(QWidget *parent,
Toshihiro Shimizu 890ddd
										 TPaletteHandle *studioPaletteHandle,
Toshihiro Shimizu 890ddd
										 TPaletteHandle *levelPaletteHandle,
Toshihiro Shimizu 890ddd
										 TFrameHandle *frameHandle,
Toshihiro Shimizu 890ddd
										 TXsheetHandle *xsheetHandle,
Toshihiro Shimizu 890ddd
										 TXshLevelHandle *currentLevelHandle)
Toshihiro Shimizu 890ddd
	: QSplitter(parent)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	// style sheet
Toshihiro Shimizu 890ddd
	setObjectName("StudioPaletteViewer");
Toshihiro Shimizu 890ddd
	setFrameStyle(QFrame::StyledPanel);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	setAcceptDrops(true);
Toshihiro Shimizu 890ddd
	setOrientation(Qt::Vertical);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//First Splitter Widget
Toshihiro Shimizu 890ddd
	QWidget *treeWidget = new QWidget(this);
Toshihiro Shimizu 890ddd
	QVBoxLayout *treeVLayout = new QVBoxLayout(treeWidget);
Toshihiro Shimizu 890ddd
	treeVLayout->setMargin(0);
Toshihiro Shimizu 890ddd
	treeVLayout->setSpacing(0);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_studioPaletteTreeViewer =
Toshihiro Shimizu 890ddd
		new StudioPaletteTreeViewer(treeWidget, studioPaletteHandle, levelPaletteHandle, xsheetHandle, currentLevelHandle);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	treeVLayout->addWidget(m_studioPaletteTreeViewer);
Toshihiro Shimizu 890ddd
	treeWidget->setLayout(treeVLayout);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//Second Splitter Widget
Toshihiro Shimizu 890ddd
	PaletteViewer *studioPaletteViewer = new PaletteViewer(this, PaletteViewerGUI::STUDIO_PALETTE);
Toshihiro Shimizu 890ddd
	studioPaletteViewer->setObjectName("PaletteViewerInStudioPalette");
Toshihiro Shimizu 890ddd
	studioPaletteViewer->setXsheetHandle(xsheetHandle);
Toshihiro Shimizu 890ddd
	studioPaletteViewer->setPaletteHandle(studioPaletteHandle);
Toshihiro Shimizu 890ddd
	studioPaletteViewer->setFrameHandle(frameHandle);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	addWidget(treeWidget);
Toshihiro Shimizu 890ddd
	addWidget(studioPaletteViewer);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	setFocusProxy(studioPaletteViewer);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
StudioPaletteViewer::~StudioPaletteViewer()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! In order to save current palette from the tool button in the PageViewer.
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
TFilePath StudioPaletteViewer::getCurrentItemPath()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return m_studioPaletteTreeViewer->getCurrentItemPath();
Toshihiro Shimizu 890ddd
}