%global _empty_manifest_terminate_build 0
Name:		python-pydraw
Version:	2.1.1
Release:	1
Summary:	A package designed to make graphics with Python simple and easy!
License:	MIT License
URL:		https://github.com/pydraw/pydraw
Source0:	https://mirrors.nju.edu.cn/pypi/web/packages/b9/7a/e1e18fdabc9f67b1a2cb99716882383654a40be1dc37f649529f9cdc86e8/pydraw-2.1.1.tar.gz
BuildArch:	noarch

Requires:	python3-pillow

%description
After importing pydraw, you can write a basic skeleton program like so:
```python
from pydraw import *
screen = Screen(800, 600, 'My First Project!')  # creates a screen to draw on
fps = 30
running = True
while running:
    screen.update()  # We want to update the screen if we make any changes!
    screen.sleep(1 / fps)  # Limit our updates by a certain time delay, in this case 30fps
                                       # The argument is the delay in milliseconds
screen.exit()  # Must be called at the end of a pydraw program
```
We can create our first object with just one new line:
```python
from pydraw import *
screen = Screen(800, 600, 'My First Project!')
# Here we create a rectangle at x=50, y=50 that is 50 pixels wide and 50 pixels tall.
# It is top-left anchored. This means that the position is the location of the top left corner.
# It's important to know that pydraw's canvas has the origin in the top left, with
# positive-y at the bottom of the screen, and positive-x to the right of the screen.
box = Rectangle(screen, 50, 50, 50, 50) 
fps = 30
running = True
while running:
    screen.update()
    screen.sleep(1 / fps)
screen.exit()
```
And getting straight to the point, one of pydraw's primary features is incredibly easy user-input detection.
```python
from pydraw import *
screen = Screen(800, 600, 'My First Project!')
box = Rectangle(screen, 50, 50, 50, 50) 
def mousedown(button, location):
  print(f'Wow, the {button}-button on the mouse!')
def mouseup(button, location):
  print('How un-impressive...')
def keydown(key):
  print(f'Keyboard input is {key} to creating interactive programs!')
def keyup(key):
  print('For when you really just gotta stop moving, keyup is here to save you.')
# All of the above methods must be defined above this statement (because Python):
screen.listen()
# -- As you can see, user input is as simple as defining methods and telling pydraw to listen!
#    This feature has been long overdue for teachers who want to teach Python to their students
#    by making really cool stuff but can't escape how ridiculously input has been handled in the past.
#    Now defining user input is easy to understand and use.
fps = 30
running = True
while running:
    screen.update()
    screen.sleep(1 / fps)
screen.exit()
```
This library supports many modifiers and methods for almost all objects:
```python
# ... code above
box = Rectangle(screen, 50, 50, 50, 50)  # Remember this is (x, y, width, height)!
box.x(box.y())  # set the box's x coordinate to its y coordinate
                # notice how you can access the coordinates or change them with methods.
box.location()  # We can get the Location like this!
box.move(-5, 100)  # move the box by -5 on the x-axis, 100 on the y.
box.moveto(screen.width() / 2, screen.height() / 2)  # move to near the center of the screen
box.width(box.height())  # set the box's width to its height
                         # again, it's important to notice the methods are dual-purpose
box.color(Color('red'))  # let's change the color to red
                         # it's helpful to know that the screen's color is white by default
                         # but, it can be changed with: "screen.color()"
box.border(Color('black'), fill=False)  # now we give the box a black border.
                                        # And we can make it a framed rectangle by setting fill=False
box.rotate(14)  # rotate our box by 14 degrees, clockwise
box.rotation(box.rotation() + 14)  # this is the same as the above line with the rotation method
box.visible(False)  # Hide our box. It is not visible
                    # We can also get the visibility-state by not passing anything
box.remove()  # Just get rid of that old box. We can make a better one soon :)
# code below ...
```
Lastly we can create some other objects and interact with them:
(It's important to note that all the Renderables below can use the methods listed 
above (including `overlaps()` and `contains()`, which we see in the excerpt below) 
except the CustomRenderables: CustomPolygon and Image, which are only supported for
a few.)
```python
# ... code above
not_a_box = Oval(screen, 400, 50, 100, 100, Color('magenta'))  # now we have a beautiful oval
almost_a_box = Triangle(screen, 200, 450, 100, 50, Color('yellow'), rotation=30) # uno dos tres
# ^ Also note that we are setting the color, and also setting the rotation of the triangle,
# but the other parameters are still in the usual format: (x, y, width, height).
# IMPORTANT: Triangle's base is on the left, with the triangle's location as its top corner.
# We can create a regular polygon by specifying a number of sides before the location.
# The constructor is (screen, num_sides, x, y, width, height)!
schrodingers_box = Polygon(screen, 5, 250, 150, 50, 50, border=Color('red'))
# Polygon, like Triangle, will also try to put a vertex as close to the top left as possible,
# so usually you will end up with the base of the polygon at the top.
# We can create an evil polygon like this (we can pass in a list of locations or tuples):
weird_evil_box = CustomPolygon(screen, [(500, 50), (550, 50), (550, 100), (500, 50)])
# ^ The real term for these is "Irregular Polygons". But irregular is hard to type so here we are.
# We can interact with these objects with these methods:
not_a_box.overlaps(almost_a_box)  # Do these objects overlap?
weird_evil_box.contains(Location(525, 75))  # Is this point inside the shape?
schrodingers_box.distance(not_a_box)  # Gets the precise distance between the centers
# code below ...
```
### Text, Images, and Lines
pyDraw has specific APIs for Text, Images, and Lines that will sometimes deviate from the 
standard methods slightly.
#### Text
```python
# ... code above
text = Text(screen, 'Some Cool Text!', screen.width(), screen.height(), Color('purple'))
text.move(-text.width() / 2, -text.height() / 2)  # You can get the width and height to perfectly center
                                                  # any text easily!
text.font('Calibri')
text.rotate(45)  # You can still rotate text if you want :)
text.bold(True)
text.underline(True)
text.strikethrough(False)
# code below ...
```
#### Images
```python
# ... code above
image = Image(screen, 'image.png', screen.width() / 3, screen.height() / 3)
# ^ We can load an image like this, and it will display on teh screen
# Note that we cannot add a size or color without having PIL installed, which will be installed 
# on the system if pydraw is installed via 'pip install pydraw'. If you use the file version of 
# pydraw, 'pydraw.py', you must also install PIL onto the system in order to manipulate images via:
# 'pip install pillow' (Pillow is the fork of PIL, still maintained to this day).
# Now that we know we have PIL installed we can have some fun
image.width(150)
image.height(150)
image.rotate(5)
image.color(Color('red'), alpha=123)
# ^ This will tint the image with a red color, at an alpha level of 123 (default).
# If you increase the alpha, the image will become less visible and the tint-color more so,
# and vice versa.
# code below ...
```
#### Lines
```python
# ... code above
# Let's create a nice line that goes across the screen with a beautiful blue color.
line = Line(screen, 150, 150, screen.width() - 50, screen.height() - 50, color = Color('blue'))
# We can modify the line's thickness:
line.thickness(5)
# We can even rotate the line!
line.rotate(35, point=1)  # Note that here we are specifying which point to rotate AROUND!
# We can use a special feature of lines to make them point at stuff!
line.lookat(another_location)  # SUPER NIFTY!
# code below ...

%package -n python3-pydraw
Summary:	A package designed to make graphics with Python simple and easy!
Provides:	python-pydraw
BuildRequires:	python3-devel
BuildRequires:	python3-setuptools
BuildRequires:	python3-pip
%description -n python3-pydraw
After importing pydraw, you can write a basic skeleton program like so:
```python
from pydraw import *
screen = Screen(800, 600, 'My First Project!')  # creates a screen to draw on
fps = 30
running = True
while running:
    screen.update()  # We want to update the screen if we make any changes!
    screen.sleep(1 / fps)  # Limit our updates by a certain time delay, in this case 30fps
                                       # The argument is the delay in milliseconds
screen.exit()  # Must be called at the end of a pydraw program
```
We can create our first object with just one new line:
```python
from pydraw import *
screen = Screen(800, 600, 'My First Project!')
# Here we create a rectangle at x=50, y=50 that is 50 pixels wide and 50 pixels tall.
# It is top-left anchored. This means that the position is the location of the top left corner.
# It's important to know that pydraw's canvas has the origin in the top left, with
# positive-y at the bottom of the screen, and positive-x to the right of the screen.
box = Rectangle(screen, 50, 50, 50, 50) 
fps = 30
running = True
while running:
    screen.update()
    screen.sleep(1 / fps)
screen.exit()
```
And getting straight to the point, one of pydraw's primary features is incredibly easy user-input detection.
```python
from pydraw import *
screen = Screen(800, 600, 'My First Project!')
box = Rectangle(screen, 50, 50, 50, 50) 
def mousedown(button, location):
  print(f'Wow, the {button}-button on the mouse!')
def mouseup(button, location):
  print('How un-impressive...')
def keydown(key):
  print(f'Keyboard input is {key} to creating interactive programs!')
def keyup(key):
  print('For when you really just gotta stop moving, keyup is here to save you.')
# All of the above methods must be defined above this statement (because Python):
screen.listen()
# -- As you can see, user input is as simple as defining methods and telling pydraw to listen!
#    This feature has been long overdue for teachers who want to teach Python to their students
#    by making really cool stuff but can't escape how ridiculously input has been handled in the past.
#    Now defining user input is easy to understand and use.
fps = 30
running = True
while running:
    screen.update()
    screen.sleep(1 / fps)
screen.exit()
```
This library supports many modifiers and methods for almost all objects:
```python
# ... code above
box = Rectangle(screen, 50, 50, 50, 50)  # Remember this is (x, y, width, height)!
box.x(box.y())  # set the box's x coordinate to its y coordinate
                # notice how you can access the coordinates or change them with methods.
box.location()  # We can get the Location like this!
box.move(-5, 100)  # move the box by -5 on the x-axis, 100 on the y.
box.moveto(screen.width() / 2, screen.height() / 2)  # move to near the center of the screen
box.width(box.height())  # set the box's width to its height
                         # again, it's important to notice the methods are dual-purpose
box.color(Color('red'))  # let's change the color to red
                         # it's helpful to know that the screen's color is white by default
                         # but, it can be changed with: "screen.color()"
box.border(Color('black'), fill=False)  # now we give the box a black border.
                                        # And we can make it a framed rectangle by setting fill=False
box.rotate(14)  # rotate our box by 14 degrees, clockwise
box.rotation(box.rotation() + 14)  # this is the same as the above line with the rotation method
box.visible(False)  # Hide our box. It is not visible
                    # We can also get the visibility-state by not passing anything
box.remove()  # Just get rid of that old box. We can make a better one soon :)
# code below ...
```
Lastly we can create some other objects and interact with them:
(It's important to note that all the Renderables below can use the methods listed 
above (including `overlaps()` and `contains()`, which we see in the excerpt below) 
except the CustomRenderables: CustomPolygon and Image, which are only supported for
a few.)
```python
# ... code above
not_a_box = Oval(screen, 400, 50, 100, 100, Color('magenta'))  # now we have a beautiful oval
almost_a_box = Triangle(screen, 200, 450, 100, 50, Color('yellow'), rotation=30) # uno dos tres
# ^ Also note that we are setting the color, and also setting the rotation of the triangle,
# but the other parameters are still in the usual format: (x, y, width, height).
# IMPORTANT: Triangle's base is on the left, with the triangle's location as its top corner.
# We can create a regular polygon by specifying a number of sides before the location.
# The constructor is (screen, num_sides, x, y, width, height)!
schrodingers_box = Polygon(screen, 5, 250, 150, 50, 50, border=Color('red'))
# Polygon, like Triangle, will also try to put a vertex as close to the top left as possible,
# so usually you will end up with the base of the polygon at the top.
# We can create an evil polygon like this (we can pass in a list of locations or tuples):
weird_evil_box = CustomPolygon(screen, [(500, 50), (550, 50), (550, 100), (500, 50)])
# ^ The real term for these is "Irregular Polygons". But irregular is hard to type so here we are.
# We can interact with these objects with these methods:
not_a_box.overlaps(almost_a_box)  # Do these objects overlap?
weird_evil_box.contains(Location(525, 75))  # Is this point inside the shape?
schrodingers_box.distance(not_a_box)  # Gets the precise distance between the centers
# code below ...
```
### Text, Images, and Lines
pyDraw has specific APIs for Text, Images, and Lines that will sometimes deviate from the 
standard methods slightly.
#### Text
```python
# ... code above
text = Text(screen, 'Some Cool Text!', screen.width(), screen.height(), Color('purple'))
text.move(-text.width() / 2, -text.height() / 2)  # You can get the width and height to perfectly center
                                                  # any text easily!
text.font('Calibri')
text.rotate(45)  # You can still rotate text if you want :)
text.bold(True)
text.underline(True)
text.strikethrough(False)
# code below ...
```
#### Images
```python
# ... code above
image = Image(screen, 'image.png', screen.width() / 3, screen.height() / 3)
# ^ We can load an image like this, and it will display on teh screen
# Note that we cannot add a size or color without having PIL installed, which will be installed 
# on the system if pydraw is installed via 'pip install pydraw'. If you use the file version of 
# pydraw, 'pydraw.py', you must also install PIL onto the system in order to manipulate images via:
# 'pip install pillow' (Pillow is the fork of PIL, still maintained to this day).
# Now that we know we have PIL installed we can have some fun
image.width(150)
image.height(150)
image.rotate(5)
image.color(Color('red'), alpha=123)
# ^ This will tint the image with a red color, at an alpha level of 123 (default).
# If you increase the alpha, the image will become less visible and the tint-color more so,
# and vice versa.
# code below ...
```
#### Lines
```python
# ... code above
# Let's create a nice line that goes across the screen with a beautiful blue color.
line = Line(screen, 150, 150, screen.width() - 50, screen.height() - 50, color = Color('blue'))
# We can modify the line's thickness:
line.thickness(5)
# We can even rotate the line!
line.rotate(35, point=1)  # Note that here we are specifying which point to rotate AROUND!
# We can use a special feature of lines to make them point at stuff!
line.lookat(another_location)  # SUPER NIFTY!
# code below ...

%package help
Summary:	Development documents and examples for pydraw
Provides:	python3-pydraw-doc
%description help
After importing pydraw, you can write a basic skeleton program like so:
```python
from pydraw import *
screen = Screen(800, 600, 'My First Project!')  # creates a screen to draw on
fps = 30
running = True
while running:
    screen.update()  # We want to update the screen if we make any changes!
    screen.sleep(1 / fps)  # Limit our updates by a certain time delay, in this case 30fps
                                       # The argument is the delay in milliseconds
screen.exit()  # Must be called at the end of a pydraw program
```
We can create our first object with just one new line:
```python
from pydraw import *
screen = Screen(800, 600, 'My First Project!')
# Here we create a rectangle at x=50, y=50 that is 50 pixels wide and 50 pixels tall.
# It is top-left anchored. This means that the position is the location of the top left corner.
# It's important to know that pydraw's canvas has the origin in the top left, with
# positive-y at the bottom of the screen, and positive-x to the right of the screen.
box = Rectangle(screen, 50, 50, 50, 50) 
fps = 30
running = True
while running:
    screen.update()
    screen.sleep(1 / fps)
screen.exit()
```
And getting straight to the point, one of pydraw's primary features is incredibly easy user-input detection.
```python
from pydraw import *
screen = Screen(800, 600, 'My First Project!')
box = Rectangle(screen, 50, 50, 50, 50) 
def mousedown(button, location):
  print(f'Wow, the {button}-button on the mouse!')
def mouseup(button, location):
  print('How un-impressive...')
def keydown(key):
  print(f'Keyboard input is {key} to creating interactive programs!')
def keyup(key):
  print('For when you really just gotta stop moving, keyup is here to save you.')
# All of the above methods must be defined above this statement (because Python):
screen.listen()
# -- As you can see, user input is as simple as defining methods and telling pydraw to listen!
#    This feature has been long overdue for teachers who want to teach Python to their students
#    by making really cool stuff but can't escape how ridiculously input has been handled in the past.
#    Now defining user input is easy to understand and use.
fps = 30
running = True
while running:
    screen.update()
    screen.sleep(1 / fps)
screen.exit()
```
This library supports many modifiers and methods for almost all objects:
```python
# ... code above
box = Rectangle(screen, 50, 50, 50, 50)  # Remember this is (x, y, width, height)!
box.x(box.y())  # set the box's x coordinate to its y coordinate
                # notice how you can access the coordinates or change them with methods.
box.location()  # We can get the Location like this!
box.move(-5, 100)  # move the box by -5 on the x-axis, 100 on the y.
box.moveto(screen.width() / 2, screen.height() / 2)  # move to near the center of the screen
box.width(box.height())  # set the box's width to its height
                         # again, it's important to notice the methods are dual-purpose
box.color(Color('red'))  # let's change the color to red
                         # it's helpful to know that the screen's color is white by default
                         # but, it can be changed with: "screen.color()"
box.border(Color('black'), fill=False)  # now we give the box a black border.
                                        # And we can make it a framed rectangle by setting fill=False
box.rotate(14)  # rotate our box by 14 degrees, clockwise
box.rotation(box.rotation() + 14)  # this is the same as the above line with the rotation method
box.visible(False)  # Hide our box. It is not visible
                    # We can also get the visibility-state by not passing anything
box.remove()  # Just get rid of that old box. We can make a better one soon :)
# code below ...
```
Lastly we can create some other objects and interact with them:
(It's important to note that all the Renderables below can use the methods listed 
above (including `overlaps()` and `contains()`, which we see in the excerpt below) 
except the CustomRenderables: CustomPolygon and Image, which are only supported for
a few.)
```python
# ... code above
not_a_box = Oval(screen, 400, 50, 100, 100, Color('magenta'))  # now we have a beautiful oval
almost_a_box = Triangle(screen, 200, 450, 100, 50, Color('yellow'), rotation=30) # uno dos tres
# ^ Also note that we are setting the color, and also setting the rotation of the triangle,
# but the other parameters are still in the usual format: (x, y, width, height).
# IMPORTANT: Triangle's base is on the left, with the triangle's location as its top corner.
# We can create a regular polygon by specifying a number of sides before the location.
# The constructor is (screen, num_sides, x, y, width, height)!
schrodingers_box = Polygon(screen, 5, 250, 150, 50, 50, border=Color('red'))
# Polygon, like Triangle, will also try to put a vertex as close to the top left as possible,
# so usually you will end up with the base of the polygon at the top.
# We can create an evil polygon like this (we can pass in a list of locations or tuples):
weird_evil_box = CustomPolygon(screen, [(500, 50), (550, 50), (550, 100), (500, 50)])
# ^ The real term for these is "Irregular Polygons". But irregular is hard to type so here we are.
# We can interact with these objects with these methods:
not_a_box.overlaps(almost_a_box)  # Do these objects overlap?
weird_evil_box.contains(Location(525, 75))  # Is this point inside the shape?
schrodingers_box.distance(not_a_box)  # Gets the precise distance between the centers
# code below ...
```
### Text, Images, and Lines
pyDraw has specific APIs for Text, Images, and Lines that will sometimes deviate from the 
standard methods slightly.
#### Text
```python
# ... code above
text = Text(screen, 'Some Cool Text!', screen.width(), screen.height(), Color('purple'))
text.move(-text.width() / 2, -text.height() / 2)  # You can get the width and height to perfectly center
                                                  # any text easily!
text.font('Calibri')
text.rotate(45)  # You can still rotate text if you want :)
text.bold(True)
text.underline(True)
text.strikethrough(False)
# code below ...
```
#### Images
```python
# ... code above
image = Image(screen, 'image.png', screen.width() / 3, screen.height() / 3)
# ^ We can load an image like this, and it will display on teh screen
# Note that we cannot add a size or color without having PIL installed, which will be installed 
# on the system if pydraw is installed via 'pip install pydraw'. If you use the file version of 
# pydraw, 'pydraw.py', you must also install PIL onto the system in order to manipulate images via:
# 'pip install pillow' (Pillow is the fork of PIL, still maintained to this day).
# Now that we know we have PIL installed we can have some fun
image.width(150)
image.height(150)
image.rotate(5)
image.color(Color('red'), alpha=123)
# ^ This will tint the image with a red color, at an alpha level of 123 (default).
# If you increase the alpha, the image will become less visible and the tint-color more so,
# and vice versa.
# code below ...
```
#### Lines
```python
# ... code above
# Let's create a nice line that goes across the screen with a beautiful blue color.
line = Line(screen, 150, 150, screen.width() - 50, screen.height() - 50, color = Color('blue'))
# We can modify the line's thickness:
line.thickness(5)
# We can even rotate the line!
line.rotate(35, point=1)  # Note that here we are specifying which point to rotate AROUND!
# We can use a special feature of lines to make them point at stuff!
line.lookat(another_location)  # SUPER NIFTY!
# code below ...

%prep
%autosetup -n pydraw-2.1.1

%build
%py3_build

%install
%py3_install
install -d -m755 %{buildroot}/%{_pkgdocdir}
if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi
if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi
if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi
if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi
pushd %{buildroot}
if [ -d usr/lib ]; then
	find usr/lib -type f -printf "/%h/%f\n" >> filelist.lst
fi
if [ -d usr/lib64 ]; then
	find usr/lib64 -type f -printf "/%h/%f\n" >> filelist.lst
fi
if [ -d usr/bin ]; then
	find usr/bin -type f -printf "/%h/%f\n" >> filelist.lst
fi
if [ -d usr/sbin ]; then
	find usr/sbin -type f -printf "/%h/%f\n" >> filelist.lst
fi
touch doclist.lst
if [ -d usr/share/man ]; then
	find usr/share/man -type f -printf "/%h/%f.gz\n" >> doclist.lst
fi
popd
mv %{buildroot}/filelist.lst .
mv %{buildroot}/doclist.lst .

%files -n python3-pydraw -f filelist.lst
%dir %{python3_sitelib}/*

%files help -f doclist.lst
%{_docdir}/*

%changelog
* Thu May 18 2023 Python_Bot <Python_Bot@openeuler.org> - 2.1.1-1
- Package Spec generated