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
|
|
|
|