Skip to content

Commit

Permalink
Implement double-click to edit layer name
Browse files Browse the repository at this point in the history
  • Loading branch information
MrStevns committed Sep 22, 2024
1 parent bb3d5d6 commit 287c3dc
Show file tree
Hide file tree
Showing 5 changed files with 172 additions and 5 deletions.
2 changes: 2 additions & 0 deletions app/app.pro
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ HEADERS += \
src/importpositiondialog.h \
src/layeropacitydialog.h \
src/layervisibilitybutton.h \
src/lineeditwidget.h \
src/mainwindow2.h \
src/onionskinwidget.h \
src/predefinedsetmodel.h \
Expand Down Expand Up @@ -138,6 +139,7 @@ SOURCES += \
src/importpositiondialog.cpp \
src/layeropacitydialog.cpp \
src/layervisibilitybutton.cpp \
src/lineeditwidget.cpp \
src/main.cpp \
src/mainwindow2.cpp \
src/onionskinwidget.cpp \
Expand Down
93 changes: 93 additions & 0 deletions app/src/lineeditwidget.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
#include "lineeditwidget.h"

#include <QLineEdit>
#include <QEvent>
#include <QKeyEvent>

LineEditWidget::LineEditWidget(QWidget* parent, QString text)
: QLineEdit(parent)
{
setObjectName("LineEditWidget");

setStyleSheet("LineEditWidget[readOnly=true] {"
"background-color: transparent;"
"border: 0;"
"}");
setText(text);
setReadOnly(true);
}

void LineEditWidget::mousePressEvent(QMouseEvent* event)
{
QLineEdit::mousePressEvent(event);

// The event is ignored explicitly
// so that we can allow it to propergate up the chain
event->ignore();
}

void LineEditWidget::mouseMoveEvent(QMouseEvent* event)
{
QLineEdit::mouseMoveEvent(event);

// The event is ignored explicitly
// so that we can allow it to propergate up the chain
event->ignore();
}

void LineEditWidget::mouseReleaseEvent(QMouseEvent* event)
{
QLineEdit::mouseReleaseEvent(event);

// The event is ignored explicitly
// so that we can allow it to propergate up the chain
event->ignore();
}

void LineEditWidget::mouseDoubleClickEvent(QMouseEvent* event)
{
QLineEdit::mouseDoubleClickEvent(event);

setReadOnly(false);
setFocus();
selectAll();

reloadStylesheet();

// There's no ignore event here because in this case we want to catch it.
}

void LineEditWidget::focusOutEvent(QFocusEvent *event)
{
QLineEdit::focusOutEvent(event);
setReadOnly(true);
reloadStylesheet();
}

void LineEditWidget::reloadStylesheet()
{
// Apparently it's good enough to just call setStyleSheet with its current styling
// to make it update.
setStyleSheet(styleSheet());
}

void LineEditWidget::keyPressEvent(QKeyEvent* event)
{
QLineEdit::keyPressEvent(event);

if (event->key() == Qt::Key_Return) {
setReadOnly(true);
} else if (event->key() == Qt::Key_Escape) {
undo();
setReadOnly(true);
}
reloadStylesheet();
}

void LineEditWidget::deselect()
{
QLineEdit::deselect();
setReadOnly(true);

reloadStylesheet();
}
34 changes: 34 additions & 0 deletions app/src/lineeditwidget.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
#ifndef LINEEDITWIDGET_H
#define LINEEDITWIDGET_H

#include <QObject>
#include <QLineEdit>

class Layer;
class QLabel;
class QLineEdit;
class QStackedLayout;

class LineEditWidget : public QLineEdit
{
Q_OBJECT
public:
LineEditWidget(QWidget* parent, QString text);

void mousePressEvent(QMouseEvent*) override;
void mouseMoveEvent(QMouseEvent* event) override;
void mouseReleaseEvent(QMouseEvent* event) override;
void mouseDoubleClickEvent(QMouseEvent *) override;
void focusOutEvent(QFocusEvent* event) override;
void keyPressEvent(QKeyEvent* event) override;

void deselect();

private:
// The stylesheet has to be updated on every event
// where the read-only property is changed
void reloadStylesheet();

};

#endif // LINEEDITWIDGET_H
42 changes: 38 additions & 4 deletions app/src/timelinelayercelleditorwidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#include "viewmanager.h"
#include "camerapropertiesdialog.h"
#include "layervisibilitybutton.h"
#include "lineeditwidget.h"

#include <QApplication>
#include <QInputDialog>
Expand All @@ -22,6 +23,7 @@
#include <QLayout>
#include <QSvgWidget>
#include <QIcon>
#include <QMessageBox>

TimeLineLayerCellEditorWidget::TimeLineLayerCellEditorWidget(QWidget* parent,
Editor* editor,
Expand All @@ -44,13 +46,15 @@ TimeLineLayerCellEditorWidget::TimeLineLayerCellEditorWidget(QWidget* parent,
iconLabel->setPixmap(mIcon.pixmap(mLabelIconSize));
mHBoxLayout->addWidget(iconLabel);
mHBoxLayout->addSpacing(4);
mLayerNameLabel = new QLabel(mLayer->name());
mHBoxLayout->addWidget(mLayerNameLabel);
mLayerNameEditWidget = new LineEditWidget(this, mLayer->name());
mHBoxLayout->addWidget(mLayerNameEditWidget);
mHBoxLayout->addSpacerItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Ignored));
mHBoxLayout->setContentsMargins(0,0,0,0);
mHBoxLayout->setSpacing(0);

connect(layerVisibilityButton, &LayerVisibilityButton::visibilityChanged, this, &TimeLineLayerCellEditorWidget::layerVisibilityChanged);
connect(mLayerNameEditWidget, &LineEditWidget::editingFinished, this, &TimeLineLayerCellEditorWidget::onFinishedEditingName);
connect(mEditor->layers(), &LayerManager::currentLayerChanged, mLayerNameEditWidget, &LineEditWidget::deselect);
}

void TimeLineLayerCellEditorWidget::onLayerVisibilityChanged()
Expand Down Expand Up @@ -97,6 +101,7 @@ void TimeLineLayerCellEditorWidget::paintBackground(QPainter& painter, const QPa

void TimeLineLayerCellEditorWidget::mousePressEvent(QMouseEvent *event)
{
QWidget::mousePressEvent(event);
if (mEditor->layers()->currentLayer() != mLayer)
{
mEditor->layers()->setCurrentLayer(mLayer);
Expand All @@ -108,16 +113,19 @@ void TimeLineLayerCellEditorWidget::mousePressEvent(QMouseEvent *event)

void TimeLineLayerCellEditorWidget::mouseMoveEvent(QMouseEvent *event)
{
QWidget::mouseMoveEvent(event);
handleDragging(event);
}

void TimeLineLayerCellEditorWidget::mouseReleaseEvent(QMouseEvent *event)
{
QWidget::mouseReleaseEvent(event);
handleDragEnded(event);
}

void TimeLineLayerCellEditorWidget::mouseDoubleClickEvent(QMouseEvent * event)
{
QWidget::mouseDoubleClickEvent(event);
if (event->buttons() & Qt::LeftButton)
{
if (!isInsideLayerVisibilityArea(event))
Expand Down Expand Up @@ -196,7 +204,7 @@ void TimeLineLayerCellEditorWidget::editLayerProperties(LayerCamera* cameraLayer

if (!name.isEmpty())
{
mLayerNameLabel->setText(name);
mLayerNameEditWidget->setText(name);
mEditor->layers()->renameLayer(cameraLayer, name);
}
QSettings settings(PENCIL2D, PENCIL2D);
Expand All @@ -220,6 +228,32 @@ void TimeLineLayerCellEditorWidget::editLayerName(Layer* layer) const
return;
}

mLayerNameLabel->setText(name);
mLayerNameEditWidget->setText(name);
mEditor->layers()->renameLayer(layer, name);
}

void TimeLineLayerCellEditorWidget::onFinishedEditingName()
{
QRegularExpression regex("([\\x{FFEF}-\\x{FFFF}])+");
QString newName = mLayerNameEditWidget->text();

newName.replace(regex, "");
if (mWarningShown) {
return;
}

if (newName.isEmpty())
{
mWarningShown = true;
mLayerNameEditWidget->setText(mLayer->name());
int result = QMessageBox::information(this, tr("Empty name"), tr("The name of the layer cannot be left empty"),
QMessageBox::Ok);

if (result == QMessageBox::Ok) {
mWarningShown = false;
}
return;
}

mEditor->layers()->renameLayer(mLayer, newName);
}
6 changes: 5 additions & 1 deletion app/src/timelinelayercelleditorwidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ class PreferenceManager;
class QHBoxLayout;
class QIcon;
class QLabel;
class LineEditWidget;

class TimeLineLayerCellEditorWidget : public QWidget
{
Expand Down Expand Up @@ -63,11 +64,14 @@ class TimeLineLayerCellEditorWidget : public QWidget
void editLayerProperties(LayerCamera* cameraLayer) const;
void editLayerName(Layer* layer) const;

void onFinishedEditingName();

QSize mLabelIconSize = QSize(20,20);
bool mDidDetach = false;
bool mIsDraggable = false;
bool mWarningShown = false;

QLabel* mLayerNameLabel = nullptr;
LineEditWidget* mLayerNameEditWidget = nullptr;
QIcon mIcon;

int mDetachThreshold = 5;
Expand Down

0 comments on commit 287c3dc

Please sign in to comment.