initial
This commit is contained in:
commit
c22bf1881e
0
src/empyres/__init__.py
Normal file
0
src/empyres/__init__.py
Normal file
BIN
src/empyres/data/autosave_2218.01.01.zip
Normal file
BIN
src/empyres/data/autosave_2218.01.01.zip
Normal file
Binary file not shown.
1184152
src/empyres/data/autosave_2218.01.01/gamestate
Normal file
1184152
src/empyres/data/autosave_2218.01.01/gamestate
Normal file
File diff suppressed because it is too large
Load Diff
32
src/empyres/data/autosave_2218.01.01/meta
Normal file
32
src/empyres/data/autosave_2218.01.01/meta
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
version="Cherryh v2.0.2"
|
||||||
|
version_control_revision=38784
|
||||||
|
name="Viperian Aspire"
|
||||||
|
date="2218.01.01"
|
||||||
|
required_dlcs={
|
||||||
|
"Anniversary Portraits"
|
||||||
|
"Apocalypse"
|
||||||
|
"Horizon Signal"
|
||||||
|
"Humanoids Species Pack"
|
||||||
|
"Leviathans Story Pack"
|
||||||
|
"Synthetic Dawn Story Pack"
|
||||||
|
"Utopia"
|
||||||
|
}
|
||||||
|
player_portrait="humanoid_hp_09"
|
||||||
|
flag={
|
||||||
|
icon={
|
||||||
|
category="zoological"
|
||||||
|
file="flag_zoological_20.dds"
|
||||||
|
}
|
||||||
|
background={
|
||||||
|
category="backgrounds"
|
||||||
|
file="pattern_01.dds"
|
||||||
|
}
|
||||||
|
colors={
|
||||||
|
"black"
|
||||||
|
"burgundy"
|
||||||
|
"null"
|
||||||
|
"null"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
meta_fleets=3.000
|
||||||
|
meta_planets=1
|
278
src/empyres/empires.py
Normal file
278
src/empyres/empires.py
Normal file
@ -0,0 +1,278 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
'''
|
||||||
|
Stellaris Empires Parser
|
||||||
|
this is a fairly dumb parser that can parse stellaris empires from the user_empire_designs.txt, if they are set up per default
|
||||||
|
it might not reflect the total logic of paradox' internal scripting language however.
|
||||||
|
|
||||||
|
it preserves the orders, gives ability to modify values, and translates most into python
|
||||||
|
it also has the ability to dump it back into a string, which is ready to be written back.
|
||||||
|
|
||||||
|
First Draft written in Py2, PyQt4
|
||||||
|
Created on 07.04.2017
|
||||||
|
|
||||||
|
moving to py3 and qt5
|
||||||
|
|
||||||
|
@author: g4b.org
|
||||||
|
'''
|
||||||
|
import os, sys, logging
|
||||||
|
|
||||||
|
DEFAULT_WIN_EMPIRES_PATH = r'Paradox Interactive\Stellaris\user_empire_designs.txt'
|
||||||
|
OUTPUT_LINE_FEED = '\r\n'
|
||||||
|
|
||||||
|
class _ConstantCache:
|
||||||
|
""" datamines constants """
|
||||||
|
def __init__(self):
|
||||||
|
self._cached = []
|
||||||
|
self.cached = set()
|
||||||
|
self.associations = {}
|
||||||
|
def add(self, value):
|
||||||
|
self._cached.append(value)
|
||||||
|
self.cached = set(self._cached)
|
||||||
|
self._cached = list(self.cached)
|
||||||
|
def associate(self, key, value):
|
||||||
|
self.associations[key] = set(list(self.associations.get(key, [])) + [value,])
|
||||||
|
_CONSTANT_CACHE = _ConstantCache()
|
||||||
|
|
||||||
|
class Constant:
|
||||||
|
""" constants are not strings, but we need to save them somehow. """
|
||||||
|
def __init__(self, value):
|
||||||
|
self.value = value
|
||||||
|
_CONSTANT_CACHE.add(value)
|
||||||
|
@classmethod
|
||||||
|
def show_cache(cls):
|
||||||
|
return _CONSTANT_CACHE.cached
|
||||||
|
@classmethod
|
||||||
|
def associate(cls, key, value):
|
||||||
|
_CONSTANT_CACHE.associate(key, value)
|
||||||
|
@classmethod
|
||||||
|
def get_associations(cls):
|
||||||
|
return _CONSTANT_CACHE.associations
|
||||||
|
|
||||||
|
def render_value(value):
|
||||||
|
""" renders internal python values to stellaris values, but keeps the tree as list of lists and strings """
|
||||||
|
if isinstance(value, bool):
|
||||||
|
return ['%s' % 'yes' if value else 'no']
|
||||||
|
elif isinstance(value, int):
|
||||||
|
return ['%s' % value]
|
||||||
|
elif isinstance(value, basestring): # note: python 3 might not have basestring anymore?
|
||||||
|
return ['"%s"' % value]
|
||||||
|
elif isinstance(value, list):
|
||||||
|
return ['{',] + [render_value(entry) for entry in value] + ['}' ]
|
||||||
|
elif isinstance(value, Entry):
|
||||||
|
return value.render()
|
||||||
|
elif isinstance(value, Constant):
|
||||||
|
return ['%s' % value.value]
|
||||||
|
else:
|
||||||
|
logging.warning('Unknown Value type: %s' % (str(type(value)),))
|
||||||
|
|
||||||
|
def build_final_string(data):
|
||||||
|
""" builds a final output from render data. """
|
||||||
|
def indent(value, ind):
|
||||||
|
if not ind:
|
||||||
|
return value
|
||||||
|
ind = ind * ' '
|
||||||
|
return '%s%s' % (ind, value)
|
||||||
|
final = []
|
||||||
|
def append_final_list(data, cur):
|
||||||
|
for entry in data:
|
||||||
|
if isinstance(entry, basestring):
|
||||||
|
final.append(indent(entry, cur))
|
||||||
|
elif isinstance(entry, list):
|
||||||
|
append_final_list(entry, cur + 2)
|
||||||
|
else:
|
||||||
|
logging.error('Unknown Type in final list: %s' % (str(type(entry)),))
|
||||||
|
append_final_list(data, 0)
|
||||||
|
return OUTPUT_LINE_FEED.join(final)
|
||||||
|
|
||||||
|
|
||||||
|
class Entry:
|
||||||
|
""" class for holding an entry in stellaris format """
|
||||||
|
def __init__(self, key, value):
|
||||||
|
self.key = key
|
||||||
|
self.value = value
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def identify_value(cls, value, key=None):
|
||||||
|
""" Note: Value cannot be a list.
|
||||||
|
key is only used to track constants and used internally.
|
||||||
|
"""
|
||||||
|
if value.startswith('"'):
|
||||||
|
return value[1:-1]
|
||||||
|
elif value in ['yes', 'no']:
|
||||||
|
return True if value == 'yes' else False
|
||||||
|
else:
|
||||||
|
try:
|
||||||
|
x = int(value)
|
||||||
|
return x
|
||||||
|
except:
|
||||||
|
if key is not None:
|
||||||
|
# if key is given, it only is used to associate the constant with it.
|
||||||
|
c = Constant(value)
|
||||||
|
Constant.associate(key, value)
|
||||||
|
return c
|
||||||
|
return Constant(value)
|
||||||
|
|
||||||
|
def parse(self, lines):
|
||||||
|
# parses until it has its data, returns lines of buffer it ate.
|
||||||
|
count = 0
|
||||||
|
skip = 0
|
||||||
|
my_value = []
|
||||||
|
for line in lines:
|
||||||
|
count += 1
|
||||||
|
if skip>0:
|
||||||
|
skip -= 1
|
||||||
|
continue
|
||||||
|
line = line.replace('\t', ' ' * 4)
|
||||||
|
line = line.lstrip(' ')
|
||||||
|
# search for key = value or (key)={
|
||||||
|
if line.startswith('='):
|
||||||
|
# this seems to be a ={
|
||||||
|
continue
|
||||||
|
elif '=' in line:
|
||||||
|
key = line[:line.index('=')].strip()
|
||||||
|
value = line[line.index('=')+1:].strip()
|
||||||
|
# if its a simple entry, add it to me.
|
||||||
|
# if its a {, we need to create a new entry with key, give it the rest of the buffer
|
||||||
|
if value.startswith('{'):
|
||||||
|
entry = Entry(key, None)
|
||||||
|
skip = entry.parse(lines[count:])
|
||||||
|
my_value.append(entry)
|
||||||
|
continue
|
||||||
|
else:
|
||||||
|
entry = Entry(key, Entry.identify_value(value, key))
|
||||||
|
my_value.append(entry)
|
||||||
|
continue
|
||||||
|
elif line.startswith('}'):
|
||||||
|
# if its a } we are at the end of our duty.
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
my_value.append(Entry.identify_value(line))
|
||||||
|
self.value = my_value
|
||||||
|
return count
|
||||||
|
|
||||||
|
def render(self):
|
||||||
|
val = render_value(self.value)
|
||||||
|
ret = [ '%s=%s' % (self.key or '', val[0]) ]
|
||||||
|
if len(val)>1:
|
||||||
|
ret += [val[1:-1], val[-1]]
|
||||||
|
return ret
|
||||||
|
|
||||||
|
def get_values(self, key, default=None):
|
||||||
|
""" retrieves the list of all values in the entry by key,
|
||||||
|
as long as the value of this entry is a list of entries.
|
||||||
|
"""
|
||||||
|
if isinstance(self.value, list):
|
||||||
|
ret = []
|
||||||
|
for entry in self.value:
|
||||||
|
if isinstance(entry, Entry):
|
||||||
|
if entry.key == key:
|
||||||
|
ret.append(entry.value)
|
||||||
|
return ret or default
|
||||||
|
return default
|
||||||
|
|
||||||
|
|
||||||
|
class Empire:
|
||||||
|
"""
|
||||||
|
A Stellaris Empire configuration.
|
||||||
|
"""
|
||||||
|
def __init__(self, name=None):
|
||||||
|
self.name = name
|
||||||
|
self.entry = None
|
||||||
|
|
||||||
|
def get_values(self, key, default=None):
|
||||||
|
""" use this function if you want to get a specific value from the root entry. convenience function """
|
||||||
|
if self.entry is None:
|
||||||
|
return default
|
||||||
|
return self.entry.get_values(key, default)
|
||||||
|
|
||||||
|
def parse(self, buff):
|
||||||
|
""" parse my entry from a buffer """
|
||||||
|
count = 0
|
||||||
|
if isinstance(buff, str):
|
||||||
|
buff = buff.replace('\r', '').split('\n')
|
||||||
|
if self.name is None:
|
||||||
|
for line in buff:
|
||||||
|
count += 1
|
||||||
|
if line.startswith('"'):
|
||||||
|
self.name = Entry.identify_value(line)
|
||||||
|
buff = buff[count:]
|
||||||
|
break
|
||||||
|
self.entry = Entry(None, None)
|
||||||
|
return count + self.entry.parse(buff)
|
||||||
|
|
||||||
|
def dump(self):
|
||||||
|
if self.entry is None:
|
||||||
|
return ""
|
||||||
|
if self.name is None:
|
||||||
|
return ""
|
||||||
|
return ('"%s"%s' % (self.name or '', OUTPUT_LINE_FEED)) + build_final_string(self.entry.render())
|
||||||
|
|
||||||
|
def __unicode__(self):
|
||||||
|
return '%s' % self.name
|
||||||
|
|
||||||
|
class UserEmpireDesigns:
|
||||||
|
"""
|
||||||
|
main class for loading user empire designs.
|
||||||
|
"""
|
||||||
|
def __init__(self, filename):
|
||||||
|
self.empires = []
|
||||||
|
self.filename = filename
|
||||||
|
if filename is not None:
|
||||||
|
self.parse_file()
|
||||||
|
|
||||||
|
def all(self):
|
||||||
|
return self.empires
|
||||||
|
|
||||||
|
def parse_lines(self, lines):
|
||||||
|
while len(lines) > 2: # makes no sense below 2 lines.
|
||||||
|
empire = Empire()
|
||||||
|
c = empire.parse(lines)
|
||||||
|
lines = lines[c:]
|
||||||
|
self.empires.append(empire)
|
||||||
|
logging.debug( "Read %s empires" % len(self.empires) )
|
||||||
|
|
||||||
|
def parse_file(self):
|
||||||
|
f = open(self.filename, 'r')
|
||||||
|
data = f.read()
|
||||||
|
f.close()
|
||||||
|
lines = data.replace('\r', '').split('\n')
|
||||||
|
self.parse_lines(lines)
|
||||||
|
|
||||||
|
def dump(self):
|
||||||
|
ret = []
|
||||||
|
for empire in self.empires:
|
||||||
|
ret.append(empire.dump())
|
||||||
|
return OUTPUT_LINE_FEED.join(ret)
|
||||||
|
|
||||||
|
def load_empires(filename=None):
|
||||||
|
if filename is None:
|
||||||
|
folder = find_folder_win()
|
||||||
|
filename = os.path.join( folder, DEFAULT_WIN_EMPIRES_PATH )
|
||||||
|
#print(f'Folder: {folder} Filename: {filename}')
|
||||||
|
return UserEmpireDesigns(filename)
|
||||||
|
|
||||||
|
def find_folder_win(folder_id=5, current=0):
|
||||||
|
""" Finds My Documents in windows """
|
||||||
|
import ctypes.wintypes
|
||||||
|
CSIDL_PERSONAL = folder_id # My Documents = 5
|
||||||
|
SHGFP_TYPE_CURRENT = current # Unclear, but 1 means current, 0 default!?
|
||||||
|
buf= ctypes.create_unicode_buffer(ctypes.wintypes.MAX_PATH)
|
||||||
|
ctypes.windll.shell32.SHGetFolderPathW(None, CSIDL_PERSONAL, None, SHGFP_TYPE_CURRENT, buf)
|
||||||
|
return buf.value
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
# if u run this script, it basicly parses the file and outputs a list of your empires, a dump, and the constants it found.
|
||||||
|
logging.basicConfig(level=logging.DEBUG)
|
||||||
|
empires = load_empires()
|
||||||
|
for empire in empires.all():
|
||||||
|
print ("%s traits: %s ethics: %s" % (empire.name,
|
||||||
|
', '.join([ x.replace('trait_', '') for x in empire.entry.get_values('trait')]),
|
||||||
|
', '.join([ x.replace('ethic_', '') for x in empire.entry.get_values('ethic')]),
|
||||||
|
))
|
||||||
|
print ("#" * 80)
|
||||||
|
print (empires.dump())
|
||||||
|
print ("CONSTANTS:")
|
||||||
|
print (Constant.show_cache())
|
||||||
|
print (Constant.get_associations())
|
||||||
|
|
116
src/empyres/empires_ui.py
Normal file
116
src/empyres/empires_ui.py
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
# Form implementation generated from reading ui file 'E:/work/workspace/stellaris_empyres/src/empyres/empires_ui.ui'
|
||||||
|
#
|
||||||
|
# Created by: PyQt5 UI code generator 5.8.2
|
||||||
|
#
|
||||||
|
# WARNING! All changes made in this file will be lost!
|
||||||
|
|
||||||
|
from PyQt5 import QtCore, QtGui, QtWidgets
|
||||||
|
|
||||||
|
class Ui_MainWindow(object):
|
||||||
|
def setupUi(self, MainWindow):
|
||||||
|
MainWindow.setObjectName("MainWindow")
|
||||||
|
MainWindow.resize(1081, 623)
|
||||||
|
self.centralwidget = QtWidgets.QWidget(MainWindow)
|
||||||
|
self.centralwidget.setObjectName("centralwidget")
|
||||||
|
self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
|
||||||
|
self.gridLayout.setObjectName("gridLayout")
|
||||||
|
self.verticalLayout = QtWidgets.QVBoxLayout()
|
||||||
|
self.verticalLayout.setSizeConstraint(QtWidgets.QLayout.SetMaximumSize)
|
||||||
|
self.verticalLayout.setObjectName("verticalLayout")
|
||||||
|
self.tabWidget = QtWidgets.QTabWidget(self.centralwidget)
|
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
|
||||||
|
sizePolicy.setHorizontalStretch(0)
|
||||||
|
sizePolicy.setVerticalStretch(0)
|
||||||
|
sizePolicy.setHeightForWidth(self.tabWidget.sizePolicy().hasHeightForWidth())
|
||||||
|
self.tabWidget.setSizePolicy(sizePolicy)
|
||||||
|
self.tabWidget.setObjectName("tabWidget")
|
||||||
|
self.tab_main = QtWidgets.QWidget()
|
||||||
|
self.tab_main.setObjectName("tab_main")
|
||||||
|
self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.tab_main)
|
||||||
|
self.verticalLayout_3.setObjectName("verticalLayout_3")
|
||||||
|
self.verticalLayout_2 = QtWidgets.QVBoxLayout()
|
||||||
|
self.verticalLayout_2.setObjectName("verticalLayout_2")
|
||||||
|
self.tableWidget = QtWidgets.QTableWidget(self.tab_main)
|
||||||
|
self.tableWidget.setObjectName("tableWidget")
|
||||||
|
self.tableWidget.setColumnCount(7)
|
||||||
|
self.tableWidget.setRowCount(0)
|
||||||
|
item = QtWidgets.QTableWidgetItem()
|
||||||
|
self.tableWidget.setHorizontalHeaderItem(0, item)
|
||||||
|
item = QtWidgets.QTableWidgetItem()
|
||||||
|
self.tableWidget.setHorizontalHeaderItem(1, item)
|
||||||
|
item = QtWidgets.QTableWidgetItem()
|
||||||
|
self.tableWidget.setHorizontalHeaderItem(2, item)
|
||||||
|
item = QtWidgets.QTableWidgetItem()
|
||||||
|
self.tableWidget.setHorizontalHeaderItem(3, item)
|
||||||
|
item = QtWidgets.QTableWidgetItem()
|
||||||
|
self.tableWidget.setHorizontalHeaderItem(4, item)
|
||||||
|
item = QtWidgets.QTableWidgetItem()
|
||||||
|
self.tableWidget.setHorizontalHeaderItem(5, item)
|
||||||
|
item = QtWidgets.QTableWidgetItem()
|
||||||
|
self.tableWidget.setHorizontalHeaderItem(6, item)
|
||||||
|
self.verticalLayout_2.addWidget(self.tableWidget)
|
||||||
|
self.verticalLayout_3.addLayout(self.verticalLayout_2)
|
||||||
|
self.tabWidget.addTab(self.tab_main, "")
|
||||||
|
self.verticalLayout.addWidget(self.tabWidget)
|
||||||
|
self.gridLayout.addLayout(self.verticalLayout, 0, 0, 1, 1)
|
||||||
|
MainWindow.setCentralWidget(self.centralwidget)
|
||||||
|
self.menubar = QtWidgets.QMenuBar(MainWindow)
|
||||||
|
self.menubar.setGeometry(QtCore.QRect(0, 0, 1081, 21))
|
||||||
|
self.menubar.setObjectName("menubar")
|
||||||
|
self.menuFile = QtWidgets.QMenu(self.menubar)
|
||||||
|
self.menuFile.setObjectName("menuFile")
|
||||||
|
MainWindow.setMenuBar(self.menubar)
|
||||||
|
self.statusbar = QtWidgets.QStatusBar(MainWindow)
|
||||||
|
self.statusbar.setObjectName("statusbar")
|
||||||
|
MainWindow.setStatusBar(self.statusbar)
|
||||||
|
self.actionOpen = QtWidgets.QAction(MainWindow)
|
||||||
|
self.actionOpen.setObjectName("actionOpen")
|
||||||
|
self.actionSave_As = QtWidgets.QAction(MainWindow)
|
||||||
|
self.actionSave_As.setObjectName("actionSave_As")
|
||||||
|
self.actionExit = QtWidgets.QAction(MainWindow)
|
||||||
|
self.actionExit.setObjectName("actionExit")
|
||||||
|
self.menuFile.addAction(self.actionOpen)
|
||||||
|
self.menuFile.addAction(self.actionSave_As)
|
||||||
|
self.menuFile.addSeparator()
|
||||||
|
self.menuFile.addAction(self.actionExit)
|
||||||
|
self.menubar.addAction(self.menuFile.menuAction())
|
||||||
|
|
||||||
|
self.retranslateUi(MainWindow)
|
||||||
|
self.tabWidget.setCurrentIndex(0)
|
||||||
|
QtCore.QMetaObject.connectSlotsByName(MainWindow)
|
||||||
|
|
||||||
|
def retranslateUi(self, MainWindow):
|
||||||
|
_translate = QtCore.QCoreApplication.translate
|
||||||
|
MainWindow.setWindowTitle(_translate("MainWindow", "Stellaris Empire Tool Interface"))
|
||||||
|
item = self.tableWidget.horizontalHeaderItem(0)
|
||||||
|
item.setText(_translate("MainWindow", "Action"))
|
||||||
|
item = self.tableWidget.horizontalHeaderItem(1)
|
||||||
|
item.setText(_translate("MainWindow", "Name"))
|
||||||
|
item = self.tableWidget.horizontalHeaderItem(2)
|
||||||
|
item.setText(_translate("MainWindow", "Traits"))
|
||||||
|
item = self.tableWidget.horizontalHeaderItem(3)
|
||||||
|
item.setText(_translate("MainWindow", "Ethics"))
|
||||||
|
item = self.tableWidget.horizontalHeaderItem(4)
|
||||||
|
item.setText(_translate("MainWindow", "Civics"))
|
||||||
|
item = self.tableWidget.horizontalHeaderItem(5)
|
||||||
|
item.setText(_translate("MainWindow", "Homeworld"))
|
||||||
|
item = self.tableWidget.horizontalHeaderItem(6)
|
||||||
|
item.setText(_translate("MainWindow", " "))
|
||||||
|
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_main), _translate("MainWindow", "Empires"))
|
||||||
|
self.menuFile.setTitle(_translate("MainWindow", "File"))
|
||||||
|
self.actionOpen.setText(_translate("MainWindow", "Open"))
|
||||||
|
self.actionSave_As.setText(_translate("MainWindow", "Save As..."))
|
||||||
|
self.actionExit.setText(_translate("MainWindow", "Exit"))
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
import sys
|
||||||
|
app = QtWidgets.QApplication(sys.argv)
|
||||||
|
MainWindow = QtWidgets.QMainWindow()
|
||||||
|
ui = Ui_MainWindow()
|
||||||
|
ui.setupUi(MainWindow)
|
||||||
|
MainWindow.show()
|
||||||
|
sys.exit(app.exec_())
|
||||||
|
|
129
src/empyres/empires_ui.ui
Normal file
129
src/empyres/empires_ui.ui
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>MainWindow</class>
|
||||||
|
<widget class="QMainWindow" name="MainWindow">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>1081</width>
|
||||||
|
<height>623</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>Stellaris Empire Tool Interface</string>
|
||||||
|
</property>
|
||||||
|
<widget class="QWidget" name="centralwidget">
|
||||||
|
<layout class="QGridLayout" name="gridLayout">
|
||||||
|
<item row="0" column="0">
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
|
<property name="sizeConstraint">
|
||||||
|
<enum>QLayout::SetMaximumSize</enum>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<widget class="QTabWidget" name="tabWidget">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="currentIndex">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<widget class="QWidget" name="tab_main">
|
||||||
|
<attribute name="title">
|
||||||
|
<string>Empires</string>
|
||||||
|
</attribute>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_3">
|
||||||
|
<item>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_2" stretch="0">
|
||||||
|
<item>
|
||||||
|
<widget class="QTableWidget" name="tableWidget">
|
||||||
|
<column>
|
||||||
|
<property name="text">
|
||||||
|
<string>Action</string>
|
||||||
|
</property>
|
||||||
|
</column>
|
||||||
|
<column>
|
||||||
|
<property name="text">
|
||||||
|
<string>Name</string>
|
||||||
|
</property>
|
||||||
|
</column>
|
||||||
|
<column>
|
||||||
|
<property name="text">
|
||||||
|
<string>Traits</string>
|
||||||
|
</property>
|
||||||
|
</column>
|
||||||
|
<column>
|
||||||
|
<property name="text">
|
||||||
|
<string>Ethics</string>
|
||||||
|
</property>
|
||||||
|
</column>
|
||||||
|
<column>
|
||||||
|
<property name="text">
|
||||||
|
<string>Civics</string>
|
||||||
|
</property>
|
||||||
|
</column>
|
||||||
|
<column>
|
||||||
|
<property name="text">
|
||||||
|
<string>Homeworld</string>
|
||||||
|
</property>
|
||||||
|
</column>
|
||||||
|
<column>
|
||||||
|
<property name="text">
|
||||||
|
<string> </string>
|
||||||
|
</property>
|
||||||
|
</column>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<widget class="QMenuBar" name="menubar">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>1081</width>
|
||||||
|
<height>21</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<widget class="QMenu" name="menuFile">
|
||||||
|
<property name="title">
|
||||||
|
<string>File</string>
|
||||||
|
</property>
|
||||||
|
<addaction name="actionOpen"/>
|
||||||
|
<addaction name="actionSave_As"/>
|
||||||
|
<addaction name="separator"/>
|
||||||
|
<addaction name="actionExit"/>
|
||||||
|
</widget>
|
||||||
|
<addaction name="menuFile"/>
|
||||||
|
</widget>
|
||||||
|
<widget class="QStatusBar" name="statusbar"/>
|
||||||
|
<action name="actionOpen">
|
||||||
|
<property name="text">
|
||||||
|
<string>Open</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="actionSave_As">
|
||||||
|
<property name="text">
|
||||||
|
<string>Save As...</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="actionExit">
|
||||||
|
<property name="text">
|
||||||
|
<string>Exit</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
</widget>
|
||||||
|
<resources/>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
BIN
src/empyres/img/view-process-own.png
Normal file
BIN
src/empyres/img/view-process-own.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.6 KiB |
175
src/empyres/qempires.py
Normal file
175
src/empyres/qempires.py
Normal file
@ -0,0 +1,175 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
import os, logging, sys
|
||||||
|
from PyQt5 import QtCore, QtGui, QtWidgets
|
||||||
|
import empires
|
||||||
|
import empires_ui
|
||||||
|
from single_empire import EmpireTab
|
||||||
|
|
||||||
|
class TabBar(QtWidgets.QTabBar):
|
||||||
|
''' http://stackoverflow.com/questions/9442165/pyqt-mouse-events-for-qtabwidget
|
||||||
|
example usage:
|
||||||
|
self.tabBar = TabBar()
|
||||||
|
self.tabWidget.setTabBar(self.tabBar)
|
||||||
|
self.tabBar.middleClicked.connect(self.onTabMiddleClick)
|
||||||
|
'''
|
||||||
|
middleClicked = QtCore.pyqtSignal(int)
|
||||||
|
def __init__(self):
|
||||||
|
super(QtWidgets.QTabBar, self).__init__()
|
||||||
|
self.previousMiddleIndex = -1
|
||||||
|
def mousePressEvent(self, mouseEvent):
|
||||||
|
if mouseEvent.button() == QtCore.Qt.MidButton:
|
||||||
|
self.previousIndex = self.tabAt(mouseEvent.pos())
|
||||||
|
QtWidgets.QTabBar.mousePressEvent(self, mouseEvent)
|
||||||
|
def mouseReleaseEvent(self, mouseEvent):
|
||||||
|
if mouseEvent.button() == QtCore.Qt.MidButton and \
|
||||||
|
self.previousIndex == self.tabAt(mouseEvent.pos()):
|
||||||
|
self.middleClicked.emit(self.previousIndex)
|
||||||
|
self.previousIndex = -1
|
||||||
|
QtWidgets.QTabBar.mouseReleaseEvent(self, mouseEvent)
|
||||||
|
|
||||||
|
class QEmpiresSettings:
|
||||||
|
@classmethod
|
||||||
|
def initialize(cls):
|
||||||
|
cls.icon_view = QtGui.QIcon(QtGui.QPixmap("./img/view-process-own.png"))
|
||||||
|
|
||||||
|
class MainWindow(QtWidgets.QMainWindow):
|
||||||
|
def __init__(self):
|
||||||
|
super(MainWindow, self).__init__()
|
||||||
|
self.ui = empires_ui.Ui_MainWindow()
|
||||||
|
|
||||||
|
|
||||||
|
self.ui.setupUi(self)
|
||||||
|
|
||||||
|
self.tabBar = TabBar()
|
||||||
|
self.tabBar.addTab('Empires')
|
||||||
|
self.ui.tabWidget.setTabBar(self.tabBar)
|
||||||
|
|
||||||
|
|
||||||
|
self.tabBar.middleClicked.connect(self.onTabMiddleClick)
|
||||||
|
self.user_empires = None
|
||||||
|
self.load_empires(None)
|
||||||
|
|
||||||
|
def onTabMiddleClick(self, index):
|
||||||
|
if index == 0:
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
self.ui.tabWidget.removeTab(index)
|
||||||
|
#self.tabBar.removeTab(index)
|
||||||
|
|
||||||
|
def get_empire_tab(self, empire):
|
||||||
|
# this either creates a tab or gets the appropriate tabWidget entry.
|
||||||
|
for x in range(1, self.ui.tabWidget.count()):
|
||||||
|
widget = self.ui.tabWidget.widget(x)
|
||||||
|
e = getattr(widget, 'empire', None)
|
||||||
|
if e is not None and e == empire:
|
||||||
|
return widget
|
||||||
|
empire_tab = EmpireTab(empire)
|
||||||
|
self.ui.tabWidget.addTab(empire_tab, empire.name)
|
||||||
|
empire_tab.empire = empire
|
||||||
|
return empire_tab
|
||||||
|
|
||||||
|
def edit_empire(self, empire=None):
|
||||||
|
try:
|
||||||
|
# print(f"Empire is {empire}") # for some reason qt5 sends a boolean.
|
||||||
|
if not empire:
|
||||||
|
sender = self.sender()
|
||||||
|
empire = getattr(sender, 'empire', None)
|
||||||
|
if not empire:
|
||||||
|
logging.error("No Empire in Button Sender!???")
|
||||||
|
return
|
||||||
|
# open a new tab for this empire.
|
||||||
|
empire_tab = self.get_empire_tab(empire)
|
||||||
|
i = self.ui.tabWidget.indexOf(empire_tab)
|
||||||
|
if (i >= 0):
|
||||||
|
self.ui.tabWidget.setCurrentIndex(i)
|
||||||
|
except:
|
||||||
|
import traceback
|
||||||
|
traceback.print_exc()
|
||||||
|
return
|
||||||
|
|
||||||
|
def clear_table(self):
|
||||||
|
while (self.ui.tableWidget.rowCount() > 0):
|
||||||
|
self.ui.tableWidget.removeRow(0)
|
||||||
|
|
||||||
|
def fill_empires(self, empires):
|
||||||
|
self.clear_table()
|
||||||
|
for empire in empires:
|
||||||
|
table = self.ui.tableWidget
|
||||||
|
rowPosition = table.rowCount()
|
||||||
|
table.insertRow(rowPosition)
|
||||||
|
empire_buttons = QtWidgets.QWidget()
|
||||||
|
button_edit = QtWidgets.QPushButton(QEmpiresSettings.icon_view, "", empire_buttons)
|
||||||
|
button_edit.empire = empire
|
||||||
|
button_edit.clicked.connect( self.edit_empire )
|
||||||
|
"""
|
||||||
|
QWidget* pWidget = new QWidget();
|
||||||
|
QPushButton* btn_edit = new QPushButton();
|
||||||
|
btn_edit->setText("Edit");
|
||||||
|
QHBoxLayout* pLayout = new QHBoxLayout(pWidget);
|
||||||
|
pLayout->addWidget(btn_edit);
|
||||||
|
pLayout->setAlignment(Qt::AlignCenter);
|
||||||
|
pLayout->setContentsMargins(0, 0, 0, 0);
|
||||||
|
pWidget->setLayout(pLayout);
|
||||||
|
ui.table->setCellWidget(i, 3, pWidget);
|
||||||
|
"""
|
||||||
|
table.setCellWidget(rowPosition, 0, empire_buttons)
|
||||||
|
#table.setItem(rowPosition , 0, empire_buttons)
|
||||||
|
table.setItem(rowPosition , 1, QtWidgets.QTableWidgetItem(empire.name))
|
||||||
|
table.setItem(rowPosition , 2, QtWidgets.QTableWidgetItem(', '.join([ x.replace('trait_', '').replace('_', ' ') for x in empire.get_values('trait', [])])))
|
||||||
|
table.setItem(rowPosition , 3, QtWidgets.QTableWidgetItem(', '.join([ x.replace('ethic_', '').replace('_', ' ') for x in empire.get_values('ethic', [])])))
|
||||||
|
table.setItem(rowPosition , 4, QtWidgets.QTableWidgetItem(''.join([ ', '.join([y.replace('civic_', '').replace('_', ' ') for y in x]) for x in empire.get_values('civics', [])])))
|
||||||
|
table.setItem(rowPosition , 5, QtWidgets.QTableWidgetItem('%s (%s)' % (empire.get_values('planet_name', ['?'])[0],
|
||||||
|
empire.get_values('system_name', ['?'])[0])))
|
||||||
|
table.setItem(rowPosition, 6, QtWidgets.QTableWidgetItem('%s' % (empire.get_values('species_bio', [''])[0])))
|
||||||
|
|
||||||
|
# set header.
|
||||||
|
header = table.horizontalHeader()
|
||||||
|
header.setSectionResizeMode(0, QtWidgets.QHeaderView.ResizeToContents)
|
||||||
|
header.setSectionResizeMode(1, QtWidgets.QHeaderView.ResizeToContents)
|
||||||
|
header.setSectionResizeMode(2, QtWidgets.QHeaderView.ResizeToContents)
|
||||||
|
header.setSectionResizeMode(3, QtWidgets.QHeaderView.ResizeToContents)
|
||||||
|
header.setSectionResizeMode(4, QtWidgets.QHeaderView.ResizeToContents)
|
||||||
|
header.setSectionResizeMode(5, QtWidgets.QHeaderView.ResizeToContents)
|
||||||
|
header.setSectionResizeMode(6, QtWidgets.QHeaderView.Stretch)
|
||||||
|
|
||||||
|
|
||||||
|
def load_empires(self, filename):
|
||||||
|
try:
|
||||||
|
self.user_empires = empires.load_empires(filename)
|
||||||
|
except:
|
||||||
|
import traceback
|
||||||
|
traceback.print_exc()
|
||||||
|
logging.error("File %s could not be loaded." % filename)
|
||||||
|
return
|
||||||
|
self.fill_empires(self.user_empires.all())
|
||||||
|
|
||||||
|
|
||||||
|
###################################################
|
||||||
|
def _main():
|
||||||
|
app = QtWidgets.QApplication(sys.argv)
|
||||||
|
QEmpiresSettings.initialize()
|
||||||
|
window = MainWindow()
|
||||||
|
#window.resize(640, 480)
|
||||||
|
window.show()
|
||||||
|
return app.exec_()
|
||||||
|
|
||||||
|
def main():
|
||||||
|
r = _main()
|
||||||
|
try:
|
||||||
|
import psutil #@UnresolvedImport
|
||||||
|
except ImportError:
|
||||||
|
logging.warning('Cannot import PsUtil, terminating without cleaning up threads explicitly.')
|
||||||
|
sys.exit(r)
|
||||||
|
|
||||||
|
def kill_proc_tree(pid, including_parent=True):
|
||||||
|
parent = psutil.Process(pid)
|
||||||
|
if including_parent:
|
||||||
|
parent.kill()
|
||||||
|
me = os.getpid()
|
||||||
|
kill_proc_tree(me)
|
||||||
|
sys.exit(r)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
|
|
13
src/empyres/single_empire.py
Normal file
13
src/empyres/single_empire.py
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
import os, logging, sys
|
||||||
|
from PyQt5 import QtCore, QtGui, QtWidgets
|
||||||
|
import single_empire_ui
|
||||||
|
|
||||||
|
class EmpireTab(QtWidgets.QWidget):
|
||||||
|
def __init__(self, empire=None, parent=None):
|
||||||
|
super(EmpireTab, self).__init__(parent)
|
||||||
|
self.empire = empire
|
||||||
|
self.ui = single_empire_ui.Ui_Form()
|
||||||
|
self.ui.setupUi(self)
|
||||||
|
|
364
src/empyres/single_empire_ui.py
Normal file
364
src/empyres/single_empire_ui.py
Normal file
@ -0,0 +1,364 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
# Form implementation generated from reading ui file 'E:/work/workspace/stellaris_empyres/src/empyres/single_empire_ui.ui'
|
||||||
|
#
|
||||||
|
# Created by: PyQt5 UI code generator 5.8.2
|
||||||
|
#
|
||||||
|
# WARNING! All changes made in this file will be lost!
|
||||||
|
|
||||||
|
from PyQt5 import QtCore, QtGui, QtWidgets
|
||||||
|
|
||||||
|
class Ui_Form(object):
|
||||||
|
def setupUi(self, Form):
|
||||||
|
Form.setObjectName("Form")
|
||||||
|
Form.resize(892, 595)
|
||||||
|
self.verticalLayout = QtWidgets.QVBoxLayout(Form)
|
||||||
|
self.verticalLayout.setObjectName("verticalLayout")
|
||||||
|
self.toolBox = QtWidgets.QToolBox(Form)
|
||||||
|
self.toolBox.setObjectName("toolBox")
|
||||||
|
self.page_summary = QtWidgets.QWidget()
|
||||||
|
self.page_summary.setGeometry(QtCore.QRect(0, 0, 857, 597))
|
||||||
|
self.page_summary.setObjectName("page_summary")
|
||||||
|
self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.page_summary)
|
||||||
|
self.verticalLayout_4.setContentsMargins(0, 0, 0, 0)
|
||||||
|
self.verticalLayout_4.setObjectName("verticalLayout_4")
|
||||||
|
self.horizontalLayout_summary = QtWidgets.QHBoxLayout()
|
||||||
|
self.horizontalLayout_summary.setSizeConstraint(QtWidgets.QLayout.SetDefaultConstraint)
|
||||||
|
self.horizontalLayout_summary.setObjectName("horizontalLayout_summary")
|
||||||
|
self.verticalLayout_summary_left = QtWidgets.QVBoxLayout()
|
||||||
|
self.verticalLayout_summary_left.setSizeConstraint(QtWidgets.QLayout.SetFixedSize)
|
||||||
|
self.verticalLayout_summary_left.setObjectName("verticalLayout_summary_left")
|
||||||
|
self.groupBox = QtWidgets.QGroupBox(self.page_summary)
|
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Expanding)
|
||||||
|
sizePolicy.setHorizontalStretch(0)
|
||||||
|
sizePolicy.setVerticalStretch(1)
|
||||||
|
sizePolicy.setHeightForWidth(self.groupBox.sizePolicy().hasHeightForWidth())
|
||||||
|
self.groupBox.setSizePolicy(sizePolicy)
|
||||||
|
self.groupBox.setObjectName("groupBox")
|
||||||
|
self.formLayout_2 = QtWidgets.QFormLayout(self.groupBox)
|
||||||
|
self.formLayout_2.setObjectName("formLayout_2")
|
||||||
|
self.lineEdit_4 = QtWidgets.QLineEdit(self.groupBox)
|
||||||
|
self.lineEdit_4.setObjectName("lineEdit_4")
|
||||||
|
self.formLayout_2.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.lineEdit_4)
|
||||||
|
self.label_6 = QtWidgets.QLabel(self.groupBox)
|
||||||
|
self.label_6.setObjectName("label_6")
|
||||||
|
self.formLayout_2.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label_6)
|
||||||
|
self.groupBox_5 = QtWidgets.QGroupBox(self.groupBox)
|
||||||
|
self.groupBox_5.setObjectName("groupBox_5")
|
||||||
|
self.gridLayout_2 = QtWidgets.QGridLayout(self.groupBox_5)
|
||||||
|
self.gridLayout_2.setObjectName("gridLayout_2")
|
||||||
|
self.checkBox_13 = QtWidgets.QCheckBox(self.groupBox_5)
|
||||||
|
self.checkBox_13.setObjectName("checkBox_13")
|
||||||
|
self.gridLayout_2.addWidget(self.checkBox_13, 0, 0, 1, 1)
|
||||||
|
self.checkBox = QtWidgets.QCheckBox(self.groupBox_5)
|
||||||
|
self.checkBox.setObjectName("checkBox")
|
||||||
|
self.gridLayout_2.addWidget(self.checkBox, 3, 0, 1, 1)
|
||||||
|
self.checkBox_2 = QtWidgets.QCheckBox(self.groupBox_5)
|
||||||
|
self.checkBox_2.setObjectName("checkBox_2")
|
||||||
|
self.gridLayout_2.addWidget(self.checkBox_2, 3, 1, 1, 1)
|
||||||
|
self.checkBox_8 = QtWidgets.QCheckBox(self.groupBox_5)
|
||||||
|
self.checkBox_8.setObjectName("checkBox_8")
|
||||||
|
self.gridLayout_2.addWidget(self.checkBox_8, 3, 3, 1, 1)
|
||||||
|
self.checkBox_7 = QtWidgets.QCheckBox(self.groupBox_5)
|
||||||
|
self.checkBox_7.setObjectName("checkBox_7")
|
||||||
|
self.gridLayout_2.addWidget(self.checkBox_7, 3, 2, 1, 1)
|
||||||
|
self.checkBox_9 = QtWidgets.QCheckBox(self.groupBox_5)
|
||||||
|
self.checkBox_9.setObjectName("checkBox_9")
|
||||||
|
self.gridLayout_2.addWidget(self.checkBox_9, 4, 0, 1, 1)
|
||||||
|
self.checkBox_4 = QtWidgets.QCheckBox(self.groupBox_5)
|
||||||
|
self.checkBox_4.setObjectName("checkBox_4")
|
||||||
|
self.gridLayout_2.addWidget(self.checkBox_4, 1, 0, 1, 1)
|
||||||
|
self.checkBox_3 = QtWidgets.QCheckBox(self.groupBox_5)
|
||||||
|
self.checkBox_3.setObjectName("checkBox_3")
|
||||||
|
self.gridLayout_2.addWidget(self.checkBox_3, 1, 1, 1, 1)
|
||||||
|
self.checkBox_5 = QtWidgets.QCheckBox(self.groupBox_5)
|
||||||
|
self.checkBox_5.setObjectName("checkBox_5")
|
||||||
|
self.gridLayout_2.addWidget(self.checkBox_5, 1, 2, 1, 1)
|
||||||
|
self.checkBox_6 = QtWidgets.QCheckBox(self.groupBox_5)
|
||||||
|
self.checkBox_6.setObjectName("checkBox_6")
|
||||||
|
self.gridLayout_2.addWidget(self.checkBox_6, 1, 3, 1, 1)
|
||||||
|
self.checkBox_10 = QtWidgets.QCheckBox(self.groupBox_5)
|
||||||
|
self.checkBox_10.setObjectName("checkBox_10")
|
||||||
|
self.gridLayout_2.addWidget(self.checkBox_10, 4, 1, 1, 1)
|
||||||
|
self.checkBox_11 = QtWidgets.QCheckBox(self.groupBox_5)
|
||||||
|
self.checkBox_11.setObjectName("checkBox_11")
|
||||||
|
self.gridLayout_2.addWidget(self.checkBox_11, 4, 2, 1, 1)
|
||||||
|
self.checkBox_12 = QtWidgets.QCheckBox(self.groupBox_5)
|
||||||
|
self.checkBox_12.setObjectName("checkBox_12")
|
||||||
|
self.gridLayout_2.addWidget(self.checkBox_12, 4, 3, 1, 1)
|
||||||
|
self.formLayout_2.setWidget(1, QtWidgets.QFormLayout.SpanningRole, self.groupBox_5)
|
||||||
|
self.label_15 = QtWidgets.QLabel(self.groupBox)
|
||||||
|
self.label_15.setObjectName("label_15")
|
||||||
|
self.formLayout_2.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.label_15)
|
||||||
|
self.label_16 = QtWidgets.QLabel(self.groupBox)
|
||||||
|
self.label_16.setObjectName("label_16")
|
||||||
|
self.formLayout_2.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.label_16)
|
||||||
|
self.label_18 = QtWidgets.QLabel(self.groupBox)
|
||||||
|
self.label_18.setObjectName("label_18")
|
||||||
|
self.formLayout_2.setWidget(4, QtWidgets.QFormLayout.LabelRole, self.label_18)
|
||||||
|
self.label_19 = QtWidgets.QLabel(self.groupBox)
|
||||||
|
self.label_19.setObjectName("label_19")
|
||||||
|
self.formLayout_2.setWidget(5, QtWidgets.QFormLayout.LabelRole, self.label_19)
|
||||||
|
self.label_20 = QtWidgets.QLabel(self.groupBox)
|
||||||
|
self.label_20.setObjectName("label_20")
|
||||||
|
self.formLayout_2.setWidget(6, QtWidgets.QFormLayout.LabelRole, self.label_20)
|
||||||
|
self.verticalLayout_summary_left.addWidget(self.groupBox)
|
||||||
|
self.groupBox_3 = QtWidgets.QGroupBox(self.page_summary)
|
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Expanding)
|
||||||
|
sizePolicy.setHorizontalStretch(0)
|
||||||
|
sizePolicy.setVerticalStretch(1)
|
||||||
|
sizePolicy.setHeightForWidth(self.groupBox_3.sizePolicy().hasHeightForWidth())
|
||||||
|
self.groupBox_3.setSizePolicy(sizePolicy)
|
||||||
|
self.groupBox_3.setObjectName("groupBox_3")
|
||||||
|
self.formLayout_4 = QtWidgets.QFormLayout(self.groupBox_3)
|
||||||
|
self.formLayout_4.setObjectName("formLayout_4")
|
||||||
|
self.comboBox_2 = QtWidgets.QComboBox(self.groupBox_3)
|
||||||
|
self.comboBox_2.setObjectName("comboBox_2")
|
||||||
|
self.formLayout_4.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.comboBox_2)
|
||||||
|
self.label_11 = QtWidgets.QLabel(self.groupBox_3)
|
||||||
|
self.label_11.setObjectName("label_11")
|
||||||
|
self.formLayout_4.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label_11)
|
||||||
|
self.label_12 = QtWidgets.QLabel(self.groupBox_3)
|
||||||
|
self.label_12.setObjectName("label_12")
|
||||||
|
self.formLayout_4.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.label_12)
|
||||||
|
self.label_13 = QtWidgets.QLabel(self.groupBox_3)
|
||||||
|
self.label_13.setObjectName("label_13")
|
||||||
|
self.formLayout_4.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.label_13)
|
||||||
|
self.comboBox_3 = QtWidgets.QComboBox(self.groupBox_3)
|
||||||
|
self.comboBox_3.setObjectName("comboBox_3")
|
||||||
|
self.formLayout_4.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.comboBox_3)
|
||||||
|
self.comboBox_4 = QtWidgets.QComboBox(self.groupBox_3)
|
||||||
|
self.comboBox_4.setObjectName("comboBox_4")
|
||||||
|
self.formLayout_4.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.comboBox_4)
|
||||||
|
self.label_14 = QtWidgets.QLabel(self.groupBox_3)
|
||||||
|
self.label_14.setObjectName("label_14")
|
||||||
|
self.formLayout_4.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.label_14)
|
||||||
|
self.lineEdit_8 = QtWidgets.QLineEdit(self.groupBox_3)
|
||||||
|
self.lineEdit_8.setObjectName("lineEdit_8")
|
||||||
|
self.formLayout_4.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.lineEdit_8)
|
||||||
|
self.label_17 = QtWidgets.QLabel(self.groupBox_3)
|
||||||
|
self.label_17.setObjectName("label_17")
|
||||||
|
self.formLayout_4.setWidget(4, QtWidgets.QFormLayout.LabelRole, self.label_17)
|
||||||
|
self.comboBox_5 = QtWidgets.QComboBox(self.groupBox_3)
|
||||||
|
self.comboBox_5.setObjectName("comboBox_5")
|
||||||
|
self.formLayout_4.setWidget(4, QtWidgets.QFormLayout.FieldRole, self.comboBox_5)
|
||||||
|
self.verticalLayout_summary_left.addWidget(self.groupBox_3)
|
||||||
|
self.horizontalLayout_summary.addLayout(self.verticalLayout_summary_left)
|
||||||
|
self.verticalLayout_summary_right = QtWidgets.QVBoxLayout()
|
||||||
|
self.verticalLayout_summary_right.setSizeConstraint(QtWidgets.QLayout.SetFixedSize)
|
||||||
|
self.verticalLayout_summary_right.setObjectName("verticalLayout_summary_right")
|
||||||
|
self.groupBox_4 = QtWidgets.QGroupBox(self.page_summary)
|
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Expanding)
|
||||||
|
sizePolicy.setHorizontalStretch(0)
|
||||||
|
sizePolicy.setVerticalStretch(1)
|
||||||
|
sizePolicy.setHeightForWidth(self.groupBox_4.sizePolicy().hasHeightForWidth())
|
||||||
|
self.groupBox_4.setSizePolicy(sizePolicy)
|
||||||
|
self.groupBox_4.setObjectName("groupBox_4")
|
||||||
|
self.formLayout_3 = QtWidgets.QFormLayout(self.groupBox_4)
|
||||||
|
self.formLayout_3.setObjectName("formLayout_3")
|
||||||
|
self.lineEdit_6 = QtWidgets.QLineEdit(self.groupBox_4)
|
||||||
|
self.lineEdit_6.setObjectName("lineEdit_6")
|
||||||
|
self.formLayout_3.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.lineEdit_6)
|
||||||
|
self.label_7 = QtWidgets.QLabel(self.groupBox_4)
|
||||||
|
self.label_7.setObjectName("label_7")
|
||||||
|
self.formLayout_3.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label_7)
|
||||||
|
self.lineEdit_7 = QtWidgets.QLineEdit(self.groupBox_4)
|
||||||
|
self.lineEdit_7.setObjectName("lineEdit_7")
|
||||||
|
self.formLayout_3.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.lineEdit_7)
|
||||||
|
self.label_8 = QtWidgets.QLabel(self.groupBox_4)
|
||||||
|
self.label_8.setObjectName("label_8")
|
||||||
|
self.formLayout_3.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.label_8)
|
||||||
|
self.lineEdit_5 = QtWidgets.QLineEdit(self.groupBox_4)
|
||||||
|
self.lineEdit_5.setObjectName("lineEdit_5")
|
||||||
|
self.formLayout_3.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.lineEdit_5)
|
||||||
|
self.label_9 = QtWidgets.QLabel(self.groupBox_4)
|
||||||
|
self.label_9.setObjectName("label_9")
|
||||||
|
self.formLayout_3.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.label_9)
|
||||||
|
self.label_10 = QtWidgets.QLabel(self.groupBox_4)
|
||||||
|
self.label_10.setObjectName("label_10")
|
||||||
|
self.formLayout_3.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.label_10)
|
||||||
|
self.listView = QtWidgets.QListView(self.groupBox_4)
|
||||||
|
self.listView.setObjectName("listView")
|
||||||
|
self.formLayout_3.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.listView)
|
||||||
|
self.label_24 = QtWidgets.QLabel(self.groupBox_4)
|
||||||
|
self.label_24.setObjectName("label_24")
|
||||||
|
self.formLayout_3.setWidget(5, QtWidgets.QFormLayout.LabelRole, self.label_24)
|
||||||
|
self.label_25 = QtWidgets.QLabel(self.groupBox_4)
|
||||||
|
self.label_25.setObjectName("label_25")
|
||||||
|
self.formLayout_3.setWidget(6, QtWidgets.QFormLayout.LabelRole, self.label_25)
|
||||||
|
self.comboBox_6 = QtWidgets.QComboBox(self.groupBox_4)
|
||||||
|
self.comboBox_6.setObjectName("comboBox_6")
|
||||||
|
self.formLayout_3.setWidget(6, QtWidgets.QFormLayout.FieldRole, self.comboBox_6)
|
||||||
|
self.checkBox_14 = QtWidgets.QCheckBox(self.groupBox_4)
|
||||||
|
self.checkBox_14.setObjectName("checkBox_14")
|
||||||
|
self.formLayout_3.setWidget(5, QtWidgets.QFormLayout.FieldRole, self.checkBox_14)
|
||||||
|
self.verticalLayout_summary_right.addWidget(self.groupBox_4)
|
||||||
|
self.groupBox_2 = QtWidgets.QGroupBox(self.page_summary)
|
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Expanding)
|
||||||
|
sizePolicy.setHorizontalStretch(0)
|
||||||
|
sizePolicy.setVerticalStretch(1)
|
||||||
|
sizePolicy.setHeightForWidth(self.groupBox_2.sizePolicy().hasHeightForWidth())
|
||||||
|
self.groupBox_2.setSizePolicy(sizePolicy)
|
||||||
|
self.groupBox_2.setObjectName("groupBox_2")
|
||||||
|
self.formLayout = QtWidgets.QFormLayout(self.groupBox_2)
|
||||||
|
self.formLayout.setObjectName("formLayout")
|
||||||
|
self.label = QtWidgets.QLabel(self.groupBox_2)
|
||||||
|
self.label.setObjectName("label")
|
||||||
|
self.formLayout.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.label)
|
||||||
|
self.lineEdit = QtWidgets.QLineEdit(self.groupBox_2)
|
||||||
|
self.lineEdit.setObjectName("lineEdit")
|
||||||
|
self.formLayout.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.lineEdit)
|
||||||
|
self.label_2 = QtWidgets.QLabel(self.groupBox_2)
|
||||||
|
self.label_2.setObjectName("label_2")
|
||||||
|
self.formLayout.setWidget(8, QtWidgets.QFormLayout.LabelRole, self.label_2)
|
||||||
|
self.comboBox = QtWidgets.QComboBox(self.groupBox_2)
|
||||||
|
self.comboBox.setObjectName("comboBox")
|
||||||
|
self.formLayout.setWidget(8, QtWidgets.QFormLayout.FieldRole, self.comboBox)
|
||||||
|
self.widget = QtWidgets.QWidget(self.groupBox_2)
|
||||||
|
self.widget.setObjectName("widget")
|
||||||
|
self.gridLayout = QtWidgets.QGridLayout(self.widget)
|
||||||
|
self.gridLayout.setContentsMargins(0, 0, 0, 0)
|
||||||
|
self.gridLayout.setObjectName("gridLayout")
|
||||||
|
self.radioButton = QtWidgets.QRadioButton(self.widget)
|
||||||
|
self.radioButton.setObjectName("radioButton")
|
||||||
|
self.gridLayout.addWidget(self.radioButton, 0, 0, 1, 1)
|
||||||
|
self.radioButton_2 = QtWidgets.QRadioButton(self.widget)
|
||||||
|
self.radioButton_2.setObjectName("radioButton_2")
|
||||||
|
self.gridLayout.addWidget(self.radioButton_2, 0, 1, 1, 1)
|
||||||
|
self.label_3 = QtWidgets.QLabel(self.widget)
|
||||||
|
self.label_3.setObjectName("label_3")
|
||||||
|
self.gridLayout.addWidget(self.label_3, 1, 0, 1, 1)
|
||||||
|
self.spinBox = QtWidgets.QSpinBox(self.widget)
|
||||||
|
self.spinBox.setObjectName("spinBox")
|
||||||
|
self.gridLayout.addWidget(self.spinBox, 1, 1, 1, 1)
|
||||||
|
self.label_22 = QtWidgets.QLabel(self.widget)
|
||||||
|
self.label_22.setObjectName("label_22")
|
||||||
|
self.gridLayout.addWidget(self.label_22, 6, 0, 1, 1)
|
||||||
|
self.label_21 = QtWidgets.QLabel(self.widget)
|
||||||
|
self.label_21.setObjectName("label_21")
|
||||||
|
self.gridLayout.addWidget(self.label_21, 2, 0, 1, 1)
|
||||||
|
self.spinBox_2 = QtWidgets.QSpinBox(self.widget)
|
||||||
|
self.spinBox_2.setObjectName("spinBox_2")
|
||||||
|
self.gridLayout.addWidget(self.spinBox_2, 2, 1, 1, 1)
|
||||||
|
self.spinBox_3 = QtWidgets.QSpinBox(self.widget)
|
||||||
|
self.spinBox_3.setObjectName("spinBox_3")
|
||||||
|
self.gridLayout.addWidget(self.spinBox_3, 6, 1, 1, 1)
|
||||||
|
self.formLayout.setWidget(9, QtWidgets.QFormLayout.FieldRole, self.widget)
|
||||||
|
self.lineEdit_2 = QtWidgets.QLineEdit(self.groupBox_2)
|
||||||
|
self.lineEdit_2.setObjectName("lineEdit_2")
|
||||||
|
self.formLayout.setWidget(5, QtWidgets.QFormLayout.FieldRole, self.lineEdit_2)
|
||||||
|
self.label_4 = QtWidgets.QLabel(self.groupBox_2)
|
||||||
|
self.label_4.setObjectName("label_4")
|
||||||
|
self.formLayout.setWidget(5, QtWidgets.QFormLayout.LabelRole, self.label_4)
|
||||||
|
self.lineEdit_3 = QtWidgets.QLineEdit(self.groupBox_2)
|
||||||
|
self.lineEdit_3.setObjectName("lineEdit_3")
|
||||||
|
self.formLayout.setWidget(10, QtWidgets.QFormLayout.FieldRole, self.lineEdit_3)
|
||||||
|
self.label_5 = QtWidgets.QLabel(self.groupBox_2)
|
||||||
|
self.label_5.setObjectName("label_5")
|
||||||
|
self.formLayout.setWidget(10, QtWidgets.QFormLayout.LabelRole, self.label_5)
|
||||||
|
self.label_23 = QtWidgets.QLabel(self.groupBox_2)
|
||||||
|
self.label_23.setObjectName("label_23")
|
||||||
|
self.formLayout.setWidget(11, QtWidgets.QFormLayout.LabelRole, self.label_23)
|
||||||
|
self.lineEdit_9 = QtWidgets.QLineEdit(self.groupBox_2)
|
||||||
|
self.lineEdit_9.setObjectName("lineEdit_9")
|
||||||
|
self.formLayout.setWidget(11, QtWidgets.QFormLayout.FieldRole, self.lineEdit_9)
|
||||||
|
self.verticalLayout_summary_right.addWidget(self.groupBox_2)
|
||||||
|
self.horizontalLayout_summary.addLayout(self.verticalLayout_summary_right)
|
||||||
|
self.verticalLayout_4.addLayout(self.horizontalLayout_summary)
|
||||||
|
self.toolBox.addItem(self.page_summary, "")
|
||||||
|
self.page_source = QtWidgets.QWidget()
|
||||||
|
self.page_source.setGeometry(QtCore.QRect(0, 0, 874, 496))
|
||||||
|
self.page_source.setObjectName("page_source")
|
||||||
|
self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.page_source)
|
||||||
|
self.verticalLayout_3.setContentsMargins(0, 0, 0, 0)
|
||||||
|
self.verticalLayout_3.setObjectName("verticalLayout_3")
|
||||||
|
self.verticalLayout_source = QtWidgets.QVBoxLayout()
|
||||||
|
self.verticalLayout_source.setObjectName("verticalLayout_source")
|
||||||
|
self.sourceTextEdit = QtWidgets.QTextEdit(self.page_source)
|
||||||
|
self.sourceTextEdit.setObjectName("sourceTextEdit")
|
||||||
|
self.verticalLayout_source.addWidget(self.sourceTextEdit)
|
||||||
|
self.btnCopySource = QtWidgets.QPushButton(self.page_source)
|
||||||
|
self.btnCopySource.setObjectName("btnCopySource")
|
||||||
|
self.verticalLayout_source.addWidget(self.btnCopySource)
|
||||||
|
self.verticalLayout_3.addLayout(self.verticalLayout_source)
|
||||||
|
self.toolBox.addItem(self.page_source, "")
|
||||||
|
self.page_sourcetree = QtWidgets.QWidget()
|
||||||
|
self.page_sourcetree.setObjectName("page_sourcetree")
|
||||||
|
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.page_sourcetree)
|
||||||
|
self.verticalLayout_2.setContentsMargins(0, 0, 0, 0)
|
||||||
|
self.verticalLayout_2.setObjectName("verticalLayout_2")
|
||||||
|
self.treeViewEdit = QtWidgets.QTreeView(self.page_sourcetree)
|
||||||
|
self.treeViewEdit.setIconSize(QtCore.QSize(16, 16))
|
||||||
|
self.treeViewEdit.setObjectName("treeViewEdit")
|
||||||
|
self.verticalLayout_2.addWidget(self.treeViewEdit)
|
||||||
|
self.toolBox.addItem(self.page_sourcetree, "")
|
||||||
|
self.verticalLayout.addWidget(self.toolBox)
|
||||||
|
|
||||||
|
self.retranslateUi(Form)
|
||||||
|
self.toolBox.setCurrentIndex(2)
|
||||||
|
QtCore.QMetaObject.connectSlotsByName(Form)
|
||||||
|
|
||||||
|
def retranslateUi(self, Form):
|
||||||
|
_translate = QtCore.QCoreApplication.translate
|
||||||
|
Form.setWindowTitle(_translate("Form", "Form"))
|
||||||
|
self.groupBox.setTitle(_translate("Form", "Government"))
|
||||||
|
self.label_6.setText(_translate("Form", "Empire Name"))
|
||||||
|
self.groupBox_5.setTitle(_translate("Form", "Type"))
|
||||||
|
self.checkBox_13.setText(_translate("Form", "hive mind (3)"))
|
||||||
|
self.checkBox.setText(_translate("Form", "spiritualist (2)"))
|
||||||
|
self.checkBox_2.setText(_translate("Form", "spiritualist (1)"))
|
||||||
|
self.checkBox_8.setText(_translate("Form", "materialist (2)"))
|
||||||
|
self.checkBox_7.setText(_translate("Form", "materialist (1)"))
|
||||||
|
self.checkBox_9.setText(_translate("Form", "authoritarian (2)"))
|
||||||
|
self.checkBox_4.setText(_translate("Form", "militarist (2)"))
|
||||||
|
self.checkBox_3.setText(_translate("Form", "militarist (1)"))
|
||||||
|
self.checkBox_5.setText(_translate("Form", "pacifist (1)"))
|
||||||
|
self.checkBox_6.setText(_translate("Form", "pacifist (2)"))
|
||||||
|
self.checkBox_10.setText(_translate("Form", "authoritarian (1)"))
|
||||||
|
self.checkBox_11.setText(_translate("Form", "egalitarian (1)"))
|
||||||
|
self.checkBox_12.setText(_translate("Form", "egalitarian (2)"))
|
||||||
|
self.label_15.setText(_translate("Form", "Civics"))
|
||||||
|
self.label_16.setText(_translate("Form", "Homeworld"))
|
||||||
|
self.label_18.setText(_translate("Form", "Homeworld class"))
|
||||||
|
self.label_19.setText(_translate("Form", "System"))
|
||||||
|
self.label_20.setText(_translate("Form", "Initializer"))
|
||||||
|
self.groupBox_3.setTitle(_translate("Form", "Visuals"))
|
||||||
|
self.label_11.setText(_translate("Form", "Ships"))
|
||||||
|
self.label_12.setText(_translate("Form", "Weapons"))
|
||||||
|
self.label_13.setText(_translate("Form", "FTL"))
|
||||||
|
self.label_14.setText(_translate("Form", "Flag"))
|
||||||
|
self.label_17.setText(_translate("Form", "Cities"))
|
||||||
|
self.groupBox_4.setTitle(_translate("Form", "Species"))
|
||||||
|
self.label_7.setText(_translate("Form", "Name"))
|
||||||
|
self.label_8.setText(_translate("Form", "Plural"))
|
||||||
|
self.label_9.setText(_translate("Form", "Adjective"))
|
||||||
|
self.label_10.setText(_translate("Form", "Traits"))
|
||||||
|
self.label_24.setText(_translate("Form", "Fallen Empire"))
|
||||||
|
self.label_25.setText(_translate("Form", "Spawn"))
|
||||||
|
self.checkBox_14.setText(_translate("Form", "Spawn as fallen Empire"))
|
||||||
|
self.groupBox_2.setTitle(_translate("Form", "Leader"))
|
||||||
|
self.label.setText(_translate("Form", "Name"))
|
||||||
|
self.label_2.setText(_translate("Form", "Portrait"))
|
||||||
|
self.radioButton.setText(_translate("Form", "Male"))
|
||||||
|
self.radioButton_2.setText(_translate("Form", "Female"))
|
||||||
|
self.label_3.setText(_translate("Form", "Texture"))
|
||||||
|
self.label_22.setText(_translate("Form", "Clothes"))
|
||||||
|
self.label_21.setText(_translate("Form", "Hair"))
|
||||||
|
self.label_4.setText(_translate("Form", "Title"))
|
||||||
|
self.label_5.setText(_translate("Form", "Heir"))
|
||||||
|
self.label_23.setText(_translate("Form", "Room"))
|
||||||
|
self.toolBox.setItemText(self.toolBox.indexOf(self.page_summary), _translate("Form", "Summary"))
|
||||||
|
self.btnCopySource.setText(_translate("Form", "Copy to Clipboard"))
|
||||||
|
self.toolBox.setItemText(self.toolBox.indexOf(self.page_source), _translate("Form", "Source"))
|
||||||
|
self.toolBox.setItemText(self.toolBox.indexOf(self.page_sourcetree), _translate("Form", "TreeEdit"))
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
import sys
|
||||||
|
app = QtWidgets.QApplication(sys.argv)
|
||||||
|
Form = QtWidgets.QWidget()
|
||||||
|
ui = Ui_Form()
|
||||||
|
ui.setupUi(Form)
|
||||||
|
Form.show()
|
||||||
|
sys.exit(app.exec_())
|
||||||
|
|
529
src/empyres/single_empire_ui.ui
Normal file
529
src/empyres/single_empire_ui.ui
Normal file
@ -0,0 +1,529 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>Form</class>
|
||||||
|
<widget class="QWidget" name="Form">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>892</width>
|
||||||
|
<height>595</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>Form</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
|
<item>
|
||||||
|
<widget class="QToolBox" name="toolBox">
|
||||||
|
<property name="currentIndex">
|
||||||
|
<number>2</number>
|
||||||
|
</property>
|
||||||
|
<widget class="QWidget" name="page_summary">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>857</width>
|
||||||
|
<height>597</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<attribute name="label">
|
||||||
|
<string>Summary</string>
|
||||||
|
</attribute>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_4">
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_summary">
|
||||||
|
<property name="sizeConstraint">
|
||||||
|
<enum>QLayout::SetDefaultConstraint</enum>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_summary_left">
|
||||||
|
<property name="sizeConstraint">
|
||||||
|
<enum>QLayout::SetFixedSize</enum>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="groupBox">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>1</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="title">
|
||||||
|
<string>Government</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QFormLayout" name="formLayout_2">
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="QLineEdit" name="lineEdit_4"/>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QLabel" name="label_6">
|
||||||
|
<property name="text">
|
||||||
|
<string>Empire Name</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0" colspan="2">
|
||||||
|
<widget class="QGroupBox" name="groupBox_5">
|
||||||
|
<property name="title">
|
||||||
|
<string>Type</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" name="gridLayout_2">
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QCheckBox" name="checkBox_13">
|
||||||
|
<property name="text">
|
||||||
|
<string>hive mind (3)</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="0">
|
||||||
|
<widget class="QCheckBox" name="checkBox">
|
||||||
|
<property name="text">
|
||||||
|
<string>spiritualist (2)</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="1">
|
||||||
|
<widget class="QCheckBox" name="checkBox_2">
|
||||||
|
<property name="text">
|
||||||
|
<string>spiritualist (1)</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="3">
|
||||||
|
<widget class="QCheckBox" name="checkBox_8">
|
||||||
|
<property name="text">
|
||||||
|
<string>materialist (2)</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="2">
|
||||||
|
<widget class="QCheckBox" name="checkBox_7">
|
||||||
|
<property name="text">
|
||||||
|
<string>materialist (1)</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="0">
|
||||||
|
<widget class="QCheckBox" name="checkBox_9">
|
||||||
|
<property name="text">
|
||||||
|
<string>authoritarian (2)</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QCheckBox" name="checkBox_4">
|
||||||
|
<property name="text">
|
||||||
|
<string>militarist (2)</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="QCheckBox" name="checkBox_3">
|
||||||
|
<property name="text">
|
||||||
|
<string>militarist (1)</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="2">
|
||||||
|
<widget class="QCheckBox" name="checkBox_5">
|
||||||
|
<property name="text">
|
||||||
|
<string>pacifist (1)</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="3">
|
||||||
|
<widget class="QCheckBox" name="checkBox_6">
|
||||||
|
<property name="text">
|
||||||
|
<string>pacifist (2)</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="1">
|
||||||
|
<widget class="QCheckBox" name="checkBox_10">
|
||||||
|
<property name="text">
|
||||||
|
<string>authoritarian (1)</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="2">
|
||||||
|
<widget class="QCheckBox" name="checkBox_11">
|
||||||
|
<property name="text">
|
||||||
|
<string>egalitarian (1)</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="3">
|
||||||
|
<widget class="QCheckBox" name="checkBox_12">
|
||||||
|
<property name="text">
|
||||||
|
<string>egalitarian (2)</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0">
|
||||||
|
<widget class="QLabel" name="label_15">
|
||||||
|
<property name="text">
|
||||||
|
<string>Civics</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="0">
|
||||||
|
<widget class="QLabel" name="label_16">
|
||||||
|
<property name="text">
|
||||||
|
<string>Homeworld</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="0">
|
||||||
|
<widget class="QLabel" name="label_18">
|
||||||
|
<property name="text">
|
||||||
|
<string>Homeworld class</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="5" column="0">
|
||||||
|
<widget class="QLabel" name="label_19">
|
||||||
|
<property name="text">
|
||||||
|
<string>System</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="6" column="0">
|
||||||
|
<widget class="QLabel" name="label_20">
|
||||||
|
<property name="text">
|
||||||
|
<string>Initializer</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="groupBox_3">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>1</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="title">
|
||||||
|
<string>Visuals</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QFormLayout" name="formLayout_4">
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="QComboBox" name="comboBox_2"/>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QLabel" name="label_11">
|
||||||
|
<property name="text">
|
||||||
|
<string>Ships</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QLabel" name="label_12">
|
||||||
|
<property name="text">
|
||||||
|
<string>Weapons</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0">
|
||||||
|
<widget class="QLabel" name="label_13">
|
||||||
|
<property name="text">
|
||||||
|
<string>FTL</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="QComboBox" name="comboBox_3"/>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="1">
|
||||||
|
<widget class="QComboBox" name="comboBox_4"/>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="0">
|
||||||
|
<widget class="QLabel" name="label_14">
|
||||||
|
<property name="text">
|
||||||
|
<string>Flag</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="1">
|
||||||
|
<widget class="QLineEdit" name="lineEdit_8"/>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="0">
|
||||||
|
<widget class="QLabel" name="label_17">
|
||||||
|
<property name="text">
|
||||||
|
<string>Cities</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="1">
|
||||||
|
<widget class="QComboBox" name="comboBox_5"/>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_summary_right">
|
||||||
|
<property name="sizeConstraint">
|
||||||
|
<enum>QLayout::SetFixedSize</enum>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="groupBox_4">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>1</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="title">
|
||||||
|
<string>Species</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QFormLayout" name="formLayout_3">
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="QLineEdit" name="lineEdit_6"/>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QLabel" name="label_7">
|
||||||
|
<property name="text">
|
||||||
|
<string>Name</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="QLineEdit" name="lineEdit_7"/>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QLabel" name="label_8">
|
||||||
|
<property name="text">
|
||||||
|
<string>Plural</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="1">
|
||||||
|
<widget class="QLineEdit" name="lineEdit_5"/>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0">
|
||||||
|
<widget class="QLabel" name="label_9">
|
||||||
|
<property name="text">
|
||||||
|
<string>Adjective</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="0">
|
||||||
|
<widget class="QLabel" name="label_10">
|
||||||
|
<property name="text">
|
||||||
|
<string>Traits</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="1">
|
||||||
|
<widget class="QListView" name="listView"/>
|
||||||
|
</item>
|
||||||
|
<item row="5" column="0">
|
||||||
|
<widget class="QLabel" name="label_24">
|
||||||
|
<property name="text">
|
||||||
|
<string>Fallen Empire</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="6" column="0">
|
||||||
|
<widget class="QLabel" name="label_25">
|
||||||
|
<property name="text">
|
||||||
|
<string>Spawn</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="6" column="1">
|
||||||
|
<widget class="QComboBox" name="comboBox_6"/>
|
||||||
|
</item>
|
||||||
|
<item row="5" column="1">
|
||||||
|
<widget class="QCheckBox" name="checkBox_14">
|
||||||
|
<property name="text">
|
||||||
|
<string>Spawn as fallen Empire</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="groupBox_2">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>1</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="title">
|
||||||
|
<string>Leader</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QFormLayout" name="formLayout">
|
||||||
|
<item row="2" column="0">
|
||||||
|
<widget class="QLabel" name="label">
|
||||||
|
<property name="text">
|
||||||
|
<string>Name</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="1">
|
||||||
|
<widget class="QLineEdit" name="lineEdit"/>
|
||||||
|
</item>
|
||||||
|
<item row="8" column="0">
|
||||||
|
<widget class="QLabel" name="label_2">
|
||||||
|
<property name="text">
|
||||||
|
<string>Portrait</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="8" column="1">
|
||||||
|
<widget class="QComboBox" name="comboBox"/>
|
||||||
|
</item>
|
||||||
|
<item row="9" column="1">
|
||||||
|
<widget class="QWidget" name="widget" native="true">
|
||||||
|
<layout class="QGridLayout" name="gridLayout">
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QRadioButton" name="radioButton">
|
||||||
|
<property name="text">
|
||||||
|
<string>Male</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="QRadioButton" name="radioButton_2">
|
||||||
|
<property name="text">
|
||||||
|
<string>Female</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QLabel" name="label_3">
|
||||||
|
<property name="text">
|
||||||
|
<string>Texture</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="QSpinBox" name="spinBox"/>
|
||||||
|
</item>
|
||||||
|
<item row="6" column="0">
|
||||||
|
<widget class="QLabel" name="label_22">
|
||||||
|
<property name="text">
|
||||||
|
<string>Clothes</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0">
|
||||||
|
<widget class="QLabel" name="label_21">
|
||||||
|
<property name="text">
|
||||||
|
<string>Hair</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="1">
|
||||||
|
<widget class="QSpinBox" name="spinBox_2"/>
|
||||||
|
</item>
|
||||||
|
<item row="6" column="1">
|
||||||
|
<widget class="QSpinBox" name="spinBox_3"/>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="5" column="1">
|
||||||
|
<widget class="QLineEdit" name="lineEdit_2"/>
|
||||||
|
</item>
|
||||||
|
<item row="5" column="0">
|
||||||
|
<widget class="QLabel" name="label_4">
|
||||||
|
<property name="text">
|
||||||
|
<string>Title</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="10" column="1">
|
||||||
|
<widget class="QLineEdit" name="lineEdit_3"/>
|
||||||
|
</item>
|
||||||
|
<item row="10" column="0">
|
||||||
|
<widget class="QLabel" name="label_5">
|
||||||
|
<property name="text">
|
||||||
|
<string>Heir</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="11" column="0">
|
||||||
|
<widget class="QLabel" name="label_23">
|
||||||
|
<property name="text">
|
||||||
|
<string>Room</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="11" column="1">
|
||||||
|
<widget class="QLineEdit" name="lineEdit_9"/>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<widget class="QWidget" name="page_source">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>874</width>
|
||||||
|
<height>496</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<attribute name="label">
|
||||||
|
<string>Source</string>
|
||||||
|
</attribute>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_3">
|
||||||
|
<item>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_source">
|
||||||
|
<item>
|
||||||
|
<widget class="QTextEdit" name="sourceTextEdit"/>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="btnCopySource">
|
||||||
|
<property name="text">
|
||||||
|
<string>Copy to Clipboard</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<widget class="QWidget" name="page_sourcetree">
|
||||||
|
<attribute name="label">
|
||||||
|
<string>TreeEdit</string>
|
||||||
|
</attribute>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||||
|
<item>
|
||||||
|
<widget class="QTreeView" name="treeViewEdit">
|
||||||
|
<property name="iconSize">
|
||||||
|
<size>
|
||||||
|
<width>16</width>
|
||||||
|
<height>16</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<resources/>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
54
src/playground/catch_pyxel.py
Normal file
54
src/playground/catch_pyxel.py
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
import sys
|
||||||
|
from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow, QLabel
|
||||||
|
from PyQt5.QtGui import QPainter, QColor, QPen
|
||||||
|
from PyQt5.QtGui import QIcon
|
||||||
|
from PyQt5.QtCore import Qt
|
||||||
|
import random
|
||||||
|
|
||||||
|
class App(QMainWindow):
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
super().__init__()
|
||||||
|
self.title = 'Catch Pyxel'
|
||||||
|
self.left = 100
|
||||||
|
self.top = 100
|
||||||
|
self.width = 800
|
||||||
|
self.height = 600
|
||||||
|
self.initUI()
|
||||||
|
|
||||||
|
def initUI(self):
|
||||||
|
self.setWindowTitle(self.title)
|
||||||
|
self.setGeometry(self.left, self.top, self.width, self.height)
|
||||||
|
|
||||||
|
# Set window background color
|
||||||
|
self.setAutoFillBackground(True)
|
||||||
|
p = self.palette()
|
||||||
|
p.setColor(self.backgroundRole(), Qt.white)
|
||||||
|
self.setPalette(p)
|
||||||
|
|
||||||
|
# Add paint widget and paint
|
||||||
|
self.m = PaintWidget(self)
|
||||||
|
self.m.move(0,0)
|
||||||
|
self.m.resize(self.width,self.height)
|
||||||
|
|
||||||
|
self.show()
|
||||||
|
|
||||||
|
|
||||||
|
class PaintWidget(QWidget):
|
||||||
|
def paintEvent(self, event):
|
||||||
|
qp = QPainter(self)
|
||||||
|
qp.drawImage()
|
||||||
|
#qp.setPen(Qt.black)
|
||||||
|
#size = self.size()
|
||||||
|
#
|
||||||
|
# for i in range(1024):
|
||||||
|
# x = random.randint(1, size.width()-1)
|
||||||
|
# y = random.randint(1, size.height()-1)
|
||||||
|
# qp.drawPoint(x, y)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
app = QApplication(sys.argv)
|
||||||
|
ex = App()
|
||||||
|
sys.exit(app.exec_())
|
||||||
|
|
105
src/playground/example_opengl.py
Normal file
105
src/playground/example_opengl.py
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
from OpenGL import GL
|
||||||
|
from PyQt5 import QtWidgets, QtCore, QtGui, QtOpenGL
|
||||||
|
from OpenGL.GL.ARB.texture_rg import GL_R32F
|
||||||
|
import numpy as np
|
||||||
|
import ctypes
|
||||||
|
import time
|
||||||
|
|
||||||
|
w, h = 400, 400
|
||||||
|
|
||||||
|
class TestWidget(QtOpenGL.QGLWidget):
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
QtOpenGL.QGLWidget.__init__(self)
|
||||||
|
self.resize(w, h)
|
||||||
|
|
||||||
|
self.t = time.time()
|
||||||
|
self._update_timer = QtCore.QTimer()
|
||||||
|
self._update_timer.timeout.connect(self.update)
|
||||||
|
self._update_timer.start(1e3 / 60.)
|
||||||
|
|
||||||
|
def initializeGL(self):
|
||||||
|
# create an image
|
||||||
|
Y, X = np.ogrid[-2.5:2.5:h*1j, -2.5:2.5:w*1j]
|
||||||
|
image = np.empty((h, w), dtype=np.float32)
|
||||||
|
image[:] = np.exp(- X**2 - Y**2)# * (1. + .5*(np.random.rand(h, w)-.5))
|
||||||
|
image[-30:] = np.linspace(0, 1, w)
|
||||||
|
|
||||||
|
# create pixel buffer object for transferring textures
|
||||||
|
self._buffer_id = GL.glGenBuffers(1)
|
||||||
|
GL.glBindBuffer(GL.GL_PIXEL_UNPACK_BUFFER, self._buffer_id)
|
||||||
|
GL.glBufferData(GL.GL_PIXEL_UNPACK_BUFFER, w*h*4, None, GL.GL_STREAM_DRAW)
|
||||||
|
GL.glBindBuffer(GL.GL_PIXEL_UNPACK_BUFFER, 0)
|
||||||
|
|
||||||
|
# map and modify pixel buffer
|
||||||
|
GL.glBindBuffer(GL.GL_PIXEL_UNPACK_BUFFER, self._buffer_id)
|
||||||
|
pbo_addr = GL.glMapBuffer(GL.GL_PIXEL_UNPACK_BUFFER, GL.GL_WRITE_ONLY)
|
||||||
|
# write to PBO using ctypes memmove
|
||||||
|
ctypes.memmove(pbo_addr, image.ctypes.data, (w*h * image.itemsize))
|
||||||
|
# write to PBO using numpy interface
|
||||||
|
pbo_ptr = ctypes.cast(pbo_addr, ctypes.POINTER(ctypes.c_float))
|
||||||
|
pbo_np = np.ctypeslib.as_array(pbo_ptr, shape=(h, w))
|
||||||
|
pbo_np[:] = image
|
||||||
|
GL.glUnmapBuffer(GL.GL_PIXEL_UNPACK_BUFFER)
|
||||||
|
GL.glBindBuffer(GL.GL_PIXEL_UNPACK_BUFFER, 0)
|
||||||
|
|
||||||
|
# create texture from pixel buffer object
|
||||||
|
self._texture_id = GL.glGenTextures(1)
|
||||||
|
GL.glBindBuffer(GL.GL_PIXEL_UNPACK_BUFFER, self._buffer_id)
|
||||||
|
GL.glBindTexture(GL.GL_TEXTURE_2D, self._texture_id)
|
||||||
|
GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR)
|
||||||
|
GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR)
|
||||||
|
GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL_R32F, w, h, 0, GL.GL_RED, GL.GL_FLOAT, None)
|
||||||
|
GL.glBindBuffer(GL.GL_PIXEL_UNPACK_BUFFER, 0)
|
||||||
|
|
||||||
|
# create a shader for coloring the texture
|
||||||
|
shader_program = QtGui.QOpenGLShaderProgram()
|
||||||
|
vertex_src = """
|
||||||
|
void main() {
|
||||||
|
gl_TexCoord[0] = gl_MultiTexCoord0;
|
||||||
|
gl_Position = gl_Vertex;
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
fragment_src = """
|
||||||
|
uniform highp sampler2D tex;
|
||||||
|
uniform float amp;
|
||||||
|
uniform float r;
|
||||||
|
|
||||||
|
float rand(vec2 co){
|
||||||
|
return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453 * (1.+r));
|
||||||
|
}
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
float val = texture2D(tex, gl_TexCoord[0]).r;
|
||||||
|
val *= .7 + .3*rand(gl_TexCoord[0].xx) + .8*rand(gl_TexCoord[0].xy);
|
||||||
|
vec4 color1 = vec4(0., 0., 0., 1.);
|
||||||
|
vec4 color2 = vec4(3., .5, .2, 1.);
|
||||||
|
gl_FragColor = mix(color1, color2, 3.5 * val * amp);
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
shader_program.addShaderFromSourceCode(QtGui.QOpenGLShader.Vertex, vertex_src)
|
||||||
|
shader_program.addShaderFromSourceCode(QtGui.QOpenGLShader.Fragment, fragment_src)
|
||||||
|
shader_program.link()
|
||||||
|
self._shader_program = shader_program
|
||||||
|
self._amp_location = shader_program.uniformLocation("amp")
|
||||||
|
self._r_location = shader_program.uniformLocation("r")
|
||||||
|
|
||||||
|
def paintGL(self):
|
||||||
|
t = time.time()
|
||||||
|
amp = .6 + .6*np.cos(t*np.pi)**10
|
||||||
|
r = np.random.rand(1)[0]
|
||||||
|
|
||||||
|
target = QtCore.QRectF(-1, -1, 2, 2)
|
||||||
|
self._shader_program.bind()
|
||||||
|
self._shader_program.setUniformValue(self._amp_location, amp)
|
||||||
|
self._shader_program.setUniformValue(self._r_location, r)
|
||||||
|
self.drawTexture(target, self._texture_id)
|
||||||
|
|
||||||
|
def resizeGL(self, w, h):
|
||||||
|
GL.glViewport(0, 0, w, h)
|
||||||
|
|
||||||
|
|
||||||
|
app = QtWidgets.QApplication([])
|
||||||
|
win = TestWidget()
|
||||||
|
win.show()
|
||||||
|
app.exec_()
|
Loading…
Reference in New Issue
Block a user