Reorganized the UI/xml part to better handle next steps

This commit is contained in:
emeric
2018-03-14 13:17:04 +01:00
parent 98f64e62f9
commit bc26ddae50
37 changed files with 257 additions and 228 deletions
+6 -4
View File
@@ -17,16 +17,18 @@ lms_images_DATA = \
docroot/images/unknown-artist.jpg
lms_approot_DATA = \
approot/artists.xml \
approot/admin-database.xml \
approot/admin-wizard.xml \
approot/artist.xml \
approot/artists.xml \
approot/explore.xml \
approot/home.xml \
approot/login.xml \
approot/mediaplayer.xml \
approot/messages.xml \
approot/playqueue.xml \
approot/releases.xml \
approot/release.xml \
approot/settings-database.xml \
approot/settings-admin-wizard.xml \
approot/releases.xml \
approot/templates.xml \
approot/tracks.xml
@@ -3,13 +3,13 @@
<messages xmlns:if="Wt.WTemplate.conditions">
<!--FORMS message blocks-->
<message id="template-settings-database">
<legend>${tr:msg-settings-database}</legend>
<message id="Lms.Admin.Database.template">
<legend>${tr:Lms.Admin.Database.database}</legend>
<div class="form-horizontal">
<div class="form-group">
<label class="control-label col-sm-2" for="${id:media-directory}">
${tr:msg-settings-media-directory}
${tr:Lms.Admin.Database.path}
</label>
<div class="col-sm-5">
${media-directory}
@@ -21,7 +21,7 @@
<div class="form-group">
<label class="control-label col-sm-2" for="${id:update-period}">
${tr:msg-settings-update-period}
${tr:Lms.Admin.Database.update-period}
</label>
<div class="col-sm-5">
${update-period}
@@ -33,7 +33,7 @@
<div class="form-group">
<label class="control-label col-sm-2" for="${id:update-start-time}">
${tr:msg-settings-update-start-time}
${tr:Lms.Admin.Database.update-start-time}
</label>
<div class="col-sm-5">
${update-start-time}
@@ -3,15 +3,15 @@
<messages xmlns:if="Wt.WTemplate.conditions">
<!--FORMS message blocks-->
<message id="template-settings-admin-wizard">
<message id="Lms.AdminWizard.template">
<div class="container">
<div class="page-header">
<h2>${tr:msg-settings-admin-account}</h2>
<h2>${tr:Lms.AdminWizard.header}</h2>
</div>
<div class="form-horizontal">
<div class="form-group">
<label class="control-label col-sm-2" for="${id:admin-login}">
${tr:msg-login}
${tr:Lms.login}
</label>
<div class="col-sm-5">
${admin-login}
@@ -23,7 +23,7 @@
<div class="form-group">
<label class="control-label col-sm-2" for="${id:password}">
${tr:msg-password}
${tr:Lms.password}
</label>
<div class="col-sm-5">
${password}
@@ -35,7 +35,7 @@
<div class="form-group">
<label class="control-label col-sm-2" for="${id:password-confirm}">
${tr:msg-password-confirm}
${tr:Lms.password-confirm}
</label>
<div class="col-sm-5">
${password-confirm}
+6 -6
View File
@@ -2,15 +2,15 @@
<messages xmlns:if="Wt.WTemplate.conditions">
<!--FORMS message blocks-->
<message id="btn-artist-play-btn">
<message id="Lms.Explore.Artist.play">
<i class="fa fa-play"></i>
</message>
<message id="btn-artist-add-btn">
<message id="Lms.Explore.Artist.add">
<i class="fa fa-plus"></i>
</message>
<message id="template-artist">
<message id="Lms.Explore.Artist.template">
<div class="page-header">
<h2>${name}</h2>
${clusters}
@@ -19,11 +19,11 @@
${releases class="list-group"}
</message>
<message id="template-artist-cluster-entry">
<message id="Lms.Explore.Artist.template.cluster-entry">
<span class="badge">${name}</span>
</message>
<message id="template-artist-entry">
<message id="Lms.Explore.Artist.template.entry">
<div class="media list-group-item">
<div class="pull-left media-middle">
${cover class="media-object"}
@@ -31,7 +31,7 @@
<div class="media-body">
<h4 class="media-heading">${name}</h4>
</div>
${<if-has-various-artists>}${tr:msg-various-artists}${</if-has-various-artists>}
${<if-has-various-artists>}${tr:Lms.Explore.various-artists}${</if-has-various-artists>}
<h4>${<if-has-year>}${year}${</if-has-year>}${<if-has-orig-year>} (${orig-year})${</if-has-orig-year>}</h4>
${play-btn}${add-btn}
</div>
+3 -3
View File
@@ -2,9 +2,9 @@
<messages xmlns:if="Wt.WTemplate.conditions">
<!--FORMS message blocks-->
<message id="template-artists">
<message id="Lms.Explore.Artists.template">
<div class="page-header">
<h2>${tr:msg-artists}</h2>
<h2>${tr:Lms.Explore.artists}</h2>
</div>
<div class="form-group">
<div class="input-group">
@@ -16,7 +16,7 @@
${show-more}
</message>
<message id="template-artists-entry">
<message id="Lms.Explore.Artists.template.entry">
<div class="list-group-item">
<span class="badge">${nb-release}</span>
${name}
+45
View File
@@ -0,0 +1,45 @@
<?xml version="1.0" encoding="UTF-8" ?>
<messages xmlns:if="Wt.WTemplate.conditions">
<message id="Lms.Explore.template">
${filters}
${contents}
</message>
<message id="Lms.Explore.template.show-more">
${tr:Lms.Explore.show-more}
</message>
<message id="Lms.Explore.template.filters">
<div class="form-group">
${add-filter}${filters}
</div>
</message>
<message id="Lms.Explore.template.add-filter">
<div class="form-horizontal">
<div class="form-group">
<label class="control-label col-sm-2" for="${id:type}">
${tr:Lms.Explore.type}
</label>
<div class="col-sm-10">
${type}
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-2" for="${id:value}">
${tr:Lms.Explore.value}
</label>
<div class="col-sm-10">
${value}
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
${add-btn class="btn-primary"} ${cancel-btn}
</div>
</div>
</div>
</message>
</messages>
+9
View File
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8" ?>
<messages xmlns:if="Wt.WTemplate.conditions">
<message id="Lms.Home.template">
${tr:Lms.Home.welcome}
</message>
</messages>
+5 -5
View File
@@ -2,15 +2,15 @@
<?xml version="1.0" encoding="UTF-8" ?>
<messages xmlns:if="Wt.WTemplate.conditions">
<message id="template-login">
<message id="Lms.Auth.template">
<div class="container">
<div class="page-header">
<h2>${tr:msg-login-welcome}</h2>
<h2>${tr:Lms.Auth.welcome}</h2>
</div>
<div class="form-horizontal">
<div class="form-group">
<label class="control-label col-sm-2" for="${id:user-name}">
${tr:msg-login}
${tr:Lms.login}
</label>
<div class="col-sm-5">
${user-name}
@@ -22,7 +22,7 @@
<div class="form-group">
<label class="control-label col-sm-2" for="${id:password}">
${tr:msg-password}
${tr:Lms.password}
</label>
<div class="col-sm-5">
${password}
@@ -34,7 +34,7 @@
<div class="form-group">
<label class="control-label col-sm-2" for="${id:remember-me}">
${tr:msg-remember-me}
${tr:Lms.Auth.remember-me}
</label>
<div class="col-sm-5">
${remember-me}
+49 -41
View File
@@ -1,54 +1,62 @@
<?xml version="1.0" encoding="UTF-8" ?>
<messages xmlns:if="Wt.WTemplate.conditions">
<!--FORMS message blocks-->
<!--Common-->
<message id="Lms.add">Add</message>
<message id="Lms.apply">Apply</message>
<message id="Lms.discard">Discard</message>
<message id="Lms.administration">Administration</message>
<message id="Lms.cancel">Cancel</message>
<message id="Lms.create">Create</message>
<message id="Lms.login">Login</message>
<message id="Lms.logout">Logout</message>
<message id="Lms.not-a-directory">Not a directory</message>
<message id="Lms.password">Password</message>
<message id="Lms.password-confirm">Confirm password</message>
<message id="Lms.playqueue">Play Queue</message>
<message id="Lms.quit-confirm">Are you sure?</message>
<message id="Lms.settings">Settings</message>
<!--Administration-->
<message id="Lms.Admin.Database.daily">Daily</message>
<message id="Lms.Admin.Database.database">Database</message>
<message id="Lms.Admin.Database.immediate-scan">Scan now!</message>
<message id="Lms.Admin.Database.monthly">Monthly</message>
<message id="Lms.Admin.Database.never">Never</message>
<message id="Lms.Admin.Database.path">Media root directory</message>
<message id="Lms.Admin.Database.scan-complete">Scan complete: {1} total files, {2} additions, {3} deletions, {4} duplicates, {5} errors</message>
<message id="Lms.Admin.Database.scan-launched">Scan launched!</message>
<message id="Lms.Admin.Database.settings-saved">New settings saved!</message>
<message id="Lms.Admin.Database.update-period">Update period</message>
<message id="Lms.Admin.Database.update-start-time">Update start time</message>
<message id="Lms.Admin.Database.weekly">Weekly</message>
<message id="msg-home-welcome"><h2>Welcome!</h2></message>
<!--Admin Wizard-->
<message id="Lms.AdminWizard.done">Administration account created. Please refresh to continue!</message>
<message id="Lms.AdminWizard.header">Create administrator account</message>
<message id="msg-various-artists">Various artists</message>
<message id="msg-artists">Artists</message>
<message id="msg-releases">Albums</message>
<message id="msg-tracks">Tracks</message>
<message id="msg-playqueue">Play Queue</message>
<message id="msg-filter-add">Add filter</message>
<message id="msg-search-placeholder">Search...</message>
<!--Auth-->
<message id="Lms.Auth.remember-me">Remember me</message>
<message id="Lms.Auth.welcome">Welcome!</message>
<message id="msg-add">Add</message>
<message id="msg-cancel">Cancel</message>
<!--Home-->
<message id="Lms.Home.welcome"><h2>Welcome!</h2></message>
<message id="msg-filter-type">Type</message>
<message id="msg-filter-value">Value</message>
<!--Explore-->
<message id="Lms.Explore.add-filter">Add filter</message>
<message id="Lms.Explore.artists">Artists</message>
<message id="Lms.Explore.releases">Albums</message>
<message id="Lms.Explore.search-placeholder">Search...</message>
<message id="Lms.Explore.show-more">Show more</message>
<message id="Lms.Explore.tracks">Tracks</message>
<message id="Lms.Explore.type">Type</message>
<message id="Lms.Explore.value">Value</message>
<message id="Lms.Explore.various-artists">Various artists</message>
<message id="msg-show-more">Show more</message>
<message id="msg-login">Login</message>
<message id="msg-password">Password</message>
<message id="msg-password-confirm">Verify password</message>
<message id="msg-create">Create</message>
<message id="msg-remember-me">Remember me</message>
<message id="msg-login-welcome">Welcome!</message>
<message id="msg-logout">Logout</message>
<!--Settings-->
<message id="msg-settings-admin-account">Administrator account</message>
<message id="msg-settings-first-connection-done">Account created. Please refresh to continue!</message>
<message id="msg-settings">Settings</message>
<message id="msg-settings-database">Database</message>
<message id="msg-settings-media-directory">Media root directory</message>
<message id="msg-settings-update-period">Update period</message>
<message id="msg-settings-update-start-time">Update start time</message>
<message id="msg-settings-update-start-time">Update start time</message>
<message id="msg-update-period-never">Never</message>
<message id="msg-update-period-daily">Daily</message>
<message id="msg-update-period-weekly">Weekly</message>
<message id="msg-update-period-monthly">Monthly</message>
<message id="msg-error-not-a-directory">Not a directory</message>
<message id="msg-btn-apply">Apply</message>
<message id="msg-btn-discard">Discard</message>
<message id="msg-btn-immediate-scan">Scan now!</message>
<message id="msg-notify-scan-launched">Scan launched!</message>
<message id="msg-notify-settings-saved">New settings saved!</message>
<message id="msg-notify-scan-complete">Scan complete: {1} total files, {2} additions, {3} deletions, {4} duplicates, {5} errors</message>
</messages>
+1 -1
View File
@@ -16,7 +16,7 @@
<message id="template-playqueue">
<div class="page-header">
<h2>${tr:msg-playqueue}</h2>
<h2>${tr:Lms.playqueue}</h2>
${save-btn} ${load-btn} ${clear-btn}
</div>
${entries}
+5 -5
View File
@@ -2,15 +2,15 @@
<messages xmlns:if="Wt.WTemplate.conditions">
<!--FORMS message blocks-->
<message id="btn-release-play-btn">
<message id="Lms.Explore.Release.play">
<i class="fa fa-play"></i>
</message>
<message id="btn-release-add-btn">
<message id="Lms.Explore.Release.add">
<i class="fa fa-plus"></i>
</message>
<message id="template-release">
<message id="Lms.Explore.Release.template">
${cover}
<div class="page-header">
<h2>${name}</h2>
@@ -22,11 +22,11 @@
${tracks}
</message>
<message id="template-release-cluster-entry">
<message id="Lms.Explore.Release.template.cluster-entry">
<span class="badge">${name}</span>
</message>
<message id="template-release-entry">
<message id="Lms.Explore.Release.template.entry">
${<if-has-disc-number>}${disc-number}-${</if-has-disc-number>}${<if-has-track-number>}${track-number}. ${</if-has-track-number>}
${<if-has-artist>}${artist-name} - ${</if-has-artist>}
${name}
+5 -6
View File
@@ -1,11 +1,10 @@
<?xml version="1.0" encoding="UTF-8" ?>
<messages xmlns:if="Wt.WTemplate.conditions">
<!--FORMS message blocks-->
<message id="template-releases">
<message id="Lms.Explore.Releases.template">
<div class="page-header">
<h2>${tr:msg-releases}</h2>
<h2>${tr:Lms.Explore.releases}</h2>
</div>
<div class="form-group">
<div class="input-group">
@@ -17,15 +16,15 @@
${show-more}
</message>
<message id="btn-releases-play-btn">
<message id="Lms.Explore.Releases.play">
<i class="fa fa-play"></i>
</message>
<message id="btn-releases-add-btn">
<message id="Lms.Explore.Releases.add">
<i class="fa fa-plus"></i>
</message>
<message id="template-releases-entry">
<message id="Lms.Explore.Releases.template.entry">
<div class="media list-group-item">
<div class="pull-left media-middle">
${cover class="media-object"}
+1 -47
View File
@@ -1,56 +1,10 @@
<?xml version="1.0" encoding="UTF-8" ?>
<messages xmlns:if="Wt.WTemplate.conditions">
<!--FORMS message blocks-->
<message id="template-main">
<message id="Lms.template">
${navbar-top class="main-nav"}
${contents class="container"}
${player}
</message>
<message id="template-home">
${tr:msg-home-welcome}
</message>
<message id="template-explore">
${filters}
${contents}
</message>
<message id="template-show-more">
${tr:msg-show-more}
</message>
<message id="template-filters">
<div class="form-group">
${add-filter}${filters}
</div>
</message>
<message id="template-filter-add">
<div class="form-horizontal">
<div class="form-group">
<label class="control-label col-sm-2" for="${id:type}">
${tr:msg-filter-type}
</label>
<div class="col-sm-10">
${type}
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-2" for="${id:value}">
${tr:msg-filter-value}
</label>
<div class="col-sm-10">
${value}
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
${add class="btn-primary"} ${cancel}
</div>
</div>
</div>
</message>
</messages>
+5 -5
View File
@@ -3,9 +3,9 @@
<messages xmlns:if="Wt.WTemplate.conditions">
<!--FORMS message blocks-->
<message id="template-tracks">
<message id="Lms.Explore.Tracks.template">
<div class="page-header">
<h2>${tr:msg-tracks}</h2>
<h2>${tr:Lms.Explore.tracks}</h2>
${play-btn}${add-btn}
</div>
<div class="form-group">
@@ -18,15 +18,15 @@
${show-more}
</message>
<message id="btn-tracks-play-btn">
<message id="Lms.Explore.Tracks.play">
<i class="fa fa-play"></i>
</message>
<message id="btn-tracks-add-btn">
<message id="Lms.Explore.Tracks.add">
<i class="fa fa-plus"></i>
</message>
<message id="template-tracks-entry">
<message id="Lms.Explore.Tracks.template.entry">
<div class="media list-group-item">
<div class="pull-left media-middle">
${cover class="media-object"}
+11 -11
View File
@@ -21,26 +21,26 @@ lms_SOURCES = \
$(srcdir)/metadata/AvFormat.cpp \
$(srcdir)/metadata/TagLibParser.cpp \
$(srcdir)/scanner/MediaScanner.cpp \
$(srcdir)/ui/ArtistView.cpp \
$(srcdir)/ui/ArtistsView.cpp \
$(srcdir)/ui/Explore.cpp \
$(srcdir)/ui/Filters.cpp \
$(srcdir)/ui/explore/ArtistView.cpp \
$(srcdir)/ui/explore/ArtistsView.cpp \
$(srcdir)/ui/explore/Explore.cpp \
$(srcdir)/ui/explore/Filters.cpp \
$(srcdir)/ui/explore/ReleasesView.cpp \
$(srcdir)/ui/explore/ReleaseView.cpp \
$(srcdir)/ui/explore/TracksView.cpp \
$(srcdir)/ui/Auth.cpp \
$(srcdir)/ui/HomeView.cpp \
$(srcdir)/ui/LmsApplication.cpp \
$(srcdir)/ui/Auth.cpp \
$(srcdir)/ui/MediaPlayer.cpp \
$(srcdir)/ui/PlayQueueView.cpp \
$(srcdir)/ui/ReleasesView.cpp \
$(srcdir)/ui/ReleaseView.cpp \
$(srcdir)/ui/TracksView.cpp \
$(srcdir)/ui/common/Validators.cpp \
$(srcdir)/ui/admin/DatabaseSettingsView.cpp \
$(srcdir)/ui/admin/AdminWizardView.cpp \
$(srcdir)/ui/common/InputRange.cpp \
$(srcdir)/ui/common/LineEdit.cpp \
$(srcdir)/ui/common/Validators.cpp \
$(srcdir)/ui/resource/AvConvTranscodeStreamResource.cpp \
$(srcdir)/ui/resource/ImageResource.cpp \
$(srcdir)/ui/resource/TranscodeResource.cpp \
$(srcdir)/ui/settings/DatabaseSettingsView.cpp \
$(srcdir)/ui/settings/AdminWizardView.cpp \
$(srcdir)/utils/Config.cpp \
$(srcdir)/utils/Logger.cpp \
$(srcdir)/utils/Path.cpp \
+2 -2
View File
@@ -38,7 +38,7 @@ Auth::Auth(Wt::WContainerWidget *parent)
_model->addPasswordAuth(&Database::Handler::getPasswordService());
setTemplateText(Wt::WString::tr("template-login"));
setTemplateText(Wt::WString::tr("Lms.Auth.template"));
addFunction("tr", &WTemplate::Functions::tr);
addFunction("id", &WTemplate::Functions::id);
@@ -55,7 +55,7 @@ Auth::Auth(Wt::WContainerWidget *parent)
auto rememberMe = new Wt::WCheckBox();
setFormWidget(Wt::Auth::AuthModel::RememberMeField, rememberMe);
auto loginBtn = new Wt::WPushButton(Wt::WString::tr("msg-login"));
auto loginBtn = new Wt::WPushButton(Wt::WString::tr("Lms.login"));
bindWidget("login-btn", loginBtn);
loginBtn->clicked().connect(std::bind([=]
{
+1 -1
View File
@@ -31,7 +31,7 @@ namespace UserInterface {
Home::Home(Wt::WContainerWidget *parent)
: Wt::WContainerWidget(parent)
{
auto t = new Wt::WTemplate(Wt::WString::tr("template-home"), this);
auto t = new Wt::WTemplate(Wt::WString::tr("Lms.Home.template"), this);
t->addFunction("tr", &Wt::WTemplate::Functions::tr);
}
+36 -22
View File
@@ -31,13 +31,13 @@
#include "utils/Logger.hpp"
#include "utils/Utils.hpp"
#include "Explore.hpp"
#include "explore/Explore.hpp"
#include "HomeView.hpp"
#include "MediaPlayer.hpp"
#include "PlayQueueView.hpp"
#include "settings/DatabaseSettingsView.hpp"
#include "settings/AdminWizardView.hpp"
#include "admin/DatabaseSettingsView.hpp"
#include "admin/AdminWizardView.hpp"
#include "LmsApplication.hpp"
@@ -81,16 +81,18 @@ LmsApplication::LmsApplication(const Wt::WEnvironment& env, Wt::Dbo::SqlConnecti
useStyleSheet("resources/font-awesome/css/font-awesome.min.css");
// Add a resource bundle
messageResourceBundle().use(appRoot() + "admin-database");
messageResourceBundle().use(appRoot() + "admin-wizard");
messageResourceBundle().use(appRoot() + "artist");
messageResourceBundle().use(appRoot() + "artists");
messageResourceBundle().use(appRoot() + "home");
messageResourceBundle().use(appRoot() + "explore");
messageResourceBundle().use(appRoot() + "login");
messageResourceBundle().use(appRoot() + "mediaplayer");
messageResourceBundle().use(appRoot() + "messages");
messageResourceBundle().use(appRoot() + "playqueue");
messageResourceBundle().use(appRoot() + "release");
messageResourceBundle().use(appRoot() + "releases");
messageResourceBundle().use(appRoot() + "settings-database");
messageResourceBundle().use(appRoot() + "settings-admin-wizard");
messageResourceBundle().use(appRoot() + "tracks");
messageResourceBundle().use(appRoot() + "templates");
@@ -183,7 +185,7 @@ enum IdxRoot
IdxHome = 0,
IdxExplore,
IdxPlayQueue,
IdxSettingsDatabase,
IdxAdminDatabase,
};
static void
@@ -198,7 +200,7 @@ handlePathChange(Wt::WStackedWidget* stack)
{ "/release", IdxExplore },
{ "/tracks", IdxExplore },
{ "/playqueue", IdxPlayQueue },
{ "/settings/database", IdxSettingsDatabase },
{ "/admin/database", IdxAdminDatabase },
};
LMS_LOG(UI, DEBUG) << "Internal path changed to '" << wApp->internalPath() << "'";
@@ -231,9 +233,9 @@ LmsApplication::handleAuthEvent(void)
_imageResource = new ImageResource(_db, root());
_transcodeResource = new TranscodeResource(_db, root());
setConfirmCloseMessage(Wt::WString::tr("msg-quit-confirm"));
setConfirmCloseMessage(Wt::WString::tr("Lms.quit-confirm"));
auto main = new Wt::WTemplate(Wt::WString::tr("template-main"), root());
auto main = new Wt::WTemplate(Wt::WString::tr("Lms.template"), root());
// Navbar
auto navbar = new Wt::WNavigationBar();
@@ -244,42 +246,54 @@ LmsApplication::handleAuthEvent(void)
auto menu = new Wt::WMenu();
{
auto menuItem = menu->insertItem(0, Wt::WString::tr("msg-artists"));
auto menuItem = menu->insertItem(0, Wt::WString::tr("Lms.Explore.artists"));
menuItem->setLink(Wt::WLink(Wt::WLink::InternalPath, "/artists"));
menuItem->setSelectable(false);
}
{
auto menuItem = menu->insertItem(1, Wt::WString::tr("msg-releases"));
auto menuItem = menu->insertItem(1, Wt::WString::tr("Lms.Explore.releases"));
menuItem->setLink(Wt::WLink(Wt::WLink::InternalPath, "/releases"));
menuItem->setSelectable(false);
}
{
auto menuItem = menu->insertItem(2, Wt::WString::tr("msg-tracks"));
auto menuItem = menu->insertItem(2, Wt::WString::tr("Lms.Explore.tracks"));
menuItem->setLink(Wt::WLink(Wt::WLink::InternalPath, "/tracks"));
menuItem->setSelectable(false);
}
{
auto menuItem = menu->insertItem(3, Wt::WString::tr("msg-playqueue"));
auto menuItem = menu->insertItem(3, Wt::WString::tr("Lms.playqueue"));
menuItem->setLink(Wt::WLink(Wt::WLink::InternalPath, "/playqueue"));
menuItem->setSelectable(false);
}
navbar->addMenu(menu);
auto rightMenu = new Wt::WMenu();
std::size_t itemCounter = 0;
{
auto menuItem = rightMenu->insertItem(0, Wt::WString::tr("msg-settings"));
menuItem->setSelectable(false);
Wt::Dbo::Transaction transaction (DboSession());
Wt::WPopupMenu *settings = new Wt::WPopupMenu();
auto dbSettings = settings->insertItem(0, Wt::WString::tr("msg-settings-database"));
dbSettings->setLink(Wt::WLink(Wt::WLink::InternalPath, "/settings/database"));
dbSettings->setSelectable(false);
if (CurrentUser()->isAdmin())
{
auto menuItem = rightMenu->insertItem(itemCounter++, Wt::WString::tr("Lms.administration"));
menuItem->setSelectable(false);
menuItem->setMenu(settings);
Wt::WPopupMenu *admin = new Wt::WPopupMenu();
auto dbSettings = admin->insertItem(0, Wt::WString::tr("Lms.Admin.Database.database"));
dbSettings->setLink(Wt::WLink(Wt::WLink::InternalPath, "/admin/database"));
dbSettings->setSelectable(false);
menuItem->setMenu(admin);
}
}
{
auto menuItem = rightMenu->insertItem(1, Wt::WString::tr("msg-logout"));
auto menuItem = rightMenu->insertItem(itemCounter++, Wt::WString::tr("Lms.settings"));
menuItem->setLink(Wt::WLink(Wt::WLink::InternalPath, "/settings"));
menuItem->setSelectable(false);
}
{
auto menuItem = rightMenu->insertItem(itemCounter++, Wt::WString::tr("Lms.logout"));
menuItem->setSelectable(true);
menuItem->triggered().connect(std::bind([=]
{
@@ -326,7 +340,7 @@ LmsApplication::handleAuthEvent(void)
{
Wt::WServer::instance()->post(sessionId, [=]
{
notify(Wt::WString::tr("msg-notify-scan-complete")
notify(Wt::WString::tr("Lms.Admin.Database.scan-complete")
.arg(stats.nbFiles())
.arg(stats.additions)
.arg(stats.deletions)
@@ -121,7 +121,7 @@ AdminWizardView::AdminWizardView(Wt::WContainerWidget *parent)
{
auto model = new AdminWizardModel(this);
setTemplateText(Wt::WString::tr("template-settings-admin-wizard"));
setTemplateText(Wt::WString::tr("Lms.AdminWizard.template"));
addFunction("tr", &WTemplate::Functions::tr);
addFunction("id", &WTemplate::Functions::id);
@@ -139,7 +139,7 @@ AdminWizardView::AdminWizardView(Wt::WContainerWidget *parent)
setFormWidget(AdminWizardModel::PasswordConfirmField, passwordConfirmEdit);
passwordConfirmEdit->setEchoMode(Wt::WLineEdit::Password);
auto saveButton = new Wt::WPushButton(Wt::WString::tr("msg-create"));
auto saveButton = new Wt::WPushButton(Wt::WString::tr("Lms.create"));
bindWidget("create-btn", saveButton);
saveButton->clicked().connect(std::bind([=]
{
@@ -148,7 +148,7 @@ AdminWizardView::AdminWizardView(Wt::WContainerWidget *parent)
if (model->validate())
{
model->saveData();
LmsApp->notify(Wt::WString::tr("msg-settings-first-connection-done"));
LmsApp->notify(Wt::WString::tr("Lms.AdminWizard.done"));
saveButton->setEnabled(false);
}
@@ -181,16 +181,16 @@ class DatabaseSettingsModel : public Wt::WFormModel
_updatePeriodModel = new Wt::WStringListModel(this);
_updatePeriodModel->addString(Wt::WString::tr("msg-update-period-never"));
_updatePeriodModel->addString(Wt::WString::tr("Lms.Admin.Database.never"));
_updatePeriodModel->setData(0, 0, Scanner::UpdatePeriod::Never, Wt::UserRole);
_updatePeriodModel->addString(Wt::WString::tr("msg-update-period-daily"));
_updatePeriodModel->addString(Wt::WString::tr("Lms.Admin.Database.daily"));
_updatePeriodModel->setData(1, 0, Scanner::UpdatePeriod::Daily, Wt::UserRole);
_updatePeriodModel->addString(Wt::WString::tr("msg-update-period-weekly"));
_updatePeriodModel->addString(Wt::WString::tr("Lms.Admin.Database.weekly"));
_updatePeriodModel->setData(2, 0, Scanner::UpdatePeriod::Weekly, Wt::UserRole);
_updatePeriodModel->addString(Wt::WString::tr("msg-update-period-monthly"));
_updatePeriodModel->addString(Wt::WString::tr("Lms.Admin.Database.monthly"));
_updatePeriodModel->setData(3, 0, Scanner::UpdatePeriod::Monthly, Wt::UserRole);
_updateStartTimeModel = new Wt::WStringListModel(this);
@@ -229,7 +229,7 @@ DatabaseSettingsView::DatabaseSettingsView(Wt::WContainerWidget *parent)
{
auto model = new DatabaseSettingsModel(this);
setTemplateText(tr("template-settings-database"));
setTemplateText(tr("Lms.Admin.Database.template"));
addFunction("tr", &WTemplate::Functions::tr);
addFunction("id", &WTemplate::Functions::id);
@@ -249,13 +249,13 @@ DatabaseSettingsView::DatabaseSettingsView(Wt::WContainerWidget *parent)
// Buttons
Wt::WPushButton *saveBtn = new Wt::WPushButton(Wt::WString::tr("msg-btn-apply"));
Wt::WPushButton *saveBtn = new Wt::WPushButton(Wt::WString::tr("Lms.apply"));
bindWidget("apply-btn", saveBtn);
Wt::WPushButton *discardBtn = new Wt::WPushButton(Wt::WString::tr("msg-btn-discard"));
Wt::WPushButton *discardBtn = new Wt::WPushButton(Wt::WString::tr("Lms.discard"));
bindWidget("discard-btn", discardBtn);
Wt::WPushButton *immScanBtn = new Wt::WPushButton(Wt::WString::tr("msg-btn-immediate-scan"));
Wt::WPushButton *immScanBtn = new Wt::WPushButton(Wt::WString::tr("Lms.Admin.Database.immediate-scan"));
bindWidget("immediate-scan-btn", immScanBtn);
saveBtn->clicked().connect(std::bind([=] ()
@@ -267,7 +267,7 @@ DatabaseSettingsView::DatabaseSettingsView(Wt::WContainerWidget *parent)
model->saveData();
LmsApp->getMediaScanner().reschedule();
LmsApp->notify(Wt::WString::tr("msg-notify-settings-saved"));
LmsApp->notify(Wt::WString::tr("Lms.Admin.Database.settings-saved"));
}
// Udate the view: Delete any validation message in the view, etc.
@@ -284,7 +284,7 @@ DatabaseSettingsView::DatabaseSettingsView(Wt::WContainerWidget *parent)
immScanBtn->clicked().connect(std::bind([=] ()
{
LmsApp->getMediaScanner().scheduleImmediateScan();
LmsApp->notify(Wt::WString::tr("msg-notify-scan-launched"));
LmsApp->notify(Wt::WString::tr("Lms.Admin.Database.scan-launched"));
}));
updateView(model);
+1 -1
View File
@@ -60,7 +60,7 @@ DirectoryValidator::validate(const Wt::WString& input) const
else if (res)
return Wt::WValidator::Result(Wt::WValidator::Valid);
else
return Wt::WValidator::Result(Wt::WValidator::Invalid, Wt::WString::tr("msg-error-not-a-directory"));
return Wt::WValidator::Result(Wt::WValidator::Invalid, Wt::WString::tr("Lms.not-a-directory"));
}
@@ -71,7 +71,7 @@ Artist::refresh()
return;
}
auto t = new Wt::WTemplate(Wt::WString::tr("template-artist"), this);
auto t = new Wt::WTemplate(Wt::WString::tr("Lms.Explore.Artist.template"), this);
t->addFunction("tr", &Wt::WTemplate::Functions::tr);
auto clusterContainers = new Wt::WContainerWidget();
@@ -82,7 +82,7 @@ Artist::refresh()
for (auto cluster : clusters)
{
auto entry = new Wt::WTemplate(Wt::WString::tr("template-artist-cluster-entry"), clusterContainers);
auto entry = new Wt::WTemplate(Wt::WString::tr("Lms.Explore.Artist.template.cluster-entry"), clusterContainers);
entry->bindString("name", Wt::WString::fromUTF8(cluster->getName()), Wt::PlainText);
}
@@ -90,7 +90,7 @@ Artist::refresh()
t->bindString("name", Wt::WString::fromUTF8(artist->getName()), Wt::PlainText);
{
auto playBtn = new Wt::WText(Wt::WString::tr("btn-artist-play-btn"), Wt::XHTMLText);
auto playBtn = new Wt::WText(Wt::WString::tr("Lms.Explore.Artist.play"), Wt::XHTMLText);
t->bindWidget("play-btn", playBtn);
playBtn->clicked().connect(std::bind([=]
@@ -100,7 +100,7 @@ Artist::refresh()
}
{
auto addBtn = new Wt::WText(Wt::WString::tr("btn-artist-add-btn"), Wt::XHTMLText);
auto addBtn = new Wt::WText(Wt::WString::tr("Lms.Explore.Artist.add"), Wt::XHTMLText);
t->bindWidget("add-btn", addBtn);
addBtn->clicked().connect(std::bind([=]
@@ -117,7 +117,7 @@ Artist::refresh()
{
auto releaseId = release.id();
Wt::WTemplate* entry = new Wt::WTemplate(Wt::WString::tr("template-artist-entry"), releasesContainer);
Wt::WTemplate* entry = new Wt::WTemplate(Wt::WString::tr("Lms.Explore.Artist.template.entry"), releasesContainer);
entry->addFunction("tr", Wt::WTemplate::Functions::tr);
{
@@ -153,14 +153,14 @@ Artist::refresh()
}
}
auto playBtn = new Wt::WText(Wt::WString::tr("btn-artist-play-btn"), Wt::XHTMLText);
auto playBtn = new Wt::WText(Wt::WString::tr("Lms.Explore.Artist.play"), Wt::XHTMLText);
entry->bindWidget("play-btn", playBtn);
playBtn->clicked().connect(std::bind([=]
{
releasePlay.emit(releaseId);
}));
auto addBtn = new Wt::WText(Wt::WString::tr("btn-artist-add-btn"), Wt::XHTMLText);
auto addBtn = new Wt::WText(Wt::WString::tr("Lms.Explore.Artist.add"), Wt::XHTMLText);
entry->bindWidget("add-btn", addBtn);
addBtn->clicked().connect(std::bind([=]
{
@@ -39,18 +39,18 @@ Artists::Artists(Filters* filters, Wt::WContainerWidget* parent)
: Wt::WContainerWidget(parent),
_filters(filters)
{
auto container = new Wt::WTemplate(Wt::WString::tr("template-artists"), this);
auto container = new Wt::WTemplate(Wt::WString::tr("Lms.Explore.Artists.template"), this);
container->addFunction("tr", &Wt::WTemplate::Functions::tr);
_search = new Wt::WLineEdit();
container->bindWidget("search", _search);
_search->setPlaceholderText(Wt::WString::tr("msg-search-placeholder"));
_search->setPlaceholderText(Wt::WString::tr("Lms.Explore.search-placeholder"));
_search->textInput().connect(this, &Artists::refresh);
_artistsContainer = new Wt::WContainerWidget();
container->bindWidget("artists", _artistsContainer);
_showMore = new Wt::WTemplate(Wt::WString::tr("template-show-more"));
_showMore = new Wt::WTemplate(Wt::WString::tr("Lms.Explore.template.show-more"));
_showMore->addFunction("tr", &Wt::WTemplate::Functions::tr);
container->bindWidget("show-more", _showMore);
@@ -88,7 +88,7 @@ Artists::addSome()
for (auto artist : artists)
{
Wt::WTemplate* entry = new Wt::WTemplate(Wt::WString::tr("template-artists-entry"), _artistsContainer);
Wt::WTemplate* entry = new Wt::WTemplate(Wt::WString::tr("Lms.Explore.Artists.template.entry"), _artistsContainer);
entry->bindInt("nb-release", artist->getReleases(clusterIds).size());
@@ -73,7 +73,7 @@ handlePathChange(Wt::WStackedWidget* stack)
Explore::Explore(Wt::WContainerWidget* parent)
: Wt::WContainerWidget(parent)
{
auto container = new Wt::WTemplate(Wt::WString::tr("template-explore"), this);
auto container = new Wt::WTemplate(Wt::WString::tr("Lms.Explore.template"), this);
_filters = new Filters();
container->bindWidget("filters", _filters);
@@ -31,9 +31,9 @@ namespace UserInterface {
void
Filters::showDialog()
{
auto dialog = new Wt::WDialog("Go to cell");
auto dialog = new Wt::WDialog(Wt::WString::tr("Lms.Explore.add-filter"));
auto container = new Wt::WTemplate(Wt::WString::tr("template-filter-add"));
auto container = new Wt::WTemplate(Wt::WString::tr("Lms.Explore.template.add-filter"));
container->addFunction("tr", &Wt::WTemplate::Functions::tr);
dialog->contents()->addWidget(container);
@@ -44,12 +44,12 @@ Filters::showDialog()
auto valueCombo = new Wt::WComboBox();
container->bindWidget("value", valueCombo);
auto addBtn = new Wt::WPushButton(Wt::WString::tr("msg-add"));
container->bindWidget("add", addBtn);
auto addBtn = new Wt::WPushButton(Wt::WString::tr("Lms.add"));
container->bindWidget("add-btn", addBtn);
addBtn->clicked().connect(dialog, &Wt::WDialog::accept);
auto cancelBtn = new Wt::WPushButton(Wt::WString::tr("msg-cancel"));
container->bindWidget("cancel", cancelBtn);
auto cancelBtn = new Wt::WPushButton(Wt::WString::tr("Lms.cancel"));
container->bindWidget("cancel-btn", cancelBtn);
cancelBtn->clicked().connect(dialog, &Wt::WDialog::reject);
// Populate data
@@ -140,10 +140,10 @@ Filters::showDialog()
Filters::Filters(Wt::WContainerWidget *parent)
: Wt::WContainerWidget(parent)
{
auto container = new Wt::WTemplate(Wt::WString::tr("template-filters"), this);
auto container = new Wt::WTemplate(Wt::WString::tr("Lms.Explore.template.filters"), this);
// Filters
Wt::WPushButton *addFilterBtn = new Wt::WPushButton(Wt::WText::tr("msg-filter-add"));
Wt::WPushButton *addFilterBtn = new Wt::WPushButton(Wt::WText::tr("Lms.Explore.add-filter"));
container->bindWidget("add-filter", addFilterBtn);
_filters = new Wt::WContainerWidget();
@@ -72,7 +72,7 @@ Release::refresh()
return;
}
auto t = new Wt::WTemplate(Wt::WString::tr("template-release"), this);
auto t = new Wt::WTemplate(Wt::WString::tr("Lms.Explore.Release.template"), this);
t->addFunction("tr", &Wt::WTemplate::Functions::tr);
t->bindString("name", Wt::WString::fromUTF8(release->getName()), Wt::PlainText);
@@ -95,7 +95,7 @@ Release::refresh()
auto artists = release->getArtists();
if (artists.size() > 1)
{
t->bindString("artist-name", Wt::WString::tr("msg-various-artists"));
t->bindString("artist-name", Wt::WString::tr("Lms.Explore.various-artists"));
}
else
{
@@ -118,14 +118,14 @@ Release::refresh()
for (auto cluster : clusters)
{
auto entry = new Wt::WTemplate(Wt::WString::tr("template-release-cluster-entry"), clusterContainers);
auto entry = new Wt::WTemplate(Wt::WString::tr("Lms.Explore.Release.template.cluster-entry"), clusterContainers);
entry->bindString("name", Wt::WString::fromUTF8(cluster->getName()), Wt::PlainText);
}
}
{
auto playBtn = new Wt::WText(Wt::WString::tr("btn-release-play-btn"), Wt::XHTMLText);
auto playBtn = new Wt::WText(Wt::WString::tr("Lms.Explore.Release.play"), Wt::XHTMLText);
t->bindWidget("play-btn", playBtn);
playBtn->clicked().connect(std::bind([=]
{
@@ -134,7 +134,7 @@ Release::refresh()
}
{
auto addBtn = new Wt::WText(Wt::WString::tr("btn-release-add-btn"), Wt::XHTMLText);
auto addBtn = new Wt::WText(Wt::WString::tr("Lms.Explore.Release.add"), Wt::XHTMLText);
t->bindWidget("add-btn", addBtn);
addBtn->clicked().connect(std::bind([=]
{
@@ -154,7 +154,7 @@ Release::refresh()
{
auto trackId = track.id();
Wt::WTemplate* entry = new Wt::WTemplate(Wt::WString::tr("template-release-entry"), tracksContainer);
Wt::WTemplate* entry = new Wt::WTemplate(Wt::WString::tr("Lms.Explore.Release.template.entry"), tracksContainer);
entry->bindString("name", Wt::WString::fromUTF8(track->getName()), Wt::PlainText);
@@ -182,14 +182,14 @@ Release::refresh()
entry->bindInt("disc-number", *discNumber);
}
auto playBtn = new Wt::WText(Wt::WString::tr("btn-release-play-btn"), Wt::XHTMLText);
auto playBtn = new Wt::WText(Wt::WString::tr("Lms.Explore.Release.play"), Wt::XHTMLText);
entry->bindWidget("play-btn", playBtn);
playBtn->clicked().connect(std::bind([=]
{
trackPlay.emit(trackId);
}));
auto addBtn = new Wt::WText(Wt::WString::tr("btn-release-add-btn"), Wt::XHTMLText);
auto addBtn = new Wt::WText(Wt::WString::tr("Lms.Explore.Release.add"), Wt::XHTMLText);
entry->bindWidget("add-btn", addBtn);
addBtn->clicked().connect(std::bind([=]
{
@@ -40,18 +40,18 @@ Releases::Releases(Filters* filters, Wt::WContainerWidget* parent)
: Wt::WContainerWidget(parent),
_filters(filters)
{
auto container = new Wt::WTemplate(Wt::WString::tr("template-releases"), this);
auto container = new Wt::WTemplate(Wt::WString::tr("Lms.Explore.Releases.template"), this);
container->addFunction("tr", &Wt::WTemplate::Functions::tr);
_search = new Wt::WLineEdit();
container->bindWidget("search", _search);
_search->setPlaceholderText(Wt::WString::tr("msg-search-placeholder"));
_search->setPlaceholderText(Wt::WString::tr("Lms.Explore.search-placeholder"));
_search->textInput().connect(this, &Releases::refresh);
_releasesContainer = new Wt::WContainerWidget();
container->bindWidget("releases", _releasesContainer);
_showMore = new Wt::WTemplate(Wt::WString::tr("template-show-more"));
_showMore = new Wt::WTemplate(Wt::WString::tr("Lms.Explore.show-more"));
_showMore->addFunction("tr", &Wt::WTemplate::Functions::tr);
container->bindWidget("show-more", _showMore);
@@ -88,7 +88,7 @@ Releases::addSome()
{
auto releaseId = release.id();
Wt::WTemplate* entry = new Wt::WTemplate(Wt::WString::tr("template-releases-entry"), _releasesContainer);
Wt::WTemplate* entry = new Wt::WTemplate(Wt::WString::tr("Lms.Explore.Releases.template.entry"), _releasesContainer);
entry->addFunction("tr", Wt::WTemplate::Functions::tr);
Wt::WAnchor* coverAnchor = LmsApplication::createReleaseAnchor(releaseId);
@@ -109,7 +109,7 @@ Releases::addSome()
auto artists = release->getArtists();
if (artists.size() > 1)
{
entry->bindString("artist-name", Wt::WString::tr("msg-various-artists"));
entry->bindString("artist-name", Wt::WString::tr("Lms.Explore.various-artists"));
}
else
{
@@ -119,14 +119,14 @@ Releases::addSome()
entry->bindWidget("artist-name", artistAnchor);
}
auto playBtn = new Wt::WText(Wt::WString::tr("btn-releases-play-btn"), Wt::XHTMLText);
auto playBtn = new Wt::WText(Wt::WString::tr("Lms.Explore.Releases.play"), Wt::XHTMLText);
entry->bindWidget("play-btn", playBtn);
playBtn->clicked().connect(std::bind([=]
{
releasePlay.emit(releaseId);
}));
auto addBtn = new Wt::WText(Wt::WString::tr("btn-releases-add-btn"), Wt::XHTMLText);
auto addBtn = new Wt::WText(Wt::WString::tr("Lms.Explore.Releases.add"), Wt::XHTMLText);
entry->bindWidget("add-btn", addBtn);
addBtn->clicked().connect(std::bind([=]
{
@@ -134,8 +134,6 @@ Releases::addSome()
}));
}
std::cerr << "if-show-more = " << moreResults << "\n";
_showMore->setHidden(!moreResults);
}
@@ -39,15 +39,15 @@ Tracks::Tracks(Filters* filters, Wt::WContainerWidget* parent)
: Wt::WContainerWidget(parent),
_filters(filters)
{
auto container = new Wt::WTemplate(Wt::WString::tr("template-tracks"), this);
auto container = new Wt::WTemplate(Wt::WString::tr("Lms.Explore.Tracks.template"), this);
container->addFunction("tr", &Wt::WTemplate::Functions::tr);
_search = new Wt::WLineEdit();
container->bindWidget("search", _search);
_search->setPlaceholderText(Wt::WString::tr("msg-search-placeholder"));
_search->setPlaceholderText(Wt::WString::tr("Lms.Explore.search-placeholder"));
_search->textInput().connect(this, &Tracks::refresh);
auto playBtn = new Wt::WText(Wt::WString::tr("btn-tracks-play-btn"), Wt::XHTMLText);
auto playBtn = new Wt::WText(Wt::WString::tr("Lms.Explore.Tracks.play"), Wt::XHTMLText);
container->bindWidget("play-btn", playBtn);
playBtn->clicked().connect(std::bind([=]
{
@@ -55,7 +55,7 @@ Tracks::Tracks(Filters* filters, Wt::WContainerWidget* parent)
tracksPlay.emit(getTracks());
}));
auto addBtn = new Wt::WText(Wt::WString::tr("btn-tracks-add-btn"), Wt::XHTMLText);
auto addBtn = new Wt::WText(Wt::WString::tr("Lms.Explore.Tracks.add"), Wt::XHTMLText);
container->bindWidget("add-btn", addBtn);
addBtn->clicked().connect(std::bind([=]
{
@@ -66,7 +66,7 @@ Tracks::Tracks(Filters* filters, Wt::WContainerWidget* parent)
_tracksContainer = new Wt::WContainerWidget();
container->bindWidget("tracks", _tracksContainer);
_showMore = new Wt::WTemplate(Wt::WString::tr("template-show-more"));
_showMore = new Wt::WTemplate(Wt::WString::tr("Lms.Explore.template.show-more"));
_showMore->addFunction("tr", &Wt::WTemplate::Functions::tr);
container->bindWidget("show-more", _showMore);
@@ -116,7 +116,7 @@ Tracks::addSome()
for (auto track : tracks)
{
auto trackId = track.id();
Wt::WTemplate* entry = new Wt::WTemplate(Wt::WString::tr("template-tracks-entry"), _tracksContainer);
Wt::WTemplate* entry = new Wt::WTemplate(Wt::WString::tr("Lms.Explore.Tracks.template.entry"), _tracksContainer);
entry->bindString("name", Wt::WString::fromUTF8(track->getName()), Wt::PlainText);
@@ -146,14 +146,14 @@ Tracks::addSome()
cover->setWidth(64);
entry->bindWidget("cover", cover);
auto playBtn = new Wt::WText(Wt::WString::tr("btn-tracks-play-btn"), Wt::XHTMLText);
auto playBtn = new Wt::WText(Wt::WString::tr("Lms.Explore.Tracks.play"), Wt::XHTMLText);
entry->bindWidget("play-btn", playBtn);
playBtn->clicked().connect(std::bind([=]
{
trackPlay.emit(trackId);
}));
auto addBtn = new Wt::WText(Wt::WString::tr("btn-tracks-add-btn"), Wt::XHTMLText);
auto addBtn = new Wt::WText(Wt::WString::tr("Lms.Explore.Tracks.add"), Wt::XHTMLText);
entry->bindWidget("add-btn", addBtn);
addBtn->clicked().connect(std::bind([=]
{