1use ppt_rs::{
11 create_pptx_with_content, SlideContent, SlideLayout,
12 ChartType,
13 Connector, ArrowType, ConnectionSite,
14 Hyperlink,
15 GradientFill, GradientDirection, PresetGradients,
16 Video, VideoOptions,
17 Audio, AudioOptions,
18};
19use ppt_rs::generator::shapes::inches_to_emu;
20
21fn main() -> Result<(), Box<dyn std::error::Error>> {
22 println!("=== New PPT Elements Demo ===\n");
23
24 let slides = vec![
26 SlideContent::new("New PPT Elements in ppt-rs")
28 .add_bullet("18 new chart types")
29 .add_bullet("Connectors between shapes")
30 .add_bullet("Hyperlinks (URL, slide, email)")
31 .add_bullet("Gradient fills")
32 .add_bullet("Video/Audio embedding")
33 .layout(SlideLayout::TitleAndContent),
34
35 SlideContent::new("New Chart Types")
37 .add_bullet("Area charts (standard, stacked, 100% stacked)")
38 .add_bullet("Scatter charts (markers, lines, smooth)")
39 .add_bullet("Doughnut charts")
40 .add_bullet("Radar charts (standard, filled)")
41 .add_bullet("Bubble charts")
42 .add_bullet("Stock charts (HLC, OHLC)")
43 .add_bullet("Combo charts (bar + line)")
44 .layout(SlideLayout::TitleAndContent),
45
46 SlideContent::new("Connector Types")
48 .add_bullet("Straight connectors")
49 .add_bullet("Elbow (bent) connectors")
50 .add_bullet("Curved connectors")
51 .add_bullet("Arrow heads (Triangle, Stealth, Diamond, Oval)")
52 .add_bullet("Connection sites (Top, Bottom, Left, Right, Corners)")
53 .layout(SlideLayout::TitleAndContent),
54
55 SlideContent::new("Hyperlink Support")
57 .add_bullet("URL links (external websites)")
58 .add_bullet("Slide links (navigate within presentation)")
59 .add_bullet("Email links (mailto:)")
60 .add_bullet("File links (local files)")
61 .add_bullet("Navigation (First, Last, Next, Previous slide)")
62 .layout(SlideLayout::TitleAndContent),
63
64 SlideContent::new("Gradient Fill Support")
66 .add_bullet("Linear gradients (horizontal, vertical, diagonal)")
67 .add_bullet("Radial gradients")
68 .add_bullet("Rectangular gradients")
69 .add_bullet("Path gradients")
70 .add_bullet("Preset gradients (Blue, Green, Rainbow, etc.)")
71 .add_bullet("Custom gradient stops with transparency")
72 .layout(SlideLayout::TitleAndContent),
73
74 SlideContent::new("Video & Audio Support")
76 .add_bullet("Video formats: MP4, WMV, AVI, MOV, MKV, WebM")
77 .add_bullet("Audio formats: MP3, WAV, WMA, M4A, OGG, FLAC")
78 .add_bullet("Playback options: auto-play, loop, mute")
79 .add_bullet("Volume control")
80 .add_bullet("Start/end time trimming")
81 .layout(SlideLayout::TitleAndContent),
82 ];
83
84 let pptx_data = create_pptx_with_content("New Elements Demo", slides)?;
86
87 let output_path = "examples/output/new_elements_demo.pptx";
89 std::fs::create_dir_all("examples/output")?;
90 std::fs::write(output_path, &pptx_data)?;
91
92 println!("✓ Created presentation: {}", output_path);
93 println!("✓ File size: {} bytes", pptx_data.len());
94
95 println!("\n=== API Examples ===\n");
97
98 println!("Chart Types:");
100 let chart_types = [
101 ChartType::Bar,
102 ChartType::BarHorizontal,
103 ChartType::BarStacked,
104 ChartType::Line,
105 ChartType::LineMarkers,
106 ChartType::Pie,
107 ChartType::Doughnut,
108 ChartType::Area,
109 ChartType::AreaStacked,
110 ChartType::Scatter,
111 ChartType::ScatterSmooth,
112 ChartType::Bubble,
113 ChartType::Radar,
114 ChartType::RadarFilled,
115 ChartType::StockHLC,
116 ChartType::Combo,
117 ];
118 for ct in &chart_types {
119 println!(" - {:?} -> {}", ct, ct.xml_element());
120 }
121
122 println!("\nConnector Example:");
124 let connector = Connector::elbow(
125 inches_to_emu(1.0), inches_to_emu(1.0),
126 inches_to_emu(5.0), inches_to_emu(3.0),
127 )
128 .with_color("0066CC")
129 .with_end_arrow(ArrowType::Triangle)
130 .connect_start(1, ConnectionSite::Right)
131 .connect_end(2, ConnectionSite::Left);
132 println!(" Type: {:?}", connector.connector_type);
133 println!(" End Arrow: {:?}", connector.end_arrow);
134
135 println!("\nHyperlink Examples:");
137 let url_link = Hyperlink::url("https://example.com").with_tooltip("Visit Example");
138 let slide_link = Hyperlink::slide(3);
139 let email_link = Hyperlink::email("test@example.com");
140 println!(" URL: {:?}", url_link.action);
141 println!(" Slide: {:?}", slide_link.action);
142 println!(" Email: {:?}", email_link.action);
143
144 println!("\nGradient Examples:");
146 let blue_gradient = PresetGradients::blue();
147 let rainbow = PresetGradients::rainbow();
148 let custom = GradientFill::linear(GradientDirection::DiagonalDown)
149 .add_stop(ppt_rs::GradientStop::start("FF0000"))
150 .add_stop(ppt_rs::GradientStop::end("0000FF"));
151 println!(" Blue gradient: {} stops", blue_gradient.stops.len());
152 println!(" Rainbow gradient: {} stops", rainbow.stops.len());
153 println!(" Custom gradient: {} stops", custom.stops.len());
154
155 println!("\nVideo Example:");
157 if let Some(video) = Video::from_file("video.mp4", 0, 0, inches_to_emu(6.0), inches_to_emu(4.0)) {
158 let video = video.with_options(VideoOptions::auto_play().with_loop(true));
159 println!(" Format: {:?}", video.format);
160 println!(" Auto-play: {}", video.options.auto_play);
161 println!(" Loop: {}", video.options.loop_playback);
162 }
163
164 println!("\nAudio Example:");
166 if let Some(audio) = Audio::from_file("audio.mp3", 0, 0, inches_to_emu(1.0), inches_to_emu(1.0)) {
167 let audio = audio.with_options(AudioOptions::auto_play().with_play_across_slides(true));
168 println!(" Format: {:?}", audio.format);
169 println!(" Auto-play: {}", audio.options.auto_play);
170 println!(" Play across slides: {}", audio.options.play_across_slides);
171 }
172
173 println!("\n=== Demo Complete ===");
174
175 Ok(())
176}