gtk/auto/font_chooser_dialog.rs
1// This file was generated by gir (https://github.com/gtk-rs/gir)
2// from gir-files (https://github.com/gtk-rs/gir-files)
3// DO NOT EDIT
4
5#[cfg(feature = "v3_24")]
6#[cfg_attr(docsrs, doc(cfg(feature = "v3_24")))]
7use crate::FontChooserLevel;
8use crate::{
9 Align, Application, Bin, Buildable, Container, Dialog, FontChooser, ResizeMode, Widget, Window,
10 WindowPosition, WindowType, ffi,
11};
12use glib::{prelude::*, translate::*};
13
14glib::wrapper! {
15 /// The [`FontChooserDialog`][crate::FontChooserDialog] widget is a dialog for selecting a font.
16 /// It implements the [`FontChooser`][crate::FontChooser] interface.
17 ///
18 /// # GtkFontChooserDialog as GtkBuildable
19 ///
20 /// The GtkFontChooserDialog implementation of the [`Buildable`][crate::Buildable]
21 /// interface exposes the buttons with the names “select_button”
22 /// and “cancel_button”.
23 ///
24 /// # Implements
25 ///
26 /// [`DialogExt`][trait@crate::prelude::DialogExt], [`GtkWindowExt`][trait@crate::prelude::GtkWindowExt], [`BinExt`][trait@crate::prelude::BinExt], [`ContainerExt`][trait@crate::prelude::ContainerExt], [`WidgetExt`][trait@crate::prelude::WidgetExt], [`trait@glib::ObjectExt`], [`BuildableExt`][trait@crate::prelude::BuildableExt], [`FontChooserExt`][trait@crate::prelude::FontChooserExt], [`DialogExtManual`][trait@crate::prelude::DialogExtManual], [`GtkWindowExtManual`][trait@crate::prelude::GtkWindowExtManual], [`ContainerExtManual`][trait@crate::prelude::ContainerExtManual], [`WidgetExtManual`][trait@crate::prelude::WidgetExtManual], [`BuildableExtManual`][trait@crate::prelude::BuildableExtManual]
27 #[doc(alias = "GtkFontChooserDialog")]
28 pub struct FontChooserDialog(Object<ffi::GtkFontChooserDialog, ffi::GtkFontChooserDialogClass>) @extends Dialog, Window, Bin, Container, Widget, @implements Buildable, FontChooser;
29
30 match fn {
31 type_ => || ffi::gtk_font_chooser_dialog_get_type(),
32 }
33}
34
35impl FontChooserDialog {
36 pub const NONE: Option<&'static FontChooserDialog> = None;
37
38 /// Creates a new [`FontChooserDialog`][crate::FontChooserDialog].
39 /// ## `title`
40 /// Title of the dialog, or [`None`]
41 /// ## `parent`
42 /// Transient parent of the dialog, or [`None`]
43 ///
44 /// # Returns
45 ///
46 /// a new [`FontChooserDialog`][crate::FontChooserDialog]
47 #[doc(alias = "gtk_font_chooser_dialog_new")]
48 pub fn new(title: Option<&str>, parent: Option<&impl IsA<Window>>) -> FontChooserDialog {
49 assert_initialized_main_thread!();
50 unsafe {
51 Widget::from_glib_none(ffi::gtk_font_chooser_dialog_new(
52 title.to_glib_none().0,
53 parent.map(|p| p.as_ref()).to_glib_none().0,
54 ))
55 .unsafe_cast()
56 }
57 }
58
59 // rustdoc-stripper-ignore-next
60 /// Creates a new builder-pattern struct instance to construct [`FontChooserDialog`] objects.
61 ///
62 /// This method returns an instance of [`FontChooserDialogBuilder`](crate::builders::FontChooserDialogBuilder) which can be used to create [`FontChooserDialog`] objects.
63 pub fn builder() -> FontChooserDialogBuilder {
64 FontChooserDialogBuilder::new()
65 }
66}
67
68impl Default for FontChooserDialog {
69 fn default() -> Self {
70 glib::object::Object::new::<Self>()
71 }
72}
73
74// rustdoc-stripper-ignore-next
75/// A [builder-pattern] type to construct [`FontChooserDialog`] objects.
76///
77/// [builder-pattern]: https://doc.rust-lang.org/1.0.0/style/ownership/builders.html
78#[must_use = "The builder must be built to be used"]
79pub struct FontChooserDialogBuilder {
80 builder: glib::object::ObjectBuilder<'static, FontChooserDialog>,
81}
82
83impl FontChooserDialogBuilder {
84 fn new() -> Self {
85 Self {
86 builder: glib::object::Object::builder(),
87 }
88 }
89
90 /// [`true`] if the dialog uses a [`HeaderBar`][crate::HeaderBar] for action buttons
91 /// instead of the action-area.
92 ///
93 /// For technical reasons, this property is declared as an integer
94 /// property, but you should only set it to [`true`] or [`false`].
95 pub fn use_header_bar(self, use_header_bar: i32) -> Self {
96 Self {
97 builder: self.builder.property("use-header-bar", use_header_bar),
98 }
99 }
100
101 /// Whether the window should receive the input focus.
102 pub fn accept_focus(self, accept_focus: bool) -> Self {
103 Self {
104 builder: self.builder.property("accept-focus", accept_focus),
105 }
106 }
107
108 /// The [`Application`][crate::Application] associated with the window.
109 ///
110 /// The application will be kept alive for at least as long as it
111 /// has any windows associated with it (see [`ApplicationExtManual::hold()`][crate::gio::prelude::ApplicationExtManual::hold()]
112 /// for a way to keep it alive without windows).
113 ///
114 /// Normally, the connection between the application and the window
115 /// will remain until the window is destroyed, but you can explicitly
116 /// remove it by setting the :application property to [`None`].
117 pub fn application(self, application: &impl IsA<Application>) -> Self {
118 Self {
119 builder: self
120 .builder
121 .property("application", application.clone().upcast()),
122 }
123 }
124
125 /// The widget to which this window is attached.
126 /// See [`GtkWindowExt::set_attached_to()`][crate::prelude::GtkWindowExt::set_attached_to()].
127 ///
128 /// Examples of places where specifying this relation is useful are
129 /// for instance a [`Menu`][crate::Menu] created by a [`ComboBox`][crate::ComboBox], a completion
130 /// popup window created by [`Entry`][crate::Entry] or a typeahead search entry
131 /// created by [`TreeView`][crate::TreeView].
132 pub fn attached_to(self, attached_to: &impl IsA<Widget>) -> Self {
133 Self {
134 builder: self
135 .builder
136 .property("attached-to", attached_to.clone().upcast()),
137 }
138 }
139
140 /// Whether the window should be decorated by the window manager.
141 pub fn decorated(self, decorated: bool) -> Self {
142 Self {
143 builder: self.builder.property("decorated", decorated),
144 }
145 }
146
147 pub fn default_height(self, default_height: i32) -> Self {
148 Self {
149 builder: self.builder.property("default-height", default_height),
150 }
151 }
152
153 pub fn default_width(self, default_width: i32) -> Self {
154 Self {
155 builder: self.builder.property("default-width", default_width),
156 }
157 }
158
159 /// Whether the window frame should have a close button.
160 pub fn deletable(self, deletable: bool) -> Self {
161 Self {
162 builder: self.builder.property("deletable", deletable),
163 }
164 }
165
166 pub fn destroy_with_parent(self, destroy_with_parent: bool) -> Self {
167 Self {
168 builder: self
169 .builder
170 .property("destroy-with-parent", destroy_with_parent),
171 }
172 }
173
174 /// Whether the window should receive the input focus when mapped.
175 pub fn focus_on_map(self, focus_on_map: bool) -> Self {
176 Self {
177 builder: self.builder.property("focus-on-map", focus_on_map),
178 }
179 }
180
181 /// Whether 'focus rectangles' are currently visible in this window.
182 ///
183 /// This property is maintained by GTK+ based on user input
184 /// and should not be set by applications.
185 pub fn focus_visible(self, focus_visible: bool) -> Self {
186 Self {
187 builder: self.builder.property("focus-visible", focus_visible),
188 }
189 }
190
191 /// The window gravity of the window. See [`GtkWindowExt::move_()`][crate::prelude::GtkWindowExt::move_()] and [`gdk::Gravity`][crate::gdk::Gravity] for
192 /// more details about window gravity.
193 pub fn gravity(self, gravity: gdk::Gravity) -> Self {
194 Self {
195 builder: self.builder.property("gravity", gravity),
196 }
197 }
198
199 /// Whether the titlebar should be hidden during maximization.
200 pub fn hide_titlebar_when_maximized(self, hide_titlebar_when_maximized: bool) -> Self {
201 Self {
202 builder: self
203 .builder
204 .property("hide-titlebar-when-maximized", hide_titlebar_when_maximized),
205 }
206 }
207
208 pub fn icon(self, icon: &gdk_pixbuf::Pixbuf) -> Self {
209 Self {
210 builder: self.builder.property("icon", icon.clone()),
211 }
212 }
213
214 /// The :icon-name property specifies the name of the themed icon to
215 /// use as the window icon. See [`IconTheme`][crate::IconTheme] for more details.
216 pub fn icon_name(self, icon_name: impl Into<glib::GString>) -> Self {
217 Self {
218 builder: self.builder.property("icon-name", icon_name.into()),
219 }
220 }
221
222 /// Whether mnemonics are currently visible in this window.
223 ///
224 /// This property is maintained by GTK+ based on user input,
225 /// and should not be set by applications.
226 pub fn mnemonics_visible(self, mnemonics_visible: bool) -> Self {
227 Self {
228 builder: self
229 .builder
230 .property("mnemonics-visible", mnemonics_visible),
231 }
232 }
233
234 pub fn modal(self, modal: bool) -> Self {
235 Self {
236 builder: self.builder.property("modal", modal),
237 }
238 }
239
240 pub fn resizable(self, resizable: bool) -> Self {
241 Self {
242 builder: self.builder.property("resizable", resizable),
243 }
244 }
245
246 pub fn role(self, role: impl Into<glib::GString>) -> Self {
247 Self {
248 builder: self.builder.property("role", role.into()),
249 }
250 }
251
252 pub fn screen(self, screen: &gdk::Screen) -> Self {
253 Self {
254 builder: self.builder.property("screen", screen.clone()),
255 }
256 }
257
258 pub fn skip_pager_hint(self, skip_pager_hint: bool) -> Self {
259 Self {
260 builder: self.builder.property("skip-pager-hint", skip_pager_hint),
261 }
262 }
263
264 pub fn skip_taskbar_hint(self, skip_taskbar_hint: bool) -> Self {
265 Self {
266 builder: self
267 .builder
268 .property("skip-taskbar-hint", skip_taskbar_hint),
269 }
270 }
271
272 /// The :startup-id is a write-only property for setting window's
273 /// startup notification identifier. See [`GtkWindowExt::set_startup_id()`][crate::prelude::GtkWindowExt::set_startup_id()]
274 /// for more details.
275 pub fn startup_id(self, startup_id: impl Into<glib::GString>) -> Self {
276 Self {
277 builder: self.builder.property("startup-id", startup_id.into()),
278 }
279 }
280
281 pub fn title(self, title: impl Into<glib::GString>) -> Self {
282 Self {
283 builder: self.builder.property("title", title.into()),
284 }
285 }
286
287 /// The transient parent of the window. See [`GtkWindowExt::set_transient_for()`][crate::prelude::GtkWindowExt::set_transient_for()] for
288 /// more details about transient windows.
289 pub fn transient_for(self, transient_for: &impl IsA<Window>) -> Self {
290 Self {
291 builder: self
292 .builder
293 .property("transient-for", transient_for.clone().upcast()),
294 }
295 }
296
297 pub fn type_(self, type_: WindowType) -> Self {
298 Self {
299 builder: self.builder.property("type", type_),
300 }
301 }
302
303 pub fn type_hint(self, type_hint: gdk::WindowTypeHint) -> Self {
304 Self {
305 builder: self.builder.property("type-hint", type_hint),
306 }
307 }
308
309 pub fn urgency_hint(self, urgency_hint: bool) -> Self {
310 Self {
311 builder: self.builder.property("urgency-hint", urgency_hint),
312 }
313 }
314
315 pub fn window_position(self, window_position: WindowPosition) -> Self {
316 Self {
317 builder: self.builder.property("window-position", window_position),
318 }
319 }
320
321 pub fn border_width(self, border_width: u32) -> Self {
322 Self {
323 builder: self.builder.property("border-width", border_width),
324 }
325 }
326
327 pub fn child(self, child: &impl IsA<Widget>) -> Self {
328 Self {
329 builder: self.builder.property("child", child.clone().upcast()),
330 }
331 }
332
333 pub fn resize_mode(self, resize_mode: ResizeMode) -> Self {
334 Self {
335 builder: self.builder.property("resize-mode", resize_mode),
336 }
337 }
338
339 pub fn app_paintable(self, app_paintable: bool) -> Self {
340 Self {
341 builder: self.builder.property("app-paintable", app_paintable),
342 }
343 }
344
345 pub fn can_default(self, can_default: bool) -> Self {
346 Self {
347 builder: self.builder.property("can-default", can_default),
348 }
349 }
350
351 pub fn can_focus(self, can_focus: bool) -> Self {
352 Self {
353 builder: self.builder.property("can-focus", can_focus),
354 }
355 }
356
357 pub fn events(self, events: gdk::EventMask) -> Self {
358 Self {
359 builder: self.builder.property("events", events),
360 }
361 }
362
363 /// Whether to expand in both directions. Setting this sets both [`hexpand`][struct@crate::Widget#hexpand] and [`vexpand`][struct@crate::Widget#vexpand]
364 pub fn expand(self, expand: bool) -> Self {
365 Self {
366 builder: self.builder.property("expand", expand),
367 }
368 }
369
370 /// Whether the widget should grab focus when it is clicked with the mouse.
371 ///
372 /// This property is only relevant for widgets that can take focus.
373 ///
374 /// Before 3.20, several widgets (GtkButton, GtkFileChooserButton,
375 /// GtkComboBox) implemented this property individually.
376 pub fn focus_on_click(self, focus_on_click: bool) -> Self {
377 Self {
378 builder: self.builder.property("focus-on-click", focus_on_click),
379 }
380 }
381
382 /// How to distribute horizontal space if widget gets extra space, see [`Align`][crate::Align]
383 pub fn halign(self, halign: Align) -> Self {
384 Self {
385 builder: self.builder.property("halign", halign),
386 }
387 }
388
389 pub fn has_default(self, has_default: bool) -> Self {
390 Self {
391 builder: self.builder.property("has-default", has_default),
392 }
393 }
394
395 pub fn has_focus(self, has_focus: bool) -> Self {
396 Self {
397 builder: self.builder.property("has-focus", has_focus),
398 }
399 }
400
401 /// Enables or disables the emission of [`query-tooltip`][struct@crate::Widget#query-tooltip] on `widget`.
402 /// A value of [`true`] indicates that `widget` can have a tooltip, in this case
403 /// the widget will be queried using [`query-tooltip`][struct@crate::Widget#query-tooltip] to determine
404 /// whether it will provide a tooltip or not.
405 ///
406 /// Note that setting this property to [`true`] for the first time will change
407 /// the event masks of the GdkWindows of this widget to include leave-notify
408 /// and motion-notify events. This cannot and will not be undone when the
409 /// property is set to [`false`] again.
410 pub fn has_tooltip(self, has_tooltip: bool) -> Self {
411 Self {
412 builder: self.builder.property("has-tooltip", has_tooltip),
413 }
414 }
415
416 pub fn height_request(self, height_request: i32) -> Self {
417 Self {
418 builder: self.builder.property("height-request", height_request),
419 }
420 }
421
422 /// Whether to expand horizontally. See [`WidgetExt::set_hexpand()`][crate::prelude::WidgetExt::set_hexpand()].
423 pub fn hexpand(self, hexpand: bool) -> Self {
424 Self {
425 builder: self.builder.property("hexpand", hexpand),
426 }
427 }
428
429 /// Whether to use the [`hexpand`][struct@crate::Widget#hexpand] property. See [`WidgetExt::is_hexpand_set()`][crate::prelude::WidgetExt::is_hexpand_set()].
430 pub fn hexpand_set(self, hexpand_set: bool) -> Self {
431 Self {
432 builder: self.builder.property("hexpand-set", hexpand_set),
433 }
434 }
435
436 pub fn is_focus(self, is_focus: bool) -> Self {
437 Self {
438 builder: self.builder.property("is-focus", is_focus),
439 }
440 }
441
442 /// Sets all four sides' margin at once. If read, returns max
443 /// margin on any side.
444 pub fn margin(self, margin: i32) -> Self {
445 Self {
446 builder: self.builder.property("margin", margin),
447 }
448 }
449
450 /// Margin on bottom side of widget.
451 ///
452 /// This property adds margin outside of the widget's normal size
453 /// request, the margin will be added in addition to the size from
454 /// [`WidgetExt::set_size_request()`][crate::prelude::WidgetExt::set_size_request()] for example.
455 pub fn margin_bottom(self, margin_bottom: i32) -> Self {
456 Self {
457 builder: self.builder.property("margin-bottom", margin_bottom),
458 }
459 }
460
461 /// Margin on end of widget, horizontally. This property supports
462 /// left-to-right and right-to-left text directions.
463 ///
464 /// This property adds margin outside of the widget's normal size
465 /// request, the margin will be added in addition to the size from
466 /// [`WidgetExt::set_size_request()`][crate::prelude::WidgetExt::set_size_request()] for example.
467 pub fn margin_end(self, margin_end: i32) -> Self {
468 Self {
469 builder: self.builder.property("margin-end", margin_end),
470 }
471 }
472
473 /// Margin on start of widget, horizontally. This property supports
474 /// left-to-right and right-to-left text directions.
475 ///
476 /// This property adds margin outside of the widget's normal size
477 /// request, the margin will be added in addition to the size from
478 /// [`WidgetExt::set_size_request()`][crate::prelude::WidgetExt::set_size_request()] for example.
479 pub fn margin_start(self, margin_start: i32) -> Self {
480 Self {
481 builder: self.builder.property("margin-start", margin_start),
482 }
483 }
484
485 /// Margin on top side of widget.
486 ///
487 /// This property adds margin outside of the widget's normal size
488 /// request, the margin will be added in addition to the size from
489 /// [`WidgetExt::set_size_request()`][crate::prelude::WidgetExt::set_size_request()] for example.
490 pub fn margin_top(self, margin_top: i32) -> Self {
491 Self {
492 builder: self.builder.property("margin-top", margin_top),
493 }
494 }
495
496 pub fn name(self, name: impl Into<glib::GString>) -> Self {
497 Self {
498 builder: self.builder.property("name", name.into()),
499 }
500 }
501
502 pub fn no_show_all(self, no_show_all: bool) -> Self {
503 Self {
504 builder: self.builder.property("no-show-all", no_show_all),
505 }
506 }
507
508 /// The requested opacity of the widget. See [`WidgetExt::set_opacity()`][crate::prelude::WidgetExt::set_opacity()] for
509 /// more details about window opacity.
510 ///
511 /// Before 3.8 this was only available in GtkWindow
512 pub fn opacity(self, opacity: f64) -> Self {
513 Self {
514 builder: self.builder.property("opacity", opacity),
515 }
516 }
517
518 pub fn parent(self, parent: &impl IsA<Container>) -> Self {
519 Self {
520 builder: self.builder.property("parent", parent.clone().upcast()),
521 }
522 }
523
524 pub fn receives_default(self, receives_default: bool) -> Self {
525 Self {
526 builder: self.builder.property("receives-default", receives_default),
527 }
528 }
529
530 pub fn sensitive(self, sensitive: bool) -> Self {
531 Self {
532 builder: self.builder.property("sensitive", sensitive),
533 }
534 }
535
536 /// Sets the text of tooltip to be the given string, which is marked up
537 /// with the [Pango text markup language][PangoMarkupFormat].
538 /// Also see [`Tooltip::set_markup()`][crate::Tooltip::set_markup()].
539 ///
540 /// This is a convenience property which will take care of getting the
541 /// tooltip shown if the given string is not [`None`]: [`has-tooltip`][struct@crate::Widget#has-tooltip]
542 /// will automatically be set to [`true`] and there will be taken care of
543 /// [`query-tooltip`][struct@crate::Widget#query-tooltip] in the default signal handler.
544 ///
545 /// Note that if both [`tooltip-text`][struct@crate::Widget#tooltip-text] and [`tooltip-markup`][struct@crate::Widget#tooltip-markup]
546 /// are set, the last one wins.
547 pub fn tooltip_markup(self, tooltip_markup: impl Into<glib::GString>) -> Self {
548 Self {
549 builder: self
550 .builder
551 .property("tooltip-markup", tooltip_markup.into()),
552 }
553 }
554
555 /// Sets the text of tooltip to be the given string.
556 ///
557 /// Also see [`Tooltip::set_text()`][crate::Tooltip::set_text()].
558 ///
559 /// This is a convenience property which will take care of getting the
560 /// tooltip shown if the given string is not [`None`]: [`has-tooltip`][struct@crate::Widget#has-tooltip]
561 /// will automatically be set to [`true`] and there will be taken care of
562 /// [`query-tooltip`][struct@crate::Widget#query-tooltip] in the default signal handler.
563 ///
564 /// Note that if both [`tooltip-text`][struct@crate::Widget#tooltip-text] and [`tooltip-markup`][struct@crate::Widget#tooltip-markup]
565 /// are set, the last one wins.
566 pub fn tooltip_text(self, tooltip_text: impl Into<glib::GString>) -> Self {
567 Self {
568 builder: self.builder.property("tooltip-text", tooltip_text.into()),
569 }
570 }
571
572 /// How to distribute vertical space if widget gets extra space, see [`Align`][crate::Align]
573 pub fn valign(self, valign: Align) -> Self {
574 Self {
575 builder: self.builder.property("valign", valign),
576 }
577 }
578
579 /// Whether to expand vertically. See [`WidgetExt::set_vexpand()`][crate::prelude::WidgetExt::set_vexpand()].
580 pub fn vexpand(self, vexpand: bool) -> Self {
581 Self {
582 builder: self.builder.property("vexpand", vexpand),
583 }
584 }
585
586 /// Whether to use the [`vexpand`][struct@crate::Widget#vexpand] property. See [`WidgetExt::is_vexpand_set()`][crate::prelude::WidgetExt::is_vexpand_set()].
587 pub fn vexpand_set(self, vexpand_set: bool) -> Self {
588 Self {
589 builder: self.builder.property("vexpand-set", vexpand_set),
590 }
591 }
592
593 pub fn visible(self, visible: bool) -> Self {
594 Self {
595 builder: self.builder.property("visible", visible),
596 }
597 }
598
599 pub fn width_request(self, width_request: i32) -> Self {
600 Self {
601 builder: self.builder.property("width-request", width_request),
602 }
603 }
604
605 /// The font description as a string, e.g. "Sans Italic 12".
606 pub fn font(self, font: impl Into<glib::GString>) -> Self {
607 Self {
608 builder: self.builder.property("font", font.into()),
609 }
610 }
611
612 /// The font description as a [`pango::FontDescription`][crate::pango::FontDescription].
613 pub fn font_desc(self, font_desc: &pango::FontDescription) -> Self {
614 Self {
615 builder: self.builder.property("font-desc", font_desc),
616 }
617 }
618
619 /// The language for which the [`font-features`][struct@crate::FontChooser#font-features] were
620 /// selected, in a format that is compatible with CSS and with Pango
621 /// attributes.
622 #[cfg(feature = "v3_24")]
623 #[cfg_attr(docsrs, doc(cfg(feature = "v3_24")))]
624 pub fn language(self, language: impl Into<glib::GString>) -> Self {
625 Self {
626 builder: self.builder.property("language", language.into()),
627 }
628 }
629
630 /// The level of granularity to offer for selecting fonts.
631 #[cfg(feature = "v3_24")]
632 #[cfg_attr(docsrs, doc(cfg(feature = "v3_24")))]
633 pub fn level(self, level: FontChooserLevel) -> Self {
634 Self {
635 builder: self.builder.property("level", level),
636 }
637 }
638
639 /// The string with which to preview the font.
640 pub fn preview_text(self, preview_text: impl Into<glib::GString>) -> Self {
641 Self {
642 builder: self.builder.property("preview-text", preview_text.into()),
643 }
644 }
645
646 /// Whether to show an entry to change the preview text.
647 pub fn show_preview_entry(self, show_preview_entry: bool) -> Self {
648 Self {
649 builder: self
650 .builder
651 .property("show-preview-entry", show_preview_entry),
652 }
653 }
654
655 // rustdoc-stripper-ignore-next
656 /// Build the [`FontChooserDialog`].
657 #[must_use = "Building the object from the builder is usually expensive and is not expected to have side effects"]
658 pub fn build(self) -> FontChooserDialog {
659 assert_initialized_main_thread!();
660 self.builder.build()
661 }
662}