Blob Blame Raw


#include "floatingpanelcommand.h"
#include "mainwindow.h"
#include "flipbook.h"
#include "tapp.h"

#include "pane.h"

#include "toonzqt/styleeditor.h"

#include <QMainWindow>
#include <QDesktopWidget>
#include <QApplication>
#include <../toonzqt/tdockwindows.h>

//=============================================================================

// mette il widget al centro dello schermo e lo fa diventare la finestra corrente
void activateWidget(QWidget *w)
{
	QDesktopWidget *desktop = qApp->desktop();
	QRect screenRect = desktop->screenGeometry(w);

	QPoint p((screenRect.width() - w->width()) / 2, (screenRect.height() - w->height()) / 2);
	w->setGeometry(QRect(p, w->size()));
	w->activateWindow();
}

//=============================================================================
// OpenFloatingPanel
//-----------------------------------------------------------------------------

OpenFloatingPanel::OpenFloatingPanel(
	CommandId id,
	const std::string &panelType,
	QString title)
	: MenuItemHandler(id), m_title(title), m_panelType(panelType)
{
}

//-----------------------------------------------------------------------------

void OpenFloatingPanel::execute()
{
	// Let flipbooks handle the problem on their own
	if (m_panelType == "FlipBook") {
		FlipBookPool::instance()->pop();
		return;
	}

	getOrOpenFloatingPanel(m_panelType);

	/*

  // Search for pane that are floating and have the same panelName 
  TMainWindow *currentRoom = TApp::instance()->getCurrentRoom(); 
  QList<TPanel *> list = currentRoom->findChildren<TPanel *>();
	QPoint lastFloatingPos = QPoint(0,0);
  for(int i=0;i<list.size();i++)
  {
    TPanel *panel = list.at(i);

    // we want floating panel (possibly hidden) with the correct name
    if(panel->getPanelType() == m_panelType && panel->isFloating()) 
    {

      // if there is already a floating panel and MultipleInstances are
      // not allowed we must use it
      if(!panel->areMultipleInstancesAllowed() && !panel->isHidden())
      {
        activateWidget(panel);
        return;
      }
      
      // If there is a hidden panel we can show and use it
      if(panel->isHidden())
      {
				//Alcuni pannelli devono essere resettati (Es.: il paletteViewerPanel)
        panel->reset();
        //Devo porre il pannello sotto il controllo del layout della stanza
        currentRoom->addDockWidget(panel);
        panel->show();
        panel->raise();
        return;
      }
			else
				lastFloatingPos = panel->pos();
    }
  }  
  
  // No panel found. We must create a new pane

  TPanel *panel = TPanelFactory::createPanel(
    currentRoom,
    QString::fromStdString(m_panelType));
  if(!panel) return; // it should never happen
  panel->setWindowTitle(QObject::tr(m_title.toStdString().c_str()));
  panel->setFloating(true);
  panel->show();
  panel->raise();
	if(!lastFloatingPos.isNull())
		panel->move(QPoint(lastFloatingPos.x()+30,lastFloatingPos.y()+30));
    */
}

TPanel *OpenFloatingPanel::getOrOpenFloatingPanel(const std::string &panelType)
{
	TMainWindow *currentRoom = TApp::instance()->getCurrentRoom();
	QList<TPanel *> list = currentRoom->findChildren<TPanel *>();
	QPoint lastFloatingPos = QPoint(0, 0);
	for (int i = 0; i < list.size(); i++) {
		TPanel *panel = list.at(i);

		// we want floating panel (possibly hidden) with the correct name
		if (panel->getPanelType() == panelType && panel->isFloating()) {

			// if there is already a floating panel and MultipleInstances are
			// not allowed we must use it
			if (!panel->areMultipleInstancesAllowed() && !panel->isHidden()) {
				activateWidget(panel);
				return panel;
			}

			// If there is a hidden panel we can show and use it
			if (panel->isHidden()) {
				//Alcuni pannelli devono essere resettati (Es.: il paletteViewerPanel)
				panel->reset();
				//Devo porre il pannello sotto il controllo del layout della stanza
				currentRoom->addDockWidget(panel);
				panel->show();
				panel->raise();
				return panel;
			} else
				lastFloatingPos = panel->pos();
		}
	}

	// No panel found. We must create a new pane
	TPanel *panel = TPanelFactory::createPanel(
		currentRoom,
		QString::fromStdString(panelType));
	if (!panel)
		return 0; // it should never happen
	// panel->setWindowTitle(QObject::tr(m_title.toStdString().c_str()));
	panel->setFloating(true);
	panel->show();
	panel->raise();
	if (!lastFloatingPos.isNull())
		panel->move(QPoint(lastFloatingPos.x() + 30, lastFloatingPos.y() + 30));

	return panel;
}