class ImageSlider(QWidget): def __init__(self): super().__init__() # setting title self.setWindowTitle("Python ") self.setGeometry(600, 600, 900, 300) self.hbox = QHBoxLayout() self.list_widget = QListWidget() # self.list_widget.setGeometry(50, 70, 300, 150) # item1.setIcon(QIcon("key_icon.ico")) self.items = [] # for i in range(20): # self.items.append(QListWidgetItem(str(i))) # self.list_widget.addItem(self.items[i]) # if(i%2 == 0): # self.items[i].setIcon(QIcon("thumbnail.jpg")) # else: # self.items[i].setIcon(QIcon("1.jpg")) # setting flow self.list_widget.setFlow(QListView.LeftToRight) self.list_widget.setIconSize(QtCore.QSize(190, 190)) self.list_widget.hasAutoScroll() self.list_widget.setAutoFillBackground(False) self.pic = QPushButton() self.pic.clicked.connect(lambda: self.goleftSmooth()) self.pic.setGeometry(10, 10, 50, 50) #use full ABSOLUTE path to the image, not relative self.pic.setIcon(QIcon("left.png")) self.hbox.addWidget(self.pic) self.hbox.addWidget(self.list_widget) self.pic2 = QPushButton() self.pic2.clicked.connect(lambda: self.gorightSmooth()) self.pic2.setGeometry(10, 10, 50, 50) #use full ABSOLUTE path to the image, not relative self.pic2.setIcon(QIcon("right.png")) self.hbox.addWidget(self.pic2) self.list_widget.horizontalScrollBar().setDisabled(True) self.list_widget.horizontalScrollBar().hide() self.list_widget.verticalScrollBar().setDisabled(True) self.list_widget.verticalScrollBar().hide() self.list_widget.setHorizontalScrollMode( QAbstractItemView.ScrollPerPixel) self.setLayout(self.hbox) self.atCurrentRight = 16 self.atCurrentLeft = 0 self.timerBaseInterval = 25 self.floorInterval = 5 self.timer = QTimer(self) self.timer.setInterval(self.timerBaseInterval) self.timer.timeout.connect(self.goRight) self.timer2 = QTimer(self) self.timer2.setInterval(self.timerBaseInterval) self.timer2.timeout.connect(self.goLeft) self.rightCounter = 0 self.leftCounter = 0 self.incrementalStep = 2 self.counterSize = 410 self.lingertime = 1 self.lingertimeCounter = 0 # self.list_widget.itemPressed.connect(lambda: self.test()) self.show() # def test(self): # print(self.list_widget.selectedItems()[0].url) #Takes list of images and adds them to the image container of this class def setImages(self, images, urls, movieIDs, titles): self.list_widget.clear() self.items = [] for i in range(len(images)): self.items.append(ClickableThumbnail(urls[i], movieIDs[i])) self.items[i].setText(titles[i]) self.list_widget.addItem(self.items[i]) pm = QPixmap() pm.loadFromData(base64.b64decode(images[i])) ic = QIcon() ic.addPixmap(pm) if (ic.isNull() == False): self.items[i].setIcon(ic) #movies images to the right to slide left by initiating a timer that moves the images smoothly by pixels def goleftSmooth(self): self.timer2.start() self.pic.setDisabled(True) self.pic2.setDisabled(True) #movies images to the left to slide right by initiating a timer that moves the images smoothly by pixels def gorightSmooth(self): self.timer.start() self.pic.setDisabled(True) self.pic2.setDisabled(True) #Function that timer2 uses to movie images right #It works by modifying the timer interval (time needed until this function is called again) #starts by high time interval to low then to high (slow fast slow) def goLeft(self): if (self.leftCounter != self.counterSize): if (self.leftCounter < math.ceil(self.counterSize * 0.4)): if (self.lingertime > self.lingertimeCounter): self.lingertimeCounter += 1 else: if (self.timer2.interval() > self.floorInterval): self.timer2.setInterval(self.timer2.interval() - 1) self.lingertime = self.timerBaseInterval - self.timer2.interval( ) self.lingertimeCounter = 5 elif (self.leftCounter > self.counterSize - math.ceil(self.counterSize * 0.4)): if (self.lingertime > self.lingertimeCounter): self.lingertimeCounter += 1 else: if (self.timer2.interval() < self.timerBaseInterval): self.timer2.setInterval(self.timer2.interval() + 1) self.lingertime = self.timerBaseInterval - self.timer2.interval( ) self.lingertimeCounter = 5 self.list_widget.horizontalScrollBar().setValue( self.list_widget.horizontalScrollBar().value() - self.incrementalStep) self.leftCounter += 1 self.repaint() if (self.leftCounter == math.ceil(self.counterSize / 2)): self.lingertimeCounter = 5 self.lingertime = self.timerBaseInterval else: self.timer2.setInterval(self.timerBaseInterval) self.leftCounter = 0 self.timer2.stop() self.pic.setEnabled(True) self.pic2.setEnabled(True) if (self.list_widget.horizontalScrollBar().value() == 0): self.timer2.setInterval(self.timerBaseInterval) self.leftCounter = 0 self.timer2.stop() self.pic.setEnabled(True) self.pic2.setEnabled(True) #functions similarly to goLeft but adds scrolls to the right by adding pixels to the scrollbar value rather than subtracting #TODO: integrate goleft and goright into 1 function, no need for 2 def goRight(self): # print(self.timer.interval()) if (self.rightCounter != self.counterSize): if (self.rightCounter < math.ceil(self.counterSize * 0.4)): if (self.lingertime > self.lingertimeCounter): self.lingertimeCounter += 1 else: if (self.timer.interval() > self.floorInterval): self.timer.setInterval(self.timer.interval() - 1) self.lingertime = self.timerBaseInterval - self.timer.interval( ) self.lingertimeCounter = 5 elif (self.rightCounter > self.counterSize - math.ceil(self.counterSize * 0.4)): if (self.lingertime > self.lingertimeCounter): self.lingertimeCounter += 1 else: if (self.timer.interval() < self.timerBaseInterval): self.timer.setInterval(self.timer.interval() + 1) self.lingertime = self.timerBaseInterval - self.timer.interval( ) self.lingertimeCounter = 5 self.list_widget.horizontalScrollBar().setValue( self.list_widget.horizontalScrollBar().value() + self.incrementalStep) self.rightCounter += 1 self.repaint() if (self.rightCounter == math.ceil(self.counterSize / 2)): self.lingertimeCounter = 5 self.lingertime = self.timerBaseInterval else: self.timer.setInterval(self.timerBaseInterval) self.rightCounter = 0 self.timer.stop() self.pic.setEnabled(True) self.pic2.setEnabled(True) if (self.list_widget.horizontalScrollBar().value() == self.list_widget.horizontalScrollBar().maximum()): self.timer.setInterval(self.timerBaseInterval) self.rightCounter = 0 self.timer.stop() self.pic.setEnabled(True) self.pic2.setEnabled(True)
class CourseMovieLayout(QWidget): goback_request = pyqtSignal(int) new_movie_request = pyqtSignal(int) _WatchMovie_ = pyqtSignal(str, int) def __init__(self, user: User, courseID): super().__init__() self.list_widget = QListWidget() self.user = user self.courseID = courseID self.controller = CourseMovieController(self.user) # self.list_widget.setFlow(QListView.LeftToRight) self.list_widget.setIconSize(QSize(190, 190)) self.list_widget.hasAutoScroll() self.list_widget.setAutoFillBackground(False) self.items_title = self.user.courses self.Manager = MovieManagement() self.error = QLabel() self.movies = self.controller.getCMovies(self.courseID) self.titles = [] self.thumbnails = [] self.urls = [] self.movieIDs = [] if (len(self.movies) != 0): for i, j, k, w in self.movies: self.titles.append(i) self.thumbnails.append(j) self.urls.append(k) self.movieIDs.append(w) self.setImages(self.thumbnails, self.urls, self.titles, self.movieIDs) else: self.error.setText("Course Has No Movies") self.back = QPushButton("Back") self.back.clicked.connect(lambda: self.BACK()) self.vbox = QVBoxLayout() self.vbox.addWidget(self.list_widget) self.vbox.addWidget(self.error) self.vbox.addWidget(self.back) if (isinstance(self.user, Professor) == True): self.add_movie = QPushButton("Add Movie") self.add_movie.clicked.connect( lambda: self.new_movie_request.emit(self.courseID)) self.vbox.addWidget(self.add_movie) self.setLayout(self.vbox) self.list_widget.itemPressed.connect(lambda: self.MovieIsClicked()) def MovieIsClicked(self): self._WatchMovie_.emit(self.list_widget.selectedItems()[0].url, self.list_widget.selectedItems()[0].movieID) def BACK(self): self.goback_request.emit(3) def setImages(self, images, urls, titles, movieIDs): self.list_widget.clear() self.items = [] for i in range(len(images)): self.items.append(ClickableThumbnail(urls[i], movieIDs[i])) self.items[i].setText(titles[i]) self.list_widget.addItem(self.items[i]) pm = QPixmap() pm.loadFromData(base64.b64decode(images[i])) ic = QIcon() ic.addPixmap(pm) if (ic.isNull() == False): self.items[i].setIcon(ic)
class DashboardLayout(QWidget): submitcourse_request = pyqtSignal() new_course_request = pyqtSignal() openCourse_request = pyqtSignal(int) new_movie_request = pyqtSignal() submitmovie_request = pyqtSignal() def __init__(self,user:User): super().__init__() self.__dashboard_grid = QGridLayout() self.user = user #ADD COURSE GUI self.add_course = QPushButton("Add Course") #enroll for student, create for professor self.add_course.clicked.connect(lambda:self.new_course_request.emit()) self.name = "" self.syllabus = "" self.__dashboard_grid.addWidget(self.add_course,1,1) self.movieProperties = [] #ADD MOVIE GUI self.list_widget = QListWidget() # self.list_widget.setFlow(QListView.LeftToRight) self.list_widget.setIconSize(QSize(190, 190)) self.list_widget.hasAutoScroll() self.list_widget.setAutoFillBackground( False ) self.items_title = self.user.courses self.items = [] if(isinstance(self.items_title, int) == False): for i in range(len(self.items_title)): self.items.append(ClickableThumbnail(self.items_title[i][1], 0)) self.items[i].setText((self.items_title[i][0])) self.list_widget.addItem(self.items[i]) self.controller = DashboardController(self.user) self.__dashboard_grid.addWidget(self.list_widget,2,1) self.message = QLabel("") self.__dashboard_grid.addWidget(self.message,3,1) self.courseInput = None self.setLayout(self.__dashboard_grid) self.list_widget.itemPressed.connect(lambda: self.CourseIsClicked()) # if len(self.courses)!=0: # for course in self.courses: # course.clicked.connect(lambda:self.load_course_request.emit(course.text())) #contacts controller to submit course, currently is professor's course upload feature def submitcourse(self): self.result = self.controller.addCourse(self.name, self.syllabus, self.user.id) #contacts controller to submit movie under name of of course, currently is for professor's movie upload feature def submitmovie(self): seg = re.split(" / ", self.name) #seg[0] is the course name, seg[1] is the movie name courseID = "" print(seg[0]) for i in self.controller.courses: print(i[0]) if (str(i[0]) == str(seg[0])): courseID = i[1] break #self.movieproperties index 0 is the url path and 1 is the thumbnail path self.result = self.controller.addMovie(seg[1], courseID, self.syllabus, self.user.id, self.movieProperties[0], self.movieProperties[1]) def CourseIsClicked(self): # self._WatchMovie_.emit(self.recommended_display.list_widget.selectedItems()[0].url) self.openCourse_request.emit(self.list_widget.selectedItems()[0].url)
class ImageSlider(QWidget): def __init__(self): super().__init__() # setting title self.setWindowTitle("Python ") self.setGeometry(1000, 1000, 2000, 100) stylesheett = """ QPushbutton{ height: 50px; width: 50px; background-color: rgb(54,57,63); background-image: url("./Images/left.png"); } QPushbutton#pic:hover{ background-color: rgb(54,57,63); background-image: url("./Images/left_hover.png"); } QPushbutton#pic2{ height: 50px; width: 50px; background-color: rgb(54,57,63); background-image: url("./Images/right.png"); } QPushbutton#pic2:hover{ background-color: rgb(54,57,63); background-image: url("./Images/right_hover.png"); } """ self.setStyleSheet(stylesheett) self.hbox = QHBoxLayout() self.list_widget = QListWidget() self.items = [] # setting flow self.list_widget.setFlow(QListView.LeftToRight) self.list_widget.setIconSize(QtCore.QSize(190, 190)) self.list_widget.hasAutoScroll() self.list_widget.setAutoFillBackground(False) self.pic = QPushButton() self.pic.setObjectName("pic") self.pic.clicked.connect(lambda: self.goleftSmooth()) #use full ABSOLUTE path to the image, not relative self.hbox.addWidget(self.pic) self.hbox.addWidget(self.list_widget) self.pic2 = QPushButton() self.pic2.setObjectName("pic2") self.pic2.clicked.connect(lambda: self.gorightSmooth()) self.hbox.addWidget(self.pic2) self.list_widget.horizontalScrollBar().setDisabled(True) self.list_widget.horizontalScrollBar().hide() self.list_widget.verticalScrollBar().setDisabled(True) self.list_widget.verticalScrollBar().hide() self.list_widget.setHorizontalScrollMode( QAbstractItemView.ScrollPerPixel) self.setLayout(self.hbox) self.atCurrentRight = 16 self.atCurrentLeft = 0 self.timerBaseInterval = 25 self.floorInterval = 5 self.timer = QTimer(self) self.timer.setInterval(self.timerBaseInterval) self.timer.timeout.connect(self.goRight) self.timer2 = QTimer(self) self.timer2.setInterval(self.timerBaseInterval) self.timer2.timeout.connect(self.goLeft) self.rightCounter = 0 self.leftCounter = 0 self.incrementalStep = 1 self.counterSize = 410 self.lingertime = 1 self.lingertimeCounter = 0 self.show() #Takes list of images and adds them to the image container of this class def setImages(self, images, urls, movieIDs, titles): self.list_widget.clear() self.items = [] self.list_widget.setViewMode(QListWidget.IconMode) # self.list_widget.setResizeMode(QListWidget.Adjust); # self.list_widget.setIconSize(QSize(150,150)); # self.list_widget.setAcceptDrops(True); # self.list_widget.setDragEnabled(False); for i in range(len(images)): self.items.append(ClickableThumbnail(urls[i], movieIDs[i])) self.items[i].setText(titles[i]) self.list_widget.addItem(self.items[i]) pm = QPixmap() pm.loadFromData(base64.b64decode(images[i])) ic = QIcon() pm = pm.scaled(QSize(220, 150), Qt.IgnoreAspectRatio) ic.addPixmap(pm) if (ic.isNull() == False): self.items[i].setIcon(ic) #movies images to the right to slide left by initiating a timer that moves the images smoothly by pixels def goleftSmooth(self): self.timer2.start() self.pic.setDisabled(True) self.pic2.setDisabled(True) #movies images to the left to slide right by initiating a timer that moves the images smoothly by pixels def gorightSmooth(self): self.timer.start() self.pic.setDisabled(True) self.pic2.setDisabled(True) #Function that timer2 uses to movie images right #It works by modifying the timer interval (time needed until this function is called again) #starts by high time interval to low then to high (slow fast slow) def goLeft(self): if (self.leftCounter != self.counterSize): if (self.leftCounter < math.ceil(self.counterSize * 0.4)): if (self.lingertime > self.lingertimeCounter): self.lingertimeCounter += 1 else: if (self.timer2.interval() > self.floorInterval): self.timer2.setInterval(self.timer2.interval() - 1) self.lingertime = self.timerBaseInterval - self.timer2.interval( ) self.lingertimeCounter = 5 elif (self.leftCounter > self.counterSize - math.ceil(self.counterSize * 0.4)): if (self.lingertime > self.lingertimeCounter): self.lingertimeCounter += 1 else: if (self.timer2.interval() < self.timerBaseInterval): self.timer2.setInterval(self.timer2.interval() + 1) self.lingertime = self.timerBaseInterval - self.timer2.interval( ) self.lingertimeCounter = 5 self.list_widget.horizontalScrollBar().setValue( self.list_widget.horizontalScrollBar().value() - self.incrementalStep) self.leftCounter += 1 self.repaint() if (self.leftCounter == math.ceil(self.counterSize / 2)): self.lingertimeCounter = 5 self.lingertime = self.timerBaseInterval else: self.timer2.setInterval(self.timerBaseInterval) self.leftCounter = 0 self.timer2.stop() self.pic.setEnabled(True) self.pic2.setEnabled(True) if (self.list_widget.horizontalScrollBar().value() == 0): self.timer2.setInterval(self.timerBaseInterval) self.leftCounter = 0 self.timer2.stop() self.pic.setEnabled(True) self.pic2.setEnabled(True) #functions similarly to goLeft but adds scrolls to the right by adding pixels to the scrollbar value rather than subtracting #TODO: integrate goleft and goright into 1 function, no need for 2 def goRight(self): # print(self.timer.interval()) if (self.rightCounter != self.counterSize): if (self.rightCounter < math.ceil(self.counterSize * 0.4)): if (self.lingertime > self.lingertimeCounter): self.lingertimeCounter += 1 else: if (self.timer.interval() > self.floorInterval): self.timer.setInterval(self.timer.interval() - 1) self.lingertime = self.timerBaseInterval - self.timer.interval( ) self.lingertimeCounter = 5 elif (self.rightCounter > self.counterSize - math.ceil(self.counterSize * 0.4)): if (self.lingertime > self.lingertimeCounter): self.lingertimeCounter += 1 else: if (self.timer.interval() < self.timerBaseInterval): self.timer.setInterval(self.timer.interval() + 1) self.lingertime = self.timerBaseInterval - self.timer.interval( ) self.lingertimeCounter = 5 self.list_widget.horizontalScrollBar().setValue( self.list_widget.horizontalScrollBar().value() + self.incrementalStep) self.rightCounter += 1 self.repaint() if (self.rightCounter == math.ceil(self.counterSize / 2)): self.lingertimeCounter = 5 self.lingertime = self.timerBaseInterval else: self.timer.setInterval(self.timerBaseInterval) self.rightCounter = 0 self.timer.stop() self.pic.setEnabled(True) self.pic2.setEnabled(True) if (self.list_widget.horizontalScrollBar().value() == self.list_widget.horizontalScrollBar().maximum()): self.timer.setInterval(self.timerBaseInterval) self.rightCounter = 0 self.timer.stop() self.pic.setEnabled(True) self.pic2.setEnabled(True)