@ -329,11 +329,10 @@ void TagEditor::update()
}
}
void TagEditor : : enterPressed ( )
bool TagEditor : : enterDirectory ( )
{
using Global : : wFooter ;
if ( w = = Dirs )
bool result = false ;
if ( w = = Dirs & & ! Dirs - > empty ( ) )
{
MPD : : DirectoryIterator directory = Mpd . GetDirectories ( Dirs - > current ( ) - > value ( ) . second ) , end ;
bool has_subdirs = directory ! = end ;
@ -344,11 +343,194 @@ void TagEditor::enterPressed()
itsBrowsedDir = Dirs - > current ( ) - > value ( ) . second ;
Dirs - > clear ( ) ;
Dirs - > reset ( ) ;
result = true ;
}
}
return result ;
}
void TagEditor : : mouseButtonPressed ( MEVENT me )
{
auto tryPreviousColumn = [ this ] ( ) - > bool {
bool result = true ;
if ( w ! = Dirs )
{
if ( previousColumnAvailable ( ) )
previousColumn ( ) ;
else
result = false ;
}
return result ;
} ;
auto tryNextColumn = [ this ] ( ) - > bool {
bool result = true ;
if ( w ! = Tags )
{
if ( nextColumnAvailable ( ) )
nextColumn ( ) ;
else
result = false ;
}
return result ;
} ;
if ( w = = FParserDialog )
{
if ( FParserDialog - > hasCoords ( me . x , me . y ) )
{
if ( me . bstate & ( BUTTON1_PRESSED | BUTTON3_PRESSED ) )
{
FParserDialog - > Goto ( me . y ) ;
if ( me . bstate & BUTTON3_PRESSED )
runAction ( ) ;
}
else
Screen < WindowType > : : mouseButtonPressed ( me ) ;
}
}
else if ( w = = FParser | | w = = FParserHelper )
{
if ( FParser - > hasCoords ( me . x , me . y ) )
{
if ( w ! = FParser )
{
if ( previousColumnAvailable ( ) )
previousColumn ( ) ;
else
return ;
}
if ( size_t ( me . y ) < FParser - > size ( ) & & ( me . bstate & ( BUTTON1_PRESSED | BUTTON3_PRESSED ) ) )
{
FParser - > Goto ( me . y ) ;
if ( me . bstate & BUTTON3_PRESSED )
runAction ( ) ;
}
else
Screen < WindowType > : : mouseButtonPressed ( me ) ;
}
else if ( FParserHelper - > hasCoords ( me . x , me . y ) )
{
if ( w ! = FParserHelper )
{
if ( nextColumnAvailable ( ) )
nextColumn ( ) ;
else
return ;
}
scrollpadMouseButtonPressed ( * FParserHelper , me ) ;
}
}
else if ( ! Dirs - > empty ( ) & & Dirs - > hasCoords ( me . x , me . y ) )
{
if ( ! tryPreviousColumn ( ) | | ! tryPreviousColumn ( ) )
return ;
if ( size_t ( me . y ) < Dirs - > size ( ) & & ( me . bstate & ( BUTTON1_PRESSED | BUTTON3_PRESSED ) ) )
{
Dirs - > Goto ( me . y ) ;
if ( me . bstate & BUTTON1_PRESSED )
enterDirectory ( ) ;
}
else
Screen < WindowType > : : mouseButtonPressed ( me ) ;
Tags - > clear ( ) ;
}
else if ( ! TagTypes - > empty ( ) & & TagTypes - > hasCoords ( me . x , me . y ) )
{
if ( w ! = TagTypes )
{
bool success ;
if ( w = = Dirs )
success = tryNextColumn ( ) ;
else
Statusbar : : print ( " No subdirectories found " ) ;
success = tryPreviousColumn ( ) ;
if ( ! success )
return ;
}
else if ( w = = FParserDialog )
if ( size_t ( me . y ) < TagTypes - > size ( ) & & ( me . bstate & ( BUTTON1_PRESSED | BUTTON3_PRESSED ) ) )
{
if ( ! TagTypes - > Goto ( me . y ) )
return ;
TagTypes - > refresh ( ) ;
Tags - > refresh ( ) ;
if ( me . bstate & BUTTON3_PRESSED )
runAction ( ) ;
}
else
Screen < WindowType > : : mouseButtonPressed ( me ) ;
}
else if ( ! Tags - > empty ( ) & & Tags - > hasCoords ( me . x , me . y ) )
{
if ( ! tryNextColumn ( ) | | ! tryNextColumn ( ) )
return ;
if ( size_t ( me . y ) < Tags - > size ( ) & & ( me . bstate & ( BUTTON1_PRESSED | BUTTON3_PRESSED ) ) )
{
Tags - > Goto ( me . y ) ;
Tags - > refresh ( ) ;
if ( me . bstate & BUTTON3_PRESSED )
runAction ( ) ;
}
else
Screen < WindowType > : : mouseButtonPressed ( me ) ;
}
}
/***********************************************************************/
bool TagEditor : : allowsSearching ( )
{
return w = = Dirs | | w = = Tags ;
}
void TagEditor : : setSearchConstraint ( const std : : string & constraint )
{
if ( w = = Dirs )
{
m_directories_search_predicate = Regex : : Filter < std : : pair < std : : string , std : : string > > (
Regex : : make ( constraint , Config . regex_type ) ,
std : : bind ( DirEntryMatcher , ph : : _1 , ph : : _2 , false )
) ;
}
else if ( w = = Tags )
{
m_songs_search_predicate = Regex : : Filter < MPD : : MutableSong > (
Regex : : make ( constraint , Config . regex_type ) ,
SongEntryMatcher
) ;
}
}
void TagEditor : : clearConstraint ( )
{
if ( w = = Dirs )
m_directories_search_predicate . clear ( ) ;
else if ( w = = Tags )
m_songs_search_predicate . clear ( ) ;
}
bool TagEditor : : find ( SearchDirection direction , bool wrap , bool skip_current )
{
bool result = false ;
if ( w = = Dirs )
result = search ( * Dirs , m_directories_search_predicate , direction , wrap , skip_current ) ;
else if ( w = = Tags )
result = search ( * Tags , m_songs_search_predicate , direction , wrap , skip_current ) ;
return result ;
}
/***********************************************************************/
bool TagEditor : : actionRunnable ( )
{
// TODO: put something more refined here. It requires reworking
// runAction though, i.e. splitting it into smaller parts.
return ( w = = Tags & & ! Tags - > empty ( ) )
| | w ! = Tags ;
}
void TagEditor : : runAction ( )
{
using Global : : wFooter ;
if ( w = = FParserDialog )
{
size_t choice = FParserDialog - > choice ( ) ;
if ( choice = = 2 ) // cancel
@ -637,181 +819,19 @@ void TagEditor::enterPressed()
}
}
void TagEditor : : mouseButtonPressed ( MEVENT me )
{
auto tryPreviousColumn = [ this ] ( ) - > bool {
bool result = true ;
if ( w ! = Dirs )
{
if ( previousColumnAvailable ( ) )
previousColumn ( ) ;
else
result = false ;
}
return result ;
} ;
auto tryNextColumn = [ this ] ( ) - > bool {
bool result = true ;
if ( w ! = Tags )
{
if ( nextColumnAvailable ( ) )
nextColumn ( ) ;
else
result = false ;
}
return result ;
} ;
if ( w = = FParserDialog )
{
if ( FParserDialog - > hasCoords ( me . x , me . y ) )
{
if ( me . bstate & ( BUTTON1_PRESSED | BUTTON3_PRESSED ) )
{
FParserDialog - > Goto ( me . y ) ;
if ( me . bstate & BUTTON3_PRESSED )
enterPressed ( ) ;
}
else
Screen < WindowType > : : mouseButtonPressed ( me ) ;
}
}
else if ( w = = FParser | | w = = FParserHelper )
{
if ( FParser - > hasCoords ( me . x , me . y ) )
{
if ( w ! = FParser )
{
if ( previousColumnAvailable ( ) )
previousColumn ( ) ;
else
return ;
}
if ( size_t ( me . y ) < FParser - > size ( ) & & ( me . bstate & ( BUTTON1_PRESSED | BUTTON3_PRESSED ) ) )
{
FParser - > Goto ( me . y ) ;
if ( me . bstate & BUTTON3_PRESSED )
enterPressed ( ) ;
}
else
Screen < WindowType > : : mouseButtonPressed ( me ) ;
}
else if ( FParserHelper - > hasCoords ( me . x , me . y ) )
{
if ( w ! = FParserHelper )
{
if ( nextColumnAvailable ( ) )
nextColumn ( ) ;
else
return ;
}
scrollpadMouseButtonPressed ( * FParserHelper , me ) ;
}
}
else if ( ! Dirs - > empty ( ) & & Dirs - > hasCoords ( me . x , me . y ) )
{
if ( ! tryPreviousColumn ( ) | | ! tryPreviousColumn ( ) )
return ;
if ( size_t ( me . y ) < Dirs - > size ( ) & & ( me . bstate & ( BUTTON1_PRESSED | BUTTON3_PRESSED ) ) )
{
Dirs - > Goto ( me . y ) ;
if ( me . bstate & BUTTON1_PRESSED )
enterPressed ( ) ;
}
else
Screen < WindowType > : : mouseButtonPressed ( me ) ;
Tags - > clear ( ) ;
}
else if ( ! TagTypes - > empty ( ) & & TagTypes - > hasCoords ( me . x , me . y ) )
{
if ( w ! = TagTypes )
{
bool success ;
if ( w = = Dirs )
success = tryNextColumn ( ) ;
else
success = tryPreviousColumn ( ) ;
if ( ! success )
return ;
}
if ( size_t ( me . y ) < TagTypes - > size ( ) & & ( me . bstate & ( BUTTON1_PRESSED | BUTTON3_PRESSED ) ) )
{
if ( ! TagTypes - > Goto ( me . y ) )
return ;
TagTypes - > refresh ( ) ;
Tags - > refresh ( ) ;
if ( me . bstate & BUTTON3_PRESSED )
enterPressed ( ) ;
}
else
Screen < WindowType > : : mouseButtonPressed ( me ) ;
}
else if ( ! Tags - > empty ( ) & & Tags - > hasCoords ( me . x , me . y ) )
{
if ( ! tryNextColumn ( ) | | ! tryNextColumn ( ) )
return ;
if ( size_t ( me . y ) < Tags - > size ( ) & & ( me . bstate & ( BUTTON1_PRESSED | BUTTON3_PRESSED ) ) )
{
Tags - > Goto ( me . y ) ;
Tags - > refresh ( ) ;
if ( me . bstate & BUTTON3_PRESSED )
enterPressed ( ) ;
}
else
Screen < WindowType > : : mouseButtonPressed ( me ) ;
}
}
/***********************************************************************/
bool TagEditor : : allowsS earching ( )
bool TagEditor : : itemAvailable ( )
{
return w = = Dirs | | w = = Tags ;
}
void TagEditor : : setSearchConstraint ( const std : : string & constraint )
{
if ( w = = Dirs )
{
m_directories_search_predicate = Regex : : Filter < std : : pair < std : : string , std : : string > > (
Regex : : make ( constraint , Config . regex_type ) ,
std : : bind ( DirEntryMatcher , ph : : _1 , ph : : _2 , false )
) ;
}
else if ( w = = Tags )
{
m_songs_search_predicate = Regex : : Filter < MPD : : MutableSong > (
Regex : : make ( constraint , Config . regex_type ) ,
SongEntryMatcher
) ;
}
}
void TagEditor : : clearConstraint ( )
{
if ( w = = Dirs )
m_directories_search_predicate . clear ( ) ;
else if ( w = = Tags )
m_songs_search_predicate . clear ( ) ;
}
bool TagEditor : : find ( SearchDirection direction , bool wrap , bool skip_current )
{
bool result = false ;
if ( w = = Dirs )
result = search ( * Dirs , m_directories_search_predicate , direction , wrap , skip_current ) ;
else if ( w = = Tags )
result = search ( * Tags , m_songs_search_predicate , direction , wrap , skip_current ) ;
return result ;
if ( w = = Tags )
return ! Tags - > empty ( ) ;
return false ;
}
/***********************************************************************/
bool TagEditor : : addItemToPlaylist ( )
bool TagEditor : : addItemToPlaylist ( bool play )
{
bool result = false ;
if ( w = = Tags & & ! Tags - > empty ( ) )
result = addSongToPlaylist ( * Tags - > currentV ( ) , false ) ;
return result ;
return addSongToPlaylist ( * Tags - > currentV ( ) , play ) ;
}
std : : vector < MPD : : Song > TagEditor : : getSelectedSongs ( )