File indexing completed on 2025-03-09 04:10:05
0001 /* 0002 * SPDX-FileCopyrightText: 2005 Bart Coppens <kde@bartcoppens.be> 0003 * SPDX-FileCopyrightText: 2010 Lukáš Tvrdý <lukast.dev@gmail.com> 0004 * SPDX-FileCopyrightText: 2013 Somsubhra Bairi <somsubhra.bairi@gmail.com> 0005 * 0006 * SPDX-License-Identifier: GPL-2.0-or-later 0007 */ 0008 0009 #include "kis_clipboard_brush_widget.h" 0010 0011 #include <QLabel> 0012 #include <QImage> 0013 #include <QPixmap> 0014 #include <QShowEvent> 0015 #include <QPushButton> 0016 #include <QDialogButtonBox> 0017 #include <QUuid> 0018 0019 #include <KoResourcePaths.h> 0020 0021 #include <kis_debug.h> 0022 #include "kis_image.h" 0023 #include "kis_clipboard.h" 0024 #include "kis_paint_device.h" 0025 #include "kis_gbr_brush.h" 0026 #include "KisBrushServerProvider.h" 0027 #include "kis_icon.h" 0028 #include <KisResourceUserOperations.h> 0029 0030 #include <kstandardguiitem.h> 0031 0032 KisClipboardBrushWidget::KisClipboardBrushWidget(QWidget *parent, const QString &caption, KisImageWSP /*image*/) 0033 : KisWdgClipboardBrush(parent) 0034 { 0035 setWindowTitle(caption); 0036 preview->setScaledContents(false); 0037 preview->setFixedSize(preview->size()); 0038 preview->setStyleSheet("border: 2px solid #222; border-radius: 4px; padding: 5px; font: normal 10px;"); 0039 0040 0041 m_rServer = KisBrushServerProvider::instance()->brushServer(); 0042 0043 m_brush = 0; 0044 0045 m_clipboard = KisClipboard::instance(); 0046 0047 connect(m_clipboard, SIGNAL(clipChanged()), this, SLOT(slotClipboardContentChanged())); 0048 connect(colorAsmask, SIGNAL(toggled(bool)), this, SLOT(slotUpdateUseColorAsMask(bool))); 0049 connect(preserveAlpha, SIGNAL(toggled(bool)), this, SLOT(slotCreateBrush())); 0050 connect(buttonBox, SIGNAL(accepted()), this, SLOT(slotAddPredefined())); 0051 connect(nameEdit, SIGNAL(textEdited(const QString&)), this, SLOT(slotUpdateSaveButton())); 0052 0053 spacingWidget->setSpacing(true, 1.0); 0054 connect(spacingWidget, SIGNAL(sigSpacingChanged()), SLOT(slotSpacingChanged())); 0055 0056 KGuiItem::assign(buttonBox->button(QDialogButtonBox::Save), KStandardGuiItem::save()); 0057 KGuiItem::assign(buttonBox->button(QDialogButtonBox::Cancel), KStandardGuiItem::cancel()); 0058 } 0059 0060 KisClipboardBrushWidget::~KisClipboardBrushWidget() 0061 { 0062 } 0063 0064 void KisClipboardBrushWidget::slotClipboardContentChanged() 0065 { 0066 slotCreateBrush(); 0067 if (m_brush) { 0068 colorAsmask->setChecked(true); // initializing this has to happen here since we need a valid brush for it to work 0069 preserveAlpha->setEnabled(true); 0070 preserveAlpha->setChecked(false); 0071 } 0072 } 0073 0074 void KisClipboardBrushWidget::slotCreateBrush() 0075 { 0076 // do nothing if it's hidden otherwise it can break the active brush is something is copied 0077 if (m_clipboard->hasClip() && !isHidden()) { 0078 0079 pd = m_clipboard->clip(QRect(0, 0, 0, 0), false); //Weird! Don't know how this works! 0080 if (pd) { 0081 QRect rc = pd->exactBounds(); 0082 0083 m_brush = KisBrushSP(new KisGbrBrush(pd, rc.x(), rc.y(), rc.width(), rc.height())); 0084 0085 m_brush->setSpacing(spacingWidget->spacing()); 0086 m_brush->setAutoSpacing(spacingWidget->autoSpacingActive(), spacingWidget->autoSpacingCoeff()); 0087 m_brush->setFilename(TEMPORARY_CLIPBOARD_BRUSH_FILENAME); 0088 m_brush->setName(TEMPORARY_CLIPBOARD_BRUSH_NAME); 0089 m_brush->setValid(true); 0090 0091 if (colorAsmask->isChecked()) { 0092 static_cast<KisGbrBrush*>(m_brush.data())->makeMaskImage(preserveAlpha->isChecked()); 0093 static_cast<KisGbrBrush*>(m_brush.data())->setBrushApplication(preserveAlpha->isChecked() ? LIGHTNESSMAP : ALPHAMASK); 0094 } else { 0095 static_cast<KisGbrBrush*>(m_brush.data())->setBrushApplication(IMAGESTAMP); 0096 } 0097 0098 int w = preview->size().width()-10; 0099 preview->setPixmap(QPixmap::fromImage(m_brush->image().scaled(w, w, Qt::KeepAspectRatio))); 0100 } 0101 } else { 0102 preview->setText(i18n("Nothing copied\n to Clipboard")); 0103 } 0104 0105 if (!m_brush) { 0106 buttonBox->button(QDialogButtonBox::Save)->setEnabled(false); 0107 } else { 0108 buttonBox->button(QDialogButtonBox::Save)->setEnabled(true); 0109 } 0110 } 0111 0112 void KisClipboardBrushWidget::slotSpacingChanged() 0113 { 0114 if (m_brush) { 0115 m_brush->setSpacing(spacingWidget->spacing()); 0116 m_brush->setAutoSpacing(spacingWidget->autoSpacingActive(), spacingWidget->autoSpacingCoeff()); 0117 } 0118 } 0119 0120 void KisClipboardBrushWidget::showEvent(QShowEvent *) 0121 { 0122 slotClipboardContentChanged(); 0123 } 0124 0125 void KisClipboardBrushWidget::slotUpdateUseColorAsMask(bool useColorAsMask) 0126 { 0127 preserveAlpha->setEnabled(useColorAsMask); 0128 slotCreateBrush(); 0129 } 0130 0131 void KisClipboardBrushWidget::slotAddPredefined() 0132 { 0133 if(!m_brush) return; 0134 0135 QString extension = ".gbr"; 0136 QString name = nameEdit->text(); 0137 0138 if (m_rServer) { 0139 KisGbrBrushSP resource = m_brush->clone().dynamicCast<KisGbrBrush>(); 0140 0141 if (nameEdit->text().isEmpty()) { 0142 resource->setName(QUuid::createUuid().toByteArray().toHex()); 0143 } 0144 else { 0145 resource->setName(name); 0146 } 0147 0148 resource->setFilename(resource->name().split(" ").join("_") + extension); 0149 0150 if (KisResourceUserOperations::addResourceWithUserInput(this, resource)) { 0151 emit sigNewPredefinedBrush(resource); 0152 } 0153 } 0154 0155 close(); 0156 } 0157 0158 void KisClipboardBrushWidget::slotUpdateSaveButton() 0159 { 0160 if (QFileInfo(m_rServer->saveLocation() + "/" + nameEdit->text().split(" ").join("_") 0161 + ".gbr").exists()) { 0162 buttonBox->button(QDialogButtonBox::Save)->setText(i18n("Overwrite")); 0163 } else { 0164 buttonBox->button(QDialogButtonBox::Save)->setText(i18n("Save")); 0165 } 0166 } 0167 0168 #include "moc_kis_clipboard_brush_widget.cpp"