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"