#pragma once

#ifndef TDOCKWINDOWS_H
#define TDOCKWINDOWS_H

#include "tcommon.h"

#include "docklayout.h"

#include <QFrame>

#undef DVAPI
#undef DVVAR
#ifdef TOONZQT_EXPORTS
#define DVAPI DV_EXPORT_API
#define DVVAR DV_EXPORT_VAR
#else
#define DVAPI DV_IMPORT_API
#define DVVAR DV_IMPORT_VAR
#endif

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

// Forward declarations
class TDockWidget;

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

//-----------------------
//    TMainWindow
//-----------------------

/*!
TMainWindow class is intended as a convenience QMainWindow-like interface
for DockLayout.

\sa TDockWidget class.
*/
class DVAPI TMainWindow : public QWidget {
  Q_OBJECT  // Just needed by qobject_cast, for now

      DockLayout *m_layout;
  QWidget *m_menu;

public:
  TMainWindow(QWidget *parent = 0, Qt::WindowFlags flags = Qt::WindowFlags());
  virtual ~TMainWindow();

  void addDockWidget(TDockWidget *item);
  void removeDockWidget(TDockWidget *item);

  void setMenuWidget(QWidget *menubar);
  QWidget *menuWidget() const { return m_menu; }

  // Style options
  void setDecoAllocator(DockDecoAllocator *allocator);
  void setSeparatorsThickness(int thick);

  DockLayout *dockLayout() const { return m_layout; }

protected:
  void resizeEvent(QResizeEvent *event) override;
};

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

//-------------------
//    TDockWidget
//-------------------

/*!
TDockWidget class is a convenience QDockWidget-like interface to DockWidget
class. It provides an internal base layout including a titlebar and a
content widget.

\sa TMainWindow class.
*/
class DVAPI TDockWidget : public DockWidget {
  Q_OBJECT  // Needed by qobject_cast

      QWidget *m_titlebar;
  QWidget *m_widget;

  int m_margin;

public:
  TDockWidget(const QString &title, QWidget *parent = 0,
              Qt::WindowFlags flags = Qt::WindowFlags());
  TDockWidget(QWidget *parent = 0, Qt::WindowFlags flags = Qt::WindowFlags());
  ~TDockWidget() {}

  void setTitleBarWidget(QWidget *titlebar);
  QWidget *titleBarWidget() const { return m_titlebar; }
  void setFloatingMargin(int margin) { m_margin = margin; }
  int getFloatingMargin() const { return m_margin; }

  void setWidget(QWidget *widget);
  QWidget *widget() const { return m_widget; }

  void setFloating(bool status = true);
  void setMaximized(bool status = true);

  enum Orientation { horizontal = 0, vertical = 1 };
  void setOrientation(bool direction = vertical);
  bool getOrientation() const;

protected:
  // Subclasses may override these to react to dock/float state changes.
  // They are called on all code paths: interactive dock/undock AND workspace restore.
  void setFloatingAppearance() override;
  void setDockedAppearance() override;

private:
  QSize getDockedMinimumSize() override;
  QSize getDockedMaximumSize() override;

  void selectDockPlaceholder(QMouseEvent *me) override;

  bool isDragGrip(QPoint p) override;
  int isResizeGrip(QPoint p) override;

  void windowTitleEvent(QEvent *e) override;
};

#endif  // TDOCKWINDOWS_H
