Bonjour autodiscovery of the Octoprint instances in local network. #1826
This commit is contained in:
parent
5d4d79191a
commit
b468e68c59
1
Build.PL
1
Build.PL
@ -28,6 +28,7 @@ my %prereqs = qw(
|
|||||||
my %recommends = qw(
|
my %recommends = qw(
|
||||||
Class::XSAccessor 0
|
Class::XSAccessor 0
|
||||||
LWP::UserAgent 0
|
LWP::UserAgent 0
|
||||||
|
Net::Bonjour 0
|
||||||
XML::SAX::ExpatXS 0
|
XML::SAX::ExpatXS 0
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -7,6 +7,7 @@ use File::Basename qw(basename);
|
|||||||
use FindBin;
|
use FindBin;
|
||||||
use Slic3r::GUI::AboutDialog;
|
use Slic3r::GUI::AboutDialog;
|
||||||
use Slic3r::GUI::BedShapeDialog;
|
use Slic3r::GUI::BedShapeDialog;
|
||||||
|
use Slic3r::GUI::BonjourBrowser;
|
||||||
use Slic3r::GUI::ConfigWizard;
|
use Slic3r::GUI::ConfigWizard;
|
||||||
use Slic3r::GUI::MainFrame;
|
use Slic3r::GUI::MainFrame;
|
||||||
use Slic3r::GUI::Notifier;
|
use Slic3r::GUI::Notifier;
|
||||||
|
51
lib/Slic3r/GUI/BonjourBrowser.pm
Normal file
51
lib/Slic3r/GUI/BonjourBrowser.pm
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
package Slic3r::GUI::BonjourBrowser;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use utf8;
|
||||||
|
|
||||||
|
use Wx qw(:dialog :id :misc :sizer :choicebook wxTAB_TRAVERSAL);
|
||||||
|
use Wx::Event qw(EVT_CLOSE);
|
||||||
|
use base 'Wx::Dialog';
|
||||||
|
|
||||||
|
sub new {
|
||||||
|
my $class = shift;
|
||||||
|
my ($parent) = @_;
|
||||||
|
my $self = $class->SUPER::new($parent, -1, "Device Browser", wxDefaultPosition, [350,700], wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER);
|
||||||
|
|
||||||
|
# look for devices
|
||||||
|
eval "use Net::Bonjour; 1";
|
||||||
|
my $res = Net::Bonjour->new('http');
|
||||||
|
$res->discover;
|
||||||
|
$self->{devices} = [ $res->entries ];
|
||||||
|
|
||||||
|
# label
|
||||||
|
my $text = Wx::StaticText->new($self, -1, "Choose an Octoprint device in your network:", wxDefaultPosition, wxDefaultSize);
|
||||||
|
|
||||||
|
# selector
|
||||||
|
$self->{choice} = my $choice = Wx::Choice->new($self, -1, wxDefaultPosition, wxDefaultSize,
|
||||||
|
[ map $_->name, @{$self->{devices}} ]);
|
||||||
|
|
||||||
|
my $main_sizer = Wx::BoxSizer->new(wxVERTICAL);
|
||||||
|
$main_sizer->Add($text, 1, wxEXPAND | wxALL, 10);
|
||||||
|
$main_sizer->Add($choice, 1, wxEXPAND | wxALL, 10);
|
||||||
|
$main_sizer->Add($self->CreateButtonSizer(wxOK | wxCANCEL), 0, wxEXPAND);
|
||||||
|
|
||||||
|
$self->SetSizer($main_sizer);
|
||||||
|
$self->SetMinSize($self->GetSize);
|
||||||
|
$main_sizer->SetSizeHints($self);
|
||||||
|
|
||||||
|
# needed to actually free memory
|
||||||
|
EVT_CLOSE($self, sub {
|
||||||
|
$self->EndModal(wxID_OK);
|
||||||
|
$self->Destroy;
|
||||||
|
});
|
||||||
|
|
||||||
|
return $self;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub GetValue {
|
||||||
|
my ($self) = @_;
|
||||||
|
return $self->{devices}[ $self->{choice}->GetSelection ]->address;
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
@ -83,7 +83,7 @@ sub append_line {
|
|||||||
# if we have a single option with no sidetext just add it directly to the grid sizer
|
# if we have a single option with no sidetext just add it directly to the grid sizer
|
||||||
my @options = @{$line->get_options};
|
my @options = @{$line->get_options};
|
||||||
$self->_options->{$_->opt_id} = $_ for @options;
|
$self->_options->{$_->opt_id} = $_ for @options;
|
||||||
if (@options == 1 && !$options[0]->sidetext) {
|
if (@options == 1 && !$options[0]->sidetext && !@{$line->get_extra_widgets}) {
|
||||||
my $option = $options[0];
|
my $option = $options[0];
|
||||||
my $field = $self->_build_field($option);
|
my $field = $self->_build_field($option);
|
||||||
$grid_sizer->Add($field, 0, ($option->full_width ? wxEXPAND : 0) | wxALIGN_CENTER_VERTICAL, 0);
|
$grid_sizer->Add($field, 0, ($option->full_width ? wxEXPAND : 0) | wxALIGN_CENTER_VERTICAL, 0);
|
||||||
@ -114,9 +114,14 @@ sub append_line {
|
|||||||
$sizer->Add($sidetext, 0, wxLEFT | wxALIGN_CENTER_VERTICAL , 4);
|
$sizer->Add($sidetext, 0, wxLEFT | wxALIGN_CENTER_VERTICAL , 4);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# add extra sizers if any
|
||||||
|
foreach my $extra_widget (@{$line->get_extra_widgets}) {
|
||||||
|
$sizer->Add($extra_widget->($self->parent), 0, wxLEFT | wxALIGN_CENTER_VERTICAL , 4);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sub append_single_option_line {
|
sub create_single_option_line {
|
||||||
my ($self, $option) = @_;
|
my ($self, $option) = @_;
|
||||||
|
|
||||||
my $line = Slic3r::GUI::OptionsGroup::Line->new(
|
my $line = Slic3r::GUI::OptionsGroup::Line->new(
|
||||||
@ -125,11 +130,15 @@ sub append_single_option_line {
|
|||||||
);
|
);
|
||||||
$option->label("");
|
$option->label("");
|
||||||
$line->append_option($option);
|
$line->append_option($option);
|
||||||
$self->append_line($line);
|
|
||||||
|
|
||||||
return $line;
|
return $line;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub append_single_option_line {
|
||||||
|
my ($self, $option) = @_;
|
||||||
|
return $self->append_line($self->create_single_option_line($option));
|
||||||
|
}
|
||||||
|
|
||||||
sub _build_field {
|
sub _build_field {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
my ($opt) = @_;
|
my ($opt) = @_;
|
||||||
@ -241,6 +250,7 @@ has 'label_tooltip' => (is => 'rw', default => sub { "" });
|
|||||||
has 'sizer' => (is => 'rw');
|
has 'sizer' => (is => 'rw');
|
||||||
has 'widget' => (is => 'rw');
|
has 'widget' => (is => 'rw');
|
||||||
has '_options' => (is => 'ro', default => sub { [] });
|
has '_options' => (is => 'ro', default => sub { [] });
|
||||||
|
has '_extra_widgets' => (is => 'ro', default => sub { [] });
|
||||||
|
|
||||||
# this method accepts a Slic3r::GUI::OptionsGroup::Option object
|
# this method accepts a Slic3r::GUI::OptionsGroup::Option object
|
||||||
sub append_option {
|
sub append_option {
|
||||||
@ -248,11 +258,21 @@ sub append_option {
|
|||||||
push @{$self->_options}, $option;
|
push @{$self->_options}, $option;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub append_widget {
|
||||||
|
my ($self, $widget) = @_;
|
||||||
|
push @{$self->_extra_widgets}, $widget;
|
||||||
|
}
|
||||||
|
|
||||||
sub get_options {
|
sub get_options {
|
||||||
my ($self) = @_;
|
my ($self) = @_;
|
||||||
return [ @{$self->_options} ];
|
return [ @{$self->_options} ];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub get_extra_widgets {
|
||||||
|
my ($self) = @_;
|
||||||
|
return [ @{$self->_extra_widgets} ];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
package Slic3r::GUI::OptionsGroup::Option;
|
package Slic3r::GUI::OptionsGroup::Option;
|
||||||
use Moo;
|
use Moo;
|
||||||
@ -320,7 +340,7 @@ sub get_option {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
sub append_single_option_line {
|
sub create_single_option_line {
|
||||||
my ($self, $opt_key, $opt_index) = @_;
|
my ($self, $opt_key, $opt_index) = @_;
|
||||||
|
|
||||||
my $option;
|
my $option;
|
||||||
@ -329,7 +349,12 @@ sub append_single_option_line {
|
|||||||
} else {
|
} else {
|
||||||
$option = $self->get_option($opt_key, $opt_index);
|
$option = $self->get_option($opt_key, $opt_index);
|
||||||
}
|
}
|
||||||
return $self->SUPER::append_single_option_line($option);
|
return $self->SUPER::create_single_option_line($option);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub append_single_option_line {
|
||||||
|
my ($self, $option, $opt_index) = @_;
|
||||||
|
return $self->append_line($self->create_single_option_line($option, $opt_index));
|
||||||
}
|
}
|
||||||
|
|
||||||
sub reload_config {
|
sub reload_config {
|
||||||
|
@ -347,6 +347,7 @@ sub BUILD {
|
|||||||
$self->wxSizer($sizer);
|
$self->wxSizer($sizer);
|
||||||
|
|
||||||
my $field_size = Wx::Size->new(40, -1);
|
my $field_size = Wx::Size->new(40, -1);
|
||||||
|
|
||||||
$self->x_textctrl(Wx::TextCtrl->new($self->parent, -1, $self->option->default->[X], wxDefaultPosition, $field_size));
|
$self->x_textctrl(Wx::TextCtrl->new($self->parent, -1, $self->option->default->[X], wxDefaultPosition, $field_size));
|
||||||
$self->y_textctrl(Wx::TextCtrl->new($self->parent, -1, $self->option->default->[Y], wxDefaultPosition, $field_size));
|
$self->y_textctrl(Wx::TextCtrl->new($self->parent, -1, $self->option->default->[Y], wxDefaultPosition, $field_size));
|
||||||
|
|
||||||
|
@ -999,7 +999,40 @@ sub build {
|
|||||||
}
|
}
|
||||||
{
|
{
|
||||||
my $optgroup = $page->new_optgroup('Octoprint upload');
|
my $optgroup = $page->new_optgroup('Octoprint upload');
|
||||||
$optgroup->append_single_option_line('octoprint_host');
|
|
||||||
|
# append a button to the Host line
|
||||||
|
my $octoprint_host_widget = sub {
|
||||||
|
my ($parent) = @_;
|
||||||
|
|
||||||
|
my $btn = Wx::Button->new($parent, -1, "Browse…", wxDefaultPosition, wxDefaultSize, wxBU_LEFT);
|
||||||
|
$btn->SetFont($Slic3r::GUI::small_font);
|
||||||
|
if ($Slic3r::GUI::have_button_icons) {
|
||||||
|
$btn->SetBitmap(Wx::Bitmap->new("$Slic3r::var/cog.png", wxBITMAP_TYPE_PNG));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!eval "use Net::Bonjour; 1") {
|
||||||
|
$btn->Disable;
|
||||||
|
}
|
||||||
|
|
||||||
|
my $sizer = Wx::BoxSizer->new(wxHORIZONTAL);
|
||||||
|
$sizer->Add($btn);
|
||||||
|
|
||||||
|
EVT_BUTTON($self, $btn, sub {
|
||||||
|
my $dlg = Slic3r::GUI::BonjourBrowser->new($self);
|
||||||
|
if ($dlg->ShowModal == wxID_OK) {
|
||||||
|
my $value = $dlg->GetValue;
|
||||||
|
$self->{config}->set('octoprint_host', $value);
|
||||||
|
$self->update_dirty;
|
||||||
|
$self->_on_value_change('octoprint_host', $value);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return $sizer;
|
||||||
|
};
|
||||||
|
|
||||||
|
my $host_line = $optgroup->create_single_option_line('octoprint_host');
|
||||||
|
$host_line->append_widget($octoprint_host_widget);
|
||||||
|
$optgroup->append_line($host_line);
|
||||||
$optgroup->append_single_option_line('octoprint_apikey');
|
$optgroup->append_single_option_line('octoprint_apikey');
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user