|
|
/***************************************************************************
|
|
|
* 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 <tqlabel.h>
|
|
|
#include <kurl.h>
|
|
|
#include <tqlayout.h>
|
|
|
#include <kiconloader.h>
|
|
|
#include <tqcursor.h>
|
|
|
#include <tdelocale.h>
|
|
|
#include <tqpushbutton.h>
|
|
|
#include <tqcheckbox.h>
|
|
|
#include <tqcombobox.h>
|
|
|
#include <tqhgroupbox.h>
|
|
|
#include <tqpainter.h>
|
|
|
#include <tdeglobalsettings.h>
|
|
|
#include <tqstyle.h>
|
|
|
#include <tdeapplication.h>
|
|
|
#include <tdeaboutdata.h>
|
|
|
#include <kdialogbase.h>
|
|
|
#include <tdecmodule.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,
|
|
|
TQColor color, TQColor 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;
|
|
|
}
|
|
|
|
|
|
TQColor LinkLook::effectiveColor() const
|
|
|
{
|
|
|
if (m_color.isValid())
|
|
|
return m_color;
|
|
|
else
|
|
|
return defaultColor();
|
|
|
}
|
|
|
|
|
|
TQColor LinkLook::effectiveHoverColor() const
|
|
|
{
|
|
|
if (m_hoverColor.isValid())
|
|
|
return m_hoverColor;
|
|
|
else
|
|
|
return defaultHoverColor();
|
|
|
}
|
|
|
|
|
|
TQColor LinkLook::defaultColor() const
|
|
|
{
|
|
|
if (m_useLinkColor)
|
|
|
return TDEGlobalSettings::linkColor();
|
|
|
else
|
|
|
return TDEGlobalSettings::textColor();
|
|
|
}
|
|
|
|
|
|
TQColor LinkLook::defaultHoverColor() const
|
|
|
{
|
|
|
return TQt::red;
|
|
|
}
|
|
|
|
|
|
LinkLook* LinkLook::lookForURL(const KURL &url)
|
|
|
{
|
|
|
return url.isLocalFile() ? localLinkLook : networkLinkLook;
|
|
|
}
|
|
|
|
|
|
TQString LinkLook::toCSS(const TQString &cssClass, const TQColor &defaultTextColor) const
|
|
|
{
|
|
|
// Set the link class:
|
|
|
TQString css = TQString(" .%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;";
|
|
|
TQColor textColor = (color().isValid() || m_useLinkColor ? effectiveColor() : defaultTextColor);
|
|
|
css += TQString(" color: %1; }\n").arg(textColor.name());
|
|
|
|
|
|
// Set the hover state class:
|
|
|
TQString 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 += TQString("color: %4;").arg(effectiveHoverColor().name());
|
|
|
}
|
|
|
|
|
|
// But include it only if it contain a different style than non-hover state:
|
|
|
if (!hover.isEmpty())
|
|
|
css += TQString(" .%1 a:hover { %2 }\n").arg(cssClass, hover);
|
|
|
|
|
|
return css;
|
|
|
}
|
|
|
|
|
|
/** LinkLabel */
|
|
|
|
|
|
LinkLabel::LinkLabel(int hAlign, int vAlign, TQWidget *parent, const char *name, WFlags f)
|
|
|
: TQFrame(parent, name, f), m_isSelected(false), m_isHovered(false), m_look(0)
|
|
|
{
|
|
|
initLabel(hAlign, vAlign);
|
|
|
}
|
|
|
|
|
|
LinkLabel::LinkLabel(const TQString &title, const TQString &icon, LinkLook *look, int hAlign, int vAlign,
|
|
|
TQWidget *parent, const char *name, WFlags f)
|
|
|
: TQFrame(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 TQBoxLayout(this, TQBoxLayout::LeftToRight);
|
|
|
m_icon = new TQLabel(this);
|
|
|
m_title = new TQLabel(this);
|
|
|
m_spacer1 = new TQSpacerItem(0, 0, TQSizePolicy::Preferred/*Expanding*/, TQSizePolicy::Preferred/*Expanding*/);
|
|
|
m_spacer2 = new TQSpacerItem(0, 0, TQSizePolicy::Preferred/*Expanding*/, TQSizePolicy::Preferred/*Expanding*/);
|
|
|
|
|
|
m_hAlign = hAlign;
|
|
|
m_vAlign = vAlign;
|
|
|
|
|
|
m_title->setTextFormat(TQt::PlainText);
|
|
|
|
|
|
// DEGUB:
|
|
|
//m_icon->setPaletteBackgroundColor("lightblue");
|
|
|
//m_title->setPaletteBackgroundColor("lightyellow");
|
|
|
}
|
|
|
|
|
|
LinkLabel::~LinkLabel()
|
|
|
{
|
|
|
}
|
|
|
|
|
|
void LinkLabel::setLink(const TQString &title, const TQString &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 {
|
|
|
TQPixmap 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;
|
|
|
|
|
|
TQFont font;
|
|
|
font.setBold(look->bold());
|
|
|
font.setUnderline(look->underlineOutside());
|
|
|
font.setItalic(look->italic());
|
|
|
m_title->setFont(font);
|
|
|
m_title->setPaletteForegroundColor( m_isSelected ? TDEApplication::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 = TQt::AlignLeft; break;
|
|
|
case 1: hFlag = TQt::AlignHCenter; break;
|
|
|
case 2: hFlag = TQt::AlignRight; break;
|
|
|
}
|
|
|
switch (vAlign) {
|
|
|
case 0: vFlag = TQt::AlignTop; break;
|
|
|
default:
|
|
|
case 1: vFlag = TQt::AlignVCenter; break;
|
|
|
case 2: vFlag = TQt::AlignBottom; break;
|
|
|
}
|
|
|
wBreak = TQt::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(TQLayout::Minimum);
|
|
|
|
|
|
// And re-populate the widget with the appropriates things and order
|
|
|
bool addSpacers = hAlign == 1;
|
|
|
m_layout->setDirection(TQBoxLayout::LeftToRight);
|
|
|
//m_title->setSizePolicy( TQSizePolicy(TQSizePolicy::Fixed, TQSizePolicy::Maximum/*Expanding*/, 0, 0, false) );
|
|
|
m_icon->setSizePolicy( TQSizePolicy(TQSizePolicy::Fixed, TQSizePolicy::Preferred/*Expanding*/, 0, 0, false) );
|
|
|
m_spacer1->changeSize( 0, 0, TQSizePolicy::Expanding, TQSizePolicy::Preferred/*Expanding*/ );
|
|
|
m_spacer2->changeSize( 0, 0, TQSizePolicy::Expanding, TQSizePolicy::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(TQEvent*)
|
|
|
{
|
|
|
m_isHovered = true;
|
|
|
if ( ! m_isSelected )
|
|
|
m_title->setPaletteForegroundColor(m_look->effectiveHoverColor());
|
|
|
|
|
|
TQFont font = m_title->font();
|
|
|
font.setUnderline(m_look->underlineInside());
|
|
|
m_title->setFont(font);
|
|
|
}
|
|
|
|
|
|
void LinkLabel::leaveEvent(TQEvent*)
|
|
|
{
|
|
|
m_isHovered = false;
|
|
|
if ( ! m_isSelected )
|
|
|
m_title->setPaletteForegroundColor(m_look->effectiveColor());
|
|
|
|
|
|
TQFont 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(TDEApplication::palette().active().highlightedText());
|
|
|
else if (m_isHovered)
|
|
|
m_title->setPaletteForegroundColor(m_look->effectiveHoverColor());
|
|
|
else
|
|
|
m_title->setPaletteForegroundColor(m_look->effectiveColor());
|
|
|
}
|
|
|
|
|
|
void LinkLabel::setPaletteBackgroundColor(const TQColor &color)
|
|
|
{
|
|
|
TQFrame::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 !
|
|
|
}
|
|
|
|
|
|
TQString LinkLabel::toHtml(const TQString &imageName)
|
|
|
{
|
|
|
TQString begin = "<font color=" + m_look->effectiveColor().name() + ">";
|
|
|
TQString 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()) {
|
|
|
TQPixmap icon(*m_icon->pixmap());
|
|
|
begin.prepend("<img src=" + imageName + " style=\"vertical-align: middle\"> ");
|
|
|
TQMimeSourceFactory::defaultFactory()->setPixmap(imageName, icon);
|
|
|
} else
|
|
|
TQMimeSourceFactory::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 TQString &title, const TQString &icon, LinkLook *look, const TQFont &font)
|
|
|
{
|
|
|
setLink(title, icon, m_preview, look, font);
|
|
|
}
|
|
|
|
|
|
void LinkDisplay::setLink(const TQString &title, const TQString &icon, const TQPixmap &preview, LinkLook *look, const TQFont &font)
|
|
|
{
|
|
|
m_title = title;
|
|
|
m_icon = icon;
|
|
|
m_preview = preview;
|
|
|
m_look = look;
|
|
|
m_font = font;
|
|
|
|
|
|
// "Constants":
|
|
|
int BUTTON_MARGIN = kapp->style().pixelMetric(TQStyle::PM_ButtonMargin);
|
|
|
int LINK_MARGIN = BUTTON_MARGIN + 2;
|
|
|
|
|
|
// Recompute m_minWidth:
|
|
|
TQRect textRect = TQFontMetrics(labelFont(font, false)).boundingRect(0, 0, /*width=*/1, 500000, TQt::AlignAuto | TQt::AlignTop | TQt::WordBreak, m_title);
|
|
|
int iconPreviewWidth = TQMAX(m_look->iconSize(), (m_look->previewEnabled() ? m_preview.width() : 0));
|
|
|
m_minWidth = BUTTON_MARGIN - 1 + iconPreviewWidth + LINK_MARGIN + textRect.width();
|
|
|
// Recompute m_maxWidth:
|
|
|
textRect = TQFontMetrics(labelFont(font, false)).boundingRect(0, 0, /*width=*/50000000, 500000, TQt::AlignAuto | TQt::AlignTop | TQt::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(TQPainter *painter, int x, int y, int width, int height, const TQColorGroup &colorGroup,
|
|
|
bool isDefaultColor, bool isSelected, bool isHovered, bool isIconButtonHovered) const
|
|
|
{
|
|
|
int BUTTON_MARGIN = kapp->style().pixelMetric(TQStyle::PM_ButtonMargin);
|
|
|
int LINK_MARGIN = BUTTON_MARGIN + 2;
|
|
|
|
|
|
TQPixmap 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();
|
|
|
TQString iconName = (isHovered ? Global::openNoteIcon() : m_icon);
|
|
|
TDEIcon::States iconState = (isIconButtonHovered ? TDEIcon::ActiveState : TDEIcon::DefaultState);
|
|
|
pixmap = kapp->iconLoader()->loadIcon(iconName, TDEIcon::Desktop, iconSize, iconState, 0L, /*canReturnNull=*/false);
|
|
|
}
|
|
|
int iconPreviewWidth = TQMAX(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().tqdrawPrimitive(TQStyle::PE_ButtonCommand, painter, TQRect(-1, -1, iconPreviewWidth + 2*BUTTON_MARGIN, height + 2),
|
|
|
colorGroup, TQStyle::Style_Enabled | (isIconButtonHovered ? TQStyle::Style_MouseOver : 0));
|
|
|
painter->drawPixmap(x + BUTTON_MARGIN - 1 + pixmapX, y + pixmapY, pixmap);
|
|
|
|
|
|
// Figure out the text color:
|
|
|
if (isSelected)
|
|
|
painter->setPen(TDEGlobalSettings::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,
|
|
|
TQt::AlignAuto | TQt::AlignVCenter | TQt::WordBreak, m_title);
|
|
|
}
|
|
|
|
|
|
TQPixmap LinkDisplay::feedbackPixmap(int width, int height, const TQColorGroup &colorGroup, bool isDefaultColor)
|
|
|
{
|
|
|
int theWidth = TQMIN(width, maxWidth());
|
|
|
int theHeight = TQMIN(height, heightForWidth(theWidth));
|
|
|
TQPixmap pixmap(theWidth, theHeight);
|
|
|
pixmap.fill(colorGroup.background());
|
|
|
TQPainter painter(&pixmap);
|
|
|
paint(&painter, 0, 0, theWidth, theHeight, colorGroup, isDefaultColor,
|
|
|
/*isSelected=*/false, /*isHovered=*/false, /*isIconButtonHovered=*/false);
|
|
|
painter.end();
|
|
|
return pixmap;
|
|
|
}
|
|
|
|
|
|
bool LinkDisplay::iconButtonAt(const TQPoint &pos) const
|
|
|
{
|
|
|
int BUTTON_MARGIN = kapp->style().pixelMetric(TQStyle::PM_ButtonMargin);
|
|
|
// int LINK_MARGIN = BUTTON_MARGIN + 2;
|
|
|
int iconPreviewWidth = TQMAX(m_look->iconSize(), (m_look->previewEnabled() ? m_preview.width() : 0));
|
|
|
|
|
|
return pos.x() <= BUTTON_MARGIN - 1 + iconPreviewWidth + BUTTON_MARGIN;
|
|
|
}
|
|
|
|
|
|
TQRect LinkDisplay::iconButtonRect() const
|
|
|
{
|
|
|
int BUTTON_MARGIN = kapp->style().pixelMetric(TQStyle::PM_ButtonMargin);
|
|
|
// int LINK_MARGIN = BUTTON_MARGIN + 2;
|
|
|
int iconPreviewWidth = TQMAX(m_look->iconSize(), (m_look->previewEnabled() ? m_preview.width() : 0));
|
|
|
|
|
|
return TQRect(0, 0, BUTTON_MARGIN - 1 + iconPreviewWidth + BUTTON_MARGIN, m_height);
|
|
|
}
|
|
|
|
|
|
TQFont LinkDisplay::labelFont(TQFont 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(TQStyle::PM_ButtonMargin);
|
|
|
int LINK_MARGIN = BUTTON_MARGIN + 2;
|
|
|
int iconPreviewWidth = TQMAX(m_look->iconSize(), (m_look->previewEnabled() ? m_preview.width() : 0));
|
|
|
int iconPreviewHeight = TQMAX(m_look->iconSize(), (m_look->previewEnabled() ? m_preview.height() : 0));
|
|
|
|
|
|
TQRect textRect = TQFontMetrics(labelFont(m_font, false)).boundingRect(0, 0, width - BUTTON_MARGIN + 1 - iconPreviewWidth - LINK_MARGIN, 500000, TQt::AlignAuto | TQt::AlignTop | TQt::WordBreak, m_title);
|
|
|
return TQMAX(textRect.height(), iconPreviewHeight + 2*BUTTON_MARGIN - 2);
|
|
|
}
|
|
|
|
|
|
TQString LinkDisplay::toHtml(const TQString &/*imageName*/) const
|
|
|
{
|
|
|
// TODO
|
|
|
return "";
|
|
|
}
|
|
|
|
|
|
TQString LinkDisplay::toHtml(HTMLExporter *exporter, const KURL &url, const TQString &title)
|
|
|
{
|
|
|
TQString linkIcon;
|
|
|
if (m_look->previewEnabled() && !m_preview.isNull()) {
|
|
|
TQString fileName = Tools::fileNameForNewFile("preview_" + url.fileName() + ".png", exporter->iconsFolderPath);
|
|
|
TQString fullPath = exporter->iconsFolderPath + fileName;
|
|
|
m_preview.save(fullPath, "PNG");
|
|
|
linkIcon = TQString("<img src=\"%1\" width=\"%2\" height=\"%3\" alt=\"\">")
|
|
|
.arg(exporter->iconsFolderName + fileName, TQString::number(m_preview.width()), TQString::number(m_preview.height()));
|
|
|
} else {
|
|
|
linkIcon = exporter->iconsFolderName + exporter->copyIcon(m_icon, m_look->iconSize());
|
|
|
linkIcon = TQString("<img src=\"%1\" width=\"%2\" height=\"%3\" alt=\"\">")
|
|
|
.arg(linkIcon, TQString::number(m_look->iconSize()), TQString::number(m_look->iconSize()));
|
|
|
}
|
|
|
|
|
|
TQString linkTitle = Tools::textToHTMLWithoutP(title.isEmpty() ? m_title : title);
|
|
|
|
|
|
return TQString("<a href=\"%1\">%2 %3</a>").arg(url.prettyURL(), linkIcon, linkTitle);
|
|
|
}
|
|
|
|
|
|
/** LinkLookEditWidget **/
|
|
|
|
|
|
LinkLookEditWidget::LinkLookEditWidget(TDECModule *module, const TQString exTitle, const TQString exIcon,
|
|
|
TQWidget *parent, const char *name, WFlags fl)
|
|
|
: TQWidget(parent, name, fl)
|
|
|
{
|
|
|
TQLabel *label;
|
|
|
TQVBoxLayout *layout = new TQVBoxLayout(this, KDialogBase::marginHint(), KDialogBase::spacingHint());
|
|
|
|
|
|
m_italic = new TQCheckBox(i18n("I&talic"), this);
|
|
|
layout->addWidget(m_italic);
|
|
|
|
|
|
m_bold = new TQCheckBox(i18n("&Bold"), this);
|
|
|
layout->addWidget(m_bold);
|
|
|
|
|
|
TQGridLayout *gl = new TQGridLayout(layout, /*rows=*//*(look->canPreview() ? 5 : 4)*/5, /*columns=*//*3*/4);
|
|
|
gl->addItem(new TQSpacerItem(0, 0, TQSizePolicy::Expanding), 1, /*2*/3);
|
|
|
|
|
|
m_underlining = new TQComboBox(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 TQLabel(m_underlining, i18n("&Underline:"), this);
|
|
|
gl->addWidget(label, 0, 0);
|
|
|
gl->addWidget(m_underlining, 0, 1);
|
|
|
|
|
|
m_color = new KColorCombo2(TQRgb(), this);
|
|
|
label = new TQLabel(m_color, i18n("Colo&r:"), this);
|
|
|
gl->addWidget(label, 1, 0);
|
|
|
gl->addWidget(m_color, 1, 1);
|
|
|
|
|
|
m_hoverColor = new KColorCombo2(TQRgb(), this);
|
|
|
label = new TQLabel(m_hoverColor, i18n("&Mouse hover color:"), this);
|
|
|
gl->addWidget(label, 2, 0);
|
|
|
gl->addWidget(m_hoverColor, 2, 1);
|
|
|
|
|
|
TQHBoxLayout *icoLay = new TQHBoxLayout(/*parent=*/0L, /*margin=*/0, KDialogBase::spacingHint());
|
|
|
m_iconSize = new IconSizeCombo(false, this);
|
|
|
icoLay->addWidget(m_iconSize);
|
|
|
label = new TQLabel(m_iconSize, i18n("&Icon size:"), this);
|
|
|
gl->addWidget(label, 3, 0);
|
|
|
gl->addItem( icoLay, 3, 1);
|
|
|
|
|
|
m_preview = new TQComboBox(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 TQLabel(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);
|
|
|
|
|
|
TQGroupBox *gb = new TQHGroupBox(i18n("Example"), this);
|
|
|
m_exLook = new LinkLook;
|
|
|
m_example = new LinkLabel(exTitle, exIcon, m_exLook, 1, 1, gb);
|
|
|
m_example->setSizePolicy(TQSizePolicy::Expanding, TQSizePolicy::Expanding);
|
|
|
m_example->setCursor(TQCursor(TQt::PointingHandCursor));
|
|
|
layout->addWidget(gb);
|
|
|
m_exTitle = exTitle;
|
|
|
m_exIcon = exIcon;
|
|
|
|
|
|
connect( m_italic, TQT_SIGNAL(stateChanged(int)), this, TQT_SLOT(slotChangeLook()) );
|
|
|
connect( m_bold, TQT_SIGNAL(stateChanged(int)), this, TQT_SLOT(slotChangeLook()) );
|
|
|
connect( m_underlining, TQT_SIGNAL(activated(int)), this, TQT_SLOT(slotChangeLook()) );
|
|
|
connect( m_color, TQT_SIGNAL(changed(const TQColor&)), this, TQT_SLOT(slotChangeLook()) );
|
|
|
connect( m_hoverColor, TQT_SIGNAL(changed(const TQColor&)), this, TQT_SLOT(slotChangeLook()) );
|
|
|
connect( m_iconSize, TQT_SIGNAL(activated(int)), this, TQT_SLOT(slotChangeLook()) );
|
|
|
connect( m_preview, TQT_SIGNAL(activated(int)), this, TQT_SLOT(slotChangeLook()) );
|
|
|
|
|
|
connect( m_italic, TQT_SIGNAL(stateChanged(int)), module, TQT_SLOT(changed()) );
|
|
|
connect( m_bold, TQT_SIGNAL(stateChanged(int)), module, TQT_SLOT(changed()) );
|
|
|
connect( m_underlining, TQT_SIGNAL(activated(int)), module, TQT_SLOT(changed()) );
|
|
|
connect( m_color, TQT_SIGNAL(changed(const TQColor&)), module, TQT_SLOT(changed()) );
|
|
|
connect( m_hoverColor, TQT_SIGNAL(changed(const TQColor&)), module, TQT_SLOT(changed()) );
|
|
|
connect( m_iconSize, TQT_SIGNAL(activated(int)), module, TQT_SLOT(changed()) );
|
|
|
connect( m_preview, TQT_SIGNAL(activated(int)), module, TQT_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"
|