2014-02-15 18:06:03 -08:00
/ *
2018-01-14 10:13:42 -08:00
Copyright ( c ) 2018 , Lars Brubaker , John Lewin
2014-02-15 18:06:03 -08:00
All rights reserved .
Redistribution and use in source and binary forms , with or without
2015-04-08 15:20:10 -07:00
modification , are permitted provided that the following conditions are met :
2014-02-15 18:06:03 -08:00
1. Redistributions of source code must retain the above copyright notice , this
2015-04-08 15:20:10 -07:00
list of conditions and the following disclaimer .
2014-02-15 18:06:03 -08:00
2. Redistributions in binary form must reproduce the above copyright notice ,
this list of conditions and the following disclaimer in the documentation
2015-04-08 15:20:10 -07:00
and / or other materials provided with the distribution .
2014-02-15 18:06:03 -08:00
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED . IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT , INDIRECT , INCIDENTAL , SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES
( INCLUDING , BUT NOT LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ;
LOSS OF USE , DATA , OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY , OR TORT
( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE .
The views and conclusions contained in the software and documentation are those
2015-04-08 15:20:10 -07:00
of the authors and should not be interpreted as representing official policies ,
2014-02-15 18:06:03 -08:00
either expressed or implied , of the FreeBSD Project .
* /
2016-08-10 15:18:03 -07:00
2017-07-01 16:47:37 -07:00
using System ;
using System.Collections.Generic ;
using System.Linq ;
2018-04-04 08:47:26 -07:00
using System.Text.RegularExpressions ;
2014-01-29 19:09:30 -08:00
using MatterHackers.Agg ;
2018-05-26 11:58:16 -07:00
using MatterHackers.Agg.Platform ;
2014-02-05 17:47:13 -08:00
using MatterHackers.Agg.UI ;
2014-01-29 19:09:30 -08:00
using MatterHackers.Localizations ;
2014-11-03 12:13:03 -08:00
using MatterHackers.MatterControl.CustomWidgets ;
2018-01-08 13:13:32 -08:00
using MatterHackers.MatterControl.PartPreviewWindow ;
2018-01-14 10:36:05 -08:00
using MatterHackers.MatterControl.PrintLibrary ;
using MatterHackers.MatterControl.SetupWizard ;
2014-02-05 17:47:13 -08:00
using MatterHackers.VectorMath ;
2014-01-29 19:09:30 -08:00
2014-02-15 18:06:03 -08:00
namespace MatterHackers.MatterControl.SlicerConfiguration
2018-04-04 08:47:26 -07:00
{
2017-10-15 16:24:39 -07:00
public class SliceSettingsWidget : FlowLayoutWidget
2015-04-08 15:20:10 -07:00
{
2017-09-13 21:38:34 -07:00
internal PresetsToolbar settingsControlBar ;
2017-12-27 13:45:47 -08:00
internal SettingsContext settingsContext ;
2017-06-08 16:43:30 -07:00
2018-04-07 22:13:19 -07:00
private PrinterConfig printer ;
2017-10-31 14:37:28 -07:00
public SliceSettingsWidget ( PrinterConfig printer , SettingsContext settingsContext , ThemeConfig theme )
2017-09-13 22:15:00 -07:00
: base ( FlowDirection . TopToBottom )
2015-04-08 15:20:10 -07:00
{
2017-09-17 01:11:18 -07:00
this . printer = printer ;
2018-04-07 22:51:10 -07:00
this . BackgroundColor = theme . TabBodyBackground ;
2017-05-23 10:51:12 -07:00
2017-09-03 18:50:44 +03:00
this . settingsContext = settingsContext ;
2016-04-18 11:31:31 -07:00
2018-04-12 08:42:10 -07:00
settingsControlBar = new PresetsToolbar ( printer , theme )
2016-03-30 18:33:29 -07:00
{
2017-08-07 15:47:27 -07:00
HAnchor = HAnchor . Stretch ,
2016-03-30 18:33:29 -07:00
Padding = new BorderDouble ( 8 , 12 , 8 , 8 )
} ;
2014-01-29 19:09:30 -08:00
2018-06-24 08:54:44 -07:00
using ( this . LayoutLock ( ) )
{
this . AddChild ( settingsControlBar ) ;
this . AddChild (
new SliceSettingsTabView (
settingsContext ,
"SliceSettings" ,
printer ,
"Advanced" ,
theme ,
isPrimarySettingsView : true ,
databaseMRUKey : UserSettingsKey . SliceSettingsWidget_CurrentTab ,
extendPopupMenu : this . ExtendOverflowMenu ) ) ;
}
2018-04-07 22:13:19 -07:00
this . AnchorAll ( ) ;
2018-01-14 10:36:05 -08:00
}
2018-01-21 21:07:14 -08:00
private void ExtendOverflowMenu ( PopupMenu popupMenu )
2018-01-14 10:36:05 -08:00
{
popupMenu . CreateHorizontalLine ( ) ;
PopupMenu . MenuItem menuItem ;
2018-05-26 11:58:16 -07:00
menuItem = popupMenu . CreateMenuItem ( "Import Presets" . Localize ( ) ) ;
2018-06-24 11:15:26 -07:00
menuItem . Click + = ( s , e ) = > UiThread . RunOnIdle ( ( ) = >
2018-01-14 10:36:05 -08:00
{
2018-06-24 11:15:26 -07:00
AggContext . FileDialogs . OpenFileDialog (
new OpenFileDialogParams ( "settings files|*.printer" ) ,
( dialogParams ) = >
{
if ( ! string . IsNullOrEmpty ( dialogParams . FileName ) )
2018-06-05 16:07:26 -07:00
{
2018-06-24 11:15:26 -07:00
DialogWindow . Show ( new ImportSettingsPage ( dialogParams . FileName , printer ) ) ;
}
} ) ;
} , . 2 ) ;
2018-01-14 10:36:05 -08:00
2018-05-26 11:58:16 -07:00
popupMenu . CreateHorizontalLine ( ) ;
2018-01-14 10:36:05 -08:00
menuItem = popupMenu . CreateMenuItem ( "Restore Settings" . Localize ( ) ) ;
2018-06-24 11:15:26 -07:00
menuItem . Click + = ( s , e ) = > UiThread . RunOnIdle ( ( ) = >
2018-01-14 10:36:05 -08:00
{
DialogWindow . Show < PrinterProfileHistoryPage > ( ) ;
2018-06-24 11:15:26 -07:00
} , . 2 ) ;
2018-01-14 10:36:05 -08:00
menuItem . Enabled = ! string . IsNullOrEmpty ( AuthenticationData . Instance . ActiveSessionUsername ) ;
menuItem = popupMenu . CreateMenuItem ( "Reset to Defaults" . Localize ( ) ) ;
2018-06-24 11:15:26 -07:00
menuItem . Click + = ( s , e ) = > UiThread . RunOnIdle ( ( ) = >
2018-01-14 10:36:05 -08:00
{
2018-06-24 11:15:26 -07:00
StyledMessageBox . ShowMessageBox (
( revertSettings ) = >
{
if ( revertSettings )
2018-01-14 10:36:05 -08:00
{
2018-06-24 11:15:26 -07:00
bool onlyReloadSliceSettings = true ;
if ( printer . Settings . GetValue < bool > ( SettingsKey . print_leveling_required_to_print )
& & printer . Settings . GetValue < bool > ( SettingsKey . print_leveling_enabled ) )
2018-01-14 10:36:05 -08:00
{
2018-06-24 11:15:26 -07:00
onlyReloadSliceSettings = false ;
2018-01-14 10:36:05 -08:00
}
2018-05-26 11:58:16 -07:00
2018-06-24 11:15:26 -07:00
printer . Settings . ClearUserOverrides ( ) ;
printer . Settings . Save ( ) ;
if ( onlyReloadSliceSettings )
{
printer ? . Bed . GCodeRenderer ? . Clear3DGCode ( ) ;
}
else
{
ApplicationController . Instance . ReloadAll ( ) ;
}
}
} ,
"Resetting to default values will remove your current overrides and restore your original printer settings.\nAre you sure you want to continue?" . Localize ( ) ,
"Revert Settings" . Localize ( ) ,
StyledMessageBox . MessageType . YES_NO ) ;
} , . 2 ) ;
2018-05-26 11:58:16 -07:00
menuItem = popupMenu . CreateMenuItem ( "Export" . Localize ( ) ) ;
2018-06-24 11:15:26 -07:00
menuItem . Click + = ( s , e ) = > UiThread . RunOnIdle ( ( ) = >
2018-05-26 11:58:16 -07:00
{
ActiveSliceSettings . Instance . Helpers . ExportAsMatterControlConfig ( ) ;
2018-06-24 11:15:26 -07:00
} , . 2 ) ;
2014-12-31 14:17:18 -08:00
}
2017-09-04 23:49:05 +03:00
// TODO: This should just proxy to settingsControlBar.Visible. Having local state and pushing values on event listeners seems off
2017-01-11 14:27:33 -08:00
private bool showControlBar = true ;
public bool ShowControlBar
{
get { return showControlBar ; }
set
{
settingsControlBar . Visible = value ;
showControlBar = value ;
}
}
2018-01-14 10:13:42 -08:00
}
2017-06-08 16:43:30 -07:00
2018-01-14 10:13:42 -08:00
public class SliceSettingsTabView : SimpleTabs
{
2018-04-04 08:47:26 -07:00
// Sanitize group names for use as keys in db fields
private static Regex nameSanitizer = new Regex ( "[^a-zA-Z0-9-]" , RegexOptions . Compiled ) ;
2018-01-14 10:13:42 -08:00
private int tabIndexForItem = 0 ;
private Dictionary < string , UIField > allUiFields = new Dictionary < string , UIField > ( ) ;
private ThemeConfig theme ;
private PrinterConfig printer ;
private SettingsContext settingsContext ;
private bool isPrimarySettingsView ;
2018-01-14 10:36:05 -08:00
private SearchInputBox searchPanel ;
private int groupPanelCount = 0 ;
private List < ( GuiWidget widget , SliceSettingData settingData ) > settingsRows ;
private TextWidget filteredItemsHeading ;
2018-01-18 17:59:24 -08:00
private EventHandler unregisterEvents ;
2018-01-21 21:07:14 -08:00
private Action < PopupMenu > externalExtendMenu ;
2018-04-04 08:47:26 -07:00
private string scopeName ;
2017-11-16 09:56:16 -08:00
2018-04-04 08:47:26 -07:00
public SliceSettingsTabView ( SettingsContext settingsContext , string scopeName , PrinterConfig printer , string UserLevel , ThemeConfig theme , bool isPrimarySettingsView , string databaseMRUKey , Action < PopupMenu > extendPopupMenu = null )
2018-01-21 21:07:14 -08:00
: base ( theme )
2018-01-14 10:36:05 -08:00
{
2018-06-24 08:54:44 -07:00
using ( this . LayoutLock ( ) )
{
this . VAnchor = VAnchor . Stretch ;
this . HAnchor = HAnchor . Stretch ;
this . externalExtendMenu = extendPopupMenu ;
this . scopeName = scopeName ;
2018-01-21 21:07:14 -08:00
2018-06-24 08:54:44 -07:00
var overflowBar = this . TabBar as OverflowBar ;
overflowBar . ExtendOverflowMenu = this . ExtendOverflowMenu ;
2018-01-21 21:07:14 -08:00
2018-06-24 08:54:44 -07:00
var overflowButton = this . TabBar . RightAnchorItem ;
overflowButton . Name = "Slice Settings Overflow Menu" ;
2018-01-14 10:13:42 -08:00
2018-06-24 08:54:44 -07:00
this . TabBar . Padding = this . TabBar . Margin . Clone ( right : theme . ToolbarPadding . Right ) ;
2018-01-14 10:36:05 -08:00
2018-07-12 09:22:28 -07:00
searchPanel = new SearchInputBox ( theme )
2018-06-24 08:54:44 -07:00
{
Visible = false ,
BackgroundColor = theme . TabBarBackground ,
MinimumSize = new Vector2 ( 0 , this . TabBar . Height )
} ;
2018-01-14 10:36:05 -08:00
2018-06-24 08:54:44 -07:00
searchPanel . searchInput . Margin = new BorderDouble ( 3 , 0 ) ;
searchPanel . searchInput . ActualTextEditWidget . EnterPressed + = ( s , e ) = >
2018-01-14 10:36:05 -08:00
{
2018-06-24 08:54:44 -07:00
var filter = searchPanel . searchInput . Text . Trim ( ) ;
foreach ( var item in this . settingsRows )
{
var metaData = item . settingData ;
2018-01-14 10:36:05 -08:00
// Show matching items
item . widget . Visible = metaData . SlicerConfigName . IndexOf ( filter , StringComparison . OrdinalIgnoreCase ) > = 0
2018-06-24 08:54:44 -07:00
| | metaData . HelpText . IndexOf ( filter , StringComparison . OrdinalIgnoreCase ) > = 0 ;
}
2018-01-14 10:36:05 -08:00
2018-06-24 08:54:44 -07:00
this . ShowFilteredView ( ) ;
} ;
searchPanel . ResetButton . Click + = ( s , e ) = >
{
searchPanel . Visible = false ;
searchPanel . searchInput . Text = "" ;
2018-01-14 10:36:05 -08:00
2018-06-24 08:54:44 -07:00
this . ClearFilter ( ) ;
} ;
2018-01-14 10:36:05 -08:00
2018-06-24 08:54:44 -07:00
// Add heading for My Settings view
searchPanel . AddChild ( filteredItemsHeading = new TextWidget ( "My Modified Settings" , pointSize : theme . DefaultFontSize , textColor : theme . Colors . PrimaryTextColor )
{
Margin = new BorderDouble ( left : 10 ) ,
HAnchor = HAnchor . Left ,
VAnchor = VAnchor . Center ,
Visible = false
} , 0 ) ;
2018-01-14 10:36:05 -08:00
2018-06-24 08:54:44 -07:00
this . AddChild ( searchPanel , 0 ) ;
2018-01-16 15:05:58 -08:00
2018-06-24 08:54:44 -07:00
var scrollable = new ScrollableWidget ( true )
{
HAnchor = HAnchor . Stretch ,
VAnchor = VAnchor . Stretch ,
} ;
scrollable . ScrollArea . HAnchor = HAnchor . Stretch ;
//scrollable.ScrollArea.VAnchor = VAnchor.Fit;
2018-01-16 15:05:58 -08:00
2018-06-24 08:54:44 -07:00
var tabContainer = new FlowLayoutWidget ( FlowDirection . TopToBottom )
{
VAnchor = VAnchor . Fit ,
HAnchor = HAnchor . Stretch ,
//DebugShowBounds = true,
//MinimumSize = new Vector2(200, 200)
} ;
2018-01-16 15:05:58 -08:00
2018-06-24 08:54:44 -07:00
scrollable . AddChild ( tabContainer ) ;
2018-01-16 15:05:58 -08:00
2018-06-24 08:54:44 -07:00
this . AddChild ( scrollable ) ;
2018-01-16 15:05:58 -08:00
2018-06-24 08:54:44 -07:00
// Force TopToBottom flowlayout contained in scrollable as AddChild target
this . TabContainer = tabContainer ;
2018-01-14 10:13:42 -08:00
2018-06-24 08:54:44 -07:00
this . theme = theme ;
this . printer = printer ;
this . settingsContext = settingsContext ;
this . isPrimarySettingsView = isPrimarySettingsView ;
2017-07-01 16:47:37 -07:00
2018-06-24 08:54:44 -07:00
this . TabBar . BackgroundColor = theme . TabBarBackground ;
2018-01-11 12:29:19 -08:00
2018-06-24 08:54:44 -07:00
tabIndexForItem = 0 ;
2018-01-14 10:13:42 -08:00
2018-06-24 08:54:44 -07:00
var userLevel = SettingsOrganizer . Instance . UserLevels [ UserLevel ] ;
2018-01-14 10:36:05 -08:00
2018-06-24 08:54:44 -07:00
this . settingsRows = new List < ( GuiWidget , SliceSettingData ) > ( ) ;
2018-01-18 17:59:24 -08:00
2018-06-24 08:54:44 -07:00
allUiFields = new Dictionary < string , UIField > ( ) ;
2017-06-11 14:29:42 -07:00
2018-06-24 08:54:44 -07:00
// Loop over categories creating a tab for each
foreach ( var category in userLevel . Categories )
2016-07-15 11:52:06 -07:00
{
2018-06-24 08:54:44 -07:00
if ( category . Name = = "Printer"
& & ( settingsContext . ViewFilter = = NamedSettingsLayers . Material | | settingsContext . ViewFilter = = NamedSettingsLayers . Quality ) )
{
continue ;
}
2018-01-14 10:13:42 -08:00
2018-06-24 08:54:44 -07:00
var categoryPanel = new FlowLayoutWidget ( FlowDirection . TopToBottom )
{
VAnchor = VAnchor . Fit ,
HAnchor = HAnchor . Stretch ,
} ;
2018-01-31 15:10:38 -08:00
2018-06-24 08:54:44 -07:00
using ( categoryPanel . LayoutLock ( ) )
2018-01-14 10:13:42 -08:00
{
2018-06-24 08:54:44 -07:00
// Loop over all groups in this tab and add their content
bool hasVisibleSection = false ;
2018-01-14 10:13:42 -08:00
2018-06-24 08:54:44 -07:00
foreach ( var group in category . Groups )
{
if ( group . Name = = "Connection" )
{
categoryPanel . AddChild (
this . CreateOemProfileInfoRow ( ) ) ;
}
2014-01-29 19:09:30 -08:00
2018-06-24 08:54:44 -07:00
var groupSection = this . CreateGroupSection ( group ) ;
2018-02-08 15:42:07 -08:00
2018-06-24 08:54:44 -07:00
groupSection . Name = group . Name + " Panel" ;
2018-04-04 12:02:25 -07:00
2018-06-24 08:54:44 -07:00
if ( groupSection . Descendants < SliceSettingsRow > ( ) . Any ( ) )
{
categoryPanel . AddChild ( groupSection ) ;
}
2018-04-04 12:02:25 -07:00
2018-06-24 08:54:44 -07:00
hasVisibleSection = hasVisibleSection | | groupSection . Checkbox . Checked ;
}
2018-01-31 15:10:38 -08:00
2018-06-24 08:54:44 -07:00
if ( ! hasVisibleSection
& & categoryPanel . Children . OfType < SectionWidget > ( ) . FirstOrDefault ( ) is SectionWidget sectionWidget )
2018-01-31 15:10:38 -08:00
{
2018-06-24 08:54:44 -07:00
sectionWidget . Checkbox . Checked = true ;
}
2015-04-16 18:08:43 -07:00
2018-06-24 08:54:44 -07:00
if ( categoryPanel . Descendants < SliceSettingsRow > ( ) . Any ( ) )
{
this . AddTab (
new ToolTab (
category . Name . Localize ( ) ,
this ,
categoryPanel ,
theme ,
hasClose : false ,
pointSize : theme . DefaultFontSize )
{
Name = category . Name + " Tab" ,
InactiveTabColor = Color . Transparent ,
ActiveTabColor = theme . ActiveTabColor
} ) ;
}
}
2018-01-14 10:36:05 -08:00
2018-06-24 08:54:44 -07:00
categoryPanel . PerformLayout ( ) ;
}
2018-01-14 10:36:05 -08:00
2018-06-24 08:54:44 -07:00
this . TabBar . AddChild ( new HorizontalSpacer ( ) ) ;
2018-01-14 10:36:05 -08:00
2018-06-24 08:54:44 -07:00
var searchButton = theme . CreateSearchButton ( ) ;
searchButton . Click + = ( s , e ) = >
{
filteredItemsHeading . Visible = false ;
searchPanel . searchInput . Visible = true ;
2018-01-14 10:36:05 -08:00
2018-06-24 08:54:44 -07:00
searchPanel . Visible = true ;
searchPanel . searchInput . Focus ( ) ;
this . TabBar . Visible = false ;
} ;
2018-01-21 21:07:14 -08:00
2018-06-24 08:54:44 -07:00
this . TabBar . AddChild ( searchButton ) ;
2018-01-21 21:07:14 -08:00
2018-06-24 08:54:44 -07:00
searchButton . VAnchor = VAnchor . Center ;
2015-04-16 18:08:43 -07:00
2018-06-24 08:54:44 -07:00
searchButton . VAnchorChanged + = ( s , e ) = > Console . WriteLine ( ) ;
// Restore the last selected tab
if ( int . TryParse ( UserSettings . Instance . get ( databaseMRUKey ) , out int tabIndex )
& & tabIndex > = 0
& & tabIndex < this . TabCount )
2018-01-14 10:13:42 -08:00
{
2018-06-24 08:54:44 -07:00
this . SelectedTabIndex = tabIndex ;
}
else
{
this . SelectedTabIndex = 0 ;
2018-01-14 10:13:42 -08:00
}
2018-01-18 17:59:24 -08:00
2018-06-24 08:54:44 -07:00
// Store the last selected tab on change
this . ActiveTabChanged + = ( s , e ) = >
2018-01-18 17:59:24 -08:00
{
2018-06-24 08:54:44 -07:00
if ( settingsContext . IsPrimarySettingsView )
{
UserSettings . Instance . set ( databaseMRUKey , this . SelectedTabIndex . ToString ( ) ) ;
}
} ;
ActiveSliceSettings . SettingChanged . RegisterEvent (
( s , e ) = >
2018-01-18 17:59:24 -08:00
{
2018-06-24 08:54:44 -07:00
if ( e is StringEventArgs stringEvent )
2018-01-18 17:59:24 -08:00
{
2018-06-24 08:54:44 -07:00
string settingsKey = stringEvent . Data ;
if ( this . allUiFields . TryGetValue ( settingsKey , out UIField uifield ) )
2018-01-18 17:59:24 -08:00
{
2018-06-24 08:54:44 -07:00
string currentValue = settingsContext . GetValue ( settingsKey ) ;
if ( uifield . Value ! = currentValue
| | settingsKey = = "com_port" )
{
uifield . SetValue (
currentValue ,
userInitiated : false ) ;
}
2018-01-18 17:59:24 -08:00
}
}
2018-06-24 08:54:44 -07:00
} ,
ref unregisterEvents ) ;
}
this . PerformLayout ( ) ;
2015-04-08 15:20:10 -07:00
}
2014-01-29 19:09:30 -08:00
2018-04-04 08:47:26 -07:00
public enum ExpansionMode { Expanded , Collapsed }
public void ForceExpansionMode ( ExpansionMode expansionMode )
{
2018-04-04 12:02:25 -07:00
bool firstItem = true ;
foreach ( var sectionWidget in this . ActiveTab . TabContent . Descendants < SectionWidget > ( ) . Reverse ( ) )
2018-04-04 08:47:26 -07:00
{
2018-04-04 12:02:25 -07:00
if ( firstItem )
{
sectionWidget . Checkbox . Checked = true ;
firstItem = false ;
}
else
{
sectionWidget . Checkbox . Checked = expansionMode = = ExpansionMode . Expanded ;
}
2018-04-04 08:47:26 -07:00
}
}
2018-01-21 21:07:14 -08:00
private void ExtendOverflowMenu ( PopupMenu popupMenu )
{
popupMenu . CreateMenuItem ( "View Just My Settings" . Localize ( ) ) . Click + = ( s , e ) = >
{
this . FilterToOverrides ( ) ;
} ;
popupMenu . CreateHorizontalLine ( ) ;
2018-04-04 08:47:26 -07:00
popupMenu . CreateMenuItem ( "Expand All" . Localize ( ) ) . Click + = ( s , e ) = >
{
this . ForceExpansionMode ( ExpansionMode . Expanded ) ;
} ;
popupMenu . CreateMenuItem ( "Collapse All" . Localize ( ) ) . Click + = ( s , e ) = >
{
this . ForceExpansionMode ( ExpansionMode . Collapsed ) ;
} ;
2018-01-21 21:07:14 -08:00
externalExtendMenu ? . Invoke ( popupMenu ) ;
}
2018-01-14 10:13:42 -08:00
public Dictionary < string , UIField > UIFields = > allUiFields ;
2018-05-17 18:22:24 -07:00
// Known sections which have toggle fields that enabled/disable said feature/section
private Dictionary < string , string > toggleSwitchSectionKeys = new Dictionary < string , string >
{
{ "Support" , "support_material" } ,
{ "Skirt" , "create_skirt" } ,
{ "Raft" , "create_raft" } ,
{ "Brim" , "create_brim" } ,
2018-07-16 16:56:15 -07:00
{ "Retraction" , "enable_retractions" } ,
{ "Fan" , "enable_fan" } ,
2018-05-17 18:22:24 -07:00
} ;
2018-04-04 12:02:25 -07:00
public SectionWidget CreateGroupSection ( SettingsOrganizer . Group group )
2017-12-27 10:15:35 -08:00
{
var groupPanel = new FlowLayoutWidget ( FlowDirection . TopToBottom )
{
VAnchor = VAnchor . Fit ,
2018-01-03 22:25:25 -08:00
HAnchor = HAnchor . Stretch ,
2018-01-14 10:13:42 -08:00
Padding = new BorderDouble ( 6 , 4 , 6 , 0 ) ,
Name = "GroupPanel" + groupPanelCount + +
2017-12-27 10:15:35 -08:00
} ;
2018-01-03 22:25:25 -08:00
2018-04-04 08:47:26 -07:00
string userSettingsKey = string . Format (
"{0}_{1}_{2}" ,
scopeName ,
nameSanitizer . Replace ( group . Category . Name , "" ) ,
nameSanitizer . Replace ( group . Name , "" ) ) ;
2018-05-17 18:22:24 -07:00
UIField uiField = null ;
if ( toggleSwitchSectionKeys . TryGetValue ( group . Name , out string toggleFieldKey ) )
{
var settingData = SettingsOrganizer . SettingsData [ toggleFieldKey ] ;
uiField = CreateToggleFieldForSection ( settingData ) ;
}
var sectionWidget = new SectionWidget ( group . Name . Localize ( ) , groupPanel , theme , serializationKey : userSettingsKey , rightAlignedContent : uiField ? . Content ) ;
2018-04-14 20:52:35 -07:00
theme . ApplyBoxStyle ( sectionWidget ) ;
2018-02-09 22:51:18 -08:00
2018-04-13 20:25:49 -07:00
bool firstRow = true ;
2018-04-06 15:01:07 -07:00
GuiWidget settingsRow = null ;
2018-06-24 08:54:44 -07:00
using ( groupPanel . LayoutLock ( ) )
2017-12-27 07:49:43 -08:00
{
2018-06-24 08:54:44 -07:00
foreach ( var subGroup in group . SubGroups )
2017-12-27 07:49:43 -08:00
{
2018-06-24 08:54:44 -07:00
// Add SettingRows for subgroup
foreach ( SliceSettingData settingData in subGroup . Settings )
2018-04-11 16:03:22 -07:00
{
2018-06-24 08:54:44 -07:00
// Note: tab sections may disappear if / when they are empty, as controlled by:
// settingShouldBeShown / addedSettingToSubGroup / needToAddSubGroup
bool settingShouldBeShown = CheckIfShouldBeShown ( settingData , settingsContext ) ;
2018-04-11 16:03:22 -07:00
2018-06-24 08:54:44 -07:00
if ( EngineMappingsMatterSlice . Instance . MapContains ( settingData . SlicerConfigName )
& & settingShouldBeShown )
2018-04-14 10:21:47 -07:00
{
2018-06-24 08:54:44 -07:00
settingsRow = CreateItemRow ( settingData ) ;
2018-04-14 10:21:47 -07:00
2018-06-24 08:54:44 -07:00
if ( firstRow )
{
// First row needs top and bottom border
settingsRow . Border = new BorderDouble ( 0 , 1 ) ;
firstRow = false ;
}
2018-04-11 16:03:22 -07:00
2018-06-24 08:54:44 -07:00
this . settingsRows . Add ( ( settingsRow , settingData ) ) ;
2018-01-14 10:36:05 -08:00
2018-06-24 08:54:44 -07:00
groupPanel . AddChild ( settingsRow ) ;
}
2018-04-14 10:21:47 -07:00
}
2017-12-27 07:49:43 -08:00
}
}
2018-06-24 08:54:44 -07:00
groupPanel . PerformLayout ( ) ;
2018-04-06 15:01:07 -07:00
// Hide border on last item in group
if ( settingsRow ! = null )
{
settingsRow . BorderColor = Color . Transparent ;
}
2018-04-14 10:21:47 -07:00
return sectionWidget ;
2017-12-27 07:49:43 -08:00
}
2018-05-17 18:22:24 -07:00
private UIField CreateToggleFieldForSection ( SliceSettingData settingData )
{
bool useDefaultSavePattern = false ;
2018-06-22 17:34:30 -07:00
string sliceSettingValue = settingsContext . GetValue ( settingData . SlicerConfigName ) ;
// Create toggle field for key
UIField uiField = new ToggleboxField ( theme )
{
HelpText = settingData . HelpText ,
Name = $"{settingData.PresentationName} Field"
} ;
uiField . Initialize ( tabIndexForItem + + ) ;
2018-05-17 18:22:24 -07:00
uiField . ValueChanged + = ( s , e ) = >
{
if ( e . UserInitiated )
{
ICheckbox checkbox = uiField . Content as ICheckbox ;
string checkedKey = ( checkbox . Checked ) ? "OnValue" : "OffValue" ;
// Linked settings should be updated in all cases (user clicked checkbox, user clicked clear)
foreach ( var setSettingsData in settingData . SetSettingsOnChange )
{
if ( setSettingsData . TryGetValue ( checkedKey , out string targetValue ) )
{
settingsContext . SetValue ( setSettingsData [ "TargetSetting" ] , targetValue ) ;
}
}
// Store actual field value
settingsContext . SetValue ( settingData . SlicerConfigName , uiField . Value ) ;
}
} ;
if ( allUiFields ! = null )
{
allUiFields [ settingData . SlicerConfigName ] = uiField ;
}
uiField . SetValue ( sliceSettingValue , userInitiated : false ) ;
2018-06-22 17:39:54 -07:00
// Second ValueChanged listener defined after SetValue to ensure it's unaffected by initial change
2018-05-17 18:22:24 -07:00
uiField . ValueChanged + = ( s , e ) = >
{
if ( useDefaultSavePattern
& & e . UserInitiated )
{
settingsContext . SetValue ( settingData . SlicerConfigName , uiField . Value ) ;
}
} ;
uiField . Content . Margin = uiField . Content . Margin . Clone ( right : 15 ) ;
uiField . Content . ToolTipText = settingData . HelpText ;
return uiField ;
}
2018-01-14 10:13:42 -08:00
private static bool CheckIfShouldBeShown ( SliceSettingData settingData , SettingsContext settingsContext )
2016-08-11 16:09:45 -07:00
{
2017-08-28 11:27:38 +03:00
bool settingShouldBeShown = settingsContext . ParseShowString ( settingData . ShowIfSet ) ;
2017-09-03 18:28:15 +03:00
if ( settingsContext . ViewFilter = = NamedSettingsLayers . Material | | settingsContext . ViewFilter = = NamedSettingsLayers . Quality )
2016-06-08 09:25:20 -07:00
{
2016-06-08 11:18:53 -07:00
if ( ! settingData . ShowAsOverride )
2016-06-08 09:25:20 -07:00
{
settingShouldBeShown = false ;
}
}
2016-04-20 11:53:08 -07:00
return settingShouldBeShown ;
}
2017-08-28 11:27:38 +03:00
// Creates an information row showing the base OEM profile and its create_date value
2018-01-14 10:13:42 -08:00
public GuiWidget CreateOemProfileInfoRow ( )
2016-07-15 11:52:06 -07:00
{
var dataArea = new FlowLayoutWidget ( FlowDirection . TopToBottom )
{
2017-08-07 15:47:27 -07:00
HAnchor = HAnchor . Stretch ,
2016-07-15 11:52:06 -07:00
} ;
2017-08-28 11:27:38 +03:00
if ( isPrimarySettingsView )
2016-07-18 14:59:14 -07:00
{
2017-02-28 15:56:10 -08:00
// OEM_LAYER_DATE:
string lastUpdateTime = "March 1, 2016" ;
if ( ActiveSliceSettings . Instance ? . OemLayer ! = null )
2016-07-28 16:37:24 -07:00
{
2017-02-28 15:56:10 -08:00
string fromCreatedDate = ActiveSliceSettings . Instance . OemLayer . ValueOrDefault ( SettingsKey . created_date ) ;
try
{
if ( ! string . IsNullOrEmpty ( fromCreatedDate ) )
{
DateTime time = Convert . ToDateTime ( fromCreatedDate ) . ToLocalTime ( ) ;
lastUpdateTime = time . ToString ( "MMMM d, yyyy h:mm tt" ) ;
}
}
catch
2016-07-28 16:37:24 -07:00
{
}
}
2017-02-28 15:56:10 -08:00
var row = new FlowLayoutWidget ( )
2016-07-28 16:37:24 -07:00
{
2018-04-07 22:51:10 -07:00
BackgroundColor = theme . Colors . TertiaryBackgroundColor ,
2017-02-28 15:56:10 -08:00
Padding = new BorderDouble ( 5 ) ,
Margin = new BorderDouble ( 3 , 20 , 3 , 0 ) ,
2017-09-07 21:04:21 -07:00
HAnchor = HAnchor . Stretch ,
2017-02-28 15:56:10 -08:00
} ;
2017-09-17 01:11:18 -07:00
string make = settingsContext . GetValue ( SettingsKey . make ) ;
string model = settingsContext . GetValue ( SettingsKey . model ) ;
2017-02-28 15:56:10 -08:00
string title = $"{make} {model}" ;
if ( title = = "Other Other" )
2016-07-28 16:37:24 -07:00
{
2017-02-28 15:56:10 -08:00
title = "Custom Profile" . Localize ( ) ;
2016-07-28 16:37:24 -07:00
}
2016-07-18 14:59:14 -07:00
2018-06-24 08:54:44 -07:00
using ( row . LayoutLock ( ) )
2017-02-28 15:56:10 -08:00
{
2018-06-24 08:54:44 -07:00
row . AddChild ( new TextWidget ( title , pointSize : 9 )
{
Margin = new BorderDouble ( 0 , 4 , 10 , 4 ) ,
TextColor = theme . Colors . PrimaryTextColor ,
} ) ;
2016-07-28 12:19:30 -07:00
2018-06-24 08:54:44 -07:00
row . AddChild ( new HorizontalSpacer ( ) ) ;
2017-02-28 15:56:10 -08:00
2018-06-24 08:54:44 -07:00
row . AddChild ( new TextWidget ( lastUpdateTime , pointSize : 9 )
{
Margin = new BorderDouble ( 0 , 4 , 10 , 4 ) ,
TextColor = theme . Colors . PrimaryTextColor ,
} ) ;
}
row . PerformLayout ( ) ;
2017-02-28 15:56:10 -08:00
dataArea . AddChild ( row ) ;
}
2016-07-15 11:52:06 -07:00
return dataArea ;
}
2018-01-14 10:13:42 -08:00
2018-01-18 17:59:24 -08:00
internal GuiWidget CreateItemRow ( SliceSettingData settingData )
2017-12-11 22:22:56 -08:00
{
2018-04-12 08:42:10 -07:00
return CreateItemRow ( settingData , settingsContext , printer , theme , ref tabIndexForItem , allUiFields ) ;
2017-12-11 22:22:56 -08:00
}
2018-04-12 08:42:10 -07:00
public static GuiWidget CreateItemRow ( SliceSettingData settingData , SettingsContext settingsContext , PrinterConfig printer , ThemeConfig theme , ref int tabIndexForItem , Dictionary < string , UIField > fieldCache = null )
2016-04-18 11:31:31 -07:00
{
2017-08-28 11:27:38 +03:00
string sliceSettingValue = settingsContext . GetValue ( settingData . SlicerConfigName ) ;
2016-04-26 17:15:10 -07:00
2017-09-13 06:59:30 -07:00
UIField uiField = null ;
2016-05-07 21:05:53 -07:00
2017-09-04 23:49:05 +03:00
bool useDefaultSavePattern = true ;
2017-09-13 06:10:24 -07:00
bool placeFieldInDedicatedRow = false ;
2017-09-04 23:49:05 +03:00
2018-04-06 09:05:43 -07:00
bool fullRowSelect = settingData . DataEditType = = SliceSettingData . DataEditTypes . CHECK_BOX ;
2018-04-12 08:42:10 -07:00
var settingsRow = new SliceSettingsRow ( printer , settingsContext , settingData , theme , fullRowSelect : fullRowSelect ) ;
2017-08-29 14:03:02 +03:00
2018-04-06 14:50:53 -07:00
switch ( settingData . DataEditType )
2016-04-18 11:31:31 -07:00
{
2018-04-06 14:50:53 -07:00
case SliceSettingData . DataEditTypes . INT :
2018-01-13 11:38:46 -08:00
2018-04-06 14:50:53 -07:00
var intField = new IntField ( ) ;
uiField = intField ;
2018-01-13 11:38:46 -08:00
2018-04-06 14:50:53 -07:00
if ( settingData . SlicerConfigName = = "extruder_count" )
{
intField . MaxValue = 4 ;
intField . MinValue = 0 ;
}
2018-01-13 11:38:46 -08:00
2018-04-06 14:50:53 -07:00
break ;
2015-04-08 15:20:10 -07:00
2018-04-06 14:50:53 -07:00
case SliceSettingData . DataEditTypes . DOUBLE :
case SliceSettingData . DataEditTypes . OFFSET :
uiField = new DoubleField ( ) ;
break ;
2015-04-08 15:20:10 -07:00
2018-04-06 14:50:53 -07:00
case SliceSettingData . DataEditTypes . POSITIVE_DOUBLE :
if ( settingData . SetSettingsOnChange . Count > 0 )
{
uiField = new BoundDoubleField ( settingsContext , settingData ) ;
}
else
{
uiField = new PositiveDoubleField ( ) ;
} ;
break ;
case SliceSettingData . DataEditTypes . DOUBLE_OR_PERCENT :
uiField = new DoubleOrPercentField ( ) ;
break ;
case SliceSettingData . DataEditTypes . INT_OR_MM :
uiField = new IntOrMmField ( ) ;
break ;
case SliceSettingData . DataEditTypes . CHECK_BOX :
2018-04-12 08:42:10 -07:00
uiField = new ToggleboxField ( theme ) ;
2018-04-06 14:50:53 -07:00
useDefaultSavePattern = false ;
uiField . ValueChanged + = ( s , e ) = >
{
if ( e . UserInitiated )
2017-09-01 12:25:19 +03:00
{
2018-04-13 12:38:40 -07:00
ICheckbox checkbox = uiField . Content as ICheckbox ;
string checkedKey = ( checkbox . Checked ) ? "OnValue" : "OffValue" ;
2018-04-06 14:50:53 -07:00
// Linked settings should be updated in all cases (user clicked checkbox, user clicked clear)
foreach ( var setSettingsData in settingData . SetSettingsOnChange )
2017-09-01 12:25:19 +03:00
{
2018-04-13 12:38:40 -07:00
if ( setSettingsData . TryGetValue ( checkedKey , out string targetValue ) )
2018-04-06 14:50:53 -07:00
{
2018-04-13 12:38:40 -07:00
settingsContext . SetValue ( setSettingsData [ "TargetSetting" ] , targetValue ) ;
2017-09-01 12:25:19 +03:00
}
}
2015-04-08 15:20:10 -07:00
2018-04-06 14:50:53 -07:00
// Store actual field value
settingsContext . SetValue ( settingData . SlicerConfigName , uiField . Value ) ;
}
} ;
break ;
2018-07-18 09:40:06 -07:00
case SliceSettingData . DataEditTypes . READONLY_STRING :
2018-07-18 19:17:11 -07:00
uiField = new ReadOnlyTextField ( theme ) ;
2018-07-18 09:40:06 -07:00
break ;
2018-04-06 14:50:53 -07:00
case SliceSettingData . DataEditTypes . STRING :
case SliceSettingData . DataEditTypes . WIDE_STRING :
uiField = new TextField ( ) ;
break ;
2015-04-08 15:20:10 -07:00
2018-04-06 14:50:53 -07:00
case SliceSettingData . DataEditTypes . MULTI_LINE_TEXT :
uiField = new MultilineStringField ( ) ;
placeFieldInDedicatedRow = true ;
break ;
2017-09-12 15:35:38 -07:00
2018-07-20 00:11:27 -07:00
case SliceSettingData . DataEditTypes . MARKDOWN_TEXT :
2018-07-20 12:37:08 -07:00
#if ! __ANDROID__
2018-07-20 00:11:27 -07:00
uiField = new MarkdownEditField ( theme , settingData . PresentationName ) ;
2018-07-20 12:37:08 -07:00
#endif
2018-07-20 00:11:27 -07:00
break ;
2018-04-06 14:50:53 -07:00
case SliceSettingData . DataEditTypes . COM_PORT :
useDefaultSavePattern = false ;
2017-09-05 14:10:31 +03:00
2018-04-06 14:50:53 -07:00
sliceSettingValue = printer . Settings . Helpers . ComPort ( ) ;
2017-09-21 15:59:23 -07:00
2018-04-06 14:50:53 -07:00
uiField = new ComPortField ( printer , theme ) ;
uiField . ValueChanged + = ( s , e ) = >
{
if ( e . UserInitiated )
2017-09-04 13:19:20 +03:00
{
2018-04-06 14:50:53 -07:00
printer . Settings . Helpers . SetComPort ( uiField . Value ) ;
}
} ;
2017-09-04 13:19:20 +03:00
2018-04-06 14:50:53 -07:00
break ;
2016-05-02 16:10:20 -07:00
2018-04-06 14:50:53 -07:00
case SliceSettingData . DataEditTypes . LIST :
2018-07-12 09:22:28 -07:00
uiField = new ListField ( theme )
2018-04-06 14:50:53 -07:00
{
ListItems = settingData . ListValues . Split ( ',' ) . ToList ( )
} ;
break ;
case SliceSettingData . DataEditTypes . HARDWARE_PRESENT :
2018-04-12 08:42:10 -07:00
uiField = new ToggleboxField ( theme ) ;
2018-04-06 14:50:53 -07:00
break ;
case SliceSettingData . DataEditTypes . VECTOR2 :
uiField = new Vector2Field ( ) ;
break ;
case SliceSettingData . DataEditTypes . OFFSET2 :
placeFieldInDedicatedRow = true ;
2018-04-12 08:42:10 -07:00
uiField = new ExtruderOffsetField ( settingsContext , settingData . SlicerConfigName , theme . Colors . PrimaryTextColor ) ;
2018-04-06 14:50:53 -07:00
break ;
2017-12-23 18:49:31 -08:00
#if ! __ANDROID__
2018-04-06 14:50:53 -07:00
case SliceSettingData . DataEditTypes . IP_LIST :
2018-07-12 09:22:28 -07:00
uiField = new IpAddessField ( printer , theme ) ;
2018-04-06 14:50:53 -07:00
break ;
2017-12-23 18:49:31 -08:00
#endif
2018-04-06 14:50:53 -07:00
default :
// Missing Setting
settingsRow . AddContent ( new TextWidget ( $"Missing the setting for '{settingData.DataEditType}'." )
{
2018-04-12 08:42:10 -07:00
TextColor = theme . Colors . PrimaryTextColor ,
2018-04-06 14:50:53 -07:00
BackgroundColor = Color . Red
} ) ;
break ;
2015-04-08 15:20:10 -07:00
}
2014-07-26 13:43:55 -07:00
2017-08-30 00:55:13 -07:00
if ( uiField ! = null )
{
2017-12-11 22:22:56 -08:00
if ( fieldCache ! = null )
{
fieldCache [ settingData . SlicerConfigName ] = uiField ;
}
2017-08-30 00:55:13 -07:00
2017-11-02 12:10:06 -07:00
uiField . HelpText = settingData . HelpText ;
2017-09-14 14:47:08 -07:00
uiField . Name = $"{settingData.PresentationName} Field" ;
2017-08-30 00:55:13 -07:00
uiField . Initialize ( tabIndexForItem + + ) ;
2018-01-18 17:03:05 -08:00
if ( settingData . DataEditType = = SliceSettingData . DataEditTypes . WIDE_STRING )
{
uiField . Content . HAnchor = HAnchor . Stretch ;
placeFieldInDedicatedRow = true ;
}
2017-09-04 23:49:05 +03:00
uiField . SetValue ( sliceSettingValue , userInitiated : false ) ;
2017-08-30 00:55:13 -07:00
2018-07-27 18:05:21 -07:00
// make sure the undo data goes back to the initial value after a change
2018-07-27 17:06:19 -07:00
if ( uiField . Content is MHTextEditWidget textWidget )
{
textWidget . ActualTextEditWidget . InternalTextEditWidget . ClearUndoHistory ( ) ;
}
else if ( uiField . Content is MHNumberEdit numberWidget )
{
numberWidget . ActuallNumberEdit . InternalTextEditWidget . ClearUndoHistory ( ) ;
}
2017-09-01 12:25:19 +03:00
uiField . ValueChanged + = ( s , e ) = >
{
2017-09-04 23:49:05 +03:00
if ( useDefaultSavePattern
& & e . UserInitiated )
{
settingsContext . SetValue ( settingData . SlicerConfigName , uiField . Value ) ;
}
2017-09-01 12:25:19 +03:00
settingsRow . UpdateStyle ( ) ;
} ;
2017-08-30 00:55:13 -07:00
// After initializing the field, wrap with dropmenu if applicable
2018-04-06 13:10:44 -07:00
if ( settingData . QuickMenuSettings . Count > 0
2018-01-31 16:06:51 -08:00
& & settingData . SlicerConfigName = = "baud_rate" )
2018-01-31 16:01:16 -08:00
{
2018-07-12 09:22:28 -07:00
var dropMenu = new DropMenuWrappedField ( uiField , settingData , theme . Colors . PrimaryTextColor , theme ) ;
2018-01-31 16:01:16 -08:00
dropMenu . Initialize ( tabIndexForItem ) ;
settingsRow . AddContent ( dropMenu . Content ) ;
}
else
2017-09-13 06:10:24 -07:00
{
if ( ! placeFieldInDedicatedRow )
{
settingsRow . AddContent ( uiField . Content ) ;
2018-04-06 09:05:43 -07:00
settingsRow . ActionWidget = uiField . Content ;
2017-09-13 06:10:24 -07:00
}
}
2017-08-30 00:55:13 -07:00
}
2016-04-18 11:31:31 -07:00
// Invoke the UpdateStyle implementation
2016-05-07 21:05:53 -07:00
settingsRow . UpdateStyle ( ) ;
2016-04-26 17:15:10 -07:00
2017-11-16 09:56:16 -08:00
bool settingEnabled = settingsContext . ParseShowString ( settingData . EnableIfSet ) ;
if ( settingEnabled
2018-01-14 10:13:42 -08:00
| | settingsContext . ViewFilter = = NamedSettingsLayers . Material
2017-11-16 09:56:16 -08:00
| | settingsContext . ViewFilter = = NamedSettingsLayers . Quality )
2017-09-04 10:52:56 +03:00
{
2017-09-13 06:10:24 -07:00
if ( placeFieldInDedicatedRow )
{
2017-09-13 18:18:11 -07:00
var column = new FlowLayoutWidget ( FlowDirection . TopToBottom )
2017-09-13 06:10:24 -07:00
{
2017-09-13 18:18:11 -07:00
Name = "column" ,
2017-09-13 06:10:24 -07:00
HAnchor = HAnchor . Stretch ,
VAnchor = VAnchor . Fit
} ;
2017-09-13 18:18:11 -07:00
column . AddChild ( settingsRow ) ;
2017-09-13 06:10:24 -07:00
2017-09-13 18:18:11 -07:00
var row = new FlowLayoutWidget ( )
2017-09-13 06:10:24 -07:00
{
2017-09-13 18:18:11 -07:00
Name = "row" ,
2017-09-13 06:10:24 -07:00
VAnchor = VAnchor . Fit ,
HAnchor = HAnchor . Stretch ,
2017-11-17 17:46:58 -08:00
MinimumSize = new Vector2 ( 0 , 28 ) ,
2017-11-17 17:07:04 -08:00
BackgroundColor = settingsRow . BackgroundColor ,
2017-11-17 17:46:58 -08:00
Border = settingsRow . Border ,
Padding = settingsRow . Padding ,
Margin = settingsRow . Margin ,
2017-09-13 06:10:24 -07:00
} ;
2017-09-13 18:18:11 -07:00
column . AddChild ( row ) ;
2017-09-13 06:10:24 -07:00
2017-09-13 18:18:11 -07:00
var contentWrapper = new GuiWidget
2017-09-13 06:10:24 -07:00
{
2017-09-13 18:18:11 -07:00
Name = "contentWrapper" ,
2017-09-13 06:10:24 -07:00
HAnchor = HAnchor . Stretch ,
VAnchor = VAnchor . Fit ,
2018-07-20 00:11:27 -07:00
Padding = new BorderDouble ( bottom : 10 ) ,
2017-09-13 06:10:24 -07:00
} ;
2017-09-13 18:18:11 -07:00
contentWrapper . AddChild ( uiField . Content ) ;
2017-09-13 06:10:24 -07:00
2017-09-13 18:18:11 -07:00
row . AddChild ( contentWrapper ) ;
2017-09-13 06:10:24 -07:00
2017-09-13 18:18:11 -07:00
return column ;
2017-09-13 06:10:24 -07:00
}
else
{
return settingsRow ;
}
2017-09-04 10:52:56 +03:00
}
else
2017-08-02 15:19:32 -07:00
{
2018-01-14 10:36:05 -08:00
settingsRow . Enabled = false ;
return settingsRow ;
2017-09-14 08:55:30 -07:00
}
}
2018-01-14 10:36:05 -08:00
public void FilterToOverrides ( )
{
foreach ( var item in this . settingsRows )
{
var settingData = item . settingData ;
2018-06-05 16:15:20 -07:00
// var layerValues = printer.Settings.GetLayerValues(settingData.SlicerConfigName);
// var (currentValue, layerName) = printer.Settings.GetValueAndLayerName(settingData.SlicerConfigName, printer.Settings.defaultLayerCascade);
2018-01-31 17:23:05 -08:00
2018-06-05 16:15:20 -07:00
item . widget . Visible = printer . Settings . IsOverride ( settingData . SlicerConfigName ) ;
2018-01-14 10:36:05 -08:00
}
filteredItemsHeading . Visible = true ;
searchPanel . searchInput . Visible = false ;
this . TabBar . Visible = false ;
searchPanel . Visible = true ;
this . ShowFilteredView ( ) ;
}
2018-01-31 15:10:38 -08:00
List < SectionWidget > widgetsThatWereExpanded = new List < SectionWidget > ( ) ;
2018-01-14 10:36:05 -08:00
private void ShowFilteredView ( )
{
2018-01-31 15:10:38 -08:00
widgetsThatWereExpanded . Clear ( ) ;
2018-01-14 10:36:05 -08:00
// Show any section with visible SliceSettingsRows
foreach ( var section in this . Descendants < SectionWidget > ( ) )
{
// HACK: Include parent visibility in mix as complex fields that return wrapped SliceSettingsRows will be visible and their parent will be hidden
section . Visible = section . Descendants < SliceSettingsRow > ( ) . Any ( row = > row . Visible & & row . Parent . Visible ) ;
2018-01-31 15:10:38 -08:00
if ( ! section . Checkbox . Checked )
{
widgetsThatWereExpanded . Add ( section ) ;
section . Checkbox . Checked = true ;
}
2018-01-14 10:36:05 -08:00
}
// Show all tab containers
foreach ( var tab in this . AllTabs )
{
tab . TabContent . Visible = true ;
}
}
2018-01-18 17:59:24 -08:00
public override void OnClosed ( ClosedEventArgs e )
{
unregisterEvents ? . Invoke ( this , null ) ;
base . OnClosed ( e ) ;
}
2018-01-14 10:36:05 -08:00
public void ClearFilter ( )
{
foreach ( var item in this . settingsRows )
{
// Show matching items
item . widget . Visible = true ;
}
foreach ( var tab in this . AllTabs )
{
tab . TabContent . Visible = ( tab = = this . ActiveTab ) ;
}
foreach ( var section in this . Descendants < SectionWidget > ( ) )
{
// HACK: Include parent visibility in mix as complex fields that return wrapped SliceSettingsRows will be visible and their parent will be hidden
section . Visible = section . Descendants < SliceSettingsRow > ( ) . Any ( row = > row . Visible & & row . Parent . Visible ) ;
}
2018-01-31 15:10:38 -08:00
foreach ( var section in widgetsThatWereExpanded )
{
section . Checkbox . Checked = false ;
}
2018-01-14 10:36:05 -08:00
this . TabBar . Visible = true ;
}
2015-04-08 15:20:10 -07:00
}
2016-08-10 15:18:03 -07:00
}