Added text entry beside sliders

These automatically are updated when the slider moves, and vice versa.
Still cannot seem to fix the adjustment increment. It makes no sense.
This commit is contained in:
A.M. Rowsell 2021-06-28 00:48:02 -04:00
commit 9d98349805
Signed by: amr
GPG key ID: 0B6E2D8375CF79A9
2 changed files with 254 additions and 139 deletions

View file

@ -10,6 +10,225 @@
<property name="page-increment">5</property> <property name="page-increment">5</property>
<signal name="value-changed" handler="bigRadiusAdjustment_value_changed_cb" swapped="no"/> <signal name="value-changed" handler="bigRadiusAdjustment_value_changed_cb" swapped="no"/>
</object> </object>
<object class="GtkWindow" id="spWindow">
<property name="can-focus">False</property>
<property name="title" translatable="yes">Spirographs</property>
<property name="window-position">center</property>
<property name="default-width">800</property>
<property name="default-height">800</property>
<signal name="destroy" handler="onDestroy" swapped="no"/>
<child>
<!-- n-columns=2 n-rows=3 -->
<object class="GtkGrid" id="topGrid">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="margin-start">5</property>
<property name="margin-end">5</property>
<property name="margin-top">5</property>
<property name="margin-bottom">5</property>
<property name="row-spacing">10</property>
<child>
<object class="GtkImage" id="epichondroidFormulaImage">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="pixbuf">img/small_epitrochoid.png</property>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">2</property>
</packing>
</child>
<child>
<object class="GtkImage" id="hypotrochoidFormulaImage">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="pixbuf">img/small_hypotrochoid.png</property>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">2</property>
</packing>
</child>
<child>
<object class="GtkViewport" id="plotViewport">
<property name="visible">True</property>
<property name="app-paintable">True</property>
<property name="can-focus">False</property>
<property name="hscroll-policy">natural</property>
<property name="vscroll-policy">natural</property>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">0</property>
<property name="width">2</property>
</packing>
</child>
<child>
<!-- n-columns=3 n-rows=3 -->
<object class="GtkGrid" id="scaleGrid">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="margin-start">5</property>
<property name="margin-end">5</property>
<property name="row-spacing">5</property>
<property name="column-spacing">5</property>
<child>
<object class="GtkScale" id="bigRadiusScale">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="hexpand">True</property>
<property name="adjustment">bigRadiusAdjustment</property>
<property name="show-fill-level">True</property>
<property name="fill-level">100</property>
<property name="round-digits">1</property>
</object>
<packing>
<property name="left-attach">2</property>
<property name="top-attach">0</property>
</packing>
</child>
<child>
<object class="GtkScale" id="distanceScale">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="hexpand">True</property>
<property name="adjustment">distanceAdjustment</property>
<property name="show-fill-level">True</property>
<property name="fill-level">100</property>
<property name="round-digits">1</property>
</object>
<packing>
<property name="left-attach">2</property>
<property name="top-attach">2</property>
</packing>
</child>
<child>
<object class="GtkScale" id="smallRadiusScale">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="hexpand">True</property>
<property name="adjustment">smallRadiusAdjustment</property>
<property name="show-fill-level">True</property>
<property name="fill-level">100</property>
<property name="round-digits">1</property>
</object>
<packing>
<property name="left-attach">2</property>
<property name="top-attach">1</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="bigRadiusEntry">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="halign">center</property>
<property name="margin-start">10</property>
<property name="margin-end">10</property>
<property name="width-chars">10</property>
<property name="text" translatable="yes">32</property>
<property name="xalign">0.5</property>
<property name="primary-icon-activatable">False</property>
<property name="primary-icon-sensitive">False</property>
<property name="input-purpose">number</property>
<signal name="changed" handler="bigRadiusEntry_changed_cb" swapped="no"/>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="bigRadiusLabel">
<property name="width-request">100</property>
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="halign">start</property>
<property name="label" translatable="yes">Big Radius (R):</property>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="smallRadiusLabel">
<property name="width-request">100</property>
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="halign">start</property>
<property name="label" translatable="yes">Small Radius (r):</property>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="distanceLabel">
<property name="width-request">100</property>
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="halign">start</property>
<property name="label" translatable="yes">Distance (d):</property>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">2</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="smallRadiusEntry">
<property name="width-request">100</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="halign">center</property>
<property name="margin-start">10</property>
<property name="margin-end">10</property>
<property name="width-chars">10</property>
<property name="max-width-chars">5</property>
<property name="text" translatable="yes">7</property>
<property name="xalign">0.5</property>
<property name="input-purpose">number</property>
<signal name="changed" handler="smallRadiusEntry_changed_cb" swapped="no"/>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">1</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="distanceEntry">
<property name="width-request">100</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="halign">center</property>
<property name="margin-start">10</property>
<property name="margin-end">10</property>
<property name="width-chars">10</property>
<property name="max-width-chars">5</property>
<property name="text" translatable="yes">5</property>
<property name="xalign">0.5</property>
<property name="input-purpose">number</property>
<signal name="changed" handler="distanceEntry_changed_cb" swapped="no"/>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">2</property>
</packing>
</child>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">1</property>
<property name="width">2</property>
</packing>
</child>
</object>
</child>
</object>
<object class="GtkAdjustment" id="distanceAdjustment"> <object class="GtkAdjustment" id="distanceAdjustment">
<property name="lower">0.5</property> <property name="lower">0.5</property>
<property name="upper">100</property> <property name="upper">100</property>
@ -26,129 +245,4 @@
<property name="page-increment">5</property> <property name="page-increment">5</property>
<signal name="value-changed" handler="smallRadiusAdjustment_value_changed_cb" swapped="no"/> <signal name="value-changed" handler="smallRadiusAdjustment_value_changed_cb" swapped="no"/>
</object> </object>
<object class="GtkWindow" id="spWindow">
<property name="can-focus">False</property>
<signal name="destroy" handler="onDestroy" swapped="no"/>
<child>
<!-- n-columns=2 n-rows=5 -->
<object class="GtkGrid" id="topGrid">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="row-spacing">10</property>
<property name="column-homogeneous">True</property>
<child>
<object class="GtkScale" id="bigRadiusScale">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="adjustment">bigRadiusAdjustment</property>
<property name="show-fill-level">True</property>
<property name="fill-level">100</property>
<property name="round-digits">1</property>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">1</property>
</packing>
</child>
<child>
<object class="GtkScale" id="smallRadiusScale">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="adjustment">smallRadiusAdjustment</property>
<property name="show-fill-level">True</property>
<property name="fill-level">100</property>
<property name="round-digits">1</property>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">2</property>
</packing>
</child>
<child>
<object class="GtkScale" id="distanceScale">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="adjustment">distanceAdjustment</property>
<property name="show-fill-level">True</property>
<property name="fill-level">100</property>
<property name="round-digits">1</property>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">3</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="bigRadiusLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Big Radius (R):</property>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="smallRadiusLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Small Radius (r):</property>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">2</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="distanceLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Distance (d):</property>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">3</property>
</packing>
</child>
<child>
<object class="GtkImage" id="epichondroidFormulaImage">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="pixbuf">img/small_epitrochoid.png</property>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">4</property>
</packing>
</child>
<child>
<object class="GtkImage" id="hypotrochoidFormulaImage">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="pixbuf">img/small_hypotrochoid.png</property>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">4</property>
</packing>
</child>
<child>
<object class="GtkViewport" id="plotViewport">
<property name="visible">True</property>
<property name="app-paintable">True</property>
<property name="can-focus">False</property>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">0</property>
<property name="width">2</property>
</packing>
</child>
</object>
</child>
</object>
</interface> </interface>

View file

@ -25,17 +25,23 @@ class spirographs:
self.highestTheta = (np.lcm(self.smallRadius, self.bigRadius)/self.bigRadius) * 2 * math.pi self.highestTheta = (np.lcm(self.smallRadius, self.bigRadius)/self.bigRadius) * 2 * math.pi
self.stepSize = self.highestTheta / 4096 self.stepSize = self.highestTheta / 4096
# update initial slider positions # update initial slider positions
bigRadiusAdjustment = builder.get_object('bigRadiusAdjustment') self.bigRadiusAdjustment = builder.get_object('bigRadiusAdjustment')
smallRadiusAdjustment = builder.get_object('smallRadiusAdjustment') self.smallRadiusAdjustment = builder.get_object('smallRadiusAdjustment')
distanceAdjustment = builder.get_object('distanceAdjustment') self.distanceAdjustment = builder.get_object('distanceAdjustment')
self.bigRadiusEntry = builder.get_object('bigRadiusEntry')
self.smallRadiusEntry = builder.get_object('smallRadiusEntry')
self.distanceEntry = builder.get_object('distanceEntry')
# set the initial values to a neat shape # set the initial values to a neat shape
bigRadiusAdjustment.set_value(self.bigRadius) self.bigRadiusAdjustment.set_value(self.bigRadius)
smallRadiusAdjustment.set_value(self.smallRadius) self.smallRadiusAdjustment.set_value(self.smallRadius)
distanceAdjustment.set_value(self.distance) self.distanceAdjustment.set_value(self.distance)
self.bigRadiusEntry.set_text(str(self.bigRadius))
self.smallRadiusEntry.set_text(str(self.smallRadius))
self.distanceEntry.set_text(str(self.distance))
# try and set the step size?! # try and set the step size?!
bigRadiusAdjustment.set_step_increment(0.5) self.bigRadiusAdjustment.set_step_increment(0.5)
smallRadiusAdjustment.set_step_increment(0.5) self.smallRadiusAdjustment.set_step_increment(0.5)
distanceAdjustment.set_step_increment(0.5) self.distanceAdjustment.set_step_increment(0.5)
# create initial plot # create initial plot
self.recalcPoints() self.recalcPoints()
self.showPlot() self.showPlot()
@ -58,19 +64,34 @@ class spirographs:
def bigRadiusAdjustment_value_changed_cb(self, widget): def bigRadiusAdjustment_value_changed_cb(self, widget):
self.bigRadius = widget.get_value() self.bigRadius = widget.get_value()
self.bigRadiusEntry.set_text(str(self.bigRadius))
self.recalcPoints() self.recalcPoints()
self.updatePlot() self.updatePlot()
def bigRadiusEntry_changed_cb(self, widget):
self.bigRadius = float(widget.get_text())
self.bigRadiusAdjustment.set_value(self.bigRadius)
def smallRadiusAdjustment_value_changed_cb(self, widget): def smallRadiusAdjustment_value_changed_cb(self, widget):
self.smallRadius = widget.get_value() self.smallRadius = widget.get_value()
self.smallRadiusEntry.set_text(str(self.smallRadius))
self.recalcPoints() self.recalcPoints()
self.updatePlot() self.updatePlot()
def smallRadiusEntry_changed_cb(self, widget):
self.smallRadius = float(widget.get_text())
self.smallRadiusAdjustment.set_value(self.smallRadius)
def distanceAdjustment_value_changed_cb(self, widget): def distanceAdjustment_value_changed_cb(self, widget):
self.distance = widget.get_value() self.distance = widget.get_value()
self.distanceEntry.set_text(str(self.distance))
self.recalcPoints() self.recalcPoints()
self.updatePlot() self.updatePlot()
def distanceEntry_changed_cb(self, widget):
self.distance = float(widget.get_text())
self.distanceAdjustment.set_value(self.distance)
def recalcPoints(self): def recalcPoints(self):
self.epiX = np.array([self.calcEpiX(i) for i in np.arange(0, self.highestTheta, self.stepSize)]) self.epiX = np.array([self.calcEpiX(i) for i in np.arange(0, self.highestTheta, self.stepSize)])
self.epiY = np.array([self.calcEpiY(i) for i in np.arange(0, self.highestTheta, self.stepSize)]) self.epiY = np.array([self.calcEpiY(i) for i in np.arange(0, self.highestTheta, self.stepSize)])
@ -79,11 +100,11 @@ class spirographs:
def showPlot(self): def showPlot(self):
viewport = builder.get_object('plotViewport') viewport = builder.get_object('plotViewport')
self.plotFigure = Figure(figsize=(5, 5), dpi=100) self.plotFigure = Figure(figsize=(5, 8), dpi=100)
self.epiPlot, self.hypoPlot = self.plotFigure.subplots(1, 2) self.epiPlot, self.hypoPlot = self.plotFigure.subplots(1, 2)
self.epiPlot.set_title(f"Epichondroid of {self.bigRadius}, {self.smallRadius}, {self.distance}") self.epiPlot.set_title(f"Epitrochoid of {self.bigRadius}, {self.smallRadius}, {self.distance}")
self.epiPlot.plot(self.epiX, self.epiY) self.epiPlot.plot(self.epiX, self.epiY)
self.hypoPlot.set_title(f"Hypochondroid of {self.bigRadius}, {self.smallRadius}, {self.distance}") self.hypoPlot.set_title(f"Hypotrochoid of {self.bigRadius}, {self.smallRadius}, {self.distance}")
self.hypoPlot.plot(self.hypoX, self.hypoY) self.hypoPlot.plot(self.hypoX, self.hypoY)
self.canvas = FigureCanvas(self.plotFigure) self.canvas = FigureCanvas(self.plotFigure)
@ -93,8 +114,8 @@ class spirographs:
def updatePlot(self): def updatePlot(self):
self.epiPlot.clear() self.epiPlot.clear()
self.hypoPlot.clear() self.hypoPlot.clear()
self.epiPlot.set_title(f"Epichondroid of {self.bigRadius}, {self.smallRadius}, {self.distance}") self.epiPlot.set_title(f"Epitrochoid of {self.bigRadius}, {self.smallRadius}, {self.distance}")
self.hypoPlot.set_title(f"Hypochondroid of {self.bigRadius}, {self.smallRadius}, {self.distance}") self.hypoPlot.set_title(f"Hypotrochoid of {self.bigRadius}, {self.smallRadius}, {self.distance}")
self.epiPlot.plot(self.epiX, self.epiY) self.epiPlot.plot(self.epiX, self.epiY)
self.hypoPlot.plot(self.hypoX, self.hypoY) self.hypoPlot.plot(self.hypoX, self.hypoY)
self.canvas.draw_idle() self.canvas.draw_idle()