Flesh out a lot of the small graphical specifics. Stilll needs a bit of work and a few bugs worked out, but I feel it's coming along.

This commit is contained in:
blitzmann
2018-06-08 22:34:15 -04:00
parent 542f2b3061
commit ab2d6dbf3a
2 changed files with 100 additions and 57 deletions

View File

@@ -1,16 +1,55 @@
import wx
import wx.lib.newevent
from gui.attribute_gauge import AttributeGauge
import eos
import eos.db
_ValueChanged, EVT_NOTEBOOK_PAGE_CHANGED = wx.lib.newevent.NewEvent()
class AttributeSliderChangeEvent:
def __init__(self, old_value, new_value, old_percentage, new_percentage):
self.__old = old_value
self.__new = new_value
self.__old_percent = old_percentage
self.__new_percent = new_percentage
def GetOldValue(self):
return self.__old
def GetValue(self):
return self.__new
def GetOldPercentage(self):
return self.__old_percent
def GetPercentage(self):
return self.__new_percent
OldValue = property(GetOldValue)
Value = property(GetValue)
OldPercentage = property(GetOldPercentage)
Percentage = property(GetPercentage)
class ValueChanged(_ValueChanged, AttributeSliderChangeEvent):
def __init__(self, old_value, new_value, old_percentage, new_percentage):
_ValueChanged.__init__(self)
AttributeSliderChangeEvent.__init__(self, old_value, new_value, old_percentage, new_percentage)
class AttributeSlider(wx.Panel):
# Slider which abstracts users values from internal values (because the built in slider does not deal with floats
# and the like), based on http://wxpython-users.wxwidgets.narkive.com/ekgBzA7u/anyone-ever-thought-of-a-floating-point-slider
def __init__(self, parent, baseValue, minMod, maxMod):
def __init__(self, parent, baseValue, minMod, maxMod, inverse=False):
wx.Panel.__init__(self, parent)
self.parent = parent
self.inverse = inverse
self.base_value = baseValue
self.UserMinValue = minMod
@@ -28,30 +67,17 @@ class AttributeSlider(wx.Panel):
self.SliderMaxValue = 100
self.SliderValue = 0
self.statxt1 = wx.StaticText(self, wx.ID_ANY, 'left', style=wx.ST_NO_AUTORESIZE | wx.ALIGN_LEFT)
self.ctrl = wx.SpinCtrlDouble(self, min=(1-self.UserMinValue)*-100, max=(1-self.UserMaxValue)*-100)
self.ctrl = wx.SpinCtrlDouble(self, min=(self.UserMinValue * self.base_value), max=(self.UserMaxValue * self.base_value))
self.ctrl.SetDigits(3)
self.statxt3 = wx.StaticText(self, wx.ID_ANY, 'right', style=wx.ST_NO_AUTORESIZE | wx.ALIGN_RIGHT)
self.ctrl.Bind(wx.EVT_SPINCTRLDOUBLE, self.UpdateValue)
self.statxt1.SetLabel("{0:.3f}".format(self.UserMinValue * self.base_value))
self.statxt1.SetToolTip("{0:+f}%".format((1-self.UserMinValue)*-100))
self.statxt3.SetLabel("{0:.3f}".format(self.UserMaxValue * self.base_value))
self.statxt3.SetToolTip("{0:+f}%".format((1-self.UserMaxValue)*-100))
self.slider = AttributeGauge(self, size=(-1,8))
b = 20
hsizer1 = wx.BoxSizer(wx.HORIZONTAL)
hsizer1.Add(self.statxt1, 1, wx.RIGHT, b)
hsizer1.Add(self.ctrl, 1, wx.LEFT | wx.RIGHT, b)
hsizer1.Add(self.statxt3, 1, wx.LEFT, b)
b = 4
vsizer1 = wx.BoxSizer(wx.VERTICAL)
vsizer1.Add(hsizer1, 0, wx.EXPAND | wx.ALL, b)
vsizer1.Add(self.slider, 0, wx.EXPAND | wx.LEFT | wx.TOP | wx.BOTTOM, b)
vsizer1.Add(self.ctrl, 0, wx.LEFT | wx.RIGHT | wx.CENTER, b)
vsizer1.Add(self.slider, 0, wx.EXPAND | wx.ALL , b)
self.SetSizerAndFit(vsizer1)
self.parent.SetClientSize((500, vsizer1.GetSize()[1]))
@@ -60,50 +86,22 @@ class AttributeSlider(wx.Panel):
self.SetValue(self.ctrl.GetValue())
evt.Skip()
def OnScroll(self, event):
self.CalculateUserValue()
def SetValue(self, value):
# todo: check this against values that might be 2.5x and whatnot
mod = value / self.base_value
self.ctrl.SetValue(value)
slider_percentage = 0
if mod < 1:
modEnd = -1 * self.UserMinValue
slider_percentage = (modEnd / mod) * 100
modEnd = self.UserMinValue
slider_percentage = (1-mod)/(1 - modEnd) * -100
elif mod > 1:
modEnd = self.UserMaxValue
slider_percentage = ((mod-1)/(modEnd-1)) * 100
print(slider_percentage)
if self.inverse:
slider_percentage *= -1
self.slider.SetValue(slider_percentage)
self.CalculateUserValue()
def CalculateUserValue(self):
self.SliderValue = self.slider.GetValue()
mod = 1
# The slider value tells us when mod we're going to use, depending on its sign
if self.SliderValue < 0:
mod = self.UserMinValue
elif self.SliderValue > 0:
mod = self.UserMaxValue
# Get the slider value percentage as an absolute value
slider_mod = abs(self.SliderValue/1_000) / 100
# Gets our new mod by use the slider's percentage to determine where in the spectrum it is
new_mod = mod + ((1 - mod) - ((1 - mod) * slider_mod))
# Modifies our base value, to get out modified value
newValue = new_mod * self.base_value
# if mod == 1:
# self.statxt2.SetLabel("{0:.3f}".format(newValue))
# else:
# self.statxt2.SetLabel("{0:.3f} ({1:+.3f})".format(newValue, newValue - self.base_value, ))
# self.statxt2.SetToolTip("{0:+f}%".format(new_mod*100))
wx.PostEvent(self, ValueChanged(None, value, None, slider_percentage))
class TestAttributeSlider(wx.Frame):
@@ -114,13 +112,17 @@ class TestAttributeSlider(wx.Frame):
sty = wx.DEFAULT_FRAME_STYLE
wx.Frame.__init__(self, parent, id, title, pos, size, sty)
self.panel = AttributeSlider(self, 10, .80, 1.5)
self.panel.SetValue(9.0)
self.panel = AttributeSlider(self, 10, 1.2, 1.8, False)
self.panel.Bind(EVT_NOTEBOOK_PAGE_CHANGED, self.thing)
self.panel.SetValue(10)
self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)
def OnCloseWindow(self, event):
self.Destroy()
def thing(self, evt):
print("thing")
if __name__ == "__main__":
app = wx.App()

View File

@@ -19,7 +19,6 @@ from gui.bitmap_loader import BitmapLoader
class ItemMutator(wx.Panel):
ORDER = [Fit, Ship, Citadel, Mode, Module, Drone, Fighter, Implant, Booster, Skill]
def __init__(self, parent, stuff, item):
wx.Panel.__init__(self, parent)
@@ -29,15 +28,57 @@ class ItemMutator(wx.Panel):
self.activeFit = gui.mainFrame.MainFrame.getInstance().getActiveFit()
mainSizer = wx.BoxSizer(wx.VERTICAL)
self.goodColor = wx.Colour(96, 191, 0)
self.badColor = wx.Colour(255, 64, 0)
for x in stuff.mutaplasmid.attributes:
# convert to percentages
# JFC this is ugly as sin
min = round(x.min, 2)
max = round(x.max, 2)
value = stuff.itemModifiedAttributes.getOriginal(x.name)
slider = AttributeSlider(self, value, min, max)
mainSizer.Add(wx.StaticText(self, wx.ID_ANY, x.displayName), 1, wx.ALL | wx.EXPAND, 0)
mainSizer.Add(slider, 1, wx.ALL | wx.EXPAND, 0)
slider = AttributeSlider(self, value, min, max, not x.highIsGood)
slider.SetValue(value)
headingSizer = wx.BoxSizer(wx.HORIZONTAL)
minValue = round(value*min, 3)
maxValue = round(value*max, 3)
badValue = minValue if x.highIsGood else maxValue
goodValue = maxValue if x.highIsGood else minValue
print("{}: \nHigh is good: {}".format(x.displayName, x.highIsGood))
minIsGood = badValue < value if not x.highIsGood else value < badValue
maxIsGood = goodValue < value if not x.highIsGood else value < goodValue
print ("======")
print("Value {}".format(value))
print("Min {} ({}) (good: {})".format(minValue, min, minIsGood))
print("Max {} ({}) (good: {})".format(maxValue, max, maxIsGood))
font = parent.GetFont()
font.SetWeight(wx.BOLD)
headingSizer.Add(BitmapLoader.getStaticBitmap(x.info.icon.iconFile, self, "icons"), 0, wx.RIGHT, 10)
displayName = wx.StaticText(self, wx.ID_ANY, x.displayName)
displayName.SetFont(font)
headingSizer.Add(displayName, 1, wx.ALL | wx.EXPAND, 0)
range_low=wx.StaticText(self, wx.ID_ANY, str(badValue))
range_low.SetForegroundColour(self.goodColor if minIsGood else self.badColor)
range_high = wx.StaticText(self, wx.ID_ANY, str(goodValue))
range_high.SetForegroundColour(self.goodColor if maxIsGood else self.badColor)
headingSizer.Add(range_low, 0, wx.ALL | wx.EXPAND, 0)
headingSizer.Add(wx.StaticText(self, wx.ID_ANY, " - "), 0, wx.ALL | wx.EXPAND, 0)
headingSizer.Add(range_high, 0, wx.ALL | wx.EXPAND, 0)
mainSizer.Add(headingSizer, 0, wx.ALL | wx.EXPAND, 5)
mainSizer.Add(slider, 0, wx.RIGHT | wx.LEFT | wx.EXPAND, 10)
mainSizer.Add(wx.StaticLine(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LI_HORIZONTAL), 0, wx.ALL | wx.EXPAND, 0)