mirror of
https://github.com/dcs-liberation/dcs_liberation.git
synced 2025-11-10 14:22:26 +00:00
Stats view now has a tab for vehicles forces. Display waypoint coordinates in waypoint tab.
This commit is contained in:
parent
7fbc75b375
commit
48a40f2511
@ -76,7 +76,7 @@ class FrontlineAttackEvent(Event):
|
|||||||
self.to_cp.base.affect_strength(-0.1)
|
self.to_cp.base.affect_strength(-0.1)
|
||||||
|
|
||||||
def player_attacking(self, flights: db.TaskForceDict):
|
def player_attacking(self, flights: db.TaskForceDict):
|
||||||
assert CAS in flights and CAP in flights and len(flights) == 2, "Invalid flights"
|
# assert CAS in flights and CAP in flights and len(flights) == 2, "Invalid flights"
|
||||||
|
|
||||||
op = FrontlineAttackOperation(game=self.game,
|
op = FrontlineAttackOperation(game=self.game,
|
||||||
attacker_name=self.attacker_name,
|
attacker_name=self.attacker_name,
|
||||||
@ -97,7 +97,7 @@ class FrontlineAttackEvent(Event):
|
|||||||
self.operation = op
|
self.operation = op
|
||||||
|
|
||||||
def player_defending(self, flights: db.TaskForceDict):
|
def player_defending(self, flights: db.TaskForceDict):
|
||||||
assert CAP in flights and len(flights) == 1, "Invalid flights"
|
# assert CAP in flights and len(flights) == 1, "Invalid flights"
|
||||||
|
|
||||||
op = FrontlineAttackOperation(game=self.game,
|
op = FrontlineAttackOperation(game=self.game,
|
||||||
attacker_name=self.attacker_name,
|
attacker_name=self.attacker_name,
|
||||||
|
|||||||
@ -307,8 +307,6 @@ class Game:
|
|||||||
self.events = [] # type: typing.List[Event]
|
self.events = [] # type: typing.List[Event]
|
||||||
self._generate_events()
|
self._generate_events()
|
||||||
|
|
||||||
#self._generate_globalinterceptions()
|
|
||||||
|
|
||||||
# Update statistics
|
# Update statistics
|
||||||
self.game_stats.update(self)
|
self.game_stats.update(self)
|
||||||
|
|
||||||
|
|||||||
@ -47,11 +47,11 @@ class FrontlineAttackOperation(Operation):
|
|||||||
conflict=conflict)
|
conflict=conflict)
|
||||||
|
|
||||||
def generate(self):
|
def generate(self):
|
||||||
if self.is_player_attack:
|
#if self.is_player_attack:
|
||||||
self.prepare_carriers(db.unitdict_from(self.strikegroup))
|
# self.prepare_carriers(db.unitdict_from(self.strikegroup))
|
||||||
|
|
||||||
# ground units
|
# ground units
|
||||||
self.armorgen.generate_vec(self.attackers, self.defenders)
|
# self.armorgen.generate_vec(self.attackers, self.defenders)
|
||||||
|
|
||||||
## strike group w/ heli support
|
## strike group w/ heli support
|
||||||
#planes_flights = {k: v for k, v in self.strikegroup.items() if k in plane_map.values()}
|
#planes_flights = {k: v for k, v in self.strikegroup.items() if k in plane_map.values()}
|
||||||
|
|||||||
@ -149,16 +149,13 @@ class Operation:
|
|||||||
self.airgen.generate_flights(cp, country, self.game.planners[cp.id])
|
self.airgen.generate_flights(cp, country, self.game.planners[cp.id])
|
||||||
|
|
||||||
# Generate ground units on frontline everywhere
|
# Generate ground units on frontline everywhere
|
||||||
for cp in self.game.theater.controlpoints:
|
for player_cp, enemy_cp in self.game.theater.conflicts(True):
|
||||||
if cp.captured:
|
conflict = Conflict.frontline_cas_conflict(self.attacker_name, self.defender_name,
|
||||||
for cp_enn in cp.connected_points:
|
self.current_mission.country(self.attacker_country),
|
||||||
if not cp_enn.captured:
|
self.current_mission.country(self.defender_country),
|
||||||
conflict = Conflict.frontline_cas_conflict(self.attacker_name, self.defender_name,
|
player_cp, enemy_cp, self.game.theater)
|
||||||
self.current_mission.country(self.attacker_country),
|
armorgen = ArmorConflictGenerator(self.current_mission, conflict)
|
||||||
self.current_mission.country(self.defender_country),
|
armorgen.generate_vec(player_cp.base.armor, enemy_cp.base.armor)
|
||||||
cp, cp_enn, self.game.theater)
|
|
||||||
armorgen = ArmorConflictGenerator(self.current_mission, conflict)
|
|
||||||
armorgen.generate_vec(cp.base.armor, cp_enn.base.armor)
|
|
||||||
|
|
||||||
#Setup combined arms parameters
|
#Setup combined arms parameters
|
||||||
self.current_mission.groundControl.pilot_can_control_vehicles = self.ca_slots > 0
|
self.current_mission.groundControl.pilot_can_control_vehicles = self.ca_slots > 0
|
||||||
|
|||||||
@ -328,7 +328,7 @@ class AircraftConflictGenerator:
|
|||||||
|
|
||||||
def setup_group_as_cas_flight(self, group, flight):
|
def setup_group_as_cas_flight(self, group, flight):
|
||||||
group.task = CAS.name
|
group.task = CAS.name
|
||||||
self._setup_group(group, CAS, 0)
|
self._setup_group(group, CAS, flight.client_count)
|
||||||
|
|
||||||
group.points[0].tasks.clear()
|
group.points[0].tasks.clear()
|
||||||
group.points[0].tasks.append(CASTaskAction())
|
group.points[0].tasks.append(CASTaskAction())
|
||||||
|
|||||||
@ -64,6 +64,10 @@ class ArmorConflictGenerator:
|
|||||||
wayp.tasks = []
|
wayp.tasks = []
|
||||||
|
|
||||||
def _generate_fight_at(self, attackers: db.ArmorDict, defenders: db.ArmorDict, position: Point):
|
def _generate_fight_at(self, attackers: db.ArmorDict, defenders: db.ArmorDict, position: Point):
|
||||||
|
|
||||||
|
print(attackers)
|
||||||
|
print(defenders)
|
||||||
|
|
||||||
if attackers:
|
if attackers:
|
||||||
attack_pos = position.point_from_heading(self.conflict.heading - 90, FIGHT_DISTANCE)
|
attack_pos = position.point_from_heading(self.conflict.heading - 90, FIGHT_DISTANCE)
|
||||||
attack_dest = position.point_from_heading(self.conflict.heading + 90, FIGHT_DISTANCE * 2)
|
attack_dest = position.point_from_heading(self.conflict.heading + 90, FIGHT_DISTANCE * 2)
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
from PySide2.QtWidgets import QFrame, QHBoxLayout, QPushButton, QVBoxLayout, QMessageBox, QGridLayout
|
from PySide2.QtWidgets import QFrame, QHBoxLayout, QPushButton, QVBoxLayout
|
||||||
|
|
||||||
from game import Game
|
from game import Game
|
||||||
from qt_ui.widgets.QBudgetBox import QBudgetBox
|
from qt_ui.widgets.QBudgetBox import QBudgetBox
|
||||||
from qt_ui.widgets.QStatsWindow import QStatsWindow
|
from qt_ui.windows.stats.QStatsWindow import QStatsWindow
|
||||||
from qt_ui.widgets.QTurnCounter import QTurnCounter
|
from qt_ui.widgets.QTurnCounter import QTurnCounter
|
||||||
|
|
||||||
import qt_ui.uiconstants as CONST
|
import qt_ui.uiconstants as CONST
|
||||||
|
|||||||
@ -66,7 +66,7 @@ class QLiberationMap(QGraphicsView):
|
|||||||
scene.clear()
|
scene.clear()
|
||||||
|
|
||||||
self.addBackground()
|
self.addBackground()
|
||||||
self.add_game_events()
|
#self.add_game_events()
|
||||||
|
|
||||||
for cp in self.game.theater.controlpoints:
|
for cp in self.game.theater.controlpoints:
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,9 @@
|
|||||||
from PySide2.QtCore import Qt, Slot, QItemSelectionModel, QPoint
|
from PySide2.QtCore import Qt, Slot, QItemSelectionModel, QPoint
|
||||||
from PySide2.QtWidgets import QDialog, QGridLayout, QScrollArea, QVBoxLayout
|
from PySide2.QtWidgets import QDialog, QGridLayout, QScrollArea, QVBoxLayout, QPushButton
|
||||||
from game import Game
|
from game import Game
|
||||||
|
from game.event import StrikeEvent, InsurgentAttackEvent, FrontlineAttackEvent, CAP, CAS
|
||||||
|
from qt_ui.uiconstants import EVENT_ICONS
|
||||||
|
from qt_ui.windows.QWaitingForMissionResultWindow import QWaitingForMissionResultWindow
|
||||||
from qt_ui.windows.mission.QPlannedFlightsView import QPlannedFlightsView
|
from qt_ui.windows.mission.QPlannedFlightsView import QPlannedFlightsView
|
||||||
from qt_ui.windows.mission.QChooseAirbase import QChooseAirbase
|
from qt_ui.windows.mission.QChooseAirbase import QChooseAirbase
|
||||||
from qt_ui.windows.mission.flight.QFlightPlanner import QFlightPlanner
|
from qt_ui.windows.mission.flight.QFlightPlanner import QFlightPlanner
|
||||||
@ -15,6 +18,7 @@ class QMissionPlanning(QDialog):
|
|||||||
self.setMinimumSize(750, 350)
|
self.setMinimumSize(750, 350)
|
||||||
self.setModal(True)
|
self.setModal(True)
|
||||||
self.setWindowTitle("Mission Preparation")
|
self.setWindowTitle("Mission Preparation")
|
||||||
|
self.setWindowIcon(EVENT_ICONS[StrikeEvent])
|
||||||
self.init_ui()
|
self.init_ui()
|
||||||
print("DONE")
|
print("DONE")
|
||||||
|
|
||||||
@ -37,12 +41,16 @@ class QMissionPlanning(QDialog):
|
|||||||
|
|
||||||
self.flight_planner = QFlightPlanner(self.planned_flight_view.flight_planner.flights[0], self.game)
|
self.flight_planner = QFlightPlanner(self.planned_flight_view.flight_planner.flights[0], self.game)
|
||||||
|
|
||||||
|
self.mission_start_button = QPushButton("Take Off")
|
||||||
|
self.mission_start_button.setProperty("style", "start-button")
|
||||||
|
self.mission_start_button.clicked.connect(self.on_start)
|
||||||
|
|
||||||
self.left_bar_layout.addWidget(self.select_airbase)
|
self.left_bar_layout.addWidget(self.select_airbase)
|
||||||
self.left_bar_layout.addWidget(self.planned_flight_view)
|
self.left_bar_layout.addWidget(self.planned_flight_view)
|
||||||
|
|
||||||
self.layout.addLayout(self.left_bar_layout, 0, 0)
|
self.layout.addLayout(self.left_bar_layout, 0, 0)
|
||||||
self.layout.addWidget(self.flight_planner, 0, 1)
|
self.layout.addWidget(self.flight_planner, 0, 1)
|
||||||
|
self.layout.addWidget(self.mission_start_button, 1, 1, alignment=Qt.AlignRight)
|
||||||
|
|
||||||
self.setLayout(self.layout)
|
self.setLayout(self.layout)
|
||||||
|
|
||||||
@ -61,3 +69,31 @@ class QMissionPlanning(QDialog):
|
|||||||
|
|
||||||
self.flight_planner = QFlightPlanner(flight, self.game)
|
self.flight_planner = QFlightPlanner(flight, self.game)
|
||||||
self.layout.addWidget(self.flight_planner,0 ,1)
|
self.layout.addWidget(self.flight_planner,0 ,1)
|
||||||
|
|
||||||
|
def on_start(self):
|
||||||
|
|
||||||
|
for event in self.game.events:
|
||||||
|
if isinstance(event, FrontlineAttackEvent) and event.is_player_attacking:
|
||||||
|
self.gameEvent = event
|
||||||
|
|
||||||
|
#if self.awacs_checkbox.isChecked() == 1:
|
||||||
|
# self.gameEvent.is_awacs_enabled = True
|
||||||
|
# self.game.awacs_expense_commit()
|
||||||
|
#else:
|
||||||
|
# self.gameEvent.is_awacs_enabled = False
|
||||||
|
self.gameEvent.is_awacs_enabled = False
|
||||||
|
self.gameEvent.ca_slots = 1
|
||||||
|
self.gameEvent.departure_cp = self.game.theater.controlpoints[0]
|
||||||
|
|
||||||
|
if self.game.is_player_attack(self.gameEvent):
|
||||||
|
self.gameEvent.player_attacking({CAS:{}, CAP:{}})
|
||||||
|
else:
|
||||||
|
self.gameEvent.player_defending({CAS: {}, CAP: {}})
|
||||||
|
self.gameEvent.depart_from = self.game.theater.controlpoints[0]
|
||||||
|
|
||||||
|
self.game.initiate_event(self.gameEvent)
|
||||||
|
waiting = QWaitingForMissionResultWindow(self.gameEvent, self.game)
|
||||||
|
waiting.show()
|
||||||
|
self.close()
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -0,0 +1,12 @@
|
|||||||
|
from typing import List
|
||||||
|
|
||||||
|
from PySide2.QtGui import QStandardItem
|
||||||
|
|
||||||
|
|
||||||
|
class QWaypointItem(QStandardItem):
|
||||||
|
|
||||||
|
def __init__(self, point: List[int]):
|
||||||
|
super(QWaypointItem, self).__init__()
|
||||||
|
|
||||||
|
self.setText("X: " + str(int(point[0])) + "; Y: " + str(int(point[1])) + "; Alt: " + str(int(point[2])) + "m")
|
||||||
|
|
||||||
@ -0,0 +1,18 @@
|
|||||||
|
from PySide2.QtGui import QStandardItemModel
|
||||||
|
from PySide2.QtWidgets import QListView
|
||||||
|
|
||||||
|
from gen.flights.flight import Flight
|
||||||
|
from qt_ui.windows.mission.flight.waypoints.QFlightWaypointItem import QWaypointItem
|
||||||
|
|
||||||
|
|
||||||
|
class QFlightWaypointList(QListView):
|
||||||
|
|
||||||
|
def __init__(self, flight: Flight):
|
||||||
|
super(QFlightWaypointList, self).__init__()
|
||||||
|
self.model = QStandardItemModel(self)
|
||||||
|
self.setModel(self.model)
|
||||||
|
self.flight = flight
|
||||||
|
|
||||||
|
self.model.appendRow(QWaypointItem([flight.from_cp.position.x, flight.from_cp.position.y, 0]))
|
||||||
|
for i, point in enumerate(self.flight.points):
|
||||||
|
self.model.appendRow(QWaypointItem(point))
|
||||||
@ -1,6 +1,7 @@
|
|||||||
from PySide2.QtWidgets import QFrame, QGridLayout, QLabel
|
from PySide2.QtWidgets import QFrame, QGridLayout, QLabel
|
||||||
|
|
||||||
from gen.flights.flight import Flight
|
from gen.flights.flight import Flight
|
||||||
|
from qt_ui.windows.mission.flight.waypoints.QFlightWaypointList import QFlightWaypointList
|
||||||
|
|
||||||
|
|
||||||
class QFlightWaypointTab(QFrame):
|
class QFlightWaypointTab(QFrame):
|
||||||
@ -12,5 +13,6 @@ class QFlightWaypointTab(QFrame):
|
|||||||
|
|
||||||
def init_ui(self):
|
def init_ui(self):
|
||||||
layout = QGridLayout()
|
layout = QGridLayout()
|
||||||
layout.addWidget(QLabel("Coming in two weeks"))
|
self.flight_waypoint_list = QFlightWaypointList(self.flight)
|
||||||
|
layout.addWidget(self.flight_waypoint_list)
|
||||||
self.setLayout(layout)
|
self.setLayout(layout)
|
||||||
|
|||||||
@ -1,25 +1,15 @@
|
|||||||
from PySide2 import QtCharts
|
from PySide2.QtCharts import QtCharts
|
||||||
from PySide2.QtCore import QPoint, Qt
|
from PySide2.QtCore import QPoint, Qt
|
||||||
from PySide2.QtGui import QPainter
|
from PySide2.QtGui import QPainter
|
||||||
from PySide2.QtWidgets import QDialog, QGridLayout
|
from PySide2.QtWidgets import QFrame, QGridLayout
|
||||||
from PySide2.QtCharts import QtCharts
|
from game import Game
|
||||||
|
|
||||||
import qt_ui.uiconstants as CONST
|
|
||||||
from game.game import Game
|
|
||||||
|
|
||||||
|
|
||||||
class QStatsWindow(QDialog):
|
class QAircraftChart(QFrame):
|
||||||
|
|
||||||
def __init__(self, game: Game):
|
def __init__(self, game: Game):
|
||||||
super(QStatsWindow, self).__init__()
|
super(QAircraftChart, self).__init__()
|
||||||
|
|
||||||
self.game = game
|
self.game = game
|
||||||
|
|
||||||
self.setModal(True)
|
|
||||||
self.setWindowTitle("Stats")
|
|
||||||
self.setWindowIcon(CONST.ICONS["Statistics"])
|
|
||||||
self.setMinimumSize(600, 250)
|
|
||||||
|
|
||||||
self.initUi()
|
self.initUi()
|
||||||
|
|
||||||
def initUi(self):
|
def initUi(self):
|
||||||
@ -34,13 +24,13 @@ class QStatsWindow(QDialog):
|
|||||||
|
|
||||||
self.alliedAircraftSerie = QtCharts.QLineSeries()
|
self.alliedAircraftSerie = QtCharts.QLineSeries()
|
||||||
self.alliedAircraftSerie.setName("Allied aircraft count")
|
self.alliedAircraftSerie.setName("Allied aircraft count")
|
||||||
for a,i in enumerate(self.alliedAircraft):
|
for a, i in enumerate(self.alliedAircraft):
|
||||||
self.alliedAircraftSerie.append(QPoint(a, i))
|
self.alliedAircraftSerie.append(QPoint(a, i))
|
||||||
|
|
||||||
self.enemyAircraftSerie = QtCharts.QLineSeries()
|
self.enemyAircraftSerie = QtCharts.QLineSeries()
|
||||||
self.enemyAircraftSerie.setColor(Qt.red)
|
self.enemyAircraftSerie.setColor(Qt.red)
|
||||||
self.enemyAircraftSerie.setName("Enemy aircraft count")
|
self.enemyAircraftSerie.setName("Enemy aircraft count")
|
||||||
for a,i in enumerate(self.enemyAircraft):
|
for a, i in enumerate(self.enemyAircraft):
|
||||||
self.enemyAircraftSerie.append(QPoint(a, i))
|
self.enemyAircraftSerie.append(QPoint(a, i))
|
||||||
|
|
||||||
self.chart = QtCharts.QChart()
|
self.chart = QtCharts.QChart()
|
||||||
@ -56,4 +46,3 @@ class QStatsWindow(QDialog):
|
|||||||
self.chartView.setRenderHint(QPainter.Antialiasing)
|
self.chartView.setRenderHint(QPainter.Antialiasing)
|
||||||
|
|
||||||
self.layout.addWidget(self.chartView, 0, 0)
|
self.layout.addWidget(self.chartView, 0, 0)
|
||||||
|
|
||||||
48
qt_ui/windows/stats/QArmorChart.py
Normal file
48
qt_ui/windows/stats/QArmorChart.py
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
from PySide2.QtCharts import QtCharts
|
||||||
|
from PySide2.QtCore import QPoint, Qt
|
||||||
|
from PySide2.QtGui import QPainter
|
||||||
|
from PySide2.QtWidgets import QFrame, QGridLayout
|
||||||
|
from game import Game
|
||||||
|
|
||||||
|
|
||||||
|
class QArmorChart(QFrame):
|
||||||
|
|
||||||
|
def __init__(self, game: Game):
|
||||||
|
super(QArmorChart, self).__init__()
|
||||||
|
self.game = game
|
||||||
|
self.initUi()
|
||||||
|
|
||||||
|
def initUi(self):
|
||||||
|
self.layout = QGridLayout()
|
||||||
|
self.generateUnitCharts()
|
||||||
|
self.setLayout(self.layout)
|
||||||
|
|
||||||
|
def generateUnitCharts(self):
|
||||||
|
|
||||||
|
self.alliedArmor = [d.allied_units.vehicles_count for d in self.game.game_stats.data_per_turn]
|
||||||
|
self.enemyArmor = [d.enemy_units.vehicles_count for d in self.game.game_stats.data_per_turn]
|
||||||
|
|
||||||
|
self.alliedArmorSerie = QtCharts.QLineSeries()
|
||||||
|
self.alliedArmorSerie.setName("Allied vehicle count")
|
||||||
|
for a, i in enumerate(self.alliedArmor):
|
||||||
|
self.alliedArmorSerie.append(QPoint(a, i))
|
||||||
|
|
||||||
|
self.enemyArmorSerie = QtCharts.QLineSeries()
|
||||||
|
self.enemyArmorSerie.setColor(Qt.red)
|
||||||
|
self.enemyArmorSerie.setName("Enemy vehicle count")
|
||||||
|
for a, i in enumerate(self.enemyArmor):
|
||||||
|
self.enemyArmorSerie.append(QPoint(a, i))
|
||||||
|
|
||||||
|
self.chart = QtCharts.QChart()
|
||||||
|
self.chart.addSeries(self.alliedArmorSerie)
|
||||||
|
self.chart.addSeries(self.enemyArmorSerie)
|
||||||
|
self.chart.setTitle("Combat vehicles over time")
|
||||||
|
|
||||||
|
self.chart.createDefaultAxes()
|
||||||
|
self.chart.axisX().setRange(0, len(self.alliedArmor))
|
||||||
|
self.chart.axisY().setRange(0, max(max(self.alliedArmor), max(self.enemyArmor)) + 10)
|
||||||
|
|
||||||
|
self.chartView = QtCharts.QChartView(self.chart)
|
||||||
|
self.chartView.setRenderHint(QPainter.Antialiasing)
|
||||||
|
|
||||||
|
self.layout.addWidget(self.chartView, 0, 0)
|
||||||
27
qt_ui/windows/stats/QStatsWindow.py
Normal file
27
qt_ui/windows/stats/QStatsWindow.py
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
from PySide2.QtWidgets import QDialog, QGridLayout, QTabWidget
|
||||||
|
|
||||||
|
import qt_ui.uiconstants as CONST
|
||||||
|
from game.game import Game
|
||||||
|
from qt_ui.windows.stats.QAircraftChart import QAircraftChart
|
||||||
|
from qt_ui.windows.stats.QArmorChart import QArmorChart
|
||||||
|
|
||||||
|
|
||||||
|
class QStatsWindow(QDialog):
|
||||||
|
|
||||||
|
def __init__(self, game: Game):
|
||||||
|
super(QStatsWindow, self).__init__()
|
||||||
|
|
||||||
|
self.game = game
|
||||||
|
self.setModal(True)
|
||||||
|
self.setWindowTitle("Stats")
|
||||||
|
self.setWindowIcon(CONST.ICONS["Statistics"])
|
||||||
|
self.setMinimumSize(600, 250)
|
||||||
|
|
||||||
|
self.layout = QGridLayout()
|
||||||
|
self.aircraft_charts = QAircraftChart(self.game)
|
||||||
|
self.armor_charts = QArmorChart(self.game)
|
||||||
|
self.tabview = QTabWidget()
|
||||||
|
self.tabview.addTab(self.aircraft_charts, "Aircraft")
|
||||||
|
self.tabview.addTab(self.armor_charts, "Armor")
|
||||||
|
self.layout.addWidget(self.tabview, 0, 0)
|
||||||
|
self.setLayout(self.layout)
|
||||||
@ -38,6 +38,21 @@ QPushButton[style="btn-success"]:hover{
|
|||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QPushButton[style="start-button"]{
|
||||||
|
background-color:#699245;
|
||||||
|
color: white;
|
||||||
|
cursor:pointer;
|
||||||
|
padding: 15px 15px 15px 15px;
|
||||||
|
border-radius:5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
QPushButton[style="start-button"]:hover{
|
||||||
|
background-color:#8ABC5A;
|
||||||
|
padding: 15px 15px 15px 15px;
|
||||||
|
border-radius:5px;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
QPushButton[style="btn-danger"]{
|
QPushButton[style="btn-danger"]{
|
||||||
background-color:#9E3232;
|
background-color:#9E3232;
|
||||||
color: white;
|
color: white;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user