Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
11 changes: 9 additions & 2 deletions frontend/include/frontend/settings.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include <frontend/dialog/confirm_dialog.hpp>
#include <frontend/dialog/input_dialog.hpp>
#include <frontend/dialog/multi_input_dialog.hpp>
#include <frontend/dialog/new_session_dialog.hpp>
#include <frontend/settings/termios_settings.hpp>
#include <frontend/settings/session_options.hpp>
#include <frontend/settings/setting_group.hpp>
Expand All @@ -27,14 +28,21 @@ class Settings
std::function<std::optional<nlohmann::json>()> const& obtainCurrentLayout,
InputDialog& inputDialog,
ConfirmDialog& confirmDialog,
MultiInputDialog& multiInputDialog
MultiInputDialog& multiInputDialog,
NewSessionDialog& newSessionDialog
);
ROAR_PIMPL_SPECIAL_FUNCTIONS(Settings);

Nui::ElementRenderer operator()();

void applySettingsToUi();

/** @brief Open the new-session dialog; on confirm, create the session, persist it,
* activate it in Settings and scroll to its Host field. Safe to call when
* the Settings panel is closed -- it will open via requestOpenSettingsAtId.
*/
void addNewSession();

private:
Nui::ElementRenderer side();
Nui::ElementRenderer header();
Expand All @@ -58,7 +66,6 @@ class Settings
Nui::ElementRenderer sectionSelector(SectionSelectorOptions const& options);
bool isActive(SectionSelectorOptions const& options);

void addNewSession();
void onChange();
void save();
void applySettingsToState(Persistence::State& state);
Expand Down
2 changes: 2 additions & 0 deletions frontend/include/frontend/toolbar.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#include <roar/detail/pimpl_special_functions.hpp>

class SessionArea;
class Settings;

class Toolbar
{
Expand All @@ -24,6 +25,7 @@ class Toolbar
ROAR_PIMPL_SPECIAL_FUNCTIONS(Toolbar);

void sessionArea(SessionArea& sessionArea);
void settings(Settings& settings);

Nui::ElementRenderer operator()();
std::string selectedLayout() const;
Expand Down
12 changes: 11 additions & 1 deletion frontend/source/frontend/main_page.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
#include <frontend/dialog/input_dialog.hpp>
#include <frontend/dialog/archive_transfer_dialog.hpp>
#include <frontend/dialog/direct_connect_dialog.hpp>
#include <frontend/dialog/new_session_dialog.hpp>
#include <frontend/onboarding/onboarding.hpp>
#include <log/log.hpp>

Expand All @@ -28,6 +29,7 @@ struct MainPage::Implementation
FilePropertyDialog filePropertyDialog;
ArchiveTransferDialog archiveTransferDialog;
DirectConnectDialog directConnectDialog;
NewSessionDialog newSessionDialog;
PasswordPrompter prompter;
MultiInputDialog multiInputDialog;
Sidebar sidebar;
Expand All @@ -47,21 +49,23 @@ struct MainPage::Implementation
, filePropertyDialog{"FilePropertyDialog"}
, archiveTransferDialog{"ArchiveTransferDialog"}
, directConnectDialog{"DirectConnectDialog", stateHolder}
, newSessionDialog{"NewSessionDialog"}
, prompter{}
, multiInputDialog{"MultiInputDialog"}
, sidebar{stateHolder, events}
, toolbar{stateHolder, events, &confirmDialog, &directConnectDialog, themeController}
, sessionArea{stateHolder, events, &newItemAskDialog, &confirmDialog, &filePropertyDialog, &archiveTransferDialog, &toolbar}
, settings{stateHolder, events, [this](){
return sessionArea.getActiveSessionLayout();
}, newItemAskDialog, confirmDialog, multiInputDialog}
}, newItemAskDialog, confirmDialog, multiInputDialog, newSessionDialog}
, licenses{events}
, onboarding{stateHolder, events}
, darkMode{true}
, setupWait{}
{
Log::info("MainPage::Implementation()");
toolbar.sessionArea(sessionArea);
toolbar.settings(settings);
}

~Implementation()
Expand Down Expand Up @@ -96,6 +100,11 @@ void MainPage::onSetupComplete()
impl_->onboarding.maybeStart();
return;
}
if (!impl_->stateHolder->stateCache().uiOptions.onboardingCompleted)
{
impl_->onboarding.maybeStart();
return;
}
impl_->confirmDialog.open({
.styleVariant = ScriptNuiComponents::StyleVariant::Warning,
.headerText = language->get("persistence", "warningLoadingState"),
Expand Down Expand Up @@ -156,6 +165,7 @@ Nui::ElementRenderer MainPage::render()
impl_->filePropertyDialog(),
impl_->archiveTransferDialog(),
impl_->directConnectDialog(),
impl_->newSessionDialog(),
impl_->multiInputDialog(),
impl_->settings(),
impl_->licenses(),
Expand Down
15 changes: 9 additions & 6 deletions frontend/source/frontend/settings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ struct Settings::Implementation
InputDialog* inputDialog;
ConfirmDialog* confirmDialog;
MultiInputDialog* multiInputDialog;
NewSessionDialog newSessionDialog{"settings"};
NewSessionDialog* newSessionDialog{nullptr};
Nui::ThrottledFunction throttledSave{};
Nui::ThrottledFunction throttledReloadInheritance{};
Nui::Observed<Settings::Section> activeSection{Settings::Section::GeneralSettings};
Expand Down Expand Up @@ -152,6 +152,7 @@ struct Settings::Implementation
InputDialog& inputDialog,
ConfirmDialog& confirmDialog,
MultiInputDialog& multiInputDialog,
NewSessionDialog& newSessionDialog,
std::invocable auto const& onChange,
std::invocable auto const& reloadInheritance
)
Expand All @@ -160,6 +161,7 @@ struct Settings::Implementation
, inputDialog{&inputDialog}
, confirmDialog{&confirmDialog}
, multiInputDialog{&multiInputDialog}
, newSessionDialog{&newSessionDialog}
, generalSettings{onChange, events, inputDialog, multiInputDialog}
, termiosSettings{[onChange, reloadInheritance]()
{
Expand Down Expand Up @@ -196,7 +198,8 @@ Settings::Settings(
std::function<std::optional<nlohmann::json>()> const& obtainCurrentLayout,
InputDialog& inputDialog,
ConfirmDialog& confirmDialog,
MultiInputDialog& multiInputDialog
MultiInputDialog& multiInputDialog,
NewSessionDialog& newSessionDialog
)
: impl_{std::make_unique<Implementation>(
stateHolder,
Expand All @@ -205,6 +208,7 @@ Settings::Settings(
inputDialog,
confirmDialog,
multiInputDialog,
newSessionDialog,
[this]()
{
if (impl_->applyingToUi)
Expand Down Expand Up @@ -760,7 +764,6 @@ Nui::ElementRenderer Settings::operator()()
}(
Nui::Elements::span{}(language->get("settings", "loadingSettings"))
),
impl_->newSessionDialog(),
div{
class_ = "settings-page",
}(
Expand Down Expand Up @@ -928,7 +931,7 @@ bool Settings::isActive(SectionSelectorOptions const& options)
void Settings::addNewSession()
{
impl_->events->onAddNewSessionRequested.modify();
impl_->newSessionDialog.open({
impl_->newSessionDialog->open({
.onConfirm = [this](auto const& result)
{
Log::info("New session created: {}.", result.sessionName);
Expand Down Expand Up @@ -1324,7 +1327,7 @@ void Settings::renameActiveSession()
return;

const auto oldSessionId = **impl_->activeSession;
impl_->newSessionDialog.open({
impl_->newSessionDialog->open({
.onConfirm =
[this, oldSessionId](NewSessionDialog::ConfirmResult const& result)
{
Expand Down Expand Up @@ -1395,7 +1398,7 @@ void Settings::copyActiveSession()
const auto sourceIcon = impl_->stateHolder->stateCache().sessions.count(sourceSessionId)
? impl_->stateHolder->stateCache().sessions.at(sourceSessionId).icon
: std::string{"laptop"};
impl_->newSessionDialog.open({
impl_->newSessionDialog->open({
.onConfirm =
[this, sourceSessionId](NewSessionDialog::ConfirmResult const& result)
{
Expand Down
43 changes: 41 additions & 2 deletions frontend/source/frontend/toolbar.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#include <frontend/toolbar.hpp>
#include <frontend/classes.hpp>
#include <frontend/session_area.hpp>
#include <frontend/settings.hpp>
#include <frontend/state_holder_with_dialog.hpp>
#include <frontend/events/frontend_events.hpp>
#include <frontend/dialog/direct_connect_dialog.hpp>
Expand All @@ -11,6 +12,7 @@

#include <script-nui-components/select.hpp>
#include <script-nui-components/button.hpp>
#include <script-nui-components/style_variant.hpp>

#include <frontend/onboarding/onboarding.hpp>

Expand All @@ -21,6 +23,7 @@
#include <ui5-sap-icons/icons/light-mode.hpp>
#include <ui5-sap-icons/icons/dark-mode.hpp>
#include <ui5-sap-icons/icons/connected.hpp>
#include <ui5-sap-icons/icons/begin.hpp>
#include <ui5-sap-icons/icons/signature.hpp>

#include <nui/event_system/observed_value.hpp>
Expand All @@ -32,6 +35,7 @@ struct Toolbar::Implementation
Persistence::StateHolder* stateHolder;
FrontendEvents* events;
SessionArea* sessionArea;
Settings* settings{nullptr};
ConfirmDialog* confirmDialog;
DirectConnectDialog* directConnectDialog;
ThemeController* themeController;
Expand Down Expand Up @@ -218,14 +222,26 @@ Nui::ElementRenderer Toolbar::operator()()
}
}),
Snc::button({
.text = language->get("toolbar", "newSession"),
.icon = GeneratedSvgs::add(),
.text = language->get("toolbar", "connect"),
.icon = Ui5Icons::begin(),
.attributes = {
disabled = Nui::observe(impl_->terminalEngines).generate(
[](auto const& engines) -> std::optional<bool> {
return engines.empty() ? std::optional<bool>{true} : std::nullopt;
}
),
onClick = [this]() {
if (impl_->terminalEngines.value().empty())
return;
impl_->events->onNewSession = impl_->activeTerminalEngine.value();
impl_->events->onNewSession.modifyNow();
},
},
.styleVariant = Nui::observe(impl_->terminalEngines).generate(
[](auto const& engines) {
return engines.empty() ? Snc::StyleVariant::Regular : Snc::StyleVariant::Primary;
}
),
}),
Snc::button({
.text = language->get("toolbar", "endSession"),
Expand All @@ -240,6 +256,24 @@ Nui::ElementRenderer Toolbar::operator()()
},
},
}),
Snc::button({
.text = language->get("toolbar", "newSession"),
.icon = GeneratedSvgs::add(),
.attributes = {
onClick = [this]() {
if (!impl_->settings) {
Log::error("Toolbar::AddServer: settings is not set.");
return;
}
impl_->settings->addNewSession();
},
},
.styleVariant = Nui::observe(impl_->terminalEngines).generate(
[](auto const& engines) {
return engines.empty() ? Snc::StyleVariant::Primary : Snc::StyleVariant::Regular;
}
),
}),
Snc::button({
.text = language->get("toolbar", "directConnect"),
.icon = Ui5Icons::connected(),
Expand Down Expand Up @@ -342,4 +376,9 @@ std::string Toolbar::selectedLayout() const
void Toolbar::sessionArea(SessionArea& sessionArea)
{
impl_->sessionArea = &sessionArea;
}

void Toolbar::settings(Settings& settings)
{
impl_->settings = &settings;
}
Loading
Loading