added settings, changed layout, added thumbnail saving

This commit is contained in:
Maxim Stewart 2019-05-19 02:19:11 -05:00
parent 54214389ce
commit d18922c650
26 changed files with 581 additions and 127 deletions

View File

@ -1,15 +1,17 @@
# GWinWrap
GWinWrap is a Gtk with Python gui to select videos for XWinWrap, images for Nitrogen Wallpaper Manager, and gifs for Gifsicle.
GWinWrap is a Gtk wpic2ith Python gui to select videos for XWinWrap, images for Nitrogen Wallpaper Manager, and gifs for Gifsicle.
It includes the XWinWrap binary and source code for Shantanu Goel's version of XWinWrap.
# Notes
Need python 2+
# Images
![Default view starting out](images/pic1.png)
![Video thumbnails in image grid. Path to directory highlighted purple](images/pic2.png)
![Image thumbnails in image grid with xscreensaver checked](images/pic3.png)
![Image in preview popup](images/pic4.png)
![1 Default view starting out. ](images/pic1.png)
![2 Video thumbnails in image grid. Path to directory highlighted purple. ](images/pic2.png)
![3 Image thumbnails in image grid. ](images/pic3.png)
![4 Image in preview popup. ](images/pic4.png)
![5 Xscreensaver preview running. ](images/pic5.png)
![6 Settings window poped open. ](images/pic6.png)
# TODO
Nothing...

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 479 KiB

After

Width:  |  Height:  |  Size: 479 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 637 KiB

After

Width:  |  Height:  |  Size: 577 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 MiB

After

Width:  |  Height:  |  Size: 486 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 MiB

After

Width:  |  Height:  |  Size: 2.3 MiB

BIN
python/images/pic5.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 944 KiB

BIN
python/images/pic6.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 442 KiB

View File

@ -1,20 +1,17 @@
#!/usr/bin/env python
import os, cairo, sys, gi, re, threading, subprocess
import os, cairo, sys, gi, re, threading, subprocess, hashlib
gi.require_version('Gtk', '3.0')
gi.require_version('Gdk', '3.0')
from gi.repository import Gtk as gtk
from gi.repository import Gdk as gdk
from gi.repository import GObject as gobject
from gi.repository import GdkPixbuf
from gi.repository import Gtk as gtk, Gdk as gdk, GObject as gobject, GdkPixbuf
from os import listdir
from os.path import isfile, join
from threading import Thread
from utils import SaveState
from utils import SaveStateToXWinWarp, SaveGWinWrapSettings
gdk.threads_init()
@ -36,6 +33,13 @@ class GWinWrap:
self.window.set_app_paintable(True)
self.window.connect("draw", self.area_draw)
# bind css file
cssProvider = gtk.CssProvider()
cssProvider.load_from_path('resources/stylesheet.css')
screen = gdk.Screen.get_default()
styleContext = gtk.StyleContext()
styleContext.add_provider_for_screen(screen, cssProvider, gtk.STYLE_PROVIDER_PRIORITY_USER)
# Add filter to allow only folders to be selected
dialog = self.builder.get_object("selectedDirDialog")
filefilter = self.builder.get_object("Folders")
@ -44,7 +48,9 @@ class GWinWrap:
# Get reference to remove and add it back...
self.gridLabel = self.builder.get_object("gridLabel")
self.stateSaver = SaveState()
self.stateSaver = SaveStateToXWinWarp()
self.sttngsSver = SaveGWinWrapSettings()
self.focusedImg = gtk.Image()
self.usrHome = os.path.expanduser('~')
self.xScreenVal = None
@ -70,6 +76,11 @@ class GWinWrap:
for file in list:
xscreenList.append((file,))
self.selectedImg = None # EventBox holder
self.player = None
self.imgVwr = None
self.retrieveSettings()
self.window.show()
def area_draw(self, widget, cr):
@ -86,19 +97,18 @@ class GWinWrap:
Thread(target=self.newDir, args=(dir,)).start()
def newDir(self, dir):
imageGrid = self.builder.get_object("imageGrid")
dirPath = dir
list = [f for f in listdir(dirPath) if isfile(join(dirPath, f))]
files = []
row = 0
col = 0
imageGrid = self.builder.get_object("imageGrid")
dirPath = dir
list = [f for f in listdir(dirPath) if isfile(join(dirPath, f))]
files = []
row = 0
col = 0
for file in list:
if file.lower().endswith(('.mkv', '.avi', '.flv', '.mov', '.m4v', '.mpg', '.wmv', '.mpeg', '.mp4', '.webm', '.png', '.jpg', '.jpeg', '.gif')):
files.append(file)
fractionTick = 1.0 / len(files)
fractionTick = 1.0 / 1.0 if len(files) == 0 else len(files)
tickCount = 0.0
self.clear()
imageGrid.remove_column(0)
@ -111,16 +121,20 @@ class GWinWrap:
thumbnl = gtk.Image()
if file.lower().endswith(('.mkv', '.avi', '.flv', '.mov', '.m4v', '.mpg', '.wmv', '.mpeg', '.mp4', '.webm')):
self.generateThumbnail(fullPathFile)
thumbnl = self.createGtkImage("/tmp/image.png", [310, 310])
eveBox.connect("button_press_event", self.runMplayerProcess, (fullPathFile, file,))
eveBox.connect("enter_notify_event", self.mouseOver, (fullPathFile, file))
eveBox.connect("leave_notify_event", self.mouseOut, (fullPathFile, file))
fileHash = hashlib.sha256(str.encode(fullPathFile)).hexdigest()
hashImgpth = self.usrHome + "/.thumbnails/normal/" + fileHash + ".png"
if os.path.isfile(hashImgpth) == False:
self.generateThumbnail(fullPathFile, hashImgpth)
thumbnl = self.createGtkImage(hashImgpth, [310, 310])
eveBox.connect("button_press_event", self.runMplayerProcess, (fullPathFile, file, eveBox,))
eveBox.connect("enter_notify_event", self.mouseOver, ())
eveBox.connect("leave_notify_event", self.mouseOut, ())
elif file.lower().endswith(('.png', '.jpg', '.jpeg', '.gif')):
thumbnl = self.createGtkImage(fullPathFile, [310, 310])
eveBox.connect("button_press_event", self.runImageViewerProcess, (fullPathFile, file))
eveBox.connect("enter_notify_event", self.mouseOver, (fullPathFile, file))
eveBox.connect("leave_notify_event", self.mouseOut, (fullPathFile, file))
eveBox.connect("button_press_event", self.runImageViewerProcess, (fullPathFile, file, eveBox,))
eveBox.connect("enter_notify_event", self.mouseOver, ())
eveBox.connect("leave_notify_event", self.mouseOut, ())
else:
print("Not a video or image file.")
return
@ -145,8 +159,8 @@ class GWinWrap:
def addToGrid(self, args):
args[0].attach(args[1], args[2], args[3], 1, 1)
def generateThumbnail(self, fullPathFile):
subprocess.call(["ffmpegthumbnailer", "-t", "65%", "-s", "300", "-c", "jpg", "-i", fullPathFile, "-o", "/tmp/image.png"])
def generateThumbnail(self, fullPathFile, hashImgpth):
subprocess.call(["ffmpegthumbnailer", "-t", "65%", "-s", "300", "-c", "jpg", "-i", fullPathFile, "-o", hashImgpth])
def createGtkImage(self, path, wxh):
try:
@ -158,17 +172,26 @@ class GWinWrap:
return gtk.Image.new_from_pixbuf(pixbuf)
except Exception as e:
print(e)
return gtk.Image()
def runMplayerProcess(self, widget, eve, params):
self.setSelected(params[2])
video = params[0] #.replace(" ", "\\ ")
if eve.type == gdk.EventType.DOUBLE_BUTTON_PRESS:
subprocess.call(["mplayer", "-really-quiet", "-ao", "null", "-loop", "0", params[0]])
subprocess.call([self.player, video, "-really-quiet", "-ao", "null", "-loop", "0"])
self.toSavePath = params[0]
self.applyType = 1
self.helpLabel.set_markup("<span foreground=\"#e0cc64\">" + params[1] + "</span>")
def openMainImageViewer(self, widget):
subprocess.call([self.imgVwr, self.toSavePath])
def runImageViewerProcess(self, widget, eve, params):
self.setSelected(params[2])
if eve.type == gdk.EventType.DOUBLE_BUTTON_PRESS:
previewWindow = self.builder.get_object("previewWindow")
previewImg = self.builder.get_object("previewImg")
@ -180,22 +203,25 @@ class GWinWrap:
self.applyType = 2
self.helpLabel.set_markup("<span foreground=\"#e0cc64\">" + params[1] + "</span>")
def openMainImageViewer(self, widget):
subprocess.call(["xdg-open", self.toSavePath])
def setSelected(self, eveBox):
if self.selectedImg:
col = gdk.RGBA(0.0, 0.0, 0.0, 0.0)
self.selectedImg.override_background_color(gtk.StateType.NORMAL, col)
col = gdk.RGBA(0.9, 0.7, 0.4, 0.74)
eveBox.override_background_color(gtk.StateType.NORMAL, col)
self.selectedImg = eveBox
def closePopup(self, widget):
previewWindow = self.builder.get_object("previewWindow")
previewWindow.popdown()
self.builder.get_object("previewWindow").popdown()
def mouseOver(self, widget, eve, args):
pass
# hand_cursor = gdk.Cursor(gdk.CursorType.GDK_HAND2)
# self.window.get_window().set_cursor(hand_cursor)
hand_cursor = gdk.Cursor(gdk.CursorType.HAND2)
self.window.get_window().set_cursor(hand_cursor)
def mouseOut(self, widget, eve, args):
pass
# watch_cursor = gdk.Cursor(gdk.CursorType.GDK_LEFT_PTR)
# self.window.get_window().set_cursor(watch_cursor)
watch_cursor = gdk.Cursor(gdk.CursorType.LEFT_PTR)
self.window.get_window().set_cursor(watch_cursor)
def toggleXscreenUsageField(self, widget, data=None):
useXscreenSaver = self.builder.get_object("useXScrnList")
@ -204,6 +230,21 @@ class GWinWrap:
else:
self.builder.get_object("xScreenSvrList").set_sensitive(False)
def popSttingsWindow(self, widget):
self.builder.get_object("settingsWindow").popup()
def saveToSettingsFile(self, widget):
self.player = self.builder.get_object("customVideoPlyr").get_text().strip()
self.imgVwr = self.builder.get_object("customImgVwr").get_text().strip()
self.sttngsSver.saveSettings(self.player, self.imgVwr)
def retrieveSettings(self):
data = self.sttngsSver.retrieveSettings()
self.player = data[0]
self.imgVwr = data[1]
self.builder.get_object("customVideoPlyr").set_text(self.player)
self.builder.get_object("customImgVwr").set_text(self.imgVwr)
def saveToFile(self, widget, data=None):
saveLoc = self.builder.get_object("saveLoc").get_active_text()
useXscreenSaver = self.builder.get_object("useXScrnList").get_active()

View File

@ -37,12 +37,25 @@
<property name="stock">gtk-jump-to</property>
<property name="icon_size">3</property>
</object>
<object class="GtkImage" id="saveImag">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-save</property>
<property name="icon_size">3</property>
</object>
<object class="GtkImage" id="saveImage">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-save</property>
<property name="icon_size">3</property>
</object>
<object class="GtkImage" id="settingsImage">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="tooltip_text" translatable="yes">Settings....</property>
<property name="stock">gtk-properties</property>
<property name="icon_size">3</property>
</object>
<object class="GtkImage" id="startImage">
<property name="visible">True</property>
<property name="can_focus">False</property>
@ -63,7 +76,7 @@
<property name="window_position">center</property>
<property name="default_width">950</property>
<property name="default_height">600</property>
<property name="icon">GWinWrap.png</property>
<property name="icon">icons/GWinWrap.png</property>
<property name="gravity">center</property>
<child>
<placeholder/>
@ -98,22 +111,6 @@
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton">
<property name="label" translatable="yes">Clear</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="image">clearImage</property>
<property name="always_show_image">True</property>
<signal name="clicked" handler="clearSelection" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkFileChooserButton" id="selectedDirDialog">
<property name="visible">True</property>
@ -127,6 +124,21 @@
<property name="title" translatable="yes">Dream Scene / Image Dir</property>
<signal name="file-set" handler="setNewDir" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="image">settingsImage</property>
<property name="always_show_image">True</property>
<signal name="clicked" handler="popSttingsWindow" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
@ -140,6 +152,18 @@
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkProgressBar" id="loadProgress">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="show_text">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow">
<property name="visible">True</property>
@ -182,19 +206,23 @@
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkProgressBar" id="loadProgress">
<object class="GtkButton">
<property name="label" translatable="yes">Clear</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="show_text">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="image">clearImage</property>
<property name="always_show_image">True</property>
<signal name="clicked" handler="clearSelection" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
<property name="position">3</property>
</packing>
</child>
</object>
@ -487,7 +515,7 @@
</child>
<child>
<object class="GtkButton">
<property name="label" translatable="yes">Start</property>
<property name="label" translatable="yes">(Re)Start</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
@ -633,6 +661,7 @@
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-missing-image</property>
<property name="icon_size">6</property>
</object>
</child>
</object>
@ -647,4 +676,108 @@
</object>
</child>
</object>
<object class="GtkPopover" id="settingsWindow">
<property name="width_request">250</property>
<property name="can_focus">False</property>
<property name="relative_to">button1</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="pixbuf">icons/player.png</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="customVideoPlyr">
<property name="width_request">330</property>
<property name="height_request">26</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="tooltip_text" translatable="yes">Set Custom Video Player</property>
<property name="placeholder_text" translatable="yes">Set Custom Video Player</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="pixbuf">icons/picture.png</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="customImgVwr">
<property name="width_request">330</property>
<property name="height_request">26</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="tooltip_text" translatable="yes">Set Custom Image Viewer</property>
<property name="placeholder_text" translatable="yes">Set Custom Image Viewer</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkButton">
<property name="label" translatable="yes">Save</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="image">saveImag</property>
<property name="always_show_image">True</property>
<signal name="clicked" handler="saveToSettingsFile" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
</child>
</object>
</interface>

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

View File

@ -0,0 +1,3 @@
window {
}

View File

@ -0,0 +1,48 @@
#!/usr/bin/env python
import os, json
class SaveGWinWrapSettings:
def __init__(self):
configFolder = os.path.expanduser('~') + "/.config/gwinwrap/"
self.configFile = configFolder + "settings.ini"
if os.path.isdir(configFolder) == False:
os.mkdir(configFolder)
if os.path.isfile(self.configFile) == False:
open(self.configFile, 'a').close()
def saveSettings(self, player, imgVwr):
data = {}
data['gwinwrap_settings'] = []
data['gwinwrap_settings'].append({
'player': player,
'imgvwr': imgVwr
})
with open(self.configFile, 'w') as outfile:
json.dump(data, outfile)
def retrieveSettings(self):
returnData = []
with open(self.configFile) as infile:
try:
data = json.load(infile)
for obj in data['gwinwrap_settings']:
returnData = [obj['player'], obj['imgvwr']]
except Exception as e:
returnData = ['mplayer', 'xdg-open']
if returnData[0] == '':
returnData[0] = 'mplayer'
if returnData[1] == '':
returnData[1] = 'xdg-open'
return returnData

View File

@ -2,7 +2,7 @@
import os
class SaveState:
class SaveStateToXWinWarp:
def __init__(self):
self.fileWriter = None
self.toSavePath = None

View File

@ -1 +1,2 @@
from utils.SaveState import SaveState
from utils.SaveStateToXWinWarp import SaveStateToXWinWarp
from utils.SaveGWinWrapSettings import SaveGWinWrapSettings\

113
python/src/versions/0.0.1/GWinWrap/GWinWrap.py Executable file → Normal file
View File

@ -1,20 +1,17 @@
#!/usr/bin/env python
import os, cairo, sys, gi, re, threading, subprocess
import os, cairo, sys, gi, re, threading, subprocess, hashlib
gi.require_version('Gtk', '3.0')
gi.require_version('Gdk', '3.0')
from gi.repository import Gtk as gtk
from gi.repository import Gdk as gdk
from gi.repository import GObject as gobject
from gi.repository import GdkPixbuf
from gi.repository import Gtk as gtk, Gdk as gdk, GObject as gobject, GdkPixbuf
from os import listdir
from os.path import isfile, join
from threading import Thread
from utils import SaveState
from utils import SaveStateToXWinWarp, SaveGWinWrapSettings
gdk.threads_init()
@ -36,6 +33,13 @@ class GWinWrap:
self.window.set_app_paintable(True)
self.window.connect("draw", self.area_draw)
# bind css file
cssProvider = gtk.CssProvider()
cssProvider.load_from_path('resources/stylesheet.css')
screen = gdk.Screen.get_default()
styleContext = gtk.StyleContext()
styleContext.add_provider_for_screen(screen, cssProvider, gtk.STYLE_PROVIDER_PRIORITY_USER)
# Add filter to allow only folders to be selected
dialog = self.builder.get_object("selectedDirDialog")
filefilter = self.builder.get_object("Folders")
@ -44,7 +48,9 @@ class GWinWrap:
# Get reference to remove and add it back...
self.gridLabel = self.builder.get_object("gridLabel")
self.stateSaver = SaveState()
self.stateSaver = SaveStateToXWinWarp()
self.sttngsSver = SaveGWinWrapSettings()
self.focusedImg = gtk.Image()
self.usrHome = os.path.expanduser('~')
self.xScreenVal = None
@ -70,6 +76,11 @@ class GWinWrap:
for file in list:
xscreenList.append((file,))
self.selectedImg = None # EventBox holder
self.player = None
self.imgVwr = None
self.retrieveSettings()
self.window.show()
def area_draw(self, widget, cr):
@ -86,19 +97,18 @@ class GWinWrap:
Thread(target=self.newDir, args=(dir,)).start()
def newDir(self, dir):
imageGrid = self.builder.get_object("imageGrid")
dirPath = dir
list = [f for f in listdir(dirPath) if isfile(join(dirPath, f))]
files = []
row = 0
col = 0
imageGrid = self.builder.get_object("imageGrid")
dirPath = dir
list = [f for f in listdir(dirPath) if isfile(join(dirPath, f))]
files = []
row = 0
col = 0
for file in list:
if file.lower().endswith(('.mkv', '.avi', '.flv', '.mov', '.m4v', '.mpg', '.wmv', '.mpeg', '.mp4', '.webm', '.png', '.jpg', '.jpeg', '.gif')):
files.append(file)
fractionTick = 1.0 / len(files)
fractionTick = 1.0 / 1.0 if len(files) == 0 else len(files)
tickCount = 0.0
self.clear()
imageGrid.remove_column(0)
@ -111,16 +121,20 @@ class GWinWrap:
thumbnl = gtk.Image()
if file.lower().endswith(('.mkv', '.avi', '.flv', '.mov', '.m4v', '.mpg', '.wmv', '.mpeg', '.mp4', '.webm')):
self.generateThumbnail(fullPathFile)
thumbnl = self.createGtkImage("/tmp/image.png", [310, 310])
eveBox.connect("button_press_event", self.runMplayerProcess, (fullPathFile, file,))
eveBox.connect("enter_notify_event", self.mouseOver, (fullPathFile, file))
eveBox.connect("leave_notify_event", self.mouseOut, (fullPathFile, file))
fileHash = hashlib.sha256(str.encode(fullPathFile)).hexdigest()
hashImgpth = self.usrHome + "/.thumbnails/normal/" + fileHash + ".png"
if os.path.isfile(hashImgpth) == False:
self.generateThumbnail(fullPathFile, hashImgpth)
thumbnl = self.createGtkImage(hashImgpth, [310, 310])
eveBox.connect("button_press_event", self.runMplayerProcess, (fullPathFile, file, eveBox,))
eveBox.connect("enter_notify_event", self.mouseOver, ())
eveBox.connect("leave_notify_event", self.mouseOut, ())
elif file.lower().endswith(('.png', '.jpg', '.jpeg', '.gif')):
thumbnl = self.createGtkImage(fullPathFile, [310, 310])
eveBox.connect("button_press_event", self.runImageViewerProcess, (fullPathFile, file))
eveBox.connect("enter_notify_event", self.mouseOver, (fullPathFile, file))
eveBox.connect("leave_notify_event", self.mouseOut, (fullPathFile, file))
eveBox.connect("button_press_event", self.runImageViewerProcess, (fullPathFile, file, eveBox,))
eveBox.connect("enter_notify_event", self.mouseOver, ())
eveBox.connect("leave_notify_event", self.mouseOut, ())
else:
print("Not a video or image file.")
return
@ -145,8 +159,8 @@ class GWinWrap:
def addToGrid(self, args):
args[0].attach(args[1], args[2], args[3], 1, 1)
def generateThumbnail(self, fullPathFile):
subprocess.call(["ffmpegthumbnailer", "-t", "65%", "-s", "300", "-c", "jpg", "-i", fullPathFile, "-o", "/tmp/image.png"])
def generateThumbnail(self, fullPathFile, hashImgpth):
subprocess.call(["ffmpegthumbnailer", "-t", "65%", "-s", "300", "-c", "jpg", "-i", fullPathFile, "-o", hashImgpth])
def createGtkImage(self, path, wxh):
try:
@ -158,17 +172,26 @@ class GWinWrap:
return gtk.Image.new_from_pixbuf(pixbuf)
except Exception as e:
print(e)
return gtk.Image()
def runMplayerProcess(self, widget, eve, params):
self.setSelected(params[2])
video = params[0] #.replace(" ", "\\ ")
if eve.type == gdk.EventType.DOUBLE_BUTTON_PRESS:
subprocess.call(["mplayer", "-really-quiet", "-ao", "null", "-loop", "0", params[0]])
subprocess.call([self.player, video, "-really-quiet", "-ao", "null", "-loop", "0"])
self.toSavePath = params[0]
self.applyType = 1
self.helpLabel.set_markup("<span foreground=\"#e0cc64\">" + params[1] + "</span>")
def openMainImageViewer(self, widget):
subprocess.call([self.imgVwr, self.toSavePath])
def runImageViewerProcess(self, widget, eve, params):
self.setSelected(params[2])
if eve.type == gdk.EventType.DOUBLE_BUTTON_PRESS:
previewWindow = self.builder.get_object("previewWindow")
previewImg = self.builder.get_object("previewImg")
@ -180,22 +203,25 @@ class GWinWrap:
self.applyType = 2
self.helpLabel.set_markup("<span foreground=\"#e0cc64\">" + params[1] + "</span>")
def openMainImageViewer(self, widget):
subprocess.call(["xdg-open", self.toSavePath])
def setSelected(self, eveBox):
if self.selectedImg:
col = gdk.RGBA(0.0, 0.0, 0.0, 0.0)
self.selectedImg.override_background_color(gtk.StateType.NORMAL, col)
col = gdk.RGBA(0.9, 0.7, 0.4, 0.74)
eveBox.override_background_color(gtk.StateType.NORMAL, col)
self.selectedImg = eveBox
def closePopup(self, widget):
previewWindow = self.builder.get_object("previewWindow")
previewWindow.popdown()
self.builder.get_object("previewWindow").popdown()
def mouseOver(self, widget, eve, args):
pass
# hand_cursor = gdk.Cursor(gdk.CursorType.GDK_HAND2)
# self.window.get_window().set_cursor(hand_cursor)
hand_cursor = gdk.Cursor(gdk.CursorType.HAND2)
self.window.get_window().set_cursor(hand_cursor)
def mouseOut(self, widget, eve, args):
pass
# watch_cursor = gdk.Cursor(gdk.CursorType.GDK_LEFT_PTR)
# self.window.get_window().set_cursor(watch_cursor)
watch_cursor = gdk.Cursor(gdk.CursorType.LEFT_PTR)
self.window.get_window().set_cursor(watch_cursor)
def toggleXscreenUsageField(self, widget, data=None):
useXscreenSaver = self.builder.get_object("useXScrnList")
@ -204,6 +230,21 @@ class GWinWrap:
else:
self.builder.get_object("xScreenSvrList").set_sensitive(False)
def popSttingsWindow(self, widget):
self.builder.get_object("settingsWindow").popup()
def saveToSettingsFile(self, widget):
self.player = self.builder.get_object("customVideoPlyr").get_text().strip()
self.imgVwr = self.builder.get_object("customImgVwr").get_text().strip()
self.sttngsSver.saveSettings(self.player, self.imgVwr)
def retrieveSettings(self):
data = self.sttngsSver.retrieveSettings()
self.player = data[0]
self.imgVwr = data[1]
self.builder.get_object("customVideoPlyr").set_text(self.player)
self.builder.get_object("customImgVwr").set_text(self.imgVwr)
def saveToFile(self, widget, data=None):
saveLoc = self.builder.get_object("saveLoc").get_active_text()
useXscreenSaver = self.builder.get_object("useXScrnList").get_active()

View File

@ -37,12 +37,25 @@
<property name="stock">gtk-jump-to</property>
<property name="icon_size">3</property>
</object>
<object class="GtkImage" id="saveImag">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-save</property>
<property name="icon_size">3</property>
</object>
<object class="GtkImage" id="saveImage">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-save</property>
<property name="icon_size">3</property>
</object>
<object class="GtkImage" id="settingsImage">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="tooltip_text" translatable="yes">Settings....</property>
<property name="stock">gtk-properties</property>
<property name="icon_size">3</property>
</object>
<object class="GtkImage" id="startImage">
<property name="visible">True</property>
<property name="can_focus">False</property>
@ -63,7 +76,7 @@
<property name="window_position">center</property>
<property name="default_width">950</property>
<property name="default_height">600</property>
<property name="icon">GWinWrap.png</property>
<property name="icon">icons/GWinWrap.png</property>
<property name="gravity">center</property>
<child>
<placeholder/>
@ -98,22 +111,6 @@
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton">
<property name="label" translatable="yes">Clear</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="image">clearImage</property>
<property name="always_show_image">True</property>
<signal name="clicked" handler="clearSelection" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkFileChooserButton" id="selectedDirDialog">
<property name="visible">True</property>
@ -127,6 +124,21 @@
<property name="title" translatable="yes">Dream Scene / Image Dir</property>
<signal name="file-set" handler="setNewDir" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="image">settingsImage</property>
<property name="always_show_image">True</property>
<signal name="clicked" handler="popSttingsWindow" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
@ -140,6 +152,18 @@
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkProgressBar" id="loadProgress">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="show_text">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow">
<property name="visible">True</property>
@ -182,19 +206,23 @@
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkProgressBar" id="loadProgress">
<object class="GtkButton">
<property name="label" translatable="yes">Clear</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="show_text">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="image">clearImage</property>
<property name="always_show_image">True</property>
<signal name="clicked" handler="clearSelection" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
<property name="position">3</property>
</packing>
</child>
</object>
@ -487,7 +515,7 @@
</child>
<child>
<object class="GtkButton">
<property name="label" translatable="yes">Start</property>
<property name="label" translatable="yes">(Re)Start</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
@ -633,6 +661,7 @@
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-missing-image</property>
<property name="icon_size">6</property>
</object>
</child>
</object>
@ -647,4 +676,108 @@
</object>
</child>
</object>
<object class="GtkPopover" id="settingsWindow">
<property name="width_request">250</property>
<property name="can_focus">False</property>
<property name="relative_to">button1</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="pixbuf">icons/player.png</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="customVideoPlyr">
<property name="width_request">330</property>
<property name="height_request">26</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="tooltip_text" translatable="yes">Set Custom Video Player</property>
<property name="placeholder_text" translatable="yes">Set Custom Video Player</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="pixbuf">icons/picture.png</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="customImgVwr">
<property name="width_request">330</property>
<property name="height_request">26</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="tooltip_text" translatable="yes">Set Custom Image Viewer</property>
<property name="placeholder_text" translatable="yes">Set Custom Image Viewer</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkButton">
<property name="label" translatable="yes">Save</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="image">saveImag</property>
<property name="always_show_image">True</property>
<signal name="clicked" handler="saveToSettingsFile" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
</child>
</object>
</interface>

View File

Before

Width:  |  Height:  |  Size: 9.1 KiB

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

View File

@ -0,0 +1,3 @@
window {
}

View File

@ -0,0 +1,48 @@
#!/usr/bin/env python
import os, json
class SaveGWinWrapSettings:
def __init__(self):
configFolder = os.path.expanduser('~') + "/.config/gwinwrap/"
self.configFile = configFolder + "settings.ini"
if os.path.isdir(configFolder) == False:
os.mkdir(configFolder)
if os.path.isfile(self.configFile) == False:
open(self.configFile, 'a').close()
def saveSettings(self, player, imgVwr):
data = {}
data['gwinwrap_settings'] = []
data['gwinwrap_settings'].append({
'player': player,
'imgvwr': imgVwr
})
with open(self.configFile, 'w') as outfile:
json.dump(data, outfile)
def retrieveSettings(self):
returnData = []
with open(self.configFile) as infile:
try:
data = json.load(infile)
for obj in data['gwinwrap_settings']:
returnData = [obj['player'], obj['imgvwr']]
except Exception as e:
returnData = ['mplayer', 'xdg-open']
if returnData[0] == '':
returnData[0] = 'mplayer'
if returnData[1] == '':
returnData[1] = 'xdg-open'
return returnData

View File

@ -2,7 +2,7 @@
import os
class SaveState:
class SaveStateToXWinWarp:
def __init__(self):
self.fileWriter = None
self.toSavePath = None

View File

@ -1 +1,2 @@
from utils.SaveState import SaveState
from utils.SaveStateToXWinWarp import SaveStateToXWinWarp
from utils.SaveGWinWrapSettings import SaveGWinWrapSettings\