Skip to content

Commit 0c60b05

Browse files
committed
add resource builder
Signed-off-by: John Thornton <[email protected]>
1 parent a896a29 commit 0c60b05

33 files changed

+1384
-0
lines changed

debian/install

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
flexgui/src/flexgui usr/bin
22
flexgui/src/flexcopy usr/bin
3+
flexgui/src/flexqrc usr/bin
34

45
flexgui/*.desktop usr/share/applications
56

debian/manpages

+1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
flexgui/man/flexgui.1
22
flexgui/man/flexcopy.1
3+
flexgui/man/flexqrc.1

examples/images/X+.png

7.4 KB
Loading

examples/images/X+Y+.png

7.67 KB
Loading

examples/images/X+Y-.png

7.91 KB
Loading

examples/images/X-.png

7.42 KB
Loading

examples/images/X-Y+.png

7.54 KB
Loading

examples/images/X-Y-.png

7.3 KB
Loading

examples/images/Y+.png

6.91 KB
Loading

examples/images/Y-.png

6.71 KB
Loading

examples/images/angleX+.png

4 KB
Loading

examples/images/angleX-.png

3.95 KB
Loading

examples/images/angleY+.png

3.59 KB
Loading

examples/images/angleY-.png

4.27 KB
Loading

examples/images/inHole.png

11.4 KB
Loading

examples/images/inX+.png

6.53 KB
Loading

examples/images/inX+Y+.png

7.76 KB
Loading

examples/images/inX+Y-.png

7.59 KB
Loading

examples/images/inX-.png

6.1 KB
Loading

examples/images/inX-Y+.png

8.12 KB
Loading

examples/images/inX-Y-.png

7.64 KB
Loading

examples/images/inY+.png

6.48 KB
Loading

examples/images/inY-.png

6.49 KB
Loading

examples/images/resources.py

+1,077
Large diffs are not rendered by default.

examples/images/resources.qrc

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<RCC>
2+
<qresource prefix="\">
3+
<file>angleX-.png</file>
4+
<file>angleX+.png</file>
5+
<file>angleY-.png</file>
6+
<file>angleY+.png</file>
7+
</qresource>
8+
</RCC>

examples/images/ts_height.png

4.27 KB
Loading

examples/images/workpiece_height.png

8.98 KB
Loading

examples/images/xy_center.png

4.22 KB
Loading

flexgui/Flex Resources.desktop

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
[Desktop Entry]
2+
Version=1.0
3+
Type=Application
4+
Name=Flex Resources
5+
Exec=flexqrc
6+
Icon=linuxcncicon
7+
Categories=Utility;Engineering;X-CNC;
8+
Terminal=false
9+
StartupNotify=true
10+
StartupWMClass=flexqrc
11+
GenericName=Flex GUI
12+
Comment=Build resource file
13+
to add images to Flex GUI
14+
15+
Name[en_US]=Flex Resources

flexgui/man/flexqrc.1

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
.TH FLEXGUI 1 "September 2024" Linux "Flex Resource Builder"
2+
.SH NAME
3+
flexqrc - A resource builder for Flex GUI
4+
.SH SYNOPSIS
5+
.B flexqrc
6+
.SH DESCRIPTION
7+
.B Flex Resource Builder
8+
Build an image resource file
9+

flexgui/src/flexqrc

+141
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
#!/usr/bin/env python3
2+
import os, sys, subprocess, shutil
3+
4+
# disable cache usage must be before any local imports
5+
sys.dont_write_bytecode = True
6+
7+
from PyQt6.QtWidgets import QApplication, QMainWindow, QFileDialog
8+
from PyQt6.uic import loadUi
9+
10+
class flexqrc(QMainWindow):
11+
def __init__(self):
12+
super().__init__()
13+
14+
if os.path.split(sys.argv[0])[0] == '/usr/bin':
15+
self.lib_path = '/usr/lib/libflexgui'
16+
loadUi(os.path.join(self.lib_path, 'flexqrc.ui'), self)
17+
else:
18+
srcPath = os.path.split(os.path.realpath(sys.argv[0]))[0]
19+
self.lib_path = os.path.join(srcPath, 'libflexgui')
20+
loadUi(os.path.join(srcPath, 'flexqrc.ui'), self)
21+
stylesheet = os.path.join(self.lib_path, 'flexqrc.qss')
22+
with open(stylesheet,'r') as fh:
23+
self.setStyleSheet(fh.read())
24+
25+
self.images_directory = False
26+
self.files = []
27+
self.qrc_file = ''
28+
29+
self.get_images_pb.setEnabled(False)
30+
self.build_qrc_pb.setEnabled(False)
31+
self.get_config_dir_pb.setEnabled(False)
32+
self.build_resources_pb.setEnabled(False)
33+
34+
self.get_images_dir_pb.clicked.connect(self.get_images_dir)
35+
self.get_images_pb.clicked.connect(self.get_images)
36+
self.build_qrc_pb.clicked.connect(self.build_qrc)
37+
self.get_config_dir_pb.clicked.connect(self.get_config_dir)
38+
self.build_resources_pb.clicked.connect(self.build_resources)
39+
40+
self.setWindowTitle('Flex Resource Builder')
41+
check_rcc = subprocess.run(["which", "rcc"], capture_output=True, text=True)
42+
if check_rcc.returncode == 0:
43+
rcc_version = subprocess.run(['rcc', '-v'], capture_output=True, text=True)
44+
self.rcc_version_lb.setText(f'{rcc_version.stdout.strip()}')
45+
self.rcc = True
46+
else:
47+
self.rcc_version_lb.setText('rcc was not found')
48+
self.rcc = False
49+
50+
self.show()
51+
52+
def get_images_dir(self):
53+
options = QFileDialog.Option.ShowDirsOnly
54+
options |= QFileDialog.Option.DontUseNativeDialog
55+
result = QFileDialog.getExistingDirectory(self, 'Select Images Directory',
56+
options=options)
57+
if result:
58+
self.images_directory = result
59+
self.image_dir_lb.setText(result)
60+
self.get_images_pb.setEnabled(True)
61+
62+
def get_images(self):
63+
if self.images_directory:
64+
options = QFileDialog.Option.DontUseNativeDialog
65+
files, filter = QFileDialog.getOpenFileNames(self,'Select Images',
66+
self.images_directory, "All Files (*);;Python Files (*.py)", options=options)
67+
if files:
68+
self.images_lw.addItems(files)
69+
for file in files:
70+
self.files.append(file)
71+
self.build_qrc_pb.setEnabled(True)
72+
self.get_images_lb.setText(f'{len(files)} images selected')
73+
74+
def build_qrc(self):
75+
self.qrc_file = os.path.join(self.images_directory, 'resources.qrc')
76+
contents = []
77+
contents.append('<RCC>\n')
78+
contents.append(' <qresource prefix="\\">\n')
79+
for file in self.files:
80+
contents.append(f' <file>{os.path.basename(file)}</file>\n')
81+
contents.append(' </qresource>\n')
82+
contents.append('</RCC>')
83+
with open(self.qrc_file, 'w') as f:
84+
f.writelines(contents)
85+
self.get_config_dir_pb.setEnabled(True)
86+
self.build_qrc_lb.setText('Build QRC Done')
87+
88+
def get_config_dir(self):
89+
if os.path.isdir(os.path.expanduser('~/linuxcnc/configs')):
90+
configsDir = os.path.expanduser('~/linuxcnc/configs')
91+
else:
92+
configsDir = os.path.expanduser('~/')
93+
#QFileDialog::QFileDialog(QWidget *parent = nullptr,
94+
# const QString &caption = QString(), const QString &directory = QString(),
95+
# const QString &filter = QString())
96+
options = QFileDialog.Option.ShowDirsOnly
97+
options |= QFileDialog.Option.DontUseNativeDialog
98+
result = QFileDialog.getExistingDirectory(self, 'Select Configuration Directory',
99+
configsDir, options=options)
100+
if result:
101+
self.config_directory = result
102+
self.config_dir_lb.setText(result)
103+
if self.rcc:
104+
self.build_resources_pb.setEnabled(True)
105+
else:
106+
self.build_resources_lb.setText('install rcc')
107+
108+
def build_resources(self):
109+
os.chdir(self.images_directory)
110+
result = subprocess.run(['rcc', '-g', 'python', '-o', 'resources.py',
111+
'resources.qrc'], capture_output=True, text=True)
112+
if result.returncode == 0: # success
113+
resource_file = os.path.join(self.images_directory, 'resources.py')
114+
self.build_resources_lb.setText('Build Success')
115+
# fix the file first lol
116+
# Read in the file
117+
with open(resource_file, 'r') as file:
118+
filedata = file.read()
119+
# Replace the target string
120+
filedata = filedata.replace('PySide2', 'PyQt6')
121+
# Write the file out again
122+
123+
with open(resource_file, 'w') as file:
124+
file.write(filedata)
125+
shutil.copy2(resource_file, self.config_directory)
126+
127+
#print('build')
128+
#print(os.getcwd())
129+
#shutil.copy2(self.qrc_file, self.config_directory)
130+
#os.chdir(self.config_directory)
131+
#print(os.getcwd())
132+
#result = subprocess.run(['rcc', '-g', 'python', '-o', 'resources.py',
133+
# 'resources.qrc'], capture_output=True, text=True)
134+
#print(result)
135+
136+
137+
# rcc -g python -o resources.py resources.qrc
138+
139+
app = QApplication(sys.argv)
140+
gui = flexqrc()
141+
sys.exit(app.exec())

flexgui/src/flexqrc.ui

+132
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<ui version="4.0">
3+
<class>MainWindow</class>
4+
<widget class="QMainWindow" name="MainWindow">
5+
<property name="geometry">
6+
<rect>
7+
<x>0</x>
8+
<y>0</y>
9+
<width>718</width>
10+
<height>605</height>
11+
</rect>
12+
</property>
13+
<property name="windowTitle">
14+
<string>MainWindow</string>
15+
</property>
16+
<widget class="QWidget" name="centralwidget">
17+
<layout class="QGridLayout" name="gridLayout">
18+
<item row="0" column="2" colspan="2">
19+
<widget class="QLabel" name="image_dir_lb">
20+
<property name="frameShape">
21+
<enum>QFrame::Box</enum>
22+
</property>
23+
<property name="text">
24+
<string/>
25+
</property>
26+
</widget>
27+
</item>
28+
<item row="6" column="1" colspan="3">
29+
<widget class="QListWidget" name="images_lw"/>
30+
</item>
31+
<item row="5" column="1">
32+
<widget class="QPushButton" name="build_resources_pb">
33+
<property name="text">
34+
<string>Build Resources File</string>
35+
</property>
36+
</widget>
37+
</item>
38+
<item row="0" column="1">
39+
<widget class="QPushButton" name="get_images_dir_pb">
40+
<property name="text">
41+
<string>Select Images Directory</string>
42+
</property>
43+
</widget>
44+
</item>
45+
<item row="4" column="2" colspan="2">
46+
<widget class="QLabel" name="config_dir_lb">
47+
<property name="frameShape">
48+
<enum>QFrame::Box</enum>
49+
</property>
50+
<property name="text">
51+
<string/>
52+
</property>
53+
</widget>
54+
</item>
55+
<item row="4" column="1">
56+
<widget class="QPushButton" name="get_config_dir_pb">
57+
<property name="text">
58+
<string>Select Config Directory</string>
59+
</property>
60+
</widget>
61+
</item>
62+
<item row="2" column="1">
63+
<widget class="QPushButton" name="get_images_pb">
64+
<property name="text">
65+
<string>Select Image Files</string>
66+
</property>
67+
</widget>
68+
</item>
69+
<item row="3" column="1">
70+
<widget class="QPushButton" name="build_qrc_pb">
71+
<property name="text">
72+
<string>Build QRC File</string>
73+
</property>
74+
</widget>
75+
</item>
76+
<item row="2" column="2" colspan="2">
77+
<widget class="QLabel" name="get_images_lb">
78+
<property name="frameShape">
79+
<enum>QFrame::Box</enum>
80+
</property>
81+
<property name="text">
82+
<string/>
83+
</property>
84+
</widget>
85+
</item>
86+
<item row="3" column="2" colspan="2">
87+
<widget class="QLabel" name="build_qrc_lb">
88+
<property name="frameShape">
89+
<enum>QFrame::Box</enum>
90+
</property>
91+
<property name="text">
92+
<string/>
93+
</property>
94+
</widget>
95+
</item>
96+
<item row="5" column="2">
97+
<widget class="QLabel" name="build_resources_lb">
98+
<property name="frameShape">
99+
<enum>QFrame::Box</enum>
100+
</property>
101+
<property name="text">
102+
<string/>
103+
</property>
104+
</widget>
105+
</item>
106+
<item row="5" column="3">
107+
<widget class="QLabel" name="rcc_version_lb">
108+
<property name="frameShape">
109+
<enum>QFrame::Box</enum>
110+
</property>
111+
<property name="text">
112+
<string/>
113+
</property>
114+
</widget>
115+
</item>
116+
</layout>
117+
</widget>
118+
<widget class="QMenuBar" name="menubar">
119+
<property name="geometry">
120+
<rect>
121+
<x>0</x>
122+
<y>0</y>
123+
<width>718</width>
124+
<height>24</height>
125+
</rect>
126+
</property>
127+
</widget>
128+
<widget class="QStatusBar" name="statusbar"/>
129+
</widget>
130+
<resources/>
131+
<connections/>
132+
</ui>

flexgui/src/libflexgui/flexqrc.qss

Whitespace-only changes.

0 commit comments

Comments
 (0)