summaryrefslogtreecommitdiffstats
path: root/src/linklabel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/linklabel.cpp')
-rw-r--r--src/linklabel.cpp695
1 files changed, 695 insertions, 0 deletions
diff --git a/src/linklabel.cpp b/src/linklabel.cpp
new file mode 100644
index 0000000..be6e2e2
--- /dev/null
+++ b/src/linklabel.cpp
@@ -0,0 +1,695 @@
+/***************************************************************************
+ * Copyright (C) 2003 by S�astien Laot *
+ * slaout@linux62.org *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+
+#include <qlabel.h>
+#include <kurl.h>
+#include <qlayout.h>
+#include <kiconloader.h>
+#include <qcursor.h>
+#include <klocale.h>
+#include <qpushbutton.h>
+#include <qcheckbox.h>
+#include <qcombobox.h>
+#include <qhgroupbox.h>
+#include <qpainter.h>
+#include <kglobalsettings.h>
+#include <qstyle.h>
+#include <kapplication.h>
+#include <kaboutdata.h>
+#include <kdialogbase.h>
+#include <kcmodule.h>
+#include <kdebug.h>
+
+#include "linklabel.h"
+#include "variouswidgets.h"
+#include "tools.h"
+#include "global.h"
+#include "kcolorcombo2.h"
+#include "htmlexporter.h"
+
+/** LinkLook */
+
+LinkLook *LinkLook::soundLook = new LinkLook(/*useLinkColor=*/false, /*canPreview=*/false);
+LinkLook *LinkLook::fileLook = new LinkLook(/*useLinkColor=*/false, /*canPreview=*/true);
+LinkLook *LinkLook::localLinkLook = new LinkLook(/*useLinkColor=*/true, /*canPreview=*/true);
+LinkLook *LinkLook::networkLinkLook = new LinkLook(/*useLinkColor=*/true, /*canPreview=*/false);
+LinkLook *LinkLook::launcherLook = new LinkLook(/*useLinkColor=*/true, /*canPreview=*/false);
+
+LinkLook::LinkLook(bool useLinkColor, bool canPreview)
+{
+ m_useLinkColor = useLinkColor;
+ m_canPreview = canPreview;
+ m_iconSize = 0;
+}
+
+LinkLook::LinkLook(const LinkLook &other)
+{
+ m_useLinkColor = other.useLinkColor();
+ m_canPreview = other.canPreview();
+ setLook( other.italic(), other.bold(), other.underlining(),
+ other.color(), other.hoverColor(),
+ other.iconSize(), other.preview() );
+}
+
+void LinkLook::setLook(bool italic, bool bold, int underlining,
+ QColor color, QColor hoverColor,
+ int iconSize, int preview)
+{
+ m_italic = italic;
+ m_bold = bold;
+ m_underlining = underlining;
+ m_color = color;
+ m_hoverColor = hoverColor;
+ m_iconSize = iconSize;
+ m_preview = (canPreview() ? preview : None);
+}
+
+int LinkLook::previewSize() const
+{
+ if (previewEnabled()) {
+ switch (preview()) {
+ default:
+ case None: return 0;
+ case IconSize: return iconSize();
+ case TwiceIconSize: return iconSize() * 2;
+ case ThreeIconSize: return iconSize() * 3;
+ }
+ } else
+ return 0;
+}
+
+QColor LinkLook::effectiveColor() const
+{
+ if (m_color.isValid())
+ return m_color;
+ else
+ return defaultColor();
+}
+
+QColor LinkLook::effectiveHoverColor() const
+{
+ if (m_hoverColor.isValid())
+ return m_hoverColor;
+ else
+ return defaultHoverColor();
+}
+
+QColor LinkLook::defaultColor() const
+{
+ if (m_useLinkColor)
+ return KGlobalSettings::linkColor();
+ else
+ return KGlobalSettings::textColor();
+}
+
+QColor LinkLook::defaultHoverColor() const
+{
+ return Qt::red;
+}
+
+LinkLook* LinkLook::lookForURL(const KURL &url)
+{
+ return url.isLocalFile() ? localLinkLook : networkLinkLook;
+}
+
+QString LinkLook::toCSS(const QString &cssClass, const QColor &defaultTextColor) const
+{
+ // Set the link class:
+ QString css = QString(" .%1 a { display: block; width: 100%;").arg(cssClass);
+ if (underlineOutside())
+ css += " text-decoration: underline;";
+ else
+ css += " text-decoration: none;";
+ if (m_italic == true)
+ css += " font-style: italic;";
+ if (m_bold == true)
+ css += " font-weight: bold;";
+ QColor textColor = (color().isValid() || m_useLinkColor ? effectiveColor() : defaultTextColor);
+ css += QString(" color: %1; }\n").arg(textColor.name());
+
+ // Set the hover state class:
+ QString hover;
+ if (m_underlining == OnMouseHover)
+ hover = "text-decoration: underline;";
+ else if (m_underlining == OnMouseOutside)
+ hover = "text-decoration: none;";
+ if (effectiveHoverColor() != effectiveColor()) {
+ if (!hover.isEmpty())
+ hover += " ";
+ hover += QString("color: %4;").arg(effectiveHoverColor().name());
+ }
+
+ // But include it only if it contain a different style than non-hover state:
+ if (!hover.isEmpty())
+ css += QString(" .%1 a:hover { %2 }\n").arg(cssClass, hover);
+
+ return css;
+}
+
+/** LinkLabel */
+
+LinkLabel::LinkLabel(int hAlign, int vAlign, QWidget *parent, const char *name, WFlags f)
+ : QFrame(parent, name, f), m_isSelected(false), m_isHovered(false), m_look(0)
+{
+ initLabel(hAlign, vAlign);
+}
+
+LinkLabel::LinkLabel(const QString &title, const QString &icon, LinkLook *look, int hAlign, int vAlign,
+ QWidget *parent, const char *name, WFlags f)
+ : QFrame(parent, name, f), m_isSelected(false), m_isHovered(false), m_look(0)
+{
+ initLabel(hAlign, vAlign);
+ setLink(title, icon, look);
+}
+
+void LinkLabel::initLabel(int hAlign, int vAlign)
+{
+ m_layout = new QBoxLayout(this, QBoxLayout::LeftToRight);
+ m_icon = new QLabel(this);
+ m_title = new QLabel(this);
+ m_spacer1 = new QSpacerItem(0, 0, QSizePolicy::Preferred/*Expanding*/, QSizePolicy::Preferred/*Expanding*/);
+ m_spacer2 = new QSpacerItem(0, 0, QSizePolicy::Preferred/*Expanding*/, QSizePolicy::Preferred/*Expanding*/);
+
+ m_hAlign = hAlign;
+ m_vAlign = vAlign;
+
+ m_title->setTextFormat(Qt::PlainText);
+
+ // DEGUB:
+ //m_icon->setPaletteBackgroundColor("lightblue");
+ //m_title->setPaletteBackgroundColor("lightyellow");
+}
+
+LinkLabel::~LinkLabel()
+{
+}
+
+void LinkLabel::setLink(const QString &title, const QString &icon, LinkLook *look)
+{
+ if (look)
+ m_look = look; // Needed for icon size
+
+ m_title->setText(title);
+ m_title->setShown( ! title.isEmpty() );
+
+ if (icon.isEmpty())
+ m_icon->clear();
+ else {
+ QPixmap pixmap = DesktopIcon(icon, m_look->iconSize(), m_look->iconSize(), kapp);
+ if (!pixmap.isNull())
+ m_icon->setPixmap(pixmap);
+ }
+ m_icon->setShown( ! icon.isEmpty() );
+
+ if (look)
+ setLook(look);
+}
+
+void LinkLabel::setLook(LinkLook *look) // FIXME: called externaly (so, without setLink()) it's buggy (icon not
+{
+ m_look = look;
+
+ QFont font;
+ font.setBold(look->bold());
+ font.setUnderline(look->underlineOutside());
+ font.setItalic(look->italic());
+ m_title->setFont(font);
+ m_title->setPaletteForegroundColor( m_isSelected ? KApplication::palette().active().highlightedText() : look->effectiveColor() );
+
+ m_icon->setShown( m_icon->pixmap() && ! m_icon->pixmap()->isNull() );
+
+ setAlign(m_hAlign, m_vAlign);
+}
+
+void LinkLabel::setAlign(int hAlign, int vAlign)
+{
+ m_hAlign = hAlign;
+ m_vAlign = vAlign;
+
+ if (!m_look)
+ return;
+
+ // Define alignment flags :
+ //FIXME TODO: Use directly flags !
+ int hFlag, vFlag, wBreak;
+ switch (hAlign) {
+ default:
+ case 0: hFlag = Qt::AlignLeft; break;
+ case 1: hFlag = Qt::AlignHCenter; break;
+ case 2: hFlag = Qt::AlignRight; break;
+ }
+ switch (vAlign) {
+ case 0: vFlag = Qt::AlignTop; break;
+ default:
+ case 1: vFlag = Qt::AlignVCenter; break;
+ case 2: vFlag = Qt::AlignBottom; break;
+ }
+ wBreak = Qt::WordBreak * (hAlign != 1);
+
+ // Clear the widget :
+ m_layout->removeItem(m_spacer1);
+ m_layout->remove(m_icon);
+ m_layout->remove(m_title);
+ m_layout->removeItem(m_spacer2);
+
+ // Otherwise, minimumSize will be incoherent (last size ? )
+ m_layout->setResizeMode(QLayout::Minimum);
+
+ // And re-populate the widget with the appropriates things and order
+ bool addSpacers = hAlign == 1;
+ m_layout->setDirection(QBoxLayout::LeftToRight);
+ //m_title->setSizePolicy( QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Maximum/*Expanding*/, 0, 0, false) );
+ m_icon->setSizePolicy( QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred/*Expanding*/, 0, 0, false) );
+ m_spacer1->changeSize( 0, 0, QSizePolicy::Expanding, QSizePolicy::Preferred/*Expanding*/ );
+ m_spacer2->changeSize( 0, 0, QSizePolicy::Expanding, QSizePolicy::Preferred/*Expanding*/ );
+
+ m_icon->setAlignment( hFlag | vFlag );
+ m_title->setAlignment( hFlag | vFlag | wBreak );
+ if ( addSpacers && (vAlign != 0) ||
+ (m_title->text().isEmpty() && hAlign == 2) )
+ m_layout->addItem(m_spacer1);
+ if (hAlign == 2) { // If align at right, icon is at right
+ m_layout->addWidget(m_title);
+ m_layout->addWidget(m_icon);
+ } else {
+ m_layout->addWidget(m_icon);
+ m_layout->addWidget(m_title);
+ }
+ if ( addSpacers && (vAlign != 2) ||
+ (m_title->text().isEmpty() && hAlign == 0) )
+ m_layout->addItem(m_spacer2);
+}
+
+void LinkLabel::enterEvent(QEvent*)
+{
+ m_isHovered = true;
+ if ( ! m_isSelected )
+ m_title->setPaletteForegroundColor(m_look->effectiveHoverColor());
+
+ QFont font = m_title->font();
+ font.setUnderline(m_look->underlineInside());
+ m_title->setFont(font);
+}
+
+void LinkLabel::leaveEvent(QEvent*)
+{
+ m_isHovered = false;
+ if ( ! m_isSelected )
+ m_title->setPaletteForegroundColor(m_look->effectiveColor());
+
+ QFont font = m_title->font();
+ font.setUnderline(m_look->underlineOutside());
+ m_title->setFont(font);
+}
+
+void LinkLabel::setSelected(bool selected)
+{
+ m_isSelected = selected;
+ if (selected)
+ m_title->setPaletteForegroundColor(KApplication::palette().active().highlightedText());
+ else if (m_isHovered)
+ m_title->setPaletteForegroundColor(m_look->effectiveHoverColor());
+ else
+ m_title->setPaletteForegroundColor(m_look->effectiveColor());
+}
+
+void LinkLabel::setPaletteBackgroundColor(const QColor &color)
+{
+ QFrame::setPaletteBackgroundColor(color);
+ m_title->setPaletteBackgroundColor(color);
+}
+
+int LinkLabel::heightForWidth(int w) const
+{
+ int iconS = (m_icon->isShown()) ? m_look->iconSize() : 0; // Icon size
+ int iconW = iconS; // Icon width to remove to w
+ int titleH = (m_title->isShown()) ? m_title->heightForWidth(w - iconW) : 0; // Title height
+
+ return (titleH >= iconS) ? titleH : iconS; // No margin for the moment !
+}
+
+QString LinkLabel::toHtml(const QString &imageName)
+{
+ QString begin = "<font color=" + m_look->effectiveColor().name() + ">";
+ QString end = "</font>";
+ if (m_look->italic()) {
+ begin += "<i>";
+ end.prepend("</i>");
+ }
+ if (m_look->bold()) {
+ begin += "<b>";
+ end.prepend("</b>");
+ }
+ if (m_look->underlineOutside()) {
+ begin += "<u>";
+ end.prepend("</u>");
+ }
+ if (m_icon->pixmap()) {
+ QPixmap icon(*m_icon->pixmap());
+ begin.prepend("<img src=" + imageName + " style=\"vertical-align: middle\"> ");
+ QMimeSourceFactory::defaultFactory()->setPixmap(imageName, icon);
+ } else
+ QMimeSourceFactory::defaultFactory()->setData(imageName, 0L);
+ return begin + Tools::textToHTMLWithoutP(m_title->text()) + end;
+}
+
+/** class LinkDisplay
+ */
+
+LinkDisplay::LinkDisplay()
+ : m_title(), m_icon(), m_preview(), m_look(0), m_font(), m_minWidth(0), m_width(0), m_height(0)
+{
+}
+
+void LinkDisplay::setLink(const QString &title, const QString &icon, LinkLook *look, const QFont &font)
+{
+ setLink(title, icon, m_preview, look, font);
+}
+
+void LinkDisplay::setLink(const QString &title, const QString &icon, const QPixmap &preview, LinkLook *look, const QFont &font)
+{
+ m_title = title;
+ m_icon = icon;
+ m_preview = preview;
+ m_look = look;
+ m_font = font;
+
+ // "Constants":
+ int BUTTON_MARGIN = kapp->style().pixelMetric(QStyle::PM_ButtonMargin);
+ int LINK_MARGIN = BUTTON_MARGIN + 2;
+
+ // Recompute m_minWidth:
+ QRect textRect = QFontMetrics(labelFont(font, false)).boundingRect(0, 0, /*width=*/1, 500000, Qt::AlignAuto | Qt::AlignTop | Qt::WordBreak, m_title);
+ int iconPreviewWidth = QMAX(m_look->iconSize(), (m_look->previewEnabled() ? m_preview.width() : 0));
+ m_minWidth = BUTTON_MARGIN - 1 + iconPreviewWidth + LINK_MARGIN + textRect.width();
+ // Recompute m_maxWidth:
+ textRect = QFontMetrics(labelFont(font, false)).boundingRect(0, 0, /*width=*/50000000, 500000, Qt::AlignAuto | Qt::AlignTop | Qt::WordBreak, m_title);
+ m_maxWidth = BUTTON_MARGIN - 1 + iconPreviewWidth + LINK_MARGIN + textRect.width();
+ // Adjust m_width:
+ if (m_width < m_minWidth)
+ setWidth(m_minWidth);
+ // Recompute m_height:
+ m_height = heightForWidth(m_width);
+}
+
+void LinkDisplay::setWidth(int width)
+{
+ if (width < m_minWidth)
+ width = m_minWidth;
+
+ if (width != m_width) {
+ m_width = width;
+ m_height = heightForWidth(m_width);
+ }
+}
+
+/** Paint on @p painter
+ * in (@p x, @p y, @p width, @p height)
+ * using @p colorGroup for the button drawing (if @p isHovered)
+ * and the LinkLook color() for the text,
+ * unless [the LinkLook !color.isValid() and it does not useLinkColor()] or [@p isDefaultColor is false]: in this case it will use @p colorGroup.text().
+ * It will draw the button if @p isIconButtonHovered.
+ */
+void LinkDisplay::paint(QPainter *painter, int x, int y, int width, int height, const QColorGroup &colorGroup,
+ bool isDefaultColor, bool isSelected, bool isHovered, bool isIconButtonHovered) const
+{
+ int BUTTON_MARGIN = kapp->style().pixelMetric(QStyle::PM_ButtonMargin);
+ int LINK_MARGIN = BUTTON_MARGIN + 2;
+
+ QPixmap pixmap;
+ // Load the preview...:
+ if (!isHovered && m_look->previewEnabled() && !m_preview.isNull())
+ pixmap = m_preview;
+ // ... Or the icon (if no preview or if the "Open" icon should be shown):
+ else {
+ int iconSize = m_look->iconSize();
+ QString iconName = (isHovered ? Global::openNoteIcon() : m_icon);
+ KIcon::States iconState = (isIconButtonHovered ? KIcon::ActiveState : KIcon::DefaultState);
+ pixmap = kapp->iconLoader()->loadIcon(iconName, KIcon::Desktop, iconSize, iconState, 0L, /*canReturnNull=*/false);
+ }
+ int iconPreviewWidth = QMAX(m_look->iconSize(), (m_look->previewEnabled() ? m_preview.width() : 0));
+ int pixmapX = (iconPreviewWidth - pixmap.width()) / 2;
+ int pixmapY = (height - pixmap.height()) / 2;
+ // Draw the button (if any) and the icon:
+ if (isHovered)
+ kapp->style().drawPrimitive(QStyle::PE_ButtonCommand, painter, QRect(-1, -1, iconPreviewWidth + 2*BUTTON_MARGIN, height + 2),
+ colorGroup, QStyle::Style_Enabled | (isIconButtonHovered ? QStyle::Style_MouseOver : 0));
+ painter->drawPixmap(x + BUTTON_MARGIN - 1 + pixmapX, y + pixmapY, pixmap);
+
+ // Figure out the text color:
+ if (isSelected)
+ painter->setPen(KGlobalSettings::highlightedTextColor());
+ else if (isIconButtonHovered)
+ painter->setPen(m_look->effectiveHoverColor());
+ else if (!isDefaultColor || (!m_look->color().isValid() && !m_look->useLinkColor())) // If the color is FORCED or if the link color default to the text color:
+ painter->setPen(colorGroup.text());
+ else
+ painter->setPen(m_look->effectiveColor());
+ // Draw the text:
+ painter->setFont(labelFont(m_font, isIconButtonHovered));
+ painter->drawText(x + BUTTON_MARGIN - 1 + iconPreviewWidth + LINK_MARGIN, y, width - BUTTON_MARGIN + 1 - iconPreviewWidth - LINK_MARGIN, height,
+ Qt::AlignAuto | Qt::AlignVCenter | Qt::WordBreak, m_title);
+}
+
+QPixmap LinkDisplay::feedbackPixmap(int width, int height, const QColorGroup &colorGroup, bool isDefaultColor)
+{
+ int theWidth = QMIN(width, maxWidth());
+ int theHeight = QMIN(height, heightForWidth(theWidth));
+ QPixmap pixmap(theWidth, theHeight);
+ pixmap.fill(colorGroup.background());
+ QPainter painter(&pixmap);
+ paint(&painter, 0, 0, theWidth, theHeight, colorGroup, isDefaultColor,
+ /*isSelected=*/false, /*isHovered=*/false, /*isIconButtonHovered=*/false);
+ painter.end();
+ return pixmap;
+}
+
+bool LinkDisplay::iconButtonAt(const QPoint &pos) const
+{
+ int BUTTON_MARGIN = kapp->style().pixelMetric(QStyle::PM_ButtonMargin);
+// int LINK_MARGIN = BUTTON_MARGIN + 2;
+ int iconPreviewWidth = QMAX(m_look->iconSize(), (m_look->previewEnabled() ? m_preview.width() : 0));
+
+ return pos.x() <= BUTTON_MARGIN - 1 + iconPreviewWidth + BUTTON_MARGIN;
+}
+
+QRect LinkDisplay::iconButtonRect() const
+{
+ int BUTTON_MARGIN = kapp->style().pixelMetric(QStyle::PM_ButtonMargin);
+// int LINK_MARGIN = BUTTON_MARGIN + 2;
+ int iconPreviewWidth = QMAX(m_look->iconSize(), (m_look->previewEnabled() ? m_preview.width() : 0));
+
+ return QRect(0, 0, BUTTON_MARGIN - 1 + iconPreviewWidth + BUTTON_MARGIN, m_height);
+}
+
+QFont LinkDisplay::labelFont(QFont font, bool isIconButtonHovered) const
+{
+ if (m_look->italic())
+ font.setItalic(true);
+ if (m_look->bold())
+ font.setBold(true);
+ if (isIconButtonHovered) {
+ if (m_look->underlineInside())
+ font.setUnderline(true);
+ } else {
+ if (m_look->underlineOutside())
+ font.setUnderline(true);
+ }
+ return font;
+}
+
+int LinkDisplay::heightForWidth(int width) const
+{
+ int BUTTON_MARGIN = kapp->style().pixelMetric(QStyle::PM_ButtonMargin);
+ int LINK_MARGIN = BUTTON_MARGIN + 2;
+ int iconPreviewWidth = QMAX(m_look->iconSize(), (m_look->previewEnabled() ? m_preview.width() : 0));
+ int iconPreviewHeight = QMAX(m_look->iconSize(), (m_look->previewEnabled() ? m_preview.height() : 0));
+
+ QRect textRect = QFontMetrics(labelFont(m_font, false)).boundingRect(0, 0, width - BUTTON_MARGIN + 1 - iconPreviewWidth - LINK_MARGIN, 500000, Qt::AlignAuto | Qt::AlignTop | Qt::WordBreak, m_title);
+ return QMAX(textRect.height(), iconPreviewHeight + 2*BUTTON_MARGIN - 2);
+}
+
+QString LinkDisplay::toHtml(const QString &/*imageName*/) const
+{
+ // TODO
+ return "";
+}
+
+QString LinkDisplay::toHtml(HTMLExporter *exporter, const KURL &url, const QString &title)
+{
+ QString linkIcon;
+ if (m_look->previewEnabled() && !m_preview.isNull()) {
+ QString fileName = Tools::fileNameForNewFile("preview_" + url.fileName() + ".png", exporter->iconsFolderPath);
+ QString fullPath = exporter->iconsFolderPath + fileName;
+ m_preview.save(fullPath, "PNG");
+ linkIcon = QString("<img src=\"%1\" width=\"%2\" height=\"%3\" alt=\"\">")
+ .arg(exporter->iconsFolderName + fileName, QString::number(m_preview.width()), QString::number(m_preview.height()));
+ } else {
+ linkIcon = exporter->iconsFolderName + exporter->copyIcon(m_icon, m_look->iconSize());
+ linkIcon = QString("<img src=\"%1\" width=\"%2\" height=\"%3\" alt=\"\">")
+ .arg(linkIcon, QString::number(m_look->iconSize()), QString::number(m_look->iconSize()));
+ }
+
+ QString linkTitle = Tools::textToHTMLWithoutP(title.isEmpty() ? m_title : title);
+
+ return QString("<a href=\"%1\">%2 %3</a>").arg(url.prettyURL(), linkIcon, linkTitle);
+}
+
+/** LinkLookEditWidget **/
+
+LinkLookEditWidget::LinkLookEditWidget(KCModule *module, const QString exTitle, const QString exIcon,
+ QWidget *parent, const char *name, WFlags fl)
+ : QWidget(parent, name, fl)
+{
+ QLabel *label;
+ QVBoxLayout *layout = new QVBoxLayout(this, KDialogBase::marginHint(), KDialogBase::spacingHint());
+
+ m_italic = new QCheckBox(i18n("I&talic"), this);
+ layout->addWidget(m_italic);
+
+ m_bold = new QCheckBox(i18n("&Bold"), this);
+ layout->addWidget(m_bold);
+
+ QGridLayout *gl = new QGridLayout(layout, /*rows=*//*(look->canPreview() ? 5 : 4)*/5, /*columns=*//*3*/4);
+ gl->addItem(new QSpacerItem(0, 0, QSizePolicy::Expanding), 1, /*2*/3);
+
+ m_underlining = new QComboBox(false, this);
+ m_underlining->insertItem(i18n("Always"));
+ m_underlining->insertItem(i18n("Never"));
+ m_underlining->insertItem(i18n("On mouse hovering"));
+ m_underlining->insertItem(i18n("When mouse is outside"));
+ label = new QLabel(m_underlining, i18n("&Underline:"), this);
+ gl->addWidget(label, 0, 0);
+ gl->addWidget(m_underlining, 0, 1);
+
+ m_color = new KColorCombo2(QRgb(), this);
+ label = new QLabel(m_color, i18n("Colo&r:"), this);
+ gl->addWidget(label, 1, 0);
+ gl->addWidget(m_color, 1, 1);
+
+ m_hoverColor = new KColorCombo2(QRgb(), this);
+ label = new QLabel(m_hoverColor, i18n("&Mouse hover color:"), this);
+ gl->addWidget(label, 2, 0);
+ gl->addWidget(m_hoverColor, 2, 1);
+
+ QHBoxLayout *icoLay = new QHBoxLayout(/*parent=*/0L, /*margin=*/0, KDialogBase::spacingHint());
+ m_iconSize = new IconSizeCombo(false, this);
+ icoLay->addWidget(m_iconSize);
+ label = new QLabel(m_iconSize, i18n("&Icon size:"), this);
+ gl->addWidget(label, 3, 0);
+ gl->addItem( icoLay, 3, 1);
+
+ m_preview = new QComboBox(false, this);
+ m_preview->insertItem(i18n("None"));
+ m_preview->insertItem(i18n("Icon size"));
+ m_preview->insertItem(i18n("Twice the icon size"));
+ m_preview->insertItem(i18n("Three times the icon size"));
+ m_label = new QLabel(m_preview, i18n("&Preview:"), this);
+ m_hLabel = new HelpLabel(
+ i18n("You disabled preview but still see images?"),
+ i18n("<p>This is normal because there are several type of notes.<br>"
+ "This setting only applies to file and local link notes.<br>"
+ "The images you see are image notes, not file notes.<br>"
+ "File notes are generic documents, whereas image notes are pictures you can draw in.</p>"
+ "<p>When dropping files to baskets, %1 detects their type and shows you the content of the files.<br>"
+ "For instance, when dropping image or text files, image and text notes are created for them.<br>"
+ "For type of files %2 does not understand, they are shown as generic file notes with just an icon or file preview and a filename.</p>"
+ "<p>If you do not want the application to create notes depending on the content of the files you drop, "
+ "go to the \"General\" page and uncheck \"Image or animation\" in the \"View Content of Added Files for the Following Types\" group.</p>")
+ // TODO: Note: you can resize down maximum size of images...
+ .arg(kapp->aboutData()->programName(), kapp->aboutData()->programName()),
+ this);
+ gl->addWidget(m_label, 4, 0);
+ gl->addWidget(m_preview, 4, 1);
+ gl->addMultiCellWidget(m_hLabel, /*fromRow=*/5, /*toRow=*/5, /*fromCol=*/1, /*toCol*/2);
+
+ QGroupBox *gb = new QHGroupBox(i18n("Example"), this);
+ m_exLook = new LinkLook;
+ m_example = new LinkLabel(exTitle, exIcon, m_exLook, 1, 1, gb);
+ m_example->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+ m_example->setCursor(QCursor(Qt::PointingHandCursor));
+ layout->addWidget(gb);
+ m_exTitle = exTitle;
+ m_exIcon = exIcon;
+
+ connect( m_italic, SIGNAL(stateChanged(int)), this, SLOT(slotChangeLook()) );
+ connect( m_bold, SIGNAL(stateChanged(int)), this, SLOT(slotChangeLook()) );
+ connect( m_underlining, SIGNAL(activated(int)), this, SLOT(slotChangeLook()) );
+ connect( m_color, SIGNAL(changed(const QColor&)), this, SLOT(slotChangeLook()) );
+ connect( m_hoverColor, SIGNAL(changed(const QColor&)), this, SLOT(slotChangeLook()) );
+ connect( m_iconSize, SIGNAL(activated(int)), this, SLOT(slotChangeLook()) );
+ connect( m_preview, SIGNAL(activated(int)), this, SLOT(slotChangeLook()) );
+
+ connect( m_italic, SIGNAL(stateChanged(int)), module, SLOT(changed()) );
+ connect( m_bold, SIGNAL(stateChanged(int)), module, SLOT(changed()) );
+ connect( m_underlining, SIGNAL(activated(int)), module, SLOT(changed()) );
+ connect( m_color, SIGNAL(changed(const QColor&)), module, SLOT(changed()) );
+ connect( m_hoverColor, SIGNAL(changed(const QColor&)), module, SLOT(changed()) );
+ connect( m_iconSize, SIGNAL(activated(int)), module, SLOT(changed()) );
+ connect( m_preview, SIGNAL(activated(int)), module, SLOT(changed()) );
+}
+
+void LinkLookEditWidget::set(LinkLook *look)
+{
+ m_look = look;
+
+ m_italic->setChecked(look->italic());
+ m_bold->setChecked(look->bold());
+ m_underlining->setCurrentItem(look->underlining());
+ m_preview->setCurrentItem(look->preview());
+ m_color->setDefaultColor(m_look->defaultColor());
+ m_color->setColor(m_look->color());
+ m_hoverColor->setDefaultColor(m_look->defaultHoverColor());
+ m_hoverColor->setColor(m_look->hoverColor());
+ m_iconSize->setSize(look->iconSize());
+ m_exLook = new LinkLook(*look);
+ m_example->setLook(m_exLook);
+
+ if (!look->canPreview()) {
+ m_label->setEnabled(false);
+ m_hLabel->setEnabled(false);
+ m_preview->setEnabled(false);
+ }
+ slotChangeLook();
+}
+
+void LinkLookEditWidget::slotChangeLook()
+{
+ saveToLook(m_exLook);
+ m_example->setLink(m_exTitle, m_exIcon, m_exLook); // and can't reload it at another size
+}
+
+LinkLookEditWidget::~LinkLookEditWidget()
+{
+}
+
+void LinkLookEditWidget::saveChanges()
+{
+ saveToLook(m_look);
+}
+
+void LinkLookEditWidget::saveToLook(LinkLook *look)
+{
+ look->setLook( m_italic->isOn(), m_bold->isOn(), m_underlining->currentItem(),
+ m_color->color(), m_hoverColor->color(),
+ m_iconSize->iconSize(), (look->canPreview() ? m_preview->currentItem() : LinkLook::None) );
+}
+
+#include "linklabel.moc"