From a68425d1fb557e66054d3ea4f4d9a58dd6f2214a Mon Sep 17 00:00:00 2001 From: Jordan Orelli Date: Sat, 17 Jun 2017 19:13:44 -0500 Subject: [PATCH] started the bg server stuff --- bg/background.go | 30 +++++++++++++++++++++++++++ bg/server.go | 42 ++++++++++++++++++++++++++++++++++++++ events/background_event.go | 10 +++++++++ events/event.go | 9 ++++++++ events/user_event.go | 15 ++++++++++++++ main.go | 18 ++++++++-------- ui/MainViewController.m | 11 +++++++--- ui/ui.go | 19 +++++------------ ui/ui_darwin.go | 18 +++++++++------- 9 files changed, 140 insertions(+), 32 deletions(-) create mode 100644 bg/background.go create mode 100644 bg/server.go create mode 100644 events/background_event.go create mode 100644 events/event.go create mode 100644 events/user_event.go diff --git a/bg/background.go b/bg/background.go new file mode 100644 index 0000000..70ba8c2 --- /dev/null +++ b/bg/background.go @@ -0,0 +1,30 @@ +package bg + +import ( + "github.com/jordanorelli/dws/events" +) + +func Run(out chan events.BackgroundEvent, in chan events.UserEvent) { + bg := &background{ + in: in, + out: out, + server: newServer(), + } + go bg.listen() + bg.run() +} + +type background struct { + in chan events.UserEvent + out chan events.BackgroundEvent + *server +} + +func (bg *background) run() { + for e := range bg.in { + switch v := e.(type) { + case events.UserSelectedDirectory: + bg.setRoot(v.Path) + } + } +} diff --git a/bg/server.go b/bg/server.go new file mode 100644 index 0000000..cc746fb --- /dev/null +++ b/bg/server.go @@ -0,0 +1,42 @@ +package bg + +import ( + "fmt" + "log" + "net/http" +) + +type server struct { + port int + root string +} + +func newServer() *server { + return &server{port: 8000} +} + +func (s *server) listen() { + addr := fmt.Sprintf("0.0.0.0:%d", s.port) + log.Printf("server listening on addr: %s\n", addr) + if err := http.ListenAndServe(addr, s); err != nil { + panic(err) + } +} + +func (s *server) setRoot(path string) { + log.Printf("server setting root to %s\n", path) + s.root = path +} + +func (s *server) ServeHTTP(w http.ResponseWriter, r *http.Request) { + if s.root == "" { + writeNotInitializedResponse(w) + return + } + fmt.Fprintf(w, "root: %s", s.root) +} + +func writeNotInitializedResponse(w http.ResponseWriter) { + w.WriteHeader(500) + fmt.Fprintln(w, "no root directory selected") +} diff --git a/events/background_event.go b/events/background_event.go new file mode 100644 index 0000000..d70f0e3 --- /dev/null +++ b/events/background_event.go @@ -0,0 +1,10 @@ +package events + +type BackgroundEvent interface { + Event + isBackgroundEvent() +} + +type backgroundEvent struct{ event } + +func (e backgroundEvent) isBackgroundEvent() {} diff --git a/events/event.go b/events/event.go new file mode 100644 index 0000000..1f22706 --- /dev/null +++ b/events/event.go @@ -0,0 +1,9 @@ +package events + +type Event interface { + isEvent() +} + +type event struct{} + +func (e event) isEvent() {} diff --git a/events/user_event.go b/events/user_event.go new file mode 100644 index 0000000..b7225c9 --- /dev/null +++ b/events/user_event.go @@ -0,0 +1,15 @@ +package events + +type UserEvent interface { + Event + isUserEvent() +} + +type userEvent struct{ event } + +func (e userEvent) isUserEvent() {} + +type UserSelectedDirectory struct { + Path string + userEvent +} diff --git a/main.go b/main.go index 38429de..d7de118 100644 --- a/main.go +++ b/main.go @@ -4,8 +4,11 @@ import ( "fmt" "log" "os" + "runtime" "strings" + "github.com/jordanorelli/dws/bg" + "github.com/jordanorelli/dws/events" "github.com/jordanorelli/dws/ui" ) @@ -22,18 +25,17 @@ func exit(status int, t string, args ...interface{}) { } func main() { + runtime.LockOSThread() + log.Println("Creating new Desktop UI") desktop := ui.Desktop() - c := make(chan ui.Event, 1) - go func() { - for e := range c { - log.Printf("UI Event: %v\n", e) - } - }() + uiEvents := make(chan events.UserEvent, 1) + bgEvents := make(chan events.BackgroundEvent, 1) + + go bg.Run(bgEvents, uiEvents) - log.Println("Running Desktop UI") - if err := desktop.Run(c); err != nil { + if err := desktop.Run(uiEvents, bgEvents); err != nil { exit(1, "UI Error: %v", err) } } diff --git a/ui/MainViewController.m b/ui/MainViewController.m index eba8548..7555e14 100644 --- a/ui/MainViewController.m +++ b/ui/MainViewController.m @@ -6,6 +6,7 @@ @property (nonatomic, strong) NSOpenPanel *selectDirectoryPanel; @property (nonatomic, strong) NSButton *selectDirectoryButton; +@property (nonatomic, strong) NSTextField *selectedDirectoryText; @end @@ -36,7 +37,11 @@ [self.selectDirectoryButton setTranslatesAutoresizingMaskIntoConstraints:NO]; [self.view addSubview:self.selectDirectoryButton]; - // setup button constraints + // create label to show selected directory + self.selectedDirectoryText = [NSTextField labelWithString:@"(none)"]; + [self.view addSubview:self.selectedDirectoryText]; + + // setup constraints [self.selectDirectoryButton.rightAnchor constraintEqualToAnchor:self.view.rightAnchor constant:-8.0].active = YES; @@ -53,8 +58,8 @@ return; } NSURL *selected = [[self.selectDirectoryPanel URLs] objectAtIndex:0]; - NSString *path = [selected path]; - selectDirectory((GoString){path.UTF8String, path.length}); + char *path = (char *)[[selected path] UTF8String]; + selectDirectory(path); }]; } diff --git a/ui/ui.go b/ui/ui.go index 67831e7..cdc37d6 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -1,18 +1,9 @@ package ui -type UI interface { - Run(chan Event) error -} - -type Event interface { - isUIEvent() -} +import ( + "github.com/jordanorelli/dws/events" +) -type event struct{} - -func (e event) isUIEvent() {} - -type SelectDirectoryEvent struct { - Path string - event +type UI interface { + Run(chan events.UserEvent, chan events.BackgroundEvent) error } diff --git a/ui/ui_darwin.go b/ui/ui_darwin.go index 52200d4..1ba570e 100644 --- a/ui/ui_darwin.go +++ b/ui/ui_darwin.go @@ -2,7 +2,8 @@ package ui import ( "log" - "runtime" + + "github.com/jordanorelli/dws/events" ) /* @@ -19,24 +20,27 @@ func Desktop() UI { return desktopUI } - log.Println("Creating new cocoaUI") - runtime.LockOSThread() + log.Println("Creating new Cocoa UI") C.Initialize() desktopUI = new(cocoaUI) return desktopUI } type cocoaUI struct { - out chan Event + in chan events.BackgroundEvent + out chan events.UserEvent } -func (ui *cocoaUI) Run(out chan Event) error { +func (ui *cocoaUI) Run(out chan events.UserEvent, in chan events.BackgroundEvent) error { + log.Println("Running Desktop UI") + ui.in = in ui.out = out C.Run() return nil } //export selectDirectory -func selectDirectory(path string) { - desktopUI.out <- SelectDirectoryEvent{Path: path} +func selectDirectory(cpath *C.char) { + path := C.GoString(cpath) + desktopUI.out <- events.UserSelectedDirectory{Path: path} }