Преглед на файлове

added persistent fullscreen mode for a single view (F11)

Nicolas Cannasse преди 6 години
родител
ревизия
c947a1b4d1
променени са 6 файла, в които са добавени 103 реда и са изтрити 17 реда
  1. 13 0
      bin/cdb.css
  2. 15 0
      bin/cdb.less
  3. 4 0
      bin/defaultProps.json
  4. 6 1
      hide/Config.hx
  5. 45 15
      hide/Ide.hx
  6. 20 1
      hide/ui/View.hx

+ 13 - 0
bin/cdb.css

@@ -297,3 +297,16 @@
   padding: 2px;
   padding: 2px;
   border: 1px solid #A00;
   border: 1px solid #A00;
 }
 }
+body.fullScreenMode .lm_content,
+body.fullScreenMode .lm_header,
+body.fullScreenMode .lm_splitter {
+  display: none;
+}
+body.fullScreenMode .lm_content.fullScreen {
+  display: block;
+  position: absolute;
+  left: 0;
+  top: 0;
+  width: 100% !important;
+  height: 100% !important;
+}

+ 15 - 0
bin/cdb.less

@@ -337,3 +337,18 @@
 
 
 	}
 	}
 }
 }
+
+
+body.fullScreenMode {
+	.lm_content, .lm_header, .lm_splitter {
+		display : none;
+	}
+	.lm_content.fullScreen {
+		display: block;
+		position: absolute;
+		left: 0;
+		top: 0;
+		width : 100% !important;
+		height: 100% !important;
+	}
+}

+ 4 - 0
bin/defaultProps.json

@@ -33,6 +33,10 @@
 	"key.selectAll" : "Ctrl-A",
 	"key.selectAll" : "Ctrl-A",
 	"key.playPause" : "Space",
 	"key.playPause" : "Space",
 
 
+	// view keys
+
+	"key.view.fullScreen" : "F11",
+
 	// cdb keys
 	// cdb keys
 
 
 	"key.cdb.showReferences" : "Shift+F12",
 	"key.cdb.showReferences" : "Shift+F12",

+ 6 - 1
hide/Config.hx

@@ -1,8 +1,13 @@
 package hide;
 package hide;
 
 
+typedef LayoutState = {
+	var content : Any;
+	var fullScreen : { name : String, state : Any };
+}
+
 typedef HideConfig = {
 typedef HideConfig = {
 	var autoSaveLayout : Null<Bool>;
 	var autoSaveLayout : Null<Bool>;
-	var layouts : Array<{ name : String, state : Dynamic }>;
+	var layouts : Array<{ name : String, state : LayoutState }>;
 
 
 	var currentProject : String;
 	var currentProject : String;
 	var recentProjects : Array<String>;
 	var recentProjects : Array<String>;

+ 45 - 15
hide/Ide.hx

@@ -34,7 +34,9 @@ class Ide {
 	var window : nw.Window;
 	var window : nw.Window;
 	var layout : golden.Layout;
 	var layout : golden.Layout;
 
 
-	var currentLayout : { name : String, state : Dynamic };
+	var currentLayout : { name : String, state : Config.LayoutState };
+	var defaultLayout : { name : String, state : Config.LayoutState };
+	var currentFullScreen(default,set) : hide.ui.View<Dynamic>;
 	var maximized : Bool;
 	var maximized : Bool;
 	var updates : Array<Void->Void> = [];
 	var updates : Array<Void->Void> = [];
 	var views : Array<hide.ui.View<Dynamic>> = [];
 	var views : Array<hide.ui.View<Dynamic>> = [];
@@ -227,7 +229,7 @@ class Ide {
 			config.global.save();
 			config.global.save();
 	}
 	}
 
 
-	function initLayout( ?state : { name : String, state : Dynamic } ) {
+	function initLayout( ?state : { name : String, state : Config.LayoutState } ) {
 		initializing = true;
 		initializing = true;
 
 
 		if( layout != null ) {
 		if( layout != null ) {
@@ -235,14 +237,16 @@ class Ide {
 			layout = null;
 			layout = null;
 		}
 		}
 
 
-		var defaultLayout = null;
+		defaultLayout = null;
+		var emptyLayout : Config.LayoutState = { content : [], fullScreen : null };
 		for( p in config.current.current.hide.layouts )
 		for( p in config.current.current.hide.layouts )
 			if( p.name == "Default" ) {
 			if( p.name == "Default" ) {
+				if( p.state.content == null ) continue; // old version
 				defaultLayout = p;
 				defaultLayout = p;
 				break;
 				break;
 			}
 			}
 		if( defaultLayout == null ) {
 		if( defaultLayout == null ) {
-			defaultLayout = { name : "Default", state : [] };
+			defaultLayout = { name : "Default", state : emptyLayout };
 			ideConfig.layouts.push(defaultLayout);
 			ideConfig.layouts.push(defaultLayout);
 			config.current.sync();
 			config.current.sync();
 			config.global.save();
 			config.global.save();
@@ -251,12 +255,12 @@ class Ide {
 			state = defaultLayout;
 			state = defaultLayout;
 
 
 		if( subView != null )
 		if( subView != null )
-			state = { name : "SubView", state : [] };
+			state = { name : "SubView", state : emptyLayout };
 
 
 		this.currentLayout = state;
 		this.currentLayout = state;
 
 
 		var config : golden.Config = {
 		var config : golden.Config = {
-			content: state.state,
+			content: state.state.content,
 		};
 		};
 		var comps = new Map();
 		var comps = new Map();
 		for( vcl in hide.ui.View.viewClasses )
 		for( vcl in hide.ui.View.viewClasses )
@@ -280,12 +284,7 @@ class Ide {
 			});
 			});
 
 
 		layout.init();
 		layout.init();
-		layout.on('stateChanged', function() {
-			if( !ideConfig.autoSaveLayout )
-				return;
-			defaultLayout.state = saveLayout();
-			if( subView == null ) this.config.global.save();
-		});
+		layout.on('stateChanged', onLayoutChanged);
 
 
 		var waitCount = 0;
 		var waitCount = 0;
 		function waitInit() {
 		function waitInit() {
@@ -293,13 +292,26 @@ class Ide {
 			if( !layout.isInitialised ) {
 			if( !layout.isInitialised ) {
 				if( waitCount > 20 ) {
 				if( waitCount > 20 ) {
 					// timeout : error recovery if invalid component
 					// timeout : error recovery if invalid component
-					state.state = [];
+					state.state = emptyLayout;
 					initLayout();
 					initLayout();
 					return;
 					return;
 				}
 				}
 				haxe.Timer.delay(waitInit, 50);
 				haxe.Timer.delay(waitInit, 50);
 				return;
 				return;
 			}
 			}
+			if( state.state.fullScreen != null ) {
+				var fs = state.state.fullScreen;
+				var found = [for( v in views ) if( v.viewClass == fs.name ) v];
+				if( found.length == 1 )
+					found[0].fullScreen = true;
+				else {
+					for( f in found )
+						if( haxe.Json.stringify(f.state) == haxe.Json.stringify(fs.state) ) {
+							f.fullScreen = true;
+							return;
+						}
+				}
+			}
 			initializing = false;
 			initializing = false;
 			if( subView == null && views.length == 0 )
 			if( subView == null && views.length == 0 )
 				open("hide.view.FileTree",{path:""});
 				open("hide.view.FileTree",{path:""});
@@ -323,8 +335,26 @@ class Ide {
 			f();
 			f();
 	}
 	}
 
 
-	function saveLayout() {
-		return layout.toConfig().content;
+	function set_currentFullScreen(v) {
+		var old = currentFullScreen;
+		currentFullScreen = v;
+		if( old != null ) old.fullScreen = false;
+		onLayoutChanged();
+		return v;
+	}
+
+	function onLayoutChanged() {
+		if( initializing || !ideConfig.autoSaveLayout )
+			return;
+		defaultLayout.state = saveLayout();
+		if( subView == null ) this.config.global.save();
+	}
+
+	function saveLayout() : Config.LayoutState {
+		return {
+			content : layout.toConfig().content,
+			fullScreen : currentFullScreen == null ? null : { name : currentFullScreen.viewClass, state : currentFullScreen.state }
+		};
 	}
 	}
 
 
 	function get_ideConfig() return config.global.source.hide;
 	function get_ideConfig() return config.global.source.hide;

+ 20 - 1
hide/ui/View.hx

@@ -14,6 +14,7 @@ class View<T> extends hide.comp.Component {
 
 
 	var container : golden.Container;
 	var container : golden.Container;
 	var watches : Array<{ keep : Bool, path : String, callb : Void -> Void }> = [];
 	var watches : Array<{ keep : Bool, path : String, callb : Void -> Void }> = [];
+	public var fullScreen(get,set) : Bool;
 	public var keys(get,null) : Keys;
 	public var keys(get,null) : Keys;
 	public var state(default, null) : T;
 	public var state(default, null) : T;
 	public var undo(default, null) = new hide.ui.UndoHistory();
 	public var undo(default, null) = new hide.ui.UndoHistory();
@@ -29,6 +30,7 @@ class View<T> extends hide.comp.Component {
 		element = null;
 		element = null;
 		this.state = state;
 		this.state = state;
 		ide = Ide.inst;
 		ide = Ide.inst;
+		@:privateAccess ide.currentFullScreen = null;
 	}
 	}
 
 
 	public function watch( filePath : String, onChange : Void -> Void, ?opts : { ?checkDelete : Bool, ?keepOnRebuild : Bool } ) {
 	public function watch( filePath : String, onChange : Void -> Void, ?opts : { ?checkDelete : Bool, ?keepOnRebuild : Bool } ) {
@@ -51,7 +53,10 @@ class View<T> extends hide.comp.Component {
 	}
 	}
 
 
 	function get_keys() {
 	function get_keys() {
-		if( keys == null ) keys = new Keys(null);
+		if( keys == null ) {
+			keys = new Keys(null);
+			keys.register("view.fullScreen", function() fullScreen = !fullScreen);
+		}
 		return keys;
 		return keys;
 	}
 	}
 
 
@@ -202,6 +207,7 @@ class View<T> extends hide.comp.Component {
 			if( s != null )
 			if( s != null )
 				s.dispose();
 				s.dispose();
 		}
 		}
+		element = null;
 	}
 	}
 
 
 	function buildTabMenu() : Array<hide.comp.ContextMenu.ContextMenuItem> {
 	function buildTabMenu() : Array<hide.comp.ContextMenu.ContextMenuItem> {
@@ -218,6 +224,19 @@ class View<T> extends hide.comp.Component {
 	function get_contentHeight() return container.height;
 	function get_contentHeight() return container.height;
 	function get_defaultOptions() return viewClasses.get(Type.getClassName(Type.getClass(this))).options;
 	function get_defaultOptions() return viewClasses.get(Type.getClassName(Type.getClass(this))).options;
 
 
+	function get_fullScreen() return container != null && container.getElement().is(".fullScreen");
+	function set_fullScreen(v) {
+		if( fullScreen == v )
+			return v;
+		if( container != null ) {
+			new Element(".fullScreen").removeClass("fullScreen");
+			container.getElement().toggleClass("fullScreen", v);
+			new Element("body").toggleClass("fullScreenMode",v);
+		}
+		@:privateAccess if( v ) ide.currentFullScreen = this else ide.currentFullScreen = null;
+		return v;
+	}
+
 	public static var viewClasses = new Map<String,{ name : String, cl : Class<View<Dynamic>>, options : ViewOptions }>();
 	public static var viewClasses = new Map<String,{ name : String, cl : Class<View<Dynamic>>, options : ViewOptions }>();
 	public static function register<T>( cl : Class<View<T>>, ?options : ViewOptions ) {
 	public static function register<T>( cl : Class<View<T>>, ?options : ViewOptions ) {
 		var name = Type.getClassName(cl);
 		var name = Type.getClassName(cl);