From 77c01f9d49f2fc0198b862f92458c6c103820a69 Mon Sep 17 00:00:00 2001 From: Victor Häggqvist Date: Thu, 6 Nov 2014 01:02:04 +0100 Subject: init --- AndroidResR/AndroidResR.py | 227 ++++++++++++++++++++++++++++++++ AndroidResR/__init__.py | 0 AndroidResR/ic_launcher.png | Bin 0 -> 11079 bytes AndroidResR/util/ConfigLoader.py | 42 ++++++ AndroidResR/util/__init__.py | 1 + AndroidResR/view/AndroidResR.py | 154 ++++++++++++++++++++++ AndroidResR/view/AndroidResR.ui | 271 +++++++++++++++++++++++++++++++++++++++ AndroidResR/view/__init__.py | 1 + 8 files changed, 696 insertions(+) create mode 100644 AndroidResR/AndroidResR.py create mode 100644 AndroidResR/__init__.py create mode 100644 AndroidResR/ic_launcher.png create mode 100644 AndroidResR/util/ConfigLoader.py create mode 100644 AndroidResR/util/__init__.py create mode 100644 AndroidResR/view/AndroidResR.py create mode 100644 AndroidResR/view/AndroidResR.ui create mode 100644 AndroidResR/view/__init__.py (limited to 'AndroidResR') diff --git a/AndroidResR/AndroidResR.py b/AndroidResR/AndroidResR.py new file mode 100644 index 0000000..dfa40a3 --- /dev/null +++ b/AndroidResR/AndroidResR.py @@ -0,0 +1,227 @@ +# coding=utf-8 +import os +from os import listdir, remove +from os.path import join, isfile +import sys +from shutil import copyfile +from PyQt4 import QtGui +from view.AndroidResR import Ui_MainWindow +from util.ConfigLoader import ConfigLoader + + +__author__ = 'Victor Häggqvist' + +DRAWABLEDIRS = ["drawable-mdpi", "drawable-hdpi", "drawable-xhdpi", "drawable-xxhdpi", "drawable-xxxhdpi"] +DRAWABLESHORT = ["mdpi", "hdpi", "xhdpi", "xxhdpi", "xxxhdpi"] + + +class Window(QtGui.QMainWindow, Ui_MainWindow): + def __init__(self): + QtGui.QMainWindow.__init__(self) + self.setupUi(self) + self.setup() + + self.config = ConfigLoader() + self.currentIndex = None + self.currentIndexDest = None + + self.srcIconset = self.config.get(self.config.SRCPATH) + if self.srcIconset: + self.srcPath.setText(self.srcIconset) + self.populateSrcList() + + self.appResFolder = self.config.get(self.config.DESTPATH) + if self.appResFolder: + self.destPath.setText(self.appResFolder) + self.scanResources() + + def setup(self): + """ + bind signals + """ + self.setWindowTitle("AndroidResR") + self.setWindowIcon(QtGui.QIcon("ic_launcher.png")) + self.setFixedSize(self.size()) + self.statusbar.setSizeGripEnabled(False) + self.selectSrc.clicked.connect(self.openSrc) + self.selectDest.clicked.connect(self.openDest) + self.srcListWidget.itemSelectionChanged.connect(self.srcSelectionChange) + self.colorWhite.clicked.connect(self.colorClick) + self.colorBlack.clicked.connect(self.colorClick) + self.webView.setHtml("Select icon to the left to preview") + self.resultView.setStyleSheet("background:transparent") + self.destListWidget.itemSelectionChanged.connect(self.destSelectionChange) + + self.transferIcons.clicked.connect(self.copyIcons) + self.killIcon.clicked.connect(self.deleteIcon) + + self.actionRefresh.triggered.connect(self.refresh) + self.actionQuit.triggered.connect(self.quit) + + def quit(self): + sys.exit(0) + + def openSrc(self): + """ + open select iconset dialog + """ + startdir = self.srcIconset if self.srcIconset else self.config.userHome + openDir = QtGui.QFileDialog.getExistingDirectory(self, "Select Iconset Folder", startdir) + if not openDir: + return + + self.srcPath.setText(openDir) + self.srcIconset = str(openDir) + + self.config.set(self.config.SRCPATH, openDir) + self.populateSrcList() + + def openDest(self): + openDir = QtGui.QFileDialog.getExistingDirectory(self, "Select App's res folder", self.config.userHome) + if not openDir: + return + + self.destPath.setText(openDir) + self.appResFolder = str(openDir) + self.config.set(self.config.DESTPATH, openDir) + self.scanResources() + + def populateSrcList(self): + self.searchpath = join(self.srcIconset, DRAWABLEDIRS[2]) + + self.srcIconFiles = [ f for f in listdir(self.searchpath) if isfile(join(self.searchpath, f)) ] + self.srcIconFiles.sort() + + self.srcListWidget.clear() + for f in self.srcIconFiles: + self.srcListWidget.addItem(f) + + def scanResources(self): + self.appResources = [] + for res in DRAWABLEDIRS: + resdir = join(self.appResFolder,res) + resShort = res.split("-")[1] + try: + files = listdir(resdir) + except OSError: + continue + for f in files: + if isfile(join(resdir,f)): + index = self.getAppResourceIndex(f) + if index < 0: + self.appResources.append((f,[resShort])) + else: + self.appResources[index][1].append(resShort) + + self.destListWidget.clear() + self.appResources = sorted(self.appResources) + for d in self.appResources: + self.destListWidget.addItem(d[0]) + + def getAppResourceIndex(self, file): + i = 0 + for r in self.appResources: + if r[0] == file: + return i + i += 1 + return -1 + + def srcSelectionChange(self): + """ + On selection change in src list + """ + self.currentIndex = self.srcListWidget.selectedIndexes()[0].row() + self.previewIcon() + + def colorClick(self): + """ + On color checkbox clicked + """ + self.previewIcon() + + def previewIcon(self): + """ + Preview currently selected icon + :return: + """ + if self.currentIndex is None: + return + + icon = join(self.searchpath, self.srcIconFiles[self.currentIndex]) + color = self.getColor() + html = '' + self.webView.setHtml(html) + + def getColor(self): + if self.colorWhite.isChecked(): + return '#fff' + elif self.colorBlack.isChecked(): + return '#000' + + def destSelectionChange(self): + self.currentIndexDest = self.destListWidget.selectedIndexes()[0].row() if len(self.destListWidget.selectedIndexes()) else None + self.displayResInfo() + + def displayResInfo(self): + if self.currentIndexDest is None: + return + + item = self.appResources[self.currentIndexDest] + + html = '' + html += item[0]+"
" + + for dip in DRAWABLESHORT: + if dip in item[1]: + html += dip+': yes
' + else: + html += dip+': no
' + + html += "" + self.resultView.setHtml(html) + + def copyIcons(self): + item = self.srcIconFiles[self.currentIndex] + + for dip in DRAWABLEDIRS: + fullsrc = join(self.srcIconset, dip, item) + fulldest = join(self.appResFolder, dip, item) + try: + copyfile(fullsrc, fulldest) + except IOError: + os.mkdir(join(self.appResFolder, dip)) + copyfile(fullsrc, fulldest) + # print fullsrc,"->",fulldest + self.scanResources() + + def refresh(self): + self.scanResources() + self.populateSrcList() + + def deleteIcon(self): + if self.currentIndexDest is None: + return + + icon = self.appResources[self.currentIndexDest] + dips = icon[1] + + for dip in dips: + path = join(self.appResFolder, "drawable-"+dip, icon[0]) + # print path + remove(path) + self.statusBar().showMessage("Removed "+icon[0], 10*1000) + self.scanResources() + + + + + +def main(): + app = QtGui.QApplication(sys.argv) + ui = Window() + ui.show() + sys.exit(app.exec_()) + + +if __name__ == '__main__': + main() diff --git a/AndroidResR/__init__.py b/AndroidResR/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/AndroidResR/ic_launcher.png b/AndroidResR/ic_launcher.png new file mode 100644 index 0000000..0fe2e80 Binary files /dev/null and b/AndroidResR/ic_launcher.png differ diff --git a/AndroidResR/util/ConfigLoader.py b/AndroidResR/util/ConfigLoader.py new file mode 100644 index 0000000..b12771f --- /dev/null +++ b/AndroidResR/util/ConfigLoader.py @@ -0,0 +1,42 @@ +import ConfigParser +from os.path import expanduser, join, isfile + +__author__ = 'victor' + + +class ConfigLoader(): + SRCPATH = "srcpath" + DESTPATH = "destpath" + + def __init__(self): + self.userHome = expanduser("~") + self.CONFIG_FILE = join(self.userHome, '.androidresr') + self.config = ConfigParser.RawConfigParser(allow_no_value=True) + + if not isfile(self.CONFIG_FILE): + self.initFile() + + self.load() + + def load(self): + if not isfile(self.CONFIG_FILE): + raise RuntimeError('No config file (', self.CONFIG_FILE, ') found') + self.config.readfp(open(self.CONFIG_FILE)) + + def set(self, key, value): + self.config.set('general', key, value) + self.write() + + def get(self, key): + try: + return self.config.get("general", key) + except ConfigParser.NoOptionError: + return None + + def initFile(self): + self.config.add_section('general') + self.write() + + def write(self): + with open(self.CONFIG_FILE, 'w') as configfile: + self.config.write(configfile) diff --git a/AndroidResR/util/__init__.py b/AndroidResR/util/__init__.py new file mode 100644 index 0000000..1a2b8e3 --- /dev/null +++ b/AndroidResR/util/__init__.py @@ -0,0 +1 @@ +__author__ = 'victor' diff --git a/AndroidResR/view/AndroidResR.py b/AndroidResR/view/AndroidResR.py new file mode 100644 index 0000000..67bec8c --- /dev/null +++ b/AndroidResR/view/AndroidResR.py @@ -0,0 +1,154 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'AndroidResR/view/AndroidResR.ui' +# +# Created: Thu Nov 6 00:12:20 2014 +# by: PyQt4 UI code generator 4.11.2 +# +# WARNING! All changes made in this file will be lost! + +from PyQt4 import QtCore, QtGui + +try: + _fromUtf8 = QtCore.QString.fromUtf8 +except AttributeError: + def _fromUtf8(s): + return s + +try: + _encoding = QtGui.QApplication.UnicodeUTF8 + def _translate(context, text, disambig): + return QtGui.QApplication.translate(context, text, disambig, _encoding) +except AttributeError: + def _translate(context, text, disambig): + return QtGui.QApplication.translate(context, text, disambig) + +class Ui_MainWindow(object): + def setupUi(self, MainWindow): + MainWindow.setObjectName(_fromUtf8("MainWindow")) + MainWindow.resize(794, 600) + self.centralwidget = QtGui.QWidget(MainWindow) + self.centralwidget.setObjectName(_fromUtf8("centralwidget")) + self.verticalLayoutWidget = QtGui.QWidget(self.centralwidget) + self.verticalLayoutWidget.setGeometry(QtCore.QRect(10, 10, 281, 541)) + self.verticalLayoutWidget.setObjectName(_fromUtf8("verticalLayoutWidget")) + self.verticalLayout = QtGui.QVBoxLayout(self.verticalLayoutWidget) + self.verticalLayout.setMargin(0) + self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) + self.label = QtGui.QLabel(self.verticalLayoutWidget) + self.label.setObjectName(_fromUtf8("label")) + self.verticalLayout.addWidget(self.label) + self.horizontalLayout = QtGui.QHBoxLayout() + self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) + self.srcPath = QtGui.QLineEdit(self.verticalLayoutWidget) + self.srcPath.setObjectName(_fromUtf8("srcPath")) + self.horizontalLayout.addWidget(self.srcPath) + self.selectSrc = QtGui.QPushButton(self.verticalLayoutWidget) + self.selectSrc.setObjectName(_fromUtf8("selectSrc")) + self.horizontalLayout.addWidget(self.selectSrc) + self.verticalLayout.addLayout(self.horizontalLayout) + self.srcListWidget = QtGui.QListWidget(self.verticalLayoutWidget) + self.srcListWidget.setObjectName(_fromUtf8("srcListWidget")) + self.verticalLayout.addWidget(self.srcListWidget) + self.verticalLayoutWidget_2 = QtGui.QWidget(self.centralwidget) + self.verticalLayoutWidget_2.setGeometry(QtCore.QRect(500, 10, 281, 541)) + self.verticalLayoutWidget_2.setObjectName(_fromUtf8("verticalLayoutWidget_2")) + self.verticalLayout_2 = QtGui.QVBoxLayout(self.verticalLayoutWidget_2) + self.verticalLayout_2.setMargin(0) + self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2")) + self.label_2 = QtGui.QLabel(self.verticalLayoutWidget_2) + self.label_2.setObjectName(_fromUtf8("label_2")) + self.verticalLayout_2.addWidget(self.label_2) + self.horizontalLayout_2 = QtGui.QHBoxLayout() + self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2")) + self.destPath = QtGui.QLineEdit(self.verticalLayoutWidget_2) + self.destPath.setObjectName(_fromUtf8("destPath")) + self.horizontalLayout_2.addWidget(self.destPath) + self.selectDest = QtGui.QPushButton(self.verticalLayoutWidget_2) + self.selectDest.setObjectName(_fromUtf8("selectDest")) + self.horizontalLayout_2.addWidget(self.selectDest) + self.verticalLayout_2.addLayout(self.horizontalLayout_2) + self.destListWidget = QtGui.QListWidget(self.verticalLayoutWidget_2) + self.destListWidget.setObjectName(_fromUtf8("destListWidget")) + self.verticalLayout_2.addWidget(self.destListWidget) + self.transferIcons = QtGui.QPushButton(self.centralwidget) + self.transferIcons.setGeometry(QtCore.QRect(380, 270, 31, 25)) + self.transferIcons.setObjectName(_fromUtf8("transferIcons")) + self.killIcon = QtGui.QPushButton(self.centralwidget) + self.killIcon.setGeometry(QtCore.QRect(380, 300, 31, 25)) + self.killIcon.setObjectName(_fromUtf8("killIcon")) + self.webView = QtWebKit.QWebView(self.centralwidget) + self.webView.setGeometry(QtCore.QRect(310, 60, 171, 200)) + self.webView.setAutoFillBackground(False) + self.webView.setProperty("url", QtCore.QUrl(_fromUtf8("about:blank"))) + self.webView.setObjectName(_fromUtf8("webView")) + self.colorBlack = QtGui.QRadioButton(self.centralwidget) + self.colorBlack.setGeometry(QtCore.QRect(310, 30, 61, 20)) + self.colorBlack.setObjectName(_fromUtf8("colorBlack")) + self.colorWhite = QtGui.QRadioButton(self.centralwidget) + self.colorWhite.setGeometry(QtCore.QRect(370, 30, 61, 20)) + self.colorWhite.setChecked(True) + self.colorWhite.setObjectName(_fromUtf8("colorWhite")) + self.label_3 = QtGui.QLabel(self.centralwidget) + self.label_3.setGeometry(QtCore.QRect(310, 10, 121, 16)) + self.label_3.setObjectName(_fromUtf8("label_3")) + self.resultView = QtWebKit.QWebView(self.centralwidget) + self.resultView.setGeometry(QtCore.QRect(310, 340, 171, 200)) + self.resultView.setAutoFillBackground(False) + self.resultView.setProperty("url", QtCore.QUrl(_fromUtf8("about:blank"))) + self.resultView.setObjectName(_fromUtf8("resultView")) + MainWindow.setCentralWidget(self.centralwidget) + self.menubar = QtGui.QMenuBar(MainWindow) + self.menubar.setGeometry(QtCore.QRect(0, 0, 794, 22)) + self.menubar.setObjectName(_fromUtf8("menubar")) + self.menuFile = QtGui.QMenu(self.menubar) + self.menuFile.setObjectName(_fromUtf8("menuFile")) + self.menuHelp = QtGui.QMenu(self.menubar) + self.menuHelp.setObjectName(_fromUtf8("menuHelp")) + self.menuView = QtGui.QMenu(self.menubar) + self.menuView.setObjectName(_fromUtf8("menuView")) + MainWindow.setMenuBar(self.menubar) + self.statusbar = QtGui.QStatusBar(MainWindow) + self.statusbar.setObjectName(_fromUtf8("statusbar")) + MainWindow.setStatusBar(self.statusbar) + self.actionQuit = QtGui.QAction(MainWindow) + self.actionQuit.setObjectName(_fromUtf8("actionQuit")) + self.actionAbout = QtGui.QAction(MainWindow) + self.actionAbout.setObjectName(_fromUtf8("actionAbout")) + self.actionRefresh = QtGui.QAction(MainWindow) + self.actionRefresh.setObjectName(_fromUtf8("actionRefresh")) + self.menuFile.addAction(self.actionQuit) + self.menuHelp.addAction(self.actionAbout) + self.menuView.addAction(self.actionRefresh) + self.menubar.addAction(self.menuFile.menuAction()) + self.menubar.addAction(self.menuView.menuAction()) + self.menubar.addAction(self.menuHelp.menuAction()) + + self.retranslateUi(MainWindow) + QtCore.QMetaObject.connectSlotsByName(MainWindow) + + def retranslateUi(self, MainWindow): + MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None)) + self.label.setText(_translate("MainWindow", "Source Iconset", None)) + self.srcPath.setPlaceholderText(_translate("MainWindow", "Path to iconset", None)) + self.selectSrc.setText(_translate("MainWindow", "Browse", None)) + self.label_2.setText(_translate("MainWindow", "App resources", None)) + self.destPath.setPlaceholderText(_translate("MainWindow", "Path to app res folder", None)) + self.selectDest.setText(_translate("MainWindow", "Browse", None)) + self.transferIcons.setToolTip(_translate("MainWindow", "Copy Icons to App", None)) + self.transferIcons.setText(_translate("MainWindow", "->", None)) + self.killIcon.setToolTip(_translate("MainWindow", "Remove Icons from App", None)) + self.killIcon.setText(_translate("MainWindow", "X-", None)) + self.colorBlack.setText(_translate("MainWindow", "Black", None)) + self.colorWhite.setText(_translate("MainWindow", "White", None)) + self.label_3.setText(_translate("MainWindow", "Background color", None)) + self.menuFile.setTitle(_translate("MainWindow", "File", None)) + self.menuHelp.setTitle(_translate("MainWindow", "Help", None)) + self.menuView.setTitle(_translate("MainWindow", "View", None)) + self.actionQuit.setText(_translate("MainWindow", "Quit", None)) + self.actionQuit.setShortcut(_translate("MainWindow", "Alt+F4", None)) + self.actionAbout.setText(_translate("MainWindow", "About", None)) + self.actionRefresh.setText(_translate("MainWindow", "Refresh", None)) + self.actionRefresh.setShortcut(_translate("MainWindow", "F5", None)) + +from PyQt4 import QtWebKit diff --git a/AndroidResR/view/AndroidResR.ui b/AndroidResR/view/AndroidResR.ui new file mode 100644 index 0000000..ceec328 --- /dev/null +++ b/AndroidResR/view/AndroidResR.ui @@ -0,0 +1,271 @@ + + + MainWindow + + + + 0 + 0 + 794 + 600 + + + + MainWindow + + + + + + 10 + 10 + 281 + 541 + + + + + + + Source Iconset + + + + + + + + + Path to iconset + + + + + + + Browse + + + + + + + + + + + + + + 500 + 10 + 281 + 541 + + + + + + + App resources + + + + + + + + + Path to app res folder + + + + + + + Browse + + + + + + + + + + + + + + 380 + 270 + 31 + 25 + + + + Copy Icons to App + + + -> + + + + + + 380 + 300 + 31 + 25 + + + + Remove Icons from App + + + X- + + + + + + 310 + 60 + 171 + 200 + + + + false + + + + about:blank + + + + + + + 310 + 30 + 61 + 20 + + + + Black + + + + + + 370 + 30 + 61 + 20 + + + + White + + + true + + + + + + 310 + 10 + 121 + 16 + + + + Background color + + + + + + 310 + 340 + 171 + 200 + + + + false + + + + about:blank + + + + + + + + 0 + 0 + 794 + 22 + + + + + File + + + + + + Help + + + + + + View + + + + + + + + + + + Quit + + + Alt+F4 + + + + + About + + + + + Refresh + + + F5 + + + + + + QWebView + QWidget +
QtWebKitWidgets/QWebView
+
+
+ + +
diff --git a/AndroidResR/view/__init__.py b/AndroidResR/view/__init__.py new file mode 100644 index 0000000..1a2b8e3 --- /dev/null +++ b/AndroidResR/view/__init__.py @@ -0,0 +1 @@ +__author__ = 'victor' -- cgit v1.2.3