rename FxLine directly in a QLineEdit #2918

Merged
merged 6 commits into from Aug 7, 2016

Projects

None yet

6 participants

@BaraMGB
Contributor
BaraMGB commented Jul 15, 2016

Same as #2916. For avoiding dialog window we can use a QLineEdit for renaming the FxLine. I used a QGraphicsView for rotating the QLineEdit.

renamefxline

@Umcaruje
Member

The beginning of the qlinedit is higher than the text's original position, which seems inconsistent to me. Other than that, looks good and avoids dialogs, so I'm all for that.

@tresf
Member
tresf commented Jul 17, 2016

Can someone explain the purpose of using two components over one in this instance? For example, can't we simply keep the input a QLineEdit and change the behavior depending on whether or not we're in edit mode by setting readOnly to true?

@Umcaruje
Member
Umcaruje commented Jul 17, 2016 edited

Can someone explain the purpose of using two components over one in this instance? For example, can't we simply keep the input a QLineEdit and change the behavior depending on whether or not we're in edit mode by setting readOnly to true?

Well, if one can make the disabled QLineEdit completely backgroundless and borderless, then that would be a better solution.

@BaraMGB
Contributor
BaraMGB commented Jul 22, 2016

Update: Now it uses for both (labeling and renaming) a QLineEdit.

@Umcaruje
Member

screenshot from 2016-07-24 14 59 22

Tested, looks and works like a charm 👍

@Umcaruje Umcaruje and 2 others commented on an outdated diff Jul 24, 2016
src/gui/widgets/FxLine.cpp
- FxMixer * mix = Engine::fxMixer();
- setToolTip( mix->effectChannel( m_channelIndex )->m_name );
+ m_scene = new QGraphicsScene();
+ m_scene->setSceneRect( 0, 0, 33, FxLineHeight );
+
+ m_view = new QGraphicsView( this );
+ m_view->setStyleSheet( "border-style: none; background: transparent;" );
@Umcaruje
Umcaruje Jul 24, 2016 Member

Shouldn't you do this in the CSS?

@BaraMGB
BaraMGB Jul 24, 2016 Contributor

I don't think so. The QGraphicsView is only a container for the QLineEdit. With it we can rotate the QLineEdit. I can't imagine a situation where the view should have borders or a background color. It's an internal solution the user (themer) don't need to know.

@Umcaruje
Umcaruje Jul 24, 2016 Member

Ah, ok, thanks for clarifying 👍. This looks good to merge.

@midi-pascal
midi-pascal Jul 24, 2016 Contributor

Just to let you know: if a track or a fx is renamed Lmms does not consider the project as modified.
You can quit with no question about saving...

@jasp00 jasp00 commented on an outdated diff Jul 24, 2016
include/FxLine.h
FxMixerView * m_mv;
+ FxMixer * m_mix;
@jasp00
jasp00 Jul 24, 2016 Member

Why this member? There is only one FxMixer.

@jasp00 jasp00 commented on an outdated diff Jul 24, 2016
src/gui/widgets/FxLine.cpp
@@ -23,22 +23,20 @@
*
*/
-#include "FxLine.h"
@jasp00
jasp00 Jul 24, 2016 Member

This #include should not be reordered. Besides being a coding convention, it checks that the header has all its dependencies declared.

@jasp00 jasp00 commented on an outdated diff Jul 24, 2016
src/gui/widgets/FxLine.cpp
+ m_view->setFocus();
+ m_renameLineEdit->selectAll();
+ m_renameLineEdit->setFocus();
+}
+
+
+
+
+void FxLine::renameFinished()
+{
+ m_inRename = false;
+ m_renameLineEdit->setReadOnly( true );
+ m_renameLineEdit->setFixedWidth( 65 );
+ m_lcd->show();
+ m_newName = m_renameLineEdit->text();
+ this->setFocus();
@jasp00
jasp00 Jul 24, 2016 Member

Why this->?

@BaraMGB
Contributor
BaraMGB commented Jul 24, 2016

@jasp00 Thanks for your revisiting. I updated the branch.
@midi-pascal interesting. I have to figure out how to fix that. perhaps you file an issue for that.

@zonkmachine
Member

I have to figure out how to fix that. perhaps you file an issue for that.

I think you just add Engine::getSong()->setModified(); after your changes.

@jasp00
Member
jasp00 commented Jul 24, 2016

Undo and redo should work with renaming. A StringModel should be implemented.

@BaraMGB
Contributor
BaraMGB commented Jul 25, 2016

I think you just add Engine::getSong()->setModified(); after your changes.

@zonkmachine works!

Undo and redo should work with renaming. A StringModel should be implemented.

@jasp00 can you point me to some code where I can learn how to do this?

@tresf
Member
tresf commented Jul 25, 2016

The model classes are generated dynamically, si they're a bit hard to find in the code, but search for IntModel for an example of an Integer version.

@BaraMGB
Contributor
BaraMGB commented Jul 26, 2016

I have updated. Now the project is set modified if the FxLine is renamed. But I fear I have no clue how to handle the undo/redo stuff. 😟

@jasp00
Member
jasp00 commented Jul 26, 2016

But I fear I have no clue how to handle the undo/redo stuff.

That can be done later.

@Umcaruje
Member

Tested this one out too, works like a charm. Here's a GIF:
gifrecord_2016-07-27_191956

@jasp00 jasp00 commented on an outdated diff Jul 28, 2016
src/gui/widgets/FxLine.cpp
}
+ m_renameLineEdit->setText( elideName( m_newName ) );
+ Engine::getSong()->setModified();
@jasp00
jasp00 Jul 28, 2016 Member

setModified() should be called only if text has changed.

@BaraMGB
Contributor
BaraMGB commented Jul 28, 2016

So, now it should works better.

@jasp00 jasp00 commented on an outdated diff Aug 1, 2016
include/FxLine.h
@@ -91,17 +95,22 @@ class FxLine : public QWidget
QColor m_strokeInnerInactive;
static QPixmap * s_sendBgArrow;
static QPixmap * s_receiveBgArrow;
-
- QStaticText m_staticTextName;
+ bool m_inRename;
+ QString m_newName;
@jasp00
jasp00 Aug 1, 2016 Member

It looks like this member is not needed. A local variable newName would be better.

@jasp00 jasp00 commented on an outdated diff Aug 1, 2016
include/FxLine.h
@@ -91,17 +95,22 @@ class FxLine : public QWidget
QColor m_strokeInnerInactive;
static QPixmap * s_sendBgArrow;
static QPixmap * s_receiveBgArrow;
-
- QStaticText m_staticTextName;
+ bool m_inRename;
+ QString m_newName;
+ QLineEdit * m_renameLineEdit;
+ QGraphicsProxyWidget * m_proxyWidget;
+ QGraphicsView * m_view;
+ QGraphicsScene * m_scene;
@jasp00
jasp00 Aug 1, 2016 Member

m_proxyWidget and m_scene do not need to be accessible as members.

@jasp00 jasp00 commented on an outdated diff Aug 1, 2016
include/FxLine.h
@@ -91,17 +95,22 @@ class FxLine : public QWidget
QColor m_strokeInnerInactive;
static QPixmap * s_sendBgArrow;
static QPixmap * s_receiveBgArrow;
-
- QStaticText m_staticTextName;
+ bool m_inRename;
+ QString m_newName;
+ QLineEdit * m_renameLineEdit;
+ QGraphicsProxyWidget * m_proxyWidget;
+ QGraphicsView * m_view;
+ QGraphicsScene * m_scene;
+ QString m_name;
@jasp00
jasp00 Aug 1, 2016 Member

This member is not needed. It is set to Engine::fxMixer()->effectChannel( m_channelIndex )->m_name.

@jasp00 jasp00 commented on an outdated diff Aug 1, 2016
src/gui/widgets/FxLine.cpp
- // Draw text shadow
- p->setPen( sh_color );
- p->drawStaticText( textLeft - 1, textTop + 1, m_staticTextName );
-
- // Draw foreground text
- p->setPen( isActive ? bt_color : te_color );
- p->drawStaticText( textLeft, textTop, m_staticTextName );
+QString FxLine::elideName( QString name )
+{
+ const int maxTextHeight = 70;
+ QFontMetrics metrics( FxLine::font() );
@jasp00
jasp00 Aug 1, 2016 Member

Why FxLine::font() instead of font()?

@BaraMGB
Contributor
BaraMGB commented Aug 2, 2016

Update. @jasp00 thank you very much for your revisiting!

@jasp00 jasp00 commented on an outdated diff Aug 4, 2016
src/gui/widgets/FxLine.cpp
@@ -94,13 +97,36 @@ FxLine::FxLine( QWidget * _parent, FxMixerView * _mv, int _channelIndex) :
"to the channel.\n\n"
"You can remove and move FX channels in the context menu, which is accessed "
- "by right-clicking the FX channel.\n") );
+ "by right-clicking the FX channel.\n" ) );
+
+ QString name = Engine::fxMixer()->effectChannel( m_channelIndex )->m_name;
+ setToolTip( name );
+
+ m_renameLineEdit = new QLineEdit();
+ m_renameLineEdit->setText( name );
+ m_renameLineEdit->setFixedWidth( 65 );
+ m_renameLineEdit->setFont( pointSizeF( FxLine::font(), 7.5f ) );
@jasp00
jasp00 Aug 4, 2016 Member

Just one FxLine::font() more.

@jasp00 jasp00 commented on an outdated diff Aug 4, 2016
src/gui/widgets/FxLine.cpp
m_channelIndex, m_mv->currentFxLine()->m_channelIndex ) != NULL;
QPainter painter;
painter.begin( this );
- drawFxLine( &painter, this,
- mix->effectChannel( m_channelIndex )->m_name,
- m_mv->currentFxLine() == this, sendToThis, receiveFromThis );
+ drawFxLine( &painter, this, m_mv->currentFxLine() == this, sendToThis, receiveFromThis );
@jasp00
jasp00 Aug 4, 2016 Member

If you want to keep one line, you may change the tab before m_mv into a space.

@BaraMGB
Contributor
BaraMGB commented Aug 4, 2016

👍

@zonkmachine
Member
zonkmachine commented Aug 4, 2016 edited

Cool!

One comment. When you hover over the text ( shows horizontally ) the string is remembered.
If you now change the text and hover over it again it's the previous line that shows up.
Edit: Before you hit enter that is....

@jasp00 jasp00 commented on an outdated diff Aug 5, 2016
include/FxLine.h
static const int FxLineHeight;
private:
- void drawFxLine( QPainter* p, const FxLine *fxLine, const QString& name, bool isActive, bool sendToThis, bool receiveFromThis );
+ void drawFxLine( QPainter* p, const FxLine *fxLine, bool isActive, bool sendToThis, bool receiveFromThis );
+ QString elideName( QString name );
@jasp00
jasp00 Aug 5, 2016 Member

const QString & name should be used instead of QString name to avoid the copy of the QString.

@jasp00 jasp00 commented on an outdated diff Aug 5, 2016
src/gui/widgets/FxLine.cpp
{
+ QString name = Engine::fxMixer()->effectChannel( m_channelIndex )->m_name;
+ if( !m_inRename && m_renameLineEdit->text() != elideName( name ) )
+ {
+ m_renameLineEdit->setText( elideName( name ) );
@jasp00
jasp00 Aug 5, 2016 Member

You may want to cache elideName( name ) to avoid this second call.

@BaraMGB
Contributor
BaraMGB commented Aug 5, 2016

@jasp00 update. 👍
@zonkmachine I turned the tool tip off in rename mode now. Good catch!

@jasp00 jasp00 merged commit a72ddf0 into LMMS:master Aug 7, 2016

1 check passed

continuous-integration/travis-ci/pr The Travis CI build passed
Details
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment