CmQtEditorWindow.cpp 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. #include "CmQtEditorWindow.h"
  2. #include <QtWidgets/QTabWidget>
  3. #include <QtWidgets/QPushButton>
  4. #include <QtWidgets/QLayout>
  5. #include <QtWidgets/QLabel>
  6. #include <QtWidgets/QApplication>
  7. #include <QtGui/QMouseEvent>
  8. #include <QtGui/QPainter>
  9. #include "CmDebug.h"
  10. #include "CmWindowDockManager.h"
  11. namespace CamelotEditor
  12. {
  13. QtEditorWindow::QtEditorWindow(QWidget* parent, const QString& title)
  14. :QWidget(parent), mResizeMode(RM_NONE), mMoveMode(false), mIsDocked(false)
  15. {
  16. setupUi(title);
  17. }
  18. void QtEditorWindow::setupUi(QString title)
  19. {
  20. setWindowFlags(Qt::Tool | Qt::FramelessWindowHint);
  21. /************************************************************************/
  22. /* TITLE BAR */
  23. /************************************************************************/
  24. mTitleBar = new QWidget(this);
  25. mTitleBar->setObjectName("titleBar");
  26. mLblTitle = new QLabel(this);
  27. mLblTitle->setAttribute(Qt::WA_TransparentForMouseEvents);
  28. mBtnClose = new QPushButton(this);
  29. QHBoxLayout* titleLayout = new QHBoxLayout(this);
  30. titleLayout->setMargin(0);
  31. titleLayout->addWidget(mLblTitle, 1);
  32. titleLayout->addWidget(mBtnClose);
  33. mTitleBar->setLayout(titleLayout);
  34. /************************************************************************/
  35. /* CENTRAL LAYOUT */
  36. /************************************************************************/
  37. mCentralWidget = new QWidget(this);
  38. mCentralWidget->setObjectName("window");
  39. mContent = new QWidget(this);
  40. QVBoxLayout* centralLayout = new QVBoxLayout(this);
  41. centralLayout->setMargin(0);
  42. centralLayout->addWidget(mCentralWidget);
  43. setLayout(centralLayout);
  44. QVBoxLayout* mainLayout = new QVBoxLayout(this);
  45. mainLayout->setMargin(0);
  46. mainLayout->setContentsMargins(2, 0, 2, 2);
  47. mainLayout->setSpacing(0);
  48. mainLayout->addWidget(mTitleBar);
  49. mainLayout->addWidget(mContent, 1);
  50. mCentralWidget->setLayout(mainLayout);
  51. /************************************************************************/
  52. /* OTHER */
  53. /************************************************************************/
  54. // Style sheets // TODO - Load this from disk from unified storage
  55. mTitleBar->setStyleSheet("QWidget#titleBar { background-color : rgb(157, 208, 250) }");
  56. mCentralWidget->setStyleSheet("#window { border-style: solid; border-width: 2px; border-color: rgb(157, 208, 250); }");
  57. //setAttribute(Qt::WA_TransparentForMouseEvents);
  58. retranslateUi(title);
  59. setupSignals();
  60. }
  61. void QtEditorWindow::setupSignals()
  62. {
  63. connect(mBtnClose, SIGNAL(clicked()), this, SLOT(closeWindow()));
  64. }
  65. void QtEditorWindow::retranslateUi(QString title)
  66. {
  67. mLblTitle->setText(title);
  68. mBtnClose->setText(tr("Close"));
  69. }
  70. QSizePolicy QtEditorWindow::sizePolicy() const
  71. {
  72. return QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
  73. }
  74. void QtEditorWindow::undock()
  75. {
  76. if(mIsDocked)
  77. {
  78. setWindowFlags(Qt::Tool | Qt::FramelessWindowHint);
  79. mIsDocked = false;
  80. }
  81. }
  82. void QtEditorWindow::dock()
  83. {
  84. if(!mIsDocked)
  85. {
  86. setWindowFlags(Qt::Widget);
  87. mIsDocked = true;
  88. }
  89. }
  90. void QtEditorWindow::mousePressEvent(QMouseEvent* event)
  91. {
  92. if(event->buttons() & Qt::LeftButton)
  93. {
  94. if(isOverResizeArea(event->globalPos()))
  95. {
  96. mResizeMode = getResizeMode(event->globalPos());
  97. }
  98. else if(isOverDragArea(event->globalPos()))
  99. {
  100. mMoveMode = true;
  101. QPoint globalTopLeft = mapToGlobal(QPoint(0, 0));
  102. mDragOffset = QPoint(globalTopLeft.x() - event->globalPos().x(), globalTopLeft.y() - event->globalPos().y());
  103. }
  104. event->accept();
  105. }
  106. QWidget::mousePressEvent(event);
  107. }
  108. void QtEditorWindow::mouseReleaseEvent(QMouseEvent* event)
  109. {
  110. if(mMoveMode)
  111. {
  112. gWindowDockManager().windowReleased(this, event->globalPos());
  113. }
  114. mMoveMode = false;
  115. mResizeMode = RM_NONE;
  116. QWidget::mouseReleaseEvent(event);
  117. }
  118. void QtEditorWindow::mouseMoveEvent(QMouseEvent* event)
  119. {
  120. if(mMoveMode)
  121. {
  122. QPoint globalPos = mapToGlobal(event->pos());
  123. gWindowDockManager().windowDragged(this, globalPos);
  124. if(!mIsDocked)
  125. move(event->globalPos() + mDragOffset);
  126. event->accept();
  127. }
  128. else if(mResizeMode != RM_NONE)
  129. {
  130. if(!isDocked())
  131. {
  132. int left = geometry().left();
  133. int width = geometry().width();
  134. int top = geometry().top();
  135. int height = geometry().height();
  136. if (mResizeMode & RM_LEFT)
  137. {
  138. width = width + (left - event->globalPos().x());
  139. left = event->globalPos().x();
  140. }
  141. if(mResizeMode & RM_RIGHT)
  142. {
  143. width = event->globalPos().x() - left;
  144. }
  145. if(mResizeMode & RM_TOP)
  146. {
  147. height = height + (top - event->globalPos().y());
  148. top = event->globalPos().y();
  149. }
  150. if(mResizeMode & RM_BOTTOM)
  151. {
  152. height = event->globalPos().y() - top;
  153. }
  154. setGeometry(left, top, width, height);
  155. updateGeometry();
  156. }
  157. }
  158. QWidget::mouseMoveEvent(event);
  159. }
  160. void QtEditorWindow::closeWindow()
  161. {
  162. gWindowDockManager().windowClosed(this);
  163. close();
  164. }
  165. QtEditorWindow::ResizeMode QtEditorWindow::getResizeMode(QPoint mousePos)
  166. {
  167. QPoint localMousePos = mapFromGlobal(mousePos);
  168. QPoint topLeft = mapFromParent(geometry().topLeft());
  169. QPoint botRight = mapFromParent(geometry().bottomRight());
  170. int distFromRight = botRight.x() - localMousePos.x();
  171. int distFromLeft = localMousePos.x() - topLeft.x();
  172. int distFromBot = botRight.y() - localMousePos.y();
  173. int distFromTop = localMousePos.y() - topLeft.y();
  174. if(distFromRight <= RESIZE_BORDER_SIZE && distFromRight >= 0 && distFromBot <= RESIZE_BORDER_SIZE && distFromBot >= 0)
  175. return (ResizeMode)(RM_BOTTOM | RM_RIGHT);
  176. if(distFromLeft <= RESIZE_BORDER_SIZE && distFromLeft >= 0 && distFromTop <= RESIZE_BORDER_SIZE && distFromTop >= 0)
  177. return (ResizeMode)(RM_TOP | RM_LEFT);
  178. if(distFromLeft <= RESIZE_BORDER_SIZE && distFromLeft >= 0 && distFromBot <= RESIZE_BORDER_SIZE && distFromBot >= 0)
  179. return (ResizeMode)(RM_BOTTOM | RM_LEFT);
  180. if(distFromRight <= RESIZE_BORDER_SIZE && distFromRight >= 0 && distFromTop <= RESIZE_BORDER_SIZE && distFromTop >= 0)
  181. return (ResizeMode)(RM_TOP | RM_RIGHT);
  182. if(distFromRight <= RESIZE_BORDER_SIZE && distFromRight >= 0)
  183. return RM_RIGHT;
  184. if(distFromLeft <= RESIZE_BORDER_SIZE && distFromLeft >= 0)
  185. return RM_LEFT;
  186. if(distFromBot <= RESIZE_BORDER_SIZE && distFromBot >= 0)
  187. return RM_BOTTOM;
  188. if(distFromTop <= RESIZE_BORDER_SIZE && distFromTop >= 0)
  189. return RM_TOP;
  190. return RM_NONE;
  191. }
  192. bool QtEditorWindow::isOverResizeArea(QPoint mousePos)
  193. {
  194. QPoint localMousePos = mapFromGlobal(mousePos);
  195. int distFromRight = geometry().width() - localMousePos.x();
  196. int distFromLeft = localMousePos.x();
  197. int distFromBot = geometry().height() - localMousePos.y();
  198. int distFromTop = localMousePos.y();
  199. if(distFromRight <= RESIZE_BORDER_SIZE && distFromRight >= 0)
  200. return true;
  201. if(distFromLeft <= RESIZE_BORDER_SIZE && distFromLeft >= 0)
  202. return true;
  203. if(distFromBot <= RESIZE_BORDER_SIZE && distFromBot >= 0)
  204. return true;
  205. if(distFromTop <= RESIZE_BORDER_SIZE && distFromTop >= 0)
  206. return true;
  207. return false;
  208. }
  209. bool QtEditorWindow::isOverDragArea(QPoint mousePos)
  210. {
  211. if(getResizeMode(mousePos) != RM_NONE)
  212. return false;
  213. QPoint localMousePos = mapFromGlobal(mousePos);
  214. int distFromTop = localMousePos.y();
  215. if(distFromTop <= TITLE_BAR_HEIGHT)
  216. return true;
  217. return false;
  218. }
  219. }