|
1
|
|
|
""" |
|
2
|
|
|
This module provides commands to create new Rainmeter skins. |
|
3
|
|
|
|
|
4
|
|
|
This can be either by adding a new skin file to an existing/current skin |
|
5
|
|
|
or by create a whole new skin in general. |
|
6
|
|
|
""" |
|
7
|
|
|
|
|
8
|
|
|
|
|
9
|
|
|
import os |
|
10
|
|
|
import re |
|
11
|
|
|
|
|
12
|
|
|
import sublime |
|
13
|
|
|
import sublime_plugin |
|
14
|
|
|
|
|
15
|
|
|
from .path.skin_path_provider import get_cached_skin_path |
|
16
|
|
|
|
|
17
|
|
|
|
|
18
|
|
|
class RainmeterNewSkinFileCommand(sublime_plugin.WindowCommand): # pylint: disable=R0903; sublime text API, methods are overriden |
|
19
|
|
|
"""Open a new view and insert a skin skeleton.""" |
|
20
|
|
|
|
|
21
|
|
|
def run(self): |
|
22
|
|
|
"""Called when the command is run.""" |
|
23
|
|
|
view = self.window.new_file() |
|
24
|
|
|
view.run_command( |
|
25
|
|
|
"insert_snippet", |
|
26
|
|
|
{"name": "Packages/Rainmeter/Snippets/skin.sublime-snippet"}) |
|
27
|
|
|
|
|
28
|
|
|
if os.path.exists("Packages/User/Rainmeter.sublime-syntax"): |
|
29
|
|
|
view.set_syntax_file("Packages/User/Rainmeter.sublime-syntax") |
|
30
|
|
|
else: |
|
31
|
|
|
view.set_syntax_file("Packages/Rainmeter/Rainmeter.sublime-syntax") |
|
32
|
|
|
|
|
33
|
|
|
|
|
34
|
|
|
class RainmeterNewSkinCommand(sublime_plugin.WindowCommand): |
|
35
|
|
|
""" |
|
36
|
|
|
Create a new skin, complete with folders, open it and refresh Rainmeter. |
|
37
|
|
|
|
|
38
|
|
|
Prompts the user for the name of a skin and creates a new skin of that |
|
39
|
|
|
name in the skins folder, if it doesn't already exist. Then opens the skin |
|
40
|
|
|
file, inserts a basic skin skeleton and refreshes Rainmeter. |
|
41
|
|
|
""" |
|
42
|
|
|
|
|
43
|
|
|
def run(self): |
|
44
|
|
|
"""Called when the command is run.""" |
|
45
|
|
|
self.window.show_input_panel("Enter Skin Name:", |
|
46
|
|
|
"", |
|
47
|
|
|
self.create_skin, |
|
48
|
|
|
None, |
|
49
|
|
|
None) |
|
50
|
|
|
|
|
51
|
|
|
def create_skin(self, name): |
|
52
|
|
|
"""Callback method executed after the user entered the skin name.""" |
|
53
|
|
|
skinspath = get_cached_skin_path() |
|
54
|
|
|
if not skinspath or not os.path.exists(skinspath): |
|
55
|
|
|
sublime.error_message( |
|
56
|
|
|
"Error while trying to create new skin: " + |
|
57
|
|
|
"Skins path could not be found. Please check the value" + |
|
58
|
|
|
" of your \"skins_path\" setting.") |
|
59
|
|
|
return |
|
60
|
|
|
|
|
61
|
|
|
name = os.path.normpath(name.strip("\\").strip("/")) + "\\" |
|
62
|
|
|
|
|
63
|
|
|
# Path where the new ini file will be created |
|
64
|
|
|
newskinpath = os.path.join(skinspath, name) |
|
65
|
|
|
|
|
66
|
|
|
# Path where the @Resources folder should be created |
|
67
|
|
|
basepath = os.path.join(skinspath, |
|
68
|
|
|
re.match("(.*?)\\\\", name).group(1)) |
|
69
|
|
|
|
|
70
|
|
|
try: |
|
71
|
|
|
os.makedirs(newskinpath) |
|
72
|
|
|
except os.error: |
|
73
|
|
|
sublime.error_message( |
|
74
|
|
|
"Error while trying to create new skin: " + |
|
75
|
|
|
"Directory " + newskinpath + " could not be created. " + |
|
76
|
|
|
"Does it already exist?") |
|
77
|
|
|
return |
|
78
|
|
|
|
|
79
|
|
|
# Check which folders should be created |
|
80
|
|
|
settings = sublime.load_settings("Rainmeter.sublime-settings") |
|
81
|
|
|
make_resources = settings.get( |
|
82
|
|
|
"rainmeter_new_skin_create_resources_folder", |
|
83
|
|
|
True) |
|
84
|
|
|
make_images = settings.get( |
|
85
|
|
|
"rainmeter_new_skin_create_images_folder", |
|
86
|
|
|
True) |
|
87
|
|
|
make_fonts = settings.get( |
|
88
|
|
|
"rainmeter_new_skin_create_fonts_folder", |
|
89
|
|
|
True) |
|
90
|
|
|
make_scripts = settings.get( |
|
91
|
|
|
"rainmeter_new_skin_create_scripts_folder", |
|
92
|
|
|
True) |
|
93
|
|
|
|
|
94
|
|
|
try: |
|
95
|
|
|
if make_resources: |
|
96
|
|
|
os.makedirs(os.path.join(basepath, "@Resources")) |
|
97
|
|
|
if make_images: |
|
98
|
|
|
os.makedirs(os.path.join(basepath, "@Resources\\Images")) |
|
99
|
|
|
if make_fonts: |
|
100
|
|
|
os.makedirs(os.path.join(basepath, "@Resources\\Fonts")) |
|
101
|
|
|
if make_scripts: |
|
102
|
|
|
os.makedirs(os.path.join(basepath, "@Resources\\Scripts")) |
|
103
|
|
|
except os.error: |
|
104
|
|
|
sublime.status_message("Did not create @Resources folder or" + |
|
105
|
|
|
" subfolders because they already exist") |
|
106
|
|
|
|
|
107
|
|
|
window = self.window |
|
108
|
|
|
filename = os.path.basename(os.path.normpath(name)) |
|
109
|
|
|
open(os.path.join(newskinpath, filename + ".ini"), 'a') |
|
110
|
|
|
newview = window.open_file(os.path.join(newskinpath, |
|
111
|
|
|
filename + ".ini")) |
|
112
|
|
|
|
|
113
|
|
|
# We have to wait until the file is fully loaded (even if it's empty |
|
114
|
|
|
# because it was just created) |
|
115
|
|
|
sublime.set_timeout((lambda: self.open_skin_file(newview)), 100) |
|
116
|
|
|
|
|
117
|
|
|
def open_skin_file(self, view): |
|
118
|
|
|
"""Callback method executed after the file is fully loaded.""" |
|
119
|
|
|
if view.is_loading(): |
|
120
|
|
|
sublime.set_timeout(lambda: self.open_skin_file(view), |
|
121
|
|
|
100) |
|
122
|
|
|
return |
|
123
|
|
|
|
|
124
|
|
|
view.run_command( |
|
125
|
|
|
"insert_snippet", |
|
126
|
|
|
{"name": "Packages/Rainmeter/Snippets/skin.sublime-snippet"}) |
|
127
|
|
|
|
|
128
|
|
|
if os.path.exists("Packages/User/Rainmeter.sublime-syntax"): |
|
129
|
|
|
view.set_syntax_file("Packages/User/Rainmeter.sublime-syntax") |
|
130
|
|
|
else: |
|
131
|
|
|
view.set_syntax_file("Packages/Rainmeter/Rainmeter.sublime-syntax") |
|
132
|
|
|
|
|
133
|
|
|
sublime.run_command("rainmeter_refresh") |
|
134
|
|
|
|