Skip to content

Commit

Permalink
Extract TemplatesMenu class from MainWindow
Browse files Browse the repository at this point in the history
  • Loading branch information
winniehell committed Aug 14, 2019
1 parent db200fb commit ae95380
Show file tree
Hide file tree
Showing 5 changed files with 97 additions and 61 deletions.
6 changes: 2 additions & 4 deletions include/MainWindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@

#include "ConfigManager.h"
#include "SubWindow.h"
#include "TemplatesMenu.h"

class QAction;
class QDomElement;
Expand Down Expand Up @@ -148,7 +149,6 @@ public slots:

void emptySlot();
void createNewProject();
void createNewProjectFromTemplate( QAction * _idx );
void openProject();
bool saveProject();
bool saveProjectAs();
Expand Down Expand Up @@ -204,9 +204,8 @@ private slots:
QWidget * m_toolBar;
QGridLayout * m_toolBarLayout;

QMenu * m_templatesMenu;
TemplatesMenu * m_templatesMenu;
QMenu * m_recentlyOpenedProjectsMenu;
int m_custom_templates_count;

struct keyModifiers
{
Expand Down Expand Up @@ -240,7 +239,6 @@ private slots:

private slots:
void browseHelp();
void fillTemplatesMenu();
void openRecentlyOpenedProject( QAction * _action );
void showTool( QAction * _idx );
void updateRecentlyOpenedProjectsMenu();
Expand Down
21 changes: 21 additions & 0 deletions include/TemplatesMenu.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
#ifndef TEMPLATESMENU_H
#define TEMPLATESMENU_H

#include <QMenu>

class TemplatesMenu : public QMenu
{
Q_OBJECT
public:
TemplatesMenu(QWidget *parent = nullptr);
virtual ~TemplatesMenu() = default;

private slots:
void createNewProjectFromTemplate( QAction * _idx );
void fillTemplatesMenu();

private:
int m_custom_templates_count;
};

#endif // TEMPLATESMENU_H
2 changes: 2 additions & 0 deletions src/gui/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ SET(LMMS_SRCS
gui/editors/PianoRoll.cpp
gui/editors/SongEditor.cpp

gui/menus/TemplatesMenu.cpp

gui/widgets/AutomatableButton.cpp
gui/widgets/AutomatableSlider.cpp
gui/widgets/CaptionMenu.cpp
Expand Down
58 changes: 1 addition & 57 deletions src/gui/MainWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -277,11 +277,7 @@ void MainWindow::finalize()
this, SLOT( createNewProject() ),
QKeySequence::New );

m_templatesMenu = new QMenu( tr("New from template"), this );
connect( m_templatesMenu, SIGNAL( aboutToShow() ), SLOT( fillTemplatesMenu() ) );
connect( m_templatesMenu, SIGNAL( triggered( QAction * ) ),
SLOT( createNewProjectFromTemplate( QAction * ) ) );

m_templatesMenu = new TemplatesMenu( this );
project_menu->addMenu(m_templatesMenu);

project_menu->addAction( embed::getIconPixmap( "project_open" ),
Expand Down Expand Up @@ -809,24 +805,6 @@ void MainWindow::createNewProject()



void MainWindow::createNewProjectFromTemplate( QAction * _idx )
{
if( m_templatesMenu && mayChangeProject(true) )
{
int indexOfTemplate = m_templatesMenu->actions().indexOf( _idx );
bool isFactoryTemplate = indexOfTemplate >= m_custom_templates_count;
QString dirBase = isFactoryTemplate ?
ConfigManager::inst()->factoryTemplatesDir() :
ConfigManager::inst()->userTemplateDir();

const QString f = dirBase + _idx->text().replace("&&", "&") + ".mpt";
Engine::getSong()->createNewProjectFromTemplate(f);
}
}




void MainWindow::openProject()
{
if( mayChangeProject(false) )
Expand Down Expand Up @@ -1448,40 +1426,6 @@ void MainWindow::timerEvent( QTimerEvent * _te)



void MainWindow::fillTemplatesMenu()
{
m_templatesMenu->clear();

auto addTemplatesFromDir = [this]( QDir dir ) {
QStringList templates = dir.entryList( QStringList( "*.mpt" ),
QDir::Files | QDir::Readable );

if ( templates.size() && ! m_templatesMenu->actions().isEmpty() )
{
m_templatesMenu->addSeparator();
}

for( QStringList::iterator it = templates.begin();
it != templates.end(); ++it )
{
m_templatesMenu->addAction(
embed::getIconPixmap( "project_file" ),
( *it ).left( ( *it ).length() - 4 ).replace("&", "&&") );
#ifdef LMMS_BUILD_APPLE
m_templatesMenu->actions().last()->setIconVisibleInMenu(false); // QTBUG-44565 workaround
m_templatesMenu->actions().last()->setIconVisibleInMenu(true);
#endif
}

return templates.size();
};

m_custom_templates_count = addTemplatesFromDir( ConfigManager::inst()->userTemplateDir() );
addTemplatesFromDir( ConfigManager::inst()->factoryProjectsDir() + "templates" );
}




void MainWindow::showTool( QAction * _idx )
{
Expand Down
71 changes: 71 additions & 0 deletions src/gui/menus/TemplatesMenu.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
#include <QDir>

#include "TemplatesMenu.h"
#include "GuiApplication.h"
#include "ConfigManager.h"
#include "Engine.h"
#include "embed.h"
#include "MainWindow.h"
#include "Song.h"

TemplatesMenu::TemplatesMenu(QWidget *parent) :
QMenu(tr("New from template"), parent)
{
connect( this, SIGNAL( aboutToShow() ), SLOT( fillTemplatesMenu() ) );
connect( this, SIGNAL( triggered( QAction * ) ),
SLOT( createNewProjectFromTemplate( QAction * ) ) );
}




void TemplatesMenu::createNewProjectFromTemplate( QAction * _idx )
{
if( gui->mainWindow()->mayChangeProject(true) )
{
int indexOfTemplate = this->actions().indexOf( _idx );
bool isFactoryTemplate = indexOfTemplate >= m_custom_templates_count;
QString dirBase = isFactoryTemplate ?
ConfigManager::inst()->factoryTemplatesDir() :
ConfigManager::inst()->userTemplateDir();

const QString f = dirBase + _idx->text().replace("&&", "&") + ".mpt";
Engine::getSong()->createNewProjectFromTemplate(f);
}
}





void TemplatesMenu::fillTemplatesMenu()
{
this->clear();

auto addTemplatesFromDir = [this]( QDir dir ) {
QStringList templates = dir.entryList( QStringList( "*.mpt" ),
QDir::Files | QDir::Readable );

if ( templates.size() && ! this->actions().isEmpty() )
{
this->addSeparator();
}

for( QStringList::iterator it = templates.begin();
it != templates.end(); ++it )
{
this->addAction(
embed::getIconPixmap( "project_file" ),
( *it ).left( ( *it ).length() - 4 ).replace("&", "&&") );
#ifdef LMMS_BUILD_APPLE
this->actions().last()->setIconVisibleInMenu(false); // QTBUG-44565 workaround
this->actions().last()->setIconVisibleInMenu(true);
#endif
}

return templates.size();
};

m_custom_templates_count = addTemplatesFromDir( ConfigManager::inst()->userTemplateDir() );
addTemplatesFromDir( ConfigManager::inst()->factoryProjectsDir() + "templates" );
}

0 comments on commit ae95380

Please sign in to comment.