Skip to content

Commit e752fc2

Browse files
improved refactor commands, added folder_explorer and img folder
1 parent 4248643 commit e752fc2

15 files changed

+495
-118
lines changed

_generated_2018_02_07_at_02_01_16.py renamed to _generated_2018_02_08_at_00_50_09.py

Lines changed: 227 additions & 58 deletions
Large diffs are not rendered by default.

helper/PopupManager.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ def setVisible(self, popup_type, visible):
1313
self.popup_types[popup_type]["visible"] = visible
1414

1515
def isVisible(self, popup_type):
16-
return self.popup_types[popup_type]["visible"]
16+
return self.popup_types[popup_type]["visible"] and sublime.active_window().active_view().is_popup_visible()
1717

1818
def register(self, popup_type):
1919
self.popup_types[popup_type] = {
@@ -27,3 +27,4 @@ def unregister(self, popup_type):
2727
popupManager.register("hint_parameters")
2828
popupManager.register("flow_error")
2929
popupManager.register("can_i_use")
30+
popupManager.register("folder_explorer")

helper/WindowView.py

Lines changed: 26 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,9 @@ def add(self, text, key="", scope="", icon="", flags=sublime.HIDDEN, region_id="
8080
if region_id in self.region_ids:
8181
raise Exception("Error: ID "+region_id+" already used.")
8282

83+
if region_id:
84+
self.region_ids.append(region_id)
85+
8386
space = (" "*int(padding))
8487
text = space+text+space
8588

@@ -102,8 +105,6 @@ def add(self, text, key="", scope="", icon="", flags=sublime.HIDDEN, region_id="
102105
self.view.run_command("append_text_view", args={"text": "\n", "key": "", "scope": "", "icon": "", "flags": sublime.HIDDEN})
103106

104107
self.view.set_read_only(True)
105-
if region_id:
106-
self.region_ids.append(region_id)
107108

108109
def addTitle(self, text, key="", scope="javascriptenhancements.title", icon="", flags=sublime.DRAW_EMPTY | sublime.DRAW_NO_OUTLINE, region_id="", padding=2, display_block=True, insert_point=None, replace_points=[]):
109110
space_padding = (" "*int(padding))
@@ -113,6 +114,7 @@ def addTitle(self, text, key="", scope="javascriptenhancements.title", icon="",
113114

114115
self.add("\n\nNOTE: See the keymap ")
115116
self.addLink("here", "https://github.com/pichillilorenzo/JavaScriptEnhancements/wiki", "link")
117+
self.add(" ")
116118

117119
def addSubTitle(self, text, key="", scope="javascriptenhancements.subtitle", icon="", flags=sublime.DRAW_EMPTY | sublime.DRAW_NO_OUTLINE, region_id="", padding=1, display_block=True, insert_point=None, replace_points=[]):
118120
self.add(text, key=key, scope=scope, icon=icon, flags=flags, region_id=region_id, padding=padding, display_block=display_block, insert_point=insert_point, replace_points=replace_points)
@@ -136,8 +138,9 @@ def addInput(self, value=" ", label=None, key="input", scope="javascriptenhancem
136138

137139
if label:
138140
self.add(label)
139-
self.add(value, key=key, scope=scope, icon=icon, flags=flags, region_id=region_id, padding=padding, display_block=display_block, insert_point=insert_point, replace_points=replace_points)
141+
140142
self.region_input_ids.append(region_id)
143+
self.add(value, key=key, scope=scope, icon=icon, flags=flags, region_id=region_id, padding=padding, display_block=display_block, insert_point=insert_point, replace_points=replace_points)
141144

142145
def updateInput(self, value, key="input", scope="javascriptenhancements.input", icon="", flags=sublime.DRAW_EMPTY | sublime.DRAW_NO_OUTLINE, region_id="", padding=1, display_block=False, insert_point=None, replace_points=[]):
143146

@@ -150,6 +153,7 @@ def updateInput(self, value, key="input", scope="javascriptenhancements.input",
150153
raise Exception("Error: ID "+region_id+" already used.")
151154

152155
self.region_input_ids.append(region_id)
156+
self.updateInputState()
153157

154158
def addSelect(self, default_option, options, label=None, key="select", scope="javascriptenhancements.input", icon="", flags=sublime.DRAW_EMPTY | sublime.DRAW_NO_OUTLINE, region_id="", padding=1, display_block=False, insert_point=None, replace_points=[]):
155159

@@ -161,8 +165,8 @@ def addSelect(self, default_option, options, label=None, key="select", scope="ja
161165

162166
if label:
163167
self.add(label)
164-
self.add(options[default_option] + " ▼", key=key, scope=scope, icon=icon, flags=flags, region_id=region_id, padding=padding, display_block=display_block, insert_point=insert_point, replace_points=replace_points)
165168
self.region_input_ids.append(region_id)
169+
self.add(options[default_option] + " ▼", key=key, scope=scope, icon=icon, flags=flags, region_id=region_id, padding=padding, display_block=display_block, insert_point=insert_point, replace_points=replace_points)
166170

167171
self.addEventListener("drag_select", key+"."+scope, lambda view: sublime.set_timeout_async(lambda: self.view.window().show_quick_panel(options, lambda index: self.updateSelect(index, options, key=key, scope=scope, icon=icon, flags=flags, region_id=region_id, padding=padding, display_block=display_block, insert_point=insert_point, replace_points=replace_points))))
168172

@@ -171,54 +175,27 @@ def updateSelect(self, index, options, key="select", scope="javascriptenhancemen
171175
return
172176

173177
self.replaceById(region_id, options[index] + " ▼", key=key, scope=scope, icon=icon, flags=flags, region_id=region_id, padding=padding, display_block=display_block, insert_point=insert_point, replace_points=replace_points)
178+
179+
if not region_id:
180+
raise Exception("Error: ID isn't setted.")
181+
182+
if region_id in self.region_input_ids:
183+
raise Exception("Error: ID "+region_id+" already used.")
184+
174185
self.region_input_ids.append(region_id)
186+
self.updateInputState()
175187

176188
def addLink(self, text, link, scope, key="click", icon="", flags=sublime.DRAW_NO_FILL | sublime.DRAW_NO_OUTLINE | sublime.DRAW_SOLID_UNDERLINE, region_id="", padding=0, display_block=False, insert_point=None, replace_points=[]):
177189
self.add(text, key=key, scope=scope, icon=icon, flags=flags, region_id=region_id, padding=padding, display_block=display_block, insert_point=insert_point, replace_points=replace_points)
178190

179191
self.addEventListener("drag_select", key+"."+scope, lambda view: sublime.active_window().run_command("open_url", args={"url": link}))
180192

181-
def addExplorer(self, scope, key="click", icon="", flags=sublime.DRAW_EMPTY | sublime.DRAW_NO_OUTLINE, region_id="", padding=1, display_block=False, insert_point=None, replace_points=[]):
182-
self.addButton("...", callback=lambda view: self.openExplorer(), key=key, scope=scope, icon=icon, flags=flags, region_id=region_id, padding=padding, display_block=display_block, insert_point=insert_point, replace_points=replace_points)
183-
184-
def openExplorer(self, path=""):
185-
186-
path = path.strip()
187-
if path:
188-
pass
189-
elif self.view_caller and self.view_caller.file_name():
190-
path = self.view_caller.file_name()
191-
elif self.window.folders():
192-
path = self.window.folders()[0]
193-
else:
194-
sublime.error_message('JavaScript Enhancements: No place to open Explorer to')
195-
return False
196-
197-
if not os.path.isdir(path):
198-
path = os.path.dirname(path)
193+
def addFolderExplorer(self, scope, region_input_id, start_path="", key="click", icon="", flags=sublime.DRAW_EMPTY | sublime.DRAW_NO_OUTLINE, region_id="", padding=1, display_block=False, insert_point=None, replace_points=[], only_dir=False, only_file=False):
199194

200-
dirs = []
201-
files = []
195+
folder_explorer = FolderExplorer(self.view, start_path=start_path, callback_choose=lambda path: self.updateInput(path, region_id=region_input_id), only_dir=only_dir, only_file=only_file)
202196

203-
for item in os.listdir(path):
204-
abspath = os.path.join(path, item)
205-
is_dir = os.path.isdir(abspath)
206-
if is_dir:
207-
dirs.append(abspath)
208-
else:
209-
files.append(abspath)
210-
211-
html = "<ul>"
212-
213-
for d in dirs:
214-
html += "<li> DIR: <a>" + os.path.basename(d) + "</a></li>"
215-
216-
for f in files:
217-
html += "<li> FILE: <a>" + os.path.basename(f) + "</a></li>"
218-
219-
html += "</ul>"
220-
html += "<a>Choose</a>"
221-
sublime.set_timeout_async(lambda: self.view.show_popup(html, 0, 5, 500, 500), 50)
197+
self.add(text=" ")
198+
self.addButton("...", callback=lambda view: folder_explorer.open( self.getInput(region_input_id) ), key=key, scope=scope, icon=icon, flags=flags, region_id=region_id, padding=padding, display_block=display_block, insert_point=insert_point, replace_points=replace_points)
222199

223200
def getInput(self, region_input_id):
224201
region = self.view.get_regions(region_input_id)
@@ -441,6 +418,12 @@ def run(self, edit, **args):
441418
if "region_id" in args and args.get("region_id"):
442419
view.add_regions(args.get("region_id"), [region], scope, icon, flags)
443420

421+
class EraseTextViewCommand(sublime_plugin.TextCommand):
422+
def run(self, edit, **args):
423+
view = self.view
424+
region = sublime.Region(0, view.size())
425+
view.erase(edit, region)
426+
444427
class WindowViewKeypressCommand(sublime_plugin.TextCommand):
445428
def run(self, edit, **args):
446429
view = self.view

helper/can_i_use/can_i_use_data.json

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.
Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
import os, traceback
2+
3+
class FolderExplorer:
4+
5+
view = None
6+
start_path = ""
7+
current_path = ""
8+
selected_dir = ""
9+
selected_file = ""
10+
callback_choose = None
11+
only_dir = False
12+
only_file = False
13+
closed = False
14+
point = 5
15+
16+
def __init__(self, view, point=5, start_path="", callback_choose=None, only_dir=False, only_file=False):
17+
18+
self.view = view
19+
self.start_path = start_path.strip()
20+
self.callback_choose = callback_choose
21+
self.only_dir = only_dir
22+
self.only_file = only_file
23+
self.point = point
24+
25+
if self.start_path:
26+
pass
27+
elif self.view and self.view.file_name():
28+
self.start_path = self.view.file_name()
29+
elif self.view and self.view.window().folders():
30+
self.start_path = self.view.window().folders()[0]
31+
else:
32+
raise Exception('JavaScript Enhancements: No place to open Folder Explorer to')
33+
34+
if not os.path.isdir(self.start_path):
35+
self.start_path = os.path.dirname(self.start_path)
36+
37+
self.current_path = self.start_path
38+
39+
self.style_css = ""
40+
with open(os.path.join(HELPER_FOLDER, "folder_explorer", "style.css")) as css_file:
41+
self.style_css = "<style>"+css_file.read()+"</style>"
42+
43+
def open(self, path=""):
44+
45+
dirs = []
46+
files = []
47+
48+
self.current_path = path if path else self.current_path
49+
50+
if not os.path.isdir(self.current_path):
51+
self.current_path = os.path.dirname(self.current_path)
52+
53+
try:
54+
for item in os.listdir(self.current_path):
55+
abspath = os.path.join(self.current_path, item)
56+
is_dir = os.path.isdir(abspath)
57+
if is_dir:
58+
dirs.append(abspath)
59+
else:
60+
files.append(abspath)
61+
except PermissionError as e:
62+
sublime.error_message("Permission denied: " + self.current_path)
63+
if os.path.dirname(self.current_path) != self.current_path:
64+
try:
65+
os.listdir(os.path.dirname(self.current_path))
66+
self.open(os.path.dirname(self.current_path))
67+
except Exception as e2:
68+
if self.start_path != self.current_path:
69+
self.open(self.start_path)
70+
return
71+
72+
dirs = sorted(dirs)
73+
files = sorted(files)
74+
75+
html = """
76+
<html>
77+
<head></head>
78+
<body>""" + self.style_css + """
79+
<div class="content">
80+
<p>Folder Explorer """ + (" - Only Directories" if self.only_dir else (" - Only Files" if self.only_file else "")) + """</p>
81+
<p class="current-directory">""" + self.current_path + """</p>
82+
"""
83+
84+
html += """
85+
<div class="item-list">
86+
"""
87+
88+
img_directory_src = "file://" + IMG_FOLDER + "/folder.png"
89+
90+
if self.current_path != os.path.dirname(self.current_path):
91+
action = "navigate_dir|" + os.path.dirname(self.current_path)
92+
html += "<div class=\"item directory\"><a href=\"" + action + "\"><img class=\"item-image directory-image\" src=\"" + img_directory_src + "\">..</a></div>"
93+
94+
if not self.only_file:
95+
for d in dirs:
96+
97+
action = "select_dir|" + d
98+
html += "<div class=\"item directory\"><a href=\"" + action + "\"><img class=\"item-image directory-image\" src=\"" + img_directory_src + "\">" + os.path.basename(d) + "</a></div>"
99+
100+
if not self.only_dir:
101+
for f in files:
102+
103+
action = "select_file|" + f
104+
html += "<div class=\"item file\"><a href=\"" + action + "\">" + os.path.basename(f) + "</a></div>"
105+
106+
html += """
107+
</div>
108+
<a class="button reset-path-button" href=\"navigate_dir|""" + self.start_path + """\">reset path</a>
109+
<a class="button choose-button" href=\"choose\">choose</a>
110+
<a class="button close-button" href=\"close\">close</a>
111+
</div>
112+
</body>
113+
</html>
114+
"""
115+
116+
if not popupManager.isVisible("folder_explorer"):
117+
self.closed = False
118+
popupManager.setVisible("folder_explorer", True)
119+
sublime.set_timeout(lambda:
120+
self.view.show_popup(
121+
html,
122+
sublime.COOPERATE_WITH_AUTO_COMPLETE,
123+
self.point, 700, 500,
124+
self.action,
125+
lambda: popupManager.setVisible("folder_explorer", False) or ( self.open() if not self.closed else False ))
126+
, 50)
127+
else:
128+
self.view.update_popup(html)
129+
130+
def action(self, action, parameters=[]):
131+
132+
if not parameters:
133+
action = action.split("|")
134+
parameters = action[1:]
135+
action = action[0]
136+
137+
if action == "select_dir":
138+
if self.selected_dir == parameters[0]:
139+
self.action("navigate_dir", parameters)
140+
else:
141+
self.selected_dir = parameters[0]
142+
self.selected_file = ""
143+
144+
elif action == "select_file":
145+
self.selected_file = parameters[0]
146+
self.selected_dir = ""
147+
148+
elif action == "navigate_dir":
149+
self.selected_dir = ""
150+
self.selected_file = ""
151+
self.open(parameters[0])
152+
153+
elif action == "choose":
154+
if ( self.selected_dir or self.selected_file or self.current_path ) and self.callback_choose:
155+
self.callback_choose( self.selected_dir or self.selected_file or self.current_path )
156+
self.action("close")
157+
return
158+
159+
elif action == "close":
160+
self.closed = True
161+
self.selected_dir = ""
162+
self.selected_file = ""
163+
self.view.hide_popup()
164+
165+
if self.selected_dir or self.selected_file:
166+
panel = Util.create_and_show_panel("folder_explorer_selection", window=self.view.window(), return_if_exists=True, unlisted=True)
167+
panel.set_read_only(False)
168+
panel.run_command("erase_text_view")
169+
panel.run_command("insert_text_view", args={"text": "Selected: " + ( self.selected_dir or self.selected_file ), "point": 0 })
170+
panel.set_read_only(True)
171+
else:
172+
self.view.window().destroy_output_panel("folder_explorer_selection")

helper/folder_explorer/style.css

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
body, html {
2+
margin: 0;
3+
padding: 0;
4+
}
5+
.content{
6+
padding: 10px 20px 20px 20px;
7+
}
8+
.item-list{
9+
margin: 10px 0 10px 0;
10+
}
11+
.directory-image{
12+
position: relative;
13+
top: 10px;
14+
}
15+
.item a {
16+
text-decoration: none;
17+
}
18+
.item {
19+
padding: 2px 0 2px 0;
20+
}
21+
.button {
22+
color: #fff;
23+
font-weight: bold;
24+
}
25+
.reset-path-button {
26+
text-decoration: none;
27+
background-color: #43A047;
28+
padding: 5px;
29+
}
30+
.choose-button {
31+
text-decoration: none;
32+
background-color: #1E88E5;
33+
padding: 5px;
34+
}
35+
.close-button {
36+
text-decoration: none;
37+
background-color: #E53935;
38+
padding: 5px;
39+
}

helper/main.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
${include WindowView.py}
88

9+
${include folder_explorer/FolderExplorer.py}
10+
911
${include navigate_regions.py}
1012

1113
${include wait_modified_async_view_event_listener.py}

0 commit comments

Comments
 (0)