1
+ """
2
+ Brick is lightweight IDE for C programming language.
3
+ Copyright (C) 2020 : Mršulja Ivan
4
+
5
+ This file is part of Brick IDE.
6
+ This program is free software: you can redistribute it and/or modify
7
+ it under the terms of the GNU General Public License as published by
8
+ the Free Software Foundation, either version 3 of the License, or
9
+ (at your option) any later version.
10
+ This program is distributed in the hope that it will be useful,
11
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ GNU General Public License for more details.
14
+ You should have received a copy of the GNU General Public License
15
+ along with this program. If not, see <https://www.gnu.org/licenses/>
16
+ """
17
+
1
18
import shutil
2
19
from model .SaveNode import *
3
20
from PyQt5 .QtCore import Qt , pyqtRemoveInputHook
21
+ from PyQt5 .Qt import QFrame
4
22
import os
5
23
import qdarkstyle
6
24
from model .Terminal import Terminal
7
25
from model .Autocompleter import *
26
+ from viewer .NumberBar import NumberBar
8
27
9
28
10
29
class TextEditor (QtWidgets .QWidget ):
@@ -37,9 +56,12 @@ def init_ui(self):
37
56
self .tree .doubleClicked .connect (self .tree_clk )
38
57
self .get_open_path ()
39
58
self .init_text_edit ()
59
+ self .text_edit_layout = QtWidgets .QHBoxLayout ()
60
+ self .text_edit_layout .addWidget (self .number_bar )
61
+ self .text_edit_layout .addWidget (self .text )
40
62
41
63
self .grid = QtWidgets .QGridLayout ()
42
- self .grid .addWidget (self .text , 0 , 2 , 4 , 6 )
64
+ self .grid .addLayout (self .text_edit_layout , 0 , 2 , 4 , 6 )
43
65
self .grid .addWidget (self .tree , 0 , 0 , 4 , 2 )
44
66
self .grid .addWidget (self .terminal , 4 , 0 , 2 , 8 )
45
67
@@ -60,10 +82,14 @@ def open_menu(self, position):
60
82
action_refresh = QtWidgets .QAction ("Refresh" , None )
61
83
action_refresh .triggered .connect (self .refresh_table )
62
84
85
+ action_rename = QtWidgets .QAction ("Rename" , None )
86
+ action_rename .triggered .connect (self .rename_node )
87
+
63
88
if self .tree .currentIndex ().internalPointer () is not None :
64
89
self .contextMenu .addAction (actionNewFolder )
65
90
self .contextMenu .addAction (actionNewFile )
66
91
self .contextMenu .addAction (action_delete )
92
+ self .contextMenu .addAction (action_rename )
67
93
self .contextMenu .addAction (action_refresh )
68
94
69
95
@@ -91,6 +117,16 @@ def delete_node(self):
91
117
os .remove (del_path )
92
118
self .refresh_table ()
93
119
120
+ def rename_node (self ):
121
+ ret_text , ok_button = QtWidgets .QInputDialog .getText (self , "Rename" , "Insert new name: " )
122
+ if ok_button :
123
+ if ret_text .strip () == "" :
124
+ QtWidgets .QMessageBox .critical (self , "Error" , "Empty directory name! " )
125
+ return
126
+ path = self .get_path_for_making (self .open_path )
127
+ os .rename (path , os .path .join (os .path .split (path )[0 ], ret_text ))
128
+ self .tree .repaint ()
129
+
94
130
def make_new_folder (self ):
95
131
base_path = self .open_path
96
132
if self .tree .currentIndex ().parent () != self .tree .rootIndex () or not "." in self .tree .currentIndex ().data ():
@@ -132,6 +168,9 @@ def init_text_edit(self):
132
168
self .text .setCompleter (self .completer )
133
169
self .text .setStyleSheet ("QPlainTextEdit { color: rgb(169, 183, 198) }" )
134
170
171
+ self .number_bar = NumberBar ()
172
+ self .number_bar .setTextEdit (self .text )
173
+
135
174
self .font = QtGui .QFont ()
136
175
self .font .setFamily ('Ariel' )
137
176
self .font .setFixedPitch (True )
@@ -153,6 +192,17 @@ def init_text_edit(self):
153
192
new_completer = check_for_header_files (self .text .toPlainText (), self .completer .my_keywords )
154
193
self .text .setCompleter (new_completer )
155
194
195
+ self .text .installEventFilter (self )
196
+ self .text .viewport ().installEventFilter (self )
197
+
198
+ def eventFilter (self , object , event ):
199
+ # Update the line numbers for all events on the text edit and the viewport.
200
+ # This is easier than connecting all necessary singals.
201
+ if object in (self .text , self .text .viewport ()):
202
+ self .number_bar .update ()
203
+ return False
204
+ return QFrame .eventFilter (object , event )
205
+
156
206
def set_font (self , value ):
157
207
if int (value ) >= 8 and int (value ) <= 50 :
158
208
self .font .setPointSize (int (value ))
0 commit comments