a
This commit is contained in:
parent
a13eba897c
commit
f3da629131
87
DEV4.1/tp4/ex1/css/style.css
Normal file
87
DEV4.1/tp4/ex1/css/style.css
Normal file
@ -0,0 +1,87 @@
|
||||
main {
|
||||
position: absolute;
|
||||
top: 2rem;
|
||||
left: 50%;
|
||||
transform: translate(-50%, 0);
|
||||
}
|
||||
.loader {
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
}
|
||||
.loader {
|
||||
margin: 6rem 0 0;
|
||||
}
|
||||
.error {
|
||||
color: #FFFAAA;
|
||||
margin: 1rem 0;
|
||||
}
|
||||
label {
|
||||
align-items: center;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
font-size: 1.6rem;
|
||||
}
|
||||
label span {
|
||||
text-shadow: 1px 1px 2px rgba(0,0,0,0.8);
|
||||
}
|
||||
input {
|
||||
margin: 1rem 0 0;
|
||||
font-size: 1.6rem;
|
||||
font-weight: 300;
|
||||
padding: 0.8rem 1rem;
|
||||
color: white;
|
||||
border: 1px solid rgba(255, 255, 255, 0.05);
|
||||
background: rgba(255, 255, 255, 0.05);
|
||||
transition: all 0.3s;
|
||||
box-shadow: 1px 1px 2px rgba(0,0,0, 0.3);
|
||||
-moz-appearance:none;
|
||||
-webkit-appearance:none;
|
||||
outline: none;
|
||||
}
|
||||
input:focus {
|
||||
border: 1px solid transparent;
|
||||
background: rgba(255, 255, 255, 0.08);
|
||||
}
|
||||
ul {
|
||||
padding: 0;
|
||||
margin: 1rem 0 2rem;
|
||||
}
|
||||
ul li {
|
||||
padding: 0.6rem 1rem;
|
||||
margin: 1px 0;
|
||||
line-height: 1.4rem;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
align-content: space-between;
|
||||
text-shadow: 1px 1px 2px rgba(0,0,0,0.8);
|
||||
background: rgba(255, 255, 255, 0.08);
|
||||
box-shadow: 0 0 2px rgba(0,0,0, 0.3);
|
||||
box-sizing: border-box;
|
||||
}
|
||||
ul li:hover,
|
||||
ul li:active,
|
||||
ul li:focus {
|
||||
background: rgba(255, 255, 255, 0.1);
|
||||
}
|
||||
ul li a {
|
||||
margin: 0 0.6rem 0 0;
|
||||
text-decoration: none;
|
||||
color: white;
|
||||
}
|
||||
ul li span {
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
font-family: 'Helvetica Neue', Helvetica, Arial;
|
||||
font-weight: 300;
|
||||
background-size: cover;
|
||||
background-attachment: fixed;
|
||||
background-image: -webkit-radial-gradient(ellipse farthest-corner at top, #661141, #000000);
|
||||
background-image: radial-gradient(ellipse farthest-corner at top, #661141, #000000);
|
||||
color: white;
|
||||
}
|
13
DEV4.1/tp4/ex1/img/puff.svg
Normal file
13
DEV4.1/tp4/ex1/img/puff.svg
Normal file
@ -0,0 +1,13 @@
|
||||
<!-- By Sam Herbert (@sherb), for everyone. More @ http://goo.gl/7AJzbL -->
|
||||
<svg width="44" height="44" viewBox="0 0 44 44" xmlns="http://www.w3.org/2000/svg" stroke="#fff">
|
||||
<g fill="none" fill-rule="evenodd" stroke-width="2">
|
||||
<circle cx="22" cy="22" r="1">
|
||||
<animate attributeName="r" begin="0s" dur="1.8s" values="1; 20" calcMode="spline" keyTimes="0; 1" keySplines="0.165, 0.84, 0.44, 1" repeatCount="indefinite"/>
|
||||
<animate attributeName="stroke-opacity" begin="0s" dur="1.8s" values="1; 0" calcMode="spline" keyTimes="0; 1" keySplines="0.3, 0.61, 0.355, 1" repeatCount="indefinite"/>
|
||||
</circle>
|
||||
<circle cx="22" cy="22" r="1">
|
||||
<animate attributeName="r" begin="-0.9s" dur="1.8s" values="1; 20" calcMode="spline" keyTimes="0; 1" keySplines="0.165, 0.84, 0.44, 1" repeatCount="indefinite"/>
|
||||
<animate attributeName="stroke-opacity" begin="-0.9s" dur="1.8s" values="1; 0" calcMode="spline" keyTimes="0; 1" keySplines="0.3, 0.61, 0.355, 1" repeatCount="indefinite"/>
|
||||
</circle>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.0 KiB |
28
DEV4.1/tp4/ex1/index.html
Normal file
28
DEV4.1/tp4/ex1/index.html
Normal file
@ -0,0 +1,28 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="initial-scale=1,witdh=device-width">
|
||||
<link rel="stylesheet" type="text/css" href="./css/style.css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<!-- vue html -->
|
||||
<main>
|
||||
<label>
|
||||
<span>Search a movie</span>
|
||||
<input type="input" placeholder="28 Days Later..">
|
||||
</label>
|
||||
|
||||
<div class="loader">
|
||||
<img src="./img/puff.svg">
|
||||
</div>
|
||||
|
||||
<p class="error"></p>
|
||||
<div id="list-movies">
|
||||
</div>
|
||||
</main>
|
||||
</body>
|
||||
<script type="module" src="./js/app.js"></script>
|
||||
</html>
|
7
DEV4.1/tp4/ex1/js/app.js
Normal file
7
DEV4.1/tp4/ex1/js/app.js
Normal file
@ -0,0 +1,7 @@
|
||||
import model from './model'
|
||||
import Controller from './controller'
|
||||
import View from './view'
|
||||
|
||||
const view = new View()
|
||||
const app = new Controller(view,model)
|
||||
|
45
DEV4.1/tp4/ex1/js/controller.js
Normal file
45
DEV4.1/tp4/ex1/js/controller.js
Normal file
@ -0,0 +1,45 @@
|
||||
class Controller {
|
||||
constructor(view,model){
|
||||
this.view = view
|
||||
this.model = model
|
||||
|
||||
this.loading = false
|
||||
this.lastSearch = null
|
||||
this.error = null
|
||||
this.results = []
|
||||
|
||||
this.view.setLoading(false)
|
||||
this.view.bindSearch(this.search.bind(this))
|
||||
}
|
||||
reset() {
|
||||
this.loading = false
|
||||
this.error = null
|
||||
this.results = []
|
||||
}
|
||||
|
||||
async search(searchMovie) {
|
||||
try {
|
||||
this.reset();
|
||||
this.loading = true;
|
||||
this.view.setLoading(true);
|
||||
|
||||
const movies = await this.model.getMovies(searchMovie);
|
||||
|
||||
if (movies && movies.length > 0) {
|
||||
this.results = movies;
|
||||
} else {
|
||||
this.error = "No movies found.";
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error occurred during search:', error);
|
||||
this.error = "An error occurred during search.";
|
||||
} finally {
|
||||
this.loading = false;
|
||||
this.view.setLoading(false);
|
||||
this.view.renderResults(this.results, this.error);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export default Controller
|
||||
|
12
DEV4.1/tp4/ex1/js/helpers.js
Normal file
12
DEV4.1/tp4/ex1/js/helpers.js
Normal file
@ -0,0 +1,12 @@
|
||||
// Returns a function, that, as long as it continues to be invoked, will not
|
||||
// be triggered. The function will be called after it stops being called for
|
||||
// N milliseconds.
|
||||
function debounce(fn, wait) {
|
||||
let timeout
|
||||
|
||||
return (...args) => {
|
||||
clearTimeout(timeout)
|
||||
timeout = setTimeout(() => fn(...args), wait)
|
||||
}
|
||||
}
|
||||
export default debounce
|
23
DEV4.1/tp4/ex1/js/model.js
Normal file
23
DEV4.1/tp4/ex1/js/model.js
Normal file
@ -0,0 +1,23 @@
|
||||
let apiKey = 'a776e2df'
|
||||
|
||||
let model = {
|
||||
getMovies(search){
|
||||
return new Promise((resolve, reject) => {
|
||||
fetch(`http://www.omdbapi.com/?apikey=${apiKey}&s=${search}`)
|
||||
.then(response => {
|
||||
if (!response.ok) {
|
||||
throw new Error('Network response was not ok');
|
||||
}
|
||||
return response.json();
|
||||
})
|
||||
.then(data => {
|
||||
resolve(data.Search);
|
||||
})
|
||||
.catch(error => {
|
||||
console.error('There was a problem with the fetch operation:', error);}
|
||||
)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
export default model
|
54
DEV4.1/tp4/ex1/js/view.js
Normal file
54
DEV4.1/tp4/ex1/js/view.js
Normal file
@ -0,0 +1,54 @@
|
||||
import debounce from "./helpers.js"
|
||||
|
||||
class View {
|
||||
constructor(){
|
||||
this.listMovies = document.querySelector("#list-movies")
|
||||
this.inputSearch = document.querySelector("input")
|
||||
this.loader = document.querySelector(".loader")
|
||||
this.message = document.querySelector("p.error")
|
||||
}
|
||||
|
||||
_getInput(){
|
||||
return this.inputSearch.value
|
||||
}
|
||||
|
||||
setLoading(loading){
|
||||
if (loading)
|
||||
this.loader.style.display = "block"
|
||||
else
|
||||
this.loader.style.display = "none"
|
||||
}
|
||||
|
||||
renderMessage(error){
|
||||
this.message.style.display = "block"
|
||||
this.message.textContent = error
|
||||
}
|
||||
|
||||
renderList(movies){
|
||||
let ul = document.createElement("ul")
|
||||
movies.forEach((movie)=>{
|
||||
let li = document.createElement("li")
|
||||
let a = document.createElement("a")
|
||||
let span = document.createElement("span")
|
||||
a.href = `http://www.imdb.com/title/${movie.imdbID}`
|
||||
a.target="_blank"
|
||||
a.textContent = movie.Title
|
||||
span.textContent = movie.Year
|
||||
|
||||
|
||||
li.appendChild(a)
|
||||
li.appendChild(span)
|
||||
ul.appendChild(li)
|
||||
})
|
||||
|
||||
this.listMovies.replaceChildren(ul)
|
||||
}
|
||||
|
||||
bindSearch(handler){
|
||||
this.inputSearch.addEventListener("input",debounce((e)=>{
|
||||
handler(this._getInput())
|
||||
},500))
|
||||
}
|
||||
}
|
||||
|
||||
export default View
|
9
DEV4.1/tp4/ex3/app.js
Normal file
9
DEV4.1/tp4/ex3/app.js
Normal file
@ -0,0 +1,9 @@
|
||||
import {tableManager} from './modules/table'
|
||||
import loader from './modules/loader'
|
||||
let leagues = []
|
||||
|
||||
let leagueList = document.querySelector(".menu-list")
|
||||
let table = new tableManager(document.querySelector("table tbody"))
|
||||
let loader = new loader(document.getElementById("loader"))
|
||||
|
||||
// TODO
|
25
DEV4.1/tp4/ex3/css/style.css
Normal file
25
DEV4.1/tp4/ex3/css/style.css
Normal file
@ -0,0 +1,25 @@
|
||||
div.is-loading {
|
||||
position: fixed;
|
||||
z-index: 999;
|
||||
overflow: show;
|
||||
margin: auto;
|
||||
top: 0;
|
||||
left: 0;
|
||||
bottom: 0;
|
||||
right: 0;
|
||||
}
|
||||
div.is-loading:after {
|
||||
animation: spinAround 500ms infinite linear;
|
||||
border: 2px solid hsl(0deg, 0%, 86%);
|
||||
border-radius: 9999px;
|
||||
border-right-color: transparent;
|
||||
border-top-color: transparent;
|
||||
content: "";
|
||||
display: block;
|
||||
position: relative;
|
||||
top: calc(50% - 5em);
|
||||
left: calc(50% - 5em);
|
||||
width: 10em;
|
||||
height: 10em;
|
||||
border-width: 0.25em;
|
||||
}
|
75
DEV4.1/tp4/ex3/index.html
Normal file
75
DEV4.1/tp4/ex3/index.html
Normal file
@ -0,0 +1,75 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="initial-scale=1,witdh=device-width">
|
||||
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.9.4/css/bulma.min.css">
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.9.0/css/all.min.css" integrity="sha512-q3eWabyZPc1XTCmF+8/LuE1ozpg5xxn7iO89yfSOd5/oKvyqLngoNGsx8jq92Y8eXJ/IRxQbEC+FGSYxtk2oiw==" crossorigin="anonymous" referrerpolicy="no-referrer" />
|
||||
|
||||
<link rel="stylesheet" href="./css/style.css">
|
||||
|
||||
<title>French Soccer</title>
|
||||
</head>
|
||||
<body class="m-6">
|
||||
<main class="container">
|
||||
<div id="loader" ></div>
|
||||
<section class="columns">
|
||||
<aside class="menu column is-narrow">
|
||||
<div class="box">
|
||||
<p class="menu-label">Championnats de Football</p>
|
||||
<ul class="menu-list">
|
||||
</ul>
|
||||
</div>
|
||||
</aside>
|
||||
<div class="column is-offset-1">
|
||||
<h5 class="title is-5 has-text-primary-dark">
|
||||
<span id="nom"></span><span class="tag" id="date"></span>
|
||||
<div class="block control has-icons-left is-inline-block is-pulled-right">
|
||||
<input class="input" type="search" placeholder="Equipe" id="myInput">
|
||||
<span class="icon is-small is-left">
|
||||
<i class="fas fa-search"></i>
|
||||
</span>
|
||||
</div>
|
||||
</h5>
|
||||
|
||||
|
||||
<table class="table is-fullwidth is-hoverable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th><abbr title="Position">Pos</abbr><a id="sort" href="#"><span class="icon"><i class="fas fa-sort"></i></span></a></th>
|
||||
<th></th>
|
||||
<th>Team</th>
|
||||
<th><abbr title="Played">Pld</abbr></th>
|
||||
<th><abbr title="Won">W</abbr></th>
|
||||
<th><abbr title="Drawn">D</abbr></th>
|
||||
<th><abbr title="Lost">L</abbr></th>
|
||||
<th><abbr title="Goals for">GF</abbr></th>
|
||||
<th><abbr title="Goals against">GA</abbr></th>
|
||||
<th><abbr title="Goal difference">GD</abbr></th>
|
||||
<th><abbr title="Points">Pts</abbr></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tfoot>
|
||||
<tr>
|
||||
<th><abbr title="Position">Pos</abbr></th>
|
||||
<th></th>
|
||||
<th>Team</th>
|
||||
<th><abbr title="Played">Pld</abbr></th>
|
||||
<th><abbr title="Won">W</abbr></th>
|
||||
<th><abbr title="Drawn">D</abbr></th>
|
||||
<th><abbr title="Lost">L</abbr></th>
|
||||
<th><abbr title="Goals for">GF</abbr></th>
|
||||
<th><abbr title="Goals against">GA</abbr></th>
|
||||
<th><abbr title="Goal difference">GD</abbr></th>
|
||||
<th><abbr title="Points">Pts</abbr></th>
|
||||
</tr>
|
||||
</tfoot>
|
||||
<tbody></tbody>
|
||||
</table>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
<script type="module" src="app.js"></script>
|
||||
</body>
|
||||
</html>
|
11
DEV4.1/tp4/ex3/modules/helpers.js
Normal file
11
DEV4.1/tp4/ex3/modules/helpers.js
Normal file
@ -0,0 +1,11 @@
|
||||
function debounce(f,wait)
|
||||
{
|
||||
let timeout
|
||||
|
||||
return function(...args){
|
||||
clearTimeout(timeout)
|
||||
timeout=setTimeout(()=>f(...args),wait)
|
||||
}
|
||||
}
|
||||
|
||||
export default debounce
|
15
DEV4.1/tp4/ex3/modules/loader.js
Normal file
15
DEV4.1/tp4/ex3/modules/loader.js
Normal file
@ -0,0 +1,15 @@
|
||||
class loader {
|
||||
div = null
|
||||
constructor(node){
|
||||
this.div = node
|
||||
}
|
||||
set(loading){
|
||||
if (loading)
|
||||
this.div.classList.add("is-loading")
|
||||
else
|
||||
this.div.classList.remove("is-loading")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
export default loader
|
85
DEV4.1/tp4/ex3/modules/table.js
Normal file
85
DEV4.1/tp4/ex3/modules/table.js
Normal file
@ -0,0 +1,85 @@
|
||||
import debounce from './helpers'
|
||||
|
||||
|
||||
class tableManager {
|
||||
tbody = null
|
||||
props = ["intRank","strTeamBadge","strTeam","intPlayed","intWin","intDraw",
|
||||
"intLoss","intGoalsFor","intGoalsAgainst","intGoalDifference","intPoints"]
|
||||
sort = -1 // -1 ou 1
|
||||
teamSearch = ''
|
||||
data = [] // données à afficher
|
||||
//
|
||||
constructor(tbodyNode){
|
||||
this.tbody = tbodyNode
|
||||
|
||||
|
||||
document
|
||||
.getElementById("myInput")
|
||||
.addEventListener("input",debounce(e=>{
|
||||
this.teamSearch = e.target.value.toUpperCase()
|
||||
this.tableRender()
|
||||
},500))
|
||||
|
||||
document
|
||||
.getElementById("sort")
|
||||
.addEventListener("click",((e) => {
|
||||
this.sort *= -1
|
||||
e.preventDefault()
|
||||
this.tableRender()
|
||||
|
||||
}))
|
||||
|
||||
}
|
||||
setData(data){
|
||||
this.data = data
|
||||
}
|
||||
_setDate = (()=>{
|
||||
if (this.data.length == 0 ) return
|
||||
let date=new Date(this.data[0].dateUpdated)
|
||||
document.getElementById("date").textContent = date.toLocaleDateString("fr")
|
||||
})
|
||||
|
||||
setNom(nom){
|
||||
document.getElementById("nom").textContent = nom
|
||||
}
|
||||
_getRow = (v => {
|
||||
let tr = document.createElement("tr")
|
||||
for (let p of this.props){
|
||||
let td = document.createElement("td")
|
||||
if (p !== "strTeamBadge"){
|
||||
td.textContent = v[p]
|
||||
} else {
|
||||
let figure = document.createElement("figure")
|
||||
let img = document.createElement("img")
|
||||
figure.classList.add("image","is-32x32")
|
||||
img.src = v[p]
|
||||
figure.appendChild(img)
|
||||
td.appendChild(figure)
|
||||
}
|
||||
tr.appendChild(td)
|
||||
}
|
||||
return tr
|
||||
})
|
||||
|
||||
tableRender(){
|
||||
let dataFilter
|
||||
if (this.teamSearch)
|
||||
dataFilter = this.data.filter( item => item.strTeam.toUpperCase().includes(this.teamSearch))
|
||||
else
|
||||
dataFilter = [...this.data]
|
||||
|
||||
dataFilter.sort((eq1,eq2)=>this.sort*(eq2.intRank - eq1.intRank))
|
||||
this._setDate()
|
||||
|
||||
let content = document.createDocumentFragment()
|
||||
dataFilter.forEach(v =>{
|
||||
content.appendChild(this._getRow(v))
|
||||
})
|
||||
|
||||
this.tbody.replaceChildren(content)
|
||||
}
|
||||
}
|
||||
|
||||
export { tableManager }
|
||||
|
||||
|
1
DEV4.5/.idea/.name
generated
1
DEV4.5/.idea/.name
generated
@ -1 +0,0 @@
|
||||
Choix
|
10
DEV4.5/ChatRelative/.idea/deploymentTargetDropDown.xml
generated
Normal file
10
DEV4.5/ChatRelative/.idea/deploymentTargetDropDown.xml
generated
Normal file
@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="deploymentTargetDropDown">
|
||||
<value>
|
||||
<entry key="app">
|
||||
<State />
|
||||
</entry>
|
||||
</value>
|
||||
</component>
|
||||
</project>
|
4
DEV4.5/ChatRelative/.idea/gradle.xml
generated
4
DEV4.5/ChatRelative/.idea/gradle.xml
generated
@ -4,15 +4,15 @@
|
||||
<component name="GradleSettings">
|
||||
<option name="linkedExternalProjectsSettings">
|
||||
<GradleProjectSettings>
|
||||
<option name="testRunner" value="GRADLE" />
|
||||
<option name="distributionType" value="DEFAULT_WRAPPED" />
|
||||
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
||||
<option name="gradleJvm" value="#GRADLE_LOCAL_JAVA_HOME" />
|
||||
<option name="modules">
|
||||
<set>
|
||||
<option value="$PROJECT_DIR$" />
|
||||
<option value="$PROJECT_DIR$/app" />
|
||||
</set>
|
||||
</option>
|
||||
<option name="resolveExternalAnnotations" value="false" />
|
||||
</GradleProjectSettings>
|
||||
</option>
|
||||
</component>
|
||||
|
10
DEV4.5/ChatRelative/.idea/migrations.xml
generated
Normal file
10
DEV4.5/ChatRelative/.idea/migrations.xml
generated
Normal file
@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectMigrations">
|
||||
<option name="MigrateToGradleLocalJavaHome">
|
||||
<set>
|
||||
<option value="$PROJECT_DIR$" />
|
||||
</set>
|
||||
</option>
|
||||
</component>
|
||||
</project>
|
3
DEV4.5/ChatRelative/.idea/misc.xml
generated
3
DEV4.5/ChatRelative/.idea/misc.xml
generated
@ -1,6 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ExternalStorageConfigurationManager" enabled="true" />
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" project-jdk-name="jbr-17" project-jdk-type="JavaSDK">
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="jbr-17" project-jdk-type="JavaSDK">
|
||||
<output url="file://$PROJECT_DIR$/build/classes" />
|
||||
</component>
|
||||
<component name="ProjectType">
|
||||
|
@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
|
||||
<mapping directory="$PROJECT_DIR$/../.." vcs="Git" />
|
||||
</component>
|
||||
</project>
|
3
DEV4.5/Fleche/.idea/gradle.xml
generated
3
DEV4.5/Fleche/.idea/gradle.xml
generated
@ -4,9 +4,8 @@
|
||||
<component name="GradleSettings">
|
||||
<option name="linkedExternalProjectsSettings">
|
||||
<GradleProjectSettings>
|
||||
<option name="testRunner" value="GRADLE" />
|
||||
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
||||
<option name="gradleJvm" value="Embedded JDK" />
|
||||
<option name="gradleJvm" value="jbr-17" />
|
||||
<option name="modules">
|
||||
<set>
|
||||
<option value="$PROJECT_DIR$" />
|
||||
|
10
DEV4.5/Gribouillage/.idea/deploymentTargetDropDown.xml
generated
Normal file
10
DEV4.5/Gribouillage/.idea/deploymentTargetDropDown.xml
generated
Normal file
@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="deploymentTargetDropDown">
|
||||
<value>
|
||||
<entry key="app">
|
||||
<State />
|
||||
</entry>
|
||||
</value>
|
||||
</component>
|
||||
</project>
|
4
DEV4.5/Gribouillage/.idea/gradle.xml
generated
4
DEV4.5/Gribouillage/.idea/gradle.xml
generated
@ -4,15 +4,15 @@
|
||||
<component name="GradleSettings">
|
||||
<option name="linkedExternalProjectsSettings">
|
||||
<GradleProjectSettings>
|
||||
<option name="testRunner" value="GRADLE" />
|
||||
<option name="distributionType" value="DEFAULT_WRAPPED" />
|
||||
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
||||
<option name="gradleJvm" value="#GRADLE_LOCAL_JAVA_HOME" />
|
||||
<option name="modules">
|
||||
<set>
|
||||
<option value="$PROJECT_DIR$" />
|
||||
<option value="$PROJECT_DIR$/app" />
|
||||
</set>
|
||||
</option>
|
||||
<option name="resolveExternalAnnotations" value="false" />
|
||||
</GradleProjectSettings>
|
||||
</option>
|
||||
</component>
|
||||
|
10
DEV4.5/Gribouillage/.idea/migrations.xml
generated
Normal file
10
DEV4.5/Gribouillage/.idea/migrations.xml
generated
Normal file
@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectMigrations">
|
||||
<option name="MigrateToGradleLocalJavaHome">
|
||||
<set>
|
||||
<option value="$PROJECT_DIR$" />
|
||||
</set>
|
||||
</option>
|
||||
</component>
|
||||
</project>
|
2
DEV4.5/Gribouillage/.idea/misc.xml
generated
2
DEV4.5/Gribouillage/.idea/misc.xml
generated
@ -1,6 +1,6 @@
|
||||
<project version="4">
|
||||
<component name="ExternalStorageConfigurationManager" enabled="true" />
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" project-jdk-name="jbr-17" project-jdk-type="JavaSDK">
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="jbr-17" project-jdk-type="JavaSDK">
|
||||
<output url="file://$PROJECT_DIR$/build/classes" />
|
||||
</component>
|
||||
<component name="ProjectType">
|
||||
|
6
DEV4.5/Gribouillage/.idea/vcs.xml
generated
Normal file
6
DEV4.5/Gribouillage/.idea/vcs.xml
generated
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="$PROJECT_DIR$/../.." vcs="Git" />
|
||||
</component>
|
||||
</project>
|
15
DEV4.5/Pois/.gitignore
vendored
Normal file
15
DEV4.5/Pois/.gitignore
vendored
Normal file
@ -0,0 +1,15 @@
|
||||
*.iml
|
||||
.gradle
|
||||
/local.properties
|
||||
/.idea/caches
|
||||
/.idea/libraries
|
||||
/.idea/modules.xml
|
||||
/.idea/workspace.xml
|
||||
/.idea/navEditor.xml
|
||||
/.idea/assetWizardSettings.xml
|
||||
.DS_Store
|
||||
/build
|
||||
/captures
|
||||
.externalNativeBuild
|
||||
.cxx
|
||||
local.properties
|
0
DEV4.5/.idea/.gitignore → DEV4.5/Pois/.idea/.gitignore
generated
vendored
0
DEV4.5/.idea/.gitignore → DEV4.5/Pois/.idea/.gitignore
generated
vendored
23
DEV4.5/Pois/.idea/deploymentTargetDropDown.xml
generated
Normal file
23
DEV4.5/Pois/.idea/deploymentTargetDropDown.xml
generated
Normal file
@ -0,0 +1,23 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="deploymentTargetDropDown">
|
||||
<value>
|
||||
<entry key="app">
|
||||
<State>
|
||||
<runningDeviceTargetSelectedWithDropDown>
|
||||
<Target>
|
||||
<type value="RUNNING_DEVICE_TARGET" />
|
||||
<deviceKey>
|
||||
<Key>
|
||||
<type value="SERIAL_NUMBER" />
|
||||
<value value="CIWGA6TOTWYL8TNZ" />
|
||||
</Key>
|
||||
</deviceKey>
|
||||
</Target>
|
||||
</runningDeviceTargetSelectedWithDropDown>
|
||||
<timeTargetWasSelectedWithDropDown value="2024-02-29T12:51:46.113627200Z" />
|
||||
</State>
|
||||
</entry>
|
||||
</value>
|
||||
</component>
|
||||
</project>
|
@ -3,15 +3,15 @@
|
||||
<component name="GradleSettings">
|
||||
<option name="linkedExternalProjectsSettings">
|
||||
<GradleProjectSettings>
|
||||
<option name="testRunner" value="GRADLE" />
|
||||
<option name="distributionType" value="DEFAULT_WRAPPED" />
|
||||
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
||||
<option name="gradleJvm" value="#GRADLE_LOCAL_JAVA_HOME" />
|
||||
<option name="modules">
|
||||
<set>
|
||||
<option value="$PROJECT_DIR$" />
|
||||
<option value="$PROJECT_DIR$/app" />
|
||||
</set>
|
||||
</option>
|
||||
<option name="resolveExternalAnnotations" value="false" />
|
||||
</GradleProjectSettings>
|
||||
</option>
|
||||
</component>
|
10
DEV4.5/Pois/.idea/migrations.xml
generated
Normal file
10
DEV4.5/Pois/.idea/migrations.xml
generated
Normal file
@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectMigrations">
|
||||
<option name="MigrateToGradleLocalJavaHome">
|
||||
<set>
|
||||
<option value="$PROJECT_DIR$" />
|
||||
</set>
|
||||
</option>
|
||||
</component>
|
||||
</project>
|
@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ExternalStorageConfigurationManager" enabled="true" />
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" project-jdk-name="jbr-17" project-jdk-type="JavaSDK">
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="jbr-17" project-jdk-type="JavaSDK">
|
||||
<output url="file://$PROJECT_DIR$/build/classes" />
|
||||
</component>
|
||||
<component name="ProjectType">
|
6
DEV4.5/Pois/.idea/vcs.xml
generated
Normal file
6
DEV4.5/Pois/.idea/vcs.xml
generated
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="$PROJECT_DIR$/../.." vcs="Git" />
|
||||
</component>
|
||||
</project>
|
39
DEV4.5/Pois/app/build.gradle.kts
Normal file
39
DEV4.5/Pois/app/build.gradle.kts
Normal file
@ -0,0 +1,39 @@
|
||||
plugins {
|
||||
id("com.android.application")
|
||||
}
|
||||
|
||||
android {
|
||||
namespace = "com.example.pois"
|
||||
compileSdk = 34
|
||||
|
||||
defaultConfig {
|
||||
applicationId = "com.example.pois"
|
||||
minSdk = 19
|
||||
targetSdk = 34
|
||||
versionCode = 1
|
||||
versionName = "1.0"
|
||||
|
||||
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
||||
}
|
||||
|
||||
buildTypes {
|
||||
release {
|
||||
isMinifyEnabled = false
|
||||
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
|
||||
}
|
||||
}
|
||||
compileOptions {
|
||||
sourceCompatibility = JavaVersion.VERSION_1_8
|
||||
targetCompatibility = JavaVersion.VERSION_1_8
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
|
||||
implementation("androidx.appcompat:appcompat:1.6.1")
|
||||
implementation("com.google.android.material:material:1.11.0")
|
||||
implementation("androidx.constraintlayout:constraintlayout:2.1.4")
|
||||
testImplementation("junit:junit:4.13.2")
|
||||
androidTestImplementation("androidx.test.ext:junit:1.1.5")
|
||||
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
package com.example.choix;
|
||||
package com.example.pois;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
@ -21,6 +21,6 @@ public class ExampleInstrumentedTest {
|
||||
public void useAppContext() {
|
||||
// Context of the app under test.
|
||||
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
|
||||
assertEquals("com.example.choix", appContext.getPackageName());
|
||||
assertEquals("com.example.pois", appContext.getPackageName());
|
||||
}
|
||||
}
|
@ -10,7 +10,7 @@
|
||||
android:label="@string/app_name"
|
||||
android:roundIcon="@mipmap/ic_launcher_round"
|
||||
android:supportsRtl="true"
|
||||
android:theme="@style/Theme.Choix"
|
||||
android:theme="@style/Theme.Pois"
|
||||
tools:targetApi="31">
|
||||
<activity
|
||||
android:name=".MainActivity"
|
@ -1,9 +1,8 @@
|
||||
package com.example.choix;
|
||||
package com.example.pois;
|
||||
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.view.View;
|
||||
|
||||
public class MainActivity extends AppCompatActivity {
|
||||
|
||||
@ -11,5 +10,9 @@ public class MainActivity extends AppCompatActivity {
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.activity_main);
|
||||
Pois p = findViewById(R.id.pois);
|
||||
PoisListener PL = new PoisListener();
|
||||
p.setOnTouchListener(PL);
|
||||
p.PL = PL;
|
||||
}
|
||||
}
|
25
DEV4.5/Pois/app/src/main/java/com/example/pois/Pointeur.java
Normal file
25
DEV4.5/Pois/app/src/main/java/com/example/pois/Pointeur.java
Normal file
@ -0,0 +1,25 @@
|
||||
package com.example.pois;
|
||||
|
||||
import android.graphics.Color;
|
||||
import android.graphics.Paint;
|
||||
import android.view.MotionEvent;
|
||||
|
||||
public class Pointeur {
|
||||
|
||||
Paint p;
|
||||
MotionEvent e;
|
||||
Integer id;
|
||||
|
||||
public Pointeur(MotionEvent e, Integer id) {
|
||||
Paint pTemp = new Paint();
|
||||
pTemp.setColor(getRandomColor());
|
||||
pTemp.setStyle(Paint.Style.FILL);
|
||||
this.p = pTemp;
|
||||
this.e = e;
|
||||
this.id = id;
|
||||
}
|
||||
private int getRandomColor() {
|
||||
return Color.rgb((int) (Math.random() * 255), (int) (Math.random() * 255), (int) (Math.random() * 255));
|
||||
}
|
||||
}
|
||||
|
28
DEV4.5/Pois/app/src/main/java/com/example/pois/Pois.java
Normal file
28
DEV4.5/Pois/app/src/main/java/com/example/pois/Pois.java
Normal file
@ -0,0 +1,28 @@
|
||||
package com.example.pois;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Canvas;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
|
||||
public class Pois extends View {
|
||||
|
||||
|
||||
public PoisListener PL;
|
||||
|
||||
public Pois(Context context, AttributeSet attrs) {
|
||||
super(context,attrs);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void onDraw(Canvas c){
|
||||
super.onDraw(c);
|
||||
for(Pointeur point : PL.p.values()) {
|
||||
c.drawCircle( PL.getX(point), PL.getY(point), 50, point.p);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,59 @@
|
||||
package com.example.pois;
|
||||
|
||||
import android.graphics.Color;
|
||||
import android.graphics.Paint;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.view.View.OnTouchListener;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
|
||||
public class PoisListener implements OnTouchListener {
|
||||
|
||||
public HashMap<Integer , Pointeur> p;
|
||||
|
||||
public PoisListener() {
|
||||
super();
|
||||
this.p = new HashMap<>();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onTouch(View v, MotionEvent event) {
|
||||
int action = event.getActionMasked();
|
||||
int pointerIndex = event.getActionIndex();
|
||||
int pointerId = event.getPointerId(pointerIndex);
|
||||
|
||||
|
||||
switch (action) {
|
||||
case MotionEvent.ACTION_DOWN:
|
||||
case MotionEvent.ACTION_POINTER_DOWN:
|
||||
|
||||
p.put(pointerId, new Pointeur(event,pointerId));
|
||||
break;
|
||||
case MotionEvent.ACTION_MOVE:
|
||||
break;
|
||||
case MotionEvent.ACTION_UP:
|
||||
case MotionEvent.ACTION_POINTER_UP:
|
||||
case MotionEvent.ACTION_CANCEL:
|
||||
p.remove(pointerId);
|
||||
break;
|
||||
}
|
||||
v.invalidate(); // Trigger redraw
|
||||
return true;
|
||||
}
|
||||
|
||||
public float getX(Pointeur p) {
|
||||
int pointerIndex = p.e.findPointerIndex(p.id);
|
||||
// Get the pointer's current position.
|
||||
return p.e.getX(pointerIndex);
|
||||
}
|
||||
public float getY(Pointeur p) {
|
||||
int pointerIndex = p.e.findPointerIndex(p.id);
|
||||
// Get the pointer's current position.
|
||||
return p.e.getY(pointerIndex);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
14
DEV4.5/Pois/app/src/main/res/layout/activity_main.xml
Normal file
14
DEV4.5/Pois/app/src/main/res/layout/activity_main.xml
Normal file
@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="@color/black"
|
||||
tools:context=".MainActivity">
|
||||
|
||||
<com.example.pois.Pois
|
||||
android:id="@+id/pois"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent" />
|
||||
|
||||
</RelativeLayout>
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.8 KiB |
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user