diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ee67ee8e0..0bdf4397a 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required (VERSION 2.8) +cmake_minimum_required (VERSION 3.10) project (slic3r) # only on newer GCCs: -ftemplate-backtrace-limit=0 @@ -17,14 +17,17 @@ IF(CMAKE_HOST_APPLE) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++ -DBOOST_THREAD_DONT_USE_CHRONO -DBOOST_NO_CXX11_RVALUE_REFERENCES -DBOOST_THREAD_USES_MOVE") set(CMAKE_EXE_LINKER_FLAGS "-framework IOKit -framework CoreFoundation -lc++") ELSE(CMAKE_HOST_APPLE) - set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++") +# set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++ -L.") ENDIF(CMAKE_HOST_APPLE) -set(Boost_USE_STATIC_LIBS ON) -set(Boost_USE_STATIC_RUNTIME ON) -set(CMAKE_FIND_LIBRARY_SUFFIXES ".a") + +set(Boost_USE_STATIC_LIBS OFF) +set(Boost_USE_STATIC_RUNTIME OFF) +find_package(Threads REQUIRED) + find_package(Boost COMPONENTS system thread filesystem) set(LIBDIR ${CMAKE_CURRENT_SOURCE_DIR}/../xs/src/) +set(GUI_LIBDIR ${CMAKE_CURRENT_SOURCE_DIR}/GUI/) include_directories(${LIBDIR}) include_directories(${LIBDIR}/libslic3r) @@ -123,29 +126,29 @@ add_library(poly2tri STATIC ) add_executable(slic3r slic3r.cpp) -set_target_properties(slic3r PROPERTIES LINK_SEARCH_START_STATIC 1) -set_target_properties(slic3r PROPERTIES LINK_SEARCH_END_STATIC 1) +#set_target_properties(slic3r PROPERTIES LINK_SEARCH_START_STATIC 1) +#set_target_properties(slic3r PROPERTIES LINK_SEARCH_END_STATIC 1) -add_executable(extrude-tin utils/extrude-tin.cpp) -set_target_properties(extrude-tin PROPERTIES LINK_SEARCH_START_STATIC 1) -set_target_properties(extrude-tin PROPERTIES LINK_SEARCH_END_STATIC 1) +#add_executable(extrude-tin utils/extrude-tin.cpp) +#set_target_properties(extrude-tin PROPERTIES LINK_SEARCH_START_STATIC 1) +#set_target_properties(extrude-tin PROPERTIES LINK_SEARCH_END_STATIC 1) -set(wxWidgets_USE_STATIC) -SET(wxWidgets_USE_LIBS) +set(Boost_USE_STATIC_LIBS OFF) +set(Boost_USE_STATIC_RUNTIME OFF) -set(Boost_USE_STATIC_LIBS ON) -set(Boost_USE_STATIC_RUNTIME ON) -set(CMAKE_FIND_LIBRARY_SUFFIXES ".a") find_library(bsystem_l boost_system) -add_library(bsystem STATIC IMPORTED) +add_library(bsystem SHARED IMPORTED) set_target_properties(bsystem PROPERTIES IMPORTED_LOCATION ${bsystem_l}) find_library(bthread_l boost_thread) -add_library(bthread STATIC IMPORTED) +add_library(bthread SHARED IMPORTED) set_target_properties(bthread PROPERTIES IMPORTED_LOCATION ${bthread_l}) include_directories(${Boost_INCLUDE_DIRS}) -#find_package(wxWidgets) -#disable wx for the time being - we're not building any of the gui yet +set(wxWidgets_USE_STATIC OFF) +set(wxWidgets_USE_UNICODE ON) + +find_package(wxWidgets COMPONENTS base aui core) + IF(CMAKE_HOST_UNIX) #set(Boost_LIBRARIES bsystem bthread bfilesystem) ENDIF(CMAKE_HOST_UNIX) @@ -155,9 +158,15 @@ target_link_libraries (slic3r libslic3r admesh BSpline clipper expat polypartiti IF(wxWidgets_FOUND) MESSAGE("wx found!") INCLUDE("${wxWidgets_USE_FILE}") - add_library(slic3r_gui STATIC ${LIBDIR}/slic3r/GUI/3DScene.cpp ${LIBDIR}/slic3r/GUI/GUI.cpp) + include_directories(${GUI_LIBDIR}) + include_directories(${wxWidgets_INCLUDE}) + + add_library(slic3r_gui STATIC + ${GUI_LIBDIR}/MainFrame.cpp + ${GUI_LIBDIR}/GUI.cpp + ) #only build GUI lib if building with wx - target_link_libraries (slic3r slic3r-gui ${wxWidgets_LIBRARIES}) + target_link_libraries (slic3r slic3r_gui ${wxWidgets_LIBRARIES}) ELSE(wxWidgets_FOUND) # For convenience. When we cannot continue, inform the user MESSAGE("wx not found!") @@ -170,8 +179,8 @@ IF (WIN32) ${LIBDIR}/boost/nowide/iostream.cpp ) - target_link_libraries(slic3r boost-nowide) - target_link_libraries(extrude-tin boost-nowide) + target_link_libraries(slic3r STATIC boost-nowide) +# target_link_libraries(extrude-tin boost-nowide) ENDIF(WIN32) -target_link_libraries (extrude-tin libslic3r admesh BSpline clipper expat polypartition poly2tri ${Boost_LIBRARIES}) +#target_link_libraries (extrude-tin libslic3r admesh BSpline clipper expat polypartition poly2tri ${Boost_LIBRARIES}) diff --git a/src/GUI/GUI.cpp b/src/GUI/GUI.cpp new file mode 100644 index 000000000..3c669754f --- /dev/null +++ b/src/GUI/GUI.cpp @@ -0,0 +1,22 @@ +#include +#ifndef WX_PRECOMP + #include +#endif + +#include "MainFrame.hpp" +#include "GUI.hpp" +//using namespace Slic3r; + + +enum +{ + ID_Hello = 1 +}; +bool Slic3rGUI::OnInit() +{ + MainFrame *frame = new MainFrame( "Slic3r", wxDefaultPosition, wxDefaultSize); + + frame->Show( true ); + return true; +} + diff --git a/src/GUI/GUI.hpp b/src/GUI/GUI.hpp new file mode 100644 index 000000000..d287c9a9b --- /dev/null +++ b/src/GUI/GUI.hpp @@ -0,0 +1,10 @@ +#ifndef GUI_HPP +#define GUI_HPP +#include "MainFrame.hpp" +class Slic3rGUI: public wxApp +{ +public: + virtual bool OnInit(); +}; + +#endif // GUI_HPP diff --git a/src/GUI/MainFrame.cpp b/src/GUI/MainFrame.cpp new file mode 100644 index 000000000..d21d2767e --- /dev/null +++ b/src/GUI/MainFrame.cpp @@ -0,0 +1,90 @@ +#include "MainFrame.hpp" + +wxBEGIN_EVENT_TABLE(MainFrame, wxFrame) +wxEND_EVENT_TABLE() + +MainFrame::MainFrame(const wxString& title, const wxPoint& pos, const wxSize& size) + : wxFrame(NULL, wxID_ANY, title, pos, size), loaded(false), + tabpanel(NULL) +{ + // Set icon to either the .ico if windows or png for everything else. + + this->init_tabpanel(); + this->init_menubar(); + + wxToolTip::SetAutoPop(TOOLTIP_TIMER); + + // STUB: Initialize status bar with text. + /* # initialize status bar + $self->{statusbar} = Slic3r::GUI::ProgressStatusBar->new($self, -1); + $self->{statusbar}->SetStatusText("Version $Slic3r::VERSION - Remember to check for updates at http://slic3r.org/"); + $self->SetStatusBar($self->{statusbar}); */ + + this->loaded = 1; + + // Initialize layout + { + wxSizer* sizer = new wxBoxSizer(wxVERTICAL); + sizer->Add(this->tabpanel, 1, wxEXPAND); + sizer->SetSizeHints(this); + this->Fit(); + this->SetMinSize(wxSize(760, 490)); + this->SetSize(this->GetMinSize()); + wxTheApp->SetTopWindow(this); + this->Show(); + this->Layout(); + } + +} + +/// Private initialization function for the main frame tab panel. +void MainFrame::init_tabpanel() +{ + this->tabpanel = new wxAuiNotebook(this, -1, wxDefaultPosition, wxDefaultSize, wxAUI_NB_TOP); + auto panel = this->tabpanel; + + panel->Bind(wxEVT_AUINOTEBOOK_PAGE_CHANGED, ([=](wxAuiNotebookEvent& e) + { + auto panel = this->tabpanel->GetPage(this->tabpanel->GetSelection()); + if panel->can('OnActivate') panel->OnActivate(); + }), panel->GetId()); + +// this->plater = Slic3r::GUI::Plater(panel, _("Plater")); +// this->controller = Slic3r::GUI::Controller(panel, _("Controller")); + +/* +sub _init_tabpanel { + my ($self) = @_; + + $self->{tabpanel} = my $panel = Wx::AuiNotebook->new($self, -1, wxDefaultPosition, wxDefaultSize, wxAUI_NB_TOP); + EVT_AUINOTEBOOK_PAGE_CHANGED($self, $self->{tabpanel}, sub { + my $panel = $self->{tabpanel}->GetPage($self->{tabpanel}->GetSelection); + $panel->OnActivate if $panel->can('OnActivate'); + if ($self->{tabpanel}->GetSelection > 1) { + $self->{tabpanel}->SetWindowStyle($self->{tabpanel}->GetWindowStyleFlag | wxAUI_NB_CLOSE_ON_ACTIVE_TAB); + } elsif(($Slic3r::GUI::Settings->{_}{show_host} == 0) && ($self->{tabpanel}->GetSelection == 1)){ + $self->{tabpanel}->SetWindowStyle($self->{tabpanel}->GetWindowStyleFlag | wxAUI_NB_CLOSE_ON_ACTIVE_TAB); + } else { + $self->{tabpanel}->SetWindowStyle($self->{tabpanel}->GetWindowStyleFlag & ~wxAUI_NB_CLOSE_ON_ACTIVE_TAB); + } + }); + EVT_AUINOTEBOOK_PAGE_CLOSE($self, $self->{tabpanel}, sub { + my $panel = $self->{tabpanel}->GetPage($self->{tabpanel}->GetSelection); + if ($panel->isa('Slic3r::GUI::PresetEditor')) { + delete $self->{preset_editor_tabs}{$panel->name}; + } + wxTheApp->CallAfter(sub { + $self->{tabpanel}->SetSelection(0); + }); + }); + + $panel->AddPage($self->{plater} = Slic3r::GUI::Plater->new($panel), "Plater"); + $panel->AddPage($self->{controller} = Slic3r::GUI::Controller->new($panel), "Controller") + if ($Slic3r::GUI::Settings->{_}{show_host}); +*/ + +} + +void MainFrame::init_menubar() +{ +} diff --git a/src/GUI/MainFrame.hpp b/src/GUI/MainFrame.hpp new file mode 100644 index 000000000..a1b32feb8 --- /dev/null +++ b/src/GUI/MainFrame.hpp @@ -0,0 +1,31 @@ + +#ifndef MAINFRAME_HPP +#define MAINFRAME_HPP +#include +#ifndef WX_PRECOMP + #include +#endif +#include +#include + +constexpr unsigned int TOOLTIP_TIMER = 32767; + +class MainFrame: public wxFrame +{ +public: + MainFrame(const wxString& title, const wxPoint& pos, const wxSize& size); +private: + wxDECLARE_EVENT_TABLE(); + + void init_menubar(); //< Routine to intialize all top-level menu items. + void init_tabpanel(); //< Routine to initialize all of the tabs. + + bool loaded; //< Main frame itself has finished loading. + // STUB: preset editor tabs storage + // STUB: Statusbar reference + + wxAuiNotebook* tabpanel; + +}; + +#endif // MAINFRAME_HPP diff --git a/src/slic3r.cpp b/src/slic3r.cpp index bf2fb2be7..558d3f810 100644 --- a/src/slic3r.cpp +++ b/src/slic3r.cpp @@ -13,6 +13,7 @@ #include #include #include +#include "GUI/GUI.hpp" using namespace Slic3r; @@ -39,6 +40,11 @@ main(int argc, char **argv) cli_config.apply(config, true); DynamicPrintConfig print_config; + + Slic3rGUI *gui = new Slic3rGUI; + + Slic3rGUI::SetInstance(gui); + wxEntry(argc, argv); // load config files supplied via --load for (const std::string &file : cli_config.load.values) {