added settings, changed layout, added thumbnail saving
@ -1,15 +1,17 @@
|
|||||||
# GWinWrap
|
# 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.
|
It includes the XWinWrap binary and source code for Shantanu Goel's version of XWinWrap.
|
||||||
|
|
||||||
# Notes
|
# Notes
|
||||||
Need python 2+
|
Need python 2+
|
||||||
|
|
||||||
# Images
|
# Images
|
||||||
![Default view starting out](images/pic1.png)
|
![1 Default view starting out. ](images/pic1.png)
|
||||||
![Video thumbnails in image grid. Path to directory highlighted purple](images/pic2.png)
|
![2 Video thumbnails in image grid. Path to directory highlighted purple. ](images/pic2.png)
|
||||||
![Image thumbnails in image grid with xscreensaver checked](images/pic3.png)
|
![3 Image thumbnails in image grid. ](images/pic3.png)
|
||||||
![Image in preview popup](images/pic4.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
|
# TODO
|
||||||
Nothing...
|
Nothing...
|
||||||
|
Before Width: | Height: | Size: 479 KiB After Width: | Height: | Size: 479 KiB |
Before Width: | Height: | Size: 637 KiB After Width: | Height: | Size: 577 KiB |
Before Width: | Height: | Size: 1.7 MiB After Width: | Height: | Size: 486 KiB |
Before Width: | Height: | Size: 1.0 MiB After Width: | Height: | Size: 2.3 MiB |
BIN
python/images/pic5.png
Normal file
After Width: | Height: | Size: 944 KiB |
BIN
python/images/pic6.png
Normal file
After Width: | Height: | Size: 442 KiB |
101
python/src/debs/gwinwrap-0-0-1-x64/opt/GWinWrap/GWinWrap.py
Executable file → Normal file
@ -1,20 +1,17 @@
|
|||||||
#!/usr/bin/env python
|
#!/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('Gtk', '3.0')
|
||||||
gi.require_version('Gdk', '3.0')
|
gi.require_version('Gdk', '3.0')
|
||||||
|
|
||||||
from gi.repository import Gtk as gtk
|
from gi.repository import Gtk as gtk, Gdk as gdk, GObject as gobject, GdkPixbuf
|
||||||
from gi.repository import Gdk as gdk
|
|
||||||
from gi.repository import GObject as gobject
|
|
||||||
from gi.repository import GdkPixbuf
|
|
||||||
|
|
||||||
from os import listdir
|
from os import listdir
|
||||||
from os.path import isfile, join
|
from os.path import isfile, join
|
||||||
from threading import Thread
|
from threading import Thread
|
||||||
|
|
||||||
from utils import SaveState
|
from utils import SaveStateToXWinWarp, SaveGWinWrapSettings
|
||||||
|
|
||||||
gdk.threads_init()
|
gdk.threads_init()
|
||||||
|
|
||||||
@ -36,6 +33,13 @@ class GWinWrap:
|
|||||||
self.window.set_app_paintable(True)
|
self.window.set_app_paintable(True)
|
||||||
self.window.connect("draw", self.area_draw)
|
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
|
# Add filter to allow only folders to be selected
|
||||||
dialog = self.builder.get_object("selectedDirDialog")
|
dialog = self.builder.get_object("selectedDirDialog")
|
||||||
filefilter = self.builder.get_object("Folders")
|
filefilter = self.builder.get_object("Folders")
|
||||||
@ -44,7 +48,9 @@ class GWinWrap:
|
|||||||
# Get reference to remove and add it back...
|
# Get reference to remove and add it back...
|
||||||
self.gridLabel = self.builder.get_object("gridLabel")
|
self.gridLabel = self.builder.get_object("gridLabel")
|
||||||
|
|
||||||
self.stateSaver = SaveState()
|
self.stateSaver = SaveStateToXWinWarp()
|
||||||
|
self.sttngsSver = SaveGWinWrapSettings()
|
||||||
|
|
||||||
self.focusedImg = gtk.Image()
|
self.focusedImg = gtk.Image()
|
||||||
self.usrHome = os.path.expanduser('~')
|
self.usrHome = os.path.expanduser('~')
|
||||||
self.xScreenVal = None
|
self.xScreenVal = None
|
||||||
@ -70,6 +76,11 @@ class GWinWrap:
|
|||||||
for file in list:
|
for file in list:
|
||||||
xscreenList.append((file,))
|
xscreenList.append((file,))
|
||||||
|
|
||||||
|
self.selectedImg = None # EventBox holder
|
||||||
|
self.player = None
|
||||||
|
self.imgVwr = None
|
||||||
|
self.retrieveSettings()
|
||||||
|
|
||||||
self.window.show()
|
self.window.show()
|
||||||
|
|
||||||
def area_draw(self, widget, cr):
|
def area_draw(self, widget, cr):
|
||||||
@ -97,8 +108,7 @@ class GWinWrap:
|
|||||||
if file.lower().endswith(('.mkv', '.avi', '.flv', '.mov', '.m4v', '.mpg', '.wmv', '.mpeg', '.mp4', '.webm', '.png', '.jpg', '.jpeg', '.gif')):
|
if file.lower().endswith(('.mkv', '.avi', '.flv', '.mov', '.m4v', '.mpg', '.wmv', '.mpeg', '.mp4', '.webm', '.png', '.jpg', '.jpeg', '.gif')):
|
||||||
files.append(file)
|
files.append(file)
|
||||||
|
|
||||||
|
fractionTick = 1.0 / 1.0 if len(files) == 0 else len(files)
|
||||||
fractionTick = 1.0 / len(files)
|
|
||||||
tickCount = 0.0
|
tickCount = 0.0
|
||||||
self.clear()
|
self.clear()
|
||||||
imageGrid.remove_column(0)
|
imageGrid.remove_column(0)
|
||||||
@ -111,16 +121,20 @@ class GWinWrap:
|
|||||||
thumbnl = gtk.Image()
|
thumbnl = gtk.Image()
|
||||||
|
|
||||||
if file.lower().endswith(('.mkv', '.avi', '.flv', '.mov', '.m4v', '.mpg', '.wmv', '.mpeg', '.mp4', '.webm')):
|
if file.lower().endswith(('.mkv', '.avi', '.flv', '.mov', '.m4v', '.mpg', '.wmv', '.mpeg', '.mp4', '.webm')):
|
||||||
self.generateThumbnail(fullPathFile)
|
fileHash = hashlib.sha256(str.encode(fullPathFile)).hexdigest()
|
||||||
thumbnl = self.createGtkImage("/tmp/image.png", [310, 310])
|
hashImgpth = self.usrHome + "/.thumbnails/normal/" + fileHash + ".png"
|
||||||
eveBox.connect("button_press_event", self.runMplayerProcess, (fullPathFile, file,))
|
if os.path.isfile(hashImgpth) == False:
|
||||||
eveBox.connect("enter_notify_event", self.mouseOver, (fullPathFile, file))
|
self.generateThumbnail(fullPathFile, hashImgpth)
|
||||||
eveBox.connect("leave_notify_event", self.mouseOut, (fullPathFile, file))
|
|
||||||
|
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')):
|
elif file.lower().endswith(('.png', '.jpg', '.jpeg', '.gif')):
|
||||||
thumbnl = self.createGtkImage(fullPathFile, [310, 310])
|
thumbnl = self.createGtkImage(fullPathFile, [310, 310])
|
||||||
eveBox.connect("button_press_event", self.runImageViewerProcess, (fullPathFile, file))
|
eveBox.connect("button_press_event", self.runImageViewerProcess, (fullPathFile, file, eveBox,))
|
||||||
eveBox.connect("enter_notify_event", self.mouseOver, (fullPathFile, file))
|
eveBox.connect("enter_notify_event", self.mouseOver, ())
|
||||||
eveBox.connect("leave_notify_event", self.mouseOut, (fullPathFile, file))
|
eveBox.connect("leave_notify_event", self.mouseOut, ())
|
||||||
else:
|
else:
|
||||||
print("Not a video or image file.")
|
print("Not a video or image file.")
|
||||||
return
|
return
|
||||||
@ -145,8 +159,8 @@ class GWinWrap:
|
|||||||
def addToGrid(self, args):
|
def addToGrid(self, args):
|
||||||
args[0].attach(args[1], args[2], args[3], 1, 1)
|
args[0].attach(args[1], args[2], args[3], 1, 1)
|
||||||
|
|
||||||
def generateThumbnail(self, fullPathFile):
|
def generateThumbnail(self, fullPathFile, hashImgpth):
|
||||||
subprocess.call(["ffmpegthumbnailer", "-t", "65%", "-s", "300", "-c", "jpg", "-i", fullPathFile, "-o", "/tmp/image.png"])
|
subprocess.call(["ffmpegthumbnailer", "-t", "65%", "-s", "300", "-c", "jpg", "-i", fullPathFile, "-o", hashImgpth])
|
||||||
|
|
||||||
def createGtkImage(self, path, wxh):
|
def createGtkImage(self, path, wxh):
|
||||||
try:
|
try:
|
||||||
@ -158,17 +172,26 @@ class GWinWrap:
|
|||||||
return gtk.Image.new_from_pixbuf(pixbuf)
|
return gtk.Image.new_from_pixbuf(pixbuf)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(e)
|
print(e)
|
||||||
|
|
||||||
return gtk.Image()
|
return gtk.Image()
|
||||||
|
|
||||||
def runMplayerProcess(self, widget, eve, params):
|
def runMplayerProcess(self, widget, eve, params):
|
||||||
|
self.setSelected(params[2])
|
||||||
|
video = params[0] #.replace(" ", "\\ ")
|
||||||
|
|
||||||
if eve.type == gdk.EventType.DOUBLE_BUTTON_PRESS:
|
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.toSavePath = params[0]
|
||||||
self.applyType = 1
|
self.applyType = 1
|
||||||
self.helpLabel.set_markup("<span foreground=\"#e0cc64\">" + params[1] + "</span>")
|
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):
|
def runImageViewerProcess(self, widget, eve, params):
|
||||||
|
self.setSelected(params[2])
|
||||||
|
|
||||||
if eve.type == gdk.EventType.DOUBLE_BUTTON_PRESS:
|
if eve.type == gdk.EventType.DOUBLE_BUTTON_PRESS:
|
||||||
previewWindow = self.builder.get_object("previewWindow")
|
previewWindow = self.builder.get_object("previewWindow")
|
||||||
previewImg = self.builder.get_object("previewImg")
|
previewImg = self.builder.get_object("previewImg")
|
||||||
@ -180,22 +203,25 @@ class GWinWrap:
|
|||||||
self.applyType = 2
|
self.applyType = 2
|
||||||
self.helpLabel.set_markup("<span foreground=\"#e0cc64\">" + params[1] + "</span>")
|
self.helpLabel.set_markup("<span foreground=\"#e0cc64\">" + params[1] + "</span>")
|
||||||
|
|
||||||
def openMainImageViewer(self, widget):
|
def setSelected(self, eveBox):
|
||||||
subprocess.call(["xdg-open", self.toSavePath])
|
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):
|
def closePopup(self, widget):
|
||||||
previewWindow = self.builder.get_object("previewWindow")
|
self.builder.get_object("previewWindow").popdown()
|
||||||
previewWindow.popdown()
|
|
||||||
|
|
||||||
def mouseOver(self, widget, eve, args):
|
def mouseOver(self, widget, eve, args):
|
||||||
pass
|
hand_cursor = gdk.Cursor(gdk.CursorType.HAND2)
|
||||||
# hand_cursor = gdk.Cursor(gdk.CursorType.GDK_HAND2)
|
self.window.get_window().set_cursor(hand_cursor)
|
||||||
# self.window.get_window().set_cursor(hand_cursor)
|
|
||||||
|
|
||||||
def mouseOut(self, widget, eve, args):
|
def mouseOut(self, widget, eve, args):
|
||||||
pass
|
watch_cursor = gdk.Cursor(gdk.CursorType.LEFT_PTR)
|
||||||
# watch_cursor = gdk.Cursor(gdk.CursorType.GDK_LEFT_PTR)
|
self.window.get_window().set_cursor(watch_cursor)
|
||||||
# self.window.get_window().set_cursor(watch_cursor)
|
|
||||||
|
|
||||||
def toggleXscreenUsageField(self, widget, data=None):
|
def toggleXscreenUsageField(self, widget, data=None):
|
||||||
useXscreenSaver = self.builder.get_object("useXScrnList")
|
useXscreenSaver = self.builder.get_object("useXScrnList")
|
||||||
@ -204,6 +230,21 @@ class GWinWrap:
|
|||||||
else:
|
else:
|
||||||
self.builder.get_object("xScreenSvrList").set_sensitive(False)
|
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):
|
def saveToFile(self, widget, data=None):
|
||||||
saveLoc = self.builder.get_object("saveLoc").get_active_text()
|
saveLoc = self.builder.get_object("saveLoc").get_active_text()
|
||||||
useXscreenSaver = self.builder.get_object("useXScrnList").get_active()
|
useXscreenSaver = self.builder.get_object("useXScrnList").get_active()
|
||||||
|
@ -37,12 +37,25 @@
|
|||||||
<property name="stock">gtk-jump-to</property>
|
<property name="stock">gtk-jump-to</property>
|
||||||
<property name="icon_size">3</property>
|
<property name="icon_size">3</property>
|
||||||
</object>
|
</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">
|
<object class="GtkImage" id="saveImage">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="stock">gtk-save</property>
|
<property name="stock">gtk-save</property>
|
||||||
<property name="icon_size">3</property>
|
<property name="icon_size">3</property>
|
||||||
</object>
|
</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">
|
<object class="GtkImage" id="startImage">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
@ -63,7 +76,7 @@
|
|||||||
<property name="window_position">center</property>
|
<property name="window_position">center</property>
|
||||||
<property name="default_width">950</property>
|
<property name="default_width">950</property>
|
||||||
<property name="default_height">600</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>
|
<property name="gravity">center</property>
|
||||||
<child>
|
<child>
|
||||||
<placeholder/>
|
<placeholder/>
|
||||||
@ -98,22 +111,6 @@
|
|||||||
<property name="position">0</property>
|
<property name="position">0</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</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>
|
<child>
|
||||||
<object class="GtkFileChooserButton" id="selectedDirDialog">
|
<object class="GtkFileChooserButton" id="selectedDirDialog">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
@ -127,6 +124,21 @@
|
|||||||
<property name="title" translatable="yes">Dream Scene / Image Dir</property>
|
<property name="title" translatable="yes">Dream Scene / Image Dir</property>
|
||||||
<signal name="file-set" handler="setNewDir" swapped="no"/>
|
<signal name="file-set" handler="setNewDir" swapped="no"/>
|
||||||
</object>
|
</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>
|
<packing>
|
||||||
<property name="expand">False</property>
|
<property name="expand">False</property>
|
||||||
<property name="fill">True</property>
|
<property name="fill">True</property>
|
||||||
@ -140,6 +152,18 @@
|
|||||||
<property name="position">0</property>
|
<property name="position">0</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</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>
|
<child>
|
||||||
<object class="GtkScrolledWindow">
|
<object class="GtkScrolledWindow">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
@ -182,19 +206,23 @@
|
|||||||
<packing>
|
<packing>
|
||||||
<property name="expand">True</property>
|
<property name="expand">True</property>
|
||||||
<property name="fill">True</property>
|
<property name="fill">True</property>
|
||||||
<property name="position">1</property>
|
<property name="position">2</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkProgressBar" id="loadProgress">
|
<object class="GtkButton">
|
||||||
|
<property name="label" translatable="yes">Clear</property>
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">True</property>
|
||||||
<property name="show_text">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>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="expand">False</property>
|
<property name="expand">False</property>
|
||||||
<property name="fill">True</property>
|
<property name="fill">True</property>
|
||||||
<property name="position">2</property>
|
<property name="position">3</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
@ -487,7 +515,7 @@
|
|||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkButton">
|
<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="visible">True</property>
|
||||||
<property name="can_focus">True</property>
|
<property name="can_focus">True</property>
|
||||||
<property name="receives_default">True</property>
|
<property name="receives_default">True</property>
|
||||||
@ -633,6 +661,7 @@
|
|||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="stock">gtk-missing-image</property>
|
<property name="stock">gtk-missing-image</property>
|
||||||
|
<property name="icon_size">6</property>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
@ -647,4 +676,108 @@
|
|||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</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>
|
</interface>
|
||||||
|
Before Width: | Height: | Size: 9.1 KiB After Width: | Height: | Size: 9.1 KiB |
After Width: | Height: | Size: 6.4 KiB |
After Width: | Height: | Size: 6.4 KiB |
@ -0,0 +1,3 @@
|
|||||||
|
window {
|
||||||
|
|
||||||
|
}
|
@ -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
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
import os
|
import os
|
||||||
|
|
||||||
class SaveState:
|
class SaveStateToXWinWarp:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.fileWriter = None
|
self.fileWriter = None
|
||||||
self.toSavePath = None
|
self.toSavePath = None
|
@ -1 +1,2 @@
|
|||||||
from utils.SaveState import SaveState
|
from utils.SaveStateToXWinWarp import SaveStateToXWinWarp
|
||||||
|
from utils.SaveGWinWrapSettings import SaveGWinWrapSettings\
|
||||||
|
101
python/src/versions/0.0.1/GWinWrap/GWinWrap.py
Executable file → Normal file
@ -1,20 +1,17 @@
|
|||||||
#!/usr/bin/env python
|
#!/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('Gtk', '3.0')
|
||||||
gi.require_version('Gdk', '3.0')
|
gi.require_version('Gdk', '3.0')
|
||||||
|
|
||||||
from gi.repository import Gtk as gtk
|
from gi.repository import Gtk as gtk, Gdk as gdk, GObject as gobject, GdkPixbuf
|
||||||
from gi.repository import Gdk as gdk
|
|
||||||
from gi.repository import GObject as gobject
|
|
||||||
from gi.repository import GdkPixbuf
|
|
||||||
|
|
||||||
from os import listdir
|
from os import listdir
|
||||||
from os.path import isfile, join
|
from os.path import isfile, join
|
||||||
from threading import Thread
|
from threading import Thread
|
||||||
|
|
||||||
from utils import SaveState
|
from utils import SaveStateToXWinWarp, SaveGWinWrapSettings
|
||||||
|
|
||||||
gdk.threads_init()
|
gdk.threads_init()
|
||||||
|
|
||||||
@ -36,6 +33,13 @@ class GWinWrap:
|
|||||||
self.window.set_app_paintable(True)
|
self.window.set_app_paintable(True)
|
||||||
self.window.connect("draw", self.area_draw)
|
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
|
# Add filter to allow only folders to be selected
|
||||||
dialog = self.builder.get_object("selectedDirDialog")
|
dialog = self.builder.get_object("selectedDirDialog")
|
||||||
filefilter = self.builder.get_object("Folders")
|
filefilter = self.builder.get_object("Folders")
|
||||||
@ -44,7 +48,9 @@ class GWinWrap:
|
|||||||
# Get reference to remove and add it back...
|
# Get reference to remove and add it back...
|
||||||
self.gridLabel = self.builder.get_object("gridLabel")
|
self.gridLabel = self.builder.get_object("gridLabel")
|
||||||
|
|
||||||
self.stateSaver = SaveState()
|
self.stateSaver = SaveStateToXWinWarp()
|
||||||
|
self.sttngsSver = SaveGWinWrapSettings()
|
||||||
|
|
||||||
self.focusedImg = gtk.Image()
|
self.focusedImg = gtk.Image()
|
||||||
self.usrHome = os.path.expanduser('~')
|
self.usrHome = os.path.expanduser('~')
|
||||||
self.xScreenVal = None
|
self.xScreenVal = None
|
||||||
@ -70,6 +76,11 @@ class GWinWrap:
|
|||||||
for file in list:
|
for file in list:
|
||||||
xscreenList.append((file,))
|
xscreenList.append((file,))
|
||||||
|
|
||||||
|
self.selectedImg = None # EventBox holder
|
||||||
|
self.player = None
|
||||||
|
self.imgVwr = None
|
||||||
|
self.retrieveSettings()
|
||||||
|
|
||||||
self.window.show()
|
self.window.show()
|
||||||
|
|
||||||
def area_draw(self, widget, cr):
|
def area_draw(self, widget, cr):
|
||||||
@ -97,8 +108,7 @@ class GWinWrap:
|
|||||||
if file.lower().endswith(('.mkv', '.avi', '.flv', '.mov', '.m4v', '.mpg', '.wmv', '.mpeg', '.mp4', '.webm', '.png', '.jpg', '.jpeg', '.gif')):
|
if file.lower().endswith(('.mkv', '.avi', '.flv', '.mov', '.m4v', '.mpg', '.wmv', '.mpeg', '.mp4', '.webm', '.png', '.jpg', '.jpeg', '.gif')):
|
||||||
files.append(file)
|
files.append(file)
|
||||||
|
|
||||||
|
fractionTick = 1.0 / 1.0 if len(files) == 0 else len(files)
|
||||||
fractionTick = 1.0 / len(files)
|
|
||||||
tickCount = 0.0
|
tickCount = 0.0
|
||||||
self.clear()
|
self.clear()
|
||||||
imageGrid.remove_column(0)
|
imageGrid.remove_column(0)
|
||||||
@ -111,16 +121,20 @@ class GWinWrap:
|
|||||||
thumbnl = gtk.Image()
|
thumbnl = gtk.Image()
|
||||||
|
|
||||||
if file.lower().endswith(('.mkv', '.avi', '.flv', '.mov', '.m4v', '.mpg', '.wmv', '.mpeg', '.mp4', '.webm')):
|
if file.lower().endswith(('.mkv', '.avi', '.flv', '.mov', '.m4v', '.mpg', '.wmv', '.mpeg', '.mp4', '.webm')):
|
||||||
self.generateThumbnail(fullPathFile)
|
fileHash = hashlib.sha256(str.encode(fullPathFile)).hexdigest()
|
||||||
thumbnl = self.createGtkImage("/tmp/image.png", [310, 310])
|
hashImgpth = self.usrHome + "/.thumbnails/normal/" + fileHash + ".png"
|
||||||
eveBox.connect("button_press_event", self.runMplayerProcess, (fullPathFile, file,))
|
if os.path.isfile(hashImgpth) == False:
|
||||||
eveBox.connect("enter_notify_event", self.mouseOver, (fullPathFile, file))
|
self.generateThumbnail(fullPathFile, hashImgpth)
|
||||||
eveBox.connect("leave_notify_event", self.mouseOut, (fullPathFile, file))
|
|
||||||
|
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')):
|
elif file.lower().endswith(('.png', '.jpg', '.jpeg', '.gif')):
|
||||||
thumbnl = self.createGtkImage(fullPathFile, [310, 310])
|
thumbnl = self.createGtkImage(fullPathFile, [310, 310])
|
||||||
eveBox.connect("button_press_event", self.runImageViewerProcess, (fullPathFile, file))
|
eveBox.connect("button_press_event", self.runImageViewerProcess, (fullPathFile, file, eveBox,))
|
||||||
eveBox.connect("enter_notify_event", self.mouseOver, (fullPathFile, file))
|
eveBox.connect("enter_notify_event", self.mouseOver, ())
|
||||||
eveBox.connect("leave_notify_event", self.mouseOut, (fullPathFile, file))
|
eveBox.connect("leave_notify_event", self.mouseOut, ())
|
||||||
else:
|
else:
|
||||||
print("Not a video or image file.")
|
print("Not a video or image file.")
|
||||||
return
|
return
|
||||||
@ -145,8 +159,8 @@ class GWinWrap:
|
|||||||
def addToGrid(self, args):
|
def addToGrid(self, args):
|
||||||
args[0].attach(args[1], args[2], args[3], 1, 1)
|
args[0].attach(args[1], args[2], args[3], 1, 1)
|
||||||
|
|
||||||
def generateThumbnail(self, fullPathFile):
|
def generateThumbnail(self, fullPathFile, hashImgpth):
|
||||||
subprocess.call(["ffmpegthumbnailer", "-t", "65%", "-s", "300", "-c", "jpg", "-i", fullPathFile, "-o", "/tmp/image.png"])
|
subprocess.call(["ffmpegthumbnailer", "-t", "65%", "-s", "300", "-c", "jpg", "-i", fullPathFile, "-o", hashImgpth])
|
||||||
|
|
||||||
def createGtkImage(self, path, wxh):
|
def createGtkImage(self, path, wxh):
|
||||||
try:
|
try:
|
||||||
@ -158,17 +172,26 @@ class GWinWrap:
|
|||||||
return gtk.Image.new_from_pixbuf(pixbuf)
|
return gtk.Image.new_from_pixbuf(pixbuf)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(e)
|
print(e)
|
||||||
|
|
||||||
return gtk.Image()
|
return gtk.Image()
|
||||||
|
|
||||||
def runMplayerProcess(self, widget, eve, params):
|
def runMplayerProcess(self, widget, eve, params):
|
||||||
|
self.setSelected(params[2])
|
||||||
|
video = params[0] #.replace(" ", "\\ ")
|
||||||
|
|
||||||
if eve.type == gdk.EventType.DOUBLE_BUTTON_PRESS:
|
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.toSavePath = params[0]
|
||||||
self.applyType = 1
|
self.applyType = 1
|
||||||
self.helpLabel.set_markup("<span foreground=\"#e0cc64\">" + params[1] + "</span>")
|
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):
|
def runImageViewerProcess(self, widget, eve, params):
|
||||||
|
self.setSelected(params[2])
|
||||||
|
|
||||||
if eve.type == gdk.EventType.DOUBLE_BUTTON_PRESS:
|
if eve.type == gdk.EventType.DOUBLE_BUTTON_PRESS:
|
||||||
previewWindow = self.builder.get_object("previewWindow")
|
previewWindow = self.builder.get_object("previewWindow")
|
||||||
previewImg = self.builder.get_object("previewImg")
|
previewImg = self.builder.get_object("previewImg")
|
||||||
@ -180,22 +203,25 @@ class GWinWrap:
|
|||||||
self.applyType = 2
|
self.applyType = 2
|
||||||
self.helpLabel.set_markup("<span foreground=\"#e0cc64\">" + params[1] + "</span>")
|
self.helpLabel.set_markup("<span foreground=\"#e0cc64\">" + params[1] + "</span>")
|
||||||
|
|
||||||
def openMainImageViewer(self, widget):
|
def setSelected(self, eveBox):
|
||||||
subprocess.call(["xdg-open", self.toSavePath])
|
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):
|
def closePopup(self, widget):
|
||||||
previewWindow = self.builder.get_object("previewWindow")
|
self.builder.get_object("previewWindow").popdown()
|
||||||
previewWindow.popdown()
|
|
||||||
|
|
||||||
def mouseOver(self, widget, eve, args):
|
def mouseOver(self, widget, eve, args):
|
||||||
pass
|
hand_cursor = gdk.Cursor(gdk.CursorType.HAND2)
|
||||||
# hand_cursor = gdk.Cursor(gdk.CursorType.GDK_HAND2)
|
self.window.get_window().set_cursor(hand_cursor)
|
||||||
# self.window.get_window().set_cursor(hand_cursor)
|
|
||||||
|
|
||||||
def mouseOut(self, widget, eve, args):
|
def mouseOut(self, widget, eve, args):
|
||||||
pass
|
watch_cursor = gdk.Cursor(gdk.CursorType.LEFT_PTR)
|
||||||
# watch_cursor = gdk.Cursor(gdk.CursorType.GDK_LEFT_PTR)
|
self.window.get_window().set_cursor(watch_cursor)
|
||||||
# self.window.get_window().set_cursor(watch_cursor)
|
|
||||||
|
|
||||||
def toggleXscreenUsageField(self, widget, data=None):
|
def toggleXscreenUsageField(self, widget, data=None):
|
||||||
useXscreenSaver = self.builder.get_object("useXScrnList")
|
useXscreenSaver = self.builder.get_object("useXScrnList")
|
||||||
@ -204,6 +230,21 @@ class GWinWrap:
|
|||||||
else:
|
else:
|
||||||
self.builder.get_object("xScreenSvrList").set_sensitive(False)
|
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):
|
def saveToFile(self, widget, data=None):
|
||||||
saveLoc = self.builder.get_object("saveLoc").get_active_text()
|
saveLoc = self.builder.get_object("saveLoc").get_active_text()
|
||||||
useXscreenSaver = self.builder.get_object("useXScrnList").get_active()
|
useXscreenSaver = self.builder.get_object("useXScrnList").get_active()
|
||||||
|
@ -37,12 +37,25 @@
|
|||||||
<property name="stock">gtk-jump-to</property>
|
<property name="stock">gtk-jump-to</property>
|
||||||
<property name="icon_size">3</property>
|
<property name="icon_size">3</property>
|
||||||
</object>
|
</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">
|
<object class="GtkImage" id="saveImage">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="stock">gtk-save</property>
|
<property name="stock">gtk-save</property>
|
||||||
<property name="icon_size">3</property>
|
<property name="icon_size">3</property>
|
||||||
</object>
|
</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">
|
<object class="GtkImage" id="startImage">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
@ -63,7 +76,7 @@
|
|||||||
<property name="window_position">center</property>
|
<property name="window_position">center</property>
|
||||||
<property name="default_width">950</property>
|
<property name="default_width">950</property>
|
||||||
<property name="default_height">600</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>
|
<property name="gravity">center</property>
|
||||||
<child>
|
<child>
|
||||||
<placeholder/>
|
<placeholder/>
|
||||||
@ -98,22 +111,6 @@
|
|||||||
<property name="position">0</property>
|
<property name="position">0</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</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>
|
<child>
|
||||||
<object class="GtkFileChooserButton" id="selectedDirDialog">
|
<object class="GtkFileChooserButton" id="selectedDirDialog">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
@ -127,6 +124,21 @@
|
|||||||
<property name="title" translatable="yes">Dream Scene / Image Dir</property>
|
<property name="title" translatable="yes">Dream Scene / Image Dir</property>
|
||||||
<signal name="file-set" handler="setNewDir" swapped="no"/>
|
<signal name="file-set" handler="setNewDir" swapped="no"/>
|
||||||
</object>
|
</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>
|
<packing>
|
||||||
<property name="expand">False</property>
|
<property name="expand">False</property>
|
||||||
<property name="fill">True</property>
|
<property name="fill">True</property>
|
||||||
@ -140,6 +152,18 @@
|
|||||||
<property name="position">0</property>
|
<property name="position">0</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</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>
|
<child>
|
||||||
<object class="GtkScrolledWindow">
|
<object class="GtkScrolledWindow">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
@ -182,19 +206,23 @@
|
|||||||
<packing>
|
<packing>
|
||||||
<property name="expand">True</property>
|
<property name="expand">True</property>
|
||||||
<property name="fill">True</property>
|
<property name="fill">True</property>
|
||||||
<property name="position">1</property>
|
<property name="position">2</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkProgressBar" id="loadProgress">
|
<object class="GtkButton">
|
||||||
|
<property name="label" translatable="yes">Clear</property>
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">True</property>
|
||||||
<property name="show_text">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>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="expand">False</property>
|
<property name="expand">False</property>
|
||||||
<property name="fill">True</property>
|
<property name="fill">True</property>
|
||||||
<property name="position">2</property>
|
<property name="position">3</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
@ -487,7 +515,7 @@
|
|||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkButton">
|
<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="visible">True</property>
|
||||||
<property name="can_focus">True</property>
|
<property name="can_focus">True</property>
|
||||||
<property name="receives_default">True</property>
|
<property name="receives_default">True</property>
|
||||||
@ -633,6 +661,7 @@
|
|||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="stock">gtk-missing-image</property>
|
<property name="stock">gtk-missing-image</property>
|
||||||
|
<property name="icon_size">6</property>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
@ -647,4 +676,108 @@
|
|||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</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>
|
</interface>
|
||||||
|
Before Width: | Height: | Size: 9.1 KiB After Width: | Height: | Size: 9.1 KiB |
BIN
python/src/versions/0.0.1/GWinWrap/resources/icons/picture.png
Normal file
After Width: | Height: | Size: 6.4 KiB |
BIN
python/src/versions/0.0.1/GWinWrap/resources/icons/player.png
Normal file
After Width: | Height: | Size: 6.4 KiB |
@ -0,0 +1,3 @@
|
|||||||
|
window {
|
||||||
|
|
||||||
|
}
|
@ -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
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
import os
|
import os
|
||||||
|
|
||||||
class SaveState:
|
class SaveStateToXWinWarp:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.fileWriter = None
|
self.fileWriter = None
|
||||||
self.toSavePath = None
|
self.toSavePath = None
|
@ -1 +1,2 @@
|
|||||||
from utils.SaveState import SaveState
|
from utils.SaveStateToXWinWarp import SaveStateToXWinWarp
|
||||||
|
from utils.SaveGWinWrapSettings import SaveGWinWrapSettings\
|
||||||
|