ソースを参照

ENH: Improved ctkFittedTextBrowser API

setText methods were not virtual in base class, which made method calls from Python unpredictable.
Introduced new methods for setting collapsible text.

Also fixed const-correctness in ctkFittedTextBrowserPrivate class.
Andras Lasso 8 年 前
コミット
3b8b142ae8
共有4 個のファイルを変更した131 個の追加182 個の削除を含む
  1. 5 8
      Libs/Widgets/Testing/Cpp/ctkFittedTextBrowserTest1.cpp
  2. 67 125
      Libs/Widgets/ctkFittedTextBrowser.cpp
  3. 35 24
      Libs/Widgets/ctkFittedTextBrowser.h
  4. 24 25
      Libs/Widgets/ctkFittedTextBrowser_p.h

+ 5 - 8
Libs/Widgets/Testing/Cpp/ctkFittedTextBrowserTest1.cpp

@@ -51,31 +51,28 @@ int ctkFittedTextBrowserTest1(int argc, char * argv [] )
   layout->addWidget(&textBrowserWidget);
 
   ctkFittedTextBrowser textBrowserWidgetCollapsibleText(&widget);
-  textBrowserWidgetCollapsibleText.setCollapsible(true);
-  textBrowserWidgetCollapsibleText.setText(
+  textBrowserWidgetCollapsibleText.setCollapsibleText(
     "This is the teaser for auto-text.\n More details are here.\n"
     "This is a very very, very very very, very very, very very very, very very, very very very long line\n"
     "Some more lines 1.\n"
     "Some more lines 2.\n"
     "Some more, some more.");
-  textBrowserWidgetCollapsibleText.setShowMoreText(">>>");
-  textBrowserWidgetCollapsibleText.setShowLessText("<<<");
+  textBrowserWidgetCollapsibleText.setShowDetailsText(">>>");
+  textBrowserWidgetCollapsibleText.setHideDetailsText("<<<");
   layout->addWidget(&textBrowserWidgetCollapsibleText);
 
   ctkFittedTextBrowser textBrowserWidgetCollapsibleHtml(&widget);
-  textBrowserWidgetCollapsibleHtml.setHtml(
+  textBrowserWidgetCollapsibleHtml.setCollapsibleHtml(
     "This is the teaser for html.<br>"
     "More details are here."
     "This is a very very, very very very, very very, very very very, very very, very very very long line\n"
     "Some more lines 1."
     "Some more lines 2."
     "Some more, some more.");
-  textBrowserWidgetCollapsibleHtml.setCollapsible(true);
   layout->addWidget(&textBrowserWidgetCollapsibleHtml);
 
   ctkFittedTextBrowser textBrowserWidgetCollapsibleComplexHtml(&widget);
-  textBrowserWidgetCollapsibleComplexHtml.setCollapsible(true);
-  textBrowserWidgetCollapsibleComplexHtml.setHtml(
+  textBrowserWidgetCollapsibleComplexHtml.setCollapsibleHtml(
     "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\"><html>"
     "<head><meta name=\"qrichtext\" content=\"1\" /> <style type=\"text/css\"> p, li { white-space: pre-wrap; } </style></head>"
     "<body style=\" font-family:'MS Shell Dlg 2'; font-size:12.25pt; font-weight:400; font-style:normal;\">"

+ 67 - 125
Libs/Widgets/ctkFittedTextBrowser.cpp

@@ -28,19 +28,18 @@
 #include "ctkFittedTextBrowser.h"
 #include "ctkFittedTextBrowser_p.h"
 
-static const char moreAnchor[] = "more";
-static const char lessAnchor[] = "less";
+static const char moreAnchor[] = "show_details";
+static const char lessAnchor[] = "hide_details";
 
 //-----------------------------------------------------------------------------
 ctkFittedTextBrowserPrivate::ctkFittedTextBrowserPrivate(ctkFittedTextBrowser& object)
   :q_ptr(&object)
 {
-  this->Collapsible = false;
   this->Collapsed = true;
-  this->FullTextSetter = ctkFittedTextBrowserPrivate::Text;
-  this->ShowMoreText = object.tr("More...");
-  this->ShowLessText = object.tr("Hide details.");
-  QString ShowLessText;
+  this->CollapsibleTextSetter = ctkFittedTextBrowserPrivate::Text;
+  this->ShowDetailsText = object.tr("Show details...");
+  this->HideDetailsText = object.tr("Hide details.");
+  QString HideDetailsText;
 }
 
 //-----------------------------------------------------------------------------
@@ -49,46 +48,32 @@ ctkFittedTextBrowserPrivate::~ctkFittedTextBrowserPrivate()
 }
 
 //-----------------------------------------------------------------------------
-QString ctkFittedTextBrowserPrivate::collapsibleText()
+void ctkFittedTextBrowserPrivate::updateCollapsedText()
 {
   Q_Q(ctkFittedTextBrowser);
-  bool html = (this->FullTextSetter == ctkFittedTextBrowserPrivate::Html || this->FullText.indexOf("<html>") >= 0);
+  bool html = (this->CollapsibleTextSetter == ctkFittedTextBrowserPrivate::Html || this->CollapsibleText.indexOf("<html>") >= 0);
   if (html)
   {
-    return this->collapsibleHtml();
+    q->setHtml(this->collapsedTextFromHtml());
   }
   else
   {
-    return this->collapsiblePlainText();
+    q->setHtml(this->collapsedTextFromPlainText());
   }
 }
 
 //-----------------------------------------------------------------------------
-QString ctkFittedTextBrowserPrivate::collapseLinkText()
+QString ctkFittedTextBrowserPrivate::collapsedTextFromPlainText() const
 {
-  Q_Q(ctkFittedTextBrowser);
-  if (this->Collapsed)
-  {
-    return QString(" <a href=\"#") + moreAnchor + "\">" + this->ShowMoreText + "</a>";
-  }
-  else
-  {
-    return QString(" <a href=\"#") + lessAnchor + "\">" + this->ShowLessText + "</a>";
-  }
-}
-
-//-----------------------------------------------------------------------------
-QString ctkFittedTextBrowserPrivate::collapsiblePlainText()
-{
-  Q_Q(ctkFittedTextBrowser);
-  int teaserEndPosition = this->FullText.indexOf("\n");
+  Q_Q(const ctkFittedTextBrowser);
+  int teaserEndPosition = this->CollapsibleText.indexOf("\n");
   if (teaserEndPosition < 0)
   {
-    return this->FullText;
+    return this->CollapsibleText;
   }
   QString finalText;
   finalText.append("<html>");
-  finalText.append(this->Collapsed ? this->FullText.left(teaserEndPosition) : this->FullText);
+  finalText.append(this->Collapsed ? this->CollapsibleText.left(teaserEndPosition) : this->CollapsibleText);
   finalText.append(this->collapseLinkText());
   finalText.append("</html>");
   // Remove line break to allow continuation of line.
@@ -100,17 +85,17 @@ QString ctkFittedTextBrowserPrivate::collapsiblePlainText()
 }
 
 //-----------------------------------------------------------------------------
-QString ctkFittedTextBrowserPrivate::collapsibleHtml()
+QString ctkFittedTextBrowserPrivate::collapsedTextFromHtml() const
 {
-  Q_Q(ctkFittedTextBrowser);
+  Q_Q(const ctkFittedTextBrowser);
   const QString lineBreak("<br>");
-  int teaserEndPosition = this->FullText.indexOf(lineBreak);
+  int teaserEndPosition = this->CollapsibleText.indexOf(lineBreak);
   if (teaserEndPosition < 0)
   {
-    return this->FullText;
+    return this->CollapsibleText;
   }
 
-  QString finalText = this->FullText;
+  QString finalText = this->CollapsibleText;
   if (this->Collapsed)
   {
     finalText = finalText.left(teaserEndPosition) + this->collapseLinkText();
@@ -144,6 +129,20 @@ QString ctkFittedTextBrowserPrivate::collapsibleHtml()
 }
 
 //-----------------------------------------------------------------------------
+QString ctkFittedTextBrowserPrivate::collapseLinkText() const
+{
+  Q_Q(const ctkFittedTextBrowser);
+  if (this->Collapsed)
+  {
+    return QString(" <a href=\"#") + moreAnchor + "\">" + this->ShowDetailsText + "</a>";
+  }
+  else
+  {
+    return QString(" <a href=\"#") + lessAnchor + "\">" + this->HideDetailsText + "</a>";
+  }
+}
+
+//-----------------------------------------------------------------------------
 ctkFittedTextBrowser::ctkFittedTextBrowser(QWidget* _parent)
   : QTextBrowser(_parent)
   , d_ptr(new ctkFittedTextBrowserPrivate(*this))
@@ -228,53 +227,38 @@ void ctkFittedTextBrowser::resizeEvent(QResizeEvent* e)
 }
 
 //-----------------------------------------------------------------------------
-void ctkFittedTextBrowser::setText(const QString &text)
+void ctkFittedTextBrowser::setCollapsibleText(const QString &text)
 {
   Q_D(ctkFittedTextBrowser);
-  d->FullTextSetter = ctkFittedTextBrowserPrivate::Text;
-  if (d->Collapsible)
-    {
-    d->FullText = text;
-    QTextBrowser::setHtml(d->collapsibleText());
-    }
-  else
-    {
-    QTextBrowser::setText(text);
-    }
+  d->CollapsibleTextSetter = ctkFittedTextBrowserPrivate::Text;
+  d->CollapsibleText = text;
+  d->updateCollapsedText();
 }
 
 //-----------------------------------------------------------------------------
-void ctkFittedTextBrowser::setPlainText(const QString &text)
+QString ctkFittedTextBrowser::collapsibleText() const
+{
+  Q_D(const ctkFittedTextBrowser);
+  return d->CollapsibleText;
+}
+
+
+//-----------------------------------------------------------------------------
+void ctkFittedTextBrowser::setCollapsiblePlainText(const QString &text)
 {
   Q_D(ctkFittedTextBrowser);
-  d->FullTextSetter = ctkFittedTextBrowserPrivate::PlainText;
-  if (d->Collapsible)
-  {
-    d->FullText = text;
-    QTextBrowser::setHtml(d->collapsibleText());
-  }
-  else
-  {
-    QTextBrowser::setPlainText(text);
-  }
+  d->CollapsibleTextSetter = ctkFittedTextBrowserPrivate::PlainText;
+  d->CollapsibleText = text;
+  d->updateCollapsedText();
 }
 
 //-----------------------------------------------------------------------------
-void ctkFittedTextBrowser::setHtml(const QString &text)
+void ctkFittedTextBrowser::setCollapsibleHtml(const QString &text)
 {
   Q_D(ctkFittedTextBrowser);
-  d->FullTextSetter = ctkFittedTextBrowserPrivate::Html;
-  // always save the original text as well because use may make the widget
-  // collapsible at any time
-  d->FullText = text;
-  if (d->Collapsible)
-  {
-    QTextBrowser::setHtml(d->collapsibleText());
-  }
-  else
-  {
-    QTextBrowser::setHtml(text);
-  }
+  d->CollapsibleTextSetter = ctkFittedTextBrowserPrivate::Html;
+  d->CollapsibleText = text;
+  d->updateCollapsedText();
 }
 
 //-----------------------------------------------------------------------------
@@ -304,10 +288,7 @@ void ctkFittedTextBrowser::setCollapsed(bool collapsed)
     return;
   }
   d->Collapsed = collapsed;
-  if (d->Collapsible)
-  {
-    QTextBrowser::setHtml(d->collapsibleText());
-  }
+  d->updateCollapsedText();
 }
 
 //-----------------------------------------------------------------------------
@@ -318,80 +299,41 @@ bool ctkFittedTextBrowser::collapsed() const
 }
 
 //-----------------------------------------------------------------------------
-void ctkFittedTextBrowser::setCollapsible(bool collapsible)
+void ctkFittedTextBrowser::setShowDetailsText(const QString &text)
 {
   Q_D(ctkFittedTextBrowser);
-  if (d->Collapsible == collapsible)
+  if (d->ShowDetailsText == text)
   {
     // no change
     return;
   }
-  d->Collapsible = collapsible;
-  if (collapsible)
-  {
-    QTextBrowser::setHtml(d->collapsibleText());
-  }
-  else
-  {
-    switch (d->FullTextSetter)
-    {
-    case ctkFittedTextBrowserPrivate::Text: QTextBrowser::setText(d->FullText); break;
-    case ctkFittedTextBrowserPrivate::PlainText: QTextBrowser::setPlainText(d->FullText); break;
-    case ctkFittedTextBrowserPrivate::Html: QTextBrowser::setHtml(d->FullText); break;
-    default: QTextBrowser::setText(d->FullText); break;
-    }
-  }
+  d->ShowDetailsText = text;
+  d->updateCollapsedText();
 }
 
 //-----------------------------------------------------------------------------
-bool ctkFittedTextBrowser::collapsible() const
+QString ctkFittedTextBrowser::showDetailsText() const
 {
   Q_D(const ctkFittedTextBrowser);
-  return d->Collapsible;
+  return d->ShowDetailsText;
 }
 
 //-----------------------------------------------------------------------------
-void ctkFittedTextBrowser::setShowMoreText(const QString &text)
+void ctkFittedTextBrowser::setHideDetailsText(const QString &text)
 {
   Q_D(ctkFittedTextBrowser);
-  if (d->ShowMoreText == text)
+  if (d->HideDetailsText == text)
   {
     // no change
     return;
   }
-  d->ShowMoreText = text;
-  if (d->Collapsible)
-  {
-    QTextBrowser::setHtml(d->collapsibleText());
-  }
-}
-
-//-----------------------------------------------------------------------------
-QString ctkFittedTextBrowser::showMoreText() const
-{
-  Q_D(const ctkFittedTextBrowser);
-  return d->ShowMoreText;
-}
-
-//-----------------------------------------------------------------------------
-void ctkFittedTextBrowser::setShowLessText(const QString &text)
-{
-  Q_D(ctkFittedTextBrowser);
-  if (d->ShowLessText == text)
-  {
-    // no change
-    return;
-  }
-  d->ShowLessText = text;
-  if (d->Collapsible)
-  {
-    QTextBrowser::setHtml(d->collapsibleText());
-  }
+  d->HideDetailsText = text;
+  d->updateCollapsedText();
 }
 
 //-----------------------------------------------------------------------------
-QString ctkFittedTextBrowser::showLessText() const
+QString ctkFittedTextBrowser::hideDetailsText() const
 {
   Q_D(const ctkFittedTextBrowser);
-  return d->ShowLessText;
+  return d->HideDetailsText;
 }

+ 35 - 24
Libs/Widgets/ctkFittedTextBrowser.h

@@ -42,49 +42,35 @@ class ctkFittedTextBrowserPrivate;
 class CTK_WIDGETS_EXPORT ctkFittedTextBrowser : public QTextBrowser
 {
   Q_OBJECT
-  Q_PROPERTY(bool collapsible READ collapsible WRITE setCollapsible)
   Q_PROPERTY(bool collapsed READ collapsed WRITE setCollapsed)
-  Q_PROPERTY(QString showMoreText READ showMoreText WRITE setShowMoreText)
-  Q_PROPERTY(QString showLessText READ showLessText WRITE setShowLessText)
+  Q_PROPERTY(QString showDetailsText READ showDetailsText WRITE setShowDetailsText)
+  Q_PROPERTY(QString hideDetailsText READ hideDetailsText WRITE setHideDetailsText)
+
 
 public:
   ctkFittedTextBrowser(QWidget* parent = 0);
   virtual ~ctkFittedTextBrowser();
 
-  /// Show only first line with "More..." link to save space.
-  /// When the user clicks on the link then the full text is displayed
-  /// (and a "Less..." link).
-  /// The teaser is the beginning of the text up to the first newline character
-  /// (for plain text) or <br> tag (for html). The separator is removed when
-  /// the text is expanded so that the full text can continue on the same line
-  /// as the teaser.
-  void setCollapsible(bool collapsible);
-  /// Show only first line with "More..." link to save space.
-  bool collapsible() const;
-
   /// Show only first line/the full text.
   /// Only has effect if collapsible = true.
   void setCollapsed(bool collapsed);
   /// Show only first line/the full text.
   bool collapsed() const;
 
-  void setPlainText(const QString &text);
-#ifndef QT_NO_TEXTHTMLPARSER
-  void setHtml(const QString &text);
-#endif
-  void setText(const QString &text);
-
   /// Text that is displayed at the end of collapsed text.
   /// Clicking on the text expands the widget.
-  void setShowMoreText(const QString &text);
+  void setShowDetailsText(const QString &text);
   /// Text that is displayed at the end of collapsed text.
-  QString showMoreText()const;
+  QString showDetailsText()const;
 
   /// Text that is displayed at the end of non-collapsed text.
   /// Clicking on the text collapses the widget.
-  void setShowLessText(const QString &text);
+  void setHideDetailsText(const QString &text);
   /// Text that is displayed at the end of non-collapsed text.
-  QString showLessText()const;
+  QString hideDetailsText()const;
+
+  /// Return text set by setCollapsibleText.
+  Q_INVOKABLE QString collapsibleText() const;
 
   /// Reimplemented for internal reasons
   virtual QSize sizeHint() const;
@@ -93,6 +79,31 @@ public:
   /// Reimplemented for internal reasons
   virtual int heightForWidth(int width) const;
 
+public Q_SLOTS:
+
+  /// Set text that can be displayed in a shortened form (collapsed) for saving space,
+  /// by only showing first line with "More..." link appended.
+  /// When the user clicks on the link then the full text is displayed
+  /// (and a "Less..." link).
+  /// The teaser is the beginning of the text up to the first newline character
+  /// (for plain text) or <br> tag (for html). The separator is removed when
+  /// the text is expanded so that the full text can continue on the same line
+  /// as the teaser.
+  /// 
+  /// The text can be plain text or HTML and the the right format will be guessed.
+  /// Use setCollapsedHtml() or setCollapsedPlainText() directly to avoid guessing.
+  void setCollapsibleText(const QString &text);
+
+#ifndef QT_NO_TEXTHTMLPARSER
+  /// Set text that can be displayed in a shortened form (collapsed) for saving space.
+  /// \sa setCollapsibleText
+  void setCollapsibleHtml(const QString &text);
+#endif
+
+  /// Set text that can be displayed in a shortened form (collapsed) for saving space.
+  /// \sa setCollapsibleText
+  void setCollapsiblePlainText(const QString &text);
+
 protected Q_SLOTS:
   void heightForWidthMayHaveChanged();
   void anchorClicked(const QUrl &url);

+ 24 - 25
Libs/Widgets/ctkFittedTextBrowser_p.h

@@ -1,22 +1,22 @@
 /*=========================================================================
 
-  Library:   CTK
+Library:   CTK
 
-  Copyright (c) Kitware Inc.
+Copyright (c) Kitware Inc.
 
-  Licensed under the Apache License, Version 2.0 (the "License");
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
 
-  http://www.apache.org/licenses/LICENSE-2.0.txt
+http://www.apache.org/licenses/LICENSE-2.0.txt
 
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
 
-  =========================================================================*/
+=========================================================================*/
 
 #ifndef __ctkFittedTextBrowser_p_h
 #define __ctkFittedTextBrowser_p_h
@@ -37,27 +37,26 @@ public:
   ctkFittedTextBrowserPrivate(ctkFittedTextBrowser& object);
   virtual ~ctkFittedTextBrowserPrivate();
 
-  // Get collapsed/expanded text in html format.
-  // Calls collapsiblePlainText or collapsibleHtml.
-  QString collapsibleText();
+  // Update collapsed/expanded text in the widget.
+  void updateCollapsedText();
+
   // Get collapsed/expanded text in html format from plain text.
-  QString collapsiblePlainText();
+  QString collapsedTextFromPlainText() const;
   // Get collapsed/expanded text in html format from html.
-  QString collapsibleHtml();
+  QString collapsedTextFromHtml() const;
 
   // Get more/less link in html format
-  QString collapseLinkText();
+  QString collapseLinkText() const;
 
-  bool Collapsible;
   bool Collapsed;
 
-  QString ShowMoreText;
-  QString ShowLessText;
+  QString ShowDetailsText;
+  QString HideDetailsText;
 
   // Stores the text that the user originally set.
-  QString FullText;
-  
-  enum FullTextSetMethod
+  QString CollapsibleText;
+
+  enum CollapsibleTextSetMethod
   {
     Text,
     PlainText,
@@ -65,7 +64,7 @@ public:
   };
 
   // Stores what method the user called to set text
-  FullTextSetMethod FullTextSetter;
+  CollapsibleTextSetMethod CollapsibleTextSetter;
 };
 
 #endif