Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Auto dj crates #18

Merged
merged 29 commits into from
Jul 16, 2013
Merged
Show file tree
Hide file tree
Changes from 15 commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
eb6d41b
First version of auto-DJ crates.
ulatekh May 4, 2013
638c8b7
Just some minor changes to comments.
ulatekh May 10, 2013
de8a563
Merged with trunk; minor updates to merge conflicting changes.
ulatekh May 10, 2013
6a30eb3
Now the auto-DJ-crates table stores the last time the track was playe…
ulatekh May 12, 2013
ab9046c
Merged with lp:mixxx
ulatekh May 16, 2013
43360c9
Made the auto-DJ-crates feature subject to conditional compilation.
ulatekh May 16, 2013
417532a
Implemented an "Add crate" menu on the "Crates" tree-item in the "Aut…
ulatekh May 16, 2013
6e4f2f0
Changed "Add Crate to AutoDJ" to "Connect to AutoDJ", and "Remove Cra…
ulatekh Jun 3, 2013
02bd977
One more menu item needed updating -- "Add crate" is now "Connect Cra…
ulatekh Jun 3, 2013
dea693d
Merged with lp:mixxx
ulatekh Jun 5, 2013
f1a6d70
Now random-tracks chosen by the auto-DJ-crates feature can be in term…
ulatekh Jun 5, 2013
9d34467
Now auto-DJ-crates better handles situations where very few tracks ar…
ulatekh Jun 6, 2013
1ed581f
One more change to low-track situations in auto-DJ-crates.
ulatekh Jun 7, 2013
72cad18
Merged with lp:mixxx
ulatekh Jun 9, 2013
8e03aa0
Merge branch 'master' into auto-dj-crates
daschuer Jun 20, 2013
4a9ffe7
Merge branch 'master' of https://github.com/mixxxdj/mixxx into auto-d…
ulatekh Jun 22, 2013
60de69f
Fixed lots of formatting issues.
ulatekh Jun 22, 2013
1bc835b
Because early returns are completely different than gotos, and _so_ m…
ulatekh Jun 23, 2013
5f63af5
Merge pull request #1 from ulatekh/auto-dj-crates
daschuer Jun 24, 2013
d9c096a
allow not adding a track if no condition fits
daschuer Jun 24, 2013
8df76eb
unified wording, added tooltip for checkbox
daschuer Jun 24, 2013
6735fbc
Merge branch 'master' into autodj-crates2
daschuer Jul 7, 2013
d7cf2c1
Merge branch 'master' into auto-dj-crates
daschuer Jul 15, 2013
b3743ef
Fixed issues from RJs comments; Made crates menu "Auto DJ Source"
daschuer Jul 15, 2013
0d7af53
Changed context menu for crates in AutoDj tree
daschuer Jul 15, 2013
41d1168
fixed auto dj crate tree population after restart
daschuer Jul 16, 2013
852546d
Fixed Dynamic deck count in auto dj crates. Removed use of QMap::[] in
daschuer Jul 16, 2013
92bddf1
Tweaked GUI strings for auto dj crates
daschuer Jul 16, 2013
1c3df49
Merge branch 'master' into auto-dj-crates
daschuer Jul 16, 2013
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions SConstruct
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ available_features = [features.HifiEq,
features.MSVSHacks,
features.Vamp,
features.PromoTracks,
features.AutoDjCrates,

# "Features" of dubious quality
features.PerfTools,
Expand Down
23 changes: 22 additions & 1 deletion build/features.py
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ def sources(self, build):
sources = ['controllers/bulk/bulkcontroller.cpp',
'controllers/bulk/bulkenumerator.cpp']
if not int(build.flags['hid']):
sources.append('controllers/hid/hidcontrollerpresetfilehandler.cpp')
sources.append('controllers/hid/hidcontrollerpresetfilehandler.cpp')
return sources


Expand Down Expand Up @@ -1098,3 +1098,24 @@ def sources(self, build):
"library/featuredartistswebview.cpp",
]

class AutoDjCrates(Feature):
def description(self):
return "Auto-DJ crates (for random tracks)"

def enabled(self, build):
build.flags['autodjcrates'] = \
util.get_flags(build.env, 'autodjcrates', 1)
if int(build.flags['autodjcrates']):
return True
return False

def add_options(self, build, vars):
vars.Add('autodjcrates', 'Set to 1 to enable crates as a source for random Auto-DJ tracks.', 1)

def configure(self, build, conf):
if not self.enabled(build):
return
build.env.Append(CPPDEFINES = '__AUTODJCRATES__')

def sources(self, build):
return ['library/dao/autodjcratesdao.cpp']
28 changes: 18 additions & 10 deletions build/qtcreator/mixxx.pro
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
CONFIG += debug link_pkgconfig portmidi script vinylcontrol m4a
CONFIG += debug link_pkgconfig portmidi script vinylcontrol m4a autodjcrates
# ladspa
DEFINES += QMAKE \ # define QMAKE for not-SCons specific ifdefs like ui_scriptstudio.h
__PORTAUDIO__ \
Expand Down Expand Up @@ -742,15 +742,15 @@ SOURCES += $$BASE_DIR/src/vamp/vampanalyser.cpp \
$$BASE_DIR/src/analyservamptest.cpp \
$$BASE_DIR/src/analyservampkeytest.cpp \
$$BASE_DIR/lib/vamp/src/vamp-hostsdk/PluginBufferingAdapter.cpp \
$$BASE_DIR/lib/vamp/src/vamp-hostsdk/PluginChannelAdapter.cpp \
$$BASE_DIR/lib/vamp/src/vamp-hostsdk/PluginHostAdapter.cpp \
$$BASE_DIR/lib/vamp/src/vamp-hostsdk/PluginInputDomainAdapter.cpp \
$$BASE_DIR/lib/vamp/src/vamp-hostsdk/PluginLoader.cpp \
$$BASE_DIR/lib/vamp/src/vamp-hostsdk/PluginSummarisingAdapter.cpp \
$$BASE_DIR/lib/vamp/src/vamp-hostsdk/PluginWrapper.cpp \
$$BASE_DIR/lib/vamp/src/vamp-hostsdk/RealTime.cpp \
$$BASE_DIR/lib/vamp/src/vamp-sdk/PluginAdapter.cpp \
$$BASE_DIR/lib/vamp/src/vamp-sdk/RealTime.cpp
$$BASE_DIR/lib/vamp/src/vamp-hostsdk/PluginChannelAdapter.cpp \
$$BASE_DIR/lib/vamp/src/vamp-hostsdk/PluginHostAdapter.cpp \
$$BASE_DIR/lib/vamp/src/vamp-hostsdk/PluginInputDomainAdapter.cpp \
$$BASE_DIR/lib/vamp/src/vamp-hostsdk/PluginLoader.cpp \
$$BASE_DIR/lib/vamp/src/vamp-hostsdk/PluginSummarisingAdapter.cpp \
$$BASE_DIR/lib/vamp/src/vamp-hostsdk/PluginWrapper.cpp \
$$BASE_DIR/lib/vamp/src/vamp-hostsdk/RealTime.cpp \
$$BASE_DIR/lib/vamp/src/vamp-sdk/PluginAdapter.cpp \
$$BASE_DIR/lib/vamp/src/vamp-sdk/RealTime.cpp
}

CONFIG(tonal) {
Expand Down Expand Up @@ -856,6 +856,14 @@ CONFIG(ffmpeg) {
-logg
}

CONFIG(autodjcrates) {
DEFINES += __AUTODJCRATES__
HEADERS +=
$$BASE_DIR/src/library/dao/autodjcratesdao.h
SOURCES +=
$$BASE_DIR/src/library/dao/autodjcratesdao.cpp
}

# Copy Windows dependencies to DESTDIR.
win32 {
!exists($$DESTDIR):system( mkdir \"$$replace(DESTDIR, /,$$DIR_SEPARATOR)\" )
Expand Down
8 changes: 8 additions & 0 deletions res/schema.xml
Original file line number Diff line number Diff line change
Expand Up @@ -347,4 +347,12 @@ METADATA
ALTER TABLE Library ADD COLUMN key_id INTEGER DEFAULT 0;
</sql>
</revision>
<revision version="19" min_compatible="3">
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is now outdated (v19 is taken).

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This, as well as the formatting issues and goto usage, have been taken care of.
Please let me know if there's anything else preventing this pull request from being merged.

<description>
Crates in auto-DJ queue (for automated random-track selection)
</description>
<sql>
ALTER TABLE crates ADD COLUMN autodj integer DEFAULT 0;
</sql>
</revision>
</schema>
15 changes: 15 additions & 0 deletions src/dlgautodj.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,14 @@ DlgAutoDJ::DlgAutoDJ(QWidget* parent, ConfigObject<ConfigValue>* pConfig,
connect(pushButtonSkipNext, SIGNAL(clicked(bool)),
this, SLOT(skipNextButton(bool)));

#ifdef __AUTODJCRATES__
connect(pushButtonAddRandom, SIGNAL(clicked(bool)),
this, SIGNAL(addRandomButton(bool)));
#else // __AUTODJCRATES__
pushButtonAddRandom->setVisible(false);
horizontalLayout->removeWidget(pushButtonAddRandom);
#endif // __AUTODJCRATES__

m_pCOFadeNow = new ControlPushButton(
ConfigKey("[AutoDJ]", "fade_now"));
m_pCOTFadeNow = new ControlObjectThreadMain(m_pCOFadeNow);
Expand Down Expand Up @@ -676,3 +684,10 @@ void DlgAutoDJ::transitionValueChanged(int value) {
ConfigValue(value));
m_backUpTransition = value;
}

void DlgAutoDJ::enableRandomButton(bool a_bEnabled)
{
#ifdef __AUTODJCRATES__
pushButtonAddRandom->setEnabled (a_bEnabled);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please remove spaces between function and arguments list (here and elsewhere).

#endif // __AUTODJCRATES__
}
2 changes: 2 additions & 0 deletions src/dlgautodj.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,10 @@ class DlgAutoDJ : public QWidget, public Ui::DlgAutoDJ, public LibraryView {
void player1PlayChanged(double value);
void player2PlayChanged(double value);
void transitionValueChanged(int value);
void enableRandomButton(bool a_bEnabled);

signals:
void addRandomButton(bool buttonChecked);
void loadTrack(TrackPointer tio);
void loadTrackToPlayer(TrackPointer tio, QString group, bool);

Expand Down
7 changes: 7 additions & 0 deletions src/dlgautodj.ui
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,13 @@
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButtonAddRandom">
<property name="text">
<string>Add random</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButtonSkipNext">
<property name="toolTip">
Expand Down
67 changes: 67 additions & 0 deletions src/dlgprefcontrols.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -212,6 +212,42 @@ DlgPrefControls::DlgPrefControls(QWidget * parent, MixxxApp * mixxx,
ComboBoxAutoDjRequeue->setCurrentIndex(m_pConfig->getValueString(ConfigKey("[Auto DJ]", "Requeue")).toInt());
connect(ComboBoxAutoDjRequeue, SIGNAL(activated(int)), this, SLOT(slotSetAutoDjRequeue(int)));

#ifdef __AUTODJCRATES__

// The auto-DJ active-percentage for randomly-selected tracks
autoDjActivePercentageSpinBox->setValue (m_pConfig->getValueString
(ConfigKey("[Auto DJ]", "ActivePercentage"), "20").toInt());
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please don't separate argument lists from function names. The reason for this is so that you can tell that getValueString is a function call without having to parse the entire multi-line statement.

connect(autoDjActivePercentageSpinBox, SIGNAL(valueChanged(int)),
this, SLOT(slotSetAutoDjActivePercentage(int)));

// The auto-DJ replay-age for randomly-selected tracks
autoDjReplayAgeCheckBox->setChecked ((bool) m_pConfig->getValueString
(ConfigKey("[Auto DJ]", "UseReplayAge"), "0").toInt());
connect(autoDjReplayAgeCheckBox, SIGNAL(stateChanged(int)),
this, SLOT(slotSetAutoDjUseReplayAge(int)));
autoDjReplayAgeTimeEdit->setTime (QTime::fromString
(m_pConfig->getValueString
(ConfigKey("[Auto DJ]", "ReplayAge"), "23:59"),
autoDjReplayAgeTimeEdit->displayFormat()));
autoDjReplayAgeTimeEdit->setEnabled(autoDjReplayAgeCheckBox->checkState()
== Qt::Checked);
connect(autoDjReplayAgeTimeEdit, SIGNAL(timeChanged(const QTime &)),
this, SLOT(slotSetAutoDjReplayAge(const QTime &)));

#else // __AUTODJCRATES__

// Remove the preferences.
autoDjActivePercentageLabel->setVisible(false);
GridLayout1->removeWidget(autoDjActivePercentageLabel);
autoDjActivePercentageSpinBox->setVisible(false);
GridLayout1->removeWidget(autoDjActivePercentageSpinBox);
autoDjReplayAgeCheckBox->setVisible(false);
GridLayout1->removeWidget(autoDjReplayAgeCheckBox);
autoDjReplayAgeTimeEdit->setVisible(false);
GridLayout1->removeWidget(autoDjReplayAgeTimeEdit);

#endif // __AUTODJCRATES__

//
// Skin configurations
//
Expand Down Expand Up @@ -253,6 +289,10 @@ DlgPrefControls::DlgPrefControls(QWidget * parent, MixxxApp * mixxx,
//
// Tooltip configuration
//
// Set default value in config file, if not present
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this to fix the issue where tooltips are not showing on a new profile? This is fixed in master I believe.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I didn't add that. I've removed it.

if (m_pConfig->getValueString(ConfigKey("[Controls]","Tooltips")).length() == 0)
m_pConfig->set(ConfigKey("[Controls]","Tooltips"), ConfigValue(1));

ComboBoxTooltips->addItem(tr("On")); // 1
ComboBoxTooltips->addItem(tr("On (only in Library)")); // 2
ComboBoxTooltips->addItem(tr("Off")); // 0
Expand Down Expand Up @@ -424,6 +464,33 @@ void DlgPrefControls::slotSetAutoDjRequeue(int)
m_pConfig->set(ConfigKey("[Auto DJ]", "Requeue"), ConfigValue(ComboBoxAutoDjRequeue->currentIndex()));
}

void DlgPrefControls::slotSetAutoDjActivePercentage(int a_iValue)
{
#ifdef __AUTODJCRATES__
QString str;
str.setNum (a_iValue);
m_pConfig->set(ConfigKey("[Auto DJ]","ActivePercentage"),str);
#endif // __AUTODJCRATES__
}

void DlgPrefControls::slotSetAutoDjUseReplayAge(int a_iState)
{
#ifdef __AUTODJCRATES__
bool bChecked = (a_iState == Qt::Checked);
QString strChecked = (bChecked) ? "1" : "0";
m_pConfig->set (ConfigKey("[Auto DJ]", "UseReplayAge"), strChecked);
autoDjReplayAgeTimeEdit->setEnabled(bChecked);
#endif // __AUTODJCRATES__
}

void DlgPrefControls::slotSetAutoDjReplayAge(const QTime &a_rTime)
{
#ifdef __AUTODJCRATES__
QString str = a_rTime.toString (autoDjReplayAgeTimeEdit->displayFormat());
m_pConfig->set(ConfigKey("[Auto DJ]","ReplayAge"),str);
#endif // __AUTODJCRATES__
}

void DlgPrefControls::slotSetTooltips(int)
{
int configValue = (ComboBoxTooltips->currentIndex() + 1) % 3;
Expand Down
3 changes: 3 additions & 0 deletions src/dlgprefcontrols.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,9 @@ public slots:
void slotSetCueDefault(int);
void slotSetCueRecall(int);
void slotSetAutoDjRequeue(int);
void slotSetAutoDjActivePercentage(int);
void slotSetAutoDjUseReplayAge(int);
void slotSetAutoDjReplayAge(const QTime &a_rTime);
void slotSetRateRamp(bool);
void slotSetRateRampSensitivity(int);
void slotSetLocale(int);
Expand Down
42 changes: 41 additions & 1 deletion src/dlgprefcontrolsdlg.ui
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<x>0</x>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this ought to go in a new preferences section for AutoDJ. That will pave the way for more advanced AutoDJ stuff.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, of cause. But the preferences reordering is out of scope of this project. So this could be done after merging the advanced-auto-dj branch as well.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you, Daniel. I appreciate your reasonableness.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We treat this dialog like a clown car. AutoDJ requeue shouldn't have gone in here in the first place. Doing this with the advanced autodj work sounds good -- thanks Daniel.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I put them here because the "Interface" preferences already had the "re-queue tracks in Auto DJ" entry.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No need to explain -- that's reasonable. There's a tipping point and we're pretty much at it is all I'm saying.

<y>0</y>
<width>519</width>
<height>728</height>
<height>939</height>
</rect>
</property>
<property name="windowTitle">
Expand Down Expand Up @@ -283,6 +283,46 @@
</property>
</widget>
</item>
<item row="11" column="0">
<widget class="QLabel" name="autoDjActivePercentageLabel">
<property name="text">
<string>Auto DJ: Minimum available tracks (percent)</string>
</property>
</widget>
</item>
<item row="11" column="1" colspan="2">
<widget class="QSpinBox" name="autoDjActivePercentageSpinBox">
<property name="toolTip">
<string>This percentage of tracks are always available for selecting, regardless of when they were last played.</string>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's pretty unclear what this setting does from the name and description. Is there a more user-friendly name and description?

"When the pool of unplayed tracks drops below this percentage of the total tracks available to AutoDJ, add the least-recently played tracks back into the pool until it is this size." :-/

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That wasn't my choice -- daschuer suggested this text.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Way to throw @daschuer under the bus :P. I'm not interested in who wrote what. I'm trying to figure out the best phrasing to maximize comprehensibility. Got any ideas?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I was just saying that in case your multitude of petty criticisms was somehow directed at me personally (e.g. because I went ahead and implemented a feature that you wanted kiboshed).

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There's no rush to merge here -- we're nowhere near our next major release. What you're saying is that you want to be done working on this and I understand that but please work with me to get the code and feature in a good, ready to release state because once it is merged I know from experience that you (i.e. you the general you, contributor of a shiny new feature) won't be as interested in fixing tooltip phrasing.

Regarding style issues -- there are minor pros and cons of various styles but the most important thing is uniformity. When the style is uniform, I can scan a file much easier and generally eyeball the shape of it -- see how the control flows, the exit points, blocks, etc. I'm sorry for the tedious style comments but they are an important part of a healthy codebase.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re: rush to merge...the longer we go without merging, the more work I have to do to keep up with trunk changes that affect my code (e.g. getting rid of the top-level mixxx directory, which "git merge" handled badly, requiring me to do a LOT of hand-work to make things right again). This is wasted effort.

Re: style comments...in my experience, as long as the code is human-readable, that's more than enough. If one is modifying someone else's code, one should try very hard to mimic the local style, so that the changes don't look jarring next to older code. Anything on top of that is needlessly pedantic.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yea, that top level change was quite rough. Sorry :-/. There won't be anything that drastic to merge with going forward.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ulatekh: You have forked from a version without the root mixxx folder. daschuer@8e03aa0. So the compassion goes to me ;-)

</property>
<property name="maximum">
<number>100</number>
</property>
<property name="value">
<number>20</number>
</property>
</widget>
</item>
<item row="12" column="0">
<widget class="QCheckBox" name="autoDjReplayAgeCheckBox">
<property name="text">
<string>Auto DJ: Track ignore time</string>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This name isn't very informative. How about: "AutoDJ minimum time until track replay."

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"Auto DJ: Track ignore time" is already quite long for a preference NAME.
"Replay" is misleading because it is not played, it is only queued. Also the track is not re-queued after this time it is actually not ignored by the selector. .. it goes back to the pool of available tracks for later selection for queuing.
The first version was "Auto DJ Selector: Track ignore time"

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There isn't really a distinction between being queued and being played because being queued is the same thing as being played in the future. We could say re-queue instead of replay though?

The track can't get replayed until it is back in the pool so it makes sense to me to call this the minimum time until a track is replayed/requeued. Or at least I think it would be clearer to a first time user than "Track ignore time".

RE: name length. We already have preference names like "Re-queue tracks in AutoDJ". I don't think this is too long. When this all moves into its own preference dialog they will have more room to breathe.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, "Auto DJ: minimum time until track re-queue." would be fine for me, If it is this what a native speaker understand the best.

Since this new name describes the underlying methods fine, I am just have concerns if this is the best description from th use case point of view. IMHO The feature will be used most radio radio DJs where it is common to replay tracks after a hour or so.
They want to "Ignore" a track for a time. I am not stick to the word "ignore" that much, but I like the inverse description of this feature like the "tack is baned for" vs. "it is un-baned after".

De: "Auto-DJ: Titel ausschließen für ..."
En: "Auto DJ: Suspend track for .."
De: "Auto-DJ: Titel vom erneuten Einreihen ausschließen für ..."
En: "Auto DJ: Suspend track from re-queue for .."

I would be happy if a native speaker will propose the ultimate solution ;-)

</property>
</widget>
</item>
<item row="12" column="1" colspan="2">
<widget class="QTimeEdit" name="autoDjReplayAgeTimeEdit">
<property name="toolTip">
<string>Time after a track is available for selecting again</string>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not really a sentence... how about: "Duration after which a track is eligible for selection by AutoDJ."

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"Duration after which a track is eligible for selection by AutoDJ again."?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

sounds good

</property>
<property name="displayFormat">
<string>hh:mm</string>
</property>
<property name="timeSpec">
<enum>Qt::LocalTime</enum>
</property>
</widget>
</item>
</layout>
</item>
<item row="2" column="0">
Expand Down
Loading