PageRenderTime 26ms CodeModel.GetById 16ms RepoModel.GetById 1ms app.codeStats 0ms

/src/gui/qgsmessagebaritem.cpp

http://github.com/qgis/Quantum-GIS
C++ | 289 lines | 237 code | 30 blank | 22 comment | 33 complexity | 6e6e72f3fe7d2ce220ad2dbdd02a9eba MD5 | raw file
Possible License(s): LGPL-2.0, GPL-3.0, GPL-2.0, CC-BY-SA-3.0, MIT, 0BSD, BSD-3-Clause
  1. /***************************************************************************
  2. qgsmessagebaritem.h - description
  3. -------------------
  4. begin : August 2013
  5. copyright : (C) 2013 by Denis Rouzaud
  6. email : denis.rouzaud@gmail.com
  7. ***************************************************************************/
  8. /***************************************************************************
  9. * *
  10. * This program is free software; you can redistribute it and/or modify *
  11. * it under the terms of the GNU General Public License as published by *
  12. * the Free Software Foundation; either version 2 of the License, or *
  13. * (at your option) any later version. *
  14. * *
  15. ***************************************************************************/
  16. #include "qgsapplication.h"
  17. #include "qgsmessagebaritem.h"
  18. #include "qgsmessagebar.h"
  19. #include "qgsgui.h"
  20. #include "qgsnative.h"
  21. #include <QHBoxLayout>
  22. #include <QLabel>
  23. #include <QTextBrowser>
  24. #include <QDesktopServices>
  25. #include <QFileInfo>
  26. QgsMessageBarItem::QgsMessageBarItem( const QString &text, Qgis::MessageLevel level, int duration, QWidget *parent )
  27. : QWidget( parent )
  28. , mText( text )
  29. , mLevel( level )
  30. , mDuration( duration )
  31. {
  32. writeContent();
  33. }
  34. QgsMessageBarItem::QgsMessageBarItem( const QString &title, const QString &text, Qgis::MessageLevel level, int duration, QWidget *parent )
  35. : QWidget( parent )
  36. , mTitle( title )
  37. , mText( text )
  38. , mLevel( level )
  39. , mDuration( duration )
  40. {
  41. writeContent();
  42. }
  43. QgsMessageBarItem::QgsMessageBarItem( const QString &title, const QString &text, QWidget *widget, Qgis::MessageLevel level, int duration, QWidget *parent )
  44. : QWidget( parent )
  45. , mTitle( title )
  46. , mText( text )
  47. , mLevel( level )
  48. , mDuration( duration )
  49. , mWidget( widget )
  50. , mUserIcon( QIcon() )
  51. {
  52. writeContent();
  53. }
  54. QgsMessageBarItem::QgsMessageBarItem( QWidget *widget, Qgis::MessageLevel level, int duration, QWidget *parent )
  55. : QWidget( parent )
  56. , mLevel( level )
  57. , mDuration( duration )
  58. , mWidget( widget )
  59. , mUserIcon( QIcon() )
  60. {
  61. writeContent();
  62. }
  63. void QgsMessageBarItem::writeContent()
  64. {
  65. if ( !mLayout )
  66. {
  67. mLayout = new QHBoxLayout( this );
  68. mLayout->setContentsMargins( 0, 0, 0, 0 );
  69. mTextBrowser = nullptr;
  70. mLblIcon = nullptr;
  71. }
  72. // ICON
  73. if ( !mLblIcon )
  74. {
  75. mLblIcon = new QLabel( this );
  76. mLayout->addWidget( mLblIcon );
  77. }
  78. QIcon icon;
  79. if ( !mUserIcon.isNull() )
  80. {
  81. icon = mUserIcon;
  82. }
  83. else
  84. {
  85. QString msgIcon( QStringLiteral( "/mIconInfo.svg" ) );
  86. switch ( mLevel )
  87. {
  88. case Qgis::Critical:
  89. msgIcon = QStringLiteral( "/mIconCritical.svg" );
  90. break;
  91. case Qgis::Warning:
  92. msgIcon = QStringLiteral( "/mIconWarning.svg" );
  93. break;
  94. case Qgis::Success:
  95. msgIcon = QStringLiteral( "/mIconSuccess.svg" );
  96. break;
  97. default:
  98. break;
  99. }
  100. icon = QgsApplication::getThemeIcon( msgIcon );
  101. }
  102. const int iconSize = std::max( 24.0, fontMetrics().height() * 1.2 );
  103. mLblIcon->setPixmap( icon.pixmap( iconSize ) );
  104. // STYLESHEETS
  105. QString contentStyleSheet;
  106. if ( mLevel == Qgis::Success )
  107. {
  108. mStyleSheet = QStringLiteral( "QgsMessageBar { background-color: #dff0d8; border: 1px solid #8e998a; } "
  109. "QLabel,QTextEdit { color: black; } " );
  110. contentStyleSheet = QStringLiteral( "<style> a, a:visited, a:hover { color:#268300; } </style>" );
  111. }
  112. else if ( mLevel == Qgis::Critical )
  113. {
  114. mStyleSheet = QStringLiteral( "QgsMessageBar { background-color: #d65253; border: 1px solid #9b3d3d; } "
  115. "QLabel,QTextEdit { color: white; } " );
  116. contentStyleSheet = QStringLiteral( "<style>a, a:visited, a:hover { color:#4e0001; }</style>" );
  117. }
  118. else if ( mLevel == Qgis::Warning )
  119. {
  120. mStyleSheet = QStringLiteral( "QgsMessageBar { background-color: #ffc800; border: 1px solid #e0aa00; } "
  121. "QLabel,QTextEdit { color: black; } " );
  122. contentStyleSheet = QStringLiteral( "<style>a, a:visited, a:hover { color:#945a00; }</style>" );
  123. }
  124. else if ( mLevel == Qgis::Info )
  125. {
  126. mStyleSheet = QStringLiteral( "QgsMessageBar { background-color: #e7f5fe; border: 1px solid #b9cfe4; } "
  127. "QLabel,QTextEdit { color: #2554a1; } " );
  128. contentStyleSheet = QStringLiteral( "<style>a, a:visited, a:hover { color:#3bb2fe; }</style>" );
  129. }
  130. mStyleSheet += QStringLiteral( "QLabel#mItemCount { font-style: italic; }" );
  131. // TITLE AND TEXT
  132. if ( mTitle.isEmpty() && mText.isEmpty() )
  133. {
  134. if ( mTextBrowser )
  135. {
  136. delete mTextBrowser;
  137. mTextBrowser = nullptr;
  138. }
  139. }
  140. else
  141. {
  142. if ( !mTextBrowser )
  143. {
  144. mTextBrowser = new QTextBrowser( this );
  145. mTextBrowser->setObjectName( QStringLiteral( "textEdit" ) );
  146. mTextBrowser->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Maximum );
  147. mTextBrowser->setReadOnly( true );
  148. mTextBrowser->setOpenLinks( false );
  149. connect( mTextBrowser, &QTextBrowser::anchorClicked, this, &QgsMessageBarItem::urlClicked );
  150. mTextBrowser->setFrameShape( QFrame::NoFrame );
  151. // stylesheet set here so Qt-style substitued scrollbar arrows can show within limited height
  152. // adjusts to height of font set in app options
  153. mTextBrowser->setStyleSheet( "QTextEdit { background-color: rgba(0,0,0,0); margin-top: 0.25em; max-height: 1.75em; min-height: 1.75em; } "
  154. "QScrollBar { background-color: rgba(0,0,0,0); } "
  155. "QScrollBar::add-page,QScrollBar::sub-page,QScrollBar::handle { background-color: rgba(0,0,0,0); color: rgba(0,0,0,0); } "
  156. "QScrollBar::up-arrow,QScrollBar::down-arrow { color: rgb(0,0,0); } " );
  157. mLayout->addWidget( mTextBrowser );
  158. }
  159. QString content = mText;
  160. if ( !mTitle.isEmpty() )
  161. {
  162. // add ':' to end of title
  163. QString t = mTitle.trimmed();
  164. if ( !content.isEmpty() && !t.endsWith( ':' ) && !t.endsWith( QLatin1String( ": " ) ) )
  165. t += QLatin1String( ": " );
  166. content.prepend( QStringLiteral( "<b>" ) + t + " </b>" );
  167. }
  168. content.prepend( contentStyleSheet );
  169. mTextBrowser->setText( content );
  170. }
  171. // WIDGET
  172. if ( mWidget )
  173. {
  174. QLayoutItem *item = mLayout->itemAt( 2 );
  175. if ( !item || item->widget() != mWidget )
  176. {
  177. mLayout->addWidget( mWidget );
  178. }
  179. }
  180. }
  181. QgsMessageBarItem *QgsMessageBarItem::setText( const QString &text )
  182. {
  183. mText = text;
  184. writeContent();
  185. return this;
  186. }
  187. QString QgsMessageBarItem::text() const
  188. {
  189. return mText;
  190. }
  191. QgsMessageBarItem *QgsMessageBarItem::setTitle( const QString &title )
  192. {
  193. mTitle = title;
  194. writeContent();
  195. return this;
  196. }
  197. QString QgsMessageBarItem::title() const
  198. {
  199. return mTitle;
  200. }
  201. QgsMessageBarItem *QgsMessageBarItem::setLevel( Qgis::MessageLevel level )
  202. {
  203. mLevel = level;
  204. writeContent();
  205. emit styleChanged( mStyleSheet );
  206. return this;
  207. }
  208. Qgis::MessageLevel QgsMessageBarItem::level() const
  209. {
  210. return mLevel;
  211. }
  212. QgsMessageBarItem *QgsMessageBarItem::setWidget( QWidget *widget )
  213. {
  214. if ( mWidget )
  215. {
  216. QLayoutItem *item = nullptr;
  217. item = mLayout->itemAt( 2 );
  218. if ( item->widget() == mWidget )
  219. {
  220. delete item->widget();
  221. }
  222. }
  223. mWidget = widget;
  224. writeContent();
  225. return this;
  226. }
  227. QWidget *QgsMessageBarItem::widget() const
  228. {
  229. return mWidget;
  230. }
  231. QgsMessageBarItem *QgsMessageBarItem::setIcon( const QIcon &icon )
  232. {
  233. mUserIcon = icon;
  234. return this;
  235. }
  236. QIcon QgsMessageBarItem::icon() const
  237. {
  238. return mUserIcon;
  239. }
  240. QgsMessageBarItem *QgsMessageBarItem::setDuration( int duration )
  241. {
  242. mDuration = duration;
  243. return this;
  244. }
  245. void QgsMessageBarItem::dismiss()
  246. {
  247. if ( !mMessageBar )
  248. return;
  249. mMessageBar->popWidget( this );
  250. }
  251. void QgsMessageBarItem::urlClicked( const QUrl &url )
  252. {
  253. QFileInfo file( url.toLocalFile() );
  254. if ( file.exists() && !file.isDir() )
  255. QgsGui::instance()->nativePlatformInterface()->openFileExplorerAndSelectFile( url.toLocalFile() );
  256. else
  257. QDesktopServices::openUrl( url );
  258. dismiss();
  259. }