'POPUP_TO_GET_ONE_VALUE'

本文介绍了一个 ABAP 程序中使用弹窗获取用户输入的示例代码。该示例展示了如何调用 'POPUP_TO_GET_ONE_VALUE' 函数来提示用户输入名字,并设置了一些基本的参数如文本行、标题、输入值长度等。

DATA: lv_value TYPE spop-varvalue1.

CALL FUNCTION 'POPUP_TO_GET_ONE_VALUE'

EXPORTING

textline1 = 'Enter Your Name'

* TEXTLINE2 = ' '

* TEXTLINE3 = ' '

titel = 'Name'

valuelength = 20

IMPORTING

* answer = lv_answer

value1 = lv_value

EXCEPTIONS

titel_too_long = 1

OTHERS = 2

.

MESSAGE lv_value TYPE 'I'.

var current_line_index = 0 var char_index = 0 var is_printing = false var timer = Timer.new() var rich_label var scroll_container var accumulated_text = "" var current_processed_line = "" # 存储预处理行 const APPEND_MODE_START = 7 # 关键词注册表 - 必须在函数外声明 var clickable_keywords = { "初阶符师": ["附身"], "沐月医": ["附身"], "守夜人": ["附身"] } func _ready(): # ... 保留您原有的_ready函数内容 ... # 信号连接(确保在所有子节点创建后) rich_label.meta_clicked.connect(_on_meta_clicked) # ... 保留您原有的scroll_to_bottom、_on_viewport_size_changed、start_printing_line函数 ... # 修改后的文本预处理函数 func preprocess_text(line: String) -> String: var processed_line = line for keyword in clickable_keywords.keys(): if keyword in processed_line: processed_line = processed_line.replace( keyword, "[url='%s']%s[/url]" % [keyword, keyword] ) return processed_line # 修改后的定时器回调 func _on_Timer_timeout(): if char_index < current_processed_line.length(): if current_line_index < APPEND_MODE_START: var current_text = current_processed_line.substr(0, char_index + 1) rich_label.text = "[center]" + current_text + "[/center]" else: accumulated_text += current_processed_line.substr(char_index, 1) rich_label.text = accumulated_text scroll_to_bottom() char_index += 1 else: timer.stop() is_printing = false if current_line_index >= APPEND_MODE_START - 1: accumulated_text += "\n" scroll_to_bottom() # 新增:信号处理方法(必须声明在类作用域) func _on_meta_clicked(meta): var keyword = meta var options = clickable_keywords.get(keyword, []) if options.size() > 0: var popup = PopupMenu.new() popup.position = get_global_mouse_position() + Vector2(20, 20) for i in range(options.size()): popup.add_item(options[i], i) # 连接选项选择信号 popup.id_pressed.connect( func(id): _on_option_selected(id, keyword, popup) ) add_child(popup) popup.popup() # 新增:选项选择处理方法 func _on_option_selected(id, keyword, popup): var selected_option = popup.get_item_text(id) print("选择了关键词 '%s' 的选项: %s" % [keyword, selected_option]) # 移除弹出菜单 popup.queue_free() # 执行选择的逻辑(例如:handle_possession(keyword, selected_option) # ... 保留您原有的_input函数 ... 你要替换的是这一段代码,请确保后续没有差错 # 关键词注册表(添加在 lines 变量下面) var clickable_keywords = { "初阶符师": ["附身"], "沐月医": ["附身"], "守夜人": ["附身"] } var current_line_index = 0 var char_index = 0 var is_printing = false var timer = Timer.new() var rich_label var scroll_container # 新增滚动容器 var accumulated_text = "" const APPEND_MODE_START = 7 # 第7行开始追加模式 func _ready(): # 创建主容器 var main_container = MarginContainer.new() main_container.anchor_right = Control.ANCHOR_END main_container.anchor_bottom = Control.ANCHOR_END main_container.size_flags_horizontal = Control.SIZE_EXPAND_FILL main_container.size_flags_vertical = Control.SIZE_EXPAND_FILL main_container.add_theme_constant_override("margin_left", 20) main_container.add_theme_constant_override("margin_right", 20) main_container.add_theme_constant_override("margin_top", 20) main_container.add_theme_constant_override("margin_bottom", 50) add_child(main_container) # 创建滚动容器 - 解决遮挡问题 scroll_container = ScrollContainer.new() scroll_container.size_flags_horizontal = Control.SIZE_EXPAND_FILL scroll_container.size_flags_vertical = Control.SIZE_EXPAND_FILL scroll_container.horizontal_scroll_mode = ScrollContainer.SCROLL_MODE_DISABLED main_container.add_child(scroll_container) # 创建富文本标签 rich_label = RichTextLabel.new() rich_label.name = "DialogueLabel" rich_label.bbcode_enabled = true rich_label.autowrap_mode = TextServer.AUTOWRAP_WORD rich_label.scroll_active = true # 启用内置滚动 rich_label.scroll_following = true # 自动跟随新内容 rich_label.size_flags_horizontal = Control.SIZE_EXPAND_FILL rich_label.size_flags_vertical = Control.SIZE_EXPAND_FILL rich_label.custom_minimum_size = Vector2(0, 600) # 宽度设为0,允许自动扩展 rich_label.fit_content = true # 样式设置 rich_label.add_theme_font_size_override("normal_font_size", 32) rich_label.add_theme_color_override("default_color", Color.WHITE) rich_label.add_theme_constant_override("line_separation", 5) # 更大的行间距 # 将标签放入滚动容器 scroll_container.add_child(rich_label) # 定时器设置 timer.wait_time = 0.05 timer.one_shot = false add_child(timer) timer.timeout.connect(_on_Timer_timeout) # 窗口大小变化处理 get_viewport().size_changed.connect(_on_viewport_size_changed) # 开始打印第一行 start_printing_line() rich_label.meta_clicked.connect(_on_meta_clicked) func scroll_to_bottom(): # 等待一帧确保内容渲染完成 await get_tree().process_frame # 获取垂直滚动条并设置到底部 var v_scroll = rich_label.get_v_scroll_bar() if v_scroll: v_scroll.value = v_scroll.max_value # Godot 4 专用方法 - 双重确保 rich_label.scroll_to_line(rich_label.get_line_count() - 1) # 响应窗口大小变化 func _on_viewport_size_changed(): var viewport_size = get_viewport().size # 设置滚动容器高度为屏幕的70% scroll_container.custom_minimum_size = Vector2(viewport_size.x * 0.95, viewport_size.y * 0.7) # 确保标签宽度匹配容器 rich_label.size_flags_horizontal = Control.SIZE_EXPAND_FILL # 开始打印新行 func start_printing_line(): if current_line_index >= lines.size(): return is_printing = true char_index = 0 # 前6行覆盖显示,第7行开始追加显示 if current_line_index < APPEND_MODE_START: rich_label.text = "" accumulated_text = "" timer.start() # 定时器回调 - 逐字打印 func _on_Timer_timeout(): if char_index < lines[current_line_index].length(): if current_line_index < APPEND_MODE_START: # 覆盖模式:单行居中显示 var current_text = lines[current_line_index].substr(0, char_index + 1) rich_label.text = "[center]" + current_text + "[/center]" else: # 追加模式:多行连续显示 accumulated_text += lines[current_line_index].substr(char_index, 1) rich_label.text = accumulated_text # 滚动到最新内容 scroll_to_bottom() char_index += 1 else: # 行结束处理 timer.stop() is_printing = false if current_line_index >= APPEND_MODE_START - 1: accumulated_text += "\n" # 添加换行符 scroll_to_bottom()
最新发布
11-06
chromium源码中下面的函数具体功能,详细解释一下: base::WeakPtr<content::NavigationHandle> Navigate(NavigateParams* params) { TRACE_EVENT1("navigation", "chrome::Navigate", "disposition", params->disposition); Browser* source_browser = params->browser; if (source_browser) { params->initiating_profile = source_browser->profile(); } DCHECK(params->initiating_profile); // If the created window is a partitioned popin, a valid source exists, and // the disposition is NEW_POPUP then the resulting popup should be tab-modal. // See: https://explainers-by-googlers.github.io/partitioned-popins/ params->is_tab_modal_popup |= params->window_features.is_partitioned_popin && params->source_contents && params->disposition == WindowOpenDisposition::NEW_POPUP; #if BUILDFLAG(IS_CHROMEOS) if (params->initiating_profile->IsOffTheRecord() && params->initiating_profile->GetOTRProfileID().IsCaptivePortal() && params->disposition != WindowOpenDisposition::NEW_POPUP && params->disposition != WindowOpenDisposition::CURRENT_TAB && !IncognitoModeForced(params->initiating_profile)) { // Navigation outside of the current tab or the initial popup window from a // captive portal signin window should be prevented. params->disposition = WindowOpenDisposition::CURRENT_TAB; } #endif if (params->initiating_profile->ShutdownStarted()) { // Don't navigate when the profile is shutting down. return nullptr; } // Block navigation requests when in locked fullscreen mode. We allow // navigation requests in the webapp when locked for OnTask (only relevant for // non-web browser scenarios). // TODO(b/365146870): Remove once we consolidate locked fullscreen with // OnTask. if (source_browser) { bool should_block_navigation = platform_util::IsBrowserLockedFullscreen(source_browser); #if BUILDFLAG(IS_CHROMEOS) if (source_browser->IsLockedForOnTask()) { should_block_navigation = false; } #endif // BUILDFLAG(IS_CHROMEOS) if (should_block_navigation) { return nullptr; } } // Open System Apps in their standalone window if necessary. // TODO(crbug.com/40136163): Remove this code after we integrate with intent // handling. #if BUILDFLAG(IS_CHROMEOS) const std::optional<ash::SystemWebAppType> capturing_system_app_type = ash::GetCapturingSystemAppForURL(params->initiating_profile, params->url); if (capturing_system_app_type && (!params->browser || !ash::IsBrowserForSystemWebApp(params->browser, capturing_system_app_type.value()))) { ash::SystemAppLaunchParams swa_params; swa_params.url = params->url; ash::LaunchSystemWebAppAsync(params->initiating_profile, capturing_system_app_type.value(), swa_params); // It's okay to early return here, because LaunchSystemWebAppAsync uses a // different logic to choose (and create if necessary) a browser window for // system apps. // // It's okay to skip the checks and cleanups below. The link captured system // app will either open in its own browser window, or navigate an existing // browser window exclusively used by this app. For the initiating browser, // the navigation should appear to be cancelled. return nullptr; } #endif // BUILDFLAG(IS_CHROMEOS) #if !BUILDFLAG(IS_ANDROID) // Force isolated PWAs to open in an app window. params->force_open_pwa_window = content::SiteIsolationPolicy::ShouldUrlUseApplicationIsolationLevel( params->initiating_profile, params->url); params->open_pwa_window_if_possible |= params->force_open_pwa_window; #endif if (!AdjustNavigateParamsForURL(params)) { return nullptr; } // Picture-in-picture browser windows must have a source contents in order for // the window to function correctly. If we have no source contents to work // with (e.g. if an extension popup attempts to open a PiP window), we should // cancel the navigation. The source URL must also be of a type that's // allowed to open document PiP. See `PictureInPictureWindowManager` for // details on what's allowed. if (params->disposition == WindowOpenDisposition::NEW_PICTURE_IN_PICTURE) { const GURL& url = params->source_contents ? params->source_contents->GetLastCommittedURL() : GURL(); if (!PictureInPictureWindowManager::IsSupportedForDocumentPictureInPicture( url)) { return nullptr; } } // If no source WebContents was specified, we use the selected one from the // target browser. This must happen before GetBrowserAndTabForDisposition() // has a chance to replace |params->browser| with another one, but after the // above check that relies on the original source_contents value. if (!params->source_contents && params->browser) { params->source_contents = params->browser->tab_strip_model()->GetActiveWebContents(); } WebContents* contents_to_navigate_or_insert = params->contents_to_insert.get(); if (params->switch_to_singleton_tab) { DCHECK_EQ(params->disposition, WindowOpenDisposition::SINGLETON_TAB); contents_to_navigate_or_insert = params->switch_to_singleton_tab; } #if !BUILDFLAG(IS_ANDROID) // If this is a Picture in Picture window, then notify the pip manager about // it. This enables the opener and pip window to stay connected, so that (for // example), the pip window does not outlive the opener. // // We do this before creating the browser window, so that the browser can talk // to the PictureInPictureWindowManager. Otherwise, the manager has no idea // that there's a pip window. if (params->disposition == WindowOpenDisposition::NEW_PICTURE_IN_PICTURE) { // Picture in picture windows may not be opened by other picture in // picture windows, or without an opener. if (!params->browser || params->browser->is_type_picture_in_picture()) { params->browser = nullptr; return nullptr; } PictureInPictureWindowManager::GetInstance()->EnterDocumentPictureInPicture( params->source_contents, contents_to_navigate_or_insert); } #endif // !BUILDFLAG(IS_ANDROID) // TODO(crbug.com/364657540): Revisit integration with web_application system // later if needed. int singleton_index; #if !BUILDFLAG(IS_ANDROID) std::unique_ptr<web_app::NavigationCapturingProcess> app_navigation = web_app::NavigationCapturingProcess::MaybeHandleAppNavigation(*params); std::optional<std::tuple<Browser*, int>> app_browser_tab_override; if (app_navigation) { app_browser_tab_override = app_navigation->GetInitialBrowserAndTabOverrideForNavigation(*params); } std::tie(params->browser, singleton_index) = app_browser_tab_override.has_value() ? *app_browser_tab_override : GetBrowserAndTabForDisposition(*params); #else // !BUILDFLAG(IS_ANDROID) std::tie(params->browser, singleton_index) = GetBrowserAndTabForDisposition(*params); #endif if (!params->browser) { return nullptr; } // Trying to open a background tab when in a non-tabbed app browser results in // focusing a regular browser window and opening a tab in the background // of that window. Change the disposition to NEW_FOREGROUND_TAB so that // the new tab is focused. if (source_browser && source_browser->is_type_app() && params->disposition == WindowOpenDisposition::NEW_BACKGROUND_TAB && !(source_browser->app_controller() && source_browser->app_controller()->has_tab_strip())) { params->disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB; } if (singleton_index != -1) { contents_to_navigate_or_insert = params->browser->tab_strip_model()->GetWebContentsAt(singleton_index); } else if (params->disposition == WindowOpenDisposition::SWITCH_TO_TAB) { // The user is trying to open a tab that no longer exists. If we open a new // tab, it could leave orphaned NTPs around, but always overwriting the // current tab could could clobber state that the user was trying to // preserve. Fallback to the behavior used for singletons: overwrite the // current tab if it's the NTP, otherwise open a new tab. params->disposition = WindowOpenDisposition::SINGLETON_TAB; ShowSingletonTabOverwritingNTP(params); return nullptr; } if (params->force_open_pwa_window) { CHECK(web_app::AppBrowserController::IsWebApp(params->browser)); } #if BUILDFLAG(IS_CHROMEOS) if (source_browser && source_browser != params->browser) { // When the newly created browser was spawned by a browser which visits // another user's desktop, it should be shown on the same desktop as the // originating one. (This is part of the desktop separation per profile). auto* window_manager = MultiUserWindowManagerHelper::GetWindowManager(); // Some unit tests have no client instantiated. if (window_manager) { aura::Window* src_window = source_browser->window()->GetNativeWindow(); aura::Window* new_window = params->browser->window()->GetNativeWindow(); const AccountId& src_account_id = window_manager->GetUserPresentingWindow(src_window); if (src_account_id != window_manager->GetUserPresentingWindow(new_window)) { // Once the window gets presented, it should be shown on the same // desktop as the desktop of the creating browser. Note that this // command will not show the window if it wasn't shown yet by the // browser creation. window_manager->ShowWindowForUser(new_window, src_account_id); } } } #endif // Navigate() must not return early after this point. if (GetSourceProfile(params) != params->browser->profile()) { // A tab is being opened from a link from a different profile, we must reset // source information that may cause state to be shared. params->opener = nullptr; params->source_contents = nullptr; params->source_site_instance = nullptr; params->referrer = content::Referrer(); } // Make sure the Browser is shown if params call for it. ScopedBrowserShower shower(params, &contents_to_navigate_or_insert); if (params->is_tab_modal_popup) { shower.set_source_contents(params->source_contents); } // Some dispositions need coercion to base types. NormalizeDisposition(params); // If a new window has been created, it needs to be shown. if (params->window_action == NavigateParams::NO_ACTION && source_browser != params->browser && params->browser->tab_strip_model()->empty()) { params->window_action = NavigateParams::SHOW_WINDOW; } // If we create a popup window from a non user-gesture, don't activate it. if (params->window_action == NavigateParams::SHOW_WINDOW && params->disposition == WindowOpenDisposition::NEW_POPUP && params->user_gesture == false) { params->window_action = NavigateParams::SHOW_WINDOW_INACTIVE; } // Determine if the navigation was user initiated. If it was, we need to // inform the target WebContents, and we may need to update the UI. bool user_initiated = params->transition & ui::PAGE_TRANSITION_FROM_ADDRESS_BAR || !ui::PageTransitionIsWebTriggerable(params->transition); base::WeakPtr<content::NavigationHandle> navigation_handle; std::unique_ptr<tabs::TabModel> tab_to_insert; if (params->contents_to_insert) { tab_to_insert = std::make_unique<tabs::TabModel>(std::move(params->contents_to_insert), params->browser->tab_strip_model()); } // If no target WebContents was specified (and we didn't seek and find a // singleton), we need to construct one if we are supposed to target a new // tab. if (!contents_to_navigate_or_insert) { DCHECK(!params->url.is_empty()); if (params->disposition != WindowOpenDisposition::CURRENT_TAB) { tab_to_insert = std::make_unique<tabs::TabModel>( CreateTargetContents(*params, params->url), params->browser->tab_strip_model()); contents_to_navigate_or_insert = tab_to_insert->GetContents(); apps::SetAppIdForWebContents(params->browser->profile(), contents_to_navigate_or_insert, params->app_id); #if BUILDFLAG(ENABLE_CAPTIVE_PORTAL_DETECTION) captive_portal::CaptivePortalTabHelper::FromWebContents( contents_to_navigate_or_insert) ->set_window_type(params->captive_portal_window_type); #endif } else { // ... otherwise if we're loading in the current tab, the target is the // same as the source. DCHECK(params->source_contents); contents_to_navigate_or_insert = params->source_contents; } // Try to handle non-navigational URLs that popup dialogs and such, these // should not actually navigate. if (!HandleNonNavigationAboutURL(params->url)) { // Perform the actual navigation, tracking whether it came from the // renderer. navigation_handle = LoadURLInContents(contents_to_navigate_or_insert, params->url, params); } } else { // |contents_to_navigate_or_insert| was specified non-NULL, and so we assume // it has already been navigated appropriately. We need to do nothing more // other than add it to the appropriate tabstrip. } // If the user navigated from the omnibox, and the selected tab is going to // lose focus, then make sure the focus for the source tab goes away from the // omnibox. if (params->source_contents && (params->disposition == WindowOpenDisposition::NEW_FOREGROUND_TAB || params->disposition == WindowOpenDisposition::NEW_WINDOW) && (params->tabstrip_add_types & AddTabTypes::ADD_INHERIT_OPENER)) { params->source_contents->Focus(); } if (tab_to_insert) { // Save data needed for link capturing into apps that cannot otherwise be // inferred later in the navigation. These are only needed when the // navigation happens in a different tab to the link click. apps::SetLinkCapturingSourceDisposition(tab_to_insert->GetContents(), params->disposition); } if (params->source_contents == contents_to_navigate_or_insert) { // The navigation occurred in the source tab. params->browser->UpdateUIForNavigationInTab( contents_to_navigate_or_insert, params->transition, params->window_action, user_initiated); } else if (singleton_index == -1) { if (source_browser != params->browser) { params->tabstrip_index = params->browser->tab_strip_model()->count(); } // If some non-default value is set for the index, we should tell the // TabStripModel to respect it. if (params->tabstrip_index != -1) { params->tabstrip_add_types |= AddTabTypes::ADD_FORCE_INDEX; } // Maybe notify that an open operation has been done from a gesture. // TODO(crbug.com/40719979): preferably pipe this information through the // TabStripModel instead. See bug for deeper discussion. if (params->user_gesture && source_browser == params->browser) { params->browser->window()->LinkOpeningFromGesture(params->disposition); } DCHECK(tab_to_insert); // The navigation should insert a new tab into the target Browser. params->browser->tab_strip_model()->AddTab( std::move(tab_to_insert), params->tabstrip_index, params->transition, params->tabstrip_add_types, params->group); } if (singleton_index >= 0) { // If switching browsers, make sure it is shown. if (params->disposition == WindowOpenDisposition::SWITCH_TO_TAB && params->browser != source_browser) { params->window_action = NavigateParams::SHOW_WINDOW; } if (contents_to_navigate_or_insert->IsCrashed()) { contents_to_navigate_or_insert->GetController().Reload( content::ReloadType::NORMAL, true); } else if (params->path_behavior == NavigateParams::IGNORE_AND_NAVIGATE && contents_to_navigate_or_insert->GetURL() != params->url) { navigation_handle = LoadURLInContents(contents_to_navigate_or_insert, params->url, params); } // If the singleton tab isn't already selected, select it. if (params->source_contents != contents_to_navigate_or_insert) { // Use the index before the potential close below, because it could // make the index refer to a different tab. auto gesture_type = user_initiated ? TabStripUserGestureDetails::GestureType::kOther : TabStripUserGestureDetails::GestureType::kNone; bool should_close_this_tab = false; if (params->disposition == WindowOpenDisposition::SWITCH_TO_TAB) { // Close orphaned NTP (and the like) with no history when the user // switches away from them. if (params->source_contents) { if (params->source_contents->GetController().CanGoBack() || (params->source_contents->GetLastCommittedURL().spec() != chrome::kChromeUINewTabURL && params->source_contents->GetLastCommittedURL().spec() != url::kAboutBlankURL)) { // Blur location bar before state save in ActivateTabAt() below. params->source_contents->Focus(); } else { should_close_this_tab = true; } } } params->browser->tab_strip_model()->ActivateTabAt( singleton_index, TabStripUserGestureDetails(gesture_type)); // Close tab after switch so index remains correct. if (should_close_this_tab) { params->source_contents->Close(); } } } params->navigated_or_inserted_contents = contents_to_navigate_or_insert; // At this point, the `params->navigated_or_inserted_contents` is guaranteed to // be non null, so perform tasks if the navigation has been captured by a web // app, like enqueueing launch params. #if !BUILDFLAG(IS_ANDROID) if (app_navigation) { web_app::NavigationCapturingProcess::AfterWebContentsCreation( std::move(app_navigation), *params->navigated_or_inserted_contents, navigation_handle.get()); } #endif // !BUILDFLAG(IS_ANDROID) return navigation_handle; }
08-01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值