From a0c271008280ea9e87e238fe2523cfca02a1e45e Mon Sep 17 00:00:00 2001 From: Nico Hirsch <30938717+noxhirsch@users.noreply.github.com> Date: Thu, 13 Dec 2018 22:50:33 +0100 Subject: [PATCH 01/30] Add files via upload --- ui/common.go | 2 - ui/control.go | 3 +- ui/default.go | 14 ++-- ui/filament.go | 14 ++-- ui/files.go | 207 ++++++++++++++++++++++++++++++---------------- ui/home.go | 3 +- ui/move.go | 10 ++- ui/status.go | 105 ++++++++++++----------- ui/system.go | 2 +- ui/temperature.go | 91 +++++++++++--------- ui/ui.go | 6 +- 11 files changed, 273 insertions(+), 184 deletions(-) diff --git a/ui/common.go b/ui/common.go index c0f4dc7..914a957 100644 --- a/ui/common.go +++ b/ui/common.go @@ -53,8 +53,6 @@ func (p *CommonPanel) Initialize() { for i := len(p.buttons) + 1; i < last; i++ { p.AddButton(MustBox(gtk.ORIENTATION_HORIZONTAL, 0)) } - - p.AddButton(MustButtonImage("Back", "back.svg", p.UI.GoHistory)) } func (p *CommonPanel) Parent() Panel { diff --git a/ui/control.go b/ui/control.go index bcb7be7..104e4f1 100644 --- a/ui/control.go +++ b/ui/control.go @@ -9,7 +9,7 @@ import ( var control = []*octoprint.ControlDefinition{{ Name: "Motor Off", - Command: "M18", + Command: "M84", }, { Name: "Fan On", Command: "M106", @@ -46,6 +46,7 @@ func (m *controlPanel) initialize() { b := m.createCommandButton(c) m.AddButton(b) } + m.Grid().Attach(MustButtonImage("Back", "back.svg", m.UI.GoHistory), 4, 1, 1, 1) } func (m *controlPanel) getControl() []*octoprint.ControlDefinition { diff --git a/ui/default.go b/ui/default.go index 12e3e89..6e9beb3 100644 --- a/ui/default.go +++ b/ui/default.go @@ -18,12 +18,12 @@ func DefaultPanel(ui *UI) Panel { func (m *defaultPanel) initialize() { m.Grid().Attach(MustButtonImage("Status", "status.svg", m.showStatus), 1, 0, 1, 1) - m.Grid().Attach(MustButtonImage("Heat Up", "heat-up.svg", m.showTemperature), 2, 0, 1, 1) - m.Grid().Attach(MustButtonImage("Move", "move.svg", m.showMove), 3, 0, 1, 1) - m.Grid().Attach(MustButtonImage("Home", "home.svg", m.showHome), 4, 0, 1, 1) - m.Grid().Attach(MustButtonImage("Filament", "filament.svg", m.showFilament), 1, 1, 1, 1) - m.Grid().Attach(MustButtonImage("Control", "control.svg", m.showControl), 2, 1, 1, 1) - m.Grid().Attach(MustButtonImage("Files", "files.svg", m.showFiles), 3, 1, 1, 1) + m.Grid().Attach(MustButtonImage("Files", "files.svg", m.showFiles), 2, 0, 1, 1) + m.Grid().Attach(MustButtonImage("Heat Up", "heat-up.svg", m.showTemperature), 3, 0, 1, 1) + m.Grid().Attach(MustButtonImage("Filament", "filament_clean.svg", m.showFilament), 4, 0, 1, 1) + m.Grid().Attach(MustButtonImage("Home", "home.svg", m.showHome), 1, 1, 1, 1) + m.Grid().Attach(MustButtonImage("Move", "move.svg", m.showMove), 2, 1, 1, 1) + m.Grid().Attach(MustButtonImage("Control", "fan-on.svg", m.showControl), 3, 1, 1, 1) m.Grid().Attach(MustButtonImage("System", "settings.svg", m.showSystem), 4, 1, 1, 1) } @@ -36,7 +36,7 @@ func (m *defaultPanel) showHome() { } func (m *defaultPanel) showTemperature() { - m.UI.Add(TemperaturePanel(m.UI, m)) + m.UI.Add(ProfilesPanel(m.UI, m)) } func (m *defaultPanel) showFilament() { diff --git a/ui/filament.go b/ui/filament.go index b1bc6a1..2476286 100644 --- a/ui/filament.go +++ b/ui/filament.go @@ -28,7 +28,7 @@ func FilamentPanel(ui *UI, parent Panel) Panel { labels: map[string]*LabelWithImage{}, } - m.b = NewBackgroundTask(time.Second*5, m.updateTemperatures) + m.b = NewBackgroundTask(time.Second*2, m.updateTemperatures) m.initialize() filamentPanelInstance = m } @@ -39,8 +39,8 @@ func FilamentPanel(ui *UI, parent Panel) Panel { func (m *filamentPanel) initialize() { defer m.Initialize() - m.Grid().Attach(m.createExtrudeButton("Extrude", "extrude.svg", 1), 1, 0, 1, 1) - m.Grid().Attach(m.createExtrudeButton("Retract", "retract.svg", -1), 4, 0, 1, 1) + m.Grid().Attach(m.createExtrudeButton("Retract", "retract.svg", -1), 1, 0, 1, 1) + m.Grid().Attach(m.createExtrudeButton("Extrude", "extrude.svg", 1), 4, 0, 1, 1) m.box = MustBox(gtk.ORIENTATION_VERTICAL, 5) m.box.SetVAlign(gtk.ALIGN_CENTER) @@ -53,6 +53,8 @@ func (m *filamentPanel) initialize() { m.Grid().Attach(m.createToolButton(), 1, 1, 1, 1) m.Grid().Attach(m.createFlowrateButton(), 3, 1, 1, 1) + + m.Grid().Attach(MustButtonImage("Back", "back.svg", m.UI.GoHistory), 4, 1, 1, 1) } func (m *filamentPanel) updateTemperatures() { @@ -79,7 +81,7 @@ func (m *filamentPanel) loadTemperatureState(s *octoprint.TemperatureState) { } m.previous = s -} +} func (m *filamentPanel) addNewTool(tool string) { m.labels[tool] = MustLabelWithImage("extruder.svg", "") @@ -90,11 +92,11 @@ func (m *filamentPanel) addNewTool(tool string) { } func (m *filamentPanel) loadTemperatureData(tool string, d *octoprint.TemperatureData) { - text := fmt.Sprintf("%s: %.1f°C / %.1f°C", strings.Title(tool), d.Actual, d.Target) + text := fmt.Sprintf("%s: %.1f°C \n⇒ %.1f°C", strings.Title(tool), d.Actual, d.Target) if m.previous != nil && d.Target > 0 { if p, ok := m.previous.Current[tool]; ok { - text = fmt.Sprintf("%s (%.1f°C)", text, d.Actual-p.Actual) + text = fmt.Sprintf("%s\nΔ (%.1f°C)", text, d.Actual-p.Actual) } } diff --git a/ui/files.go b/ui/files.go index 48baeee..bb736fc 100644 --- a/ui/files.go +++ b/ui/files.go @@ -3,7 +3,7 @@ package ui import ( "fmt" "sort" - "time" + //"time" "github.com/dustin/go-humanize" "github.com/gotk3/gotk3/gtk" @@ -19,11 +19,11 @@ type filesPanel struct { } func FilesPanel(ui *UI, parent Panel) Panel { - if filesPanelInstance == nil { + // if filesPanelInstance == nil { m := &filesPanel{CommonPanel: NewCommonPanel(ui, parent)} m.initialize() filesPanelInstance = m - } + // } return filesPanelInstance } @@ -52,25 +52,25 @@ func (m *filesPanel) createActionBar() gtk.IWidget { bar.SetMarginEnd(5) bar.Add(m.createRefreshButton()) - bar.Add(m.createInitReleaseSDButton()) - bar.Add(MustButton(MustImageFromFileWithSize("back.svg", 40, 40), m.UI.GoHistory)) + //bar.Add(m.createInitReleaseSDButton()) + bar.Add(MustButton(MustImageFromFileWithSize("back.svg", 35, 35), m.UI.GoHistory)) return bar } func (m *filesPanel) createRefreshButton() gtk.IWidget { - return MustButton(MustImageFromFileWithSize("refresh.svg", 40, 40), m.doLoadFiles) + return MustButton(MustImageFromFileWithSize("refresh.svg", 35, 35), m.doLoadFiles) } func (m *filesPanel) doLoadFiles() { Logger.Info("Refreshing list of files") - m.doRefreshSD() + //m.doRefreshSD() local := m.doLoadFilesFromLocation(octoprint.Local) - sdcard := m.doLoadFilesFromLocation(octoprint.SDCard) + //sdcard := m.doLoadFilesFromLocation(octoprint.SDCard) s := byDate(local) - s = append(s, sdcard...) + //s = append(s, sdcard...) sort.Sort(s) EmptyContainer(&m.list.Container) @@ -85,11 +85,11 @@ func (m *filesPanel) doLoadFiles() { m.list.ShowAll() } -func (m *filesPanel) doRefreshSD() { - if err := (&octoprint.SDRefreshRequest{}).Do(m.UI.Printer); err != nil { - Logger.Error(err) - } -} +// func (m *filesPanel) doRefreshSD() { +// if err := (&octoprint.SDRefreshRequest{}).Do(m.UI.Printer); err != nil { +// Logger.Error(err) +// } +// } func (m *filesPanel) doLoadFilesFromLocation(l octoprint.Location) []*octoprint.FileInformation { r := &octoprint.FilesRequest{Location: l, Recursive: true} @@ -106,31 +106,34 @@ func (m *filesPanel) addFile(b *gtk.Box, f *octoprint.FileInformation) { frame, _ := gtk.FrameNew("") name := MustLabel(f.Name) - name.SetMarkup(fmt.Sprintf("%s", filenameEllipsis(f.Name))) + name.SetMarkup(fmt.Sprintf("%s", filenameEllipsis(f.Name))) name.SetHExpand(true) + name.SetHAlign(gtk.ALIGN_START) + name.SetMarginTop(5) info := MustLabel("") - info.SetMarkup(fmt.Sprintf("Uploaded: %s - Size: %s", + info.SetMarkup(fmt.Sprintf("%s - %s", humanize.Time(f.Date.Time), humanize.Bytes(uint64(f.Size)), )) + info.SetHAlign(gtk.ALIGN_START) labels := MustBox(gtk.ORIENTATION_VERTICAL, 5) labels.Add(name) labels.Add(info) actions := MustBox(gtk.ORIENTATION_HORIZONTAL, 5) - actions.Add(m.createLoadAndPrintButton("load.svg", f, false)) - actions.Add(m.createLoadAndPrintButton("status.svg", f, true)) + actions.Add(m.createLoadAndPrintButton("status.svg", f)) + // actions.Add(m.createLoadAndPrintButton("load.svg", f, false)) + actions.Add(m.createDeleteButton("delete.svg", f)) + actions.SetHAlign(gtk.ALIGN_END) file := MustBox(gtk.ORIENTATION_HORIZONTAL, 5) - file.SetMarginTop(15) - file.SetMarginEnd(15) - file.SetMarginStart(15) - file.SetMarginBottom(15) + file.SetMarginTop(5) + file.SetMarginEnd(5) + file.SetMarginStart(5) + file.SetMarginBottom(5) file.SetHExpand(true) - file.Add(MustImageFromFileWithSize("file.svg", 35, 35)) - file.Add(labels) file.Add(actions) @@ -138,67 +141,127 @@ func (m *filesPanel) addFile(b *gtk.Box, f *octoprint.FileInformation) { b.Add(frame) } -func (m *filesPanel) createLoadAndPrintButton(img string, f *octoprint.FileInformation, print bool) gtk.IWidget { +func (m *filesPanel) createLoadAndPrintButton(img string, f *octoprint.FileInformation) gtk.IWidget { return MustButton( - MustImageFromFileWithSize(img, 30, 30), - MustConfirmDialog(m.UI.w, "Are you sure you want to proceed?", func() { - r := &octoprint.SelectFileRequest{} - r.Location = octoprint.Local - r.Path = f.Path - r.Print = print - - Logger.Infof("Loading file %q, printing: %v", f.Name, print) - if err := r.Do(m.UI.Printer); err != nil { - Logger.Error(err) - return - } - }), + MustImageFromFileWithSize(img, 20, 20), + PrintDialog(m.UI.w, "Start printing?\n"+filenameEllipsis_short(f.Name), f.Path, m), ) } -func (m *filesPanel) createInitReleaseSDButton() gtk.IWidget { - release := MustImageFromFileWithSize("sd_eject.svg", 40, 40) - init := MustImageFromFileWithSize("sd.svg", 40, 40) - b := MustButton(release, nil) - - state := func() { - time.Sleep(50 * time.Millisecond) - switch m.isReady() { - case true: - b.SetImage(release) - case false: - b.SetImage(init) - } - } - b.Connect("clicked", func() { - var err error - if !m.isReady() { - err = (&octoprint.SDInitRequest{}).Do(m.UI.Printer) - } else { - err = (&octoprint.SDReleaseRequest{}).Do(m.UI.Printer) - } - if err != nil { - Logger.Error(err) - } +func PrintDialog(parent *gtk.Window, msg string, pfad string, ma *filesPanel) func() { + return func() { + win := gtk.MessageDialogNewWithMarkup( + parent, + gtk.DIALOG_MODAL, + gtk.MESSAGE_INFO, + gtk.BUTTONS_YES_NO, + "", + ) - state() - }) + win.SetMarkup(CleanHTML(msg)) + defer win.Destroy() - return b -} + box, _ := win.GetContentArea() + box.SetMarginStart(15) + box.SetMarginEnd(15) + box.SetMarginTop(15) + box.SetMarginBottom(15) -func (m *filesPanel) isReady() bool { - state, err := (&octoprint.SDStateRequest{}).Do(m.UI.Printer) - if err != nil { - Logger.Error(err) - return false + ctx, _ := win.GetStyleContext() + ctx.AddClass("dialog") + + ergebnis := win.Run() + + if ergebnis == int(gtk.RESPONSE_NO) { + ro := &octoprint.SelectFileRequest{} + ro.Location = octoprint.Local + ro.Path = pfad + ro.Print = false + + Logger.Infof("Loading file %q", ro) + if err := ro.Do(ma.UI.Printer); err != nil { + Logger.Error(err) + return + } + }else if ergebnis == int(gtk.RESPONSE_YES) { + rt := &octoprint.SelectFileRequest{} + rt.Location = octoprint.Local + rt.Path = pfad + rt.Print = true + + Logger.Infof("Printing file %q", rt) + if err := rt.Do(ma.UI.Printer); err != nil { + Logger.Error(err) + return + } + } } +} - return state.Ready +func (m *filesPanel) createDeleteButton(img string, de *octoprint.FileInformation) gtk.IWidget { + return MustButton( + MustImageFromFileWithSize(img, 20, 20), + MustConfirmDialog(m.UI.w, "Delete file?\n"+filenameEllipsis_short(de.Name), func() { + del := &octoprint.DeleteFileRequest{} + del.Location = octoprint.Local + del.Path = de.Path + + Logger.Infof("RM %q FROM %v", de.Path, octoprint.Local) + if err := del.Do(m.UI.Printer); err != nil { + Logger.Error(err) + return + } + + m.doLoadFiles() + }), + ) } +// func (m *filesPanel) createInitReleaseSDButton() gtk.IWidget { +// release := MustImageFromFileWithSize("sd_eject.svg", 40, 40) +// init := MustImageFromFileWithSize("sd.svg", 40, 40) +// b := MustButton(release, nil) + +// state := func() { +// time.Sleep(50 * time.Millisecond) +// switch m.isReady() { +// case true: +// b.SetImage(release) +// case false: +// b.SetImage(init) +// } +// } + +// b.Connect("clicked", func() { +// var err error +// if !m.isReady() { +// err = (&octoprint.SDInitRequest{}).Do(m.UI.Printer) +// } else { +// err = (&octoprint.SDReleaseRequest{}).Do(m.UI.Printer) +// } + +// if err != nil { +// Logger.Error(err) +// } + +// state() +// }) + +// return b +// } + +// func (m *filesPanel) isReady() bool { +// state, err := (&octoprint.SDStateRequest{}).Do(m.UI.Printer) +// if err != nil { +// Logger.Error(err) +// return false +// } + +// return state.Ready +// } + type byDate []*octoprint.FileInformation func (s byDate) Len() int { return len(s) } diff --git a/ui/home.go b/ui/home.go index 66f02d4..6d42a35 100644 --- a/ui/home.go +++ b/ui/home.go @@ -31,12 +31,13 @@ func (m *homePanel) initialize() { m.AddButton(m.createMoveButton("Home X", "home-x.svg", octoprint.XAxis)) m.AddButton(m.createMoveButton("Home Y", "home-y.svg", octoprint.YAxis)) m.AddButton(m.createMoveButton("Home Z", "home-z.svg", octoprint.ZAxis)) + m.Grid().Attach(MustButtonImage("Back", "back.svg", m.UI.GoHistory), 4, 1, 1, 1) } func (m *homePanel) createMoveButton(label, image string, axes ...octoprint.Axis) gtk.IWidget { return MustButtonImage(label, image, func() { cmd := &octoprint.PrintHeadHomeRequest{Axes: axes} - Logger.Warningf("Homing the print head in %s axes", axes) + Logger.Warningf("Homing %s axes", axes) if err := cmd.Do(m.UI.Printer); err != nil { Logger.Error(err) return diff --git a/ui/move.go b/ui/move.go index b199b94..8831c70 100644 --- a/ui/move.go +++ b/ui/move.go @@ -28,17 +28,19 @@ func (m *movePanel) initialize() { defer m.Initialize() m.AddButton(m.createMoveButton("X+", "move-x+.svg", octoprint.XAxis, 1)) - m.AddButton(m.createMoveButton("Y+", "move-y+.svg", octoprint.YAxis, 1)) + m.AddButton(m.createMoveButton("Y-", "move-y+.svg", octoprint.YAxis, -1)) m.AddButton(m.createMoveButton("Z+", "move-z+.svg", octoprint.ZAxis, 1)) m.step = MustStepButton("move-step.svg", - Step{"5mm", 5}, Step{"10mm", 10}, Step{"1mm", 1}, + Step{"20mm", 20}, Step{"10mm", 10}, Step{"1mm", 1}, ) m.AddButton(m.step) m.AddButton(m.createMoveButton("X-", "move-x-.svg", octoprint.XAxis, -1)) - m.AddButton(m.createMoveButton("Y-", "move-y-.svg", octoprint.YAxis, -1)) + m.AddButton(m.createMoveButton("Y+", "move-y-.svg", octoprint.YAxis, 1)) m.AddButton(m.createMoveButton("Z-", "move-z-.svg", octoprint.ZAxis, -1)) + + m.Grid().Attach(MustButtonImage("Back", "back.svg", m.UI.GoHistory), 4, 1, 1, 1) } func (m *movePanel) createMoveButton(label, image string, a octoprint.Axis, dir int) gtk.IWidget { @@ -55,7 +57,7 @@ func (m *movePanel) createMoveButton(label, image string, a octoprint.Axis, dir cmd.Z = distance } - Logger.Warningf("Jogging print head axis %s in %dmm", + Logger.Warningf("Jogging %s axis in %dmm", strings.ToUpper(string(a)), distance, ) diff --git a/ui/status.go b/ui/status.go index 5e11611..d5d1a15 100644 --- a/ui/status.go +++ b/ui/status.go @@ -2,7 +2,6 @@ package ui import ( "fmt" - "strings" "time" "github.com/gotk3/gotk3/gtk" @@ -16,7 +15,7 @@ type statusPanel struct { step *StepButton pb *gtk.ProgressBar - bed, tool0, tool1 *LabelWithImage + bed, tool0 *LabelWithImage file, left *LabelWithImage print, pause, stop *gtk.Button } @@ -36,18 +35,16 @@ func StatusPanel(ui *UI, parent Panel) Panel { func (m *statusPanel) initialize() { defer m.Initialize() - m.Grid().Attach(m.createMainBox(), 1, 0, 4, 1) - m.Grid().Attach(m.createPrintButton(), 1, 1, 1, 1) - m.Grid().Attach(m.createPauseButton(), 2, 1, 1, 1) - m.Grid().Attach(m.createStopButton(), 3, 1, 1, 1) + m.Grid().Attach(m.createMainBox(), 1, 0, 4, 2) } func (m *statusPanel) createProgressBar() *gtk.ProgressBar { m.pb = MustProgressBar() m.pb.SetShowText(true) - m.pb.SetMarginTop(10) - m.pb.SetMarginStart(10) - m.pb.SetMarginEnd(10) + m.pb.SetMarginTop(12) + m.pb.SetMarginStart(5) + m.pb.SetMarginEnd(5) + m.pb.SetMarginBottom(17) return m.pb } @@ -56,50 +53,49 @@ func (m *statusPanel) createMainBox() *gtk.Box { grid := MustGrid() grid.SetHExpand(true) grid.Add(m.createInfoBox()) - grid.Add(m.createTemperatureBox()) + grid.SetVAlign(gtk.ALIGN_START) + grid.SetMarginTop(20) + + butt := MustBox(gtk.ORIENTATION_HORIZONTAL, 5) + butt.SetHAlign(gtk.ALIGN_END) + butt.SetVAlign(gtk.ALIGN_END) + butt.SetVExpand(true) + butt.SetMarginTop(5) + butt.SetMarginEnd(5) + butt.Add(m.createPrintButton()) + butt.Add(m.createPauseButton()) + butt.Add(m.createStopButton()) + butt.Add(MustButton(MustImageFromFileWithSize("back.svg", 40, 40), m.UI.GoHistory)) box := MustBox(gtk.ORIENTATION_VERTICAL, 5) - box.SetVAlign(gtk.ALIGN_CENTER) + box.SetVAlign(gtk.ALIGN_START) box.SetVExpand(true) box.Add(grid) box.Add(m.createProgressBar()) - + box.Add(butt) return box } func (m *statusPanel) createInfoBox() *gtk.Box { m.file = MustLabelWithImage("file.svg", "") m.left = MustLabelWithImage("speed-step.svg", "") + m.bed = MustLabelWithImage("bed.svg", "") + m.tool0 = MustLabelWithImage("extruder.svg", "") info := MustBox(gtk.ORIENTATION_VERTICAL, 5) info.SetHAlign(gtk.ALIGN_START) info.SetHExpand(true) - info.SetVExpand(true) info.Add(m.file) info.Add(m.left) - info.SetMarginStart(10) + info.Add(m.tool0) + info.Add(m.bed) + info.SetMarginStart(20) return info } -func (m *statusPanel) createTemperatureBox() *gtk.Box { - m.bed = MustLabelWithImage("bed.svg", "") - m.tool0 = MustLabelWithImage("extruder.svg", "") - m.tool1 = MustLabelWithImage("extruder.svg", "") - - temp := MustBox(gtk.ORIENTATION_VERTICAL, 5) - temp.SetHAlign(gtk.ALIGN_START) - temp.SetHExpand(true) - temp.SetVExpand(true) - temp.Add(m.bed) - temp.Add(m.tool0) - temp.Add(m.tool1) - - return temp -} - func (m *statusPanel) createPrintButton() gtk.IWidget { - m.print = MustButtonImage("Print", "status.svg", func() { + m.print = MustButton(MustImageFromFileWithSize("status.svg", 40, 40), func() { defer m.updateTemperature() Logger.Warning("Starting a new job") @@ -113,7 +109,7 @@ func (m *statusPanel) createPrintButton() gtk.IWidget { } func (m *statusPanel) createPauseButton() gtk.IWidget { - m.pause = MustButtonImage("Pause", "pause.svg", func() { + m.pause = MustButton(MustImageFromFileWithSize("pause.svg", 40, 40), func() { defer m.updateTemperature() Logger.Warning("Pausing/Resuming job") @@ -128,7 +124,7 @@ func (m *statusPanel) createPauseButton() gtk.IWidget { } func (m *statusPanel) createStopButton() gtk.IWidget { - m.stop = MustButtonImage("Stop", "stop.svg", func() { + m.stop = MustButton(MustImageFromFileWithSize("stop.svg", 40, 40), func() { defer m.updateTemperature() Logger.Warning("Stopping job") @@ -155,17 +151,13 @@ func (m *statusPanel) updateTemperature() { m.doUpdateState(&s.State) - m.tool1.Hide() for tool, s := range s.Temperature.Current { - text := fmt.Sprintf("%s: %.0f°C / %.0f°C", strings.Title(tool), s.Actual, s.Target) + text := fmt.Sprintf("%.0f°C ⇒ %.0f°C ", s.Actual, s.Target) switch tool { case "bed": m.bed.Label.SetLabel(text) case "tool0": m.tool0.Label.SetLabel(text) - case "tool1": - m.tool1.Label.SetLabel(text) - m.tool1.Show() } } } @@ -178,8 +170,7 @@ func (m *statusPanel) doUpdateState(s *octoprint.PrinterState) { m.stop.SetSensitive(true) case s.Flags.Paused: m.print.SetSensitive(false) - m.pause.SetLabel("Resume") - m.pause.SetImage(MustImageFromFile("resume.svg")) + m.pause.SetImage(MustImageFromFileWithSize("resume.svg", 40, 40)) m.pause.SetSensitive(true) m.stop.SetSensitive(true) return @@ -193,8 +184,7 @@ func (m *statusPanel) doUpdateState(s *octoprint.PrinterState) { m.stop.SetSensitive(false) } - m.pause.SetLabel("Pause") - m.pause.SetImage(MustImageFromFile("pause.svg")) + m.pause.SetImage(MustImageFromFileWithSize("pause.svg", 40, 40)) } func (m *statusPanel) updateJob() { @@ -204,12 +194,12 @@ func (m *statusPanel) updateJob() { return } - file := "not-set" + file := "File not set" if s.Job.File.Name != "" { - file = filenameEllipsis(s.Job.File.Name) + file = filenameEllipsis_long(s.Job.File.Name) } - m.file.Label.SetLabel(fmt.Sprintf("File: %s", file)) + m.file.Label.SetLabel(fmt.Sprintf("%s", file)) m.pb.SetFraction(s.Progress.Completion / 100) if m.UI.State.IsOperational() { @@ -220,13 +210,13 @@ func (m *statusPanel) updateJob() { var text string switch s.Progress.Completion { case 100: - text = fmt.Sprintf("Job Completed in %s", time.Duration(int64(s.Job.LastPrintTime)*1e9)) + text = fmt.Sprintf("Completed in %s", time.Duration(int64(s.Job.LastPrintTime)*1e9)) case 0: text = "Warming up ..." default: e := time.Duration(int64(s.Progress.PrintTime) * 1e9) l := time.Duration(int64(s.Progress.PrintTimeLeft) * 1e9) - text = fmt.Sprintf("Elapsed/Left: %s / %s", e, l) + text = fmt.Sprintf("Elapsed: %s / Left: %s", e, l) if l == 0 { text = fmt.Sprintf("Elapsed: %s", e) } @@ -235,9 +225,26 @@ func (m *statusPanel) updateJob() { m.left.Label.SetLabel(text) } +func filenameEllipsis_long(name string) string { + if len(name) > 35 { + return name[:32] + "…" + } + + return name +} + func filenameEllipsis(name string) string { - if len(name) > 26 { - return name[:23] + "..." + if len(name) > 31 { + return name[:28] + "…" + } + + return name +} + + +func filenameEllipsis_short(name string) string { + if len(name) > 27 { + return name[:24] + "…" } return name diff --git a/ui/system.go b/ui/system.go index 6f51367..a46d7c6 100644 --- a/ui/system.go +++ b/ui/system.go @@ -101,7 +101,7 @@ func (m *systemPanel) createInfoBox() gtk.IWidget { main.SetHExpand(true) main.SetHAlign(gtk.ALIGN_CENTER) main.SetVExpand(true) - main.Add(MustImageFromFileWithSize("octoprint-logo.png", 140, 140)) + // main.Add(MustImageFromFileWithSize("octoprint-logo.png", 140, 140)) info := MustBox(gtk.ORIENTATION_VERTICAL, 0) info.SetVExpand(true) diff --git a/ui/temperature.go b/ui/temperature.go index 4f9f617..6aee7b0 100644 --- a/ui/temperature.go +++ b/ui/temperature.go @@ -39,19 +39,20 @@ func TemperaturePanel(ui *UI, parent Panel) Panel { func (m *temperaturePanel) initialize() { defer m.Initialize() + m.Grid().Attach(m.createChangeButton("Decrease", "decrease.svg", -1), 1, 1, 1, 1) m.Grid().Attach(m.createChangeButton("Increase", "increase.svg", 1), 1, 0, 1, 1) - m.Grid().Attach(m.createChangeButton("Decrease", "decrease.svg", -1), 4, 0, 1, 1) - m.box = MustBox(gtk.ORIENTATION_VERTICAL, 5) + m.box = MustBox(gtk.ORIENTATION_VERTICAL, 8) m.box.SetVAlign(gtk.ALIGN_CENTER) m.box.SetMarginStart(10) - m.Grid().Attach(m.box, 2, 0, 2, 1) + m.Grid().Attach(m.box, 2, 0, 3, 1) - m.Grid().Attach(m.createToolButton(), 1, 1, 1, 1) - m.amount = MustStepButton("move-step.svg", Step{"5°C", 5.}, Step{"10°C", 10.}, Step{"1°C", 1.}) - m.Grid().Attach(m.amount, 2, 1, 1, 1) + m.Grid().Attach(m.createToolButton(), 2, 1, 1, 1) + m.amount = MustStepButton("move-step.svg", Step{"10°C", 10.}, Step{"5°C", 5.}, Step{"1°C", 1.}) + m.Grid().Attach(m.amount, 3, 1, 1, 1) - m.Grid().Attach(MustButtonImage("Profiles", "heat-up.svg", m.profilePanel), 3, 1, 1, 1) + // m.Grid().Attach(MustButtonImage("Profiles", "heat-up.svg", m.profilesPanel), 3, 1, 1, 1) + m.Grid().Attach(MustButtonImage("Back", "back.svg", m.UI.GoHistory), 4, 1, 1, 1) } func (m *temperaturePanel) createToolButton() *StepButton { @@ -89,7 +90,7 @@ func (m *temperaturePanel) increaseTarget(tool string, value float64) error { target = 0 } - Logger.Infof("Setting target temperature for %s to %1.f°C.", tool, target) + Logger.Infof("Setting %s to %1.f°C", tool, target) return m.setTarget(tool, target) } @@ -111,7 +112,7 @@ func (m *temperaturePanel) getToolTarget(tool string) (float64, error) { current, ok := s.Temperature.Current[tool] if !ok { - return -1, fmt.Errorf("unable to find tool %q", tool) + return -1, fmt.Errorf("unable to find %q", tool) } return current.Target, nil @@ -153,19 +154,15 @@ func (m *temperaturePanel) addNewTool(tool string) { m.tool.AddStep(Step{strings.Title(tool), tool}) m.tool.Callback() - Logger.Infof("New tool detected %s", tool) + Logger.Infof("Tool detected: %s", tool) } func (m *temperaturePanel) loadTemperatureData(tool string, d *octoprint.TemperatureData) { - text := fmt.Sprintf("%s: %.1f°C / %.1f°C", strings.Title(tool), d.Actual, d.Target) + text := fmt.Sprintf("%s: %.1f°C ⇒ %.1f°C", strings.Title(tool), d.Actual, d.Target) m.labels[tool].Label.SetText(text) m.labels[tool].ShowAll() } -func (m *temperaturePanel) profilePanel() { - m.UI.Add(ProfilesPanel(m.UI, m)) -} - var profilePanelInstance *profilesPanel type profilesPanel struct { @@ -185,21 +182,39 @@ func ProfilesPanel(ui *UI, parent Panel) Panel { func (m *profilesPanel) initialize() { defer m.Initialize() m.loadProfiles() + + m.Grid().Attach(MustButtonImage("Temp", "settings.svg", m.temperaturePanel), 3, 1, 1, 1) + m.Grid().Attach(MustButtonImage("Back", "back.svg", m.UI.GoHistory), 4, 1, 1, 1) } func (m *profilesPanel) loadProfiles() { - s, err := (&octoprint.SettingsRequest{}).Do(m.UI.Printer) - if err != nil { - Logger.Error(err) - return - } - - for _, profile := range s.Temperature.Profiles { - m.AddButton(m.createProfileButton("filament.svg", profile)) - } - + // s, err := (&octoprint.SettingsRequest{}).Do(m.UI.Printer) + // if err != nil { + // Logger.Error(err) + // return + // } + + // for _, profile := range s.Temperature.Profiles { + // m.AddButton(m.createProfileButton("filament.svg", profile)) + // } + + m.AddButton(m.createProfileButton("heat-up.svg", &octoprint.TemperatureProfile{ + Name: "PLA", + Bed: 60, + Extruder: 215, + })) + m.AddButton(m.createProfileButton("heat-up.svg", &octoprint.TemperatureProfile{ + Name: "PETG", + Bed: 85, + Extruder: 230, + })) + m.AddButton(m.createProfileButton("heat-up.svg", &octoprint.TemperatureProfile{ + Name: "ABS", + Bed: 100, + Extruder: 255, + })) m.AddButton(m.createProfileButton("cool-down.svg", &octoprint.TemperatureProfile{ - Name: "Cool Down", + Name: "Cool", Bed: 0, Extruder: 0, })) @@ -207,24 +222,24 @@ func (m *profilesPanel) loadProfiles() { func (m *profilesPanel) createProfileButton(img string, p *octoprint.TemperatureProfile) gtk.IWidget { return MustButtonImage(p.Name, img, func() { - Logger.Warningf("Setting temperature profile %s.", p.Name) + Logger.Warningf("Setting profile: %s", p.Name) if err := m.setProfile(p); err != nil { Logger.Error(err) } }) } -func (m *profilesPanel) setProfile(p *octoprint.TemperatureProfile) error { - for tool := range temperaturePanelInstance.labels { - temp := p.Extruder - if tool == "bed" { - temp = p.Bed - } - - if err := temperaturePanelInstance.setTarget(tool, temp); err != nil { - return err - } - } +func (m *profilesPanel) setProfile(p *octoprint.TemperatureProfile) error { + + cmd := &octoprint.ToolTargetRequest{Targets: map[string]float64{"tool0": p.Extruder}} + cmd.Do(m.UI.Printer) + cmd_bed := &octoprint.BedTargetRequest{Target: p.Bed} + cmd_bed.Do(m.UI.Printer) return nil } + + +func (m *profilesPanel) temperaturePanel() { + m.UI.Add(TemperaturePanel(m.UI, m)) +} \ No newline at end of file diff --git a/ui/ui.go b/ui/ui.go index e64d518..88b780f 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -15,8 +15,8 @@ import ( var ( StylePath string WindowName = "OctoPrint-TFT" - WindowHeight = 320 - WindowWidth = 480 + WindowHeight = 240 + WindowWidth = 320 ) const ( @@ -165,7 +165,7 @@ func (ui *UI) errToUser(err error) string { text := err.Error() if strings.Contains(text, "connection refused") { return fmt.Sprintf( - "Unable to connect to %q (Key: %v), \nmaybe OctoPrint not running?", + "Unable to connect to %q (Key: %v)", ui.Printer.Endpoint, ui.Printer.APIKey != "", ) } From 6503b768cb1e54232de1b173309808248b2b06c1 Mon Sep 17 00:00:00 2001 From: Nico Hirsch <30938717+noxhirsch@users.noreply.github.com> Date: Thu, 13 Dec 2018 22:51:34 +0100 Subject: [PATCH 02/30] Add files via upload --- styles/default/style.css | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/styles/default/style.css b/styles/default/style.css index c847e9e..c68601d 100644 --- a/styles/default/style.css +++ b/styles/default/style.css @@ -1,16 +1,42 @@ -.dialog { border: 2px solid black; } +.dialog { border: 2px solid #333333; } .notification { background-clip: padding-box; padding: 5px; - border-radius: 0 0 5px 5px; + border-radius: 0; opacity: 0.8; } .warning { - background-color:rgba(30, 204, 39, 0.7); + background-color:rgba(23, 153, 29, 0.7); } .error { - background-color:rgba(204, 30, 30, 0.7); + background-color:rgba(165, 23, 23, 0.7); } + +GtkWindow { + background-color: #000000; +} + +GtkButton { + background-image: none; + background-color:#101010; + /*border:0;*/ + margin:2px; + border-radius:0; +} + +.scrollbar { + -GtkRange-slider-width: 4px; +} + +.slider{ + border-radius:0; + border-width:0; +} + +.progress, .trough{ + border-radius:0; + border-width:0; +} \ No newline at end of file From 3f8dae1c0f6ea9ceea2d9084cf9e678713fd4ec7 Mon Sep 17 00:00:00 2001 From: Nico Hirsch <30938717+noxhirsch@users.noreply.github.com> Date: Thu, 13 Dec 2018 22:52:37 +0100 Subject: [PATCH 03/30] Add files via upload --- styles/default/images/back.svg | 2 +- styles/default/images/bed.svg | 8 +- styles/default/images/calibrate.svg | 12 +- styles/default/images/control.svg | 4 +- styles/default/images/cool-down.svg | 112 +++++------------- styles/default/images/decrease.svg | 2 +- styles/default/images/delete.svg | 19 ++++ styles/default/images/extrude.svg | 4 +- styles/default/images/extruder.svg | 2 +- styles/default/images/fan-off.svg | 2 +- styles/default/images/fan-on.svg | 2 +- styles/default/images/filament.svg | 4 +- styles/default/images/filament_clean.svg | 37 ++++++ styles/default/images/file.svg | 8 +- styles/default/images/files.svg | 139 +++++------------------ styles/default/images/heat-up.svg | 4 +- styles/default/images/home-x.svg | 4 +- styles/default/images/home-y.svg | 4 +- styles/default/images/home-z.svg | 4 +- styles/default/images/home.svg | 2 +- styles/default/images/increase.svg | 2 +- styles/default/images/load.svg | 2 +- styles/default/images/motor-off.svg | 4 +- styles/default/images/move-step.svg | 6 +- styles/default/images/move-x+.svg | 2 +- styles/default/images/move-x-.svg | 2 +- styles/default/images/move-y+.svg | 2 +- styles/default/images/move-y-.svg | 2 +- styles/default/images/move-z+.svg | 2 +- styles/default/images/move-z-.svg | 2 +- styles/default/images/move.svg | 2 +- styles/default/images/pause.svg | 4 +- styles/default/images/print.svg | 2 +- styles/default/images/reboot.svg | 2 +- styles/default/images/refresh.svg | 4 +- styles/default/images/resume.svg | 4 +- styles/default/images/retract.svg | 4 +- styles/default/images/sd.svg | 8 +- styles/default/images/sd_eject.svg | 16 +-- styles/default/images/settings.svg | 2 +- styles/default/images/speed-step.svg | 2 +- styles/default/images/status.svg | 8 +- styles/default/images/stop.svg | 2 +- 43 files changed, 188 insertions(+), 273 deletions(-) create mode 100644 styles/default/images/delete.svg create mode 100644 styles/default/images/filament_clean.svg diff --git a/styles/default/images/back.svg b/styles/default/images/back.svg index 1ac347b..95979c1 100644 --- a/styles/default/images/back.svg +++ b/styles/default/images/back.svg @@ -84,7 +84,7 @@ inkscape:connector-curvature="0" id="path7561" d="m 38.323568,26.061953 -17.56836,17.787109 17.78711,17.56836 7.027343,-7.115235 -5.699218,-5.628906 h 20.740234 v -10 h -20.6875 l 5.515625,-5.583984 z" - style="fill:none;fill-rule:evenodd;stroke:#fbb351;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:none;fill-rule:evenodd;stroke:#ff670f;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> diff --git a/styles/default/images/bed.svg b/styles/default/images/bed.svg index 3061587..01e8475 100644 --- a/styles/default/images/bed.svg +++ b/styles/default/images/bed.svg @@ -84,25 +84,25 @@ inkscape:connector-curvature="0" id="path4434" d="m 32.825393,25.942337 c 0,0 4.297062,4.866713 4.079832,7.62116 -0.16145,2.047151 -3.752831,3.272536 -3.898507,5.320432 -0.15243,2.142847 3.189558,3.750169 3.263866,5.895614 0.08507,2.456252 -3.196392,4.445587 -3.263866,6.902183 -0.06368,2.318578 2.719888,6.614591 2.719888,6.614591" - style="fill:none;fill-rule:evenodd;stroke:#fbb351;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:none;fill-rule:evenodd;stroke:#ff670f;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:none;fill-rule:evenodd;stroke:#ff670f;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:none;fill-rule:evenodd;stroke:#ff670f;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:none;fill-rule:evenodd;stroke:#ff670f;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> diff --git a/styles/default/images/calibrate.svg b/styles/default/images/calibrate.svg index f4ed49c..b476ab2 100644 --- a/styles/default/images/calibrate.svg +++ b/styles/default/images/calibrate.svg @@ -84,36 +84,36 @@ inkscape:connector-curvature="0" id="path7561-4" d="m 7.548005,19.993455 8.214692,-7.874475 8.30088,7.792715 -3.286059,3.149792 -2.659605,-2.496887 0.110498,9.190042 -4.670963,0.05054 -0.110217,-9.166674 -2.578872,2.472206 -3.320354,-3.117258 z" - style="fill:#232323;fill-opacity:1;fill-rule:evenodd;stroke:#fbb351;stroke-width:1.36491191;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:#232323;fill-opacity:1;fill-rule:evenodd;stroke:#ff670f;stroke-width:1.36491191;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:#ff670f;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:#ff670f;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:#232323;fill-opacity:1;fill-rule:evenodd;stroke:#ff670f;stroke-width:1.36491191;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:#232323;fill-opacity:1;fill-rule:evenodd;stroke:#ff670f;stroke-width:1.36491191;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:#232323;fill-opacity:1;fill-rule:evenodd;stroke:#ff670f;stroke-width:1.36491191;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="display:inline;fill:#ff670f;fill-opacity:1;fill-rule:evenodd;stroke:#ff670f;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + style="fill:none;fill-rule:evenodd;stroke:#ff670f;stroke-width:9;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - + + + + + + + + + + + + + + + + diff --git a/styles/default/images/decrease.svg b/styles/default/images/decrease.svg index 8b21482..44b4f58 100644 --- a/styles/default/images/decrease.svg +++ b/styles/default/images/decrease.svg @@ -84,7 +84,7 @@ inkscape:connector-curvature="0" id="path4535" d="m 21.25,39.535714 h 40 v 10 h -40 z" - style="fill:none;fill-rule:evenodd;stroke:#fbb351;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:none;fill-rule:evenodd;stroke:#ff670f;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> diff --git a/styles/default/images/delete.svg b/styles/default/images/delete.svg new file mode 100644 index 0000000..74f4d52 --- /dev/null +++ b/styles/default/images/delete.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + diff --git a/styles/default/images/extrude.svg b/styles/default/images/extrude.svg index 42fad68..3cd3f6a 100644 --- a/styles/default/images/extrude.svg +++ b/styles/default/images/extrude.svg @@ -107,7 +107,7 @@ inkscape:connector-curvature="0" id="path4710-2" d="m 29.752599,64.146236 3.756999,5.270354 3.638377,-5.270354 z" - style="display:inline;fill:none;fill-rule:evenodd;stroke:#fbb351;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="display:inline;fill:none;fill-rule:evenodd;stroke:#ff670f;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="display:inline;fill:#ff670f;fill-opacity:1;fill-rule:evenodd;stroke:#ff670f;stroke-width:2.73126698;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> diff --git a/styles/default/images/extruder.svg b/styles/default/images/extruder.svg index c388d4a..0a8a03e 100644 --- a/styles/default/images/extruder.svg +++ b/styles/default/images/extruder.svg @@ -79,7 +79,7 @@ inkscape:connector-curvature="0" id="path4710" d="M 25.836759,53.108992 40.228325,69.155562 54.1655,53.108992 Z" - style="fill:none;fill-rule:evenodd;stroke:#fbb351;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:none;fill-rule:evenodd;stroke:#ff670f;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:none;fill-opacity:1;stroke:#ff670f;stroke-width:2.81566715;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> diff --git a/styles/default/images/fan-on.svg b/styles/default/images/fan-on.svg index fe8a7b5..beb5d9e 100644 --- a/styles/default/images/fan-on.svg +++ b/styles/default/images/fan-on.svg @@ -117,7 +117,7 @@ cy="43.547615" cx="39.822281" id="path5114" - style="fill:none;fill-opacity:1;stroke:#fbb351;stroke-width:2.81566715;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:none;fill-opacity:1;stroke:#ff670f;stroke-width:2.81566715;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="display:inline;fill:none;fill-rule:evenodd;stroke:#ff670f;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="display:inline;fill:#ff670f;fill-opacity:1;fill-rule:evenodd;stroke:#ff670f;stroke-width:2.73126698;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> diff --git a/styles/default/images/filament_clean.svg b/styles/default/images/filament_clean.svg new file mode 100644 index 0000000..04a287a --- /dev/null +++ b/styles/default/images/filament_clean.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/styles/default/images/file.svg b/styles/default/images/file.svg index 74521b5..9df1597 100644 --- a/styles/default/images/file.svg +++ b/styles/default/images/file.svg @@ -82,22 +82,22 @@ inkscape:connector-curvature="0" id="path6012-9" d="m 40.255032,17.515472 v 10 h 9" - style="display:inline;opacity:1;fill:#fbb351;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="display:inline;opacity:1;fill:#ff670f;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:none;fill-rule:evenodd;stroke:#ff670f;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="display:inline;opacity:1;fill:none;fill-rule:evenodd;stroke:#ff670f;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="display:inline;opacity:1;fill:none;fill-rule:evenodd;stroke:#ff670f;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> diff --git a/styles/default/images/files.svg b/styles/default/images/files.svg index 2330c87..a762e8e 100644 --- a/styles/default/images/files.svg +++ b/styles/default/images/files.svg @@ -1,110 +1,29 @@ - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + diff --git a/styles/default/images/heat-up.svg b/styles/default/images/heat-up.svg index 6bca096..ea7b9ec 100644 --- a/styles/default/images/heat-up.svg +++ b/styles/default/images/heat-up.svg @@ -80,14 +80,14 @@ cy="97.833321" cx="-7.0827856" id="path4837" - style="fill:#d7b351;fill-opacity:1;stroke:#d7b351;stroke-width:1.99953949;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:#ff670f;fill-opacity:1;stroke:#ff670f;stroke-width:1.99953949;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:#ff670f;fill-opacity:1;stroke:#ff670f;stroke-width:2.81615663;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> diff --git a/styles/default/images/home-x.svg b/styles/default/images/home-x.svg index 4964eaf..00b8506 100644 --- a/styles/default/images/home-x.svg +++ b/styles/default/images/home-x.svg @@ -85,13 +85,13 @@ inkscape:connector-curvature="0" id="path7561-4" d="M 50.958201,63.223502 33.122106,45.704877 50.640734,27.868782 l 7.134442,7.007842 -5.613196,5.714691 20.737849,-0.314541 0.151657,9.99885 -20.68512,0.313741 5.599675,5.499693 z" - style="fill:#232323;fill-opacity:1;fill-rule:evenodd;stroke:#fbb351;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:#232323;fill-opacity:1;fill-rule:evenodd;stroke:#ff670f;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:#ff670f;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> diff --git a/styles/default/images/home-y.svg b/styles/default/images/home-y.svg index 4be91ad..11d3384 100644 --- a/styles/default/images/home-y.svg +++ b/styles/default/images/home-y.svg @@ -85,14 +85,14 @@ inkscape:connector-curvature="0" id="path7561-4" d="M 59.591359,39.025291 41.881524,56.671543 24.235271,38.961705 l 7.084326,-7.058501 5.653863,5.67446 -0.09102,-20.740035 9.999904,-0.04389 0.09079,20.6873 5.559723,-5.540077 7.058503,7.084325 z" - style="fill:#232323;fill-opacity:1;fill-rule:evenodd;stroke:#fbb351;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:#232323;fill-opacity:1;fill-rule:evenodd;stroke:#ff670f;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:#ff670f;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> diff --git a/styles/default/images/home-z.svg b/styles/default/images/home-z.svg index 6cc5d62..33728f9 100644 --- a/styles/default/images/home-z.svg +++ b/styles/default/images/home-z.svg @@ -84,14 +84,14 @@ inkscape:connector-curvature="0" id="path7561-4" d="M 56.941331,35.239568 39.355752,53.009653 21.585667,35.424072 l 7.034623,-7.108037 5.693541,5.634648 -0.236549,-20.738885 9.99935,-0.114053 0.235947,20.686154 5.520713,-5.578953 z" - style="fill:#232323;fill-opacity:1;fill-rule:evenodd;stroke:#fbb351;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:#232323;fill-opacity:1;fill-rule:evenodd;stroke:#ff670f;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:#ff670f;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> diff --git a/styles/default/images/home.svg b/styles/default/images/home.svg index c9f7cd9..3c708e9 100644 --- a/styles/default/images/home.svg +++ b/styles/default/images/home.svg @@ -69,7 +69,7 @@ style="display:inline;opacity:1" id="g37"> + style="fill:none;fill-rule:evenodd;stroke:#ff670f;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> diff --git a/styles/default/images/motor-off.svg b/styles/default/images/motor-off.svg index ffa9e7a..100f0c5 100644 --- a/styles/default/images/motor-off.svg +++ b/styles/default/images/motor-off.svg @@ -85,14 +85,14 @@ inkscape:connector-curvature="0" id="path4535" d="M 39.382891,38.886141 57.933077,66.678837 49.659078,72.294968 31.108892,44.502272 30.826474,35.633291 Z" - style="fill:#fbb351;fill-opacity:1;fill-rule:evenodd;stroke:#fbb351;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:#ff670f;fill-opacity:1;fill-rule:evenodd;stroke:#ff670f;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:#ff670f;fill-opacity:1;stroke-width:3;stroke-miterlimit:4;stroke-dasharray:none" /> + style="display:inline;fill:#ff670f;fill-opacity:1;fill-rule:evenodd;stroke:#ff670f;stroke-width:2.27288914;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="display:inline;fill:#ff670f;fill-opacity:1;fill-rule:evenodd;stroke:#ff670f;stroke-width:2.27288914;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="display:inline;fill:#ff670f;fill-opacity:1;fill-rule:evenodd;stroke:#ff670f;stroke-width:2.27288914;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> diff --git a/styles/default/images/move-x+.svg b/styles/default/images/move-x+.svg index 74d9c33..616127e 100644 --- a/styles/default/images/move-x+.svg +++ b/styles/default/images/move-x+.svg @@ -85,7 +85,7 @@ inkscape:connector-curvature="0" id="path7561-4" d="M 51.280343,63.044931 69.116438,45.526306 51.59781,27.690211 l -7.134442,7.007842 5.613196,5.714691 -20.737849,-0.314541 -0.151657,9.99885 20.68512,0.313741 -5.599675,5.499693 z" - style="fill:#232323;fill-opacity:1;fill-rule:evenodd;stroke:#fbb351;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:#232323;fill-opacity:1;fill-rule:evenodd;stroke:#ff670f;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> diff --git a/styles/default/images/move-x-.svg b/styles/default/images/move-x-.svg index d4d693a..540faa5 100644 --- a/styles/default/images/move-x-.svg +++ b/styles/default/images/move-x-.svg @@ -85,7 +85,7 @@ inkscape:connector-curvature="0" id="path7561-4" d="M 27.922487,63.044931 10.086392,45.526306 27.60502,27.690211 l 7.134442,7.007842 -5.613196,5.714691 20.737849,-0.314541 0.151657,9.99885 -20.68512,0.313741 5.599675,5.499693 z" - style="fill:#232323;fill-opacity:1;fill-rule:evenodd;stroke:#fbb351;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:#232323;fill-opacity:1;fill-rule:evenodd;stroke:#ff670f;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> diff --git a/styles/default/images/move-y+.svg b/styles/default/images/move-y+.svg index b7b17c0..63ea771 100644 --- a/styles/default/images/move-y+.svg +++ b/styles/default/images/move-y+.svg @@ -84,7 +84,7 @@ inkscape:connector-curvature="0" id="path7561-4-3" d="M 58.029325,30.86777 40.443746,13.097685 22.673661,30.683266 l 7.034623,7.108037 5.693541,-5.634648 -0.236549,20.738885 9.99935,0.114053 0.235947,-20.686154 5.520713,5.578953 z" - style="fill:#232323;fill-opacity:1;fill-rule:evenodd;stroke:#fbb351;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:#232323;fill-opacity:1;fill-rule:evenodd;stroke:#ff670f;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> diff --git a/styles/default/images/move-y-.svg b/styles/default/images/move-y-.svg index 75ee5cd..ae926a1 100644 --- a/styles/default/images/move-y-.svg +++ b/styles/default/images/move-y-.svg @@ -85,7 +85,7 @@ inkscape:connector-curvature="0" id="path7561-4" d="M 58.029325,51.229977 40.443746,69.000062 22.673661,51.414481 l 7.034623,-7.108037 5.693541,5.634648 -0.236549,-20.738885 9.99935,-0.114053 0.235947,20.686154 5.520713,-5.578953 z" - style="fill:#232323;fill-opacity:1;fill-rule:evenodd;stroke:#fbb351;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:#232323;fill-opacity:1;fill-rule:evenodd;stroke:#ff670f;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> diff --git a/styles/default/images/move-z+.svg b/styles/default/images/move-z+.svg index 9d55d3f..4bb4f4b 100644 --- a/styles/default/images/move-z+.svg +++ b/styles/default/images/move-z+.svg @@ -84,7 +84,7 @@ inkscape:connector-curvature="0" id="path7561-4" d="M 58.029325,30.86777 40.443746,13.097685 22.673661,30.683266 l 7.034623,7.108037 5.693541,-5.634648 -0.236549,20.738885 9.99935,0.114053 0.235947,-20.686154 5.520713,5.578953 z" - style="fill:#232323;fill-opacity:1;fill-rule:evenodd;stroke:#fbb351;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:#232323;fill-opacity:1;fill-rule:evenodd;stroke:#ff670f;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> diff --git a/styles/default/images/move-z-.svg b/styles/default/images/move-z-.svg index 0711a44..4c838f2 100644 --- a/styles/default/images/move-z-.svg +++ b/styles/default/images/move-z-.svg @@ -85,7 +85,7 @@ inkscape:connector-curvature="0" id="path7561-4-3" d="M 58.029325,54.858544 40.443746,72.628629 22.673661,55.043048 l 7.034623,-7.108037 5.693541,5.634648 -0.236549,-20.738885 9.99935,-0.114053 0.235947,20.686154 5.520713,-5.578953 z" - style="fill:#232323;fill-opacity:1;fill-rule:evenodd;stroke:#fbb351;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:#232323;fill-opacity:1;fill-rule:evenodd;stroke:#ff670f;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> diff --git a/styles/default/images/move.svg b/styles/default/images/move.svg index baef42d..8ee9a0d 100644 --- a/styles/default/images/move.svg +++ b/styles/default/images/move.svg @@ -85,7 +85,7 @@ cy="38.997379" cx="-43.947254" id="path8128" - style="fill:#fbb351;fill-opacity:1;fill-rule:nonzero;stroke:#fbb351;stroke-width:2.35894179;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:#ff670f;fill-opacity:1;fill-rule:nonzero;stroke:#ff670f;stroke-width:2.35894179;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:none;fill-rule:evenodd;stroke:#ff670f;stroke-width:2.28880167;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:none;fill-rule:evenodd;stroke:#ff670f;stroke-width:2.28880167;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> diff --git a/styles/default/images/print.svg b/styles/default/images/print.svg index 1ac347b..95979c1 100644 --- a/styles/default/images/print.svg +++ b/styles/default/images/print.svg @@ -84,7 +84,7 @@ inkscape:connector-curvature="0" id="path7561" d="m 38.323568,26.061953 -17.56836,17.787109 17.78711,17.56836 7.027343,-7.115235 -5.699218,-5.628906 h 20.740234 v -10 h -20.6875 l 5.515625,-5.583984 z" - style="fill:none;fill-rule:evenodd;stroke:#fbb351;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:none;fill-rule:evenodd;stroke:#ff670f;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> diff --git a/styles/default/images/reboot.svg b/styles/default/images/reboot.svg index 63810fa..6adc336 100644 --- a/styles/default/images/reboot.svg +++ b/styles/default/images/reboot.svg @@ -84,7 +84,7 @@ inkscape:connector-curvature="0" id="path4157" d="M 32.036928,11.024487 V 32.457702" - style="fill:none;fill-rule:evenodd;stroke:#fbb351;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:none;fill-rule:evenodd;stroke:#ff670f;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> diff --git a/styles/default/images/refresh.svg b/styles/default/images/refresh.svg index 1cdb0db..3cb02ea 100644 --- a/styles/default/images/refresh.svg +++ b/styles/default/images/refresh.svg @@ -103,7 +103,7 @@ inkscape:transform-center-x="3.8692967" inkscape:transform-center-y="1.5048666" /> + style="fill:none;fill-rule:evenodd;stroke:#ff670f;stroke-width:2.28880167;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:none;fill-rule:evenodd;stroke:#ff670f;stroke-width:2.95693779;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> diff --git a/styles/default/images/retract.svg b/styles/default/images/retract.svg index 481a0e2..3a5cf89 100644 --- a/styles/default/images/retract.svg +++ b/styles/default/images/retract.svg @@ -107,7 +107,7 @@ inkscape:connector-curvature="0" id="path4710-2" d="m 29.752599,64.146236 3.756999,5.270354 3.638377,-5.270354 z" - style="display:inline;fill:none;fill-rule:evenodd;stroke:#fbb351;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="display:inline;fill:none;fill-rule:evenodd;stroke:#ff670f;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="display:inline;fill:#ff670f;fill-opacity:1;fill-rule:evenodd;stroke:#ff670f;stroke-width:2.73126698;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> diff --git a/styles/default/images/sd.svg b/styles/default/images/sd.svg index 7b866fb..1712312 100644 --- a/styles/default/images/sd.svg +++ b/styles/default/images/sd.svg @@ -83,28 +83,28 @@ height="11" width="2" id="rect4378" - style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#fbb351;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ff670f;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ff670f;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ff670f;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ff670f;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> diff --git a/styles/default/images/sd_eject.svg b/styles/default/images/sd_eject.svg index fba90f6..781bfea 100644 --- a/styles/default/images/sd_eject.svg +++ b/styles/default/images/sd_eject.svg @@ -83,28 +83,28 @@ height="11" width="2" id="rect4378" - style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#fbb351;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ff670f;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ff670f;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ff670f;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ff670f;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:none;fill-rule:evenodd;stroke:#ff670f;stroke-width:1.94661856;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:none;fill-rule:evenodd;stroke:#ff670f;stroke-width:2.95693779;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> diff --git a/styles/default/images/settings.svg b/styles/default/images/settings.svg index 28cabd9..b226680 100644 --- a/styles/default/images/settings.svg +++ b/styles/default/images/settings.svg @@ -87,7 +87,7 @@ diff --git a/styles/default/images/speed-step.svg b/styles/default/images/speed-step.svg index 8e3b1f8..5ae5964 100644 --- a/styles/default/images/speed-step.svg +++ b/styles/default/images/speed-step.svg @@ -122,7 +122,7 @@ inkscape:connector-curvature="0" id="path4242" d="m 43.310553,48.055281 -1.497561,-3.709086 14.65785,-3.761307 z" - style="fill:#fbb351;fill-opacity:1;fill-rule:evenodd;stroke:#fbb351;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" /> + style="fill:#ff670f;fill-opacity:1;fill-rule:evenodd;stroke:#ff670f;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" /> + style="fill:none;fill-opacity:1;stroke:#ff670f;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:none;fill-opacity:1;stroke:#ff670f;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:none;fill-rule:evenodd;stroke:#ff670f;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> diff --git a/styles/default/images/stop.svg b/styles/default/images/stop.svg index 101f60e..f940318 100644 --- a/styles/default/images/stop.svg +++ b/styles/default/images/stop.svg @@ -84,7 +84,7 @@ inkscape:connector-curvature="0" id="path4535" d="M 52.545757,29.135597 52.532897,57.079565 27.27567,57.078631 27.28853,29.134663 Z" - style="fill:none;fill-rule:evenodd;stroke:#fbb351;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:none;fill-rule:evenodd;stroke:#ff670f;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> From ab297ee1743bc199403424a7208a31efc11aa6d4 Mon Sep 17 00:00:00 2001 From: Nico Hirsch <30938717+noxhirsch@users.noreply.github.com> Date: Sat, 15 Dec 2018 22:25:59 +0100 Subject: [PATCH 04/30] Update README.md --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index 131387a..48f6dc6 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,14 @@ OctoPrint-TFT [![GitHub release](https://img.shields.io/github/release/mcuadros/OctoPrint-TFT.svg)](https://github.com/mcuadros/OctoPrint-TFT/releases) [![license](https://img.shields.io/github/license/mcuadros/OctoPrint-TFT.svg)]() ============= +### My changes to the original software: + +- Changed the order of the homescreen elements +- Reworked status screen to have more space for the important stuff and smaller buttons +- Reworked files list: + - Added delete function + - Removed the load button (for small screens). If you want to load a file press print and in the dialog press "no" + - More narrow list elements for small screens +- Lots of other changes to make it look good on 320x240 pixel screens (you can run it bigger screens anyway) _OctoPrint-TFT_, a touch interface for TFT touch modules based on GTK+3. From 6a90aa163c919bcaf66d2383d89666cf321ea374 Mon Sep 17 00:00:00 2001 From: Nico Hirsch <30938717+noxhirsch@users.noreply.github.com> Date: Sat, 15 Dec 2018 22:28:05 +0100 Subject: [PATCH 05/30] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 48f6dc6..eead319 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,7 @@ OctoPrint-TFT [![GitHub release](https://img.shields.io/github/release/mcuadros/ - Reworked files list: - Added delete function - Removed the load button (for small screens). If you want to load a file press print and in the dialog press "no" + - Reload every time when the list is opened - More narrow list elements for small screens - Lots of other changes to make it look good on 320x240 pixel screens (you can run it bigger screens anyway) From 396d302f97f93e4bfc0b533128b2dac17644ff42 Mon Sep 17 00:00:00 2001 From: Nico Hirsch <30938717+noxhirsch@users.noreply.github.com> Date: Sun, 16 Dec 2018 00:35:40 +0100 Subject: [PATCH 06/30] Add files via upload --- files.png | Bin 0 -> 16264 bytes files_print.png | Bin 0 -> 12245 bytes home.png | Bin 0 -> 21960 bytes status.png | Bin 0 -> 11460 bytes temp.png | Bin 0 -> 14006 bytes temp2.png | Bin 0 -> 19411 bytes 6 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 files.png create mode 100644 files_print.png create mode 100644 home.png create mode 100644 status.png create mode 100644 temp.png create mode 100644 temp2.png diff --git a/files.png b/files.png new file mode 100644 index 0000000000000000000000000000000000000000..8f20eae025fb517faac031ca4210fa0efb944071 GIT binary patch literal 16264 zcmc(`WmH|y-{pyO(clu?-GjS31OmaGAi>?;-Q6962X}XOcL?qT3DzgSe?KzQPtSC( zS+klKTvh>f>zrGs>igMySJ-C-NhJ7>@L*tINYYYb%3xsNLcq^gAPC_5n<6bA@B--| zBCP@ff!1~ux52=O!KB56Ra|w?bzogFRF|?>Hfp4gbTmZ}IzXYru*!v^#J(7Ks*jl9 z;54%qVxuK0N~oC7n8zrsP!P(6QVGb)6oHf!fgAG9b?`y*@~ zzt$Zly-X+9Ss$|du#r9-9uY%<{Kf;i%L#Nbqu6)Os>f2;Vy=y8NUo|Sx{C(bU&?!O zN6{hD@WJi3<-8$BUVJzq_PgINo)sIW_Cc|brZ;#}zuwzWr84^S15k$PL67eRVPhCJ z-AJ}AU-rAx4rVBLbBJTvxt49z$u%nNb-+1=zN2y1yuhGRh?3dv4I*`|q%fE&v{d=x z5wnL4cHiKMVTcgV5ep$_np@esHrky=f?nVVV9v@AhB6^ca3Qy(tm`u_0Mzs}X zivWj&MQ(QgEfWNfc};X^Uk9z9bkt1SRmcQQ+uIkxq|<7-SfN21&+ByJcrsr$nZ;Xn zHC^OOmV4B#JVwaZ%=AM4wL)EPe6?JSsamJ4*lZ@B7@o<-yqq+1FFsRan~2r;Y9PWV zo7>@s)9ElU8r^2wxBZd5C_K)uy$}!~$OQJsvq5`9G3@3yf%2DHROLWoH&Ax;2}b-V_!VCNk-< zFj^1oj}VRE5|jA6`M>`8ox?iN@Lm7yaWBTm(2$gLG?GZrZm|OQW*4I9bDoG=weG-E z5}lfDRX=6PUeWzw&SB@XwZTqr&_KC$t^F9W8k9^jy+*5}+v(Yg!+1HdghbHGOPDVtTwKkjQ`xS#P1YMQ_Sdoe z@1DP(A1;j?U5=)E;wfYUs9D=G=~%F7RiL_iooqH*NwSSpU=9t^k)KG{qVSe(59o3W zRlbL5V^k$mE5Q#Q0{4D6PLwNUw1-QO$KCLFw&>b+Zxdlq3OZZRheI)&&wqJ-UZn@I z1*`t5NH(Qbv(gt?JRA!t;kJ31iFJP}$EMr&fll?udZQJupCkbt4eM%8;6Ct`K&6O8 z$oF`)LndbgOteO`nGfY^)z(W@Iw_1cjW%0;8VK*`*UbX$?}dV;RUMkq`^n;N0X+?2 z_B>fs7d&4FG8Q5b)M{fzI}?=)z+-)3;ig(5NGX*@aEigJ@ctyh2Smf#0r#{(GDch_th664^-ouD8F~!_@7OJ2^S| zFq1URQnlXD^3HmTgMonomzt?_i~H%~dD)i|BO#L64a0+EVQb$t1Lq!p=+lMr5W9ZP zEqWn4q1SbXsg}xSZ6$r0xBvl zkOxO>jZ5W_w$BAY4!CH$$O$I1o}1lB!Y1T@;LCLH56;=jkv$cZU70PB>cD7sQD*PU z=EyVp@i8!k{&A;6l-Ay(K%`{p)2e!T#lkn%YFZxVR@28m#4jo;8Q!md;DQ8SY+cV+ z8x(T{H0n$yP|31Cjotq8>U1#0PwgS&H)Umul7h9nJDS1aD5(9pc5Y}_=3FfINEK-_ zo%=Q%SD=kE7>V0vyVC@VeAec2N%&&MH^ug_uvA0JRdnx&_1@zT?@tQt2J;lkD@`#_(1O+uV>*lzRM zV3-SkgSQK?CPSVc7`cxqg)9kb&RczM`BClmN9GHQR*Gz2FjC);u45s|gyCT@zOmFm zBuu~$bhvOyqMf0y_Li2(MXK8Ar@J5y`%}DcD{f>?y>0$5Z-FK;=QbEh~ zG2@fQnAi

>DM2ElH>Py$$j*m~1~)ZjL$oF`)kw!10n6mkSd{L(&vp|Wv8Y{=Zs zEQr1MsPguD-!P+$N$~z;hYSUr+=Zu};na
  • 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 literal 0 HcmV?d00001 diff --git a/files_print.png b/files_print.png new file mode 100644 index 0000000000000000000000000000000000000000..6fdff160808bd8087bf9e13c76c393610a2823aa GIT binary patch literal 12245 zcma)iWl$VX_$Dk1EWzE~-QC^ghXr>6!QB%af(O?Gx8Uv)G`PEaaCf`ORbAEpKHc$w zh3=`@?w;xQv5rtvkwyMM@Bs=63RzxGN*xLcS`7I60s;blzo{|^0Ut1~67rf52xMhT zbrTAT3`$-~T+_?w)DYees~>m0;|6M4kuEnZmg{qn7~1!BO|c{foQyYm2IUO50$gM`lUFI>Zc&iLuNe_lJB*-Kw$!wjG@d=O^gvdAdA!vbX?VzF8=olz; zKJx|9VPKLxlK=$TQ@r~URoOzLUBy#OTSLmkv&DUAA{AnBb?c6Y z!!DE0!CEY6a)yDfqbpA3{26?<+Oos;&S5q7YjorgC9O@$+{6+#J_OB)5d5v%K|^bo zjyy*y08-u;LKPCQLiT+M;pKkgeyynT&wmnPfl%4q%@s=r^A&_`p69=eyE-Yhx(1mQGTp9x(I;$K)n@2{4QG>?Ov1Rx^-ReUpr@r-EraH?z<)&SDTF*?fCt6 z3=Vl=*thH!z$ep#p5L>#h|-Q-=?Gwv*3I(h?-On`^(yw?+Y&8*+}a5chOY1H9& zwz?FCO!&(bI@s8cosQ$`XsOPMfZM0^)4H{s2;1}OU5Ft8zf0d(=EBqi*1mn7R1ZAr z*$*M_EN;PlX~`>t7MDtcmhGq8KVP2jv`f{c$5uX#WsLt6zTfH%cikVgU2jj%$ROb- znj9F;3({k8cD@`*VP@6kkW>CWF;Vq-hKBU(!+(i1j*rjJWu@_}hmaBsJYIN_CdZ8| zPAlzfk=L~RL>grwmtDD~+PyeZQ4!M~FNki`Z$0d5R|9nhPD&#qqrG9RhwZ2;944L3 zt*!rZCHj8{hsTnNYQrF^s;W}q^PC)C?r3oAk<_lX2p}LJSPmy4A|n%ue$7&c#&J0q z2iCJI0&`C~_$mYeQ$j)_C`ciefE!rr!{J>e3^X*SodM)5xin`hu6=hDjTX&8Q8M zkk|F7EFwZvgX#`yy+2!vA7^KP@oui{?JV#(P|>V3@Sf%1zL)y^;bRmIGs;2Tr!k+S zS%j?2mEU~+CyVUV3Q65#F|AhPX@u>5k7lt%{Ao+OyB7Ol9JuutKqnVLOaO}f2OK2L zqdzaHSioZ3J|1Kzvl{0rXErLy5;D44+yo zV`sh6Xn!z%-eh}^(u5U@yY2Di?!nSuP4IrWs*jhEjsWS3X4rz`^_K1Pt3B!I?g;~q z3tg)EksB0_6Xljjs%0PcFaBP4vCdp$X7=4?bX-;=A-@MTWMW&^z>adehm`T;JuY6x zQu$lx59A2dP^#tb0cCNq13BWxCrg--JjkyWg|T#ze|@B6Wf@u174!1)*gTru4%JOe z$i^FzEkB;GwTXV7#zLZ_YLPByVxS|g<{KT)BGSa9 zg}lr4Y70L5f#`GjMj#A)GPSfzwddbSa)V$&&ocsHA1s+3*bi6_Tj8(<&u9)SjUC2a zB56@)D^2(F6)Ur|%`R@pZ0GL#quHxvD43nkXM$zg6$xR|BdJwhgG^yjy{mGDG7qX& z@Co74)XMycY>#d)&F1XpaUz*+3@D1h63>s|a!jQa| zm?kps*Va37)xu(d$)+DmF@*GnqYhT%$7q?ELRJ} zx>S{oBl&vs7ky!K^S9(Agp}XK>v~@qcs5(h;Z6h5>4AZv6WQ;G8+=waNJNKOuNII@ zMAd8&-A=#9^^WHf{HE+I{@zaZ>vo$tR&}GYk5$^4Q7Ora3T7-#*%JyQMFoB8Z_azQ zRGW!|3!2QSlNCDZ?;J%Jo_>@9Ps$|}+g8UCL0zeT+!US%5r*E^MHPZe6E`DDziywQRtn#!Mwnms>a?(e699KT?)Jm!S~$8ADWuEG{dk zrC1p5E2rvq&vMuwD+;*Qr7wM1tgV$_NrDcdJQ#+kg#5+R7pX4qTrpKXSmC^R@_nAM zpJNtYB`@h`zaaDu;dWQHTp%E&dhUsFzg5a@!i625KVlkz;3N zC@h3tlKArcrW>2uGsBD2aKo#@tM`=8J3JF)v$cNs*7Eo-P*gXpCyJ1FOOvtOwZzdI z1?M@NB*lICm}dHOX<{>;%qw8@qze2_8xiz-<$H*t2#?Q;Ja~T{iptFq+?s+msD1e^ zX!#rZpxcXY$l_P|6IEbhpWc6dSl+YRVkruSX&o8_!1KL7dWtd`mfj6F1_>U zqv-FNQaXR;EjrmU4fLLeM3k*xq-phX{k2H2{$4dxJ5QK-+g~x3c7p(&Nf{98^Z44Y z4V$3&sYXm$Nkp>331?hyq~2FcuuAsX%t*M`EW4l965Gs^`(B@zo+S#+-*G=YTXiR~ z?Tp<6u48jj#8Swz0VT&9~>F zZo84@YvD_@V8+uc2K^`m*D4%Qu_{t9^AYDhVr_BpzAXwgJN@4?C{@mefNX{Beo>9+Z-V z7u#@~eUr-e$htBbcs(-N>V6yye@{s?xIab?fVJt8YiMK8I``=&Ys8n)wHZv;e8aY+ zQ>l~gmK!uJjuP702wSsl9HU&;S0AIe8ZF_L?BCcOTr?&2T4GMk)BFBQBctO&th4JZ z%aI+`L$pqrJQY4Se?H|W3getKMF(A0skkBx0C3UGYO^23io^JKvi)$IFWQqbvL2@WgoNI_Z}5pg_?)Q zqdziv`pu^9FUwsM=kM9@D#+I>Y5w6R7B65-GeN|F|XPa?WnMIE`qux(z+u1_Nv?ri}BG z(jc7S$>HbqcFP7Et(GV2u~BntF?eTAkJIJQYQn{S2I`t&cn6t%31N0#nOLHTcaEGu z$E-|Rs}5`363nRd1Q4*T#B6ynmOC8QS{ohK_5sGIZdUo-u)m@d=|?V3s^n1y1-9TI zLR8xC@-Nq8X#(y?WFD$=fA*`Z*$VGh@dzM4ZjZ{60md5C(eNijcmK)6LCvNtnfOzQ zJV`ATj=2NdE4S^}-)251Iu0A1`QG@tIJIiD!_)C0Q2}=jR1OLCke19qrZX7@#n{?< z1Nc!-%F@Q}?5|JqRYuwMjvK$TIt+5XQ|#7JpUIPRl}6`ugplPdF1gUoWz>7&)_`Ff zclvq%`Cip*%8o8+ezNEsiinGh#FR%o*-MdQXE1D8#lala0^Q;<8WT?`%WJ=kwV{Cc zy;_Y{tLzut;7$<*IXRhRfa)dy-frjX70Q_&s3bz)F`Pnip!Wv$HV0U|Ao!VqYy zjdK)ICMhA&O#ui6R6-suIy%U2#>x9$T8$zlwmxjV(E!5KU_w>NPe;2$iQixYFEoLt z`uuYJPS3eLFo`GNX1y~Iv&GLh+89hhz5rh+UKoN+>T(D^SWP1wuD8MXq=0iIrJTMS z62Jq}GdDR+s`SH-rxtxGq3z+|wcSr4|IZL#|KLf++=T4=IHgNYL@yZ;d(88VH~#QQ z%RSMa3SB2oS z4YWp1_@kT{MALan1fWeuK%wioS2>J6gG7Az!^Bs;vtL6r7p--uB2Z4sC5CeOV zEhb@;o7e)Puu&%I1RaDT6_BDXfMz$$Fb3g!i!Zi|TmXhcMg=N<{7C^5D@~RdvtC{{ zc#OBcj_^-#wy=OcRt%$#l*5Cj$-%3*&{EnXnT)A*FI_Hsk^L1>TyP%Rr)r%c0mx{R zbD%muH1jn$`~(DGTGb%|Zz8M>-6_=t#~}fTl-;y!Ai>t^iQRwmX_pF6H3$p!Hfp0s@||FMJ1W@+4@W z5GYh=EzradLDciNOm5q|o~!Za;vItl)qn1twNj)^^MLo=`+#pPSLW_Pv~O@lY3P@G2NuByb7wO(u?{S3w-? zk+@97%SiWI7{H?l?B#gRqJGDyU=$p`J+tq!_(g>NLeJ?u24T@B?_jF!_jZB;Jczubxdd zmWWu;gGs$W=k|#E>#O@|j(9N9VF2c}%|_?zAgO;)kpKOfCnC>u=8(r@vy>v=~zTSZUDe!EAOoP0jDR zZ-Fmf{ISZ&YT~E&#pX|rNO1R+vaVT&s|?`P zw(a}V6<+fJE;q6-@6WBs^IzD`WtoiHt+#qeN0Q6b0G(V?Qi4tyrpPu|`Rdaf76Twe zg%Wiz2Ve8o*Qej^N3+Nu7^b@3-;;1Go{$N+te0xtFSo@3jgrB0s&6niE&+@N1|Ee; zv&7_d*>ScEmkAlIAUYC=CCbtIH@TTuFpFXelVlju zdK)iN#cBlR;9xX<%zx~zVlGC9sOq^x$+I7@8K@4e3wjFG3l-SMrVABGMZYSofNrjL zhkD&!US8M~4g_fSN{ZrKU}0fv>Yc>)w@Cd%8f=oM4|6Dm$-D7Vne}<7g~?0R3L|fv z&vEd?{b`iabebGGULFxWj&4K*1`u)lCMy06Co|eFR+C^Fl0o@Qd0+1*&pNF8$um1h zxSCp6P(9ONS-q;kVB{G z8#-P2Pe5bn%PRdoXq4dN?9;~|DAmjoe`ctI)Tmj}n2pN@yMkbFv zAkkwU$RYkwYR%y&#AcNuUKgH23Dne0oR(LzuCFiNNCSy@JZ0FjDGEhE9as#&g;$v` z*UkSVrC<3Yl;d={!FDj_nPwvjhL!_XH%>1-i|UZ@-#)&HyE&~zQ%dJ3G;C`OM$_XMOqOjisr012vT`s{C9gUqPr6brN0ygva z@TMbepMT&?c1$YcM~BC&!eqvo48#&UA|_f; z{vZRVhRPDA(d z!=#o(_h$$I&Vy#_XKSFk!P$oaZE*Q5KpVpW1IRX2cV4E&B+>F?>a>{wR{wwbGBQ#I zzk_&Aw)<3BX4MPRjFUr7LNdRHl!|qCAVh=e!sm31LmS=}3#*;Bf;4l)Z#Uep%AwKJ+wXQ_HWM-6 zMKZ3(b~JmHe1Cf-Pd(jFd<_BdVskDwJMVa$uCr*DgL~irPxBYB^Ugb;SyHqdH#*Ii z>r0o>obM4_66p-Le~FhgHpL&hHmNei_&*&MH`p!!+|53jp~{s1Xfii=t~Qv+w_4?= z&=8i&4}pkmg5hDsR2IW#_hY#EnlD#FgZs8q?w~Ra<@Bm&h34`k-0(6g%+?bRi5K=v z|H)`MPi&7Z`L_4!^mV`cY<_TUmwU)pKQ6kyfi)F`>lEy%g$PL zBBE%>a5l!UmzP*FkD=4%w!cDas!NeMihrUWCiN7MN5BiyXsQse6u|STjw^|qjb5iZ zCrKNbNZ0aEbLL{OgXJ?DN{F)PbKsaQEV=uq@hq(lA8wjH7NO7g#x-XB1#AAbYksxa zHl-*3y?zS|9>~&7S$2JyZP`$>cckPjY5b!8iO4sXQR^3lGV9*(EeG)WwJ%odwzyb& zl&TjFKMZNr(e;JEN|5PlQo;&D3KHd+u&}32pKgzR?@n~J?M`|!`J9D*GHj)>nF@X7 zXtCqXJ}K5?5LVMGb3K}+=Zp5Hv;3Gw z{m;^1q*h;Cy`wksla)y95x^4d36Ml}-R?uM!y%wm53d7C`QI-22D<0c6b5EPzJ~hd zT=Wx^A0E*{?3iWy822Ip9GRg5)$c2g#nt>C)(SEN+%{gje{uyq^TxCIZ!ZT)OYsMH zNh{5$h_Ky#H#$3j?X~x5FvROZ(C3COCmi+eQ-&x!4=d&Pm?)F|@q7jPD}0Ly2WU6- zmn1S#ibCrz4dpTKbl-%G(Q-YP!I4|f+|Po!JGO&x{M+N^8pAx*(liFB&@ssE*3Ll3 z@f@DF6od}Vq;B%Vr9ZeHM~{${vC`$){IebHsp*Vad{#oKbQKdrbLk4f-tg`*p=2gL z7gX(OA(uws-su7B_1`I8VQ z#()MqEeiSt{we6W9svCsg;mq8&-WTEMNI`Zz=obHOalD=unDhM<0zb)H|viT!dHyF zlsU^F7)=0QptyGMxYQ7$^>kHGOG|}%jex< zps-`noXi29=dlBdKMoO-kqCff#oJ^KXPlvtfr{H03PF}s07bwcEe{ob-kZ59~jGu2KDr0DUjL zx!+*h=)Qgj4)gb-4zcf`vMrT_V%^Val_Pe$le4@OrZ4?7%K{!?Bv;@1KwZNR@?wXd z3myAUxj{VYTwXrZ@(qs9k_0kOBb|5D(-+-(+QxhVfs&6)awf*{Qk>@%+!mQfaXX z*PUpU&0^K;fq{Wxv@o`YG>ukGiVFbq9v-~t*~iJ{3oC9Cn0{OL$+mIf|L6wj>f_@9 zHW07uvx%3)5EwS_gKQVxmJ1cFhU^w94FO6WGv?~d8muF2MkejT-=gS9#<*l?dyZ}cof_x&N@zV6@U z`uc?I=jR89ax(EDAR~j@)+6*omB-%;quZmZ7N63S6XW47g40c5fGnc4qvGFx4-XFy zd0cVqdc7RX1`-WP4xgK}^G?7LU-$H=jE}Z`+wPCr+QKbTN{`;hJpcm8lj*{hy^++w zKh>tao+pbu-Y&zot&^eSiL^~!{zU*5A`{#c&TTRap#&*2`{2~&YF{3Mn zos4Xw!QaC~R!VAjg7o{_8Ad9@R5U)PfX4}&>%NkgR*70JV8fY9ppzn*e!!yZHh8_6 zF>*hiU+eHa$d!b*U8p=&e-m6!Pr_L=OA2Ujap7O*gg^N9m;l%!W0}0gx^+0}^HWov zSNmhWK!hd-0)g`K)HBQkPQtrykLlIw&H?`|Khf`eT{!r6z!WkK`s>S!)9v3W^S?N` z`8NZE|B%b5ZvXi1daxy>r7wvaQ1I{ivVSWo3?8o+Yc}NafUk)oyjPybh2MQRTqPJ& zYpK$yae2BaO)~(yM`6*|n*8?DemU>TjvK(go(8z=&6UlYLjjU|ej2XFP(q>T>rFmY zy0Gu~ck*D*vlrw9K)Q{mbMp35>^ubJvrJyF7`8Tx1qQ{(qvP$ck$M1$G9c&3?g|xC z;gRtEdJP&d$f7fIG!^pPC)m^W)pwFCm|iUH4Ek`%53WN@m`UbBJH+Q5N#{)CZAUZU zcDk!h_+1s!)p7Mi-wNa*%|w6-PA$W5`G#f!$*F00po)Mfc_RKRZGRCEl)xTS!<0=B z=qN#aD0K9+Gfau@n17kL^Bz#npnwKoTmO%S?C$C3Ko}U9IATEsHgr%(fGq`38Lk^N zOV#xoLq^j%2e}PttAJV{=FaT4H=K;lWCP?e$Ma|~w<=IjsDb~^0#r2JjUoBu9irdF ziU%C^u=5Er;%b3_Q2Og^$&^V|!%yAle5(raX<9G@nj5T%Amn)_Bvk^CZBL5=_j9a; z>l@uM!URm<%e8|(9|e4OF732IjDh4CAupiLO#xa zYN1TW_!XI}4a)+eff6X)-6Mf=4HTh73**5d0ie99sR{lwCxG#i0TVqSBNL$2ALia6 zH@T#SQ3;XaNj{dT)MJP9py*6;e-aa$D1#$1p2o}nFTJ#_Splp)Pb_~D8ej|OyD3BL zg8T81J)y%vyH*jx2L)7Z7_lNI2(&M`7`PF))*=*>@87?pk&?zS!vK~=2@pvG`V%MvEP)pfmpj)76XBtu z_5eg)Z1ozk#@0(pG1g4SlIu=}LZ$Eu`@ZO;{xVO#Akt~U7-9IBXhcLT;D*O#jpl`T zzq7sF)7x8R-1WBk8|Gyc$fCD;LV@yedTE<(3RNS`Xxir;S+i~%RqT9fJG>h2CWUf|OPP<`)%A56Nn2AzH_0K@ma zKLfb#l(#V*!bvVCbtyXNv(#p?-O~2Xb~$%KRu&Qs8DC3yc*mKRqwxmq`zgU+PwbOd z;IINNvtAOw4xO6yn;dNC%Oj$rm6Vh;Q?M$ymUjW?=H+HamCtduD+#=PJW5NOq|&{NLfqE|1F`yB+EE$UB#jqQGSvJ^weo7XSNs%b@;;&Gn_`_jT> z(0tKxzYZKkI0Y~Xc!(A$m#i>Nm+wKM1P(L=2win#3lnaq_0%%6kf9tL2Cd8N5*{^b?glS36D}oL&v?UEVi)UFH#(rQt8PxE>@> zD|Qt zEviW-+6F>KLqkJU!~*`iZ+J;BO7_RmJNU0yLWVSWll%jXczGH%2{Mx(NIw>EApj8C z@P8*ZRC8s$#DeD;P~kgseA^zzs2b`6O@hN8EpZDR z87TTRnr3?1Yf4d#;h(?<4edr_yN`jR^|iHOzxUJQwvbfff+*#nRH7Pt6ndQg)6HRU z1gX+`=lk39=}MDquRfrFoaAj_YQBNuoXYL{%9)vc#=XqAJkJd3yNB!Loog76yn~uV zWj}B?Mu-}sJCjT=BHGug>n51siMk(Y3NgYZa?d8EKJ?lalE^~>xhQgk8w9I-rhTQ6 z<%^PNK6+>QoIH+C*#T^7M};qyN!MlWmzH!CjwJ#+=gZtjV`uJUz@Aq*wP}vL*KC$xB#YW2AxnLhWS>5dHGR zbpqHdC>sKXg*a)5SO~;1-TV3^3ufT&yy?7pOsUjU8gkmlMrK~ohpPa>vlp`$NJ-ik zgMgg{GXRu=QVT~jgOjV)pC;!|#~^c7KQZU0v$!Z92MNJdvM!vpN%-G(IBx{&e%H#c zl9j-gx#z&xvOQ`9V@9^OPQdo+-I*xPL8)ziVO!D=kF9LsbK24@>xagS7uejxjE zpm?3m#sfN^+fS#%r(rZPqbV#pNTo>g!%AFd4MrN3c8Nzj3&u6U`| zaY*atJ^lmdv`xR}aKt|h*d_u`>ezQN&#u#qD_2rtbw`^0hh{vfgSDL)%Aku`jrCt| z9k6S2D95m>e{`$V=>i5!@6|rAe=>X%(5zl+8m-#$ehNB7k&<9x7Q8vC_e{6`9D@-a zfB7MFt7-Q=yQW_BAaM?Bq}()y3&k#ElCJ0kLl}NO4*RnJ2%5|AG4lp(xe@zq75)C0 z?!0YFekg4cW8_gJCSt2xmFpfMibCXJ6GrZWt3f;%4)FDATLyus^EbHJ`{Xpgt6{hQTt8kNS(|CzG|*vR*k z8@epj$iCLvzi*sdGCYa5BSoVmS-)?aw$du?%2Y#JXY|{iE;KZ>T5oi{FeJKPeKCZr z1>K5ky!7*5qTPo3*o)s^*;x)nQO>?$$o^DGADreBz*QbUxUYiKGeNf8qXsq)W&$5R zw9+mc>P3O4XMMHcvKnoi8hslBstZB1r+K0>$zL;HbBQQ)9S*bW9+UPlJ2NT4iq>3N z`l{gjkoz~Zn0HH7w=?`u-7TD}s?-$=6_cUnP>Xj18qhH~a+W9rYM^pj=l;Cw{Zq?X z8{=lahn?e5;+SHZmw@wDC|(3qi_4z+jB37t&xrwV_s$GQ7`%+e$`1r*xDI_#gX#7aUT zCg26ucsuR>iC@kz$>p~bv|^LjQ=c|_MCjZJTK*rklJ9``}2cRohfOkx5R*Hbof;2&yO=? zG2xd=%_DC~bM)f6$ZJ7Jz#$olbI9<-slT4di>awpz@Ox&4hqomU?dlDNcUQsC%SEz zWf&b%zD$hzSqnEUTi96m`(31Jil~(WSA@=5!&&R(_4l!}Yh*$mGF!XtRArIRP7fWz z2)HEF`GRY?cn8KZ3=pJRY9ejn&PLteM4C-W$^&9hg64&|ekeqIPTPGEI>%LZkxN{x zWc;_YgEJTBJdhJHuy2#pbGtj+bNBVq#E2(yA&C^zVxNG*iLeZoU^=!d%EW6i@jzOO z@n?-vJGh4n{iGMxfz_a{E`OlvR~dB-dx#vn#Y4(5>C|26Kst`mI-Jwj1rs9ANVZ5d za(ITeL}Z*OLLB`G@^%;`92S2Li$$V|7NyY=>AvD_88b4i1k|OE3xE6QK&W6Y4=AVz zG=pz{0v|c4!&lC+YZ%H_qB`r@?;eZAi`ca~SVggy!#fr$cH2U1ZkX#|hb)oC(A)VsD?<0W6{wIkZlY}ETI0k?J+c(I` z)yCsfuhP$=bIMo$mc!ryG$i;rOJYL@8SPW}FxXKO)1+8awmUYnAmzuj;SI{YB@FF2 z;+9kc;ij!4joe2E_KfSSheAOojC|whN_0dL#pYyU>9|@Cpkb0e6+tCYJ0yMmu>cKlevPnjvMy5ju@X{Id-70^%gf@wDP#gIrHtFmIEO07te;u7j5yq#mY&LX0Ac}>b6uQ1?aV3D9-MVxiIj_*X>U{^irE9mEFB>=6 zFh60$ow@A7l?-_b44;D>Mu+MSpDcQLjpFBqQr~UU-vePv6fUcX&yBVHor_@}0H}xv z_HhCIpOgg^Z_+n>j+y)Hr8eof{@{^pw7MfoEw_7LPvy%_#pdE`V#u%1wEg-=JD>is zW<0jds;;*l9KX>leL{2`L(6jP{xTi39gG@2wvSd*`u|oTDknb39&K{y!-~bH7;I|B zo3_YD&UQUm4To<#!3!v6VwD{Z(T|~`1VVU-C@64_HJ(S$=UuV}w!-fs3Li@m?Ul6> zS;#Mp!9X5%F(pfyiyPx`0UWkLGeRZy!pSs3z^02-R1>2GRhca|+7qseE_eC+_kCOF zH7XRBD}mkbk&sxS%<0mt`?8*alRTEuP-*st!1_%Ll~nlg_4)oCV9Z{|_>KGdA6ds7 z1M@bSLGxSq96!U!LC{4%E(O$e-E5Ur`JuTQQo^iP^2z`ssvE7FNpCQgxJKp)VB3Rq z9RU6QZtg)4$Wc@G;eg*|w_B3+uG3NIYOT%+wMSRK!9pF`#wKv?J9$eCdUd02o%7w% z{`5L1b7lO8ATQs`0HNdNf0%lolr(bD;nFWpo`BHWI=e;-hSf&HQ}#G=T8p9@$H;9g z3}S%>T0vtkq^A!2jG-8T@&BVE#lYHT5*QNQ_JDiXrmPj89}<88=s5rk(LfHtP!)YH znZFd^W4GCh+LC$<4X8nFBgA`mUujAl|GGESw#1iJ!Vy18LjI-lfW-X2KNb-K-(dpQ W`gu3p4y~YoA9-mNsY(fxp#KGQj$yq3 literal 0 HcmV?d00001 diff --git a/home.png b/home.png new file mode 100644 index 0000000000000000000000000000000000000000..2a30f1bd1ad2ffa88443597a0369b88e567bf5a2 GIT binary patch literal 21960 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 literal 0 HcmV?d00001 diff --git a/temp2.png b/temp2.png new file mode 100644 index 0000000000000000000000000000000000000000..e4b079279dbaa6a98b671bd9b10f7ff70e3b449d GIT binary patch literal 19411 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%0A|Gk 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 yz(62* Date: Sun, 16 Dec 2018 00:39:44 +0100 Subject: [PATCH 07/30] Update README.md --- README.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index eead319..1471473 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ OctoPrint-TFT [![GitHub release](https://img.shields.io/github/release/mcuadros/OctoPrint-TFT.svg)](https://github.com/mcuadros/OctoPrint-TFT/releases) [![license](https://img.shields.io/github/license/mcuadros/OctoPrint-TFT.svg)]() ============= -### My changes to the original software: +### My changes to the original software (I'm also working on some bugs): - Changed the order of the homescreen elements - Reworked status screen to have more space for the important stuff and smaller buttons @@ -9,8 +9,13 @@ OctoPrint-TFT [![GitHub release](https://img.shields.io/github/release/mcuadros/ - Removed the load button (for small screens). If you want to load a file press print and in the dialog press "no" - Reload every time when the list is opened - More narrow list elements for small screens +- Changed temperature pages order. When you press temp, you get the presets first and can press a button to get to the finetune settings - Lots of other changes to make it look good on 320x240 pixel screens (you can run it bigger screens anyway) + + +### Original description: + _OctoPrint-TFT_, a touch interface for TFT touch modules based on GTK+3. Is a _X application_ to be executed directly in the X Server without any windows From 4554ade2c302e8b21a598100d1d238dd120cc5a1 Mon Sep 17 00:00:00 2001 From: Nico Hirsch <30938717+noxhirsch@users.noreply.github.com> Date: Sun, 16 Dec 2018 00:44:09 +0100 Subject: [PATCH 08/30] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 1471473..73aedb9 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,9 @@ OctoPrint-TFT [![GitHub release](https://img.shields.io/github/release/mcuadros/ - Changed temperature pages order. When you press temp, you get the presets first and can press a button to get to the finetune settings - Lots of other changes to make it look good on 320x240 pixel screens (you can run it bigger screens anyway) +At the moment SD card is removed (because I created this fork for myself in the first place) - I'll add it back soon. +The presets are hardcoded at the moment. I'll try to fix the bug so they work as intended. + ### Original description: From a55465f68ae2b0fda556d96d3dd6cbd5b2a8dda3 Mon Sep 17 00:00:00 2001 From: Nico Hirsch <30938717+noxhirsch@users.noreply.github.com> Date: Sun, 16 Dec 2018 09:57:31 +0100 Subject: [PATCH 09/30] Fix for newer version fix for newer version by blondak --- vendor/github.com/mcuadros/go-octoprint/common.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/vendor/github.com/mcuadros/go-octoprint/common.go b/vendor/github.com/mcuadros/go-octoprint/common.go index d6ac22f..b3d4cdd 100644 --- a/vendor/github.com/mcuadros/go-octoprint/common.go +++ b/vendor/github.com/mcuadros/go-octoprint/common.go @@ -389,7 +389,8 @@ type CommandDefinition struct { // Confirm if present and set, this text will be displayed to the user in a // confirmation dialog they have to acknowledge in order to really execute // the command. - Confirm string `json:"confirm"` + RawConfirm json.RawMessage `json:"confirm"` + Confirm string `json:"-"` // Async whether to execute the command asynchronously or wait for its // result before responding to the HTTP execution request. Async bool `json:"async"` @@ -717,7 +718,7 @@ type SerialConfig struct { TriggerOkForM29 bool `json:"triggerOkForM29"` // SupportResendsWIthoutOk whether to support resends without follow-up ok // or not. - SupportResendsWIthoutOk bool `json:"supportResendsWIthoutOk"` + SupportResendsWIthoutOk string `json:"supportResendsWIthoutOk"` // Maps to serial.maxCommunicationTimeouts.idle in config.yaml MaxTimeoutsIdle float64 `json:"maxTimeoutsIdle"` // MaxTimeoutsPrinting maximum number of consecutive communication timeouts From acacd00cd68880ca26c851f226c4586c5d0a51a4 Mon Sep 17 00:00:00 2001 From: Nico Hirsch <30938717+noxhirsch@users.noreply.github.com> Date: Sun, 16 Dec 2018 09:58:27 +0100 Subject: [PATCH 10/30] Fix for newer version fix for newer version by blondak --- vendor/github.com/mcuadros/go-octoprint/system.go | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/vendor/github.com/mcuadros/go-octoprint/system.go b/vendor/github.com/mcuadros/go-octoprint/system.go index e5d9c1e..5aee7f3 100644 --- a/vendor/github.com/mcuadros/go-octoprint/system.go +++ b/vendor/github.com/mcuadros/go-octoprint/system.go @@ -26,7 +26,18 @@ func (cmd *SystemCommandsRequest) Do(c *Client) (*SystemCommandsResponse, error) if err := json.Unmarshal(b, r); err != nil { return nil, err } - + for i := range r.Core { + x := r.Core[i] + if err2 := json.Unmarshal(x.RawConfirm, x.Confirm); err2 != nil { + x.Confirm = "" + } + } + for i := range r.Custom { + x := r.Custom[i] + if err2 := json.Unmarshal(x.RawConfirm, x.Confirm); err2 != nil { + x.Confirm = "" + } + } return r, err } From 52c9fd66d42ebc0bce1ea134de1c73218d41d453 Mon Sep 17 00:00:00 2001 From: Nico Hirsch <30938717+noxhirsch@users.noreply.github.com> Date: Sun, 16 Dec 2018 12:51:02 +0100 Subject: [PATCH 11/30] Update README.md --- README.md | 45 +++++++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 73aedb9..ec40df3 100644 --- a/README.md +++ b/README.md @@ -27,8 +27,6 @@ equipped with any [TFT Touch module](https://www.waveshare.com/wiki/3.5inch_RPi_ Allows you to control your 3D Printer, like you can do with any [TFT/LCD panel](http://reprap.org/wiki/RepRapTouch), but using _OctoPrint_ and a Raspberry Pi. - - ### These are some of the functionalities supported: - Print jobs monitoring. @@ -72,20 +70,6 @@ sudo apt-get install xserver-xorg xinit ``` -### Installation on Raspbian/OctoPi (recommended) - -The recommended way to install *OctoPrint-TFT* is use the `.deb` packages -from the [Releases](https://github.com/mcuadros/OctoPrint-TFT/releases) page. The packages -are available for Debian based distributions such as Raspbian and OctoPi for -versions `jessie` and `stretch`. - -For example for a Raspbian Jessie: -```sh -> wget https://github.com/mcuadros/OctoPrint-TFT/releases/download/v0.1.0/octoprint-tft_0.1.0-1.jessie_armhf.deb -> dpkg -i octoprint-tft_0.1.0-1.jessie_armhf.deb -``` - - ### Install from source The compilation and packaging tasks are managed by the [`Makefile`](Makefile) @@ -102,17 +86,34 @@ sh get-docker.sh > You can read more about this at [`docker-install`](https://github.com/docker/docker-install) -To compile the project, assuming that you already cloned this repository, just -execute the `build` target, this will generate in `build` folder all the binaries +Install git and clone this repository: + +```sh +sudo apt-get install git -y +git clone https://github.com/noxhirsch/OctoPrint-TFT +``` + +To compile just execute the `build` target, this will generate in `build` folder all the binaries and debian packages: ```sh -> make build -> ls -1 build/ +sudo make build +ls -1 build/ ``` If you are using `Raspbian` you can install any of the `.deb` generated packages. -If not, just use the compiled binary. +If not, just use the compiled binary. Example: + +```sh +cd build/jessie +ls +``` + +Now you can see the filename of the package. Use it to run this command: + +```sh +dpkg -i octoprint-tft_0.1.0-1.jessie_armhf.deb +``` Configuration ------------- @@ -130,7 +131,7 @@ the `.deb` package you can configure it at `/etc/octoprint-tft-environment`. - `OCTOPRINT_TFT_STYLE_PATH` - Several themes are supported, and style configurations can be done through CSS. This variable defines the location of the application theme. -- `OCTOPRINT_TFT_RESOLUTION` - Resolution of the application, should be configured to the resolution of your screen, for example `800x480`. By default `480x320`. +- `OCTOPRINT_TFT_RESOLUTION` - Resolution of the application, should be configured to the resolution of your screen, for example `800x480` or `480x320`. By default it is `320x240`. ### Custom controls and commands From ac6214423addde87f3ea0ec6ff796aa85abe14d0 Mon Sep 17 00:00:00 2001 From: Nico Hirsch <30938717+noxhirsch@users.noreply.github.com> Date: Sun, 16 Dec 2018 12:52:28 +0100 Subject: [PATCH 12/30] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ec40df3..e6c623b 100644 --- a/README.md +++ b/README.md @@ -94,7 +94,7 @@ git clone https://github.com/noxhirsch/OctoPrint-TFT ``` To compile just execute the `build` target, this will generate in `build` folder all the binaries -and debian packages: +and debian packages. This will take a while (10-20mins on a Raspberry Pi 3): ```sh sudo make build From d5d96591f2ea7cc187dc7deaa4903a685c901064 Mon Sep 17 00:00:00 2001 From: Nico Hirsch <30938717+noxhirsch@users.noreply.github.com> Date: Sun, 16 Dec 2018 12:53:09 +0100 Subject: [PATCH 13/30] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e6c623b..ce24f69 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,8 @@ OctoPrint-TFT [![GitHub release](https://img.shields.io/github/release/mcuadros/ - Reload every time when the list is opened - More narrow list elements for small screens - Changed temperature pages order. When you press temp, you get the presets first and can press a button to get to the finetune settings -- Lots of other changes to make it look good on 320x240 pixel screens (you can run it bigger screens anyway) +- Improved contrast and color +- Lots of other changes to make it look good even on 320x240 pixel screens (you can run it bigger screens anyway) At the moment SD card is removed (because I created this fork for myself in the first place) - I'll add it back soon. The presets are hardcoded at the moment. I'll try to fix the bug so they work as intended. From 7fc3af883333fcc1c71c7ea97f64720173c6fc23 Mon Sep 17 00:00:00 2001 From: Nico Hirsch <30938717+noxhirsch@users.noreply.github.com> Date: Sun, 16 Dec 2018 12:56:12 +0100 Subject: [PATCH 14/30] Update files.go --- ui/files.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/files.go b/ui/files.go index bb736fc..3a91115 100644 --- a/ui/files.go +++ b/ui/files.go @@ -144,7 +144,7 @@ func (m *filesPanel) addFile(b *gtk.Box, f *octoprint.FileInformation) { func (m *filesPanel) createLoadAndPrintButton(img string, f *octoprint.FileInformation) gtk.IWidget { return MustButton( MustImageFromFileWithSize(img, 20, 20), - PrintDialog(m.UI.w, "Start printing?\n"+filenameEllipsis_short(f.Name), f.Path, m), + PrintDialog(m.UI.w, "File loaded. Start printing?\n"+filenameEllipsis_short(f.Name), f.Path, m), ) } From 0563e7a9b731a47375a8a5d08128488d51dbe7cb Mon Sep 17 00:00:00 2001 From: Nico Hirsch <30938717+noxhirsch@users.noreply.github.com> Date: Sun, 16 Dec 2018 13:58:13 +0100 Subject: [PATCH 15/30] Update temperature.go --- ui/temperature.go | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/ui/temperature.go b/ui/temperature.go index 6aee7b0..f93955b 100644 --- a/ui/temperature.go +++ b/ui/temperature.go @@ -188,15 +188,15 @@ func (m *profilesPanel) initialize() { } func (m *profilesPanel) loadProfiles() { - // s, err := (&octoprint.SettingsRequest{}).Do(m.UI.Printer) - // if err != nil { - // Logger.Error(err) - // return - // } + s, err := (&octoprint.SettingsRequest{}).Do(m.UI.Printer) + if err != nil { + Logger.Error(err) + return + } - // for _, profile := range s.Temperature.Profiles { - // m.AddButton(m.createProfileButton("filament.svg", profile)) - // } + for _, profile := range s.Temperature.Profiles { + m.AddButton(m.createProfileButton("filament.svg", profile)) + } m.AddButton(m.createProfileButton("heat-up.svg", &octoprint.TemperatureProfile{ Name: "PLA", @@ -242,4 +242,4 @@ func (m *profilesPanel) setProfile(p *octoprint.TemperatureProfile) error { func (m *profilesPanel) temperaturePanel() { m.UI.Add(TemperaturePanel(m.UI, m)) -} \ No newline at end of file +} From ee6acb979fc5b74190a6f0ad613b767be09c4f74 Mon Sep 17 00:00:00 2001 From: Nico Hirsch <30938717+noxhirsch@users.noreply.github.com> Date: Sun, 16 Dec 2018 14:15:17 +0100 Subject: [PATCH 16/30] Update temperature.go --- ui/temperature.go | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/ui/temperature.go b/ui/temperature.go index f93955b..293b544 100644 --- a/ui/temperature.go +++ b/ui/temperature.go @@ -198,21 +198,6 @@ func (m *profilesPanel) loadProfiles() { m.AddButton(m.createProfileButton("filament.svg", profile)) } - m.AddButton(m.createProfileButton("heat-up.svg", &octoprint.TemperatureProfile{ - Name: "PLA", - Bed: 60, - Extruder: 215, - })) - m.AddButton(m.createProfileButton("heat-up.svg", &octoprint.TemperatureProfile{ - Name: "PETG", - Bed: 85, - Extruder: 230, - })) - m.AddButton(m.createProfileButton("heat-up.svg", &octoprint.TemperatureProfile{ - Name: "ABS", - Bed: 100, - Extruder: 255, - })) m.AddButton(m.createProfileButton("cool-down.svg", &octoprint.TemperatureProfile{ Name: "Cool", Bed: 0, From 4e44ef465cbb7aec7a2e5738135a7e8468955f21 Mon Sep 17 00:00:00 2001 From: Nico Hirsch <30938717+noxhirsch@users.noreply.github.com> Date: Sun, 16 Dec 2018 14:16:40 +0100 Subject: [PATCH 17/30] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ce24f69..03baaa1 100644 --- a/README.md +++ b/README.md @@ -12,9 +12,9 @@ OctoPrint-TFT [![GitHub release](https://img.shields.io/github/release/mcuadros/ - Changed temperature pages order. When you press temp, you get the presets first and can press a button to get to the finetune settings - Improved contrast and color - Lots of other changes to make it look good even on 320x240 pixel screens (you can run it bigger screens anyway) +- Profiles from OctoPrint should be working now. At the moment SD card is removed (because I created this fork for myself in the first place) - I'll add it back soon. -The presets are hardcoded at the moment. I'll try to fix the bug so they work as intended. From 96fa7087824489a21db422512502da2d4d8c7fa9 Mon Sep 17 00:00:00 2001 From: Nico Hirsch <30938717+noxhirsch@users.noreply.github.com> Date: Sun, 16 Dec 2018 14:17:54 +0100 Subject: [PATCH 18/30] Update temperature.go --- ui/temperature.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/temperature.go b/ui/temperature.go index 293b544..94bc81b 100644 --- a/ui/temperature.go +++ b/ui/temperature.go @@ -195,7 +195,7 @@ func (m *profilesPanel) loadProfiles() { } for _, profile := range s.Temperature.Profiles { - m.AddButton(m.createProfileButton("filament.svg", profile)) + m.AddButton(m.createProfileButton("heat-up.svg", profile)) } m.AddButton(m.createProfileButton("cool-down.svg", &octoprint.TemperatureProfile{ From f430a1ea69e0e8535a18ffdad06ed6829bd86247 Mon Sep 17 00:00:00 2001 From: Nico Hirsch <30938717+noxhirsch@users.noreply.github.com> Date: Sun, 16 Dec 2018 14:54:03 +0100 Subject: [PATCH 19/30] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 03baaa1..93f1d47 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ OctoPrint-TFT [![GitHub release](https://img.shields.io/github/release/mcuadros/ - Changed temperature pages order. When you press temp, you get the presets first and can press a button to get to the finetune settings - Improved contrast and color - Lots of other changes to make it look good even on 320x240 pixel screens (you can run it bigger screens anyway) -- Profiles from OctoPrint should be working now. +- Profiles from OctoPrint should be working now (thanks to blondak). At the moment SD card is removed (because I created this fork for myself in the first place) - I'll add it back soon. From 2b0e0a5ba425fa441c0d253786a9f2f02c4681d1 Mon Sep 17 00:00:00 2001 From: Nico Hirsch <30938717+noxhirsch@users.noreply.github.com> Date: Sun, 16 Dec 2018 14:55:50 +0100 Subject: [PATCH 20/30] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 93f1d47..2c445be 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ OctoPrint-TFT [![GitHub release](https://img.shields.io/github/release/mcuadros/ - Changed temperature pages order. When you press temp, you get the presets first and can press a button to get to the finetune settings - Improved contrast and color - Lots of other changes to make it look good even on 320x240 pixel screens (you can run it bigger screens anyway) -- Profiles from OctoPrint should be working now (thanks to blondak). +- Temperature profiles from OctoPrint are working now (thanks to blondak). At the moment SD card is removed (because I created this fork for myself in the first place) - I'll add it back soon. From 8f2cd1d243fa0bb2fadc2e2b17a840a5c33ebfe5 Mon Sep 17 00:00:00 2001 From: devsfan1830 Date: Fri, 28 Dec 2018 20:27:33 -0500 Subject: [PATCH 21/30] Update status.go --- ui/status.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ui/status.go b/ui/status.go index d5d1a15..ec9ee79 100644 --- a/ui/status.go +++ b/ui/status.go @@ -96,7 +96,7 @@ func (m *statusPanel) createInfoBox() *gtk.Box { func (m *statusPanel) createPrintButton() gtk.IWidget { m.print = MustButton(MustImageFromFileWithSize("status.svg", 40, 40), func() { - defer m.updateTemperature() + //defer m.updateTemperature() Logger.Warning("Starting a new job") if err := (&octoprint.StartRequest{}).Do(m.UI.Printer); err != nil { @@ -110,7 +110,7 @@ func (m *statusPanel) createPrintButton() gtk.IWidget { func (m *statusPanel) createPauseButton() gtk.IWidget { m.pause = MustButton(MustImageFromFileWithSize("pause.svg", 40, 40), func() { - defer m.updateTemperature() + //defer m.updateTemperature() Logger.Warning("Pausing/Resuming job") cmd := &octoprint.PauseRequest{Action: octoprint.Toggle} @@ -125,7 +125,7 @@ func (m *statusPanel) createPauseButton() gtk.IWidget { func (m *statusPanel) createStopButton() gtk.IWidget { m.stop = MustButton(MustImageFromFileWithSize("stop.svg", 40, 40), func() { - defer m.updateTemperature() + //defer m.updateTemperature() Logger.Warning("Stopping job") if err := (&octoprint.CancelRequest{}).Do(m.UI.Printer); err != nil { @@ -138,7 +138,7 @@ func (m *statusPanel) createStopButton() gtk.IWidget { } func (m *statusPanel) update() { - m.updateTemperature() + //m.updateTemperature() m.updateJob() } From a457f6051156e8f27475037c5496c114c32f9bdc Mon Sep 17 00:00:00 2001 From: devsfan1830 Date: Fri, 28 Dec 2018 20:29:49 -0500 Subject: [PATCH 22/30] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 2c445be..dbb54e7 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,6 @@ +Changes by devsfan1830: Implemented the hanging workaround here "https://github.com/mcuadros/OctoPrint-TFT/issues/34#issuecomment-417065437" + + OctoPrint-TFT [![GitHub release](https://img.shields.io/github/release/mcuadros/OctoPrint-TFT.svg)](https://github.com/mcuadros/OctoPrint-TFT/releases) [![license](https://img.shields.io/github/license/mcuadros/OctoPrint-TFT.svg)]() ============= ### My changes to the original software (I'm also working on some bugs): From 2170b3def83af384ea348feff65544d5da7c4317 Mon Sep 17 00:00:00 2001 From: Nico Hirsch <30938717+noxhirsch@users.noreply.github.com> Date: Sun, 10 Feb 2019 19:53:04 +0100 Subject: [PATCH 23/30] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index dbb54e7..8833125 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,6 @@ +## If you can't see you files list, try uploading a new file via OctoPrint - that seems to work! + + Changes by devsfan1830: Implemented the hanging workaround here "https://github.com/mcuadros/OctoPrint-TFT/issues/34#issuecomment-417065437" From 19e2099d8ad5cfa8a428fc2cafb1c9a0b3757204 Mon Sep 17 00:00:00 2001 From: Nico Hirsch <30938717+noxhirsch@users.noreply.github.com> Date: Sun, 10 Feb 2019 19:53:25 +0100 Subject: [PATCH 24/30] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8833125..f269f94 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -## If you can't see you files list, try uploading a new file via OctoPrint - that seems to work! +# If you can't see you files list, try uploading a new file via OctoPrint - that seems to work! Changes by devsfan1830: Implemented the hanging workaround here "https://github.com/mcuadros/OctoPrint-TFT/issues/34#issuecomment-417065437" From b4283c097a7a68d705dcee5fe018aa7fe7b3669b Mon Sep 17 00:00:00 2001 From: Nico Hirsch <30938717+noxhirsch@users.noreply.github.com> Date: Sun, 10 Feb 2019 19:53:47 +0100 Subject: [PATCH 25/30] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f269f94..c4a8fa7 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ Changes by devsfan1830: Implemented the hanging workaround here "https://github. OctoPrint-TFT [![GitHub release](https://img.shields.io/github/release/mcuadros/OctoPrint-TFT.svg)](https://github.com/mcuadros/OctoPrint-TFT/releases) [![license](https://img.shields.io/github/license/mcuadros/OctoPrint-TFT.svg)]() ============= -### My changes to the original software (I'm also working on some bugs): +### My (@noxhirsch) changes to the original software (I'm also working on some bugs): - Changed the order of the homescreen elements - Reworked status screen to have more space for the important stuff and smaller buttons From a5221529a5e9bc3b056ba13657e724ddf69a3c74 Mon Sep 17 00:00:00 2001 From: Nico Hirsch <30938717+noxhirsch@users.noreply.github.com> Date: Sun, 17 Feb 2019 17:39:23 +0100 Subject: [PATCH 26/30] Update status.go --- ui/status.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ui/status.go b/ui/status.go index ec9ee79..d5d1a15 100644 --- a/ui/status.go +++ b/ui/status.go @@ -96,7 +96,7 @@ func (m *statusPanel) createInfoBox() *gtk.Box { func (m *statusPanel) createPrintButton() gtk.IWidget { m.print = MustButton(MustImageFromFileWithSize("status.svg", 40, 40), func() { - //defer m.updateTemperature() + defer m.updateTemperature() Logger.Warning("Starting a new job") if err := (&octoprint.StartRequest{}).Do(m.UI.Printer); err != nil { @@ -110,7 +110,7 @@ func (m *statusPanel) createPrintButton() gtk.IWidget { func (m *statusPanel) createPauseButton() gtk.IWidget { m.pause = MustButton(MustImageFromFileWithSize("pause.svg", 40, 40), func() { - //defer m.updateTemperature() + defer m.updateTemperature() Logger.Warning("Pausing/Resuming job") cmd := &octoprint.PauseRequest{Action: octoprint.Toggle} @@ -125,7 +125,7 @@ func (m *statusPanel) createPauseButton() gtk.IWidget { func (m *statusPanel) createStopButton() gtk.IWidget { m.stop = MustButton(MustImageFromFileWithSize("stop.svg", 40, 40), func() { - //defer m.updateTemperature() + defer m.updateTemperature() Logger.Warning("Stopping job") if err := (&octoprint.CancelRequest{}).Do(m.UI.Printer); err != nil { @@ -138,7 +138,7 @@ func (m *statusPanel) createStopButton() gtk.IWidget { } func (m *statusPanel) update() { - //m.updateTemperature() + m.updateTemperature() m.updateJob() } From ca4d011e6197c958e0d904184202fa48a3bc92f1 Mon Sep 17 00:00:00 2001 From: Nico Hirsch <30938717+noxhirsch@users.noreply.github.com> Date: Sun, 17 Feb 2019 17:39:50 +0100 Subject: [PATCH 27/30] Update README.md --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index c4a8fa7..34814ac 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,6 @@ # If you can't see you files list, try uploading a new file via OctoPrint - that seems to work! -Changes by devsfan1830: Implemented the hanging workaround here "https://github.com/mcuadros/OctoPrint-TFT/issues/34#issuecomment-417065437" - OctoPrint-TFT [![GitHub release](https://img.shields.io/github/release/mcuadros/OctoPrint-TFT.svg)](https://github.com/mcuadros/OctoPrint-TFT/releases) [![license](https://img.shields.io/github/license/mcuadros/OctoPrint-TFT.svg)]() ============= From 6b108a11cf623be0c17b94b2c97fb6c8c79e812c Mon Sep 17 00:00:00 2001 From: Nico Hirsch <30938717+noxhirsch@users.noreply.github.com> Date: Sun, 17 Feb 2019 17:59:25 +0100 Subject: [PATCH 28/30] Update system.go --- ui/system.go | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/ui/system.go b/ui/system.go index a46d7c6..c5de415 100644 --- a/ui/system.go +++ b/ui/system.go @@ -45,6 +45,9 @@ func (m *systemPanel) createActionBar() gtk.IWidget { bar.SetMarginBottom(5) bar.SetMarginEnd(5) + if d := m.createShutdownButton(); d != nil { + bar.Add(d) + } if b := m.createRestartButton(); b != nil { bar.Add(b) } @@ -75,6 +78,27 @@ func (m *systemPanel) createRestartButton() gtk.IWidget { return m.doCreateButtonFromCommand(cmd) } +func (m *systemPanel) createShutdownButton() gtk.IWidget { + r, err := (&octoprint.SystemCommandsRequest{}).Do(m.UI.Printer) + if err != nil { + Logger.Error(err) + return nil + } + + var cmd *octoprint.CommandDefinition + for _, c := range r.Core { + if c.Action == "shutdown" { + cmd = c + } + } + + if cmd == nil { + return nil + } + + return m.doCreateButtonFromCommand(cmd) +} + func (m *systemPanel) doCreateButtonFromCommand(cmd *octoprint.CommandDefinition) gtk.IWidget { do := func() { r := &octoprint.SystemExecuteCommandRequest{ From e5132ddadd0b6cc5325e492ac879b671e87bb7eb Mon Sep 17 00:00:00 2001 From: Nico Hirsch <30938717+noxhirsch@users.noreply.github.com> Date: Sun, 17 Feb 2019 18:13:20 +0100 Subject: [PATCH 29/30] Rename reboot.svg to shutdown.svg --- styles/default/images/{reboot.svg => shutdown.svg} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename styles/default/images/{reboot.svg => shutdown.svg} (100%) diff --git a/styles/default/images/reboot.svg b/styles/default/images/shutdown.svg similarity index 100% rename from styles/default/images/reboot.svg rename to styles/default/images/shutdown.svg From 26a731b284fff80ce291dd8fe3f5d2254086cf81 Mon Sep 17 00:00:00 2001 From: Nico Hirsch <30938717+noxhirsch@users.noreply.github.com> Date: Sun, 17 Feb 2019 18:13:47 +0100 Subject: [PATCH 30/30] Create reboot.svg --- styles/default/images/reboot.svg | 137 +++++++++++++++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 styles/default/images/reboot.svg diff --git a/styles/default/images/reboot.svg b/styles/default/images/reboot.svg new file mode 100644 index 0000000..3cb02ea --- /dev/null +++ b/styles/default/images/reboot.svg @@ -0,0 +1,137 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + +