diff --git a/Common/UI/PopupScreens.cpp b/Common/UI/PopupScreens.cpp index 873fd49a43..40fe12c3c0 100644 --- a/Common/UI/PopupScreens.cpp +++ b/Common/UI/PopupScreens.cpp @@ -410,7 +410,8 @@ void PopupMultiChoice::ChoiceCallback(int num) { } } -std::string PopupMultiChoice::ValueText() const { +std::string PopupMultiChoice::ValueText(bool *shadow) const { + *shadow = false; return valueText_; } @@ -502,7 +503,8 @@ static bool IsValidNumberFormatString(std::string_view s) { return percentCount == 1; } -std::string PopupSliderChoice::ValueText() const { +std::string PopupSliderChoice::ValueText(bool *shadow) const { + *shadow = false; // Always good to have space for Unicode. char temp[256]; temp[0] = '\0'; @@ -543,7 +545,8 @@ void PopupSliderChoiceFloat::HandleChange(EventParams &e) { } } -std::string PopupSliderChoiceFloat::ValueText() const { +std::string PopupSliderChoiceFloat::ValueText(bool *shadow) const { + *shadow = false; char temp[256]; temp[0] = '\0'; if (zeroLabel_.size() && *value_ == 0.0f) { @@ -809,8 +812,14 @@ void PopupTextInputChoice::HandleClick(EventParams &e) { screenManager_->push(popupScreen); } -std::string PopupTextInputChoice::ValueText() const { - return *value_; +std::string PopupTextInputChoice::ValueText(bool *shadow) const { + if (value_->empty()) { + *shadow = true; + return shadowText_; + } else { + *shadow = false; + return *value_; + } } LinearLayout *CreateSoftKeyboard(TextEdit *edit, bool *upperCase) { @@ -932,7 +941,8 @@ void TextEditPopupScreen::OnCompleted(DialogResult result) { } void AbstractChoiceWithValueDisplay::GetContentDimensionsBySpec(const UIContext &dc, MeasureSpec horiz, MeasureSpec vert, float &w, float &h) const { - const std::string valueText = ValueText(); + bool shadow; + const std::string valueText = ValueText(&shadow); int paddingX = 12; // Assume we want at least 20% of the size for the label, at a minimum. float availWidth = (horiz.size - paddingX * 2) * (text_.empty() ? 1.0f : 0.8f); @@ -972,7 +982,8 @@ void AbstractChoiceWithValueDisplay::Draw(UIContext &dc) { int paddingX = 12; dc.SetFontStyle(dc.GetTheme().uiFont); - std::string valueText = ValueText(); + bool shadow; + std::string valueText = ValueText(&shadow); if (passwordMasking_) { // Replace all characters with stars. @@ -980,6 +991,10 @@ void AbstractChoiceWithValueDisplay::Draw(UIContext &dc) { } // If there is a label, assume we want at least 20% of the size for it, at a minimum. + u32 color = style.fgColor; + if (shadow) { + color = alphaMul(color, 0.4f); + } if (!text_.empty() && !hideTitle_) { float availWidth = (bounds_.w - paddingX * 2) * 0.8f; @@ -996,7 +1011,7 @@ void AbstractChoiceWithValueDisplay::Draw(UIContext &dc) { } dc.SetFontScale(scale, scale); Bounds valueBounds(bounds_.x2() - textPadding_.right - imagePadding, bounds_.y, w, bounds_.h); - dc.DrawTextRect(valueText, valueBounds, style.fgColor, ALIGN_RIGHT | ALIGN_VCENTER | FLAG_WRAP_TEXT); + dc.DrawTextRect(valueText, valueBounds, color, ALIGN_RIGHT | ALIGN_VCENTER | FLAG_WRAP_TEXT); dc.SetFontScale(1.0f, 1.0f); } else { Choice::Draw(dc); @@ -1009,7 +1024,7 @@ void AbstractChoiceWithValueDisplay::Draw(UIContext &dc) { float scale = CalculateValueScale(dc, valueText, bounds_.w); dc.SetFontScale(scale, scale); - dc.DrawTextRect(valueText, bounds_.Expand(-paddingX, 0.0f), style.fgColor, ALIGN_LEFT | ALIGN_VCENTER | FLAG_WRAP_TEXT); + dc.DrawTextRect(valueText, bounds_.Expand(-paddingX, 0.0f), color, ALIGN_LEFT | ALIGN_VCENTER | FLAG_WRAP_TEXT); dc.SetFontScale(1.0f, 1.0f); } } @@ -1023,7 +1038,8 @@ float AbstractChoiceWithValueDisplay::CalculateValueScale(const UIContext &dc, s return 1.0f; } -std::string ChoiceWithValueDisplay::ValueText() const { +std::string ChoiceWithValueDisplay::ValueText(bool *shadow) const { + *shadow = false; auto category = GetI18NCategory(category_); std::ostringstream valueText; if (translateCallback_ && sValue_) { @@ -1053,7 +1069,8 @@ FileChooserChoice::FileChooserChoice(RequesterToken token, std::string *value, s }); } -std::string FileChooserChoice::ValueText() const { +std::string FileChooserChoice::ValueText(bool *shadow) const { + *shadow = false; if (value_->empty()) { auto di = GetI18NCategory(I18NCat::DIALOG); return std::string(di->T("Default")); @@ -1076,7 +1093,8 @@ FolderChooserChoice::FolderChooserChoice(RequesterToken token, std::string *valu }); } -std::string FolderChooserChoice::ValueText() const { +std::string FolderChooserChoice::ValueText(bool *shadow) const { + *shadow = false; if (value_->empty()) { auto di = GetI18NCategory(I18NCat::DIALOG); return std::string(di->T("Default")); diff --git a/Common/UI/PopupScreens.h b/Common/UI/PopupScreens.h index 1134995409..06677036e0 100644 --- a/Common/UI/PopupScreens.h +++ b/Common/UI/PopupScreens.h @@ -330,7 +330,7 @@ public: UI::Event OnChoice; protected: - std::string ValueText() const override; + std::string ValueText(bool *shadow) const override; ImageID ValueImage() const override { auto iter = icons_.find(*value_); if (iter != icons_.end()) { @@ -445,7 +445,7 @@ public: Event OnChange; protected: - std::string ValueText() const override; + std::string ValueText(bool *shadow) const override; private: void HandleClick(EventParams &e); @@ -486,7 +486,7 @@ public: Event OnChange; protected: - std::string ValueText() const override; + std::string ValueText(bool *shadow) const override; private: void HandleClick(EventParams &e); @@ -517,8 +517,12 @@ public: minLen_ = minLength; } + void SetShadowText(std::string_view text) { + shadowText_ = text; + } + protected: - std::string ValueText() const override; + std::string ValueText(bool *shadow) const override; private: void HandleClick(EventParams &e); @@ -527,6 +531,7 @@ private: std::string *value_; std::string placeHolder_; std::string defaultText_; + std::string shadowText_; int maxLen_; int minLen_ = 0; bool restoreFocus_ = false; @@ -545,7 +550,7 @@ public: : AbstractChoiceWithValueDisplay(text, layoutParams), sValue_(value), translateCallback_(translateCallback) {} private: - std::string ValueText() const override; + std::string ValueText(bool *shadow) const override; std::string *sValue_ = nullptr; int *iValue_ = nullptr; @@ -560,7 +565,7 @@ enum class FileChooserFileType { class FileChooserChoice : public AbstractChoiceWithValueDisplay { public: FileChooserChoice(RequesterToken token, std::string *value, std::string_view title, BrowseFileType fileType, LayoutParams *layoutParams = nullptr); - std::string ValueText() const override; + std::string ValueText(bool *shadow) const override; Event OnChange; @@ -571,7 +576,7 @@ private: class FolderChooserChoice : public AbstractChoiceWithValueDisplay { public: FolderChooserChoice(RequesterToken token, std::string *value, std::string_view title, LayoutParams *layoutParams = nullptr); - std::string ValueText() const override; + std::string ValueText(bool *shadow) const override; Event OnChange; diff --git a/Common/UI/View.h b/Common/UI/View.h index 05beee41ec..00b6ce5978 100644 --- a/Common/UI/View.h +++ b/Common/UI/View.h @@ -859,7 +859,7 @@ public: } protected: - virtual std::string ValueText() const = 0; + virtual std::string ValueText(bool *shadow) const = 0; virtual ImageID ValueImage() const { return ImageID::invalid(); } float CalculateValueScale(const UIContext &dc, std::string_view valueText, float availWidth) const; @@ -872,7 +872,8 @@ public: ChoiceWithCallbackValueDisplay(std::string_view text, std::function valueFunc, LayoutParams *layoutParams = nullptr) : AbstractChoiceWithValueDisplay(text, layoutParams), valueFunc_(valueFunc) {} protected: - std::string ValueText() const override { + std::string ValueText(bool *shadow) const override { + *shadow = false; return valueFunc_(); } std::function valueFunc_; diff --git a/UI/AdhocServerScreen.cpp b/UI/AdhocServerScreen.cpp index d173f7a8e2..5a82d07d9e 100644 --- a/UI/AdhocServerScreen.cpp +++ b/UI/AdhocServerScreen.cpp @@ -17,6 +17,7 @@ public: auto ni = GetI18NCategory(I18NCat::NETWORKING); PopupTextInputChoice *textInputChoice = parent->Add(new PopupTextInputChoice(GetRequesterToken(), &editValue_, ni->T("Hostname"), "", 450, screenManager())); + textInputChoice->SetShadowText(ni->T("Hostname")); parent->Add(new CheckBox(&hasRelay_, ni->T("Relay server mode"))); }