Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "messagepanel.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/menubarcommand.h"
Toshihiro Shimizu 890ddd
#include "menubarcommandids.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "tapp.h"
Toshihiro Shimizu 890ddd
#include "toonz/tscenehandle.h"
Toshihiro Shimizu 890ddd
#include "mainwindow.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include <qtextedit></qtextedit>
Toshihiro Shimizu 890ddd
#include <qpainter></qpainter>
Toshihiro Shimizu 890ddd
#include <qfontmetrics></qfontmetrics>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//==================================
Toshihiro Shimizu 890ddd
//    Centered Text Widget class
Toshihiro Shimizu 890ddd
//----------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka d1f6c4
class CenteredTextWidget final : public QWidget {
Shinya Kitaoka 120a6e
  QString m_text;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  CenteredTextWidget(QWidget *parent = 0) : QWidget(parent) {}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  void setText(const QString &text) { m_text = text; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
protected:
Shinya Kitaoka 473e70
  void paintEvent(QPaintEvent *) override {
Shinya Kitaoka 120a6e
    QPainter p(this);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    QFontMetrics fm    = p.fontMetrics();
Shinya Kitaoka 120a6e
    QString elidedText = fm.elidedText(m_text, Qt::ElideRight, width());
shun-iwasawa 443318
    qreal textWidth    = fm.horizontalAdvance(elidedText);
Shinya Kitaoka 120a6e
    p.drawText((width() - textWidth) * 0.5, (height() - fm.height()) * 0.5,
Shinya Kitaoka 120a6e
               elidedText);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//==============================
Toshihiro Shimizu 890ddd
//    MessagePanel methods
Toshihiro Shimizu 890ddd
//------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*! \class MessagePanel
Shinya Kitaoka 120a6e
                \brief MessagePanel class provides a pane to view a single,
Shinya Kitaoka 120a6e
   centered text message.
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
                Inherits \b TPanel.
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
MessagePanel::MessagePanel(QWidget *parent) : TPanel(parent) {
Shinya Kitaoka 120a6e
  setPanelType("Message");
Shinya Kitaoka 120a6e
  setWindowTitle("Message");
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_messageBox = new CenteredTextWidget(this);
Shinya Kitaoka 120a6e
  setWidget(m_messageBox);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
MessagePanel::~MessagePanel() {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void MessagePanel::setViewType(int viewType) { m_viewType = viewType; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
int MessagePanel::getViewType() { return m_viewType; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void MessagePanel::setPoolIndex(int poolIndex) { m_poolIndex = poolIndex; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
int MessagePanel::getPoolIndex() const { return m_poolIndex; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void MessagePanel::setMessage(QString text) { m_messageBox->setText(text); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
/*! \class LogPanel
Shinya Kitaoka 120a6e
                \brief The LogPanel class provide a pane to log text messages in
Shinya Kitaoka 120a6e
   a QTextEdit document.
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
                Inherits \b TPanel.
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
LogPanel::LogPanel(QWidget *parent, Qt::WindowFlags flags)
Shinya Kitaoka 120a6e
    : TPanel(parent), TLogger::Listener() {
Shinya Kitaoka 120a6e
  TLogger::instance()->addListener(this);
Shinya Kitaoka 120a6e
  TLogger::instance()->clearMessages();
Shinya Kitaoka 120a6e
  setPanelType("Log");
Shinya Kitaoka 120a6e
  setIsMaximizable(false);
Shinya Kitaoka 120a6e
  setWindowTitle("Log");
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  m_messageBox = new QTextEdit(this);
Shinya Kitaoka 120a6e
  m_messageBox->setObjectName("LogPanel");
Shinya Kitaoka 120a6e
  m_messageBox->setReadOnly(true);
Shinya Kitaoka 120a6e
  m_messageBox->setMinimumSize(200, 150);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  setWidget(m_messageBox);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  connect(TApp::instance()->getCurrentScene(), SIGNAL(sceneSwitched()), this,
Shinya Kitaoka 120a6e
          SLOT(clear()));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
LogPanel::~LogPanel() { TLogger::instance()->removeListener(this); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void LogPanel::onLogChanged() {
Shinya Kitaoka 120a6e
  TLogger *logger  = TLogger::instance();
Shinya Kitaoka 120a6e
  int messageCount = logger->getMessageCount();
Shinya Kitaoka 120a6e
  if (!messageCount) return;
Shinya Kitaoka 120a6e
  TLogger::Message message  = logger->getMessage(messageCount - 1);
Shinya Kitaoka 120a6e
  TLogger::MessageType type = message.getType();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  m_messageBox->moveCursor(QTextCursor::End);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  QString strCount;
Shinya Kitaoka 120a6e
  ;
Shinya Kitaoka 120a6e
  m_messageBox->insertPlainText(strCount.setNum(messageCount) + QString("> "));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (type == TLogger::Debug) {
Shinya Kitaoka 120a6e
    m_messageBox->setTextColor(Qt::blue);
Shinya Kitaoka 120a6e
    m_messageBox->insertPlainText(QString("Debug: "));
Shinya Kitaoka 120a6e
  } else if (type == TLogger::Info) {
Shinya Kitaoka 120a6e
    m_messageBox->setTextColor(QColor(0, 200, 0));
Shinya Kitaoka 120a6e
    m_messageBox->insertPlainText(QString("Info: "));
Shinya Kitaoka 120a6e
  } else if (type == TLogger::Warning) {
Shinya Kitaoka 120a6e
    m_messageBox->setTextColor(QColor(255, 200, 0));
Shinya Kitaoka 120a6e
    m_messageBox->insertPlainText(QString("Warning: "));
Shinya Kitaoka 120a6e
  } else if (type == TLogger::Error) {
Shinya Kitaoka 120a6e
    m_messageBox->setTextColor(Qt::red);
Shinya Kitaoka 120a6e
    m_messageBox->insertPlainText(QString("Error: "));
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  m_messageBox->setTextColor(Qt::black);
Shinya Kitaoka 120a6e
  m_messageBox->insertPlainText(QString::fromStdString(message.getText()) +
Shinya Kitaoka 120a6e
                                QString("\n"));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! Clear panel text box from all messages.
shun-iwasawa 443318
 */
Shinya Kitaoka 120a6e
void LogPanel::clear() {
Shinya Kitaoka 120a6e
  TLogger::instance()->clearMessages();
Shinya Kitaoka 120a6e
  m_messageBox->clear();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
// OpenFloatingLogPanel
Toshihiro Shimizu 890ddd
Shinya Kitaoka d1f6c4
class OpenFloatingLogPanel final : public MenuItemHandler {
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  OpenFloatingLogPanel() : MenuItemHandler(MI_OpenMessage) {}
Shinya Kitaoka 473e70
  void execute() override {
Shinya Kitaoka 120a6e
    TMainWindow *currentRoom = TApp::instance()->getCurrentRoom();
Shinya Kitaoka 120a6e
    if (currentRoom) {
Shinya Kitaoka 120a6e
      QList<tpanel *=""> list = currentRoom->findChildren<tpanel *="">();</tpanel></tpanel>
Shinya Kitaoka 120a6e
      for (int i = 0; i < list.size(); i++) {
Shinya Kitaoka 120a6e
        TPanel *pane = list.at(i);
Shinya Kitaoka 120a6e
        // If the pane is hidden, floating and have the same name
Shinya Kitaoka 120a6e
        if (pane->isHidden() && pane->isFloating() &&
Shinya Kitaoka 120a6e
            pane->getPanelType() == "Message") {
Shinya Kitaoka 120a6e
          pane->show();
Shinya Kitaoka 120a6e
          pane->raise();
Shinya Kitaoka 120a6e
          return;
Shinya Kitaoka 120a6e
        }
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      TPanel *pane = TPanelFactory::createPanel(currentRoom, "Message");
Shinya Kitaoka 120a6e
      pane->setFloating(true);
Shinya Kitaoka 120a6e
      pane->show();
Shinya Kitaoka 120a6e
      pane->raise();
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
} openFloatingLogPanelCommand;