void SpectraSet::add_spill(Spill* one_spill) { boost::unique_lock<boost::mutex> lock(mutex_); for (auto &q: my_spectra_) q->addSpill(*one_spill); if (one_spill->run != RunInfo()) run_info_ = one_spill->run; if ((!one_spill->stats.empty()) || (!one_spill->hits.empty()) || (!one_spill->data.empty()) || (one_spill->run != RunInfo())) changed_ = true; ready_ = true; newdata_ = true; cond_.notify_one(); }
void SpectraSet::clear_helper() { //private, no lock needed if (!my_spectra_.empty()) changed_ = true; if (!my_spectra_.empty()) for (auto &q: my_spectra_) { if (q != nullptr) delete q; } my_spectra_.clear(); run_info_ = RunInfo(); }
TSharedRef< ISlateRun > FWidgetDecorator::Create(const TSharedRef<class FTextLayout>& TextLayout, const FTextRunParseResults& RunParseResult, const FString& OriginalText, const TSharedRef< FString >& InOutModelText, const ISlateStyle* Style) { FTextRange ModelRange; ModelRange.BeginIndex = InOutModelText->Len(); *InOutModelText += TEXT('\u00A0'); // Zero-Width Breaking Space ModelRange.EndIndex = InOutModelText->Len(); FTextRunInfo RunInfo( RunParseResult.Name, FText::FromString( OriginalText.Mid( RunParseResult.ContentRange.BeginIndex, RunParseResult.ContentRange.EndIndex - RunParseResult.ContentRange.BeginIndex ) ) ); for(const TPair<FString, FTextRange>& Pair : RunParseResult.MetaData) { RunInfo.MetaData.Add(Pair.Key, OriginalText.Mid( Pair.Value.BeginIndex, Pair.Value.EndIndex - Pair.Value.BeginIndex)); } return FSlateWidgetRun::Create(TextLayout, RunInfo, InOutModelText, CreateWidgetDelegate.Execute(RunInfo, Style), ModelRange); }
virtual TSharedRef<ISlateRun> Create(const TSharedRef<class FTextLayout>& TextLayout, const FTextRunParseResults& RunParseResult, const FString& OriginalText, const TSharedRef< FString >& InOutModelText, const ISlateStyle* Style) override { FRunInfo RunInfo(RunParseResult.Name); for(const TPair<FString, FTextRange>& Pair : RunParseResult.MetaData) { RunInfo.MetaData.Add(Pair.Key, OriginalText.Mid(Pair.Value.BeginIndex, Pair.Value.EndIndex - Pair.Value.BeginIndex)); } FTextRange ModelRange; ModelRange.BeginIndex = InOutModelText->Len(); *InOutModelText += OriginalText.Mid(RunParseResult.ContentRange.BeginIndex, RunParseResult.ContentRange.EndIndex - RunParseResult.ContentRange.BeginIndex); ModelRange.EndIndex = InOutModelText->Len(); return FSlateTextRun::Create(RunInfo, InOutModelText, FTextStyleAndName::CreateTextBlockStyle(RunInfo), ModelRange); }
TSharedRef< ISlateRun > FHyperlinkDecorator::Create(const TSharedRef<class FTextLayout>& TextLayout, const FTextRunParseResults& RunParseResult, const FString& OriginalText, const TSharedRef< FString >& InOutModelText, const ISlateStyle* Style) { FString StyleName = TEXT("Hyperlink"); FString TextStyleName = TEXT(""); const FTextRange* const MetaDataStyleNameRange = RunParseResult.MetaData.Find( TEXT("style") ); if ( MetaDataStyleNameRange != NULL ) { const FString MetaDataStyleName = OriginalText.Mid(MetaDataStyleNameRange->BeginIndex, MetaDataStyleNameRange->EndIndex - MetaDataStyleNameRange->BeginIndex); StyleName = *MetaDataStyleName; } const FTextRange* const MetaDataTextStyleNameRange = RunParseResult.MetaData.Find(TEXT("textstyle")); if (MetaDataTextStyleNameRange != NULL) { const FString MetaDataTextStyleName = OriginalText.Mid(MetaDataTextStyleNameRange->BeginIndex, MetaDataTextStyleNameRange->EndIndex - MetaDataTextStyleNameRange->BeginIndex); TextStyleName = *MetaDataTextStyleName; } FTextRange ModelRange; ModelRange.BeginIndex = InOutModelText->Len(); *InOutModelText += OriginalText.Mid(RunParseResult.ContentRange.BeginIndex, RunParseResult.ContentRange.EndIndex - RunParseResult.ContentRange.BeginIndex); ModelRange.EndIndex = InOutModelText->Len(); if ( !Style->HasWidgetStyle<FHyperlinkStyle>( FName( *StyleName ) ) ) { Style = &FCoreStyle::Get(); } FRunInfo RunInfo( RunParseResult.Name ); for(const TPair<FString, FTextRange>& Pair : RunParseResult.MetaData) { RunInfo.MetaData.Add(Pair.Key, OriginalText.Mid( Pair.Value.BeginIndex, Pair.Value.EndIndex - Pair.Value.BeginIndex)); } FHyperlinkStyle HyperlinkStyle = Style->GetWidgetStyle<FHyperlinkStyle>(FName(*StyleName)); if (!TextStyleName.IsEmpty() && Style->HasWidgetStyle<FTextBlockStyle>(FName(*TextStyleName))) { HyperlinkStyle.SetTextStyle(Style->GetWidgetStyle<FTextBlockStyle>(FName(*TextStyleName))); } return FSlateHyperlinkRun::Create(RunInfo, InOutModelText, HyperlinkStyle, NavigateDelegate, ToolTipDelegate, ToolTipTextDelegate, ModelRange); }
TSharedRef< ISlateRun > FImageDecorator::Create(const TSharedRef<class FTextLayout>& TextLayout, const FTextRunParseResults& RunParseResult, const FString& OriginalText, const TSharedRef< FString >& InOutModelText, const ISlateStyle* Style) { const FTextRange* const BrushNameRange = RunParseResult.MetaData.Find( TEXT("src") ); FTextRange ModelRange; ModelRange.BeginIndex = InOutModelText->Len(); *InOutModelText += TEXT('\x200B'); // Zero-Width Breaking Space ModelRange.EndIndex = InOutModelText->Len(); FRunInfo RunInfo( RunParseResult.Name ); for(const TPair<FString, FTextRange>& Pair : RunParseResult.MetaData) { RunInfo.MetaData.Add(Pair.Key, OriginalText.Mid( Pair.Value.BeginIndex, Pair.Value.EndIndex - Pair.Value.BeginIndex)); } if ( BrushNameRange != NULL ) { const FString BrushNameString = OriginalText.Mid(BrushNameRange->BeginIndex, BrushNameRange->EndIndex - BrushNameRange->BeginIndex); if ( OverrideStyle != NULL ) { Style = OverrideStyle; } FName BrushName( *BrushNameString ); if ( Style->HasWidgetStyle< FInlineTextImageStyle >( BrushName ) ) { const FInlineTextImageStyle& ImageStyle = Style->GetWidgetStyle< FInlineTextImageStyle >( BrushName ); return FSlateImageRun::Create( RunInfo, InOutModelText, &ImageStyle.Image, ImageStyle.Baseline, ModelRange ); } return FSlateImageRun::Create( RunInfo, InOutModelText, Style->GetBrush( BrushName ), 0, ModelRange ); } const FInlineTextImageStyle& ImageStyle = FInlineTextImageStyle::GetDefault(); return FSlateImageRun::Create( RunInfo, InOutModelText, &ImageStyle.Image, ImageStyle.Baseline, ModelRange ); }
void FCPPRichTextSyntaxHighlighterTextLayoutMarshaller::ParseTokens(const FString& SourceString, FTextLayout& TargetTextLayout, TArray<FSyntaxTokenizer::FTokenizedLine> TokenizedLines) { enum class EParseState : uint8 { None, LookingForString, LookingForCharacter, LookingForSingleLineComment, LookingForMultiLineComment, }; // Parse the tokens, generating the styled runs for each line EParseState ParseState = EParseState::None; for(const FSyntaxTokenizer::FTokenizedLine& TokenizedLine : TokenizedLines) { TSharedRef<FString> ModelString = MakeShareable(new FString()); TArray< TSharedRef< IRun > > Runs; if(ParseState == EParseState::LookingForSingleLineComment) { ParseState = EParseState::None; } for(const FSyntaxTokenizer::FToken& Token : TokenizedLine.Tokens) { const FString TokenText = SourceString.Mid(Token.Range.BeginIndex, Token.Range.Len()); const FTextRange ModelRange(ModelString->Len(), ModelString->Len() + TokenText.Len()); ModelString->Append(TokenText); FRunInfo RunInfo(TEXT("SyntaxHighlight.CPP.Normal")); FTextBlockStyle TextBlockStyle = SyntaxTextStyle.NormalTextStyle; const bool bIsWhitespace = FString(TokenText).TrimTrailing().IsEmpty(); if(!bIsWhitespace) { bool bHasMatchedSyntax = false; if(Token.Type == FSyntaxTokenizer::ETokenType::Syntax) { if(ParseState == EParseState::None && TokenText == TEXT("\"")) { RunInfo.Name = TEXT("SyntaxHighlight.CPP.String"); TextBlockStyle = SyntaxTextStyle.StringTextStyle; ParseState = EParseState::LookingForString; bHasMatchedSyntax = true; } else if(ParseState == EParseState::LookingForString && TokenText == TEXT("\"")) { RunInfo.Name = TEXT("SyntaxHighlight.CPP.Normal"); TextBlockStyle = SyntaxTextStyle.StringTextStyle; ParseState = EParseState::None; } else if(ParseState == EParseState::None && TokenText == TEXT("\'")) { RunInfo.Name = TEXT("SyntaxHighlight.CPP.String"); TextBlockStyle = SyntaxTextStyle.StringTextStyle; ParseState = EParseState::LookingForCharacter; bHasMatchedSyntax = true; } else if(ParseState == EParseState::LookingForCharacter && TokenText == TEXT("\'")) { RunInfo.Name = TEXT("SyntaxHighlight.CPP.Normal"); TextBlockStyle = SyntaxTextStyle.StringTextStyle; ParseState = EParseState::None; } else if(ParseState == EParseState::None && TokenText.StartsWith(TEXT("#"))) { RunInfo.Name = TEXT("SyntaxHighlight.CPP.PreProcessorKeyword"); TextBlockStyle = SyntaxTextStyle.PreProcessorKeywordTextStyle; ParseState = EParseState::None; } else if(ParseState == EParseState::None && TokenText == TEXT("//")) { RunInfo.Name = TEXT("SyntaxHighlight.CPP.Comment"); TextBlockStyle = SyntaxTextStyle.CommentTextStyle; ParseState = EParseState::LookingForSingleLineComment; } else if(ParseState == EParseState::None && TokenText == TEXT("/*")) { RunInfo.Name = TEXT("SyntaxHighlight.CPP.Comment"); TextBlockStyle = SyntaxTextStyle.CommentTextStyle; ParseState = EParseState::LookingForMultiLineComment; } else if(ParseState == EParseState::LookingForMultiLineComment && TokenText == TEXT("*/")) { RunInfo.Name = TEXT("SyntaxHighlight.CPP.Comment"); TextBlockStyle = SyntaxTextStyle.CommentTextStyle; ParseState = EParseState::None; } else if(ParseState == EParseState::None && TChar<WIDECHAR>::IsAlpha(TokenText[0])) { RunInfo.Name = TEXT("SyntaxHighlight.CPP.Keyword"); TextBlockStyle = SyntaxTextStyle.KeywordTextStyle; ParseState = EParseState::None; } else if(ParseState == EParseState::None && !TChar<WIDECHAR>::IsAlpha(TokenText[0])) { RunInfo.Name = TEXT("SyntaxHighlight.CPP.Operator"); TextBlockStyle = SyntaxTextStyle.OperatorTextStyle; ParseState = EParseState::None; } } // It's possible that we fail to match a syntax token if we're in a state where it isn't parsed // In this case, we treat it as a literal token if(Token.Type == FSyntaxTokenizer::ETokenType::Literal || !bHasMatchedSyntax) { if(ParseState == EParseState::LookingForString) { RunInfo.Name = TEXT("SyntaxHighlight.CPP.String"); TextBlockStyle = SyntaxTextStyle.StringTextStyle; } else if(ParseState == EParseState::LookingForCharacter) { RunInfo.Name = TEXT("SyntaxHighlight.CPP.String"); TextBlockStyle = SyntaxTextStyle.StringTextStyle; } else if(ParseState == EParseState::LookingForSingleLineComment) { RunInfo.Name = TEXT("SyntaxHighlight.CPP.Comment"); TextBlockStyle = SyntaxTextStyle.CommentTextStyle; } else if(ParseState == EParseState::LookingForMultiLineComment) { RunInfo.Name = TEXT("SyntaxHighlight.CPP.Comment"); TextBlockStyle = SyntaxTextStyle.CommentTextStyle; } } TSharedRef< ISlateRun > Run = FSlateTextRun::Create(RunInfo, ModelString, TextBlockStyle, ModelRange); Runs.Add(Run); } else { RunInfo.Name = TEXT("SyntaxHighlight.CPP.WhiteSpace"); TSharedRef< ISlateRun > Run = FWhiteSpaceTextRun::Create(RunInfo, ModelString, TextBlockStyle, ModelRange, 4); Runs.Add(Run); } } TargetTextLayout.AddLine(ModelString, Runs); } }
void FRichTextSyntaxHighlighterTextLayoutMarshaller::ParseTokens(const FString& SourceString, FTextLayout& TargetTextLayout, TArray<FSyntaxTokenizer::FTokenizedLine> TokenizedLines) { enum class EParseState : uint8 { LookingForNode, LookingForNodeName, LookingForNodeAttributeKey, LookingForNodeAttribueValueBegin, LookingForNodeAttribueValueBody, }; // Parse the tokens, generating the styled runs for each line EParseState ParseState = EParseState::LookingForNode; for(const FSyntaxTokenizer::FTokenizedLine& TokenizedLine : TokenizedLines) { TSharedRef<FString> ModelString = MakeShareable(new FString()); TArray< TSharedRef< IRun > > Runs; for(const FSyntaxTokenizer::FToken& Token : TokenizedLine.Tokens) { const FString TokenText = SourceString.Mid(Token.Range.BeginIndex, Token.Range.Len()); const FTextRange ModelRange(ModelString->Len(), ModelString->Len() + TokenText.Len()); ModelString->Append(TokenText); FRunInfo RunInfo(TEXT("SyntaxHighlight.Normal")); FTextBlockStyle TextBlockStyle = SyntaxTextStyle.NormalTextStyle; const bool bIsWhitespace = FString(TokenText).TrimTrailing().IsEmpty(); if(!bIsWhitespace) { bool bHasMatchedSyntax = false; if(Token.Type == FSyntaxTokenizer::ETokenType::Syntax) { if(ParseState == EParseState::LookingForNode && TokenText == TEXT("<")) { RunInfo.Name = TEXT("SyntaxHighlight.Node"); TextBlockStyle = SyntaxTextStyle.NodeTextStyle; ParseState = EParseState::LookingForNodeName; bHasMatchedSyntax = true; } else if(ParseState == EParseState::LookingForNodeAttributeKey && TokenText == TEXT(">")) { RunInfo.Name = TEXT("SyntaxHighlight.Node"); TextBlockStyle = SyntaxTextStyle.NodeTextStyle; ParseState = EParseState::LookingForNode; } else if(ParseState == EParseState::LookingForNode && TokenText == TEXT("</>")) { RunInfo.Name = TEXT("SyntaxHighlight.Node"); TextBlockStyle = SyntaxTextStyle.NodeTextStyle; // No state change bHasMatchedSyntax = true; } else if(ParseState == EParseState::LookingForNodeAttributeKey && TokenText == TEXT("=")) { RunInfo.Name = TEXT("SyntaxHighlight.NodeAttribueAssignment"); TextBlockStyle = SyntaxTextStyle.NodeAttribueAssignmentTextStyle; ParseState = EParseState::LookingForNodeAttribueValueBegin; bHasMatchedSyntax = true; } else if(ParseState == EParseState::LookingForNodeAttribueValueBegin && TokenText == TEXT("\"")) { RunInfo.Name = TEXT("SyntaxHighlight.NodeAttributeValue"); TextBlockStyle = SyntaxTextStyle.NodeAttributeValueTextStyle; ParseState = EParseState::LookingForNodeAttribueValueBody; bHasMatchedSyntax = true; } else if(ParseState == EParseState::LookingForNodeAttribueValueBody && TokenText == TEXT("\"")) { RunInfo.Name = TEXT("SyntaxHighlight.NodeAttributeValue"); TextBlockStyle = SyntaxTextStyle.NodeAttributeValueTextStyle; ParseState = EParseState::LookingForNodeAttributeKey; bHasMatchedSyntax = true; } } // It's possible that we fail to match a syntax token if we're in a state where it isn't parsed // In this case, we treat it as a literal token if(Token.Type == FSyntaxTokenizer::ETokenType::Literal || !bHasMatchedSyntax) { if(ParseState == EParseState::LookingForNodeName) { RunInfo.Name = TEXT("SyntaxHighlight.Node"); TextBlockStyle = SyntaxTextStyle.NodeTextStyle; ParseState = EParseState::LookingForNodeAttributeKey; } else if(ParseState == EParseState::LookingForNodeAttributeKey) { RunInfo.Name = TEXT("SyntaxHighlight.NodeAttributeKey"); TextBlockStyle = SyntaxTextStyle.NodeAttributeKeyTextStyle; // No state change, a key can be multiple tokens - consume until we find an equals } else if(ParseState == EParseState::LookingForNodeAttribueValueBody) { RunInfo.Name = TEXT("SyntaxHighlight.NodeAttributeValue"); TextBlockStyle = SyntaxTextStyle.NodeAttributeValueTextStyle; // No state change, a value can be multiple tokens - consume until we find a closing quote } } } TSharedRef< ISlateRun > Run = FSlateTextRun::Create(RunInfo, ModelString, TextBlockStyle, ModelRange); Runs.Add(Run); } TargetTextLayout.AddLine(ModelString, Runs); } }