#include #ifndef WX_PRECOMP #include #endif #include #include #include #include "MainFrame.hpp" #include "GUI.hpp" #include "misc_ui.hpp" #include "Preset.hpp" // Logging mechanism #include "Log.hpp" namespace Slic3r { namespace GUI { /// Primary initialization and point of entry into the GUI application. /// Calls MainFrame and handles preset loading, etc. bool App::OnInit() { this->SetAppName("Slic3r"); // TODO: Call a logging function with channel GUI, severity info this->notifier = std::unique_ptr(); datadir = decode_path(wxStandardPaths::Get().GetUserDataDir()); wxString enc_datadir = encode_path(datadir); const wxString& slic3r_ini {datadir + "/slic3r.ini"}; const wxString& print_ini {datadir + "/print"}; const wxString& printer_ini {datadir + "/printer"}; const wxString& material_ini {datadir + "/filament"}; // if we don't have a datadir or a slic3r.ini, prompt for wizard. bool run_wizard = (wxDirExists(datadir) && wxFileExists(slic3r_ini)); /* Check to make sure if datadir exists */ for (auto& dir : std::vector { enc_datadir, print_ini, printer_ini, material_ini }) { if (wxDirExists(dir)) continue; if (!wxMkdir(dir)) { Slic3r::Log::fatal_error(LogChannel, (_("Slic3r was unable to create its data directory at ")+ dir).ToStdWstring()); } } // TODO: Call a logging function with channel GUI, severity info for datadir path Slic3r::Log::info(LogChannel, (_("Data dir: ") + datadir).ToStdWstring()); // Load gui settings from slic3r.ini if (wxFileExists(slic3r_ini)) { /* my $ini = eval { Slic3r::Config->read_ini("$datadir/slic3r.ini") }; if ($ini) { $last_version = $ini->{_}{version}; $ini->{_}{$_} = $Settings->{_}{$_} for grep !exists $ini->{_}{$_}, keys %{$Settings->{_}}; $Settings = $ini; } delete $Settings->{_}{mode}; # handle legacy */ } this->gui_config->save_settings(); // Load presets this->load_presets(); wxImage::AddHandler(new wxPNGHandler()); MainFrame *frame = new MainFrame( "Slic3r", wxDefaultPosition, wxDefaultSize, this->gui_config); this->SetTopWindow(frame); // Load init bundle // // Run the wizard if we don't have an initial config /* $self->check_version if $self->have_version_check && ($Settings->{_}{version_check} // 1) && (!$Settings->{_}{last_version_check} || (time - $Settings->{_}{last_version_check}) >= 86400); */ // run callback functions during idle on the main frame /* EVT_IDLE($frame, sub { while (my $cb = shift @cb) { $cb->(); } }); */ // Handle custom version check event /* EVT_COMMAND($self, -1, $VERSION_CHECK_EVENT, sub { my ($self, $event) = @_; my ($success, $response, $manual_check) = @{$event->GetData}; if ($success) { if ($response =~ /^obsolete ?= ?([a-z0-9.-]+,)*\Q$Slic3r::VERSION\E(?:,|$)/) { my $res = Wx::MessageDialog->new(undef, "A new version is available. Do you want to open the Slic3r website now?", 'Update', wxYES_NO | wxCANCEL | wxYES_DEFAULT | wxICON_INFORMATION | wxICON_ERROR)->ShowModal; Wx::LaunchDefaultBrowser('http://slic3r.org/') if $res == wxID_YES; } else { Slic3r::GUI::show_info(undef, "You're using the latest version. No updates are available.") if $manual_check; } $Settings->{_}{last_version_check} = time(); $self->save_settings; } else { Slic3r::GUI::show_error(undef, "Failed to check for updates. Try later.") if $manual_check; } }); */ return true; } void App::save_window_pos(const wxTopLevelWindow* window, const wxString& name ) { this->gui_config->window_pos[name] = std::make_tuple( window->GetScreenPosition(), window->GetSize(), window->IsMaximized()); this->gui_config->save_settings(); } void App::restore_window_pos(wxTopLevelWindow* window, const wxString& name ) { try { auto tmp = gui_config->window_pos[name]; const auto& size = std::get<1>(tmp); const auto& pos = std::get<0>(tmp); window->SetSize(size); auto display = wxDisplay().GetClientArea(); if (((pos.x + size.x / 2) < display.GetRight()) && (pos.y + size.y/2 < display.GetBottom())) window->Move(pos); window->Maximize(std::get<2>(tmp)); } catch (std::out_of_range e) { // config was empty } } void App::load_presets() { /* for my $group (qw(printer filament print)) { my $presets = $self->{presets}{$group}; # keep external or dirty presets @$presets = grep { ($_->external && $_->file_exists) || $_->dirty } @$presets; my $dir = "$Slic3r::GUI::datadir/$group"; opendir my $dh, Slic3r::encode_path($dir) or die "Failed to read directory $dir (errno: $!)\n"; foreach my $file (grep /\.ini$/i, readdir $dh) { $file = Slic3r::decode_path($file); my $name = basename($file); $name =~ s/\.ini$//i; # skip if we already have it next if any { $_->name eq $name } @$presets; push @$presets, Slic3r::GUI::Preset->new( group => $group, name => $name, file => "$dir/$file", ); } closedir $dh; @$presets = sort { $a->name cmp $b->name } @$presets; unshift @$presets, Slic3r::GUI::Preset->new( group => $group, default => 1, name => '- default -', ); } */ } }} // namespace Slic3r::GUI