xtd 0.2.0
test_forms.cpp

tests forms control

Windows
test_forms_w.png

test_forms_wd.png
macOS
test_forms_m.png

test_forms_md.png
Gnome
test_forms_g.png

test_forms_gd.png
#include <xtd/diagnostics/process>
#include <xtd/forms/application>
#include <xtd/forms/form>
#include <xtd/forms/text_box>
#include <xtd/environment>
#include <xtd/startup>
class virtual_console : public xtd::forms::text_box {
public:
virtual_console() {
multiline(true);
text(prompt);
select(text().size() - 1, 0);
}
protected:
xtd::drawing::size default_size() const noexcept override {return {300, 200};}
switch (e.key_code()) {
case xtd::forms::keys::down: key_down_pressed(e); break;
case xtd::forms::keys::up: key_up_pressed(e); break;
case xtd::forms::keys::enter: key_enter_pressed(e); break;
default: break;
}
}
private:
xtd::ustring get_command() const {
auto pos = text().last_index_of(prompt);
if (pos != xtd::ustring::npos) {
pos += prompt.size();
return text().substring(pos);
}
return "";
}
void key_down_pressed(xtd::forms::key_event_args& e) {
e.handled(true);
}
void key_up_pressed(xtd::forms::key_event_args& e) {
e.handled(true);
}
void key_enter_pressed(xtd::forms::key_event_args& e) {
auto command_line = get_command();
if (!command_line.empty()) {
try {
auto args = command_line.split({' '});
start_info.file_name(args[0]);
if (args.size() > 1)
start_info.arguments(xtd::ustring::join(" ", std::vector<xtd::ustring>(args.begin() + 1, args.end())));
start_info.use_shell_execute(false);
start_info.redirect_standard_error(true);
start_info.redirect_standard_output(true);
if (start_info.file_name() == "cd" && !start_info.arguments().empty()) {
} else {
append_text(xtd::ustring::format("cd: no such file or directory: {}", start_info.arguments()));
}
} else {
process.start_info(start_info);
process.start();
std::istream& standard_error = process.standard_error();
std::istream& standard_output = process.standard_output();
xtd::io::stream_reader error_reader(standard_error);
while (!error_reader.end_of_stream()) {
append_text(error_reader.read_line());
}
xtd::io::stream_reader output_reader(standard_output);
while (!output_reader.end_of_stream()) {
append_text(output_reader.read_line());
}
}
} catch (...) {
append_text(xtd::ustring::format("command not found: {}", start_info.file_name()));
}
}
append_text(prompt);
e.handled(true);
}
std::vector<xtd::ustring> commands;
};
using namespace xtd;
using namespace xtd::windows::forms;
class form_main : public form {
public:
static auto main() {
application::run(form_main());
}
form_main() {
text("Virtual console");
client_size({600, 600});
virtual_console.dock(dock_style::fill);
virtual_console.parent(*this);
}
private:
class virtual_console virtual_console;
};
startup_(form_main::main);